From 0dfb5bb240e49fdfc9c3f39ab97902062ebdc425 Mon Sep 17 00:00:00 2001 From: Polkadot Wiki CI Date: Fri, 20 Oct 2023 00:15:28 +0000 Subject: [PATCH] Deploy website - based on 571d56825853446377d6d82acd8b058084a992d7 --- 404.html | 8 +++--- ...eriod-a4883f21d69a6f05ca497b9893cc89a5.png | Bin 0 -> 113293 bytes assets/js/04a995e6.8b77bad6.js | 1 - assets/js/04a995e6.c8571d0f.js | 1 + assets/js/13b7bafa.b3496940.js | 1 - assets/js/13b7bafa.e0ec35af.js | 1 + assets/js/145746f5.6a43fd77.js | 1 - assets/js/145746f5.ef5e99b3.js | 1 + assets/js/1646726c.81226cb7.js | 1 - assets/js/1646726c.fef949d2.js | 1 + assets/js/1ae2b102.182a3714.js | 1 + assets/js/1ae2b102.690d2f4b.js | 1 - assets/js/21877fa5.3aff56f3.js | 1 - assets/js/21877fa5.680ee20e.js | 1 + assets/js/279fb1d6.7552fe6b.js | 1 - assets/js/279fb1d6.b56bc48f.js | 1 + assets/js/2d429218.3789530f.js | 1 + assets/js/2d429218.b0bc7324.js | 1 - assets/js/2f3b630e.39b618c8.js | 1 + assets/js/2f3b630e.5a240a6d.js | 1 - assets/js/32e8da05.18198d19.js | 1 - assets/js/32e8da05.c8902230.js | 1 + assets/js/386099fc.3678089c.js | 1 - assets/js/386099fc.4a3b4f33.js | 1 + assets/js/408829bd.1f73546c.js | 1 - assets/js/408829bd.434ecd5d.js | 1 + assets/js/41b7b3e8.44b53777.js | 1 + assets/js/41b7b3e8.983042f3.js | 1 - ...74a08.7886665d.js => 48074a08.e74d3142.js} | 2 +- assets/js/48d75399.3029a983.js | 1 - assets/js/48d75399.30c50980.js | 1 + assets/js/493c7fdf.45bc5497.js | 1 - assets/js/493c7fdf.ced4c426.js | 1 + assets/js/4a8eb552.c371002a.js | 1 - assets/js/4a8eb552.f21bbb35.js | 1 + assets/js/4f031749.7cb1291f.js | 1 - assets/js/4f031749.a03081a9.js | 1 + assets/js/54338ffb.474887e6.js | 1 + assets/js/54338ffb.8d087578.js | 1 - assets/js/6151e7ce.64707690.js | 1 + assets/js/6151e7ce.d537580c.js | 1 - assets/js/694672cd.774de6ed.js | 1 + assets/js/694672cd.864899a6.js | 1 - assets/js/6f1a81b8.8e77e8ab.js | 1 - assets/js/6f1a81b8.f6b6ee22.js | 1 + assets/js/77a2b809.a3a1a375.js | 1 + assets/js/77a2b809.f937e17f.js | 1 - assets/js/7d54ab5a.5f30dbee.js | 1 + assets/js/7d54ab5a.8a7e3352.js | 1 - assets/js/8d3a1bf8.2413033b.js | 1 - assets/js/8d3a1bf8.4547d71d.js | 1 + assets/js/918b38b6.1d6ccc15.js | 1 - assets/js/918b38b6.d2ec6c30.js | 1 + assets/js/935f2afb.6b45b4f9.js | 1 + assets/js/935f2afb.989b826e.js | 1 - assets/js/991ceaa9.e270d9d6.js | 1 - assets/js/991ceaa9.fb46e5d9.js | 1 + assets/js/a74a59a0.d5047536.js | 1 - assets/js/a74a59a0.eb0fa773.js | 1 + assets/js/a7c27f4d.7937bcb2.js | 1 + assets/js/a7c27f4d.93985089.js | 1 - assets/js/ab138bf8.02d24230.js | 1 - assets/js/ab138bf8.db9dfbdf.js | 1 + assets/js/ad762f86.5e00db32.js | 1 + assets/js/ad762f86.d89c36da.js | 1 - assets/js/b0cbc1d4.d81e2929.js | 1 - assets/js/b0cbc1d4.fd0622fd.js | 1 + assets/js/b38833d4.2701f04f.js | 1 - assets/js/b38833d4.6c30a0a0.js | 1 + assets/js/b940de31.d2e09ff9.js | 1 + assets/js/b940de31.f3c78a50.js | 1 - assets/js/bb8b1738.1b439eff.js | 1 + assets/js/bb8b1738.eb8a9feb.js | 1 - assets/js/c07c2447.3c93cf72.js | 1 + assets/js/c07c2447.af3db419.js | 1 - assets/js/c41801b5.21e11aa0.js | 1 + assets/js/c41801b5.2ce6efac.js | 1 - assets/js/c7c5ba1a.8fd8100f.js | 1 - assets/js/c7c5ba1a.90ce391d.js | 1 + assets/js/c91a9c06.99752c4c.js | 1 - assets/js/c91a9c06.d294be5a.js | 1 + assets/js/c977dfe8.2aa71482.js | 1 + assets/js/c977dfe8.f0e953a9.js | 1 - assets/js/d3db551a.006cec14.js | 1 + assets/js/d3db551a.9eb5fd31.js | 1 - assets/js/d6d2b2d5.0119991a.js | 1 - assets/js/d6d2b2d5.82345bc8.js | 1 + assets/js/da9f79cb.50e723c1.js | 1 - assets/js/da9f79cb.d9943246.js | 1 + assets/js/dbc4065c.6138d82c.js | 1 + assets/js/dbc4065c.ed91dbbd.js | 1 - assets/js/eef3f1dd.d65f6427.js | 1 - assets/js/eef3f1dd.f09334c9.js | 1 + assets/js/f2521980.0e2eb0b4.js | 1 - assets/js/f2521980.6fc5ee7c.js | 1 + assets/js/f4003c83.3ee8242f.js | 1 + assets/js/f4003c83.6835111c.js | 1 - assets/js/f47489cd.70e3ff3a.js | 1 + assets/js/f47489cd.da9f44ad.js | 1 - assets/js/f7acb151.0f990714.js | 1 - assets/js/f7acb151.a70a813b.js | 1 + assets/js/fea93377.e881ac82.js | 1 + assets/js/fea93377.f38b803b.js | 1 - assets/js/ff6596ea.08044ec7.js | 1 - assets/js/ff6596ea.c9706c2e.js | 1 + assets/js/ffe9c3c9.1d14524a.js | 1 + assets/js/ffe9c3c9.aabc98a5.js | 1 - .../js/{main.e6022e1c.js => main.0b5cdd03.js} | 4 +-- ...CENSE.txt => main.0b5cdd03.js.LICENSE.txt} | 0 ...n.b13b4a37.js => runtime~main.c3942505.js} | 2 +- docs/ambassadors.html | 8 +++--- docs/bug-bounty.html | 8 +++--- docs/build-data.html | 8 +++--- docs/build-guide.html | 8 +++--- docs/build-hackathon.html | 8 +++--- docs/build-hrmp-channels.html | 8 +++--- docs/build-index.html | 8 +++--- docs/build-integrate-assets.html | 8 +++--- docs/build-integration.html | 8 +++--- docs/build-node-interaction.html | 8 +++--- docs/build-node-management.html | 8 +++--- docs/build-open-source.html | 8 +++--- docs/build-oracle.html | 8 +++--- docs/build-pdk.html | 8 +++--- docs/build-protocol-info.html | 8 +++--- docs/build-smart-contracts.html | 8 +++--- docs/build-ss58-registry.html | 8 +++--- docs/build-storage.html | 8 +++--- docs/build-substrate.html | 8 +++--- docs/build-tools-index.html | 8 +++--- docs/build-transaction-construction.html | 8 +++--- docs/builders-program.html | 8 +++--- docs/community-index.html | 8 +++--- docs/community.html | 8 +++--- docs/contributing.html | 8 +++--- docs/contributors.html | 8 +++--- docs/dashboards-index.html | 8 +++--- docs/dev-heroes.html | 8 +++--- docs/faq.html | 8 +++--- docs/general-index.html | 8 +++--- docs/getting-started.html | 8 +++--- docs/glossary.html | 16 +++++++----- docs/grants.html | 8 +++--- docs/how-to-dyor.html | 8 +++--- docs/kusama-adversarial-cheatsheet.html | 8 +++--- docs/kusama-bug-bounty.html | 8 +++--- docs/kusama-claims.html | 8 +++--- docs/kusama-coc.html | 8 +++--- docs/kusama-community.html | 8 +++--- docs/kusama-getting-started.html | 8 +++--- docs/kusama-index.html | 8 +++--- docs/kusama-parameters.html | 8 +++--- docs/kusama-social-recovery.html | 8 +++--- docs/kusama-timeline.html | 8 +++--- docs/learn-DOT.html | 10 ++++---- docs/learn-account-abstraction.html | 10 ++++---- docs/learn-account-advanced.html | 8 +++--- docs/learn-account-generation.html | 10 ++++---- docs/learn-account-multisig.html | 10 ++++---- docs/learn-accounts-index.html | 10 ++++---- docs/learn-accounts.html | 10 ++++---- docs/learn-advanced-index.html | 10 ++++---- docs/learn-architecture-index.html | 8 +++--- docs/learn-architecture.html | 8 +++--- docs/learn-archive-index.html | 8 +++--- docs/learn-assets-index.html | 10 ++++---- docs/learn-assets.html | 10 ++++---- docs/learn-async-backing.html | 8 +++--- docs/learn-auction.html | 8 +++--- docs/learn-balance-transfers.html | 10 ++++---- docs/learn-basics-index.html | 12 ++++----- docs/learn-bridges.html | 8 +++--- docs/learn-collator.html | 8 +++--- docs/learn-comparisons-avalanche.html | 8 +++--- docs/learn-comparisons-cosmos.html | 8 +++--- docs/learn-comparisons-ethereum-2.html | 8 +++--- docs/learn-comparisons-index.html | 8 +++--- docs/learn-comparisons-kusama.html | 8 +++--- docs/learn-comparisons-rollups.html | 8 +++--- docs/learn-comparisons.html | 8 +++--- docs/learn-components-index.html | 10 ++++---- docs/learn-consensus.html | 12 ++++----- docs/learn-controller.html | 8 +++--- docs/learn-crowdloans.html | 8 +++--- docs/learn-cryptography.html | 8 +++--- docs/learn-extrinsics.html | 10 ++++---- docs/learn-future-implementations-index.html | 8 +++--- docs/learn-governance.html | 8 +++--- docs/learn-guides-assets-create.html | 8 +++--- docs/learn-guides-assets-index.html | 8 +++--- docs/learn-guides-assets-ledger.html | 8 +++--- docs/learn-guides-identity.html | 8 +++--- docs/learn-guides-index.html | 8 +++--- docs/learn-guides-polkadot-opengov.html | 10 ++++---- docs/learn-guides-staking-index.html | 8 +++--- docs/learn-guides-staking-pools.html | 8 +++--- docs/learn-guides-staking.html | 8 +++--- docs/learn-guides-treasury.html | 10 ++++---- docs/learn-guides-vault.html | 8 +++--- docs/learn-identity.html | 10 ++++---- docs/learn-implementations.html | 8 +++--- docs/learn-index.html | 8 +++--- docs/learn-inflation.html | 10 ++++---- docs/learn-launch.html | 8 +++--- docs/learn-nft-index.html | 10 ++++---- docs/learn-nft-pallets.html | 8 +++--- docs/learn-nft-projects.html | 10 ++++---- docs/learn-nft.html | 10 ++++---- docs/learn-nomination-pools.html | 12 ++++----- docs/learn-nominator.html | 8 +++--- docs/learn-parachains-faq.html | 8 +++--- docs/learn-parachains-index.html | 8 +++--- docs/learn-parachains-protocol.html | 8 +++--- docs/learn-parachains.html | 8 +++--- docs/learn-parathreads.html | 8 +++--- docs/learn-participants-index.html | 8 +++--- docs/learn-phragmen.html | 8 +++--- docs/learn-polkadot-host.html | 10 ++++---- docs/learn-polkadot-opengov-treasury.html | 24 ++++++++++-------- docs/learn-polkadot-opengov.html | 12 ++++----- docs/learn-proxies-pure.html | 10 ++++---- docs/learn-proxies.html | 10 ++++---- docs/learn-redenomination.html | 8 +++--- docs/learn-runtime-upgrades.html | 12 ++++----- docs/learn-sassafras.html | 8 +++--- docs/learn-scams.html | 8 +++--- docs/learn-spree.html | 8 +++--- docs/learn-staking-advanced.html | 8 +++--- docs/learn-staking-index.html | 10 ++++---- docs/learn-staking.html | 10 ++++---- docs/learn-system-chains.html | 8 +++--- docs/learn-teleport.html | 10 ++++---- docs/learn-transaction-fees.html | 12 ++++----- docs/learn-transactions-index.html | 10 ++++---- docs/learn-treasury.html | 8 +++--- docs/learn-validator.html | 8 +++--- docs/learn-video-tutorials.html | 8 +++--- docs/learn-wasm.html | 10 ++++---- docs/learn-xcm-index.html | 8 +++--- docs/learn-xcm-instructions.html | 8 +++--- docs/learn-xcm-pallet.html | 8 +++--- docs/learn-xcm-transport.html | 8 +++--- docs/learn-xcm-usecases.html | 8 +++--- docs/learn-xcm.html | 8 +++--- docs/learn-xcvm.html | 8 +++--- docs/learn/xcm.html | 8 +++--- docs/learn/xcm/config-deep-dive.html | 8 +++--- docs/learn/xcm/fundamentals-fees.html | 8 +++--- docs/learn/xcm/fundamentals-multiasset.html | 8 +++--- docs/learn/xcm/fundamentals-summary.html | 8 +++--- docs/learn/xcm/fundamentals-xcvm.html | 8 +++--- docs/learn/xcm/fundamentals.html | 8 +++--- .../fundamentals/multilocation-example.html | 8 +++--- .../fundamentals/multilocation-junctions.html | 8 +++--- .../fundamentals/multilocation-summary.html | 8 +++--- .../learn/xcm/fundamentals/multilocation.html | 8 +++--- docs/learn/xcm/introduction.html | 8 +++--- docs/learn/xcm/journey-assets.html | 8 +++--- docs/learn/xcm/journey-channels.html | 8 +++--- docs/learn/xcm/journey-expectations.html | 8 +++--- docs/learn/xcm/journey-fees.html | 8 +++--- docs/learn/xcm/journey-holding.html | 8 +++--- docs/learn/xcm/journey-locks.html | 8 +++--- docs/learn/xcm/journey-origin.html | 8 +++--- docs/learn/xcm/journey-queries.html | 8 +++--- docs/learn/xcm/journey-register.html | 8 +++--- docs/learn/xcm/journey-summary.html | 8 +++--- docs/learn/xcm/journey-transact.html | 8 +++--- docs/learn/xcm/journey-version.html | 8 +++--- docs/learn/xcm/journey.html | 8 +++--- docs/learn/xcm/journey/transfers-reserve.html | 8 +++--- docs/learn/xcm/journey/transfers-summary.html | 8 +++--- .../learn/xcm/journey/transfers-teleport.html | 8 +++--- docs/learn/xcm/journey/transfers.html | 8 +++--- docs/learn/xcm/overview-architecture.html | 8 +++--- docs/learn/xcm/overview-format.html | 8 +++--- docs/learn/xcm/overview-intro.html | 8 +++--- docs/learn/xcm/overview-summary.html | 8 +++--- docs/learn/xcm/overview-xcvm.html | 8 +++--- docs/learn/xcm/overview.html | 8 +++--- docs/learn/xcm/quickstart-first-look.html | 8 +++--- docs/learn/xcm/quickstart-simulator.html | 8 +++--- docs/learn/xcm/quickstart-summary.html | 8 +++--- docs/learn/xcm/quickstart.html | 8 +++--- docs/learn/xcm/reference-glossary.html | 8 +++--- docs/learn/xcm/reference-xcvm-registers.html | 8 +++--- docs/learn/xcm/references.html | 8 +++--- docs/learn/xcm/testing.html | 8 +++--- docs/ledger.html | 8 +++--- docs/maintain-bootnode.html | 8 +++--- docs/maintain-endpoints.html | 8 +++--- docs/maintain-errors.html | 8 +++--- docs/maintain-guides-avoid-slashing.html | 8 +++--- docs/maintain-guides-democracy.html | 8 +++--- docs/maintain-guides-how-to-chill.html | 8 +++--- docs/maintain-guides-how-to-join-council.html | 8 +++--- ...ntain-guides-how-to-monitor-your-node.html | 8 +++--- ...aintain-guides-how-to-nominate-kusama.html | 8 +++--- ...ntain-guides-how-to-nominate-polkadot.html | 8 +++--- ...aintain-guides-how-to-stop-validating.html | 8 +++--- docs/maintain-guides-how-to-systemd.html | 8 +++--- docs/maintain-guides-how-to-upgrade.html | 8 +++--- ...aintain-guides-how-to-validate-kusama.html | 8 +++--- ...ntain-guides-how-to-validate-polkadot.html | 8 +++--- ...aintain-guides-how-to-vote-councillor.html | 8 +++--- docs/maintain-guides-polkadot-opengov.html | 8 +++--- docs/maintain-guides-secure-validator.html | 8 +++--- docs/maintain-guides-society-kusama.html | 8 +++--- docs/maintain-guides-validator-community.html | 8 +++--- docs/maintain-guides-validator-payout.html | 8 +++--- docs/maintain-index.html | 8 +++--- docs/maintain-networks.html | 8 +++--- docs/maintain-polkadot-parameters.html | 8 +++--- docs/maintain-rpc.html | 8 +++--- docs/maintain-sync.html | 8 +++--- docs/maintain-wss.html | 8 +++--- docs/metadata.html | 8 +++--- docs/polkadot-direction.html | 8 +++--- docs/polkadot-v1.html | 8 +++--- docs/polkadot-vault.html | 8 +++--- docs/polkadot-vision-index.html | 8 +++--- docs/polkadotjs-ui.html | 8 +++--- docs/polkadotjs.html | 8 +++--- docs/programmes-index.html | 8 +++--- docs/research.html | 8 +++--- docs/staking-dashboard.html | 8 +++--- docs/start-building.html | 8 +++--- docs/stay-safe-index.html | 8 +++--- docs/thousand-contributors.html | 8 +++--- docs/thousand-validators.html | 8 +++--- docs/wallets-and-extensions.html | 8 +++--- docs/wallets-index.html | 8 +++--- docs/web3-and-polkadot.html | 8 +++--- index.html | 8 +++--- search.html | 8 +++--- 335 files changed, 1014 insertions(+), 1008 deletions(-) create mode 100644 assets/images/treasury-spend-period-a4883f21d69a6f05ca497b9893cc89a5.png delete mode 100644 assets/js/04a995e6.8b77bad6.js create mode 100644 assets/js/04a995e6.c8571d0f.js delete mode 100644 assets/js/13b7bafa.b3496940.js create mode 100644 assets/js/13b7bafa.e0ec35af.js delete mode 100644 assets/js/145746f5.6a43fd77.js create mode 100644 assets/js/145746f5.ef5e99b3.js delete mode 100644 assets/js/1646726c.81226cb7.js create mode 100644 assets/js/1646726c.fef949d2.js create mode 100644 assets/js/1ae2b102.182a3714.js delete mode 100644 assets/js/1ae2b102.690d2f4b.js delete mode 100644 assets/js/21877fa5.3aff56f3.js create mode 100644 assets/js/21877fa5.680ee20e.js delete mode 100644 assets/js/279fb1d6.7552fe6b.js create mode 100644 assets/js/279fb1d6.b56bc48f.js create mode 100644 assets/js/2d429218.3789530f.js delete mode 100644 assets/js/2d429218.b0bc7324.js create mode 100644 assets/js/2f3b630e.39b618c8.js delete mode 100644 assets/js/2f3b630e.5a240a6d.js delete mode 100644 assets/js/32e8da05.18198d19.js create mode 100644 assets/js/32e8da05.c8902230.js delete mode 100644 assets/js/386099fc.3678089c.js create mode 100644 assets/js/386099fc.4a3b4f33.js delete mode 100644 assets/js/408829bd.1f73546c.js create mode 100644 assets/js/408829bd.434ecd5d.js create mode 100644 assets/js/41b7b3e8.44b53777.js delete mode 100644 assets/js/41b7b3e8.983042f3.js rename assets/js/{48074a08.7886665d.js => 48074a08.e74d3142.js} (57%) delete mode 100644 assets/js/48d75399.3029a983.js create mode 100644 assets/js/48d75399.30c50980.js delete mode 100644 assets/js/493c7fdf.45bc5497.js create mode 100644 assets/js/493c7fdf.ced4c426.js delete mode 100644 assets/js/4a8eb552.c371002a.js create mode 100644 assets/js/4a8eb552.f21bbb35.js delete mode 100644 assets/js/4f031749.7cb1291f.js create mode 100644 assets/js/4f031749.a03081a9.js create mode 100644 assets/js/54338ffb.474887e6.js delete mode 100644 assets/js/54338ffb.8d087578.js create mode 100644 assets/js/6151e7ce.64707690.js delete mode 100644 assets/js/6151e7ce.d537580c.js create mode 100644 assets/js/694672cd.774de6ed.js delete mode 100644 assets/js/694672cd.864899a6.js delete mode 100644 assets/js/6f1a81b8.8e77e8ab.js create mode 100644 assets/js/6f1a81b8.f6b6ee22.js create mode 100644 assets/js/77a2b809.a3a1a375.js delete mode 100644 assets/js/77a2b809.f937e17f.js create mode 100644 assets/js/7d54ab5a.5f30dbee.js delete mode 100644 assets/js/7d54ab5a.8a7e3352.js delete mode 100644 assets/js/8d3a1bf8.2413033b.js create mode 100644 assets/js/8d3a1bf8.4547d71d.js delete mode 100644 assets/js/918b38b6.1d6ccc15.js create mode 100644 assets/js/918b38b6.d2ec6c30.js create mode 100644 assets/js/935f2afb.6b45b4f9.js delete mode 100644 assets/js/935f2afb.989b826e.js delete mode 100644 assets/js/991ceaa9.e270d9d6.js create mode 100644 assets/js/991ceaa9.fb46e5d9.js delete mode 100644 assets/js/a74a59a0.d5047536.js create mode 100644 assets/js/a74a59a0.eb0fa773.js create mode 100644 assets/js/a7c27f4d.7937bcb2.js delete mode 100644 assets/js/a7c27f4d.93985089.js delete mode 100644 assets/js/ab138bf8.02d24230.js create mode 100644 assets/js/ab138bf8.db9dfbdf.js create mode 100644 assets/js/ad762f86.5e00db32.js delete mode 100644 assets/js/ad762f86.d89c36da.js delete mode 100644 assets/js/b0cbc1d4.d81e2929.js create mode 100644 assets/js/b0cbc1d4.fd0622fd.js delete mode 100644 assets/js/b38833d4.2701f04f.js create mode 100644 assets/js/b38833d4.6c30a0a0.js create mode 100644 assets/js/b940de31.d2e09ff9.js delete mode 100644 assets/js/b940de31.f3c78a50.js create mode 100644 assets/js/bb8b1738.1b439eff.js delete mode 100644 assets/js/bb8b1738.eb8a9feb.js create mode 100644 assets/js/c07c2447.3c93cf72.js delete mode 100644 assets/js/c07c2447.af3db419.js create mode 100644 assets/js/c41801b5.21e11aa0.js delete mode 100644 assets/js/c41801b5.2ce6efac.js delete mode 100644 assets/js/c7c5ba1a.8fd8100f.js create mode 100644 assets/js/c7c5ba1a.90ce391d.js delete mode 100644 assets/js/c91a9c06.99752c4c.js create mode 100644 assets/js/c91a9c06.d294be5a.js create mode 100644 assets/js/c977dfe8.2aa71482.js delete mode 100644 assets/js/c977dfe8.f0e953a9.js create mode 100644 assets/js/d3db551a.006cec14.js delete mode 100644 assets/js/d3db551a.9eb5fd31.js delete mode 100644 assets/js/d6d2b2d5.0119991a.js create mode 100644 assets/js/d6d2b2d5.82345bc8.js delete mode 100644 assets/js/da9f79cb.50e723c1.js create mode 100644 assets/js/da9f79cb.d9943246.js create mode 100644 assets/js/dbc4065c.6138d82c.js delete mode 100644 assets/js/dbc4065c.ed91dbbd.js delete mode 100644 assets/js/eef3f1dd.d65f6427.js create mode 100644 assets/js/eef3f1dd.f09334c9.js delete mode 100644 assets/js/f2521980.0e2eb0b4.js create mode 100644 assets/js/f2521980.6fc5ee7c.js create mode 100644 assets/js/f4003c83.3ee8242f.js delete mode 100644 assets/js/f4003c83.6835111c.js create mode 100644 assets/js/f47489cd.70e3ff3a.js delete mode 100644 assets/js/f47489cd.da9f44ad.js delete mode 100644 assets/js/f7acb151.0f990714.js create mode 100644 assets/js/f7acb151.a70a813b.js create mode 100644 assets/js/fea93377.e881ac82.js delete mode 100644 assets/js/fea93377.f38b803b.js delete mode 100644 assets/js/ff6596ea.08044ec7.js create mode 100644 assets/js/ff6596ea.c9706c2e.js create mode 100644 assets/js/ffe9c3c9.1d14524a.js delete mode 100644 assets/js/ffe9c3c9.aabc98a5.js rename assets/js/{main.e6022e1c.js => main.0b5cdd03.js} (99%) rename assets/js/{main.e6022e1c.js.LICENSE.txt => main.0b5cdd03.js.LICENSE.txt} (100%) rename assets/js/{runtime~main.b13b4a37.js => runtime~main.c3942505.js} (84%) diff --git a/404.html b/404.html index 6d57a856cbb7..2e2edcff49c7 100644 --- a/404.html +++ b/404.html @@ -19,13 +19,13 @@ - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- - + + \ No newline at end of file diff --git a/assets/images/treasury-spend-period-a4883f21d69a6f05ca497b9893cc89a5.png b/assets/images/treasury-spend-period-a4883f21d69a6f05ca497b9893cc89a5.png new file mode 100644 index 0000000000000000000000000000000000000000..cb4a81062d7443e30c72b4fbad8c746deb11206b GIT binary patch literal 113293 zcmbTd18^qo)-@bWY)ow1$;6u2nb@{%+qN;u#I`xHZQJ&L&w0*yzpuVJ?_cLRcXi+0 z)z#f~Y45%ETD!yKWJKYhv7mu~fZ)W%zAFF$L5%?c0cSyi1Fn#cHgfW9Ap<4Z(aTq}3NQkeufttMi;Y*@>hq4M= z_Mzvw9bozx2)f4JLuv2qA7g~xbnG6G)VElO4Z3ks@k3b;KFJ3@lHS>#Qz39Tig_&D z+Hrj4+ZAi#anMph%^I1QxCJGw{rKNKjn;wrDFxkJ<7e<#4~Cbjz4`I=(RtawA?q82 z3JthT%Tsw7CsQPXGOp1cDar$rBk6;NqC*)HLQ!SV&WK-A>6lt2Cypx|PudlMdZTsX z{dP!DrTSnO1Qs2LF++ty`9biL-%^P}B05+VRNq9+TCi}$*fA~^m&cSiX^48K$^V-+ z0X&StjX{vw%#>@Amw2ZogN|i{Tz{DIcEFe3ep@52>L1(}{BI2CXSMue5?FgkzXwI& z4tmkSLMR-DvSIqgp{TME;{9`7_ti6rh9i`gcfb0#GX!mb=)0)t`J2;bYXY$s$Ky}N zqxO?g?e<65HzU=IxL)lOKvxSe=mK%zr0F962F`E1XtjQl81XPbEEd9N6hb*Hq@6T? zT#oo9#Dxxr8^Z<O4?1@H7y<_dG1$Z3aId2b7b*r=;|2+U6oilV2vDE8+#jG9hzi z3^p+N8t#kUHtNvqGOhpFyaw{ORRs zK_sg~$;Me;8vc7-R~aw<2C+|l|5v?`>bfPUGwy}Zd0_B`zAI(%b;SwX7rCP0;ywr!#U_W3`A!2yMnWU*kzJ6s;y*ek*we9CVM1oa8 zS78T2y~NtzTwHDTbAim?e354VbOCxxe|de4@tzfC0k-Xi!TTiMbaa*is-Fk`<`PJr z@|DV|c}LLq6FL2=5EJBwF4UPWZ)G>ilRrNq2oXQ57}zgekn&o@3kS+n5M$q#T#Q8j zeO)+J1hxPxUGyawcz@0*NEu(|Euv=F%78Z8M@RpZT!?m1FG&AbL@Ys3SS03tEW7WT zNMt)Pfdukm-0|Ut1k0fqam38A&tjCd$Z9c`!lkjGzmfL9?D5P*t%(uh==R`lpa$fq zN+Z&9*^a~#!)m9*SdegIj0+N`i5!7jQE5e~r+G|i-9b7+wMDt6QcUT=8Jwi>nTIkN z$OZ@Xt66AZ67=h;k;`Gr`pv7spE9fTaaGwLkjQr&GyS-FaB-r^x4Au;cwuz>tA<>* z8=ffNs6G%cd%BQK!3_L~dqTPiBS{TWej>tOlJS%}BaIUaCJ~Ltrwr~VMT-p=KNa&3lP;t#l$n8Gbz)^^RcVlG zU}3FU;cj4RST`S@os!M)*lrJ&xR{>RmIW(4YV%zi&}3w@&)7 zaKeC7q^Yp(nES=^#reg|y_imZQ8}d`qd=pyO{Gb?NmN#JQj1>Arc^s1C8<3u~!;P z+IX4+wX?cr8}S-Lbz`;4M$4MB8m2ld1J=IMm6K@J<#aRJdTk4@g_n+~3hD51!3@rf z!$$B%oK>P#^HmRLmNuZaVdo_0#j~&nsaMU{sD~6>IS2%ZJfWaIQqj5TS^2%@=^8IE zy}(Dv>(CJ-_N)>anqt9X^Wu<+mkIfa+sxBUov3=OG&cKz-*v=Yt**^`EtW1VToNXV z{UvS%SRx&EPPY3k%FWsi1ua3XTK#{Dw`pu`dDv#JMilF71}mC2N@1tari9CHX0-I zjv@&w6QRA=UI9f2g_&X>hNDz}s*=Hlu!d+v!Kpq!EV;4L*t_cL(r}IFZm3<29h#l& zuIRvIC|?G@Y-(yX*S40v+)izOo4B+1O<}U(_}<-K>E0t{4<+>v&cSFLE{C%L#R5fn zb1y7PS`I5w^~>g1JBvZ5pB{zi#hVy5T;3;7wq3SOD)u|}AZ}D{+rYg2ll)E8yw#}dvQ1u%szxr5!68Qj*NGZUJC2-W zTqh1PA6pn(xEx+@6>c8(%l1w7@R3eK9R`ZY(qz&(e`)PdP$oM{J*2f8+sCjdvTHs7~!23Eqf?!lcvXO za1j~8tj63lA!uwgVV-8i;n8z8!J+5iJYF<5p7pxQo#IA)_|D2_cAcd5f+L=j7S4p}z?vultoYxd%S}To% z7Ry=t9sBDWY-$kYGxc8`wWj;KN(RdFmB!_CYVV8bVHOi9Eh$#ol4{gCtMYhC+FcXo z>o-n0i!h5iRgk4iO+BuCJ8+lmH|*NWsLj8O>xK_z#&a4&8`oB_8XFpCe%4xI+i7e! z7Oy5W<-7+yOU}a=;1+Rpo}pfzEunRtDkiBY&0FuTkCslGyE!dp-|?h8f?rlt*_AH0 z%KGRWdspjpeh&CWg0jPl;8}9?b1UAK-B)45&myGE5jD)3dz=J1;okqcKNls6u4j2- z!{I&gbTlb&GZ&Nhb&q>H4r#a5k%?k9o$ z%ZIMZ)2p*@4-8Lwrv-tcF8H^2U7kc9H!Ti5KUQXIO^hc?v)g!W&Y;g*-}KiaCQ{;4 zyw(SNOh0S3lh(_0K4IVL8cZx@4=s*QKiDNVusYYDQ(kpwJ8C)*Huk$tJ#=n*uKFrt z#$rtPiagyH*!P)_9iGu&>EU#UyEaZIFE3MUi`M*PfnniUs9}8Bxqx$vK=?zvu#GZn z(Qy#JFL%KcT;){P>fj*C0-0|;dT6r0wYETYf1Fpp`@f}Et3(w6#~#7Su{Y)AA*&^4 zl*LCtzoPaAe0(%jn-EukY>nQ0d~}X{e9*7zR#&@Nex>%13qsVJtR~%)H1;NYV$VO5 z?Hauv;*$Hm1@GPd3Dfft+u+q%jsi$PER9sfjisf5r~v1XKw!XFKwki7z<`|>82f+D zMSv-QK>u+a1PCa^3<&I>_s9T_e}1um{m(Oh9YJzI{&fe`ST5+l&VjT3+$u2dS_L>j z*@~$-00Dg^{j&p$E0A0P0r3Nge-}`61wPAy@WdIoAIfpBDwPMo~B>bwrjpO4Syk00zlR(+6dn*SbhHQtOcXe9V|FKala5$#RT0dVPG0 zYZ@P$@OHVhc0ORg92j3d2v^RF1A>bEFSc$n2?DQCBC~0q>x`rO>sm2iu>WT3Ml@Bf z(aiiP(2Yg_`!5?JO`tts&j5YEcDyY z4GIiR;+sa=IR8~gd`I@x=Z7?LzBqV({cncS7mUpcq6Io43XS!rZ=`cvZH1bgsn0khKp`Kls;>V>2W!7~KOQq(f&FM(^e`ICdKfe?3(lKb` zvzug46J!?r&qMvG{1?+)qf?u>GI5%bEw$f}mlPrSxtn&X=p~lxa;&LR`cMC(Rqy95 zN#Hb^hg|%5q*uAQL8Kh{53AKRAOosdt1gRPOQrX70*v>O5y;gyvo3Oq^i!iHn(Y6; zv~}yqV+pQjNN8X9qW*O|!A~&6V6^Og(?5#{5enE-XUii%nMO{dZo97~LSOP6>Er|G!@8KpNY!*gt+h zIEWt6qQ0o#A%2ts4|+o2ECS!sF3gdrn`|7o@a3LwJ;&_vQBj(<9?3wh-c zfB^Cz`Gh+8Pf^RwGXnHf!e3}yJ-?c=VvXe< zI|jef>dNV5*KH<(USk`_ZOt_0$)ZS;cuG|??ehzzafm8tD-<5zCCseMkLBI4$(X?$ zu2ILVFrK)n|D)0RKQWM>1`3wj%w>3yPgT;u!DE_A(?VT?vcVxmJT1KS1U;!9|1_u} zGv|!p*DgdxyhBVjjRn4Y7y87ETU=iim&{BPB~zHcDoc}C-_5-OvqxCD#{r62Mi-6p(SFE=0Rdud~7z&{q3SVaxMs0AN>KtD$P0cNSNufGLpISL(&G*`b+SB>KGZxH;S7H*Y zh~C`(`4`xVr_<3Hg;~V9|}r)F#?9oqpV z%#n!WY7n>$NhMD|X465bnQ3!Y29nF!4x&124)WT|Jbka>%!h939Ysjedx_)^4Sh{v zA)(%xsq<-%f_-0?{W1yEZ?DXNS(Otoh99*!**y$0=@6&tsU9EMd1#WY3P0J<5Q!@? zQqm?9)=ZOOBSd$PLLfaOh~R*ILw2?Hcf(i>DUkf+%&4(z5ZQr=#Gp(8iNz;vRCDoB zx`EMj8iLqvsXe_kjf#1fHr;J>`#9?I$`q<13z!8WHK}n^#H&AYziWY=RZ@BTLlXb5 z(rgL5Y;rXZ+4#HjU`ava(#Y0BMK#+U9!B2NpDLLhHrJTL9qx9`e0^0sG6U9rhoFj%RDbV)SO0772ZaDL*euD&p?~tJt_+cm#2Rv){}(ZXxdmIjs%78 z_hwh4Bd{cyQmBs#26^sRjmH(KaMKns8>iRxQtRAQuT`^(P3_u+dC}8{Pl{a!s_Rjs z+Y|gEU_N;bCbGSJi9mb5#~@A)kgMFwxs+T-D9bNh@x_;B(C63-p{O_0Y8Z|&u{*BH zNlbq6^<@UkP%90)49_aul0l|;2t#L?wYRj;(?a^y;OOUFKJ<Um| z=#Lhh_A%0jYd1H}|H#+>-vRc>0mNyuDlr)CRN8eRa=5_ooEYEL>Gz5a45s5lCvuhc z;#L-ne?jsIC#8pVa`-6k!;GF$|2VnWNg$!Z{RcP71rxv-_}ivPpISsVH5T@$F}-{+ zOJ#o{->4ue;KaNc6(X_N6xV(lsizG|N6h&)oj-f2qBrA8`OU(H$E=Jd)jMW*H=Bi* zRD6)fsZ&g_y}a|5mh$sa9|$U5UnCS? z0M;0em4s({^!%uAD=hlivler3qps%uJgd-USV69O8p|;T&z(Z+6csEWX=MZ$18 zjE0EVAc$4Na`RdH#;#ukagtre3~kz!ge?%ENnyp3-hMnx)gRX$Tr_p;ULR8)xDHMf zkn++FuU2tp`u^IPfR0i$GkOTRXA7yP>ZS5=s6@@|hzW1nA$h#Y^6&SgAUGsn#neOY zx4240hY7%-r6ZM(S7b4!H8SiB2IEoQQA~yCdnO=|!bv4uhOjhipGNz&CLB9l8k$IQtw0#dM%OP-lm|5$12qA2lM=#O%Ryq7X3poe)CdUa z22g>yMoZZGF<{Avqi~(NJ~qW1DcUyn@_>dh4lq!9aTCM`hSFvZ6g%N%H@sEYfb~j+ z4$Bo!A$FHQWTQaRp1Uo)?RHW1zX@EyIu9W-q4{jnF#7m%%r&>uXd>JAtP~2?ZLG}g zoE}%2AAnr)3K+I9LLPt+sBC8-WVTDdZ5dD zBrsDdOO-;X>M4u_ZY1$6pa}|jEUo_qzuz8GvgO3aMr{0Spq1G3XlA~ti}DHkJ!UqN z0Y*VlCW>Q+ZJbXj*F)QcX`CHkffGIk)RepZC&A2w!4tiZP~> z&IThFw!Aif=}}g1d7%xLCeO^5e)}j3syUSPF0gEfAA_**y*je28;du^mw6lO5=AEg zZVK`9NyUIvP(D_uCN9(ePKguYr?(6hc50f74K^pOzP%q(s#1%ZfT>S`!JS$mAEQ||AF#Fq2y6NrXCa~H^Xr+Gch zt5?`R-HH^wzipNyEIE~vt7~}A--^HeVf)o}C%az`@Mzj@IMhBz&k{Ea@;B`!G!&>k8m?>GmEH;fI)Vqr9{P3f z2Z|J)H!sKRLTeYg-hxuTQX@|HfMN&gFCas}A0aBBX#aMnim%%@P`iF$XWBc2NWX2< zQ>#O2{h`E*xF3Y#-?HC)dIf2s)^A35^%X)O8?HtD=c08Lp;t&88TEHLRvpx~fz%9cm1VP0G6wqx2K^9eZR&JzlZ+io4iRQY8#EWJFgPm-97Qyeqz z^D{%d@xX0SN#Eg4PlJudl_%X8T+zF4YXITC|?JV0u80*rU9JG`;K!p^4~^@M6s244R7Vv0^JE1+{J1EPi0psA&|XJ zgJsR|JN07aE!^#g6=FB9MZdB;zJs4JiPS!16>f`y0!9=88nVm0Q@ymb<-z@R|8ezj z2xOp}c@^uv+yqXKRS#17)TF`T{>>`6W|rdDjBQ1n>I1Nb`|!x7DFWZgxuphX^^oiC z7g{&dXh+iS+8tik@PH}Wx%9FVFgzeaZ%4RZQB?q7T3g?6KX0Oz5?gyJXF=I$;A-#a zwZ-$=NFTKzCFGL6iO!}eyYw7&O_s#PN4!Yl`Ao~;J~%}bi*CI|?E}_xPSJb{^_3=B zsBRyFgpe2cCiz=Y#vC!m8WtSE;iVtI5;3mPEX4gQ;s1ZQ9^F1fvEMQ&-_KFMo49$V zPh`u8-x=#Rv00QPy^xvxnzzO0yv5q4bT26I?9=3!l=wG68JpcNys7J+4rr%&#U@#D z-(%C|>flS2Q33w9KA8D%sd1(I!7@y4AJV3v_dDp*eYD*;sV@#!(BKFbv`zpIz`Au_ zeis(g=H#3r9PwZT$d?!pMHZ0Y^0%6wd=;u2mUR*jFA&i3h1F}~nzAWiWIsZnT22lG zny36`o$s9m&Wr`iOEKsGK)PwOQWe213u=V``YhMWa&>y;=#mxgFi3#Kto`M=pn5*k zRIPGSerJFAg4eAIo*K zqn}s)bK^SaxcJ`dcJZCk^06*FuB(8^SOHZBbDfRWx-5klHb4&Hkv#yBxCk#G};E3$LLm`&D?r1)-)+t!KnAE zlxmgx_KDo%x`YFy=elhzo7c%xPd5ADijDHp`nx;SrTt1lu@B4t5B?W;N}9VCA`vpN zBS)BIUY*t#!2BJ-B=@z^?B7nzdkX*H-tb`#zIxyI63cgfYcdvJLo6Wx^-nq!pn}6vCBqH+tEE(Z%s1qi@fQ~ zk|lL{xiO?%GUboapZ`N>{@=Ohoh*oQ<`;w;OfHCihZ4$OlY^WU zx|49F^KDA_WNsSKcu_FHir{3e7gv6S zHg`r;yH#sHz?TMC{;?W!P4l_BXk-tC1pwyOe^C4%&vO z>?t}cg}gnSR;{hnWM%+z(Qe);ML6_udwG?}bWagV)RM6~zjO(||KBK`BPEb4Fm%bh zObsoOTh@OU_TipEu@)$w&nK#Eemdd_ zcXC!^)uD;27e7hTeuWj;bSUN6%xA`r9gLTt*KlyFV4&L^ zL!JFKbf16%+v#u^81F<0PMsR#q~UFn{tH|Fdsl-}vgTWAq}!7v3Z2u^Cob8;3X(pn zL9zTn`VgN_O+6b+nr+#)FBd}X8!>X!9|I^%2OqOv9?g$zeoCAgg`|>Pp+Z!d%NlkVG$In{~Zj|BlhA3~kYZ&HZitqAy7085fk zi*E9z2&Sp#V^e21*WnQj@=_EbiPR+@)2%i}kLp}2z$AsPq`x4tf;dM5DC9`rN%FIdXxF(9dZTV}TR zRyOJPQQKY0#3>dFZ)^h+Zb_fwzo#tz!jJB`_6CfM{$|3&^b$N#eOdKzG zjVLK>idaC~VHwQQ6oe6k2j|_bdo6Y- zlb)8q(|%O-^CV@1tY3Lrof=i%9BF=s5vf!w|t!se*j^a@ApktT@Xl zV&(jpy8cX{w&d)J1Tm_GYNeB~8&zT-exT22mAm%o89rO1;unWMG>}K6e+5RBnO9U| z$6HW2AV)dyyzp^?Sr9u;$iYDHTtXn!*4GZsD7dfUs4gjz{eHyA;M*v)3`k;F zA0ZaCJ`NT)>`oacSCNbdpb5^mTk%0qcnCx5^*L}rcXuRnAoYVxKo*)?d$|#|I%+V$ z9Ilwq|L7~dx$CNQLHGZ})P5hrx~El@7dmMAR)7qL4I0Fu>HS-cce@ul>(ROcFTBMW~H!k9ox!!(N}#TzH~dIqGi) z;ZW4jNL%d%*6etTg0pu6&L{nX#OWtacoPGK(YS`awY?fXv5=GED6P8l;xSg1nRpNdRl16S3b7 zaoFF2neAlYuCA(r4A42#y7}Sy5-ZQsSgaQ3%poaYU%t;)VtSv~fFs-x>r@wDvDtmU&po=#=QED*3ou;KT{K0rhy$xUcWn&@*B z`aKG~S&e;#94_^8#J&}-zW6uY;|IYG1_DpHHh}{jm!$Vuv9=cnc~9q8(38mt)PsWn z-d39iUT(JcY9?8e{Rae{f&e3Mb`Ta+ZCZ^BJs@j;iO5x7X`E)VLXl@d4-CeBkL5S@ z;8j-o-hvuE7*00&7oPzTY7Ec5DL~VIhLOOEF{U6~+Iw#cu#2*_8zYCJ`MLJ+Vf`C( z28_vFtS_$Sg&yM=9xX83x?V5A_Y50mnHV`VN~{F~A?y>~K4Z(H)~mNaU909m_AMdT zeEl-C~b`958Rb@f^x+vx~*kT=4?h08vR|T?PJQLi|>f8tKU}tBS zgqK-qhgqSprCgmT3So^pQI!HJmcI!y_1kHBT|0j`&aV_I4|*b1bgqN13cT}@(gvV@UQ5$e~kBcVvdg}J%Dk$?CE0xFPe zGjY8yK(=8U3R?I|ZrBDpnK{<<0TauMieBrpIU|6ydlQ2`z=_O{00e`jF@+g-lPmf%+ksg2;iSW^ZtgP&j8U9qjnZ^ZSncA2@SF3vv~0F&-T2$TLAGWn^-W z(L@UtW6!WxL&V*5Za9e&K{_J6+A0<=x+m_bkUwYot?)z^U7~NsDeEhKnRCG6qsAf$ z?R`{M_AK7nc&E-og!;%d?fM~mYi36dr+_d>JfexroTm2bF%(KIO9ixm9#ZlAfxUxp z?pkD)$Z$0uu2Fc&yKxZer+KhTr=Aa|0+Tb2QDcP9N9uQ!uhx6Gb?#l@Z zujkNJnw9@VRQxJnRG*IlG;^ELKWC^OZXLfw42c667{quqo`82clGEJV$CS)ptLc*F z3#nbVF)anyDMK`Xm4zJ+#El)MgRgrty~_fqT{91`Fw!AId^@1&E$Nhn#SwZYG`cy@^f3} z&w$!OMYcP&lA!Omw)rnydm!j}0R$9Ek8KA^AFs-brFt;D>tjw#pssOqXEt3#FzeWE z5s_|O?#g%bU+joD?wHP7e*&T6tGRFmcugiY{0;2y#LkQws>8ZQHy!9cH>b8jg2aql?dlhtLF2 zI;wHZ#gH%hgimVD`wlZJQ+s5Lr!}VR&0byiR8tzB69KpryG;gbyN42*3jS{A5l)-* zufp%4E*+C-k0x=Q+2omHlk z8_m`kL)#6U8{N5f8!#`gok1i7MM@vF@rzLuiC9CQ2$BQx+Sd%oB+qkn!dbXx|A`rV zkEv~Fj@>=8N&xoNDwY1Bn}6Hrhf%L&N@~|w z2l>DU7>(U6@f2GI40`nP4TfsO?@Ujmq8K8ioLdTA#$#hq-G{Sf``sw^V6;(SF-ggY zu?%+E%FY*awd!0S1S}h8_E>Z&5Nt}|w=tFN^{%)LNo9{)0wAPJ z+;4+uZKvCi&1NqeVzoW!xD-KMFLn?$nI5#)zr_D=_C;IeUTf=&8u(tHm>X@)*Y)Q= zm>y(ZuMf#^XI|CzA#U5(F`mjkENhy^(R@GvS?~u${#r(A4rSkmYhq;cJ_+T^D5LxV zybN9$=a-Zb+P~(x5|aPO7;cBH-i-(iNdVI17BI&*y|)=3Y5|L_si~d(a9t1ID8Cs< z0Ggt~`=T%JBPAt+xz4E0uW}9^iLg`ya##G4J{y94SpNERf5Kb3+e`UXLs-jCbAfkz zsG=5rjjH4XF(|lh48I|UrxoR`j5qz#$ZV!WMVaRC{A^IdK{!if+U&7hr%2oXA4L)W zlH1=y0P1G-@8a)w0_%)i!_Df>6G512sYt@7xFAp*$9@c{>Yhhq^&1?-lIv@bB&U|o zZ#n0r7Wi+Q;BAh)huE+@vTKu2W9h7tcwTq%RmovtVfNj?5Wk-9RLJk|@9ht>Tt!6qi_~K#4aNJ6 zeE$mg{F9KV9|v;cxO}S0>o=_*y!4l9fPinsJu5?#_>(mWplw;fN?x>6L{1h)jb9ZlO`v>Zw(D8x6>^YQ5nMq(1bUbIzl-%SZInM~jS z>Xy-U3Uwz6`T=RYUnOMX+N;j5cW2=cLqtE=%*L`m>HyM&p03H2Fof8BIVn<*!=)U7 z%OB8!1?=K(L&_Z zm_y74$ALdb6*8l$A4GHmLI-|8Jli`Fa;?*huKnX-G|}Z24Ez-Ed^b?#Lxow6(qv1X z=G-`1>SMcN@?Ul`g$C>z7CPmpv!c1v4r&SC|MnVX?w*?4%q$%8A6O+$_32@dRg}SYFL&TBmvE_~Rk89xl zr{0b|QXNQQFfbhHT!@RL6-^#{EUK^-<}ZeroO%&$m>u)A?~7r+_|&jS8HUY2^3$9S z{Hy9w*MY>>JF~olJY5ps@uIVKFW=dOsOG?rH#?sXkMh?E4eYx}#H5!TmP(S#H@M6& zH0=)*@e%wjTnj7fI6xvQIqY@m{z{~U2~Y|!?T>r>8E#nXBDmU_m+bA~*JYq5)--mq zY;VU|;c8zVJ~4Pgq|uL&qZ907mZtAwDgebXlv#|-Gv(MUTK@f#3H5ixJ(L{r zp&b+1Qx-)M(Zk~B5|mG#2oDD8e-#Rz98@F+7oGMVgs8L7QOc`hXE>6nKB;Ymfr8@4 ze|6eE(~dZnn^)7RHXc%9sr2fmGbj|`b8T=)PE#|^OR7F}=7U@^nVi>DBd>sy&RZTk zd$>CnHGL}gQ+QpM_%+)zsoGp}VM}zeR0ydHdK1HI=#*uK!E!0=8G`R!d--|FldBy#U+x_*5Z|l}8L~vRbK)uEt z347q`ePph5`n_aVh}qufRA4}_z?}WS!U75l%J@`SWYr0#?S4#ZW)AH+iH?f;`}r`3 z9tsK=fhtj3e448Sp)m2V&FL;0dzz2Z6>cXD#~y3E)n&8&AdYpF8j(>d(N)g7uerobZiV( z`oO9n80%+P#h0kLw0VuR`6pW0zKoLP$)Rn!9B>O*55*{!@U6j zqDQuR0*s~z-evkyj4*D?$WOF1HECE`S^XUX>f(=jY=yGAvG_Uj>N$Orf@#>;csQ67!-khJez9RA)XxNVNB3F*VPRzU_#JeA=z| zK?}13_6?+g!0hhVibePBChobNAMqqs)a}%$Vv<$`016j(uY!=pi)EG3jQ9xZdMBsz zo}nkgY5lQG3YWM7VuMh@i442_la)rp#CZAHu6m!;u=toq64D$yuOhBUFY`OZ;fT&V z)zSLE!LI!-i7y*D__&}@nZEC`Rg6CN#?e|26D)=SLkk}U@6ZL;)yS#Ny%(PVm)kSG zPAp?gra^ms_bS-Rf%hd&GadJoEgFnFC81JnM=yzDv(P;G3=G5tykVWBjFhn-O~fQYh2JvwrjKD11=CR zJl7Bq5(lmHZ}pqK<1tRKiaVHQa=cgJ0i7wG_5FD6qnNHUc-g9z${omTG&2qA>R_YR1U%Md;A3;p8 zSYf$&sx{HJ$^?p7FkhMAj7Wp zo;rBi3x*tGJlopXjj=jbz%4nnD+UMh3%4ybf=(|W+*9rHoDv$?S}$)eAhE)L&N4h= zMvJaDtgkJn3N{$AnIUWXQm0NZupIuF+nBdyPLG^jsLl`MHAi+50q zur}iG7$rw>n*Gx6kds-4AgtowQs^&*={}DXUy8e&7Yx7D5aUf@L_Y@2gSxa3V)}<~ z#B7UZL1_w_Ogv(kgyY$we+I;1`iv{qMIJ3E; zLr(}Hn=9MjocX_hdrLPMt4XJK%H0ls@Czp7;}h$vJn~IkDP7%2+{@=4o?pJPF6NA$ zr>C1&yPY&2@@lKO8rVROwgIdqAo|Eup<*Cj z)Ru8dqRVN3e9Js;f~}Jt)W!Lo=)?YTn;lSKKziA%#n}#NAlH1;fzO$Ud+ZQh4L&T~ zau69o?^+l@&ON4&?KS!9;9IBc0j`5+$co;e@k0;rHDagD+Oom=do<*GWC2cd?hpcc zxwT#xP0Ljrywmk6<5NCp$JCFfX)X6clG z_WSroqWm+KAjP~&E}oT!Za>_Ml!aS${Oe|d)1Pt*Ey;P&}703#>@nC%LR?UFlKJyhe67vwZYwH51pw9CyX%Pqv z^xFaujs?~qSZWVGlTR`in6FQ6#)$AJKFRMN9F#M|NNj`b$)E>(Pr~`SOu@sa-S)_n`+)AMsS(%{E(AGPDl6iX7T>8&8Q^!87$39n z(iI1}ZG)R^=EtjGxD8;r^Ex^L1CC6wUw29f{-Ao&enUT1H9&<`hqv6@2hHaX45phJVqLWPSC61xZFn0J+y8gKT8kcK5OtG z3xeNvbcX>Sc7`~MuKOdaJ+u{jZQAI&NoNSEd26G;zO-(Y_XMksuh>N7emKvOz7DOr zD)la@y*T%cJ1=-^I0J-V&TZ9Gp^YEg-wpbuXQi}5|50p2-Bgw|);wa7naxog^96AbNNJ7xX-|Pwv#X$2Y(~PDPloGmnX`Lph*u`1OqHime3vQGAjwVq zM`9d{h*qF8Z=7%pog};2MP=h<<{W5k1;z}>0N!CNF7yq;UY_=&Z+LEp!^XPfRqEe( zkIua2Zr2#p?CwW#<8=w(=zYDvR@K!{AK~&`!2T(V!3Doyh`<3g%?mJTq#;J0as6H5 zu>`NXn%zsF-K&Q|TIacKn6q<&2EuFY&c&|#B~rKV_zBlXK>#&G zS_1!;+V#RB*_?X4$vBrYI-29fMFw1e5Ct|KWk7$$c}$HB?`x*Yr1nlnyYYEjP-4j< z=c4^j>r<qXCUg*JF=6+-=W6hkJ+x_$QAb(PpNnUeJ{R`U<3q53MZu^yWPQIfakN0e|Gb?Fg1-`wQi#ovpqD{9;Pldrx$ zHg&yAS2pj2S8p81J+@tTwgtq}l;k$T&0RmN+B{;kn%Uw4+;f(u+kO&mpbfs~l^;@O z%kjDs1~GgDW0otQ2PXnYBWp<8(8ow7l!d@qhzRJu=X{|E#8kN z-Kh0*+U;YrqonOkBL-8po9G{g(~}o)r%G7o^nshe5uHqptS{k?i-$cOM;E?KH@$B+ zkA-U!=5R=w5ztcGVIY@?ZbKI|r`aDYmdR9E+~^ZiD!_TPye8hkw$Oc59Liq_&jd4? zT0*^vui>ZmJt8+Ty&gC&QRE*n>(N4n9kyS%r*xPAwbmq|Kg5OvO5MTny?5&gCcUkt z3F~QJZsj?L?Z`h#Nfe>E^GDZm9Smlz_;ob`*@j%!D7u95-90xU{M$K}YdyRP zu{EcF!jQ9Lsqftq-_62t?bY3@R|jkewS&VN!nO&^q`eK~8P&%72Fe&f6rUAfFd1-c z=1VQ)JJ_xp|CY6>x(TSKzOpuG5J`q+dbEQ!8wD?dS@tF83Y4!?lgN3QLm3Ssf#dSV zNRM9qi*W(`Uq%1Ki+4f}4Kqh1M7*2T+X=*u%M(&oN(h?8b`rzhj|TRLOj+x5VQAS} zciRVi&4ILne_(>i6?08iW$@PfAiZ#6=(nT8OK5;UA6B!n5ftDjLws$zE$qWH2#|{t zHD0$~nfS?}0H1a2xTt4|)m1H$`5BiUMCd0}?pPgRsYmS+-`yKzf=@tj)(Ot@<-yJ6 z$31TaS}fs5L#{q9s&Qc7sJ1(Iv)!Zj;Pl%f4)g#uxGx~rY2P0U?s6hl-$pMlmr#!b zAM$b26kKo)oE8SJAmN?ldiF~aa+8t3K?mxOzQysDPywp9%^Fn%0SqZm4GvzRJFZx% z=Ob4^a3B-%eeW|snty4_0e5p{4wpU$YSQO$RVjIKj2i^gw&d>XK|!6%{2dcwI6R4; z@)Cp#QQAIor#ld+J@c|Srf%7*-gD2)+0RTC!&H>s)9&!dyhD1XdYzIo=DP>@w9HK~ z5BmJ6LV41j!8M^8yoj1Hq-GHTsZKV0Oon0d6NO<7fW5#zQ6SC~9gg?%luMUe` zY^7zGEgz}@LAN~a;TCEckI6D?sF)-kh|a?-CQtCs5xh|6d#Ox_gbtB|yk4qD6o!}>C=8NTQ~jdWI5)`-C^f$_<$ zh70`9rx5bw0QQzFmyP8>mIgx2!?84jTHgD)A7o%h$r{#XjgM;%vTh&GhvP5hYIS?L z0U$&gkKCI+pB>j=AzobP^*>@o+ad5hr%*=s_x2$BU9YGhmJ zP@tPujmu=ANZ$hxc&WqE|HM#?(U9VSUQ(jYKdjxUBAD0pXd3HYXb)n-1Q z(Jx>mfyjo&OZd00Yt%mT3b#his)r=*=(iZyX3*B?DhXu8#$noW6`2*WYIn)~AsaPm zpaA|%IxNTE(1o6-3dfRa4oJ``<2A>nJz0F^$bti z6HL`FZrBu+r>18>(P?#(?ygM7?^&njdIc_0?QYM|y3theB34&jjC0`rq3|tlD_LE8 zvrhQ3^C>gzt@oIuhsPpKa`K_EO|Ik@C!itqhx&IPG;$%Vukn2d{AB69^x(fFXXElt zXXb$nKS~qM_}rj)sK%~*F>NYX7OK;e3}8~t3Sl}+HVO$+L+;dp9NJq7rkCh6CbfsnH4hx89weow=oZQnac z+7d!*QL_x}de?=t7KW*>y5g3r55!}BW->S;0lw#_NWMOPhE*!IlwV*)R2<~kYvGps zyVlI@;-1yoHJNqBOtM_>*PhA0G$esb#Mq09k@HkUS3T6ggLrBnoq<<@)2ME_VM&5u zB8fi;z{Ywhn>;bKW?9d2mD$Qm35GL9UJQ6WP(<7%l$e%0yLuhV8;cZ#4DeUb7+9G# zHFQ*%)tQ9O3WnJ2`^cz5qQ8o@*===nzY4MQoUBKjsT?-rpVs2veT?;Rt?S(w>Y?LN z%~0RB80>OY#rJzA7Xbg_xWXZ@sjNC`<^S&(b7=*;E8{4)ww@3NVRHwHgXt@|WhF`q zkJ=^ZvM@U=;E;$Bw;dw9O4)VoS?WMiwwIE!*qGhA#VK`P`6p6tP+kT3H%+i~7OeS> z1&ehQk?9ofsNY|U``9{)?snI{_{2K;yaqS(HkXhHbMVPuz_d=Zy^o0M&r`YuX{sE#Z`W;!WPB}9l2=y0X9kp4B$$*b%K!St(g?TOzClneJ?0$xNM;;brY zh54w%S6^?nQ+=EgQp620k2z(a-(BZKRWqreXmC^Y-)zrC@>)ri#tv027|PU%7U!l! zcEc}Ue{gA&%j0)1o;V-MBuSP1>2qnW%7bMPu2`<#y7U)s6`#-%ndOKqdeV2-YNWA`{KpFb6{Up6u&MSl zRJof!vi^K=&(^xSONJPRWOkdk5B6HtqhGNMcO}4hn6l1j74I^)u+W30DTlhBG}!I# zh;L)z1P@gh69nJA!}^18C`^%DSR;N(=*I}j&OAt3n}4d`smsLZ`OFCRYtC=Yu(RUa zV^2i7XfJ_7Yd)-p}HeQ+of!XTQ9zFs^6L) z#mcuZ58;TXCap&`QOX%Y<7HdYo(aK&ZJiHSm8jjiNYdavuBx{`ChuA(h2cKVrjtX& z>H0iDkIcR73+w(LBBzqqb&b+6pdGj9`4Dq^K2x^%_7Ayj)quMMnJO%9FCq=y$zbeI zyBw;yi?Z5@^Yd5+X|Voe{i2~Ax*HMOo2m#gSlE?1N4QwGI30#d`&SQdLl&SlGL-#6 zdP7?av=v)U!R#wSc5n>BUdYlz^Z1!&D=Y}0(Q0EKRb^fiFB|l0repGxj zM`zezOtir*rgTxj`Uanrp6IuG-`Yn304*Muu_-Fc%Udc;Hu4;}TBWD{Q%MF8b)Nj4 zCC%w4e>CGI;f;Bt2z<%i6imTBzuJV9suS?rGP7^v>3U%qlk}$t&izJ4$)7xO4!<`c zsde3Ufmreo%yJ`bQ*@IZ$BCrhGf=c%XepA;oU*~FW|NXuv13=6hu*T^!UN`e`*i}l z#mJJL3%u@-gJzlEJryWC^IwKhm3i)g2(moig-=$JjnxYYczd;uGNwzRWtvraKW$ti z-4&Z`TEkP^Og+$^a{@vM_PnpVco&b>UvwCfmo|O?66;doK8|w%$;@rxz?G6u>oN7siHuomPV5)1#!-}Egynq&FiXpouWK++qQs0ViE((y#49R{lAM}XFW;IPv9|L7US)O z6%?p4F$wc9Ehw8#TeY%cveFHpxqwnxXqC%+gqm{lSas!Uis{wdbXr}vmwnLkKD2Wk$X`yUW(@do@_|mRg-E+tNR{o2}S7)*!ZB{ zl4xkJrRB9x>wmIq>tgD&EjH$QU%;&!Zjf|}g*?hCLaaG|3i+H5b;*Cj%+iJw{gGvm zKzEtq%?dZMPrs{s`RH%FjD;!jKKC_5J;VaPN7xe({L(gfA?uUHY_8lqFx>}? zLo&LIV6S{kp+bLC{6e5?S|)6Vu0BEK`8=@Lz26!3qz7OO6FAT3&FTQiXn#vvurBU} zJ|X|3R@oa|oHK^(*|9(m(Us-`rG3A7_a3?#6GqOf=@rl|Es)fJu;`CFDw5yJxwOA1 zAHP!}HB~E{5I=Ok^*0+WyCNl7B2&s>1Z1~IGE z=jYCqJnWI@?serdO&DiinmQ+?A0^mES#x|h0di_Pkvm6$i0idA($}(mf*vROE^M5f z#^yaW9*A9M~EN^(~%N>M|?znOE zD?#8sL_&u2lL_RzDB`0bJ$nB;nWJ3*D)Gp0A^>P>`Nz2=Vy2xfuW z=;&wysj9>@D5k2S-9i$-=qa&<>gayComsP~1h)=>kN|sw50ISAt#3Cqgw(eAa2QA( za=XBjYl;s?$kQqXz@r(_CCA8amwo+5wL9O+^lk1T@VQ~^75@Ey-W;a76XxyPzvFsZ zcX9T)V>|z?M0Mu)H``S3OqO%RA@nIS|rn+KIu2utIR7lGfC&hb7(*H^Fz7 z;?azmxPlp-fB4>9xLMJd5R>N=p{n`~df=nYKzqVso2uh7ISWpu<(%VYPEm?h9cQgh z1g9&gnM%nUtdBY4Q zu$}$1xumXTXLG(uVRWAARPy{6!(t%$rd_-bG*f{O0E$8?S~U)1q&OGh)>l?htFvB^ z0h-2-F9ys_J3EgU9JdN%uAbg~;%{Iep3YI_XIz-)-I@1o7C=5c)u4whYPz91OG!5n zfJ>YN+Yc-bI!P55^3gwK)qyLYKXrp|Eq2}&E}zE6S%__gQN4DmoisYW4&+6z%w^MB zPc+>>CA=Qd^IHTx8&w$oG5l}vyX)mQe`evtgP<=bg6Rn_Q>5~U3DKTk9|a>owNqeY zJm3EM$Ddx(?F!`C?m2szxZpV+O|Sub0RMV%@8!XAn7p1zL^O_^0JeBHt>0P0X)UMD zlETco%$%6K>m|Q1iTTJ4lmGiRzbQVqDK@XS!CH)zAi(1)Q&(4jO49*#V|i;k+U0HMM2A)NV9=?;P<7hyMcS z$fDq@i@45FQn$il9|t?^#b*&&Z9sI#fknj55a_6u9e{?QcsB@#S^>q^wL}=2X^- zX1-q)u@K{_{CfP21S)p@(ZmN@-?Knsd=BQ!_tR679EC75viDYo|Y+J*#W9TXAX4Bz6$u8gmqRvu)^qyR$p#edf~dSn$@a z*el1Wp*Y%Sa#f;(?6~`5#A*w>XRtOw{s-W|8<_xgP+1WG#kI<86PLrQ$yh*%NIt*Z!2Bod1Uz>i;9I?zKrdGk_lC<8@8}-SFVXNFqJZUJEB;3ty;o`hP*xQ z@Q$uASx{PnlVmA!*MbF&ZW=4Q20sS%d2BC*PbMQZUxL~2;F0}aeDS<$LRG4>k~^2x z=N(9bI}AtKKj60L=pY4DAQ`P-hvHm)X=|!cW2VU1nlq-%E zb#H}OPsGktK-J;yVqxvq{&%Am|M4bR%EZad0mOJ?8J2%y=FJAM7WUvoyWxfIV+lR; zVf(Wa;I$k*UO-s-)h(1`_WNqYZ&ViySl(?5&=6U13~bJ!F6oNV{_dMbolZwSzSKTE z1 zoBBbUn+h!Pav4)Yne8BXQ88vdcy77htl5(RU0q=@iFGOmCsRkjR+ms}#x@9v<;c|8!z`(VYXtipIA z3`gP3HvFnG;CKhepqhSxsG_c=MVIl13w}1_xnPQsHT`0*!5_f1*!N^^BL@kHEIKx~ ze|>%Z%+k_+sGZx-yNWQ_gAE`jD8}i>_o~kLDJQOOP znvpx+AKD$ySw)$qGT1>11=ZHL>i#^cHCK%^-qW-p7V|$&c#tPYh?S;xxEWL#P+rR; z=RotqY>(Ft+`o^GzUy!Pqk;ckKc{X{4*mDn|#Tp`Fxw z%6kcSbu9yAZ+FSE3bo*#twO~fr{=0F%^2!9_9V-NOUm*3O;HgP};WTwF)G*c{63?68^HZb~ z9TC4gk`DtpV4#5>ochWV z|J0e%S2au98kpvuOSS5n$24!>@h%xE4=6{%@<`OGes%jl;*oc`8R)qRI*;cRvdw4W zu|iI>Ew+x*0`jSuht$B4`5Z1+k2JSL;r&d%7kN=rf9Uwc#C1y{g(kzg%srE$u0E5m zi1Ob9os}4Fr-q69ZS{)G?7nmzXjqAEk!Wm@qD6URVlUyq^7^S&;#W%ml`5-8bH9*x zs*8dXnmY~q4X#zhthkI-yf(Mvck0R|U6v#7pL@)`!aX}G>M($L}-jmZhIL}S?)Lbf8C_0VoLz88Wi|t z6sz?e*J9X47aM0Rv?L19J{}gz=Hw+3d-17BzD4r}|7 za{Rkd4|(v{)_3#a7vi3$m#=|J?Dv^4k|jzqh_@^*Yicm7i03ohdb`T@g^1bp_Y=A* zDn684A$vz-D_agyiH#Q%;-haF{I)|a6m&feYd5rsrG!{n2id{naao$r_FiJwq7rK( zlPBfRYpW;qa2Dt?&e;lkC9)3Kb`d){J>(I3L9nQULxipCatrdy;#_TeM}cFeHMFF& zEGbGJV;yVSoc-ej)b=;K{}?f0Wry5>x#cL`v>foRa>?#YoW>>h{F*&!J3Tu+5$=Nc zI_V#ySyQC?+Hg(ewP=8|m9e0a2E(^~LUE2{&nrJQXvXUs6YjTpM+E>oZrgcnO`|qGhw()!>F1LTI~Z|XTFEMd&2qpGrI_Y zJBDlOAsdt14?8qW8rvr-;6gn|`O>BYK!kmLSCHrMFWqe5gWQwj)Tst#qeTL6Zn-f5 zzzgzzw0sZ=Vmbo3PC62&G5C;xz*vP7nyJHGb{Q6a+10OH%54RBzjxym`-C?{rqlI} zV(#Q3H{JCWH>%S+lxkX_6Vf8eQetGG>b$cXygoYLn~Ogf`Sp*67!KImN3pn0JH}|k z1t%^R8)>QWA6tZdDwIociiblY(rHd9{`rhPphig^s#r#cH;kkuGy>f78yZ(D(f&@gXvogs$XDlh*lMflK9x;(KD_Kd0HC>F|7 z>kr2uq!+Vc7W5$EUg@H#GV z3<6yoGUBP^=>(v!hk`Zr9iI-P#INu6Qz+o2R-8h?2MhJ=m~$p~@V#+Lq97{^2~d}K z__ywCPr%?e{Tf8+I^A=~MoPOx#SKU1lSvjXPQbP2{%-Hr5R_130wKEv4$<{*Xh^wh z%U*W3iM)QC?U2i1Ns;M>9dt7}@fnnSJ}pIPZH#y67HC(AbmM4PGR3V%?W(I2U|tVS zCAel@NKQ*TAZxZ9r~Z1{>A^S_=@a+k^oJY)PQquo$$H*~%wCr0>A-jLF3(2$vE3QS z_>EJh!D;%ZlgM4yMd!1X{^31!;;Uh1q~F5yr;|`Kjkqy~ea|n%W6+=!%X%abR@_-` z!cr_F5+`>D(mRgWQ&G%$L|%hkxDHmkkv>G;B)c660$TI95;I}^ppK^$4TAa|9ZQo9 zibiTD_q5Q`&(EHxUW^6`1vGgGue|l)j`u*uA(-ExjQJVRLvH12sPkSV?0$kQ%8yc6 z&-p=)&wbz)jGkWR$MSv|w|1`8TVv`Kk}#K@YG^f)mR<^1BcVyi<0qyw|K0h5wS2a; z$Z?I!6Q-n{2Ns5=@LB%YesJ}9j}#uQ*OOTELJb8EVFxw)M*-;{%+UxlT4wF55nZm6j!9u>N=%uoQTDLw@*6vxBF&8D@ zA8^l5=9zVD)?4%YBdsa@hcSIy{ZG3)gGVGy7O|EC>VLcwYl4lb#A6Oc-t8uVzhV&9 z)K^HnUkb-Pph5J!ZtyCq*=bgS9E_|sGA*7t2T4;J@?d4v$3^a=8sR}j!tIVnMit5q z9kDd-F%8+0qsVr^udqzK_^#89{kNe#Vn{@=C%f3jum0D&t}U82(d5#lipH}0nC9&3 zv@*oyPV4cq!|M{LWlmD3)Z2FE`yq9vy&r&=e(-q9_QE{TcX{-)rx9%2o=9my#%b^0 z4ur4K^It1Sb%Ow!+9&e)t!?D>M`=>|OieAfmT$g*rmazST?k3`FI#2+S|lj?>=st0 zvMU(>uy?Q2SR6JNj@Q(pZA2dn_0;d~?takGNy8a^+D+S2+oQII1nR&nf=btIL^s{+ zh5_~59o8PN{>HMS3wl`S%?^IZf)&y8nN^A?w?+1~nL;JMNxBn>6Um@=HJ!XC$^vhz z^_yCO(${*o$uSLEE( zus47=YCRX~cpM9WkZ1TAOKB#UQg|ji$7QXG_{@&w&G`*lAT5|gdp)wn*f^x9$<=4q zgasAAsx=vY;{w{sgR9VwpXypYmk4n={%%abltwHj>I5c43f*n5=VT%K?|ROn=}=9p z5{0L*bX_Uw(m>5*Obn(rH%zX)3{`{Ur(`yxhF z>1W{Vb>d2IgD`#TbYL34oA|5Sy~pRTNWBP-4AGyd2Vl8U+6EXXl<`ejpHol z?QOZAlCmMyaN7`cTFOkPC0Rp}IcUa`1#{nvLr;wbDLqfJGHl{SFRbVKubLkvw>~*s zBCOu=u>@GJ^;C7za^kAqzEz(Pc`iYh@NW%Rm!<4qUypXFyPx4wKd!`N(Gll7@~o6a z2|B%0{z&uv0>Bad7M`Rnt{sY?5tkt9eP)h5cl}yWjFw7tzGN`7Vm|ak zMh`Xn^l$zcbx_5@&3*l*-Cbm9RGgZcdhBXl0J^k`1VF2sU4pIpO^rD4z(-|%uw^Tg zQ^6COHz$TJF7{-7i%>#AsrhR11T>)~iG%Yn&C=1O&PrzM-#x>$_{%%2YA3V@{~!@`7&6K`LbISG}amZId-gF|*hGQaaa% zX`*pA7Ju1KAEt_mU5HD_&!e1Mef*(u5?n6&yswKVGpPh@Y)q+iRKh9(AA4qWmwGl8 z9P%&6_3u^p!~1Da;_a}wuo{7WKmLd7Fi&$f^~!3b)NuZHMe(I#x%o)tF%4O zjX*-v6fGJab=rcDfO5M_%#j7j)rxy%jY&L=!#ARHP?DsQ=T#vnuLcyD z5(}z!BgItN!osd2XyPdPwA}IEv=a;GO!;R~xAbe6w`4D2W;Ny@IqWTydhj1H+UV)n zWMEemX5Gp%k{6E5Ek;{rLa<`DdV@6vjG~5)s`+9UWw#mBnBk=-U9>>c7%6hFl$~G^}M}~Mz~s!Otp5Z2kX#2V0iMd|GFS(C~w+pN9L>;JxyxtTwKZ04`*@C$Ue|0 zXX6Tqchh1c)1}h;_q=<7>tziM26d*Y59g!YN^WlTtI-F}M@!YR*LP=w45w;RC%njg z-teZ(S`s@SoWP>Ockt=j=cIYCmDPdiv;$tTfjfZgN45DBt1cK!)Al?21xc{5%F;Mb ziNZ&qG(}$dT&||vt%uFI=VsI7GJ!$$S z*@vrM0~ucd97a{TO&+4$Xpn$gG3)ZwFegz7(kaonlKjM8ECNC^=faH_)Pig?Z{mx2 zQn^|n?O94vfTUwr`0&o&6*+`M79hsoL+N=bQBQfk+<>4o;pWL%c3FzlS-db~hM0fV z;`ELd3%c9F#miW&1~1(~ZzMfm%_F4Dx^%0OD_2}ReVuveC%ts(Zo_(LEDq_4&9JF4M(!@H!&u`kBCH=O2Fzo^T z_zNX`NVH>(KUKn_9F_r1V6acu<}gsrk>r|;gTdLncjZ)hqoA@$Al;oF zaE6?oj48hc23gWd3^Y)U51 z|DnxMh^i3h)@znW62Raf|N8qc*Ov{w<&2SZ0}zv`!@pX4q;Iov!yjo#vqRxW5TiA7 z0U;e2YHY!M$)T&>AJ73~LEFx%${?=F)0bbRg@rS>Js`QF_PAA)S)*n~~Szy)_uu_&zB4 z%Wq}gJq0?*;o&w?Ba}erz9h?{oSI9gRld7~Bstq9u;^TWG=fvup}(;ly^LLu#1D2z zpmDADm91>k0tPOy-3F%EJ|X?++kEglBYFvcFPM$s8teKtoWcJGcjx^~>tNI4f*IqX z^UQlzs*0w#CRXU1@TsyURU%-w9b-1B9TvT3uEFtaA$vMxmh{5hfP~U_8fCX|h9z26 zHNJ1f^}Skr2wX2Rr8-IYp|w{&UAqqBsCiKmUV;Z-RUP-*x_n8ic{b4qbDFBTyXZIV zssAG^M(Hni7Njj{SM5a@2yw1cY9sKxiikled527D&|RnEe9nCXwLAQWbpefWYQ#!; ztn%{WbjPn2lS>-cK6$2mA|^m*C+b)?z$8T@xxjjd{9uW3bBv54B#m;6^x3N^pLTSN zIg_%&$~vA|AV-^N^1$}Pj3dq)jGw@3vT1E70`KuOg?eZzrv{T{!k7{Ij;uFra_T_f zR2jeuVGn5)c@wYO+b1e~zl_wT3Alwe+F%bWu70fydK(xh?K#a8hGJfxa5W%#zL0>PFb5UIss#%{Uw2&MP6|sOwieYWgCRB&bh2ZOwaxaTF1}Jof0Mt-V3je z%PBez>+%oLd;>yD2v}tkvgDh2l%$zI;AOPNKgBU)5PvII!_9M?`EJ0;9&DY0bUghD zCa1O?;tsGMu(0izyZ+gR*KKTbnA(+V^=pS_90Ga^;-3Os zQl1<$7$LAHmna2wYa`0aD$39S8Xg^5GyLkRr*7#9e-Po6STZ!A${cRsMOoX98~?{Z zp=)e6wy83D7}DCL{myK&lcw3Zi;J47k`q-KskQiU5FJ+_S=jY``EGId-9%g?uUKg{ zVUC5wPBZD31|bPRc7<#i^^Il z0B(r5?Wy`(UA&g%314ByvW3MzM8x^RG^IG)D>rh*)UKH7le(t*8glnoy?C7Wq0}8A zng>`Jim1~h+7IwOizCuK?;zpMdu$p_zI{ogk4L0v^hC}PT7y7gKZ`(XWBXpV4|R9u>V|iGEqvwW1pKe02dTs{ zsn{xrlOjRRZX~eEQI0aio9J1O66o#ahlh z45yso4gvW4cVr?3JhB=xl*>w7&3)KA&}bR`+XX#GjKXS~*&XEVCoG;uu^(oTA||kAOTsIc%&D_5I^t zfg-P_Da*@A`2+`*ME(bpvSn(fna9;*N8{dtx`)=a>!fR@|HQrb;lkhfow)pI{qqOx zy>^qRDPiQm@XPSXBX<%b@@vCNO_d7teVGw_b>gu}|2EC&SJ=UFxKoXA(WZy>R?w?k zEndT~G&@u&_Xv-uR(RX-_#Spf!1cQal+>XJ$&=={yGBW*5z6hnjj+kM=NDHqN)^f% zHAk*z!s@OeGNHq^FF$I;F4I@7iZaB=K$I~{iO<=~M* z_7YmohlU7>$j`nSHpI$}9Po@nl~KbX?fVJGy-GQGMs50c$r%0`m;q#nM(G>*`7vav zx`lcCVQSf{@rIr@3*)eV@q`R=VZ3Vk$SEwHX`yR_uNYOv-hb`2p>qlO1HzurgXP)P zL?>|rE=>AF4AHkL?q={yYfkogJ49f<$<(e)^Efr)h&(N z*KO?IafE~93_k$U8AC*^n??aM8@=z2;q{#ir$$GH_09L)Y1kr>Kh?%{eg<~nrRse> zsQ1zY-ekPU=9f>3zA3dArzkJKYt**LxdB=Ez+@k9;GC%2ievuXJG;JKdq3UUVY@cr z-QmzkPh@+fJI~+@aCe+Dd&v>(Eg_Y!;WOUhrUZG^J2m{tl39I?Mn@CyHDG7gP{;7G zxAlT>T0XSYIzCi%S0hmek`zoC@^?PiwA-j>_bvz0`e~Mrqs=8;*|?V7I@8Z@{BGa+ zr}l5Oz3R-t>f2HBc?8jaFRSUQd0x!kAm15L`TZuCfD<(VR!}}pqO8!RUw41|S$M$4 z=HyQMOiH2cnuuX0F1K0aIv+4D^^D>4SgYZND4_4TJk=r>|4R?QrAu=d)B26faLAF{ zl&7Hv`lv#*0{TPcEsQfMTqPp_p>{&k9Tl%`XH*V!11?IT)wc_=4*-86{xC$~D2rJ+ z$^a{l`WI~jS>|`^H(I2(EdovT%w5<}cc1@snFe*HS>%d|2W+%^&d?$@&!}IuYXu-0 zvmQP*ZkjFrW^3eocsaO3IJ8u0eKu%;zTA)2pc|!HG??MT4|cK4P<=(_S5T&ym=&#> zscxqP_VY@I4=*-a)&Vcj81MRnoz2KMs0NWA)mT@-zSFq#2umy(JJsS!5kJyd`Z7_G z$=qVt^^R_i%_&!V6FID>Rq}9Kb6-kWNn2Oqr|RY-Lo{gd!>mAu}_C{+(-v zD-{wQJKd~Aao_WgAt|z#QNoT|`tAnlE(gu!t#0Q^EU3z6U(h`VXnK-37Y2(swfuMY z0DRKV{8}zVDvxMh<`hV_;>FDV zbOF0oqfTs@i(>#B^d*s^9Vz1xOFYRG0_ciC%4%nDSTmk+nN1iFqh zuH9@x>dN1Gb>%bPf=w0Rh?5 zm266SwA>Z4=I|&EM}=wM<+`0iGZblv&AU3n9>+U#S{_He>1 z(ncq6r9VqVu=BZ81-Z0Pem1%q|z5e2ul#BD## z`H@}{1jJ!A$uEE^NgRPUKnn1r26@^8eDJ+j&F7 zIuM!LJVG%EyyWb_j{=#R?W_?cjrPMf8=@BR@|Dazy^iuLcXT!t>3JpR1%$SB0Gp@3 zt+%p0)crFa7f<#c(;XkVMol}}#_!gb>G-28FJj6>RDCyD5f1~V=%@>-3`P&obuj7v zTHy_X$YmOvh*8Ga82xoHY)kN=%_40la{b|zqXb|Iomkf^5`VZ`PDvRA&PNhZz|-rdHy4Mzn69QYmDc9&MkB`=DUjkn0b}i6lRrEV~=2tikiN@>Qvgz8KGezvt z6}TQ#7|7)a;UFj*J%pI8#hoas4~sW{Q(Z0@UlKS#^Dwt#FZ^%`cJ9)D<-zB`x>5!wUBbLn|NbJDSho1wcF0eo6-%NY@;@(0&elip^9F1LrPe1rB1h@{9q8Ogdds=J8@Uc_rrtvl-VsRfgU5>Tf zApX8xE=CvD(rUiO{zmXVtk0Y6p~YfU40Cad%bWENu=h=-N7(Xup5VQUnsS4eeLCl0 zcA#ouFCwB^_o6&QkKNvU(!`zHC@0@mvHq)8z}D|Nm``J4$MvTjFJIo92Ov3|un&-E zKAz9=c^onLXm+;OCo@*C7)RC37~h|7vfFo0^Qxn}6eChY(g_yr-k15_rmyW)$xFB# zhg8g*6sg=i0#+8?(i4x*HKNonJTWn-RsUXRX}+VH^APRrl&%CDGi4Fz0=(F@xK4+w6DdlSH^rS0>d*_qo# z8F#RWg4O_V*s;wqu-;4U3p$^WPy@dFiLF$ty9LS<$imL@{Xi^Th7l-RN~(oAK*SNg zh4UzosoME=&mVbAc)R9~Oq@0LtZ;c&!}5L293?4E4qQUgmNU#1211i^9&?;u zUt-_HIhUQi@oy8EO1SMW8s5Csh@MWg$N^RJu&e5v$wqv5I*Lvp&j?Pf@OAMvGLvkJ zqZokIKXx<>ngv|Gzxa}<6HA`+F@~aOGp7Ee;f97efbRL|F9vQd1)N1&Zaz05!+X34 zLX7@veXX^|Pstpy8Y6tI3YMcC4rkN~Z8mg(z5Mws%aZSejEb-{Ydd5Jph><7^KAwO zoS|CY)2`Ng9)H7%?1v~a#~r51b^_brwg&fHpJMAPU1OBKJqh%~RZotOW<*&P9Q4?NZ%_luq06{Fr3|c8R7j z>*g{4jOwGY(WDZlUDrz2chU3i7d&F4cM?{rZUr48+>=}IH}k1~Mmf7l_*W`wO)MS^M#m^53==>ADOf(KK}_w(egVMwz*e| z9Sz=ijt1UH=@dNnG}p)u<+lB(086#9L#xE(*7#Y(-tw79rSHRP#vaw=v1H1r z$|o~o|j3WGu)alVz%rQ`E`BbG43fV zs6GS#fluJbX&_ic*O#F_AbX8wi~66?`=9lcam0=mb9a}D#&c=Uv%y0Kuz#PxKdXG1 zAY%iWnEPxy9Jf&8rzK4{Z-RYUA(LHSIP&9cw@$eDPZ!=)shieXe8atiN&3}>Rv|Gz z>+kfimUHFJJ++H4fDObTYGy?Bv8~OYjZ6NCUO=LiMwlC$l-O9>lfVtespX5G8%`$^ z@iN#q^iYxi{9huo7NtcZ;Z}fYwi{~ z)b(}JV!HVs)PxzySR==}9S^zU-C-PTRcBC}lHU~#T9cd~LXUi1HGqh|FhjaUM!vCn^GEM%vaalLS;zmm2><+0Ak%X-V23y$z}QQSGI(c`L|z88AWp9ok5kd8 z8=VyQO1q-*U5woSc}r>0QQfxQ{^p$&5fGfn0ajXl`C^oDSQLGH#{1Tip@!D0?~?vh z3lI*RW}Zn+p!n59H>CMRFF`R!gjQj6bmL8Jw`6yxTe6;^X^;JkKlS z;{8oD{yTi+7rBcVy6%F7bhui-4MrCVheQ^6{CrEPrfX9sO`}&;9Y)ZgA3j)J-wE1IrQRy(HwVe(%0 zA^!11L{UX0{VGuF*R*O*%HcrlSmPisGHz4()A^85cl$eB{3N0L`(o&>zPBNadOE~e zA!x~Q@u!>3-*A0g&s}}BvNkFFe&=E~B!w<#Jg<7C&-xx7y2N7eSVaKWX@5 zKoTC|yOO#$p0T^8cS#`0paM zb4|5<)r;i*=eGD?FSzj|hGoFze0d;1r)xgl5uCa3xIQ6pzMp2JNZuv*d~{Rj;j-u# z{^D9jgLGBfXmE6@xac^dad9WmZn_$~?N7sOU8kg^pt2pOXv;}@>kM!-AmszdqiCS_ zcVYA6UAnrkgL(S>oz-u_wOa#-j1OiSB3^4RZSJ|6!!lN9PQz*^N8Cws}ZM z7tKtp0$|4zSzniz_#YoEN?33^Af*b%o0lFPF9;LuM)-O;{r5aR&$g6%xrK@{h;zsI zA07#uL*-_gDCiS}R&R>V)n?bOHs^TE-uMSx2|Ij%R6O`~&<6U~O5ai33T8b_P!w@C zN__@fRdLHFHv_w+-d`~P`!N5Xr^Wv{r-&GN=FsyKEqb$~H6_!0%<-be3?%`d6zlY@ zYH7r;>jH$s%77MQ`~;(@D+Ajgp@*XfiT&4nNeZtfUj{s`E|gg;FB~|odAzI?O=)LA zrjs(w^J`6_$DW=R^JW7hL#gC|Equb=mqyImT)>Gz&BDUR8-%YY>TrIY-Sl&4nZK>w zkJXXM`!+#sE+I=S{fpzZ!s7r3NpLYoSD85Ao@#J+HGRQRY4qVXT|%2nQ=okHCwb@I z`8m;+(F(A#Ek6U7f9)|+Lc5}__LX!|Q~APxl6__e$OC-(fkSI zLan&98o)Ca-<@prm#t3T1<5Y8uES^t4USZfTe`RUQV4Vo1_-?z@J9y9T)+ss#`Dg} zDoEMT+o0q5$?zhVZ5iEXrN@ga+)FuNjq|A``l}ixyjP5>SU`1)U)v`(k@78_viJtd zBF@q}mfR}5R$~!E9?Ows#|RO-g(;7wcu#)5pstdDrg2JF_%Omsc1G7tD|RC>Dl@!u zCUgrHE;%})FZY0XeK;(FMtdiMd~Ah)ResX$aIq!*Z4AMfMVumrEc5kC-uggg<{YBKcxUoQZQiCSBIe`W`pT43_%aT$*H*l|xgGr{Db z^KMO7GpX}Hpc0~3u!$p}zM;LYI%zyS!Z0D;@PoPQHM5d1D91?<-%6)|>I!tHt3}aZ zB4Ehrb6MGHA|zxrbxN-a)aH$(sg8eD*QZVER=?mzjW zjO8r;3K1UyyI0UEX{!=h6!HjOy0&Z8M8;;&Ukmdo*5d z7pU*|@qg&gWt(`urVF}_nbjO$LM`r4ML&2GLoEU{%_Q3~KNODrN&KT$8U9w*EVMdt zd$jt`Y2%0&}*{|x0OrU@$YZlMesw!zF6a`3o<1>?hT#5alBA_O^!tV3eQRVAP zMMw9#OMu56f|73kKZ5%EmFq@c@-1DA7vZ4e)kf2==5_BWJ&;-bn}E~~)n+O2lHorY$i>2c4t4E} zESn8u>TfLC3&~enj4*YKY+^wS@I7E6%HSAVztvzXPq|eLJ9N=-+Rf_s_e4M2R|5+l zBbW&gew(cLZX{qoJ;;-(Z^*K5HQiZnJU8~sW_kymlimTnTvvCorXw89pm?KSBu6VB z#~sERmyMF4gM~_X6cNoyC&e`dFAiS2IiqrAkoFN*1S!>(>&BdB12=8U-*m!`w(5M4 zxho@13%8w#p_kMz)bK|o#@&NK?AOeT4&3=a7PVV~RGLWBWTWGX#%x_%0&PG7jx${= zo*wp-OeG!4aHHX%+f_u&&?1|Au;T$C6V8JInB|oEg*08P1DV=y{KX@&<*e{_K0*z^ ztNY=FCA}64_|6&lI_UsrXPjd?9n4MNtc?>2I!wCQ4xX@ue=6H|3`yT$yDtzFJsb-v zsIlpOgp~paALy2CTCo}0hpBJc(VdRsxB%7$_m_1U>=z6N2YFOST0MmeZ~LfqXi`3p zjOd9!I!X9o_GBQVIEx|?5Knq_pwAsc_2mUHPaz&FL}C$>p_i=Gl%t`JWO&Ks0>dig-38DU(nAx4M9ayxZrt?aWcjf4Up5aTA6lA6p+Jc>((MRz12HU3gxuCJF zuv|dK#F62GSg(yJugP>A~xJGq;Id{2HCVbs)Q&+~_ zK1sI9(bazI0F-l&X`k#SipH9??)rWn$!vz9syk9uJD6Z}fEZ9m#7JS*(0I&V0YN;;~u*CjMCLO#49%hp1djOH)K?ogcmVa9+Pnss20*{EliF&bG@+r>+dS zhl?kFoHmwpliR$Oi)F0yGjnRyURd5(kZXHQu={SPGt@>tnCHspfPKQ7tNurhB9#of z`ANKWYJ+nQv-tgRR2s8M5+q+|WiF0VR%+5!+)SgIM`R!!EVsD*9(=M>ZfZd6M9Lyr zA<;H=1fmUz4Fwc>HVv*SLk!Ye(TtgUE7_eU>gD+$vy-t*8KIS6>fgYE8PC z6qteK$QKB7PL8Ptd}(c)PmFgQbLkE%+Z6GD6lq_W*rjjLXm2kW!mWyl!8-%M&UxLw z$BvZgHoHa!_a0YqJFF^0?zWT&q!)OZ4aq3YxaLgIx##}9vgXo&nQEL4z_#Kxw4m@sA?{b zZyv(~wETLY=EZj-SlM?hbTlx*RxP)?q(IrcRQOxFP_?dw=2n7ce^ox= z(lG=dOqb<+GQZ<|uda1=cW=srmhFuus0O5dp|WZH(4k!BVht-B8yd-%RkcC8rB`cs zvVBCTeib!%&%n?PcYkVhhR=MA%8jPUL#%kv2;fob_2ZN5eJM`FbJAzvjiP#ZINX$o z*moAEVkB~m5=3x|Z*BBRS=Yx8(l%*w(Q(Fyxk5n*`D>;FHlw<4QV-(Gi58 zsZ)!1Fo-;+Xwu=NWOL4j%}J8%o=a8Nt zHH6d#fE}a0I6P#VZ(dqovRe=>7T+DdB?l_y$3?&~$5MF;M*ED$yvB2qxbKNq4(5;u z(*YhC4g2hAmsO48l*V0CD_40k)M47@&Z)@Oa20RaTKcF+$CMhscGz9VfJDkcS0zJE zcK8(bc3k0 zS$t9>SIaTT3n2~}|F(tBTNB>&Gc`S^)(JC{DBCp`ve1YHk2*U~(L*bdjv=#fjWm0FT4&6P<*MVNH-$OI1sC>){k#G~8~We7((kMV6^(ZS51pH7Y!WAEh{- z75b!myxN?1cg0hf4)<0-1Q34yG6@=0xMkHhDhD4ffUPACIg2Ojql^4&@6~OZE@o5J z3Q`=e!dP?zMsCele1Vh9-F2BcPKCOc@~9OC6sPLymbF?BM;lHCK&DHU`-ViA7oB7| ziu{R@F2?SA%KJI%8W3SN!?A{x31OmY+^VK3W+hhdISrWRg^6uxzcX>r9{dsOBX`q- zsaks6bAr?UP@|jUz!{81#MX?PfW)-3=m^|tqZhxeAA)@A$UQe&%8-$7lu<#VWdNHO zmbt&R$1JW1=HFu$DB2rNGH6gA+d4`mT;3HaX!RMCpc0{@*qI4X%+G^kR?%!}maXCz zNOzKJqUV`*H>TbuO-5zb?rhsOSINN4$emOw(F94y&ap=grHZ5-Xw;S>n0Fl^PrEsi zw*Z~_O4mO(bzE5kA2Ftkl;|*H`6|G`bX2w5KGr@~Rs9W!Wj^JaM3>ZzuN=z3Zad1T zSB}Rr-!JytK%5H5<0p<$zJYx?ifnE`b0MrQq6RQB!WEc1vKL#nQz*V)OK(noa~5z^ zJ_9UeUQmZcYG>v4xDp?PXH0ioWF^j%f{y~RM#q=YGPzlPec9Dq++a803pBN}%lk`i zc{cUoH>TsX8q=cAp&x6a>NU&15i~?3?oe)RhD=#8$R)PpKoNuB;-3j3^CoPW@FPW8e#C> zs~V&ER%mjXm{CVM4`j{z1`Osn*y%f0=DmqM=<;ExMiiBTY-E@;4VxR=cUGeUL_fWB zcbq56u=kZPzZRWWd9vrZGM&Q3E!)KWTMSk2hSQQe6_s>92MH$DTfcfLxxK90oQnNF zH5GR6_5iLVolS5{T3&m`!@O03yHCuQ%=_EBPvjCKm?P8NO!^Tlrl|IyL5F9wA@PZG zp1U&p5E0mPKSOFm>b7yX_r!4z!KrI;@Q6`W;@uFwxe{z6t~=ELmT+%IL8f43<;-S|4oeS{5X?C2xSIhBLZIiD zxsB9!mr4(9B}=Zi!}S$TIVF2I_A~+Q#$y%0sU_-&?JpN=4~2RB$U}d-QvZe6kNRUF zW`jVSdyVnOBQInEXwA+YD}o65P;gbL_;!17v#KYw)r~l29bpVxwxFyfVkVhc2i#UF zR@~^NG~$~WCNdvB`{NrJo$l z-Y`^0F=U(vLR5G;gH#?(u&fC=i*t{DCCo*sE(HoZ$hLoyF^pcO)or|S8dqW`_DhZ; ziaIhOy>j0k6U&7LPlOE%zVldG_a9uje_-VSiC-hxRW>b#P#6ouV6NEvQCpZ;f?@t<_|KVGAr(hDcTT=p&om=gcr zR{0;=*oA-~B01&osQM{#{&>{SKj@8Ie(X>gyOQ*(@&y{tdisnDky2uo1Juin0dAae z5tRBBs{i!FtD0V|tixdmwg2bESez@g0$x>qwW&&SLokfcE;z)T0r`16a6qxERL2MRxyrfj=R| z>nkmu`W%2S;o-5Ev*Jtb@<4j5l0ulhnvN^o@4={l;xB*3zSoPpcz4xltK)&l=~9WH z`dQH>;-w%p8%4m*cUV}%b??tl{5cNl*$J`>OgmXr`@_m#IIPM3>RA1SEZ>HTzHS>F z7@%(x2rR5rynDvwJ`(!rRVw7%0nnx6es+M|!MizUW`3%JrEO zO`{eiHy?BN!uD&bp;*uKS$_a!E%+!i>3&0oxiXjO<+FbkKQJU;`jV`-qw3~V-8#U+9S!v8rQh>C&xC-1qJDn?CDJ&nC|Ecc`Njq$-ru~u{tSq)4WwqjhfCV+9rjvz`Ig1z?I5ErXL+%Q%soKXTF;&M3#eOx+{XDGJw=mc9NEnJr=0hiricIA?jJ7hX1npO3&j0EsSQ$s#_;mv#8j zBrOB~D5Czh)whwNQc_aFFEGGj%T+Nf7?`eDsaMTC4I}d&hv+vK^PFY<6x!#CiXS91 z6mGEd*%ihBn#xCD?hTJ)roHNfupXt&O0n#rzG){92lsQOg?5_{w?h*O(f7aqY%iA@u0g{}?q_7T_S!LRvS!U1{ zR%SU-RR&BW;k$KZL;MI7mal%LUNPyrMdRBm_2z)_Ylj#q@^zGT^22 zUYVJh1LNa0y0k5P8>jiM?pD>S5WB5TzIiyCOK-sSrIwytwyF2A(3KIk(#dg#IXrO8 zP72rstoFZLzh5$f?NCt|RtJlA75CAKv4|9|@Sa{)md!$nZ)Ozi5V`0_8@y1~-B9y& z7eV#Pg zn(LGTMuj{V9ss5#x#+h(d?vpYXU*3r+!_nkD@v#|<=w>~}ONphFDm&+e1 znNi2oMs}B`sA?&9Q;3FqXfZ1(F<4+JoBPG5*JaLIbK4{OAsOVB6}MMMdNp)5fHnql z)sE|3rJWIuw=P@(diLijVzmzr4Q0}X2-%Xx7b`Mj$qH?J<~EdUSurpl%6}#&wDEWn z1oRzXC}D>H{bNH|i(HUQx-lXS*LPcb09MJ61ePNKYJ8kc`|{*i*NMGsd9K;-4}UIA zN|X?B_i)*ZNRrGMD5Y+W{_v`jGY|XUNxVLp$ZsT8xQ!hOkoPuFzyWic28x#DtlXD1 z74`M?ohJrz6t}38aZ=H9e6W}`*vYZm7@Oxle7h{`0ZV5*f9bg6edb&4+r5onxfApS zy=H<1S({YR#G}(5hci_3dGlQfaa}@N9lP2B<02zeVy7a;L8LOL(b>_sX=MJE^7Y8E zN)s8ELr+g0wk8d(RN>B}&&&OLT)|SbbJDVkY%U%eTPGg<3Af?yFJ(EPfY6~YD*YQH z`ZKd)x5G+hRI*ZjOD13p%KUz8zSLvWXlj)H7ig-kHvV1Vc=5y|t=9`Ax-v2{ zs}RU!kcER(B=a-WgrjcaS60pm`$3u+ZL~fgAKyH>nY7q*oGq9fu3bK@mFn5cIA2>t z_YyyFZy_yYZcDey&eVS+x4fO72)AqZ$iI^C<}t!51l{CpKc^0&T0YRFF5Cb(*k;jg zNJ>RlF=)6@8~Luu){W|MvYAjYBQ!$Lz68&mR&dq_S2&v2Vx;F;(WGuIkdT6M?HQ#K zrkjFhFrX*hXGpeyRHNRKJO-A^z0I<%UgiB=vB}NDLrB&MMeDeW3-i%0tP>YG>Pbze zx*9r!YoP=U0CTUexA9xEI3-7-MAqowm! zB#UMr&#=~qwaP60XDyA_1(|Et?2DxOGi8`iY{bV~A}3t9&jZj&hqHA30599wo)qU4OS9Y2vTl;>gPnovXl;j4 zLk6wXrp;{mG{m-grLCbyS25>qh)r1ogEe{;ngvYNyqlzDkS2J%Hv=a)`b1Lq{=}M$ z&r*vr{vbg2kVgDMbvtoysho4WVxPKk!l3DAE1@<0sojUM#p}f_lySxl0p~{Q%z)T# z-IN$#M>G(3UxM?c&#_SWNRuR@Mr*jum(+QNHr=ipSRx-X|3VMmt`^<6=XpnA@mbhA zkEHDL-%Wq7hxB;Qsw4tQLxF}yo1@ounZfwOH=gCVJg7nfw9aZA74QlQurT{&TbWpH zhR#@?ym2V!!WuB_ld%YfnskN3S4q}twz@WRacGz{9&>ptO6lg3F_XB{Xbu?*Z^Z~{ zY8A`bXg(%xK4L1YNR|1h)tkjxzgk$m#;D?05frE+&I`rq3(%`HiD=2zV!fbNY9wOpgswyIZ3bG=#d53Q}O2U?mQB209 z%doA4b*0*&ViwM3ZN~}wi0bettD22wH%+u&WiGZliinFX@fT7V-C&CYw)w>yaBdpTwOt9+2$wfTe;zVmt z4vJ1BLs?i5pWhMm0}Ui1Y4liviDD`fou=Ojy=URHIcgL+6w56t>bfzyNYlrTxtIFd zVmrWwhHH$Y<<^Ibx5P!YuppgDA|fI>NY97{I~&;vQyU$QA{so?25;;|U^GEj=~r>n zp;kuX(Y@*MQ_*HiTtWYa93!9@^!3vlit9UBB1bu$RrH0M%)I@$$3HTyJ zH|MGpz3h_Z(pq0Z`OMOzjDTwM%+040ovf-W&qqCHnuD5_xZMx7?OJd9&Z5$^%&|ht zts-tNGWzsd*6q(JVfhA82=Z#%w%uLKU~@MWnD(RX+e$h)+@3_$@d471i^_6mX^?@_ z)P9JDb{ybGb%aR$w8y4cMB+v@Ci4E}CJ|mX09CVi2h-@~a58BdChfwbbUmCIrD^Hc zwbxx#J@NtVfU|bRkWGq2*Ug5%o((gKv9#xOyzjm>KDTP1d>|EuZ3Ih6K)IE8vi2U~ z=r;t)#&hA)W77$67e5^v&=V&~UZsMwbyXF1piFsAHC`R5kNiv^C(Y*e^-BL~wPiSi z;^vor`iHkd7EMA;3yU!pOqt6w!Q&*T7s?%<1_0mKam_R2SG>fB;*Vd0&gD4+Vxrq?dRBeE)Ts561 zW?yH|!h+{Z(%T8JA}wfB7#pURMmnj4**_P_#4e*;zrEoU&4vC!i6 z2+hgO$m2A~!jXxn+)+$7z+snvRR=z%>tlro9Q5kDVTz%-S zRAkv`EvH|h#^QL#q-ALN_vP2N@~o)tyl^>nRNHtH!H-g zbyf&6_yg|g6}~4ufQH^KELGXxE4&&V(4x~z<2o(pvH5{;loVY(XsG^WHw(xe&a4^B zBtHos(zbWq_h8PiJ#;jM7lh0%OHgv%p2_V1w)DI+*ok9dAMS}Pa zf43-;(U?F^>WciK?CSC4`Qg$!D6TeEUQ-1;l4aRpv3EiDrhy8-tOYrjku;#5r)`QB zwgwYFJRKeAFOyShn;#KVJdG*NKiH+QF-zw?L8GmAtH?d>zRgRtGHC4y^*GQSEUYNt zTxI)>QgQwvoQ}M!qGnv8)q>=_7W75$!g91bVGC+EzYUL!MAM*EwS3#pRh)Jfb4In& z^LiZa5oYM5tr*=;v}wM%4@vdJBHQIw)Z-w5`bbfG3*ci$7-~9CIuo=!3Um>j6+@UR=Hlb z`1WGoh%rUzQge{Bz5bKkz55(|zcOx2E`KIJ+)%zlvDl?9U6;Az{&j78@HhE(mB-6| zUN}orF?cGWX}#BSmAyW}AIq{f@kJqL4@>*|-E?t1)n3LHh9P^E$nw@nVvL7!u84mB zHPbN&2#HklORnguV-!@mkgHrcHEfG@OI%OBOyuw@E^;jbsa74Q&FT!7uJa5y89@;lKK*dz4OE?_{hw?`? ztL*yHpMk2HQ4^!aNeQ00_uA3Iz<@UAxlc6NTr_WiPE@;q8zNq3?-L1R6bfAn6tHwa zZ0CvWI8~h1aP{qK=Qs@baWBSy*u0UydNF3te@LOcTGdLDMW%C=Z+*+7L*^I79i+mT zp(d%V3X0>`lS&=Gn_kxJmkApTnpPW}f;R*OyNUqjMMIs3V-}znOP_>DxREX=ylM z)jFN)wF2FNNzF(MFmO;uOO3O3y`E}!rf|Y10U5VzejK{PDp@LVPAgn}qTF27qxGZK zN4geAb4M6(PV=FCj+RCjWO%wGl8pAluD#=!3sf0 z9L`5(Z{``--DYyD4z5md7|^Vcul8dI=3H~UtqD@erL1OCQADOx*iM#gKV02(jjkIg zU-(wb9HA8{TL`(=i4Nh*0P22_GoXEKbE788Yl-&4?<;q<)ee5);=EcTT62+nJ)udJ z`yu$er%cCp?Q>T*87C}YBy3M$M6>8(M-zcJeE`t7p!#qV-hWZ}o0pJZAy>z%U=Q(t z&$0s^+I+|) zrKqwzHds}x-;&vgDR8=vzum`Z$_ zcH2c87RVc9P{90I{|-HTb|MzZ0u^D?0KHH21^e~qac8~!dg*RWyOsGoq4vJ7JMv6a zQwyEi8N-#O)*(gSf--Rv0jjA3*Ne8gMMT_pOOrZF;o_N%tp>w&y3QZZtC70*c@F^P zg@~isOv;dwwcN4(@RObRf%~3jvENDv`d&v-CY{#A0kx0FhhUB`!Ec!Q{X-5NLt29Q zo5p|P={pUQuFHjxa?p5E2~Fx3x~<#q(cf1*^_$#R!va*8mtr(^xlfzzKgMe!oj>z8 zudnLhMhE!REGZXB;xiLpREJt>A9NTCf0#Vpg{odly)=7j$v8W=y!0+|omlp7x(=1k zwV(d{&b0CEHK5~~C8IG!02tXTxE(|!kGXT|gQ!~t48)f%C+MjpMlNX6Tlxeta3Haq z#dizZ+4CfzzJi{B{N^q&8!~p29hkA$4~I{v`+b4pShxZ%J|G{k$PLM~n6U0`Jv8Nv_KNY^Qz9>;%>a?Z(8`}|6PR5B0FwnslwEGB|M%gD} z0rc;~SM&86GT(+tCI9JZ?-NC=FbewtdFSUE1}Xl@B~t)mob6s>oc8O@%2CWBcFda; z28=C9k)uU9I8dj>fH{*}4mc9_osG(Y>B#J>BgM3U;+FIjzk+znZ=todO2r^Q;7IqN zFG__x^T{$z5A&;;hBBv(X}2l0VReU!!V8}Lag*WQ{FH$lL$ISU7&1dWtpj8b5D@qx zL}>G=vtLxr>|G@C8Gr>#_U{}0LkMWERGytAVji~~obKtQBqWc^hoeM8k@ zE7&82G>A#nY|C0;(Dw`LBVrKfY5BHGk?oTo+ zvxk1W+bf0fG}O@Y{;}=Ho#kQN!TyDz8ro(rER8jr_naj#@$@in1XdB0 zTn#v!otq|(>VoLR=o0J{Dzz-G5@r~nvc#LKQ8n`qoRhT-HvRkZ_{Ocp22)rozIYQ7 zuZ{t|Z2AGatuI$OZ&SwimhIC)g*@?lRSSd|p1u?gYUq@4s!y2stpc{Qt%n?h0Gk@D zYtm14-)%S*84Q@Rw1O`Vd;Anyf$QRP&HZvBwMR=jwIVMk!@2kEvoh(6t6&9X`i=;@ znWW94BZ{;Uwz(VNzF%mlZ=*!9;7zU{fgX+BQ$BgpPdRGt!~@|FAf|Q|6aNDthq5@b zJ)D>7YS!Q)|F(L))-8^9pRQ;QTJg#j`b!A)01IQ|L}w#^X5$IdjdXp$GB*WA5jvyX zvD2D9e4xMNI$=MYA-GnNrX^f*Uj^&ExKT9@vDuWrlH2O=`m#p{L%Xg-0CfhS7*+La zGm3zouR498laoEQAFF^Nty_Uks~7!?^^YSAxyMlNz|}xo-L1id2#uhfCVPMB7lU(s z9$F~0L~>u9ZDnbi@@|fn<&=mwqbK11$^s-EG@gj{;IlAYqSH%(nLsYYdYG}qVH|8f zZqozsZ(H`$33CukHJ-Ze$MV6G&iO@jap$!N($_{XMM}N8?mQacA7vVi}zyH z<@W+#&Xei2UU36V!FHdS>5a`HXkEFRaA<)wz^6?Ce*M7Z7SIt3`2S#g5!4QiytqE| z<}?x*={XxKEG#+P*nQkuY1&trWjE2L@^e4C*FzS(b@wLp@CK!YlF7k1q@|i?$}uoL z$*4Oq0oKiHHjs_s+?}sUF!=7fv&l{j*s!>T>Y=b!otyK)r{JcE5vB~sAYpDmTGE}k zlVZ$@-M+x|2zkKWsFk55^vo~caD(SP3k^C;HUVLHY1k`%sxFw~p+{)B9IbUSCK~OI zCo(?Wb|MPFQ5rkWLS9sg-4UIm%230GQ}`vj|J?g4rb!(Z``NX7gNUg6?W0%qJ;Z#j zr~6zm_nJl_te=i6j}1pR(*aHwU7U`C9)44xf^)a2M?3gtOQ62_Kk=HsJ1xbes3l7- zN0Vy|cUWA)%f^dFjb1t6F=6#aPDhjd+{yEYQ?9;;5XgPuE{anpSb&J8zY4aC0Y=rY z>$l)K;bC7xRx{V;V<~jA75RNp!PS zH7*v-N0yRKpnk8?6sT=W;??n#`>rxkb0QhcBjFcGXNeaP+|g-z0%s)`3%@n-ko_zjzD&U{gY=@X9YFsCMM9lNQn_xXSOK) ztjnD9Vm(DH5PZvBFNq5J8zO$bKRv%IkAV_q#BC4C%(H~4e}h%kU245TO=*F%9Pm@L z0xdmGvyOo@k3lAr$+Ny(4=s?r@?g5}$NnlmLD<_^Q2+qKhCt56YJ1FCPSbb5Y(Eu! zHbiN&c$P!|eg9(0r-G;lNa_^Zxg5)P7UDU*2Uw?GE2QFAzTv;nsaMLq=Zp~w1~EV$ z=s;oo{uvWhUx|ibnVD;fA+b7k{A7&JOn3g6EG#UX2|l&q|LXL%hHxEL3YSJ#TqE%OSyGt3AG`C^0RJ^F3CjlnbFNP8%*Wy6(tx4i zh!hKu&wun}?de(RnH>+av$HdYl?l$+I4-&%c$xyFUWqhbtE(lYt&k2muW6dE|PLlq4wD6+ zgXAIj$WF-j7XhNboLvme^EA&@b)#Zq;{cK4SLbtPQh{9xm&{NClJ1t!tA5uX|3uFG zNCg)}0hR=0wHrp0pL6y7X@%F{e(2>vnB56<^o47IL@4`H{`T$9$xRe?g_|!*!R#5J zGHXv_oS9TSvCXEfS%4p@PJHihdY0`a!?2gkmKA_fZpJpm)MoJalB=^|@94XeP8Cms7{#!1s$PmSXx_hRP6xWlkWAhP4M_kCNt5_zUQGlWNCTB* zc~-CGnJP&9bJF;$4BUo^N)fZDD(2lWKY{vts1 z7Y62aOhg}{p+L+=r&s7XO7V-}?Geh}uV!Zy~OWysGn$@(t zbC1-YVtGBq3#Pn>(_csNqvQtRd|I-Z_l_ z@ON^9eK?wd9*0%^NQ$Ds>m1Ij|NGxwf@t#d$UJ;W@I4qb@WR9Yuo>Vd^?=Ub`AA(B z0PUxEs+2T_|F9e2Cnp5id9<9^k6v`0%=Xg!m+icI1ypPnH{W9F+%H$=zVOd-_+M z^`9Q`jmk?@kvh~GemN@tSU))Ozri*3)vHm9dmq}c-c;Vx3%U2-$R2Q|VrrBu8>#ZR@RJ^YUtzLA}ilk)1-IRHBm0%ZS@Vg)fA+S*m-zJv{~ zFZ5FXxAP}*DH>B+NmKR88-CA6Pc;Aato`E+$8^s%HKmlEJdfTIaVf+3KOW;AtxE>R z^F2*cQL*Nz9yS1?e3u3;fhx}_p2MzGr)>Jak_>|0>qC}oubjwgMA|x#b3WlYm8$aa z<%yS1nZtwtf243Ny5~x_$THNXTqV=vyx&{VWPD7odjv6^<Szxocr zwdB`@+KVdB7_L$AmSOMQ(gxnlB=A)m;nVVRBl-@W3zrvv@rd8Q>Iug(lVZ%iSN+n8uSzs`vPiJT_I;Su*(yz$KhG$q_yP#s|vSaM0 zN2IQU%o-li{;HJs6isljC43e1+_13e9xFb7dG*b9U`F!Vv|t7JP7DnKsvt=kDTrmZ zY{o!+j(BeTg)is7@9PT}CeQHYoaxWXj7J+cB983dE#-E0jZMouzHP6}W6(99q>x(` z4T4HPO}c+Mt~cpX%WmfTbf+9WV?J7%KlX9!Mnw$Jc$L9;!OZBMp|PQ&ogMexJ9Zhu z?k@ewUgtsWt0R>GmoHy7IDCb1WSE%N65KmlI#18X7xn4WrySL8N}x*W≧@${C7i zIK^GjyHx4<`Eg1rDzf;e279mreD4g(!gjFXTWn*K*4O${purW1V z97qwPw_hF#T8rk;9w17I=)c(B-oB7ki>80@K)Xy`Vq;^2+oVU7jKi%$I1c_5sDad| zwycfxTnc9(BqGWwm)FvgmiM05>ut^sO`~V;Nk^7nCq=$Ex^<)4F^hmswr>rI(Ky6NU=V> z5OYVBpTjyRQ=^IHe*IMOj>w~jg&MElJkrv?QGfF_rZ&hl<1lB=YGFndTyt_TpTo7?x6-v#u##Halv)_&a+mNT{znLYqz; zTqAB|W@b#^W?C$BoD$Btiuxvos{kDO$oX%fw6UMGtgYEs2`}5l3>TU%J{}E^jg+kR zJPbWPR)wXvwm#L?aJNPWCzP%FQZY|gYO5e-9Fo*)qQgF*)zfulW$s$WWdKKAiIs5D zVRbYO*#@UmKmL*;w!Im^_7o||B9Gn|X&xFitirz32GoVs`cO`&^9W zpCqG~2%?YzydEbHiZNqvSk8QUbH(mU{X>_da@99H^f_c1VaP!W%7b}4Lc*uZL!ji; zX_|sbx0HeCJ8Nn&&v%OTEuN6SsSFFd0i@7PWrX$JC}6&*#=t2iGjye(zVCql~fcHY!&0%jQq;QP;ElMtvCWRF?KG zy@$Oaz`1<&&Wp77xALYT-!M|q|9%d8;x7%%j;DHe?BqV>zjFlD+Qwq<=Le!p!yyC6?)$nPE(j|yOe-GNlhJ+*y(SFpAu zUYLrhxInE^lIm{6Yz3POaL?PoJXO;Zuk#1=&`;*W1*Oj;`&Dg^ny(#Lt_rw^Uv>3q z@kj~GQjIJ%{rvE;xHxt#>i8mWyY0bB$5t)OLv(-t5v@Gk(*8kgPGOr7i2=NAZrV1t zjWIL!Q;7@EP?`}wdcK}`(ZBA-$@QfD@V@yPu{XMFbl}8{&9quuKXVE!vkXmL?>Ci0 z8}~Ub|C?6g75ON6=}@Nq!~{2DwRR^4zlPu`gz_+%1%kUMCuWb=|QHAHw5r|I+KfD-=g zMdKu?CbmLUV~9wKCwh3w#CZopcK%psyZ-#AYv!04@%&!art|tCz0fMJ@^Si+`Q7heJT0?OhnPo+ufFXS?3BCpnUokx7%$gqZld zSR7d{yuaP2%m_uYP->Bg_%8Nm%FBJd9#t@6U#^cIytRm2CSrQWf@X*jG7YnSCm8B2 z=AGd>e2tv1{f>%1dST}7b_nd)HDb_8y8J?%{HubR!N^O)In#*v^j#HfBn+x}{8~mX zGnyn*;iPFYD;rV}JCZHep|pB6ywiVEzII;pHh{C#U(F}}_!6JKA&lguBOlP)wc7*USaU$(V)Cc}3A05v@2zrkIR zF@W+SY6vfhXRO!%QcOrlm`x8Y)NcWX>mZe|fifH7p}8v4LUXPn9(qQXfF~iJA2+t! zuDn!Um$h%+HqC_tW8=zlVn5w_vbjadZJjKQB2g^hk|EW@uGC1OA0B6Juk=m_w3~J} zmrHLtpJoQbY685cX|)*M3bDLC$8=vRAdV#+ws7y?ZHzKz%yN6BZ%x9Cd)81Z^eXKe z{=r2=pJe-Sr^e;|F^{Efwkr(jZ22I1-U{#U{*N*iOvNne$U^A|roMqPrD-Z+2r2K& zz0;aM=DT*QOL)@I*I3o22b@}-^70(w;^GR;gLxVrDzdJqBbXU#7xU($hvpp%^1RPD zdUuG&w=ac;hW4@KkcCLjKz3{{X|JMUTBdV8X?fF9(&#X>Yr|~B>^secZUC+i`LcGIlH9= zy8Siz1bXSCGCX#P>=Os|q2#~2a$ZGUQqrz?b`$q#5Y=v*I%WTeqnk>>o*|Btge}Fp z+at9qcWzw;P9@!Q;X9N?$7p(hV4#b7g{Tans(DUsZmN&(^8+;Ls4#&!zyCYs+_&LOIbl9Gg1FYxd|PXW7aq|T$M|f+g3Zs7>?Xt z**q@sDHPttSI(GQNW-^G!Rp{KN*Mr5dY0{tl(ApSZBWcP&HVeG$CyC+|5JQ?Yy5$6 z4-)@K%H$eH$Gsv=VFgp-e;UZntQRYH*0lxfrJSr--{%X6me02?SPAB%x zB);L)_?>H-Ra;6*W4Vd>E6gwXa)xZhjQ2YQItN_~ebm+AJ8^vF*|Jb|>&J@Uo>RPd z^Q?Au4jEc!72h1WFDXf`HC95dOYF%RaqVDVWW{4pt8cTQo&S@H``r-Eq{GJ*Cbb_@ zDamH&$)`2Xd5NYlw-C>HYl!OhivPwG=&)>U!KQ<`gG#EZp8nf!=9ALCe9@!3`yT6* z6G5;nBf@+7GIUMX!|0Nn#@8NCLhii$o5>qXj-i`RG56FQEb z`nVC>_JoS*1 zXlPMVasGB*Ux|Y6;4xfh38diCI2KZK6j`0zq6JNsh%cL&nUP(i5|*x3#c*KLpka=9 zFOW)H@h0(-OKW4FFA*@u z&TwdflMjvmA7O6+)z-GQ3%Bf2tQ08LqAe7+;_ijwPLSYIoZzm-ikIT<9^Ab^f#UA& zPVnH|)qVEaXP@tW_y5OWWMsh@B$=7(l}FwgRS}iUYBD?q)nJu`oRm~nepkm*l&rH} zRQZmLkWm_%iQ) zZ)&}mC&{MMZPI|?EF9!}_doXepuZ2(6e?dTE07aMCI@6Be-Yv_g=Kt3BiU6Ot09Yu zVpt{sC(ZDw^x5&11I?TTs=aZCV|?AVbDDs+?zyCU#vt_%5LIbgMc6)Ir_NT&mWfDb#(EngC;!XwOh{YaB&K zaS~PSA*^W+h?C@0>_ucT&DN$F&i&74sK_j?EnX`B#$yHpp3oKFYt(~PS)7N62w2@> znvIRiRyzYVs0RW*`4>a+)Ry{zlPQOHH{*3C!t@U2T7s?! zvYtD~`k6V?daEHAoaKb-n~V;lEpYSuF|l5iL&yS7+y#eMo22HDVZ`Umfz!##GD%298Cb+GOH=t|MGgrOQBg+b1uhQGFJ{Y` z`luT!c=pVUTWAw>r_N!PCG^A*4-X;sDzwmiczU|goHenFGr#O5WmO<1C1K^Ag(^F}D z-Dv+V2}aCOfM$R{mCsQsB9baBlK)1cn3(SQ|AkAJzLJoZp01>HIHZ;TZh^(X_5(yK zV~{ODoI=E9BZNjQxxedleNybOUX!aste|K4Iw0au?C{fN#-(Ue6b;LS{(ZClFG9g) zUsF`{C_x-j;dl209HtF6R<_)#DUIT|J*)+H3OtEtQp8hc?=x5Y7FD7(glr!_1R;o& zUl{olpZ=9Oi4YVO6>+dglQN6piI@*Kb)ULAib}}3QNeu-CY(;Y;@Wc;k0g|)&}Z0hmBu~8iI8F#JpZw zw~QN*pTasf92)}V7n~H}TI<|HUMGc5nM8T73)tk#pqMTzE5aI_-~rHbgBB#{C9&zx zudABavR$H%dhK_v=efr-ogMdg%XN=$)5J(oQBd;G@R>BvJ%t+bvZ)y)#z5(M*fpI|> zf)^XuO6@X>?sl@6phXgo6|bAmljbD^po4KZccJ|E*Zsx}i>W_G-ihu^?2ap$Dd=)e zccJ<)@jVjNK$dli8w*_uUcMmU`bJX!D4<#679Nr{Q60z~6q3T?$|9T2p}N>t+?Jrp zw&#~T7h-OvF$7jcs>YyHZUVjoHCW&b_`;6A_3ptqx7~utLr(kQirNtqN&78>pOBuy z+sOnAu7K1?<4dtWw$B_+5Yz7Wxu*5W2 zl~ZGOfUwWbx1+{*Je%&cMElFqrLq6wDh<5R+30H-R zL-Efb4aDgY0+ja@7n$ByO}dIOofb=a{3<(qFq_v|csfdaK{oNrbZv*$n^Wnr#uNc; zx-URcAYTuzVVEz~=GFLooFRNerkQ{{UBCFy+p9^0R4*@u5MUwgo;7TkDqy}L(dfR4 zpwG|nldKTHLfkfU<0W7`93w_;UZG!{th>LS2;7bMO|)wJDG`~3Mug<$;|q#uJ21+s z+Sa)~+i}^MDR7%q9sWoP+RgqHo)tvm;*&*|trFw3X}jRKojTS9#VbU+@+&OmE<>{D zZ^@yjg7zeK%qi;i*r0})!my3G-TmN~aHcxjvu$1FSpjgar28Rx=`KonB}^j?Rt^GA#^SJIAYXeGX4SAO$BSZTi>Ob0u*&qUNG0 z|3tzd$+FZ>OA!3o7=qE&8%?FyEKwIn%~SfJ~J_mWm@j`plBf2444*zP!6`UMeCpni0R zAI5JbhK52EO-K^ch`VTz9)j1SBbP@wgblV30u|+p2BSpdLSI?$NoIo6&zryUz2`)$Ku{*l_`6kSQu1KXIbf@R$!y&MCKI}CEs6}_jE7OkU|iH{#oBlXS-3o8adSSe;^W;Tzj4<`{s2KFp+j}Zs+oWX(U#O9+Z7rbs$1Bn2J zN^`a_(3jQX4mZ1owL!2_+iZkeZ)a0HJv{jMA7-*y772$xS|IL3 zPTh*$X!%k1uM}am0sWC*cfI-)Ae3f2Wkrq5uFHd2Wi(Da8%J%Zy86vh?IBVL&(aga zI<2XWGm-~lWBqAxvp`9yNenDj)U6p~FmK0?$JDEFS zFzw>a94M{rqQ1pbw-&}?e82oWlVsd1UahDyi`f{s+!TslMlANuL7pU&$fq-BYK*n>DoI z{46%gJz6AyyT{&vnL>_-kZzN?O6IEBGB!*$v{oD9kTV)~w z$*VKN39sryt&wQ2EGQg^3q)5+GAPLy0v;P*n>Pd6D#w)OtW=TWO}au%@R;&8HoS@on(Z{K{Q~wEX<~+1 z$|mUwdnNkfD6JZX+8!sFa@W*7Jz64NCOLX+Z>1d7Wi`fwF*%(`DcnBi%swmKHd;_TGCRWBu~RKJxEni zSD}^-uTnZ5UcO5l415LAJ8rwJK6eO>IChU%uZ1m0w%uJPi`YURo+;H?qnuAp>sq+F zX3Ge=O5+>XS}qpl4yQ1S2Fj=M7>_@fPnhJ5TFw{8-73{?lA}{A`A#{a>epOhf4RWT z<8}9p!D~+vm!YhgrWZzmx8za*N?=VM)b!@UpgW-nXz<9CD7fh}<7)@?d3orns0`rK zqzPcFV*GxufB%$3J}Fa$g4@~+^zH`JyePDZbmplrHY+9(T8#a>TbX)$dHl`4PGi*G zk7Uqyoh&exdD}EyP6uBjifzff-$T`R|KeV{&>!uRB&j;SpxYwbpsBlcT-`lozlCDZ*{tLm#>Du$`i zgm^EKE+lzv)dUOaVcm-Jt{Rrjq!}FWuHxkCS&-5>_IhqIbtLWSXMO!$^3(QF907Ms zTt$b6w3;_{1mf@h!qJXdpK{o>3m&18s_1WWlXut? z)GBSu>my==3_>q$vn|CEy~8Awk4NCci_1^FnJ3|s(Kgzu=#w~ZdGtL}c27k#7==9S zIS5b2;7pO*H-!BKx7)*t5^ZvWpIvsoGCYlTNk1W4ykD29btHTKOeg~vOK%gy!kBx1 zRlCt65#&|X$D`R~vM)Z>XQ!Ek>~XRgpA`Gvvl*52PmVw?_nVf_-Bq-FFzyGU-auH} zG~ThGdsHC*+bq`jG^VR@wH5&ve zjzPDy{PId!hvYD3OKwDSqJ1UI6Xtc0^=oU4pxP z8aiQ{Gna(Pay%5-7(%@EYcw0+ET+ypbsqK593uRu<d3sbV_@-G%4O&$ zs+F657r$4URCgE&g&$E*8yHx6T2fu^VG~`Ccl43SvQikiCH&qPw%qhO_Ei#=f$T&s z_6eiHA~uogd*=|i(m^q6Qha4fX`7|3-)+zR#zP}Hz%whfo49u|Rcy8)Iq!+Q`D=Im zR&V*{kt{mv==9m~LJGa z*0=t=N~(e5@m@7yOPHXA1C;zTvNOxo^%j5_8OzH@^&`P9JWMu#Xs?D+QN-t+U^@=5e}9u=Fcwt4LOJ!uVB+ z;rN73I8SdaiL0HnlrS{A2*M^!#K;J zBlOnOzgX3g*1v>(S01e@bcS0bky5hWX8>m^-RnxfX&g~?5?>40gM3s!VDD?ST;Ux7 z6YrpZ5DR#GtQX6`Yh{?d}-nu|b z1d=s?AD!=zM}F;O7&SmA4-&XPu;(_}b`!k2!nWJk`a0eqh{1pCQ%)ZxL}M~E5<%R= z#+k*3@oT6zYPowMA>RU#*FV>SV&O=-BNhi-z0!aJ?l&xUqW6%9>=`XoZtk)E3rq}7XYWRp^OgN6egrO8oEZ>DXqUN>Ssh-xcl7Dc60j~_O`;k&s~kyOrL-$y zh5Hj4!9pN0V{?%Q!rB2Ag?DggrQW>2Wka=FovU4WoH5>r4p_Bg=%G3B--Pz>XxI9G`Ser8Dy0cq+3$@6qEQEaLm8oOfVfeVL6tsEr7jU zdNNspL72aHQzXi-@b{TMc?)oQtq;2Os0`neHMF?fFs>J~7I;%}r|4qJc~yqW-fK`l z6?A#L7g0PSd=pE%ph2hK{|ta=sawwS1^cN>o$mv~9hB;|RauNrjih$wR2R)lD=tE8 z??{vwb8Et$BUrwR#yy&FY2bI#%~{5jX|wBEykkuMOVt z3}~awQspIfiagQI;1@0M1<@(cdd&dnDfvDoK9kOv)HG>?ySPPs?7)@#4II)!amH5b zb$VAdtTdd)Z?sgXocGIZCM4y%mVQ74Ms&GLBj|${5ve5+?fx21?7XTIIh#E6x_k`3 zY_eQSuH`^Me<<1hx%0MsWwhKwr#;(!d$tavdV;;PcG%(;3%0TFT@06Lp>uzdU7mhK z!Bl4bJ``GiRYJz)p7~=Rr9(QYQ?9AkI>o=&khVvm0^U(pJxkZp_;o8Pr|ePuJd7T&9QS+m(--yr_~P@ger5 zal!(B#dTAwXP=iHsbXVd`t%#zzGc@iE3Biuc#(y8MtCXHNa!G0yw^S{2%I*tsiJl` zv!7h0li;6~Lc=zr5x14NwF-x9HYCT~!w3t;1({6K)-BdsP}vYs$!BbO=eoVoKX_o4 z%lqI*Bb~#_?#tQVb4Y8@Ld!O{wxTprvL>W+<=)7U4(scfPNGfoLyojOW2%WvuxxJw z7tv{rxnqaWf}*KpmFnicWa4F_g%R_LE1!>uDT|8-KEzRmkwR>TJySRwi|~4=ps`;T zzqMcVxznE9T|YN&9ABF#`wk!zNn-=CVQ!%gv?ZVv%vQ>n!--+pOtzU!(E_Qw^K&{) zb(%xlXW(9CAaDM`O2GR$tg#Ch=!=7%%{WFXkth$oAmS22+^qSi9eQ}vmzBZ2KGX0xe{FC1OW zhjc9+`7OESS2czUV4FC;L;nx_CX``}Eg=I{V_8!?*2i|Tbv>V9rlqIH!Hbt2OX3AP zY?FdMR#J&izq@)8{9S>$%p{lNqGfoxvhrr|L+p0Qq?>=p_5-ysH*U{9i`(chJ5bZE z)J`;F46CXOhm~yM6o!Ewhe_a}B zTMq2FLH<|>XXQa`@Mw>nj*khO+FTbc*mDK`xj;s*{YQcGLht9Xa%n+DO%)bkw};)Mn`o8Bv*y*TX35u&$xWX5^d|M6j&PCj`@Bxt8a`RN1->qQd&_B2I3-)`5lATd z?`&fl_$&|&q7@xbqxYcy2Zfb}OGKXf@uVA57DJVpwP6`U8QB9fy+NCHqn=f8pIu|S z+vz>H@&qULZp6k$N{!)*tc(vsW7R6wZLz5A0yi555QzDZ%X3+sGTk)PxyQj0_BGBP zjdN*^D{;uqxy@S+RE4uvK3hPVU5dN2hgZUD5RPCGsZBd$x&299?w*9D{=^k*JSNB8cfE?< zldvcGa0zJL$~JYGV>9o*L3V&x{i6HjucDBUQ2$p3nGU1wJe$BV>P;_>W|%=u+fPWp z%{5qXR`jc0cCT2N(G4%p6IoP-P;U!z5|na$;0RlLGz6OTvp-1m_6 zVd1e3T*rm94>hU-{4T1%oGfubE)UCWX%7!wDBC}Z(BBGr?B|Z=q5a{U^sN^NpGGpqZ>vt+FBpNhXkc)Jqzgel4EuJ={L z3{>sL2Gq?H&M-cUy;-V|8yi3SDB5pLe}IxcHzn=rn)m=hL*i0*(U*3W5)nOwGfx!3 zZdleG`fQ|ZBXG56T2Rr_)jvCjN=Zo($YB<9nM|LCJSV}$#nlAu3l#dl>q^+(}P{i)>yRITUqxzJ(Et(+(%or*8 z60WnTjSomghz)toFY;3g)na%V7OH69@Yc4Y689KyZ;U*)ULa+DsOx9yv$NX0rrTO- z{QT(DvRVYxKI3gm!=Y`L+Ipzj)EJ;++6ss1KV=n3RFl4(A7|{ zin&jcfEV4*!lzZgFIor*iOvpnWX1AmcyyXC6qQS4slE{C7 z{y*ZMxwJm+(J?7k*m$}=+#yQI%f}-<)zFvgox9jKJ6;jS!NSVSsxBUNM0U!Kq0uU< zeDQ`aVQV$96TR44o#AV9INf@MeXpzWN0x|HR^apx|H1;Wc z`K=c>jV;XHW7GK<#oL{>2NBb_Cl127YgOE{*t>nq4+kB1k!{S*kTm zr%@j_Zu5(K&#d&N7ZK!hh%BkMwR6L;z*)1utePA^i(!{af=^IzgsDlWkhI1Swv{*6~Ma8I0h}UEuubTW6 zYGoIZ7)){n7z$p&wb0oY;D#t_a?i?RVxtnD55$X$B^)G-ScA9QqojcjDuL_#+W3Ur zcK&%EoY`5U0sU49dk-FFXJ==P`^%JRnoijyu2J!m%C~Jl$l9nlfvDl$(c5ULEr!0? z(lW`@IC>k=mNvgf->-p@#9-xccR|#5eaN%_J_vr0RO7NJ8RGWK4t-Mp>HB{wg#b5~ zm1OQJ2RND#^vTb8`!;^R&)tMDKo%d>-ivQ#&Gf}rszUl6(3WPtIaS&RVD&#eqopHU z@Hy=;P<8YhLu5+Y!%rl%*y+#JRTLKXbB{cyQ#0+K3Phv?m6z8R;r7fsc) zS-?r8utN-`8hOg)^2ZLfOBSmHhA zBXvE7H*VLcsx{3?0grI`F0RLGT`zKP5cE!5dRxqfV&I|JSl7bSI3Ou}88U{mry}qh zFi1jry2PhkX}B$y>|I=FW_Hf>cmqCM_VV&-?PFXLZlYlllwUgA8nq~EwLD?eXfTge z$(Tf4c=_!4b8|)R25zGXu^5p0vmstNUh5OLJ5R< z-R)FxPF9@rg`rNOT&AI$YZW2mgz% zGk?H5_IU#KpTF#MDhU+4zh)XEe#W$Rva1jBuu+})G7npJ3(d;T>eaHy19vcl=o}@n zOM6>jZ;dauT_3hdO3S*6B>L}<_Yd%X-hpVNR@LwcR5Ssy_Qdp9C9m7Zd)^EDQc#08 z05)k(utG{pq;WwZhMQcUGX-7w0j@N((gT}zAyFpfgYV_xGShg%Dj3ox+S_}-aZh7A zrrxl$f_zT{$6EV&i?OCr;7~i$!#6{g#!pfyatA0^Gc+(01gvNQn}AGfoy#8^i}0m< zueJL=5If|n^L)eEc8%BRR(PdRFNo>Fy24~Ig=SHV|MQsE$JS@JZ(k(WVBD*SbOpMAdH1jD}XAazKYYv?n7gJNZ5OyOw=VA7XO_V|R!x z^kZ+9E++wpLqVAGqkg~;NiaY4y;NfukH-e`CR(T+|4;iy%9jqOJl{BTe{VipR{R*H z(MrF-BD8eY1Ts8z+C74z48+e{C!qXIrQR)^csE_JrlgoOhQfh`^N+qj>7U>Jp-R5{ zm{A)s@VulS@wXhnv^hA)Zv=Dxp$@y>u$Opqf2fybXMQn-3m=NCJc?GiHH*4#1E z)4-Pq5y;1q#w~y|1(nz4_-zFR`^zeWAi7uB*yOmITuflSDp1^Sah_}%U$4F@P;kVC z)~ER5x0J+g9)YVR>c>rOkao(+cu~;s2kI0^RvVRvQYsYVz;_$icD{>pxJL5aau8QJ z-L0blG>JCqJ}Eb-P>-P0n}{>{WEL^nqryr+nx2iH<}J7WIz$SfQD8m zOKYJw-)MUiugugBuUqQ)B1XCJ&)DzdgO5zFRsLh`_8dUftIaP6<^blUtGx{nh)|ad z&035B)i2#LAeKh^x%?n?g-JrUV|#1&^wOzA*}$_sD!@~9YO)wW+@Trl#!8)MBUgfB8U)X@GKF<{St)vWUFeq8BR}Gz165z1$xDe;%-2^K557nFo-08I*ZLU} zI#EGZ^*(?>?5qZnOdK5|@}TXDm9^e|uV&1b-$vZM2GYq4bN0n3$EuKWhHQ$!mw6LJ z_R?WZo^GccKv$Xa{DqCjjeD5tZL`m8VYH#KNbNIr0EuflwAHYN94&B9X-7F$vV>nC z&@fdB*gSfU*~PSeyI>v9fA<2=0fs$E-cWsIdLgiJ)xE@OX|-lt;XB2U+3r|a6!};Z zLC72TunO}M8y!_-Nh(1BIDRFK9bcp)Y}iboz(6AZ{2Fnk$F&p#6VlAhhBOnOeDi2N zzVi~=!j#sDp?0m843koQ`AR1K!~DqsYpC)3lyTt8HzJXOmjwb%Vl(drq_lD6(}Rl- z-;(|#C<*nGeT$j+#Zb1?!t(O9o9!1t6sMESu{Ik#`Hi7DJ~?x zA6BZmx9qef{_)3QneNWnPQP8kH0c6>uhay&t_8)epO294lo8a=}9we8TV^~1(S~!4OSM4shwTVR=b|oe8zj=Gwa=c(aR#_*& zPe%474KOgBdrk{t908|Km{At9dA8=cKg0pb=itsIkB2G8CU;%1mT+AwuXTaT0NUC} zvNZ{$z(#tQeyPUpjxiz|aQKCQh;5lUEB|Seze@2r=1>EFmeC)=q1=ic61?zSI;6Dt zu>xm;SGim$78RG8RWfF;x*;@ggQ=i2&tsNo&DZQdxx5GN`@vKpfhH05WI)6NRahu* z`&!(6yg27LMnJsmd^8d4^{_?A63kFvku1zeN*B|4KvQVjz1()e@mr0^0@dOGlqzok z*=j~}GoLL1uMBORIumN2jP*m1_MlyIb3$L}sN(48SZrwWB)evqJOm%Fva98lYh}G* zk9reT*rBS5k|r&~MF5I(IiOF!tb7YhBFIR5wK7QHH9awr(B)3ASXf=h&R+`Yf9a%sIFWJi@k3!S zk>BbM^@_AriROlv?Nf=@$!*QeUphKEH+Vu=b2&eGvJk*}HJ`fwL5*u4`&ubq$UPeCqgP=~_cCWvmE-Wa*267tq0u^xG}p@` zglrKS+sR_1FJM|Ee@t|s%3(rijwoss{7tlzD%DEMwtY-30M|V;JN9Yg=F<*xEL1f5 z)4NWJrMGXl1;%BZwnjyNr|i<{OBavk#%yRMhCZn}0Sj=g&=ggDbN#Rx!rRImo#k&a zwMA{U3Con+fgbDRm1yK{U8#&v0lXh2#fqi=>|{j67ov0=N42>+2oojo;sV1_H4)wN z$?FzoxqS3Rxs5J6=Xo>?H1Y>uAZS2*56I4e1;o@PJliCgjbd3oQ_h!)vy8?`Rkpv@Jv+nX&*F zbUf{bLHt8dCGj?(b152K z1^hpS4%4n737plV&A86TR7~n6N>HwOL;%9xA+LZRfe&FTqJ~08l zK$)m;un`1G5;>L}%=B*S2cH)1(g$cUM^h5<^*;dt4R zyWuL6h4TkWK@Z*c2jTEv-+T*{Pn>sVYiJwEYwm7tC5Di2q!G|2+Spil823 z6RXnSYr>Ii)_!+g*=Y&OkjAd>wc@TGQFec}*H>I<>FpOQ;_iBGyNVWsQuV4_Hp8TY zkL+1|2NN9pk++d%(J4+OEq#sp&B?!-9^ldX)e2;NJYRX|N4sc@ExV|u%9t8137%ZG zctpm@dJmwh4io4-{6M#UxKJ~ncUKR1Zr{CYrzF7|^b-QCul>YPeRdxhO?vxx;IOpN zxJ}z_HH16s7pO0QIR}4EvM~MQncKyl+hfdGFZ~7qTsM=9sn;qnG$vTA+k^N8haUB%!D8gsl)Ux>5cDOa!QG z4(Hf!*7|cD_NN$vtYTy0Mvh3mV+8F#59a|cJ)VJm^Nz~0_;ElDmwe#s>#LAZl{v;o z_M5cysaW&5Y#+>CAB5tIw|dVaT5tBsm~%qiSqa7FcjUggkWL0auFfdWyDYt?_(vlB zR{;GVk3!_nq&V`~zGuJVwww}T5eww_$Y%WO2W7rsW3N_1B;9Z4j``_cOGN#5QrEwi zAq87Pl3VmQpq>xNB-kyNDg)xm)Xj*kcG4JTXO-hvRZv)NQ-w+tmh4p30gXz%QNYZr z52yG2xuHNV1fv+-iDcA*WYT^(~KqTxaE-<-NWK&q>TcJPUWrPubT01E-5X7B$Mp#FpRttY639l_z9|L)7f3W@+ zI?RN1wUw-@0tQmSBe_s3_UI_sa#C`a5hH!}kDZrRxN6bi^OhXgO~HU*meT#1>FfV} z1OIbjF{uTQ8e@Y-Dq51H>mcy##A~CLMLIQZ)wCu_$H`JKr`hM@QR077k9f~Yb=%}D z_2ro044Ou28WCqNNIAktJU8?`oeIyL4(gfJqIx3JGXR&kCcovNwXedM1??=LnVc&> zalcm9(OFViG{rh3s9?m$d^JJVJu#8$Z~-X%G`zT43Y+FB=P{6xzrlE@2WonIB8C4e z_5Y8Z`{(5jiV9I{R+}TiWuRlj!2(fVZ+~th&w8J=Wjn=LwibbuId;wvt=gmQ9Pamjm0Uu}l;7;O!n&@SocF~6t6}Zes@69g4%A&gf2x1fZE{*% zTbh;C(0Ehwa0w2j4?SuLBI~fyZq+n8T^+Pu1zqO1xNl7IW|pXGmKWqS_Av zA89m>)b{>I#F66Lop(>8dp|nXI07;C-6x!Xa@+rFMlwZwR>Zhn&ldvNC>m1K(oYsP zL#rQu={J6NjWr)Y$D4F>l+QuJUyxRein=-ASS1DOPvz~QkqhYaeP&@_VK$FrOieCG z+RQmhIZY?lbpT?u*Zk*3kNF$vwk6MmCwX2d=A< zAWtdsmtGjDM>d)K58?R(#dl$WFLYvK!zk4K6KC)J&8V**Qq4wlvj@Y1y53;jvZAbP zC#Ni+NjIJN73FZcQP>?q*764PL(T{M17c_Bv_HkqTwR87aY5tL_epG{Q^p@mu6Cj+ zR1_34fZ+<|W6>XQ#pMOhUw1i&RY_Q5Ew?@2BE|FT4FB}ofrpCvMH&?OHVXg-|F=Ex zpI-{?zg6&@tQlMd{6$6~FWC8Z4D;nj$0q3l#x#=xDv8u$7;$!%9(MSpxV?w;TZ%bL zvj>}M!PNb>pFz#McBfn|_e;7tT|E1!<^!K^9Illb6XK)}=WDXRt?2Q1U%&EfHAr+2 zGfGW|&Avi{*X&F&6jEC+)Q_5Q;R;{8HCrbMg z4cdNOT>R)8npV}d@({p#U*kdBHmK@R78et%IWel#>TRKw;;sJTB_|0sGQc6QL)o@% zWefhdto5Ip{?ET^et2r{MKd{BU#tK6yV1hfTyGUk_06s0cT5Q7aGDd+g*-6FC3C>( zXiRMGa-FfTxz^ym?tK3zCk<2-2`y>adQPZEX^)}iqu9q0C=DyMq`FNnJ|1U88qd4& z-(J5;h}vlKaGRy#<<)Mq3N;5scEClWZu2p1V%O&zQUQ-hJAXv(S`eql2xjP=N7a2k ze+>AWJm7&~Sau~FDArVuw2&!cG-8iK{LerZIb^<*D?>RYVk%=36YzT{d5QA+I%j2V zZQ0+N!KiAz2fmOHJIj_SGFIy(#HVJNgTT;ix1Pp@DJww`A0Es;%7P0IOL|(=!z-SjxmTOd4$fj_;`DU%*_APR=_nV3zKG1w0U$3vzLZO3=Mv~M=QWuSg)fBAShXWC z(&eGNuR&F`x4K5;{sx;xKtuAZMz#HNWaXVG8Z7r^W_QW1S$L>VakIG{5g31TI_U4a z1}G@YMaCNJw;5<doycR1Di#9MvnVVn$ZQNT-!~m3v$ubI*o>G423D-3b#LQy z_=)@XKl5j{Ld9ttPkRJ4ExiA?rSkvd_7yrKSBTa=u*?6_IHy@>14>{hUl=H?TVVM- zgN$a(ty-!Jdry$UC$vN&&n;`oAlDmfp{Du`Zy+g~rr#`z?1TG_%&v9pItT1dIQ=81 zKLSzclBSG7-4P4pzEj&q_!R~uiAlRkY01v}IR#uz(pp!0vkUa__V0}TKv51*2edR+ zS4VoA4@(^(C9Dm$>y(G{ZOdf+*^zt(wy=Fd&{Y4xK+Zu5(XP}|^krXv|1NFQ1HIk7 z`$+U9wBPRb%^S7dI2(pJONtTJ$t<4C%<6;vO*V=M!^kn7bE?{2(Ki?|=#;Z6`ko#E&%R)dN>*$cUk;}u) zSWd%O>d+5|^OO07R}4+H((sbs0q=H;L1C0cTYFO#yf7jdN$^qs@9iItys^DKjxk>c z-bnr6#TUR+!C0*3p@axaVD1Kaf7AJFBbLtv}c3g)Oe#R`NyGb_Zx5fv7BSxL6la_F zzE!5b+WTz$fpjMNqAK0~Q@N0lM10e|=*6n1O<5zw%8 z`*nm>9_5%+=0UVG6k&99Gz~Ou*?&fc^oRvv!sDL{7JH$KT-WaX?P~q2>@DHF-v(6P zYLlDW(C4?*0rqMI9>Te-Jk?^cdjXC_`Y+YTTVV8;R+Ce>Tq;kABjhxuH|g{%Uhtnc zg9~u1Qh9r>x}j=P7B5>|7nwFqsjZP?cu7BXEO%Rh0wRsPr5@cTPc)4}Xjvh%GB46? zsG7eq4h4|aaqz*gxk8J4Mh8XeMQtp?j`dIBQ5rFmjisqP#bgc_H|#gN$HK0Uzxd(7 zPR&(I2ef5#V}XO_CCdLvq*wkz#>Nz$=O?cUjmij+G0^g7ofiwO4|U*2^GrDDb~V)n zzo?U3gY3JQ8LE(;Iw?NRZhL2|ED9rdI-2e7{$?aThNinIky>#MfG&Wt)qpd6z8A-S zbYRkgnu;oZYbdc~bAPcopDV>iYzYYaKMOk+29r5+OTW9Q*Cz@p$RBO1-jI zs<$xj<98KGOWMvuN|LhfEuNU2sd6~D_~UUU^G2iZzKFK9dTJNtsmB!pELM+?@y+{C1n26XIzl`AibJg~`Aikp`g zoU$b#0eI4t6m6qG&JHR#=p=jz-C=JIYele|lvV@az~OLT8%#5yyzjaEv$Dtvy}eIl zscsf$(UyOfR(@>Fqq139c?YmLU#Fs4?{6CKZ*x@*sDA8Am<&&W9h7>3cGoWZ7hw># zr*_-kS?fI#HC^%2VOEI!rnv)jSFLp9WSwd!q`opV1(o@e5gjttD%M1e1wO&MhmuQq zIm*)Mf{m@M;Ks=Q8h)oB6_5@kM(1gg8eo$%n<;;myHxxqQ&i48iMRv>*h37Vo`r4a z^Ov>rARXaWy!2u;IIee_GwBT7IHRs)m99=b&X{x>mrN(ENM@! zQ2`1tP@$2b`M^P$y$yrF>3P@ljggB4V#-W|f8l-lIn|Di0nTqKpe->v6o ziX;j=YMY3@`SPS|xm88dj*;DRMqM9~<@Rr&e5BjY^+Jsd4AmMF+ zP&P%U%vN02Tb!2=(?;kS@+hqC?jzGIXv{*p&Dyi>HW3+2HUU}b-$C2jT56;5WejeA8YICHL z#d$g2*JuV&@!qv4XASTr`?~N#^?jBpcyrwte3&EpI zy8Kl8wksshG--Xy;yh)iyPjv(loN&l#gqCc!d7_ogSLU)3b1C?bvRoyT9?2X-G`@Z z0+koCUb^>J*pGMb<)I7S%bs?fld;Uz=QrAK$WQ-jQ-q}7{s_?^2~U4Ka3h`>|y1!Qr=Q9g9RvZg{BE6acRnI&s$-!UF%=z{sR7swwE(Z;&m-#P5DS zvg}4NfOaI^ruo^qBml#alH%f|fLM3B3`R8UKC_5HSNaAQgtO21pv{X7>b?b36n(Ek zs_6Os-QPac^`V+T+2WIvrA>y?a>r?C>^xxruk~I)VlSkeW!~9hTGE(fXjxIcYYnbu zWR&B<;W2aB(G}{zeNj2U>3nIK#OL~5daBFS@bh-*;_uOMMrt$n@280=a6DbtbJZ<7 za&mKf9fnx#eo8cMA0Y~yZLFYTY?u)sII6}41*TqfObpFTNqtjzYbj95MxWpU%a`w(3Ck^1}T@^XOlV65#OjEbMtZ_Gb=nq;w2F`cAk zK`GENR!v*BWQy}YAdJT+y}}vDXF78?*OiA`0)DMJ^T9ei_mjKBg{pk`w%LuBZ2~&s zaXUVR<>YUVJZ6wKLG!@o*Xv(Mq+UkrMXIri(}UpJ!VGmVa=z}}9XhwSVpMb8`8B>b zd98X+$02P1w}4h>_Zw^EeOvmTpZcVq@UA1$O%)Oh;iXbDjj69ldiKj&$oQKJxvIEk zjxTw=C!pg1R$2@U#|SQr2HOGNKjz5d^!chIg#9n|v|V+33F)ajtQf;MB(AUxz`n((;1# znG_>Q0Ox+yBNQ)m&2qQcxlHH$D;IyMocMnKaovGQx~DL}Gs)qG(i)SV?_PF5wK{`% zTnRn0cL$E40k->h^^oglE)R-tq2x5H*pKb)?R!%e zY7dKB>^Qo?W&6|cFq~1qg|a2}1u*1V!1ffY zbANJMW5%j!&!6L)`U;|8uYN|0;oke6QbyD1ycm3;U!TZii}8PUYNEc>!+;C1?rJBkJizd~26+cT4PfQ1%H^djx1c5z;PvrGX`dah%rHdgzkw9pF;EVNU->Acue~V@@A-{#8@ntcO z?cg0d)@9A7im|5V2RMZis1d3J;Z7qrx=8qyD|If|TWESSHf8-=Nn4fGOJg!JGCx(x zrEu`%ZtTMJk3ZkAX1>t}%h)W{P&X?~g$p&GuPQxFwKM|5uMEXo*VHYV>uIaTo61y8 zYZa9Osn2XpTpu#M8?rW!Q980}OBhC?pWjFPZVP2^_dDJ6Dmg|1mhsWuKei)1_u`g8 z(H|FdV>jUd`i~7>8&FHhBAVOXbV;ulyvmHjNoA`unOjfLQGX!3`;|%=tHdG6P6)3R zsHOe-%FD?mR2VGcLfuR3cgAgdt;5}=+VeRuzY$xH&!QZve0hCBM^Jv)2m!ND~6-;^tPidvAWQA!!chmFZ_$)V94W!PMzI{(LFy%=Cojh8H+>U?4?&kT5hpfED=yFpxj&^mxBL6`=%~g7++$(gpX7$D zz){fm)U9_peqS&B=crHKue?B6bNA!BL(Zn(_MW!ZY=@nMC?8xJkq>%ofC1hY3tEJ9 zV@|mK$RE2C-226-4vTi61kUo&%M|3K`XfLt{pSXAz>bPeEWF1l26M8LVL`X7>}>Ra zG;x4Qi;_e$5CZ%Hk>()k0lJ`naRmg@mTLakDDdyFf~?wV*7=&6#co=xq6wei)z7a@ z7eAHG6I!fXswHAx#H;D3S9huRFVv1spXTmtvPY{K@XmoM9t6D3}iY`aOvElWAM~cpU2{`UrN zY2a676A0{ep8^><6}3gNh?|l#6YReR$b$^8O0ZD)4M00~6$u<_lBtb_KFSIwXPO-* zaITcsmLmDC_LaU%yh?++TD{OAWkJ!dkp67ovi_;_PP_77>F~d`e|!Gk#W{m3=V=iy zGWRy1!Tfb%BYPDNlo|zP5&f+9J&<#&FwjADyv*h`K_7HR-2p{(+`nuwV9IKD@X0bT z@V|N*NlHDwRbzhw9QWHFNAe!gm_1KJ{kj_X;eB@Fj?8Kd20>m!vRdZ@y6C5*mbc58 zSNRYt)2>>dIS>(hT96&4^VLw1CELQ5!fB%&k*iWW|H*0RHCp-eICM+cHWH+Qrrn7o z)T1^&OMfgZT5@nui1@$DPG&pP5wYIkuYaD~#y|HRPe+)!N0je#^ajEu3KO?JDv$@* zV_fh)`Fb!Fa9LkJUYX&c0?JxzROt2_QR4mEutcP{smSXhMI>XSRdFiO)YVCV&4eUV z+yBSsDuCqZ?EG-Xdm#7jhIUU`=p#A!{#Kru%NktU0^@H6hZR}Ipw(H^+2V}-&hY*u ze-3j!4O0EDfq3Ny$jdf!46?$u=(njZcl=WEd8))O6diVQsj7{YQGORds7AUHoM z$^G^Dkz`PwyA-jBkxH`CKG6OT5R}yw1d1I>$x`T?1X+^=d~|GgJ@1aSdY;=VeXhFw zIQ(8YcEXyC=VUQ|W83>IOR8}j{|VgSY^#?VaTz_z^^>Y5z1^8jPG$!s?fsqF^Z?UV zHD9|#65;095J_^G@RfFzjo&u)c?Xx>+igkE@DBAF7t9jX^e(Tk!$iTr@Ay_vYy0hK23q9` z!~EAz=1NX5!e2P1BI~g2RPOB-8_N!S53o|*%;Oy^X$rvkkH5jPGUR#QT5&GU)SJUE z`Ns%d4FMq_au4rp!+9jC-3!nAOnEVb;|atumy29PY1WKRbU7TPIy^3ZnU0r~m-1}h zHobn~MW|Lt1&)M!)$Rh}6QYSk0|_jD4z!BXrsxeP1m5QGyTQrS#AU(KIqEwz2isWW zep|x+sHNG)%csJ&ML~s3+jAha>`bJoVX=$OmPp zDAm;wP>p(56614;^jzP(0b&vp1IYIU-AoZ)9FgdVxFxEk%c#Mj#L zoVn}I?>ird9sP^m=53sjc zbMEJx<`=Va4vVqy^eSNkd07`aS|aHceWNuy2!&mo`2OmDq+Dn;L;OQQ_)yeO0oaP+ zhfs47D@t0O&=5gao@hFkQrjAs&Q5KUj6`6fEFS34QT~1Q*O9%m=3@|t*?63`r5MKp zn4zrUUIa7ajhUP_VKI))PDz5ZYf75_z;84&1wTLnl8mADYEYj15J9=7TVBs%#sHx- z-w*gI!=CRdBZ^sE^r2QsBqd{T%}@#Q6)F4!^_SfJbz;XQqJABBS}oNE0Fd}j5PINN z9;>I%P&b1ksNFjp=>qZ=xW>Zd*0yM3h5ca%x;MF{9kz zs@T3&kYABqwW1ML-*4ykPLTYDt_CtG zkS)3{`#Ou?6|ITk$D0{{zA0oms(c!w$2sG&f`Wn(bV$9NPQKU+oO+3p-BgkYbkTl| zD5)_tw_~bP0XzL!t=%>uVzyigo!XQAMkz1*MzA7Be*Ql>ewH)c%@sFB+SsvP%$foy zDsXXm%NmF*=~onWQr?_(3|lWsuJB%XR)SrJki1J)JNus?aA|Qis~iw62Z#{buTim0U4jB_OZ{14e&!<`HRhZb!N=Vh?O^AeJaEBm zih`{Vy=>U_fpQ>ai{X>3$m%M>5DTbtz2y*Bk#{WzYWnzr$n7O1X+@tOuP=;ZMOz~m zbCS_%+FtyP4kH%?Z-G5tO!WD65ZNeF=u^C6ksxdaU;3l!myl<7i`|;iNJE_72OLTw z3LSPx3CMT=B?ybr7B8%Ow$$Pk58 z-ymjw=gY8p(4n#aJK-7S5Q$jmml7y@Q?F$%Yy&n$Hhz+2aYrhhKRKmn9+!;Njmx;m z>7E%0XA0z@5)gO%rAF#K4oS3_P~%>;8uBV>GTFT}O80xyD$l0tuBC!&#fAm$Z&?QR35mYq(8-?o_OqmwNCBSx~}+ z#YCRzLO#)!gB`Ueg2x`TXwvZ#!fcFp8Q zD-arr|Ng|7RzZn#pfk;Mc0Hdw{DenY3Z?@lW#%TXf2?lGj-Azj3Vy>e!S7#xH|TB^ z;Q;ia?$1pLwP1pWr#n@W5ZZRnD*W)GDq+;^TyCR3e`LyS7|P>{AoV027v)sIe?>eN z4`;h4oKXgFO~E|y0M3m%$<=J;X#&O}FCI)s;%54S!{-H9MuUSvb_PQJV-1_g*A1U3 z1CE2asbrT#w?HjtrTu9-&5{A)-|pnn2qj#0aALigR`7ls)W(yQ#IMhp1eTXeXRTU% zt`(bUS!wcrA6ovZKA|G1eRyT}O^_TzigN@xUd;Vk{*>JKxEGHHGI&Fw@kW_mw&|0O zOClE~Z)1N~xU7uB_i&lM{s|m|Tw8me-Wgb0fs`#}4!2@~l@!HU>+m4fsIZ_`{7D1| zx5k5+fuAE`jYh7r+A;Zk))`a{SlDAkxUo9Ax$dZXq6?s4R_+9q?tpKzw@yVL%rj`Jh2k}tTK!K&cJGfR@jung0SiCGE7zDibRD>^aI0H%K3u;#UV=CMW3cL0`v|Ki>P50bT6oqA z^t1i5t&JdFs#)q}B7lC?GO(T&u2HU{%GmV@3F-jULfQU*9Y92H@kEve6cIb`Yj(>P zmypFCgT;#f;!N|kNtqM{^F1+3F^Y9J#08bh<(dHOt?=VuQu7TM&zQO;E84hf;CPrF zgYd^WJ9~v4p@jH2wT%-oI|Kb=tM4>xTH^x%wP%rR;itl#B)ip6hrehb;IkGH=E!5{cYt zMUo!!%5&NXPy`oCu*xDxtbI)Jbb#F4 zBNpmAk_ytALCd2#|Gj~K5&7xHKF>Q_ue$l?D|K)p;SSG%YnWSwc&(pw9MRX)<-XXr z72!M$PIA^#r{PtmQ2*S_l?YB2ePAN;P^*j2#|PE*+W8jwUxTEHNnhr!H>$n_<+U(H z{FA*h!(+wv`aA9W{HL#h4$xu^#VM22HFlei(R3z9xf`b)(N|Gx=}~K5_d+$Elv;^@#9}fS zp#K?ZK;8BCZ>XRhO4MBskNnLh*0o94zd|$M>YJfLTUE=|zZLNqU`oKTBa$kM)dk1O?r$3tyP>Kh4*4vnl)BEb7p%#P$8DBTs@8|FHUTwp39v`#t2F?h*Vt zWa*S3$hO;Pc?A^m1vbg%GdwX&Nn4q>KN7C8zWpg&&!9YL$&WU9!){V|oI$QLOtF=W z0{h)?TtF$U8@P`S^-dCq0t0d$kcF5{bnGCoTF?Ut0fQNJJr*jR>*1y*;lTqdP?lORUmaRURo7+-2E z{V6?-uT~nCxMse~rnPK&X@w$Pt`;>g#EQJmU`*5Em zprWyFtPeKR3WLp6Fxjg$7C(`g{6Zho#+E0Je`OSeStQ`bBm8{?T=vmozC=Xqm@P@%SP*@ak-$;W;D{KY(7!c~b&(*!x7 z1oP=OX9?XJpU~8`Q-R;<7K-p7lFJu=+yRDSD9`uRs{L&;l5_yK>-N;9d0OZA{NZFH zi-aHeC>FuJ9-jANz~l4S;(D#(53uG?F!Z|M^ad?^(cob-p!TA+rZA)Z2fye&2nI`5 zndrvrrW^0V$`Wu zNU+`BIOo{jN*$n;GCBU*_hnpBM=#0rohPJiL9{~6ye^6`f^`OGJ}f{x>AzV3PBpuq zIMpi^jKKPN8#Q`Df(Zo$5E7yKcw>uX9FXk)?$j0YyD1^(ZTsaDfSjJT8}Df!7VkCH z^PCuC23O-L06&q%*-#BzuHHI))tzPIRcT2$`3oE9o8kX(O2P`nh9brD0EQnyvBN&%eShsRn({RDub?bfWDn%NiaC?z2xI%RU7sTbJi#2DF1IsQy*e>otagMy zo^MGjcfJO_`t4*{t(MY5UB`YtczRIPPXZU0C7@-9m2 z&+wyDUVP}N=>Mj5Kvb^~RZ7?UX+?8489;$#tnFbh2x|~_c8>k{``aaA%HYHDE28ks zxkGndtmw+dkB~zyX;Vrr&7Z(np-6l7?*Q#2joYA%uXXDRE#J=y5huSh>NQViHB-uX zy!tjn4ojKG<_7=v{?>3-TWP_wXmr;qg$iDgLZ?~S7Yu{8`f#O~Sr}{jx!>Ct47G6T zsSS}dK1sfAjl+MH#DZPSqZ~d%9DGagni3K8K!CnKZYhclF}~VjC+}4_0~II$X9+n94c)5fPaMUh_#;tv20T zFBh>By;g5@=-;L9qfp4uf0ZfI#SB1#5t%AeO=Dj z#X*tY8;;|}JiQhTJq<*P4(bz5l8mdT*BsZP23vt4I{M~%zS$KnJP12qHr60Uj0YAU zAKGX|LtpuZQI2%T>KP;c$(e5K_?YF;Qvkh%?Rn)7N*oOlxrc%34fv3PBQIRU0E&hFEEHJj%Lk{OD04k z4ydF8qRDe%j&ghUxHgI~ryt%K14+S2!k-cj<>qr#iu!ZdPq%j1xE7F4)bsqPaG1n* zX3zrFM#lu*6UN>CPsildgw`~~=}*u(SCQ!c;*)_QTV_MsrVr0#H!Te36T#_r(J@!x7+Kw)?{#36Wsh@IZ7;P#d2${Et^L zr_JJglcHU5q#5B8*_MrfF!w1`=$m$WgJB?RwhB6<{}k@kt@r}$g+~b_p<@W-7H9z? zEj_(_(*&w_vv<>J$Xj?M4D(`_9`}NMIGX7c(MFe;-Oplz!FE9*%)?jU#!14vTYqu{fCVE1{RUv!zElQ)wY8C+N z;Ca-{6bxXR(90Gsj_}BBM(_u1LE{O@c|SCPE(44mjpr`e*YNNTBGmL0E`g1_ewvnCO7 zmmT%Ir8^P$U$Bs75z{$xGRs`&75;+Z56q?T6+(#IE+ zY!f9Cx_lMEU){BlW7TD!X37kl6Y(4fCpvd#4!c)^boUNq$;wzR&d(1*Mz2PO3=Xe{ zfDIR^9Vmnndd4~L^g72W$0|%v*M9ob8TM^)h6LC908>C47%YoVtRva=v`LZL>({%w zNKYKVCRtN{01AyHeB3nJ1>bzlC`(}kq6c?6>A|@KNjQH#OWMo zd!{(JQ_S*8aBg}%SMfx)q_0Cd!6lKiTTYP4(8Lk2uBVt`{>kZfpXZd56hGQ{9nUuX?I`9yV*uLg^JHKOI_Mz@^iMS%8 zTFmb@!2H5pkXH1Obz|SZNZ7p?(pI8@cpg zlj;USf@r?^vaeYnhZm{$ONv%iT{wuqQ+>-@gGRZSCK}0WUaZn>OFX!DVqk4%b?S%m zjuOu}7W&(=;a-;wHF1w^3d&}20Ta;N(Z1=Jn&dyo*+w?2kWy%ztM9W^2vZOkoiO)T*v-sQPjCc9C}OYJR0Ery0}rIstJg>( zJ>WgG_dWKlpL}jgEdf7U0pWN8N6Obe=do+U;Tk`n7KxQ|D|69*)U_(I?C4unI>+2# z#VZl}?0(@4Gp7@1Uw|b|2Ksy`O6o%QaioUGDO`(Qph7J=hCOkxL^jC^GYkA8vGpPy z&)INFzm3iNHF)n!y?jl1RMK0x^>fqD%BV)DF^@3W<7%zqbrN$Wq24>?8hr*}>U;K3 zaDwnu^i(fLI7%~SJX(HDK?ZR9LYZ{(p3%!{+~8jTij7)FXcGcCU+}n$Pzd*(OiDMs zD4Q}vA*i(-HRsAdY4R}mj7zj9_#4azV~=zf!2gHLOj=5ev{$VSxuj~vT|+4 zQ_3P9i4^5pSKkAglLRprx@@%iiPbmqNh18I`dj(lG*zMxk(gkLZ4a6ya0W-*^S!k_S-i(MY9q zoqCF?T3AtGQ2h)LGOu>K>1su2RO7p>m&zquVtN)H4UoOjh+#pCZDnYe3^-j&&%o;3 z7j=j1z=W+eCh3k<=)z4T(#46fNl|QAnRaYH-yzIz9j!iyU|%dj5aygPvCq1-spv$t zEPBW8biFxr4=xJMwEdll3T*35*qJ&FdX7J1Qfd3mwu@>lqh8Bu`AmEYdI4u6r|`@D zS3OphTGv>}6}0E&2#=SYatKR-chYgz-^QMKyM!(ezZ0MyIFnSuzJb}Kzr&b|##3_F zW(vM)<*UD6`wHHJLXZ~Mu1aO;es~>J+%2g1=}4Fbq9X#lJKQg*-kVu1Afz+-?Ryw) zg|9(4k;;+b^8oTaD8jzXvQD!q^OP{`PX&lCzK;`6P@<0uV z7ehJ8AL!`%m2WXWdj&s;nk6RtD-96*42iOy z2MzK;Y{ZA*6KyQ)HEVo_+2g#1IWUvl_F+OauQa-aU@k)eZ*PCgh2Var7=PlL5~gP@ zhE3P48mnAIAE1Ts*0|?Jx_v2PA{qkt0pCN}B*75&M9}DjV=*<~u#e;}RPf>J#H6+b z4w8hKH|O+!V>6U=G@>|qJCzhB-}-&WIiE|q`;9=B;qsGX4Zt1LXyM&SGuE&KJee(n zdTc>T`$ZoVcYfy3EgL6rZv@6}Q1Yck!Vg7r*mlsD(++Qhu|^8C(Hk+7@LAw*zkKzG zat;H@IIoj}oDv-1d&rrDCow`bk)ZpJngj#MO z)Lq-ryvFb4S05`hg+Ms!Wv8V2w*cZO3vSBeJA1QoBkBT*NfBJZj)Lw#Q$yY4>P?}8+>H+7JE@1k+Kdl z8HTheW}Tz+)~Td}AlR^~IJF+&N38^XOjVkB=NPgUZ0V1I!->2asu7V?Xxzn%3@~G~ z{O`Ig_7h4f4m6hXKS%{{uY*Z*fGUdy9!iA^6-(0!NKW@4voTB+R_@%67UEZQQ6PcU z^ig1x+gK_ikHCxoW*6zV9bY4q0CGN$Q=FevC=AN@-I^#NsJr*!pv_|`f-U#yoe(NUvS~CgHj4n|IPHHKn0NocJCHhJ2rYfG%ZQ3!DpjA=^>nE7dcem6Go1pQ*yP8j z@Mq3t$5U?LbYVJ_*IkuIw&e5b<)3||lCIHm@M~{3_W1c+zf0(Yi7R)4y7ZK^(Ulc>2qe6EKnoN(7^hRj( z+s<^L5#>C9m91%42Y4TaqTg6T{AOS<;pY5TGy`pHG;6PI0MaFh%UOiLF2mISkg;h@ z5W=;18B{_$bfS%?3l)~*Ogx(hZ)L|GE{Al`#UPG+h+~}iH1PZO751kHC_%Np97@>+ zbG6yaMKU&M72WozItR+F-snTF0xXZ-vECEpJJINIK2OgQqgy)Zz8tIREEcnV=3U6` z^3jmd@pQJ-{9Txg5wLTeeRSHFZ_r4}5xw>tC=^SHao?CvxQ77#D^9Y*cB+tSZv499 z?eU@o@w3H#VOHVPs>|&xNIcHEb?2rJei~EOkhCd z5~}XSy8+d|BD$GAXwngIs`{vhyhiwU^l60w6j zAB9)1%ZQZi_@6+HNhQXOLtw;t6X`Z)$?OJxeYW)X%&sbwmH%jI{&^?^24_(PLxobcGIuo~LD#&Iz78Ps(w zx@DHoTdSY%OrlthD0d_kl2n3f4#>D^yP5-%DvG~457lF%R*gN)dy!z@x$NdJdB2!Y zY5}289lc9ZX}_*|FrrTOHSU|eji8NW!^vJBcYe0p7%W7xOozqYM>BWX!Y_EyoW-j} zu%~#A--YQ(3n2)Qt>HS%jV0t*67fkkxt< z=zSc)&-MZ0DBMrT1FyAum-ieUSg;adX^9P9By`8 z6))yfOZ#Iz-~@V3A}aMnFuOix#1)QI&{8Zi7M{Ku8qLv^fF!^ z`1Fw_a)1;|b;(+>`YN>|yw9oI9fgdER|Z9Lm>Nf41JcGlDw(wY@3W(V;H^a9idp!r z5In-NivBOwyCl}<>GEq-IZiL(bWdJhrSaS@epEM2gqa4NmPJwVi~^L^emPcX_XtQ$ z#p`;;P^8V_*bAm?ExkhrUZW5aGI4k-Disu@LnDr}0{-zvpHg0u=cN>y%xEa&s*RW& zeoa$TM~Aga3?P5mkxt5})tm+yL?(?!rc0#or7Aj@joFlli3mK{v$5ecR=wHV&`lrVDxJ9Z!p7>}#=$(+^QC>9q-7TyliSYV==@^xYcFBf(0 zrxNIL7xJ24CqD7+9D7n@R=f>)?Oh<3_Wbi})(GN^+hbjcx$7P7I|E!wu+gaX*PhH_ zvl(KHIs`b_Ds4ohQv@aPfYXvZ|6<(tSg*gq$fdxIc54FJq>b#8I>e?yk1ZcV!qbHY zYPaL*-0N6Jym_{5C=k}=>pq-0Owr1FPr`3+#g@q~*erVKbDCkffI~d&N;AJ}eWT^$2zWzzm?qhGHA)_)?M1x5}e$FlEw>XW>^v`az z;XY5e?4OgY4kSr$+ZJ08LA=28^|pp)|4LphBDw&OS_lwu3`xxA8u9i?&C_ncOJ~^a zTWagX3zO1zS27vG%pV7-le<$}Nogt{h7e#9Kzplkc&?8UKq-;Cs`aMzikbjPXs1ME z7&w}Za`+2c?bZ+jO3nobFsGCwWM}WKD}3=gc)GlJ2QsoxKu{%GHXPrfb<<5m@dz@D zaECTq0*MAsLX2ekAgHkAtxOQS+$mzN+O+Ac@emC-^!yu^e7vZ*IQ>u6185Y95ez=l zTbsmWSrO&(`V7Uk+wZ;NZ46xj(ENDYuhe5`nE-bcK*mX52u@CinhpDtBEvB7+fvC_ zLM?Tl_7y-N;7LPLIsUK|6Qwh>XCNf}-rP>6pMBtPVu{i>F$i6U20cue2&$usTfX;=vihUA8(%+{-z9Zs$KS ziYx-|V#s7c(#{oyLlChno0KeP3yO^a>}Yo3LtaZ zF8z+&d2?#9458a;ae+FtT-Vcaqy?xS{QpqA>++oUmJ#Z(V@GIo;6K&?vOy56W+$ma6vbzu?B=o3i25^b`BnICOm=#VK|T zS|2^N)18{T7#{Evb@Y22PJThhP@Qyl9)URxRH;|V@x6%QK6&8YD(vveW=0b$FZlK_ zDR~T>KS;A%1MGxF<)LKQp)rL#g`-oU_wAQ~@r~ z)6kXR#LSxY#^!R9411Ji|La`;(H_NA^!{Pcm2|!jpRS1;#$wj7HV=nu*}CnOE**E# zPpMLa3!qFGs5}ILU``9S{(|zdV(IYSNu40Ah{#IcL~trO>~6G(i3!@%lnW(=jjwU) z>|UtI$?W4~!x9RDh2OX=?zu-;c`xkk-;aZ-_b2R!aFyUp2J_TC{gK}76fK0hi_K=c z4!gB0m{H&3zBdg3T#c8g1upA5okgMLN_{%y2`%mS5MIyEFtV|e{y^mxduU^uT4L5+ zMSb`^p_A7^Q=Q=*T01o4scc50mEe8U$P8nj?2sgx(If#${O@rf9#XTfyURytD%5&(!04{clk%ieGC+`%>pR%R>T&!Jg;_C+*d&T6R3_vm5JnV+%BNDLEQc{Tg0hAq~iQ3=~VBUSU- zj(ZF_O*t0+-`@;|A=I>T(60n8-+``XR@YpWG0!yO)AdQyx$fL*z&pu#);^SFyG%1k z@8hDWzbePAA7G#z4%6_iMxYA~g%v{nzB|SYxvFik>Ufst_X%zHd_rwK*Uo9cYUbFw z-@Lb%K?0e=Ps1wwGCwCr>#%Z*+35F%#0QEa{w~59C(Hf!EiQm|7O{W)^D#kMJpvO2 z^#&V05gTLCZ3`*Np2~QrlBHkO8uAa*riFJ)mK{X{;vvD*wJx;)WN}~Che=ivj(T3# zCpjmNoIgmMqvwt?AV!64!fuR}h#gx^h7^_}0N`H?+<$Jt)Gvo23PTfsfZrUo z5l{!IWH|W^0vwm=ycY+rA7`g4w)D%K)|8}}JwzT(e z3lJEk$A@UPi=D0z{stw@R66R#snEXR^JGA`ek)(oS)NSPd5D;b)Wa=NJspO!YTq0| z*xe|K%8YfzZIHXB_UdI{>L{~a{auxN{VSXCWfo$x$Gdv%K-z=WHz#bS95O1y$3=Sk zSsW(Zvezv3BgSGP6Ho7DM~+nmJLdcQcSrUJEhK14?g6*?{aWs)4WBr?cqp$4guf92 z#fiCVKfT$J3XT`>+7a}#jPK#jguJS1wp=Zza+}QiK+qpjEx-8FDaTH#MRy|Q1v=)= z?dZ*JXm4hdO^S0^H788xTSKN)B}iv`=DpjtbS2R>HCB&U0iPZwn;?TI!9Dl-bRoYK z+fKD#i0$72LIpKw7t_5aA^}}Jt!Xti#P2pD_AC*_>Xfd`t-4)u zl3IYb^8XRMf8PxSdzB_u{9M*N$=3qnZvQru-!=v5{@zOAzPE(Sx<$;JTE%XSB22(K#E|*1HO>MpMQ?OYe#bO?8GO_=)s3yZzq55gD?<;NB z{V08u2rL_-dWMQt$ZQCEmL}v@lT8bsK`30^7p>U_OXP}Icr0IssxwTKXZNd>0pCKA&i!T40h-bwT2k8=Du&$E`*+sl26i!}PNr$5utVUL1;Q&{1f(R08%0 z>)>i4`9Ml4nHv6CUqC>`z~4;sZEhqn_T&RHRvy<~A+qtZI~{{w>sXu)Jij@_(UU(8 zFDmvT5gIhMm&5rMvj#k+98{4H>$(i^+%8{qQ}gk=FtmzYhY&eRa>G(Gw&8YFBT#^Yb#0z zJpU{*rwyGE2H7;_GI@b=jC&M5YA=r@gf zlr@YydL6X>+tMU*BW`q1uAxa|Z}4_^zH%h>ZE2*AV+~@NYfYL`F0~e5b;Cq_^k_m7 z-YI+nDS6p*Gkn%%c9UWO%3`4t1Xw2E5tN~bVGi=6lx~ykETFWzPOi797kIn5U$+lg zYk5sL6j!L1k)bK=oNS&`mIz!$;># zG%I3^^dJJzvpc+lxg}pMxZ#?kovqmdf~IN^tlrMi^%* zU|%BWeP8NbJYlMl&VhMJ=(61l&JItCaQ*r5R^@k*P7%4K&^gwkq#Z$zv-ds6s7SOb zBF@8pafjh_AU}126}4wUtOs!?`6errExY;Qj9bNxXsUejDqg0_A#W4vV8l(hx+Mnw z^SAjxdjpzRArwzIVUnj&GOUF%3AewbMP12^|4$hf zL5bjmuw1D_oa8Oe{}6KOCsd7zPCqdC@i3U2NRYaKkBYRThc1r|px6KL8pclz07VBK zCjII!iuvP2d|{Z)?5BQ1sWl8$6Rj`fj3!L{Zul&}39L?q7&z`8?0^jc*}Ca;ls zNU@H2@MgBSX6JWQZLnz1p3LZ;%9v$=diYpR?LyIPsVv%ke}69%6)!LZ1s)Q}YPVOc z7$Pj(>^I`xpVw?G9Yiq;$D^OE~Lf@OzkFXvk#Nse{VTY7|cnTe#KrRX=eBrszous1pxwEy-Q z_)yOEE)b`u2st?Mz2+nHR&$kI$7|o9TRhVoayZ6EK@K2>p@;U2i*J$l!2R0{n`MNN-pJ_hysAyS1B@HR|7 zxH&NG5p31L5rKV;YG)M5ji4|fL?I-I-F5~!`WtBFku~AIbUa+s!}*MO&9L1Uhou2& zIE-8NAO5B*_Yh>n04`5pU?{P8#{>sEM?qUp?P7~<6Z%&?PC63Jm#P6-cQ)76Y_GfQ zj(&S_!I{P|M0}cleNY{k($PL!rCp#13K|4dXm;tUFO&iq^H7e|@uhhdzFo4@g?<8t z>$AF}%=Ofl94w@0j^czfez{K^InGfT+i$+VXsUg^nO(&V$2>WL zhHY|ffk{^H<~ShwqAWKl=$#m=tRs4|QRpq0I5-|BO%59@cqQXKh~bDDMq3T%6RdHd)Ut z8p6R8sd~87PA053f2lF0X07dqjx)<)*#v<^)I?(o74V%T75p&a6`ED$V$eIC5z4}+ znH7E-;JNSN^+-Bi<(e@9<3BVaDgh8q65El~d77gTuNcUi0m7otgVA;yYS*!%uQD2f z%DJ`3jfV#>PYAqIh$M4LxeVztAZKFM66Tp(X=Wyc3AGM>Is9sYHE2{T(-=$bF26<( zmuIVzOBp>ZuKds23xF8H`VMzM58{s}$jgQQzsBA=AdYNl9}X7WArRbxySs+q?jGFT z-2+U3kl-HNB?KEhXmAS<+!-8#2LCm?oBi&)_wKhl|1d!J>F(-ts_Ild_0%^f%%_Vo zuVJEOv31?Pql+lQIwX!?xz6Tvyv;#}?S#+3JZ!Vgr6}|2#~b7%i~JH*2~;?IVod78 z_0bLkhrfL`{!t8O>dD-IMp*?bL*4gP3XVy_PpoMJcP-9&?urR&d9Q+zv^He{EN<2E zas1I3i*m!n)0#|Dcd<;CB)N)|;=$-dmygUxs)iwBQI}$zrb=Xee0^2ro+wh>k-cZ1 zH&I}sPn<`rP)9Pnc+!&6ePglwX)V&chuvF9Pqm@AG~ci_0Qqcjx*_reMscC_OO#vp zY~&Q2S6?l6AmQz0J2SO;lvRPG!sJD~_v7rcgbNv1lWIZ*?FrbM#3B{P$1X84&r8$` zm9SZ4{xczn04)g(Rl7{;zmY?slB}%-UFr;;^}vjK4S8aWW~`45Dji^dD}t9akdb}C zavatb`MpPyjE+y{d@!8V)A=YgLkJ0$;B(QB+A3ru(MSYZI6j&m$f_Gv73)yO2V7+Or0-1oLOjFaU6P&#GiOJrXP8K-^6|s?hF2aE@3bvC?iC~!u zZ@n^dJ7CXbbO{H?WT<~E6zt~BxvZeqV$OUZq3s zYP)fWbtj-T*Vs~yofCB`>y6bX)9g%Q)L8>y9k!FQK3|WfoYAb;%?mq;5G2M0Cx4Wh zavICDexsW>G4ej=lEiO*X!C8&=;az#61gK0b$PWH^3ISmS$0jtsI0=aT}WN|$s04jeSV0_Q* z;juqPUW(CZxJPld^AW(c1;`cwN`b>ZNUa8=w=frkfn_=w{B|#b2gF# z?Ctt$K>Mh)ow!}v(ASV3#0t!vPo$?nBGCA>l`5@G_Q%L1hxkM&TbZEhaHD|p#Dg_9 z+WlAcKre+#CgQJZdJXqj9yO-u=)KkxLCj=nP<|*MQprV~Vjk|Bm!G!2%D{$Meni|V zRV5uac_Ld+wiyVdT~BeoeTl%nn(o*t(Xi}c`_#jG+7GjfO6Jgd=U97vipI9svOMJ)b_GC}o4K z&)V@c?!IW8XVVwX2iWehZ5>?ee_~Od=PG7kHTv zD8(=>I4C)W8MrdSjBkd4>k5g7ZN5hy2c}O4_ZG5s`8C2Z;bigy+uKIE$Qy#MLg0`! z5E1|!YJ@yt{};nnpRoib5j7nMi?-Ev8XK86!1`$ivYt^lbGsWUJsD2@M zKYS@s?KW~3$$dOnZ$Ir&Yi&DIT2L=ny=HoaTzU<_J}< zjZcouiMDnJ=lZ7bX$}r1_3bTlw8<2`({e*#JJQs?;Im(1a+?a42NEzhRHmzZ9wf!hP5rw?BY6MqO!i|EZHP?lED+h>DUCZKPthw zBJ9)o|Ce@dJj3YFr@CH8K-|WmMD(arez8<%%kv^xntF(-6H0PO1RBF+tPp`?0fN~a z^hD%cRDqldGxloB_s39%ADw0@!}CmfaI&l9heFoQnrrKaHG&DLI?I-g)VCV}z3k{q ztts$H0+@2@1?A#WueTGmCK#$(EiyeHf?)ujF(dj>d0R+0E=qCxD^Q|<|x0nxwyA?o2L3QIdC|4d=E;c&HGwY)IaobOH1IWx2 zURFd`{Fhm0Un1P@+-I7&KVm4ZW_m8u8o&=o1@-BpNq@Ex>2a-Km z@!+&MLdRC~f*A&(Mk1cK5Puf|BhH&x5~0E@y5e4IAjiHE6h+zcl1*FiCf#q15Fs%; z;KKX+Sh-bL>lbW!YHuX+fNo}cSos$SRa#A^5N179d6E<=zSGw&gMDDp+n)Ti01q*c z&uxE^RVQ(S8ZP{Mg&9leIa3174UyMoyI-!wW(sKN z`ZerMmq@IBb-eLD*$G7#sTt_wDX~o+nXU(1uiw-spf`gu!bRGjCh{EAhO~T{lllRW zC;1+>Tn#*b>Ms8913)?L` z^q$#GxHd=Z>*Sjs@8;@Qn87e;ph7U+MtWaYMV`U){W}c$s?%23bJGSFpd_b~vNuK; z0ETh(hBl!B%>+Jr9dX9dh}qm^+!z6T{2nA|;Fu_WUZ~DTOh;V3Z8CE$kh-!SPOFpE z;U^PIA%^!VcUXKUq6)Or8~!TYP;l5Y%7x&{0j_%9fArivn`@7d%L4EQ4B(n2A}%=n zx8&1$^Cy53tDio7+p+;%_G!A3#ar40k;y=OSR+j&o!{r8i{i+_&{GnovMRH5@tuzUqo9^A~f9at5X-;WIQ{ z-5-QzV3CI(BB6#@TmB*$w`}%HEwgFa<5BPN4p!b%zH;)tWViFRBJ*RkbSAxS=7TfA z#UJ$knFH^a;Iu=dz_^~t3eS0>m{FMjL9$jMxx-k8?`-SJ75oG2EIi*%cC67z>EuTv zoEWbvK_0}`?`k;;aG&5vyOeKJDpwgA%)<)VL_>9E3L3vt4(75^*NTD1Xeso&0P3Yt zcI|W2p8#AMAVc4Efb(=VALuAZI#Z<;YVU3{qY~;LfljJIa)mGY4Mv~8E9m~NU!8yK z2FShHzOSf8r}|LXj!ZRFP*hYlMvFf-{pR%Hq{?3Yf>4@kHk9nMIGi}~$1xZUQcGft zT`^y=J@%nZ0F7kLHPc5GFZu&A3(2DSMw;_V?#B}$X}Xk1v28+ywDC>1y}3ks4Hwd} zGA)+2OPLw+33CSr65}VHY!THu^?u-kIacMJv+8Nc&U_I%;75hTk_eP~kRJi9U%5)u!IBv7Hmnza#mtl>O zu%&(q-F1-HuM7jT&VO-ePr#WrK2V{PXdoo5SLFU2Urgq+$AKgE2T#LvZw zpU)PPn5C3d4rt(p@K2F==gpY+A% z333iFvoJxLg^PZtDM1%Fu@WUjes9sO`2G*f}j* zQ=H?Bke6sVcDD`+ataD{*VRYWYTE#(U`j++r6~ofsVV9%55gQglAd%VY^zScDuaEx z%?C2f-md&?Jibzy%|Yef?GZP-2`r`X3;@xM*3KG1zc9b7b}dJTSxGo^)WeFI&IVA3 zUnnIemw$NmXMsjN0-5adT)!ODvSGgE(o0isfI!6Od}_viXL#Le-Pi%k=J*j_(>tx; zq(41A!`<&99RfyTgNKenOi1X>2WJ=&!!PiRW)J2q*ijGTj*peoGumb#xCYF%i&iZ( zIwW)$JN7UOLxXSSsW?(6gg-d_*n7c+0qaNU#DMN41l0bz?f+zBU=j9WX-_-4ayW1+ z4?@^1{9sD`m?=l%+eQ&Wnr^qaPv6PhJKvkK?9>r~IMlT|X8S*B(fM3hxl@gu^Su84 zF@uc{6 zcHHK3deC6M`O!2oN{u+S&tvRU@G>*C&!RXkU_6PF30$zLjN_wYx)BUW%0tmiI6IG@ za?s92H*ML7Z#&t$>abY|ix9>Ta+$oCl9$~&8dk}2TJBzQ`Wc)06xx}Sd}z4F%;3*A ziUJ$Jt?qb!HAYHnCz0*=eJls|MSh^r1?-|zmph0TyOe~i-|uFz!RDiOUCd#|O6luZ zc15SiK1f!e3SCn$3clQn8sS!7?1VY33d4%df!9H#t4fO~r9VDf21-~Nb-)NNb-%>$ zl*i@%R)UEAAtPsJahJe`G~+m&Kgzl_K4lo?*rXp?oJ1&}@9ybpCOj5P0E?4wYdB)r57ri?l@yEn`y32tscI_# z={5clPtY+Ov6b#-a4G@fJi%&t{Z75cK~k1*n%^rY`TP5fs%h1cGxw~j(%bH(1oe^j zxoQZuwD_+I&5x1fPx=Z{KU?@#;$AyoaF4sDSfz`9g)w2X9L?CYVi71W7EKuqw;`s8 zhyqhSFoT7eTdOw#K_GszW1!50RA zivy=KXLbmlm6}X?rNN_4Fa)#%cB1iQTaAbin!73s^BB3sU}}C_%b!g8$W^q=asuWcR>xNh7T0 z;$U7S?-eRySP71%>tH{h7(nz}=)M<_46>{TAp?nJIH{=a1YJ~hNlc;f9ijxyM_J7~dHvb6 z5m`VD72Sk35dSK6DUb!_BXu%51z}yBY%+McI2DzWTw}uU*@)9NoA2YJISa<)*5XZI zD+x&|7j@r!(j3;k4PY!oD43n)lO-mk-%!2&L4DgRG6X7Nv7g>NrV#dM zrhqcBG)@O`fcUX?;3QX(H5nV8iIg~|tS4X2Oe8Ofu{gowA=9`|9AD`Fy1CK%_669z=% zS0kGj-!$quXp)~`Y)SEaSU3>{+kLNQ=$ihLiiZu|ese%c57aV*u~gOV1LS1jcSSS)Jx_Teu7&J)F%n1EP!t1+sMjU*5*w+ zp2JM$AVesy?@bmpP-OkIuk|7Kdef}QXXuCF)JAA(a4J36=LmC@OB$$OMNRAmPpN&E z#$`W%1RENn*tzQ$upD*1JEd{t9~NLR@?kyY4AEQ}_h13cp@d(Do;bv>S!D>sJen~2 zK*^T~2rgbUnkA~K{O-Hb$`wCMr5~E5NHwsRQP2kXKZB>u#( zh`?fbuP|k872Ues8&c%cwsf<7)n(2jDhovi>6{-|AQ#n`WubJt`{|9-==6i^w|UaY zO^0i@8$3)b-zX9bgzXcq3sgqQuV#b{on-D=n@<2mr2NF+a!R$zMoO)W80z?FNBB_9 z!zh<{Ps8ReCX%)n%aRM4vfgK5sx!^*i-?;qSR0POO<+({jWKtoNKVmfWb}kByh<-+ z!=_?G464rfg5tlyyukc)>&v%W@l8|@#AIvNV{wg+a5JKcw0Z`eGqE+jXM9h6A zyW8Rax-G2r*C!Q5(ccSVl@$PAv99_}DUQy5zGus%f4H1duX*3@*#yDH2@bR5J}4@G$UH2g z#tr02!BT~8Pi{kc-~B7%D#|9d(j685Ob5+=_LJ$WGPcW22Fx5y%=t!4 z)+;?kC?HzMl8p_zQyrj(ED^i&ft}Fd4b|FTez+vnWcS)t%5aLPBX)ozf!3>c&_E^q z1{F_>n1M*rMOHKQ+C-Xh|LglaqGy)LHddKJzM7~mn#Ib7s|fOWpS+fftahK-FA4cx zs%mOJBVM(H&7v$>DDLJ6K}2U6m8yj#--d`9Q#^6Z8%}Q+W78z$>$QQyZ;9aag1fh! z$p2I%vt+d#)wo22mi{?8(3f^^#whSb*mH)ib|DP+GOem!5JQQ|7uAKqce`tOU!xVT znbDqyU#=RXU3F6+$&y2lN^@yOI3vF$?Af6z`xP>9Qo#^SC%q%24aIvQ5qS7@oHD^* zP)|cn07=Y1aIRiOu!=)~#%Kr8f6*1pHdd*Wr6|B0IS?5>(@8P%M~TchBd)2avS+uzQ&ar_6d=p&y?zPXm7>i@ zk{#rdJ|C8zU4z+#V@le0MGOPSiy~i;te|x#)@~*b@n(Ap=Pq-0G~(1)01JiyIc*g+U~+NgrRsQdk7ZEe(RRJslp{=A4I-+Z;3ijx6<^QOaVo z)?-*DBRF^&6v=m|mOpuP5IioDCEQk6jFcUw5l1Zt@fV}mj}DZ&Wl2qbo5(mXV8`x7 z1qh7yJdc(nSSF#ArqZQT;>#-MM9J`R>+0)^-p0LjmVDyxS}bD9j8DJTTT^k1bExkkMDAsVe@J*gJO=#zn3M#sYAJ>Q&IFsy zuj_oKYzmQa<=}{uK3qW~=!R1q>)3v2$(|8NW>L#}QC_7Y)xmO@YQMVgz#@=o_KLPO z5MJ(roqE6v2NwrEQx#Q_cmnf)uN^b9LQjA|Jm;%Mi}YqVfFy;Z05li@k_WL&MV)w~x>+w&s|**VYu*fpMhOee;&Fc(g-x-F zP2?y({nml4_;H*+gnzI#qn-s4V8|Y!U2%4k<96&gDY$&H&_%PolHLAMHW1%KhHh9) zXMH6waPuu=gmU>N&Dpb>3`mg_7SbPqPb7r=!a~{tt1#npQ+vJ*OWsgQ7+B5MPL(AC zDwW;)2#o6pl4*?ahflt`m@Hw6Mox8~sT<|!MD<&P`xI5NAfYvSDy+CkiB)j09nwr6 zE?7pw14Nz42PHuY&O^!FDy*v+T5eXEJ(!XupUE)Dp>K5VMrr|=URrt$^KT47=HWpt z*eqr9On3~xm*f2hF|ugR4`6d_OW4iILM~W=QbX~0geWc(~a>K4(40?m{X(`0{P~VTe zzPrBAkZXSka*HSy3OG31nY@yn4B+sQM%S>?H>!QZ-uBa_l>TX0r%GOBRK4`fZHLk_ z{0uC!fUC9v>Gx(G#>&Nt1?kHdE>@biSL~8$0zCtLhcnw{<=QV|Lt5~xZ+Psj7-R{_ zsD`x{JGGNSml=t6Um7zf70c>`1WCbO94$K*gh3j@c4}AR9ur25D421cYvx{)n;(7= za{a-}1@#K3`XlBhTC2!+6iBuEEou!2Q{$dL#3R->bHrirL|=TVgv0Ha#Ypw4`C56_ zxIzeWni<#S)HmtUrYi?{qw6;~i4XiWW1SP%l^JG#mj8gDpqKq_h^;?N0iDyoMlZmK zF9Cr_KZ70snqqx*f_ny}c<4#D%HS`KNL3fF0eY~r9f;8w_XrGxMjIUM0?X9`(4~~x z-*Wh0qv$qTVNR9m#8U%c7Tb11u{$7v$W;Kkym>f1O0s#lMkTbGE}xyQ6Psj>Pv? zCUI-pxdAAO9^C0W-_vNlK0lBMeY&;oalAr)4Rj;1o;fto%*15&0368@ne|>08|-B& zAlL79ug{z*lD>EMQr>S!$OD8mshZ-X)#=;DTM#z42xM;jlS!;^8q_CC)l;W7yFt{@ zWP`!d3`nk$r}xqo%+9dDZp_la_;X<{vt{saJTp!@6l6!;gD3Tal7FHs{_qWI&E*1q zlA%h5K0QA#{heNowh6)MXO_)7pbHLWaRITnGc$3(g`Uat54pbn4qT>*ab2VSc$hks z3-&^^746Z%&0pw$=dXNxRaFRn4|n3a06dz>=u;;}0{M}KM8pKZ%6g_7EgQiud~XJl zOoFj~S@KCCQ+C;J@Bjx-z-fi-4hS4sulL4)7~$Co_W>SgPRm1mpQAe&%}NWR3!GhR zvUTFok@|~0+_-b67S$fmGaUygqvhtK)~d=1v;GeW@3V3y?B?5Ivb=Wb=9(K`I~XKm z+aRhg&$;iZV`0ob<_qY-N2VgT)sYq>X$6r^9q9GRkO!bfk!h}N@eto*tsBvuDck=7 zuEOy1tBQ1*m)AvE-fx^Llv_hi_)%>3AMyH3CaQ)i)%h+3h&c*(x`t?Fm=@X8pwFgK zjXp1^USNn1`P9?SwRe>6n$GwNCsHx`!D6MdMl7e(4&e%4xV#bzLL(Bi${}0TW}-Ed z1cFe^YOoubUa3o7V7p&>_;+@@L6TsgG2T3Dv5^siE4S!x00j^ubiW2i@ihm}_#xua z&q~vgXwsb-RNsfUUZhPx1vb8{O^N#X zFO+kz96l6nIWeD)x%Jl zJdVf6uft^A1UwGim`tYkXF>WOG^v4r7_S&zTMo%7gykdn6v8mYNxM=|P@s~@U#Bz7 z6!XY2n>J-zY&l9&&#qOWn^)iLwqtkjkc4~oda>C(4H&Mp*RLH3Mh$;SY``$5-jWI zW7>0i2H6o8@^#ZnfoyFFC^P=N_YJp?*_}!RFlM1(Fc|a=A!HGt?aBc@jE_-qg)bm!Qnv?|GkME~-6^+!#U6kp|S(R$P2j0PM7UvD(*9 zZ=;_C1Y&(Sr&xyNyW5OfwK)~V3*VU& zQnGfNqrEJ@3IwD9IEzS^!itz}^^(jzm4XL+S%kn}b>WYOXq?;$fS=4G0TBwE5sY3O zaxo*nE8OeL<-4STBqm!q$bxpOPu(1x_3f|rPctDLcBt+LA4LqDT*!+r^+eEb0E43q{ew(&rH(e znCxj@S-&F{sk|TucqWO}18(Ef(qugsx!zx}^|Me?K4eUP!C*K|=_u;Tzt|rSrPnIO zp>Q{g_^2DfS~aIzXCu>|b(IJ}yq}YAl&5o9Znk1}Rn?%qFi;klGx)Yma8Xz1Q+q+t&vfTSx%PWwZsQ1Ftt z<}O$i_3l!~0V3EeM0a%=$~((Ia$*udK86UEFQapbHrvNv<;=Yg+O#OV-Sa3W*(|IGR1 zN_}+Mlyy7(&Q_k!trLC~Ryud~oMY#DuM$<~=LoV{rN@D2H@&r7`iBqV_PPy)q|caY z4*Fg#Ho3!GWD5JI9Ty#R_d{>8#qEiv%r^vzn7e9gDs1S1>9eb6%B|J*Zpl`}3Q&!8 zF(&{p{TqzfWO@zIMCy}B5r8ZiSRW@{1BD5)Ib!nLZzH%IzR`aCzFUp~&w=}7_$82E zW96xEryaC6IX~awu%Imf*W2qds8X<6FYq1ECkRLq(x_u^td!lV08z3YF zzztMQ=tV;B^IBfH=qA#LFxoQS3gCj}DIzRW-rd%uJ3e z507Zfkon8f`O^vbrNVx9H<;;Q2hObJHSPiKz=sAUiYDf`iP*NfxEc{7N%JZj1#7MP z7Fv+2cb}5V#hH7;=_bKIj40PjBR`wuYw@JX*I!kCT_=(QS_|cQIY2No48UNzvg|Lj zgyog^ZHo<_I5)#*~YhozL9${>rARd zblTJ0Wq<)weWU3eH6%i9xI9kgV6M)1iqC`bSUN3Tz_E=YGsh0&@Z--d3o`spG*Z6u zk+uF{XQ72k_-eHE7&;SZvhsdQG$Yimg0XFm zh1NGlwmMks#S~6F>-6`OC!3i+HTW!pIN`Ajp{2GMaO7TTPv1g#G!KlvHPc5JGXZ^E zbM!+psC-~CE_kD|;hc}6NaX1Ls-gZ)%xZv`?Osl0k;?fVd9#?nvaWiaElTcI4Fy@i zQWyfZ2QwMMwZ4-mu-&~7k5X>Il#!VB+Db zVR;-tj9LM1CCCgRkv|UmhiA{qmv7CURS0tLjJR=i>-?Tm4`-5XwM$x*?>}85`avq~ z8dZ?OtMviV-kCGZT&T{2eOK&t;f})wj z!pSm^v66y$TAng8KV8m5=0HnFdY*cQ7gTt`)ivY#ksG+bI4hXhp$k%!>%IE1G~S*Q za)(h3-PPEqYv{!bS^~L6(R2I0k<8lU#AQH9@9@gjT8=IS`2z;K=Bo?P4e}$voTO}H zQ<`}AsV`f7gWJ+hAkDn(xqs;`+- zzt9@|xG`W(_etMcR-T~;M3i!9EQzKm+kbOTw7Kb&!k}3p;7OJ~av=1|($j1_l?mS4 zn|ICzZlmg?J+D}Pw0Fe&B*?Ai4~Xicd)P@Cq@1h3E4V!>@=z|GFp_nLib}*wMrNw0 zh~|HPl{_5~hJ$KZXEUV=P}JJaOaNF5I=T|kVPvYBI@{B!=^>XP%nIcPL&K=m8$(fJTk&ml2#St+-Y&DbTfh!j=ak9-Jv=_|L6a6+^m2X zo~!XSl2?ueb)$PZSV|cX@{AihbcD8I$ z`0$q)dniixVFmJw@5^9C8)fCNF*`3Psl7VF@OzBXQ z9(1UdqmS$~o>e~=1xh~s^Q(M(+c;vdSOW=b)$*p>-+kZGy`5q(u_kK{r)Wt$RLxdo zULqJ&d&5{})-|BM>8Pa^m4+)`7$5p8z#2rhf*wq=*h~l1+xiPwqTO|GfPt(Qo%rl5 zhov=5SvS+I@p~j^5GPsDx%p;;({zm_@^!$fIKRsVf>_-_TA37mE&JH`#kYn%z5;aayMegh>X3BNC zbXh(y$Q#P79hW2W711SUa+_F#_Itw`PT3f_>s;N!z(W!6s=epLrrxQln&gyEYKYXg z!dSJwb`0+PUt|1tzpYHXA~UtaLo3paxVY;pl3lG}t$emi6>h#sbCK&}$_s1T4{e^- z$={G6^~)MJe#5l-{t+ss*_*NT=ANn`tUf}bcx`l8R6Lz^6^%YUY0Kk#eU)P79MOpz zfDRkx}0guhg>z1Rohqh9s9uTfIz)-3Q26(tVESjn6F+sQ>Um)dI zAo&)rY^;IH_M3XQq(3P}=d)eko-e@OT%C3b2zx`TFM?F>R^ckJp?}7vH>rc#3wTm(G0OpN?2okR#f^VZVnS4+K(xb{| zW$=gX$rFP~?j&eUi_Ka}09KPM*a{v-2km^j56S(J1Yp>6CKJ2F*%YmPa^#>klF+czoi z<<5B+i`$FBehGJ96$gcY5ONY$OhDf!j@YYY+6(?tUeY_gtEl#~n>F@%O*e zWI4)uI5-L*1xQ9*@NRGJFSEd#zDuoMZ1t6PJ-xlJ{3b-_nFzB_@HUuqS@avn?&P2M z+$#Ds9@O!t)hgJ2=E`u>685-bc(`?JxqAx{zW6Ccik}g{dU!RPx=p;`PkWwcKQwXq zwua;xT}FD~*6auOB;m|!*`Oy-(69&?WTJohGL#{D9r|?QIni!IncOYT7v^$*>Qmzhf-hd-d9(zDVT= z@xPzrx4#7IU}_6rmGGYI9raEHwqvHZUk_?Cj4VdU)H!mY-5#r#XL|FxxbwmPA&b`y z&<|d#;a>MwB7IlLkmd%W_6IK_0S~(d$IB)@Y}%wr?utR%@xm4T)BEXf>KTJmsms3i ziRjkoibD8=BK){_H&u>0w>dQa96Znp_oOkZDhjw;TNbjYVSgiTj1;)wf(SHET*wY+E+#kM-3|3X;>RpvSGSt{yHIkiI$pjOrVhmP4M)kr$g(>EB)*B z!5@dDhS3)T2VoEg7PjOr=e=b=D$RB`!P2|Xe$hty--XJ`16`z)38EnhWYpBsf>_8u zW#snd0i zw*MK&r?c76k`Hf~v>dJX;C^2O9hGpUr8r6Rb<-y8)!I8!i6efsT54960()o8j%Z^s zBh;Jgx!aey+NBez?WIiI{EM@;CD!S*NVr=Tj$3Cb|3CM(^#1Ns(r8s+C84GN4;Pf> zM*ObN>CWdO>COjr!}x6h!oZscZFSyQ>y_={?wky_69ttWK7V<1+_oKfEqeCO!Oarr zjX6G#|8fa!Q0&j;`Z^6(n83_7f{vHRj^bp7-@jtsD*dcZMy4sDu$fIc8OE6o3RmTs zN`3`*o~)6Y6Ne8S*$l&^j>4q!xp^nFduHjNh7j%+wIDjP(w~F=^~-mak8{lgSNZ`f z%HKKNrRbHgekqKhU{N%%0eX``l_(Fq1bY}A=C+1L{#WyS>4MO|6UMJ|e@!Wbp(@cy z4LW%^M2KhPt5<)$_%58B))F7%Np5IYVU+)+!+st2pX!Zu8QR@IDzV;N!`Pt> zGQ0hs|NFZs4;)i{3@xehaQW1hV(u=M?NW8VEsalB<#M&H{$ zx9e}(&W2h4+jaPVZ@gmxS)GoNM?MGaawugJ^e=Cata=PuA+yuPT2C_=9Da|FFZjQW z!G8&I%jly$<$&yKhkMI8gum0ee;KQK1=?P5Xme~KL;zp-FaP^n$q#`=r^-yU(c!kX z{IXF0tq74>#yAylBr#jVlb`(U(0_d>SEjfw7jvCbR-T#9c256Rf*9sVL!0!jFOdJI z75(cq9!F&zg?3+jSxe5!Ga7Ga_iwKg2Ma16dxie=9|c$K8*I5=5$SrhaOd0dhptR1 z7uC=ludO%B+-Gd$|HmQz5LvXr$I3n0!HJ}D(`1i-dlE)Uv8Ya>3c8w=LvE{+^S_sh zMKA^E>jUCY%yZq-e=8JLo#0g`d`T6AAq5Wt{mg&4z+iis;u_3`HMZ1K2peiI{^j%) zeVq$!uJYlnlU zA6}OY>F)7nw^dAoLhH$Z@^B^{sqT{J|Mumk=mz7Y3_i*`eeU@L+drI!-yo`j^L~_l zQIutn!l%SX(NlA(k)^`_x6@eFpj&IX9jfBJhlgw-7ySIlFm!|TX@$>H(!={Fr2c8> zR?)Wp?00@$BJfX=uH`<}0R3_k4}at^=?K6FVm{iLV8*zaftFWWb?jBCS2rzhwoH8$ z4%$*D+SBS~?$nJPWQ(L4{;%f!uSxfM0eU`hv#EOFL=|QF>8HyRpIYm|dIqif+{!&? zPqCZd#QWL;wp87iIb!qT(BNo#sG!!vA!5sdoHcpo+%S>8eW0zm&-1tzsf? zq(9uLzp$*f#JIUUIMQAI+(e*NWuP!$Uq{)Nw)NY6cI+c<*lW9*gNay2Z7mE1P6^Ux z09e*ZQjPsJB`Xi|=Yn_tFuhn^g7r~pmN$%acl+j+>MHLx)%h%Kmo+yIv|S5+xy()m zWL4?lTzx|ZS8e91OmEa-+Z{&rltHnd4k*+K|0ScpECj~Vj`NNMRi4`xh56UjMaYA* zvF<7&n7s;*#|a>AxN}5oxd4xlq^Fw(P|s^r?M{2)Zh52`kN)=3{$4kAEFjrwbpd-a zl_c|~tL1l1hKhQhxEE72Qqt#3cvv5&OCxIVfjdW4Dj#oy|5jf^c5{ry(VU(OejD=b zVjV*h#@`SA`%|S*1QR+QLTvc1sC|T8lohodK-98YkFtMl1M7g&XJ3`aBh1Z3+$tmG zBH~JG7!FQf@rwKhi9C~dt?6*W(rbtR;4##}bmsqIe*8Hst8;LnqA|FZsjOq6yGR`V z*Kq%I{_6~AdqNdWXxDYlY3_gfZ1TaP>DaD(oIG&;<8c45?EjPp87p^isa8)l3DQuE zf_B$G-Po^L%8CoEF!@piXFMIWv<>@j?+^n&UKDLG(Y&N{A;phN?$=;{itBH_s8J{b zo8L-yEk&6?w}0o{doe literal 0 HcmV?d00001 diff --git a/assets/js/04a995e6.8b77bad6.js b/assets/js/04a995e6.8b77bad6.js deleted file mode 100644 index 1295c006276c..000000000000 --- a/assets/js/04a995e6.8b77bad6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[785],{76886:n=>{n.exports=JSON.parse('{"title":"Advanced Guides for Staking","description":"Advanced how-to guides about Staking.","slug":"/learn-staking-index","permalink":"/docs/learn-staking-index","navigation":{"previous":{"title":"Consensus","permalink":"/docs/learn-consensus"},"next":{"title":"Introduction to Staking","permalink":"/docs/learn-staking"}}}')}}]); \ No newline at end of file diff --git a/assets/js/04a995e6.c8571d0f.js b/assets/js/04a995e6.c8571d0f.js new file mode 100644 index 000000000000..94c405da4b22 --- /dev/null +++ b/assets/js/04a995e6.c8571d0f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[785],{76886:e=>{e.exports=JSON.parse('{"title":"Advanced Guides for Staking","description":"Advanced how-to guides about Staking.","slug":"/learn-staking-index","permalink":"/docs/learn-staking-index","navigation":{"previous":{"title":"Transaction Fees","permalink":"/docs/learn-transaction-fees"},"next":{"title":"Introduction to Staking","permalink":"/docs/learn-staking"}}}')}}]); \ No newline at end of file diff --git a/assets/js/13b7bafa.b3496940.js b/assets/js/13b7bafa.b3496940.js deleted file mode 100644 index 4cfd7e375794..000000000000 --- a/assets/js/13b7bafa.b3496940.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[6585],{47940:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var a=n(74165),i=n(15861),o=n(67294),r=n(87152),s=n(17145),l=n(67425);function c(e,t,n){return h.apply(this,arguments)}function h(){return(h=(0,i.Z)((0,a.Z)().mark((function e(t,n,i){var o,l,c,h,d;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:o=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return o="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return o="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return o="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return o="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==o){e.next=18;break}return e.abrupt("return");case 18:return c=new r.U(o),e.next=21,s.G.create({provider:c});case 21:h=e.sent,(d=n.split(".")).forEach((function(e){e in h&&(h=h[e])})),e.t1=d[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=h.toString(),e.abrupt("break",35);case 29:return e.next=31,h();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+d[0]+") in "+n);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function d(e,t,n,a){switch(t){case"humanReadable":(0,l.HumanReadable)(e,n,a);break;case"precise":(0,l.Precise)(e,n,a);break;case"blocksToDays":(0,l.BlocksToDays)(e,a);break;case"percentage":(0,l.Percentage)(e,a);break;case"arrayLength":(0,l.ArrayLength)(e,a);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(e){var t=e.network,n=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,h=(0,o.useState)(""),p=h[0],u=h[1];return t=t.toLowerCase(),(0,o.useEffect)((function(){void 0!==l?d(r.toString(),l,t,u):u(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var o=function(){var e=(0,i.Z)((0,a.Z)().mark((function e(){var i;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c(t,n,u);case 2:if(void 0!==(i=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?d(i,l,t,u):u(i);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{o()}catch(s){console.log(s)}}}),[]),p}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,n,a){var i=void 0;if("polkadot"===n||"statemint"===n)i=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");i=6}e=parseFloat(e),a((e=Number.isInteger(e/t[n].precision)?e/t[n].precision+" "+t[n].symbol:(e/t[n].precision).toFixed(i)+" "+t[n].symbol).toString())},Precise:function(e,n,a){a(e=(e=parseFloat(e))/t[n].precision+" "+t[n].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},83881:(e,t,n)=>{"use strict";n.r(t),n.d(t,{assets:()=>_,contentTitle:()=>C,default:()=>L,frontMatter:()=>A,metadata:()=>P,toc:()=>B});var a,i=n(87462),o=n(63366),r=n(67294),s=n(3905),l=n(47940),c=n(74165),h=n(15861),d=n(7015),p=n(88454),u=n(48702),m=n(56429),k=n(81880),f=(0,n(68806).Ps)(a||(a=(0,k.Z)(["\nquery AUCTION {\n auctions(orderBy: biddingStartBlock_height_ASC) {\n id\n status\n biddingEndsBlock {\n height\n timestamp\n }\n biddingStartBlock {\n height\n timestamp\n }\n endPeriodBlock {\n height\n timestamp\n }\n onboardEndBlock {\n height\n timestamp\n }\n onboardStartBlock {\n height\n timestamp\n }\n startBlock {\n timestamp\n height\n }\n }\n squidStatus {\n height\n }\n}"]))),b={POLKADOT:"polkadot",KUSAMA:"kusama"},g={BlockNumber:void 0},w=[];function y(e,t){console.log("There was a problem fetching from with your query: ",e),t(r.createElement("div",null,"There was a problem with the query used to fetch auction data. If this issue persists, please submit an issue at the",r.createElement("a",{href:"https://github.com/w3f/polkadot-wiki/",target:"_blank"}," Polkadot Wiki repository on Github")))}function v(e){switch(e){case b.POLKADOT:return{httpLink:new m.u({uri:"https://squid.subsquid.io/polkadot-wiki-squid/v/v1/graphql"}),explorer:"https://polkadot.subscan.io/block/"};case b.KUSAMA:return{httpLink:new m.u({uri:"https://squid.subsquid.io/kusama-guide-squid/v/v1/graphql"}),explorer:"https://kusama.subscan.io/block/"}}}function N(e){return x.apply(this,arguments)}function x(){return(x=(0,h.Z)((0,c.Z)().mark((function e(t){return(0,c.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t.map((function(e){return parseInt(e.id)})).reverse().forEach((function(e){var t=r.createElement("option",{value:e,key:e},"Auction #"+e);w.push(t)}));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function S(e,t,n,a){var i=g.BlockNumber,o=new Date(parseInt(t[a].onboardStartBlock.timestamp)).toDateString(),s=new Date(parseInt(t[a].onboardEndBlock.timestamp)).toDateString(),l=new Date(parseInt(t[a].biddingStartBlock.timestamp)).toDateString(),c=new Date(parseInt(t[a].biddingEndsBlock.timestamp)).toDateString(),h=r.createElement("div",null,o+" - ",r.createElement("a",{href:""+e+t[a].onboardStartBlock.height},"Block #",t[a].onboardStartBlock.height)," to ",s+" - ",r.createElement("a",{href:""+e+t[a].onboardEndBlock.height},"Block #",t[a].onboardEndBlock.height)),d=parseInt(a)+1,p=e.startsWith("https://polkadot")?"https://polkadot.subscan.io/auction/":"https://kusama.subscan.io/auction/",u=r.createElement("div",null,r.createElement("div",null,r.createElement("a",{target:"_blank",href:""+p+d},"Auction #",d," is ",t[a].status)),r.createElement("br",null),r.createElement("select",{id:"AuctionSelector",onChange:function(a){return function(e,t,n,a){S(e,t,n,parseInt(a.target.value)-1)}(e,t,n,a)},style:{border:"2px solid #e6007a",height:"40px"}},w.map((function(e){return e}))),r.createElement("hr",null),r.createElement("b",null,"Auction Starts:"),r.createElement("br",null),new Date(parseInt(t[a].startBlock.timestamp)).toDateString()+" - ",r.createElement("a",{href:""+e+t[a].startBlock.height},"Block #",t[a].startBlock.height),r.createElement("hr",null),r.createElement("b",null,"Ending Period Starts:"),r.createElement("br",null),l+" - ",r.createElement("a",{href:""+e+t[a].biddingStartBlock.height},"Block #",t[a].biddingStartBlock.height),r.createElement("hr",null),r.createElement("b",null,"Auction Ends:"),r.createElement("br",null),c+" - ",r.createElement("a",{href:""+e+t[a].biddingEndsBlock.height},"Block #",t[a].biddingEndsBlock.height),r.createElement("hr",null),r.createElement("b",null,"Lease Period:"),r.createElement("br",null),h,r.createElement("hr",null),r.createElement("p",{style:{color:"#6c757d"}},"The dates and block numbers listed above can change based on network block production and the potential for skipped blocks. Dates for finalized blocks are pulled from on-chain, while future blocks are estimated using 6 second average block times. The current block is ",r.createElement("a",{href:""+e+i}," Block #",i),"."));return n(u),t}const E=function(e){var t=e.network,n=(0,r.useState)("Loading Auctions..."),a=n[0],i=n[1];return(0,r.useEffect)((0,h.Z)((0,c.Z)().mark((function e(){var n,a,o,s,l,h;return(0,c.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=v(t),a=new d.f({cache:new p.h,link:u.i.from([n.httpLink])}),e.next=4,a.query({query:f}).catch((function(e){return y(e,i)}));case 4:if(void 0===(o=e.sent)){e.next=17;break}if(s=o.data.squidStatus.height,0!=(l=o.data.auctions).length){e.next=12;break}i(r.createElement("div",null,"No auctions found on this network.")),e.next=17;break;case 12:return g.BlockNumber=s,e.next=15,N(l);case 15:h=l.length-1,S(n.explorer,l,i,h);case 17:case"end":return e.stop()}}),e)}))),[]),void 0!==a?a:r.createElement("div",null,"Loading auction data...")};var T=["components"],A={id:"learn-auction",title:"Parachain Slot Auctions",sidebar_label:"Parachain Slot Auctions",description:"Polkadot's Parachain Slot Auction Mechanism.",keywords:["auction","slot auctions","parachain","bidding"],slug:"../learn-auction"},C=void 0,P={unversionedId:"learn/learn-auction",id:"learn/learn-auction",title:"Parachain Slot Auctions",description:"Polkadot's Parachain Slot Auction Mechanism.",source:"@site/../docs/learn/learn-auction.md",sourceDirName:"learn",slug:"/learn-auction",permalink:"/docs/learn-auction",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-auction.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696485032,formattedLastUpdatedAt:"Oct 5, 2023",frontMatter:{id:"learn-auction",title:"Parachain Slot Auctions",sidebar_label:"Parachain Slot Auctions",description:"Polkadot's Parachain Slot Auction Mechanism.",keywords:["auction","slot auctions","parachain","bidding"],slug:"../learn-auction"},sidebar:"docs",previous:{title:"System Parachains",permalink:"/docs/learn-system-chains"},next:{title:"Parachain Crowdloans",permalink:"/docs/learn-crowdloans"}},_={},B=[{value:"Auction Schedule",id:"auction-schedule",level:2},{value:"Mechanics of a Candle Auction",id:"mechanics-of-a-candle-auction",level:2},{value:"Randomness in action",id:"randomness-in-action",level:3},{value:"Rationale",id:"rationale",level:2},{value:"Network Implementation",id:"network-implementation",level:2},{value:"Bidding",id:"bidding",level:2},{value:"Examples",id:"examples",level:3},{value:"Parachain Lease Extension",id:"parachain-lease-extension",level:2},{value:"Lease Extension with Overlapping Slots",id:"lease-extension-with-overlapping-slots",level:3},{value:"Lease Extension with Non-Overlapping Slots",id:"lease-extension-with-non-overlapping-slots",level:3},{value:"Resources",id:"resources",level:2}],D={toc:B},q="wrapper";function L(e){var t=e.components,a=(0,o.Z)(e,T);return(0,s.kt)(q,(0,i.Z)({},D,a,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("p",null,"For a ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-parachains"},"parachain")," to be added to\nPolkadot it must inhabit one of the available\nparachain slots. The number of parachain slots is not unbounded on\nPolkadot, as only a limited number are\navailable. A limited number of slots are unlocked every few months through on-chain governance. If a\nparachain wants to have guaranteed block inclusion at every Relay Chain block, it must acquire a\nparachain slot. The development of\n",(0,s.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/t/on-demand-parachains/2208"},"on-demand parachains")," (previously\nreferred to as parathreads) is in progress."),(0,s.kt)("p",null,"The parachain slots will be leased according to an unpermissioned\n",(0,s.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Candle_auction"},"candle auction"),", with several alterations related to\nimproving security while operating on a blockchain. See ",(0,s.kt)("a",{parentName:"p",href:"#rationale"},"Rationale")," for additional\ndetails."),(0,s.kt)("p",null,(0,s.kt)("a",{parentName:"p",href:"https://youtu.be/i5-Rw2Sf7-w"},(0,s.kt)("img",{parentName:"a",src:"https://img.youtube.com/vi/i5-Rw2Sf7-w/0.jpg",alt:"A Beginner's guide to Parachain Slot Auctions"}))),(0,s.kt)("h2",{id:"auction-schedule"},"Auction Schedule"),(0,s.kt)("p",null,"",(0,s.kt)(E,{network:"polkadot",mdxType:"AuctionSchedule"}),"\n",""),(0,s.kt)("h2",{id:"mechanics-of-a-candle-auction"},"Mechanics of a Candle Auction"),(0,s.kt)("p",null,"Candle auctions are a variant of open auctions where bidders submit bids that are increasingly\nhigher. The highest bidder at the conclusion of the auction is considered the winner."),(0,s.kt)("p",null,'Candle auctions were originally employed in the 16th century for the sale of ships. The name is\nderived from the system by which the auction length was determined. The phrase "inch of a candle"\nrefers to the length of time required for a candle to burn down 1 inch. When the flame extinguishes\nand the candle goes out, the auction terminates and the standing bid at that point in time prevails\nthe winner.'),(0,s.kt)("p",null,"When candle auctions are used online, they require a random number to decide the moment of\ntermination. Parachain slot auctions differ slightly from a normal candle auction in that they do\nnot randomly terminate the auction. Instead, they run for an entire fixed duration and the winner is\nrandomly chosen retroactively."),(0,s.kt)("p",null,"The candle auction on Polkadot is split into\ntwo parts:"),(0,s.kt)("ol",null,(0,s.kt)("li",{parentName:"ol"},(0,s.kt)("p",{parentName:"li"},"The ",(0,s.kt)("em",{parentName:"p"},"opening period")," which is in effect immediately after the auction starts. This period lasts\nfor one day and eighteen hours and serves as a buffer time for parachain candidates to setup\ntheir initial bids, and likely start executing their strategy on how to win the slot auction.\nDuring the opening phase, bids will continue to be accepted, but they do not have any effect on\nthe outcome of the auction.")),(0,s.kt)("li",{parentName:"ol"},(0,s.kt)("p",{parentName:"li"},"The ",(0,s.kt)("em",{parentName:"p"},"ending period")," follows the opening period for five additional days, where the auction is\nsubject to end based on the candle auction mechanism."))),(0,s.kt)("p",null,"The auction\u2019s ending time can occur any time within the ending period. This time is automatically\nand randomly chosen by the ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-cryptography#vrf"},"Verifiable Random Function (VRF)"),". The\nprobability of winning the auction is equal to the number of blocks that contain a winning bid,\ndivided by the total number of blocks in the ending period. The random ending is managed by\npropagating through the entire ending period, where a snapshot is taken at each block within the\nending period to capture the winners for that given block. At the end of the period, one of the\nsnapshots is randomly selected to determine the winner of the auction."),(0,s.kt)("admonition",{title:"The parachain candidate with the highest bid at the ending time chosen by the Verifiable",type:"info"},(0,s.kt)("p",{parentName:"admonition"},"Random Function wins the slot auction.")),(0,s.kt)("p",null,"A parachain auction on Polkadot lasts exactly\none week from the start: 1 day and 18 hours for the starting period,\n",(0,s.kt)(l.Z,{network:"polkadot",path:"consts.auctions.endingPeriod",defaultValue:72e3,filter:"blocksToDays",mdxType:"RPC"}),"\n","\ndays for the ending period (candle auction phase) and 6 hours for determining the auction winner."),(0,s.kt)("admonition",{type:"info"},(0,s.kt)("p",{parentName:"admonition"},(0,s.kt)("a",{parentName:"p",href:"/docs/learn-crowdloans##supporting-a-crowdloan-campaign"},"Crowdloan contributions")," cannot be made\nduring these six hours when the winning block for the auction is being determined on-chain.")),(0,s.kt)("p",null,"More details on this are available in the ",(0,s.kt)("a",{parentName:"p",href:"#network-implementation"},"Network Implementation")," section."),(0,s.kt)("h3",{id:"randomness-in-action"},(0,s.kt)("a",{parentName:"h3",href:"/docs/learn-cryptography#randomness"},"Randomness")," in action"),(0,s.kt)("p",null,"The following example will showcase the randomness mechanics of the candle auction for the ninth\nauction on Kusama. Keep in mind that the candle phase has a uniform termination profile and has an\nequal probability of ending at any given block, and the termination block cannot be predicted before\nor during the auction."),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"The ending period of auction 9 starts at ",(0,s.kt)("a",{parentName:"p",href:"https://kusama.subscan.io/auction/9"},(0,s.kt)("inlineCode",{parentName:"a"},"block 9362014")),"."),(0,s.kt)("admonition",{parentName:"li",type:"note"},(0,s.kt)("mdxAdmonitionTitle",{parentName:"admonition"},"The auction has a full duration equal to ",(0,s.kt)("inlineCode",{parentName:"mdxAdmonitionTitle"},"block 9362014")," + ",(0,s.kt)("inlineCode",{parentName:"mdxAdmonitionTitle"},"72000")),(0,s.kt)("p",{parentName:"admonition"},"Here, ",(0,s.kt)("inlineCode",{parentName:"p"},"block 72000"),' is the "ending period", which is divided into ',(0,s.kt)("strong",{parentName:"p"},"3600 samples of 20 blocks"),".\nFiguratively, the candle is lit, and the candle phase lasts for 72,000 blocks."))),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"The winning sample during the ending period had the ",(0,s.kt)("inlineCode",{parentName:"p"},"index 1078"),"."),(0,s.kt)("admonition",{parentName:"li",title:"Sample 1078 is the winner",type:"note"},(0,s.kt)("p",{parentName:"admonition"},"Sample 1078 refers to the winner as of ",(0,s.kt)("inlineCode",{parentName:"p"},"block 9362014 + 21560"),", which equals\n",(0,s.kt)("a",{parentName:"p",href:"https://kusama.subscan.io/block/9383574"},(0,s.kt)("inlineCode",{parentName:"a"},"block 9383574")),"."))),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"The parent block was a new BABE session in the ",(0,s.kt)("inlineCode",{parentName:"p"},"Logs"),", which updated the randomness that was used\nto select that ",(0,s.kt)("a",{parentName:"p",href:"https://kusama.subscan.io/block/9434277"},"sample index"),"."),(0,s.kt)("admonition",{parentName:"li",title:"Inspecting the block state",type:"note"},(0,s.kt)("p",{parentName:"admonition"},"You can inspect the state at the end of ",(0,s.kt)("inlineCode",{parentName:"p"},"block 9434277")," to see the sample indices with an\n",(0,s.kt)("a",{parentName:"p",href:"/docs/maintain-sync####types-of-nodes"},"archive node"),". The digest in the ",(0,s.kt)("inlineCode",{parentName:"p"},"Logs")," of\n",(0,s.kt)("inlineCode",{parentName:"p"},"9434277")," is decodable and contains the random value as well as the BABE authorities."))),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"As a result, the winner of this auction was not the highest bid during the full duration."))),(0,s.kt)("h2",{id:"rationale"},"Rationale"),(0,s.kt)("p",null,"The open and transparent nature of blockchain systems opens attack vectors that are non-existent in\ntraditional auction formats. Normal open auctions in particular can be vulnerable to ",(0,s.kt)("em",{parentName:"p"},"auction\nsniping")," when implemented over the internet or on a blockchain."),(0,s.kt)("p",null,"Auction sniping takes place when the end of an auction is known and bidders are hesitant to bid\ntheir true price early, in hopes of paying less than they actually value the item."),(0,s.kt)("p",null,"For example, Alice may value an item at auction for 30 USD. She submits an initial bid of 10 USD in\nhopes of acquiring the items at a lower price. Alice's strategy is to place incrementally higher\nbids until her true value of 30 USD is exceeded. Another bidder Eve values the same item at 11 USD.\nEve's strategy is to watch the auction and submit a bid of 11 USD at the last second. Alice will\nhave no time to respond to this bid before the close of the auction and will lose the item. The\nauction mechanism is sub-optimal because it has not discovered the true price of the item and the\nitem has not gone to the actor who valued it the most."),(0,s.kt)("p",null,"On blockchains this problem may be even worse, since it potentially gives the producer of the block\nan opportunity to snipe any auction at the last concluding block by adding it themselves while\nignoring other bids. There is also the possibility of a malicious bidder or a block producer trying\nto ",(0,s.kt)("em",{parentName:"p"},"grief")," honest bidders by sniping auctions."),(0,s.kt)("p",null,"For this reason, ",(0,s.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Vickrey_auction"},"Vickrey auctions"),", a type of\nsealed-bid auction where bids are hidden and only revealed at a later phase, have emerged as a\nwell-regarded mechanic. For example, this mechanism is leveraged to auction human readable names on\nthe ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced"},"ENS"),". The Candle auction is another solution that does not require\na two-step commit and reveal schemes (a main component of Vickrey auctions), which allows smart\ncontracts to participate."),(0,s.kt)("p",null,"Candle auctions allow everyone to always know the states of the bid, but they do not reveal when the\nauction has officially ended. This helps to ensure that bidders are willing to make their true bids\nearly. Otherwise, they may find themselves in a situation where the auction was determined to have\nended before having an opportunity to bid."),(0,s.kt)("h2",{id:"network-implementation"},"Network Implementation"),(0,s.kt)("p",null,"Polkadot will use a ",(0,s.kt)("em",{parentName:"p"},"random beacon")," based on\nthe ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-cryptography#vrf"},"Verifiable Random Function (VRF)"),". The VRF will provide the base\nof the randomness, which will retroactively determine the end-time of the auction."),(0,s.kt)("p",null,"The slot durations are capped to 2 years and divided into 3-month periods.\nParachains may lease a slot for any\ncombination of periods of the slot duration. Parachains may lease more than one slot over time,\nmeaning that they could extend their lease to the network past the maximum duration by leasing a\ncontiguous slot."),(0,s.kt)("admonition",{title:"Individual parachain slots are fungible",type:"note"},(0,s.kt)("p",{parentName:"admonition"},"This means that parachains do not need to always inhabit the same slot, however they always must\nmaintain a slot to remain a parachain.")),(0,s.kt)("h2",{id:"bidding"},"Bidding"),(0,s.kt)("p",null,"Parachains or parachain teams, bid in the auction by specifying the slot range that they want to\nlease and the number of tokens they are willing to reserve. Bidders can be either ordinary accounts,\nor use the ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-crowdloans"},"crowdloan functionality")," to source tokens from the community. For a\nmore in-depth comparison between both of these options for gaining a parachain slot, check out this\nsection on\n",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-crowdloans#crowdloan-campaigns-vs-parachain-auctions"},"Crowdloan Campaigns vs Parachain Auctions"),"."),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre"},"Parachain slots at genesis\n\n --3 months--\n v v\nSlot A | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |...\nSlot B | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |...\nSlot C |__________| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |...\nSlot D |__________| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |...\nSlot E |__________|___________| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |...\n ^ ^\n ---------------------------------------------max lease-----------------------------------------\n\n")),(0,s.kt)("p",null,(0,s.kt)("em",{parentName:"p"},"Each period of the range 1 - 4 represents a\n3-month duration for a total of 2 years\n")),(0,s.kt)("p",null,"Bidders will submit a configuration of bids specifying the token amount they are willing to bond and\nfor which periods. The slot ranges may be any of the periods 1 - ",(0,s.kt)("inlineCode",{parentName:"p"},"n"),", where ",(0,s.kt)("inlineCode",{parentName:"p"},"n")," is the number of\nperiods available for a slot. (",(0,s.kt)("inlineCode",{parentName:"p"},"n"),"=\n",(0,s.kt)(l.Z,{network:"polkadot",path:"consts.auctions.leasePeriodsPerSlot",defaultValue:8,mdxType:"RPC"})," for Polkadot)\n",""),(0,s.kt)("admonition",{title:"If you bond tokens with a parachain slot, you cannot stake with those tokens. In this way,",type:"note"},(0,s.kt)("p",{parentName:"admonition"},"you pay for the parachain slot by forfeiting the opportunity to earn staking rewards.")),(0,s.kt)("p",null,"A bidder configuration for a single bidder may look like the following pseudocode example:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-js"},"const bids = [\n {\n range: [1, 2, 3, 4, 5, 6, 7, 8],\n bond_amount: 300,\n },\n {\n range: [1, 2, 3, 4],\n bond_amount: 777,\n },\n {\n range: [2, 3, 4, 5, 6, 7],\n bond_amount: 450,\n },\n];\n")),(0,s.kt)("p",null,"The important concept to understand from this example is that bidders may submit different\nconfigurations at different prices (",(0,s.kt)("inlineCode",{parentName:"p"},"bond_amount"),"). However, only one of these bids would be\neligible to win exclusive of the others."),(0,s.kt)("p",null,"The winner selection algorithm will pick bids that may be non-overlapping in order to maximize the\namount of tokens held over the entire lease duration of the parachain slot. This means that the\nhighest bidder for any given slot lease period might not always win (see the\n",(0,s.kt)("a",{parentName:"p",href:"#examples"},"example below"),")."),(0,s.kt)("p",null,"A random number, which is based on the ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-cryptography#vrf"},"VRF")," used by\nPolkadot, is determined at each block.\nAdditionally, each auction will have a threshold that starts at 0 and increases to 1. The random\nnumber produced by the VRF is examined next to the threshold to determine if that block is the end\nof the auction within the so-called ",(0,s.kt)("em",{parentName:"p"},"ending period"),". Additionally, the VRF will pick a block from\nthe last epoch to access the state of bids which can help aid in mitigating some types of attacks\nfrom malicious validators."),(0,s.kt)("h3",{id:"examples"},"Examples"),(0,s.kt)("p",null,"There is one parachain slot available."),(0,s.kt)("p",null,"Charlie bids ",(0,s.kt)("inlineCode",{parentName:"p"},"75")," for the range 1 - 8."),(0,s.kt)("p",null,"Dave bids ",(0,s.kt)("inlineCode",{parentName:"p"},"100")," for the range 5 - 8."),(0,s.kt)("p",null,"Emily bids ",(0,s.kt)("inlineCode",{parentName:"p"},"40")," for the range 1 - 4."),(0,s.kt)("p",null,"Let's calculate each bidder's valuation according to the algorithm. We do this by multiplying the\nbond amount by the number of periods in the specified range of the bid."),(0,s.kt)("p",null,"Charlie - 75 ","*"," 8 = 600 for range 1 - 8"),(0,s.kt)("p",null,"Dave - 100 ","*"," 4 = 400 for range 5 - 8"),(0,s.kt)("p",null,"Emily - 40 ","*"," 4 = 160 for range 1 - 4"),(0,s.kt)("p",null,"Although Dave had the highest bid in accordance to token amount per period, when we do the\ncalculations we see that since he only bid for a range of 4, he would need to share the slot with\nEmily who bid much less. Together Dave and Emily's bids only equals a valuation of ",(0,s.kt)("inlineCode",{parentName:"p"},"560"),". Charlie's\nvaluation for the entire range is ",(0,s.kt)("inlineCode",{parentName:"p"},"600"),". Therefore Charlie is awarded the complete range of the\nparachain slot."),(0,s.kt)("h2",{id:"parachain-lease-extension"},"Parachain Lease Extension"),(0,s.kt)("p",null,"Before the slot lease expires, parachains have to bid and win another auction for continuity of the\nlease. To avoid any downtime in connectivity and minimize the risk of losing a subsequent auction,\nparachain teams need to plan ahead to bid for the lease extension before their current lease period\nends. Explained in the section above, each auction lets you bid for 8 LPs (Lease Periods) which\nenables two scenarios for the parachain's lease extension."),(0,s.kt)("h3",{id:"lease-extension-with-overlapping-slots"},"Lease Extension with Overlapping Slots"),(0,s.kt)("p",null,"Acquire a slot where the first lease period is before the last lease period of the current slot."),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Register a new ",(0,s.kt)("inlineCode",{parentName:"li"},"paraId")),(0,s.kt)("li",{parentName:"ul"},"Win a slot auction with the new ",(0,s.kt)("inlineCode",{parentName:"li"},"paraId"))),(0,s.kt)("p",null,"The parachain team has access to two slots:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"one that will end soon"),(0,s.kt)("li",{parentName:"ul"},"one that just started")),(0,s.kt)("p",null,"Both slots have at least one LP in common. When the old slot transitions to their last LP, the\nparachain can ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/pull/4772"},"swap")," the slots. This can be done\nvia ",(0,s.kt)("a",{parentName:"p",href:"https://kusama.polkassembly.io/post/1491"},"on-chain governance"),". The ",(0,s.kt)("inlineCode",{parentName:"p"},"swap")," call is available in\nthe ",(0,s.kt)("inlineCode",{parentName:"p"},"registrar")," pallet."),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"Parachain Slot Swap",src:n(11308).Z,width:"1286",height:"896"})),(0,s.kt)("admonition",{title:"Any two parachains can swap their slots via XCM",type:"note"},(0,s.kt)("p",{parentName:"admonition"},"The ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/pull/4772"},"slot swap via XCM")," requires two live\nparachains to send an XCM message to the relay chain to approve the swap. A parachain team with\naccess to two overlapping slots can start a shell parachain on the new slot and swap it with their\nactual parachain on the old slot, thus ensuring continuity of the lease.")),(0,s.kt)("h3",{id:"lease-extension-with-non-overlapping-slots"},"Lease Extension with Non-Overlapping Slots"),(0,s.kt)("p",null,"Acquire a slot where the first LP starts right after the end of the last LP of the current slot. In\nthis case, the parachain can bid directly with their current ",(0,s.kt)("inlineCode",{parentName:"p"},"paraId"),", and it will be automatically\nextended without the need of swapping. This method has the advantage of not having superfluous LP's\non different slots owned by the same team, however it has the disadvantage of losing flexibility on\nwhen to win a new slot: if the team does not win the exact slot, then it will suffer some downtime\nuntil it wins a new slot."),(0,s.kt)("h2",{id:"resources"},"Resources"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000182287-how-does-a-parachain-slots-auction-work-"},"How do Parachain Slot Auctions Work")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://research.web3.foundation/Polkadot/overview/parachain-allocation"},"Parachain Allocation")," -\nW3F research page on parachain allocation that goes more in depth to the mechanism"),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://polkadot.network/blog/research-update-the-case-for-candle-auctions/"},"Research Update: The Case for Candle Auctions")," -\nW3F breakdown and research update about candle auctions"),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3846363"},"Front-Running, Smart Contracts, and Candle Auctions"),"\nW3F Research team discusses how to remedy current blockchain auction setbacks with candle auctions")))}L.isMDXComponent=!0},11308:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/para-swap-3c765fb9e6860c7d7489a758af065cb0.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/13b7bafa.e0ec35af.js b/assets/js/13b7bafa.e0ec35af.js new file mode 100644 index 000000000000..950c323ef816 --- /dev/null +++ b/assets/js/13b7bafa.e0ec35af.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[6585],{47940:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var a=n(74165),i=n(15861),o=n(67294),r=n(87152),s=n(17145),l=n(67425);function c(e,t,n){return h.apply(this,arguments)}function h(){return(h=(0,i.Z)((0,a.Z)().mark((function e(t,n,i){var o,l,c,h,d;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:o=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return o="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return o="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return o="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return o="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==o){e.next=18;break}return e.abrupt("return");case 18:return c=new r.U(o),e.next=21,s.G.create({provider:c});case 21:h=e.sent,(d=n.split(".")).forEach((function(e){e in h&&(h=h[e])})),e.t1=d[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=h.toString(),e.abrupt("break",35);case 29:return e.next=31,h();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+d[0]+") in "+n);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function d(e,t,n,a){switch(t){case"humanReadable":(0,l.HumanReadable)(e,n,a);break;case"precise":(0,l.Precise)(e,n,a);break;case"blocksToDays":(0,l.BlocksToDays)(e,a);break;case"percentage":(0,l.Percentage)(e,a);break;case"permillToPercent":(0,l.PermillToPercent)(e,a);break;case"arrayLength":(0,l.ArrayLength)(e,a);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(e){var t=e.network,n=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,h=(0,o.useState)(""),p=h[0],u=h[1];return t=t.toLowerCase(),(0,o.useEffect)((function(){void 0!==l?d(r.toString(),l,t,u):u(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var o=function(){var e=(0,i.Z)((0,a.Z)().mark((function e(){var i;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c(t,n,u);case 2:if(void 0!==(i=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?d(i,l,t,u):u(i);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{o()}catch(s){console.log(s)}}}),[]),p}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,n,a){var i=void 0;if("polkadot"===n||"statemint"===n)i=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");i=6}e=parseFloat(e),a((e=Number.isInteger(e/t[n].precision)?e/t[n].precision+" "+t[n].symbol:(e/t[n].precision).toFixed(i)+" "+t[n].symbol).toString())},Precise:function(e,n,a){a(e=(e=parseFloat(e))/t[n].precision+" "+t[n].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},83881:(e,t,n)=>{"use strict";n.r(t),n.d(t,{assets:()=>_,contentTitle:()=>P,default:()=>L,frontMatter:()=>A,metadata:()=>C,toc:()=>B});var a,i=n(87462),o=n(63366),r=n(67294),s=n(3905),l=n(47940),c=n(74165),h=n(15861),d=n(7015),p=n(88454),u=n(48702),m=n(56429),k=n(81880),f=(0,n(68806).Ps)(a||(a=(0,k.Z)(["\nquery AUCTION {\n auctions(orderBy: biddingStartBlock_height_ASC) {\n id\n status\n biddingEndsBlock {\n height\n timestamp\n }\n biddingStartBlock {\n height\n timestamp\n }\n endPeriodBlock {\n height\n timestamp\n }\n onboardEndBlock {\n height\n timestamp\n }\n onboardStartBlock {\n height\n timestamp\n }\n startBlock {\n timestamp\n height\n }\n }\n squidStatus {\n height\n }\n}"]))),b={POLKADOT:"polkadot",KUSAMA:"kusama"},g={BlockNumber:void 0},w=[];function y(e,t){console.log("There was a problem fetching from with your query: ",e),t(r.createElement("div",null,"There was a problem with the query used to fetch auction data. If this issue persists, please submit an issue at the",r.createElement("a",{href:"https://github.com/w3f/polkadot-wiki/",target:"_blank"}," Polkadot Wiki repository on Github")))}function v(e){switch(e){case b.POLKADOT:return{httpLink:new m.u({uri:"https://squid.subsquid.io/polkadot-wiki-squid/v/v1/graphql"}),explorer:"https://polkadot.subscan.io/block/"};case b.KUSAMA:return{httpLink:new m.u({uri:"https://squid.subsquid.io/kusama-guide-squid/v/v1/graphql"}),explorer:"https://kusama.subscan.io/block/"}}}function N(e){return x.apply(this,arguments)}function x(){return(x=(0,h.Z)((0,c.Z)().mark((function e(t){return(0,c.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:t.map((function(e){return parseInt(e.id)})).reverse().forEach((function(e){var t=r.createElement("option",{value:e,key:e},"Auction #"+e);w.push(t)}));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function S(e,t,n,a){var i=g.BlockNumber,o=new Date(parseInt(t[a].onboardStartBlock.timestamp)).toDateString(),s=new Date(parseInt(t[a].onboardEndBlock.timestamp)).toDateString(),l=new Date(parseInt(t[a].biddingStartBlock.timestamp)).toDateString(),c=new Date(parseInt(t[a].biddingEndsBlock.timestamp)).toDateString(),h=r.createElement("div",null,o+" - ",r.createElement("a",{href:""+e+t[a].onboardStartBlock.height},"Block #",t[a].onboardStartBlock.height)," to ",s+" - ",r.createElement("a",{href:""+e+t[a].onboardEndBlock.height},"Block #",t[a].onboardEndBlock.height)),d=parseInt(a)+1,p=e.startsWith("https://polkadot")?"https://polkadot.subscan.io/auction/":"https://kusama.subscan.io/auction/",u=r.createElement("div",null,r.createElement("div",null,r.createElement("a",{target:"_blank",href:""+p+d},"Auction #",d," is ",t[a].status)),r.createElement("br",null),r.createElement("select",{id:"AuctionSelector",onChange:function(a){return function(e,t,n,a){S(e,t,n,parseInt(a.target.value)-1)}(e,t,n,a)},style:{border:"2px solid #e6007a",height:"40px"}},w.map((function(e){return e}))),r.createElement("hr",null),r.createElement("b",null,"Auction Starts:"),r.createElement("br",null),new Date(parseInt(t[a].startBlock.timestamp)).toDateString()+" - ",r.createElement("a",{href:""+e+t[a].startBlock.height},"Block #",t[a].startBlock.height),r.createElement("hr",null),r.createElement("b",null,"Ending Period Starts:"),r.createElement("br",null),l+" - ",r.createElement("a",{href:""+e+t[a].biddingStartBlock.height},"Block #",t[a].biddingStartBlock.height),r.createElement("hr",null),r.createElement("b",null,"Auction Ends:"),r.createElement("br",null),c+" - ",r.createElement("a",{href:""+e+t[a].biddingEndsBlock.height},"Block #",t[a].biddingEndsBlock.height),r.createElement("hr",null),r.createElement("b",null,"Lease Period:"),r.createElement("br",null),h,r.createElement("hr",null),r.createElement("p",{style:{color:"#6c757d"}},"The dates and block numbers listed above can change based on network block production and the potential for skipped blocks. Dates for finalized blocks are pulled from on-chain, while future blocks are estimated using 6 second average block times. The current block is ",r.createElement("a",{href:""+e+i}," Block #",i),"."));return n(u),t}const T=function(e){var t=e.network,n=(0,r.useState)("Loading Auctions..."),a=n[0],i=n[1];return(0,r.useEffect)((0,h.Z)((0,c.Z)().mark((function e(){var n,a,o,s,l,h;return(0,c.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=v(t),a=new d.f({cache:new p.h,link:u.i.from([n.httpLink])}),e.next=4,a.query({query:f}).catch((function(e){return y(e,i)}));case 4:if(void 0===(o=e.sent)){e.next=17;break}if(s=o.data.squidStatus.height,0!=(l=o.data.auctions).length){e.next=12;break}i(r.createElement("div",null,"No auctions found on this network.")),e.next=17;break;case 12:return g.BlockNumber=s,e.next=15,N(l);case 15:h=l.length-1,S(n.explorer,l,i,h);case 17:case"end":return e.stop()}}),e)}))),[]),void 0!==a?a:r.createElement("div",null,"Loading auction data...")};var E=["components"],A={id:"learn-auction",title:"Parachain Slot Auctions",sidebar_label:"Parachain Slot Auctions",description:"Polkadot's Parachain Slot Auction Mechanism.",keywords:["auction","slot auctions","parachain","bidding"],slug:"../learn-auction"},P=void 0,C={unversionedId:"learn/learn-auction",id:"learn/learn-auction",title:"Parachain Slot Auctions",description:"Polkadot's Parachain Slot Auction Mechanism.",source:"@site/../docs/learn/learn-auction.md",sourceDirName:"learn",slug:"/learn-auction",permalink:"/docs/learn-auction",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-auction.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696485032,formattedLastUpdatedAt:"Oct 5, 2023",frontMatter:{id:"learn-auction",title:"Parachain Slot Auctions",sidebar_label:"Parachain Slot Auctions",description:"Polkadot's Parachain Slot Auction Mechanism.",keywords:["auction","slot auctions","parachain","bidding"],slug:"../learn-auction"},sidebar:"docs",previous:{title:"System Parachains",permalink:"/docs/learn-system-chains"},next:{title:"Parachain Crowdloans",permalink:"/docs/learn-crowdloans"}},_={},B=[{value:"Auction Schedule",id:"auction-schedule",level:2},{value:"Mechanics of a Candle Auction",id:"mechanics-of-a-candle-auction",level:2},{value:"Randomness in action",id:"randomness-in-action",level:3},{value:"Rationale",id:"rationale",level:2},{value:"Network Implementation",id:"network-implementation",level:2},{value:"Bidding",id:"bidding",level:2},{value:"Examples",id:"examples",level:3},{value:"Parachain Lease Extension",id:"parachain-lease-extension",level:2},{value:"Lease Extension with Overlapping Slots",id:"lease-extension-with-overlapping-slots",level:3},{value:"Lease Extension with Non-Overlapping Slots",id:"lease-extension-with-non-overlapping-slots",level:3},{value:"Resources",id:"resources",level:2}],D={toc:B},q="wrapper";function L(e){var t=e.components,a=(0,o.Z)(e,E);return(0,s.kt)(q,(0,i.Z)({},D,a,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("p",null,"For a ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-parachains"},"parachain")," to be added to\nPolkadot it must inhabit one of the available\nparachain slots. The number of parachain slots is not unbounded on\nPolkadot, as only a limited number are\navailable. A limited number of slots are unlocked every few months through on-chain governance. If a\nparachain wants to have guaranteed block inclusion at every Relay Chain block, it must acquire a\nparachain slot. The development of\n",(0,s.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/t/on-demand-parachains/2208"},"on-demand parachains")," (previously\nreferred to as parathreads) is in progress."),(0,s.kt)("p",null,"The parachain slots will be leased according to an unpermissioned\n",(0,s.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Candle_auction"},"candle auction"),", with several alterations related to\nimproving security while operating on a blockchain. See ",(0,s.kt)("a",{parentName:"p",href:"#rationale"},"Rationale")," for additional\ndetails."),(0,s.kt)("p",null,(0,s.kt)("a",{parentName:"p",href:"https://youtu.be/i5-Rw2Sf7-w"},(0,s.kt)("img",{parentName:"a",src:"https://img.youtube.com/vi/i5-Rw2Sf7-w/0.jpg",alt:"A Beginner's guide to Parachain Slot Auctions"}))),(0,s.kt)("h2",{id:"auction-schedule"},"Auction Schedule"),(0,s.kt)("p",null,"",(0,s.kt)(T,{network:"polkadot",mdxType:"AuctionSchedule"}),"\n",""),(0,s.kt)("h2",{id:"mechanics-of-a-candle-auction"},"Mechanics of a Candle Auction"),(0,s.kt)("p",null,"Candle auctions are a variant of open auctions where bidders submit bids that are increasingly\nhigher. The highest bidder at the conclusion of the auction is considered the winner."),(0,s.kt)("p",null,'Candle auctions were originally employed in the 16th century for the sale of ships. The name is\nderived from the system by which the auction length was determined. The phrase "inch of a candle"\nrefers to the length of time required for a candle to burn down 1 inch. When the flame extinguishes\nand the candle goes out, the auction terminates and the standing bid at that point in time prevails\nthe winner.'),(0,s.kt)("p",null,"When candle auctions are used online, they require a random number to decide the moment of\ntermination. Parachain slot auctions differ slightly from a normal candle auction in that they do\nnot randomly terminate the auction. Instead, they run for an entire fixed duration and the winner is\nrandomly chosen retroactively."),(0,s.kt)("p",null,"The candle auction on Polkadot is split into\ntwo parts:"),(0,s.kt)("ol",null,(0,s.kt)("li",{parentName:"ol"},(0,s.kt)("p",{parentName:"li"},"The ",(0,s.kt)("em",{parentName:"p"},"opening period")," which is in effect immediately after the auction starts. This period lasts\nfor one day and eighteen hours and serves as a buffer time for parachain candidates to setup\ntheir initial bids, and likely start executing their strategy on how to win the slot auction.\nDuring the opening phase, bids will continue to be accepted, but they do not have any effect on\nthe outcome of the auction.")),(0,s.kt)("li",{parentName:"ol"},(0,s.kt)("p",{parentName:"li"},"The ",(0,s.kt)("em",{parentName:"p"},"ending period")," follows the opening period for five additional days, where the auction is\nsubject to end based on the candle auction mechanism."))),(0,s.kt)("p",null,"The auction\u2019s ending time can occur any time within the ending period. This time is automatically\nand randomly chosen by the ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-cryptography#vrf"},"Verifiable Random Function (VRF)"),". The\nprobability of winning the auction is equal to the number of blocks that contain a winning bid,\ndivided by the total number of blocks in the ending period. The random ending is managed by\npropagating through the entire ending period, where a snapshot is taken at each block within the\nending period to capture the winners for that given block. At the end of the period, one of the\nsnapshots is randomly selected to determine the winner of the auction."),(0,s.kt)("admonition",{title:"The parachain candidate with the highest bid at the ending time chosen by the Verifiable",type:"info"},(0,s.kt)("p",{parentName:"admonition"},"Random Function wins the slot auction.")),(0,s.kt)("p",null,"A parachain auction on Polkadot lasts exactly\none week from the start: 1 day and 18 hours for the starting period,\n",(0,s.kt)(l.Z,{network:"polkadot",path:"consts.auctions.endingPeriod",defaultValue:72e3,filter:"blocksToDays",mdxType:"RPC"}),"\n","\ndays for the ending period (candle auction phase) and 6 hours for determining the auction winner."),(0,s.kt)("admonition",{type:"info"},(0,s.kt)("p",{parentName:"admonition"},(0,s.kt)("a",{parentName:"p",href:"/docs/learn-crowdloans##supporting-a-crowdloan-campaign"},"Crowdloan contributions")," cannot be made\nduring these six hours when the winning block for the auction is being determined on-chain.")),(0,s.kt)("p",null,"More details on this are available in the ",(0,s.kt)("a",{parentName:"p",href:"#network-implementation"},"Network Implementation")," section."),(0,s.kt)("h3",{id:"randomness-in-action"},(0,s.kt)("a",{parentName:"h3",href:"/docs/learn-cryptography#randomness"},"Randomness")," in action"),(0,s.kt)("p",null,"The following example will showcase the randomness mechanics of the candle auction for the ninth\nauction on Kusama. Keep in mind that the candle phase has a uniform termination profile and has an\nequal probability of ending at any given block, and the termination block cannot be predicted before\nor during the auction."),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"The ending period of auction 9 starts at ",(0,s.kt)("a",{parentName:"p",href:"https://kusama.subscan.io/auction/9"},(0,s.kt)("inlineCode",{parentName:"a"},"block 9362014")),"."),(0,s.kt)("admonition",{parentName:"li",type:"note"},(0,s.kt)("mdxAdmonitionTitle",{parentName:"admonition"},"The auction has a full duration equal to ",(0,s.kt)("inlineCode",{parentName:"mdxAdmonitionTitle"},"block 9362014")," + ",(0,s.kt)("inlineCode",{parentName:"mdxAdmonitionTitle"},"72000")),(0,s.kt)("p",{parentName:"admonition"},"Here, ",(0,s.kt)("inlineCode",{parentName:"p"},"block 72000"),' is the "ending period", which is divided into ',(0,s.kt)("strong",{parentName:"p"},"3600 samples of 20 blocks"),".\nFiguratively, the candle is lit, and the candle phase lasts for 72,000 blocks."))),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"The winning sample during the ending period had the ",(0,s.kt)("inlineCode",{parentName:"p"},"index 1078"),"."),(0,s.kt)("admonition",{parentName:"li",title:"Sample 1078 is the winner",type:"note"},(0,s.kt)("p",{parentName:"admonition"},"Sample 1078 refers to the winner as of ",(0,s.kt)("inlineCode",{parentName:"p"},"block 9362014 + 21560"),", which equals\n",(0,s.kt)("a",{parentName:"p",href:"https://kusama.subscan.io/block/9383574"},(0,s.kt)("inlineCode",{parentName:"a"},"block 9383574")),"."))),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"The parent block was a new BABE session in the ",(0,s.kt)("inlineCode",{parentName:"p"},"Logs"),", which updated the randomness that was used\nto select that ",(0,s.kt)("a",{parentName:"p",href:"https://kusama.subscan.io/block/9434277"},"sample index"),"."),(0,s.kt)("admonition",{parentName:"li",title:"Inspecting the block state",type:"note"},(0,s.kt)("p",{parentName:"admonition"},"You can inspect the state at the end of ",(0,s.kt)("inlineCode",{parentName:"p"},"block 9434277")," to see the sample indices with an\n",(0,s.kt)("a",{parentName:"p",href:"/docs/maintain-sync####types-of-nodes"},"archive node"),". The digest in the ",(0,s.kt)("inlineCode",{parentName:"p"},"Logs")," of\n",(0,s.kt)("inlineCode",{parentName:"p"},"9434277")," is decodable and contains the random value as well as the BABE authorities."))),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"As a result, the winner of this auction was not the highest bid during the full duration."))),(0,s.kt)("h2",{id:"rationale"},"Rationale"),(0,s.kt)("p",null,"The open and transparent nature of blockchain systems opens attack vectors that are non-existent in\ntraditional auction formats. Normal open auctions in particular can be vulnerable to ",(0,s.kt)("em",{parentName:"p"},"auction\nsniping")," when implemented over the internet or on a blockchain."),(0,s.kt)("p",null,"Auction sniping takes place when the end of an auction is known and bidders are hesitant to bid\ntheir true price early, in hopes of paying less than they actually value the item."),(0,s.kt)("p",null,"For example, Alice may value an item at auction for 30 USD. She submits an initial bid of 10 USD in\nhopes of acquiring the items at a lower price. Alice's strategy is to place incrementally higher\nbids until her true value of 30 USD is exceeded. Another bidder Eve values the same item at 11 USD.\nEve's strategy is to watch the auction and submit a bid of 11 USD at the last second. Alice will\nhave no time to respond to this bid before the close of the auction and will lose the item. The\nauction mechanism is sub-optimal because it has not discovered the true price of the item and the\nitem has not gone to the actor who valued it the most."),(0,s.kt)("p",null,"On blockchains this problem may be even worse, since it potentially gives the producer of the block\nan opportunity to snipe any auction at the last concluding block by adding it themselves while\nignoring other bids. There is also the possibility of a malicious bidder or a block producer trying\nto ",(0,s.kt)("em",{parentName:"p"},"grief")," honest bidders by sniping auctions."),(0,s.kt)("p",null,"For this reason, ",(0,s.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Vickrey_auction"},"Vickrey auctions"),", a type of\nsealed-bid auction where bids are hidden and only revealed at a later phase, have emerged as a\nwell-regarded mechanic. For example, this mechanism is leveraged to auction human readable names on\nthe ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced"},"ENS"),". The Candle auction is another solution that does not require\na two-step commit and reveal schemes (a main component of Vickrey auctions), which allows smart\ncontracts to participate."),(0,s.kt)("p",null,"Candle auctions allow everyone to always know the states of the bid, but they do not reveal when the\nauction has officially ended. This helps to ensure that bidders are willing to make their true bids\nearly. Otherwise, they may find themselves in a situation where the auction was determined to have\nended before having an opportunity to bid."),(0,s.kt)("h2",{id:"network-implementation"},"Network Implementation"),(0,s.kt)("p",null,"Polkadot will use a ",(0,s.kt)("em",{parentName:"p"},"random beacon")," based on\nthe ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-cryptography#vrf"},"Verifiable Random Function (VRF)"),". The VRF will provide the base\nof the randomness, which will retroactively determine the end-time of the auction."),(0,s.kt)("p",null,"The slot durations are capped to 2 years and divided into 3-month periods.\nParachains may lease a slot for any\ncombination of periods of the slot duration. Parachains may lease more than one slot over time,\nmeaning that they could extend their lease to the network past the maximum duration by leasing a\ncontiguous slot."),(0,s.kt)("admonition",{title:"Individual parachain slots are fungible",type:"note"},(0,s.kt)("p",{parentName:"admonition"},"This means that parachains do not need to always inhabit the same slot, however they always must\nmaintain a slot to remain a parachain.")),(0,s.kt)("h2",{id:"bidding"},"Bidding"),(0,s.kt)("p",null,"Parachains or parachain teams, bid in the auction by specifying the slot range that they want to\nlease and the number of tokens they are willing to reserve. Bidders can be either ordinary accounts,\nor use the ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-crowdloans"},"crowdloan functionality")," to source tokens from the community. For a\nmore in-depth comparison between both of these options for gaining a parachain slot, check out this\nsection on\n",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-crowdloans#crowdloan-campaigns-vs-parachain-auctions"},"Crowdloan Campaigns vs Parachain Auctions"),"."),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre"},"Parachain slots at genesis\n\n --3 months--\n v v\nSlot A | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |...\nSlot B | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |...\nSlot C |__________| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |...\nSlot D |__________| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |...\nSlot E |__________|___________| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |...\n ^ ^\n ---------------------------------------------max lease-----------------------------------------\n\n")),(0,s.kt)("p",null,(0,s.kt)("em",{parentName:"p"},"Each period of the range 1 - 4 represents a\n3-month duration for a total of 2 years\n")),(0,s.kt)("p",null,"Bidders will submit a configuration of bids specifying the token amount they are willing to bond and\nfor which periods. The slot ranges may be any of the periods 1 - ",(0,s.kt)("inlineCode",{parentName:"p"},"n"),", where ",(0,s.kt)("inlineCode",{parentName:"p"},"n")," is the number of\nperiods available for a slot. (",(0,s.kt)("inlineCode",{parentName:"p"},"n"),"=\n",(0,s.kt)(l.Z,{network:"polkadot",path:"consts.auctions.leasePeriodsPerSlot",defaultValue:8,mdxType:"RPC"})," for Polkadot)\n",""),(0,s.kt)("admonition",{title:"If you bond tokens with a parachain slot, you cannot stake with those tokens. In this way,",type:"note"},(0,s.kt)("p",{parentName:"admonition"},"you pay for the parachain slot by forfeiting the opportunity to earn staking rewards.")),(0,s.kt)("p",null,"A bidder configuration for a single bidder may look like the following pseudocode example:"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-js"},"const bids = [\n {\n range: [1, 2, 3, 4, 5, 6, 7, 8],\n bond_amount: 300,\n },\n {\n range: [1, 2, 3, 4],\n bond_amount: 777,\n },\n {\n range: [2, 3, 4, 5, 6, 7],\n bond_amount: 450,\n },\n];\n")),(0,s.kt)("p",null,"The important concept to understand from this example is that bidders may submit different\nconfigurations at different prices (",(0,s.kt)("inlineCode",{parentName:"p"},"bond_amount"),"). However, only one of these bids would be\neligible to win exclusive of the others."),(0,s.kt)("p",null,"The winner selection algorithm will pick bids that may be non-overlapping in order to maximize the\namount of tokens held over the entire lease duration of the parachain slot. This means that the\nhighest bidder for any given slot lease period might not always win (see the\n",(0,s.kt)("a",{parentName:"p",href:"#examples"},"example below"),")."),(0,s.kt)("p",null,"A random number, which is based on the ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-cryptography#vrf"},"VRF")," used by\nPolkadot, is determined at each block.\nAdditionally, each auction will have a threshold that starts at 0 and increases to 1. The random\nnumber produced by the VRF is examined next to the threshold to determine if that block is the end\nof the auction within the so-called ",(0,s.kt)("em",{parentName:"p"},"ending period"),". Additionally, the VRF will pick a block from\nthe last epoch to access the state of bids which can help aid in mitigating some types of attacks\nfrom malicious validators."),(0,s.kt)("h3",{id:"examples"},"Examples"),(0,s.kt)("p",null,"There is one parachain slot available."),(0,s.kt)("p",null,"Charlie bids ",(0,s.kt)("inlineCode",{parentName:"p"},"75")," for the range 1 - 8."),(0,s.kt)("p",null,"Dave bids ",(0,s.kt)("inlineCode",{parentName:"p"},"100")," for the range 5 - 8."),(0,s.kt)("p",null,"Emily bids ",(0,s.kt)("inlineCode",{parentName:"p"},"40")," for the range 1 - 4."),(0,s.kt)("p",null,"Let's calculate each bidder's valuation according to the algorithm. We do this by multiplying the\nbond amount by the number of periods in the specified range of the bid."),(0,s.kt)("p",null,"Charlie - 75 ","*"," 8 = 600 for range 1 - 8"),(0,s.kt)("p",null,"Dave - 100 ","*"," 4 = 400 for range 5 - 8"),(0,s.kt)("p",null,"Emily - 40 ","*"," 4 = 160 for range 1 - 4"),(0,s.kt)("p",null,"Although Dave had the highest bid in accordance to token amount per period, when we do the\ncalculations we see that since he only bid for a range of 4, he would need to share the slot with\nEmily who bid much less. Together Dave and Emily's bids only equals a valuation of ",(0,s.kt)("inlineCode",{parentName:"p"},"560"),". Charlie's\nvaluation for the entire range is ",(0,s.kt)("inlineCode",{parentName:"p"},"600"),". Therefore Charlie is awarded the complete range of the\nparachain slot."),(0,s.kt)("h2",{id:"parachain-lease-extension"},"Parachain Lease Extension"),(0,s.kt)("p",null,"Before the slot lease expires, parachains have to bid and win another auction for continuity of the\nlease. To avoid any downtime in connectivity and minimize the risk of losing a subsequent auction,\nparachain teams need to plan ahead to bid for the lease extension before their current lease period\nends. Explained in the section above, each auction lets you bid for 8 LPs (Lease Periods) which\nenables two scenarios for the parachain's lease extension."),(0,s.kt)("h3",{id:"lease-extension-with-overlapping-slots"},"Lease Extension with Overlapping Slots"),(0,s.kt)("p",null,"Acquire a slot where the first lease period is before the last lease period of the current slot."),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Register a new ",(0,s.kt)("inlineCode",{parentName:"li"},"paraId")),(0,s.kt)("li",{parentName:"ul"},"Win a slot auction with the new ",(0,s.kt)("inlineCode",{parentName:"li"},"paraId"))),(0,s.kt)("p",null,"The parachain team has access to two slots:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"one that will end soon"),(0,s.kt)("li",{parentName:"ul"},"one that just started")),(0,s.kt)("p",null,"Both slots have at least one LP in common. When the old slot transitions to their last LP, the\nparachain can ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/pull/4772"},"swap")," the slots. This can be done\nvia ",(0,s.kt)("a",{parentName:"p",href:"https://kusama.polkassembly.io/post/1491"},"on-chain governance"),". The ",(0,s.kt)("inlineCode",{parentName:"p"},"swap")," call is available in\nthe ",(0,s.kt)("inlineCode",{parentName:"p"},"registrar")," pallet."),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"Parachain Slot Swap",src:n(11308).Z,width:"1286",height:"896"})),(0,s.kt)("admonition",{title:"Any two parachains can swap their slots via XCM",type:"note"},(0,s.kt)("p",{parentName:"admonition"},"The ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/pull/4772"},"slot swap via XCM")," requires two live\nparachains to send an XCM message to the relay chain to approve the swap. A parachain team with\naccess to two overlapping slots can start a shell parachain on the new slot and swap it with their\nactual parachain on the old slot, thus ensuring continuity of the lease.")),(0,s.kt)("h3",{id:"lease-extension-with-non-overlapping-slots"},"Lease Extension with Non-Overlapping Slots"),(0,s.kt)("p",null,"Acquire a slot where the first LP starts right after the end of the last LP of the current slot. In\nthis case, the parachain can bid directly with their current ",(0,s.kt)("inlineCode",{parentName:"p"},"paraId"),", and it will be automatically\nextended without the need of swapping. This method has the advantage of not having superfluous LP's\non different slots owned by the same team, however it has the disadvantage of losing flexibility on\nwhen to win a new slot: if the team does not win the exact slot, then it will suffer some downtime\nuntil it wins a new slot."),(0,s.kt)("h2",{id:"resources"},"Resources"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000182287-how-does-a-parachain-slots-auction-work-"},"How do Parachain Slot Auctions Work")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://research.web3.foundation/Polkadot/overview/parachain-allocation"},"Parachain Allocation")," -\nW3F research page on parachain allocation that goes more in depth to the mechanism"),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://polkadot.network/blog/research-update-the-case-for-candle-auctions/"},"Research Update: The Case for Candle Auctions")," -\nW3F breakdown and research update about candle auctions"),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3846363"},"Front-Running, Smart Contracts, and Candle Auctions"),"\nW3F Research team discusses how to remedy current blockchain auction setbacks with candle auctions")))}L.isMDXComponent=!0},11308:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/para-swap-3c765fb9e6860c7d7489a758af065cb0.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/145746f5.6a43fd77.js b/assets/js/145746f5.6a43fd77.js deleted file mode 100644 index aabd0f1a9a2a..000000000000 --- a/assets/js/145746f5.6a43fd77.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[691],{47940:(t,e,a)=>{"use strict";a.d(e,{Z:()=>u});var n=a(74165),r=a(15861),l=a(67294),i=a(87152),o=a(17145),s=a(67425);function d(t,e,a){return p.apply(this,arguments)}function p(){return(p=(0,r.Z)((0,n.Z)().mark((function t(e,a,r){var l,s,d,p,m;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:l=void 0,s=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return l="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return l="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return l="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return l="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==l){t.next=18;break}return t.abrupt("return");case 18:return d=new i.U(l),t.next=21,o.G.create({provider:d});case 21:p=t.sent,(m=a.split(".")).forEach((function(t){t in p&&(p=p[t])})),t.t1=m[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return s=p.toString(),t.abrupt("break",35);case 29:return t.next=31,p();case 31:return s=(s=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+m[0]+") in "+a);case 35:return t.abrupt("return",s);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function m(t,e,a,n){switch(e){case"humanReadable":(0,s.HumanReadable)(t,a,n);break;case"precise":(0,s.Precise)(t,a,n);break;case"blocksToDays":(0,s.BlocksToDays)(t,n);break;case"percentage":(0,s.Percentage)(t,n);break;case"arrayLength":(0,s.ArrayLength)(t,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(t){var e=t.network,a=t.path,i=t.defaultValue,o=t.filter,s=void 0===o?void 0:o,p=(0,l.useState)(""),u=p[0],k=p[1];return e=e.toLowerCase(),(0,l.useEffect)((function(){void 0!==s?m(i.toString(),s,e,k):k(i.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var l=function(){var t=(0,r.Z)((0,n.Z)().mark((function t(){var r;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,d(e,a,k);case 2:if(void 0!==(r=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==s?m(r,s,e,k):k(r);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{l()}catch(o){console.log(o)}}}),[]),u}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,a,n){var r=void 0;if("polkadot"===a||"statemint"===a)r=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");r=6}t=parseFloat(t),n((t=Number.isInteger(t/e[a].precision)?t/e[a].precision+" "+e[a].symbol:(t/e[a].precision).toFixed(r)+" "+e[a].symbol).toString())},Precise:function(t,a,n){n(t=(t=parseFloat(t))/e[a].precision+" "+e[a].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},1735:(t,e,a)=>{"use strict";a.r(e),a.d(e,{assets:()=>m,contentTitle:()=>d,default:()=>g,frontMatter:()=>s,metadata:()=>p,toc:()=>u});var n=a(87462),r=a(63366),l=(a(67294),a(3905)),i=a(47940),o=["components"],s={id:"maintain-polkadot-parameters",title:"Polkadot Parameters",sidebar_label:"Parameters",description:"A description about fundamental Polkadot parameters.",keywords:["parameters","actions","attributes","behaviors"],slug:"../maintain-polkadot-parameters"},d=void 0,p={unversionedId:"maintain/maintain-polkadot-parameters",id:"maintain/maintain-polkadot-parameters",title:"Polkadot Parameters",description:"A description about fundamental Polkadot parameters.",source:"@site/../docs/maintain/maintain-polkadot-parameters.md",sourceDirName:"maintain",slug:"/maintain-polkadot-parameters",permalink:"/docs/maintain-polkadot-parameters",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/maintain-polkadot-parameters.md",tags:[],version:"current",lastUpdatedBy:"github-actions[bot]",lastUpdatedAt:1679293124,formattedLastUpdatedAt:"Mar 20, 2023",frontMatter:{id:"maintain-polkadot-parameters",title:"Polkadot Parameters",sidebar_label:"Parameters",description:"A description about fundamental Polkadot parameters.",keywords:["parameters","actions","attributes","behaviors"],slug:"../maintain-polkadot-parameters"},sidebar:"docs",previous:{title:"Network Maintainers",permalink:"/docs/maintain-index"},next:{title:"Node Endpoints",permalink:"/docs/maintain-endpoints"}},m={},u=[{value:"Periods of common actions and attributes",id:"periods-of-common-actions-and-attributes",level:3},{value:"Accounts, Identity and Crowdloans",id:"accounts-identity-and-crowdloans",level:3},{value:"Governance",id:"governance",level:3},{value:"Staking, Validating, and Nominating",id:"staking-validating-and-nominating",level:3},{value:"Parachains",id:"parachains",level:3},{value:"Treasury",id:"treasury",level:3},{value:"Precision",id:"precision",level:3}],k={toc:u},c="wrapper";function g(t){var e=t.components,a=(0,r.Z)(t,o);return(0,l.kt)(c,(0,n.Z)({},k,a,{components:e,mdxType:"MDXLayout"}),(0,l.kt)("p",null,"Many of these parameter values can be updated via on-chain governance. If you require absolute\ncertainty of these parameter values, it is recommended you directly check the constants by looking\nat the ",(0,l.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate/constants"},"chain state")," and/or\n",(0,l.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate"},"storage"),"."),(0,l.kt)("h3",{id:"periods-of-common-actions-and-attributes"},"Periods of common actions and attributes"),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"NOTE: Polkadot generally runs at ","\xbc","th the speed of Kusama, except in the time slot duration\nitself. See ",(0,l.kt)("a",{parentName:"em",href:"https://guide.kusama.network/docs/kusama-parameters/"},"Kusama Parameters")," for more\ndetails on how Polkadot's parameters differ from Kusama's.")),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Slot: 6 seconds ","*","(generally one block per slot, although see note below)"),(0,l.kt)("li",{parentName:"ul"},"Epoch: 4 hours (2_400 slots x 6 seconds)"),(0,l.kt)("li",{parentName:"ul"},"Session: 4 hours (Session and Epoch lengths are the same)"),(0,l.kt)("li",{parentName:"ul"},"Era: 24 hours (6 sessions per Era, 2_400 slots x 6 epochs x 6 seconds)")),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Polkadot"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots","*"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Slot"),(0,l.kt)("td",{parentName:"tr",align:null},"6 seconds"),(0,l.kt)("td",{parentName:"tr",align:null},"1")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Epoch"),(0,l.kt)("td",{parentName:"tr",align:null},"4 hours"),(0,l.kt)("td",{parentName:"tr",align:null},"2_400")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Session"),(0,l.kt)("td",{parentName:"tr",align:null},"4 hours"),(0,l.kt)("td",{parentName:"tr",align:null},"2_400")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Era"),(0,l.kt)("td",{parentName:"tr",align:null},"24 hours"),(0,l.kt)("td",{parentName:"tr",align:null},"14_400")))),(0,l.kt)("p",null,"*",(0,l.kt)("em",{parentName:"p"},"A maximum of one block per slot can be in a canonical chain. Occasionally, a slot will be without\na block in the chain. Thus, the times given are ",(0,l.kt)("em",{parentName:"em"},"estimates"),". See\n",(0,l.kt)("a",{parentName:"em",href:"/docs/learn-consensus"},"Consensus")," for more details.")),(0,l.kt)("h3",{id:"accounts-identity-and-crowdloans"},"Accounts, Identity and Crowdloans"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"The ",(0,l.kt)("a",{parentName:"li",href:"/docs/learn-accounts#existential-deposit-and-reaping"},"Existential Deposit")," is\n",(0,l.kt)(i.Z,{network:"polkadot",path:"consts.balances.existentialDeposit",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),""),(0,l.kt)("li",{parentName:"ul"},"The deposit required to set an Identity is\n",(0,l.kt)(i.Z,{network:"polkadot",path:"consts.identity.basicDeposit",defaultValue:20258e7,filter:"humanReadable",mdxType:"RPC"}),""),(0,l.kt)("li",{parentName:"ul"},"The minimum contribution required to participate in a crowdloan is\n",(0,l.kt)(i.Z,{network:"polkadot",path:"consts.crowdloan.minContribution",defaultValue:5e10,filter:"humanReadable",mdxType:"RPC"}),"")),(0,l.kt)("h3",{id:"governance"},"Governance"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Democracy"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Voting period"),(0,l.kt)("td",{parentName:"tr",align:null},"28 days"),(0,l.kt)("td",{parentName:"tr",align:null},"403_200"),(0,l.kt)("td",{parentName:"tr",align:null},"How long the public can vote on a referendum.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Launch period"),(0,l.kt)("td",{parentName:"tr",align:null},"28 days"),(0,l.kt)("td",{parentName:"tr",align:null},"403_200"),(0,l.kt)("td",{parentName:"tr",align:null},"How long the public can select which proposal to hold a referendum on, i.e., every week, the highest-weighted proposal will be selected to have a referendum.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Enactment period"),(0,l.kt)("td",{parentName:"tr",align:null},"28 days"),(0,l.kt)("td",{parentName:"tr",align:null},"403_200"),(0,l.kt)("td",{parentName:"tr",align:null},"Time it takes for a successful referendum to be implemented on the network.")))),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Council"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Term duration"),(0,l.kt)("td",{parentName:"tr",align:null},"7 days"),(0,l.kt)("td",{parentName:"tr",align:null},"100_800"),(0,l.kt)("td",{parentName:"tr",align:null},"The length of a council member's term until the next election round.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Voting period"),(0,l.kt)("td",{parentName:"tr",align:null},"7 days"),(0,l.kt)("td",{parentName:"tr",align:null},"100_800"),(0,l.kt)("td",{parentName:"tr",align:null},"The council's voting period for motions.")))),(0,l.kt)("p",null,"The Polkadot Council consists of up to 13 members and up to 20 runners up."),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Technical committee"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Cool-off period"),(0,l.kt)("td",{parentName:"tr",align:null},"7 days"),(0,l.kt)("td",{parentName:"tr",align:null},"100_800"),(0,l.kt)("td",{parentName:"tr",align:null},"The time a veto from the technical committee lasts before the proposal can be submitted again.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Emergency voting period"),(0,l.kt)("td",{parentName:"tr",align:null},"3 hours"),(0,l.kt)("td",{parentName:"tr",align:null},"1_800"),(0,l.kt)("td",{parentName:"tr",align:null},"The voting period after the technical committee expedites voting.")))),(0,l.kt)("h3",{id:"staking-validating-and-nominating"},"Staking, Validating, and Nominating"),(0,l.kt)("p",null,"The maximum number of validators that can be nominated by a nominator is\n",(0,l.kt)(i.Z,{network:"polkadot",path:"consts.staking.maxNominations",defaultValue:16,mdxType:"RPC"}),".\n",""),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Polkadot"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Term duration"),(0,l.kt)("td",{parentName:"tr",align:null},"1 Day"),(0,l.kt)("td",{parentName:"tr",align:null},"14_400"),(0,l.kt)("td",{parentName:"tr",align:null},"The time for which a validator is in the set after being elected. Note, this duration can be shortened in the case that a validator misbehaves.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Nomination period"),(0,l.kt)("td",{parentName:"tr",align:null},"1 Day"),(0,l.kt)("td",{parentName:"tr",align:null},"14_400"),(0,l.kt)("td",{parentName:"tr",align:null},"How often a new validator set is elected according to Phragm\xe9n's method.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Bonding duration"),(0,l.kt)("td",{parentName:"tr",align:null},"28 days"),(0,l.kt)("td",{parentName:"tr",align:null},"403_200"),(0,l.kt)("td",{parentName:"tr",align:null},"How long until your funds will be transferrable after unbonding. Note that the bonding duration is defined in eras, not directly by slots.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Slash defer duration"),(0,l.kt)("td",{parentName:"tr",align:null},"28 days"),(0,l.kt)("td",{parentName:"tr",align:null},"403_200"),(0,l.kt)("td",{parentName:"tr",align:null},'Prevents overslashing and validators "escaping" and getting their nominators slashed with no repercussions to themselves. Note that the bonding duration is defined in eras, not directly by slots.')))),(0,l.kt)("h3",{id:"parachains"},"Parachains"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Crowdloans and Auctions"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Auction duration"),(0,l.kt)("td",{parentName:"tr",align:null},"7 days"),(0,l.kt)("td",{parentName:"tr",align:null},"100_800"),(0,l.kt)("td",{parentName:"tr",align:null},"The total duration of the slot auction, subject to the candle auction mechanism.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Opening period"),(0,l.kt)("td",{parentName:"tr",align:null},"2 days"),(0,l.kt)("td",{parentName:"tr",align:null},"28_800"),(0,l.kt)("td",{parentName:"tr",align:null},"The opening period of the slot auction.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Ending period"),(0,l.kt)("td",{parentName:"tr",align:null},"5 days"),(0,l.kt)("td",{parentName:"tr",align:null},"72_000"),(0,l.kt)("td",{parentName:"tr",align:null},"The ending period of the slot auction.")))),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Parachain Slot"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Lease period"),(0,l.kt)("td",{parentName:"tr",align:null},"12 weeks"),(0,l.kt)("td",{parentName:"tr",align:null},"1_209_600"),(0,l.kt)("td",{parentName:"tr",align:null},"The length of one lease period in a parachain slot.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Total slot duration"),(0,l.kt)("td",{parentName:"tr",align:null},"2 years"),(0,l.kt)("td",{parentName:"tr",align:null},"10_512_000"),(0,l.kt)("td",{parentName:"tr",align:null},"The maximum duration a parachain can lease by winning a slot auction (8 lease periods).")))),(0,l.kt)("h3",{id:"treasury"},"Treasury"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Treasury"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Periods between spends"),(0,l.kt)("td",{parentName:"tr",align:null},"24 days"),(0,l.kt)("td",{parentName:"tr",align:null},"345_600"),(0,l.kt)("td",{parentName:"tr",align:null},"When the treasury can spend again after spending previously.")))),(0,l.kt)("p",null,"Burn percentage is currently ",(0,l.kt)("inlineCode",{parentName:"p"},"1.00%"),"."),(0,l.kt)("h3",{id:"precision"},"Precision"),(0,l.kt)("p",null,"DOT have 10 decimals of precision. In other words, 10 ","*","*"," 10 (10_000_000_000 or ten billion)\nPlancks make up a DOT."),(0,l.kt)("p",null,"The denomination of DOT was changed from 12 decimals of precision at block #1,248,328 in an event\nknown as ",(0,l.kt)("em",{parentName:"p"},"Denomination Day"),". See ",(0,l.kt)("a",{parentName:"p",href:"/docs/learn-redenomination"},"Redenomination")," for details."))}g.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/145746f5.ef5e99b3.js b/assets/js/145746f5.ef5e99b3.js new file mode 100644 index 000000000000..7cf457482a29 --- /dev/null +++ b/assets/js/145746f5.ef5e99b3.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[691],{47940:(t,e,a)=>{"use strict";a.d(e,{Z:()=>u});var n=a(74165),r=a(15861),l=a(67294),i=a(87152),o=a(17145),s=a(67425);function d(t,e,a){return p.apply(this,arguments)}function p(){return(p=(0,r.Z)((0,n.Z)().mark((function t(e,a,r){var l,s,d,p,m;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:l=void 0,s=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return l="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return l="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return l="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return l="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==l){t.next=18;break}return t.abrupt("return");case 18:return d=new i.U(l),t.next=21,o.G.create({provider:d});case 21:p=t.sent,(m=a.split(".")).forEach((function(t){t in p&&(p=p[t])})),t.t1=m[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return s=p.toString(),t.abrupt("break",35);case 29:return t.next=31,p();case 31:return s=(s=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+m[0]+") in "+a);case 35:return t.abrupt("return",s);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function m(t,e,a,n){switch(e){case"humanReadable":(0,s.HumanReadable)(t,a,n);break;case"precise":(0,s.Precise)(t,a,n);break;case"blocksToDays":(0,s.BlocksToDays)(t,n);break;case"percentage":(0,s.Percentage)(t,n);break;case"permillToPercent":(0,s.PermillToPercent)(t,n);break;case"arrayLength":(0,s.ArrayLength)(t,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(t){var e=t.network,a=t.path,i=t.defaultValue,o=t.filter,s=void 0===o?void 0:o,p=(0,l.useState)(""),u=p[0],k=p[1];return e=e.toLowerCase(),(0,l.useEffect)((function(){void 0!==s?m(i.toString(),s,e,k):k(i.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var l=function(){var t=(0,r.Z)((0,n.Z)().mark((function t(){var r;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,d(e,a,k);case 2:if(void 0!==(r=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==s?m(r,s,e,k):k(r);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{l()}catch(o){console.log(o)}}}),[]),u}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,a,n){var r=void 0;if("polkadot"===a||"statemint"===a)r=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");r=6}t=parseFloat(t),n((t=Number.isInteger(t/e[a].precision)?t/e[a].precision+" "+e[a].symbol:(t/e[a].precision).toFixed(r)+" "+e[a].symbol).toString())},Precise:function(t,a,n){n(t=(t=parseFloat(t))/e[a].precision+" "+e[a].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},PermillToPercent:function(t,e){e((t/=1e4).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},1735:(t,e,a)=>{"use strict";a.r(e),a.d(e,{assets:()=>m,contentTitle:()=>d,default:()=>g,frontMatter:()=>s,metadata:()=>p,toc:()=>u});var n=a(87462),r=a(63366),l=(a(67294),a(3905)),i=a(47940),o=["components"],s={id:"maintain-polkadot-parameters",title:"Polkadot Parameters",sidebar_label:"Parameters",description:"A description about fundamental Polkadot parameters.",keywords:["parameters","actions","attributes","behaviors"],slug:"../maintain-polkadot-parameters"},d=void 0,p={unversionedId:"maintain/maintain-polkadot-parameters",id:"maintain/maintain-polkadot-parameters",title:"Polkadot Parameters",description:"A description about fundamental Polkadot parameters.",source:"@site/../docs/maintain/maintain-polkadot-parameters.md",sourceDirName:"maintain",slug:"/maintain-polkadot-parameters",permalink:"/docs/maintain-polkadot-parameters",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/maintain-polkadot-parameters.md",tags:[],version:"current",lastUpdatedBy:"github-actions[bot]",lastUpdatedAt:1679293124,formattedLastUpdatedAt:"Mar 20, 2023",frontMatter:{id:"maintain-polkadot-parameters",title:"Polkadot Parameters",sidebar_label:"Parameters",description:"A description about fundamental Polkadot parameters.",keywords:["parameters","actions","attributes","behaviors"],slug:"../maintain-polkadot-parameters"},sidebar:"docs",previous:{title:"Network Maintainers",permalink:"/docs/maintain-index"},next:{title:"Node Endpoints",permalink:"/docs/maintain-endpoints"}},m={},u=[{value:"Periods of common actions and attributes",id:"periods-of-common-actions-and-attributes",level:3},{value:"Accounts, Identity and Crowdloans",id:"accounts-identity-and-crowdloans",level:3},{value:"Governance",id:"governance",level:3},{value:"Staking, Validating, and Nominating",id:"staking-validating-and-nominating",level:3},{value:"Parachains",id:"parachains",level:3},{value:"Treasury",id:"treasury",level:3},{value:"Precision",id:"precision",level:3}],k={toc:u},c="wrapper";function g(t){var e=t.components,a=(0,r.Z)(t,o);return(0,l.kt)(c,(0,n.Z)({},k,a,{components:e,mdxType:"MDXLayout"}),(0,l.kt)("p",null,"Many of these parameter values can be updated via on-chain governance. If you require absolute\ncertainty of these parameter values, it is recommended you directly check the constants by looking\nat the ",(0,l.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate/constants"},"chain state")," and/or\n",(0,l.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate"},"storage"),"."),(0,l.kt)("h3",{id:"periods-of-common-actions-and-attributes"},"Periods of common actions and attributes"),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"NOTE: Polkadot generally runs at ","\xbc","th the speed of Kusama, except in the time slot duration\nitself. See ",(0,l.kt)("a",{parentName:"em",href:"https://guide.kusama.network/docs/kusama-parameters/"},"Kusama Parameters")," for more\ndetails on how Polkadot's parameters differ from Kusama's.")),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Slot: 6 seconds ","*","(generally one block per slot, although see note below)"),(0,l.kt)("li",{parentName:"ul"},"Epoch: 4 hours (2_400 slots x 6 seconds)"),(0,l.kt)("li",{parentName:"ul"},"Session: 4 hours (Session and Epoch lengths are the same)"),(0,l.kt)("li",{parentName:"ul"},"Era: 24 hours (6 sessions per Era, 2_400 slots x 6 epochs x 6 seconds)")),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Polkadot"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots","*"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Slot"),(0,l.kt)("td",{parentName:"tr",align:null},"6 seconds"),(0,l.kt)("td",{parentName:"tr",align:null},"1")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Epoch"),(0,l.kt)("td",{parentName:"tr",align:null},"4 hours"),(0,l.kt)("td",{parentName:"tr",align:null},"2_400")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Session"),(0,l.kt)("td",{parentName:"tr",align:null},"4 hours"),(0,l.kt)("td",{parentName:"tr",align:null},"2_400")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Era"),(0,l.kt)("td",{parentName:"tr",align:null},"24 hours"),(0,l.kt)("td",{parentName:"tr",align:null},"14_400")))),(0,l.kt)("p",null,"*",(0,l.kt)("em",{parentName:"p"},"A maximum of one block per slot can be in a canonical chain. Occasionally, a slot will be without\na block in the chain. Thus, the times given are ",(0,l.kt)("em",{parentName:"em"},"estimates"),". See\n",(0,l.kt)("a",{parentName:"em",href:"/docs/learn-consensus"},"Consensus")," for more details.")),(0,l.kt)("h3",{id:"accounts-identity-and-crowdloans"},"Accounts, Identity and Crowdloans"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"The ",(0,l.kt)("a",{parentName:"li",href:"/docs/learn-accounts#existential-deposit-and-reaping"},"Existential Deposit")," is\n",(0,l.kt)(i.Z,{network:"polkadot",path:"consts.balances.existentialDeposit",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),""),(0,l.kt)("li",{parentName:"ul"},"The deposit required to set an Identity is\n",(0,l.kt)(i.Z,{network:"polkadot",path:"consts.identity.basicDeposit",defaultValue:20258e7,filter:"humanReadable",mdxType:"RPC"}),""),(0,l.kt)("li",{parentName:"ul"},"The minimum contribution required to participate in a crowdloan is\n",(0,l.kt)(i.Z,{network:"polkadot",path:"consts.crowdloan.minContribution",defaultValue:5e10,filter:"humanReadable",mdxType:"RPC"}),"")),(0,l.kt)("h3",{id:"governance"},"Governance"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Democracy"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Voting period"),(0,l.kt)("td",{parentName:"tr",align:null},"28 days"),(0,l.kt)("td",{parentName:"tr",align:null},"403_200"),(0,l.kt)("td",{parentName:"tr",align:null},"How long the public can vote on a referendum.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Launch period"),(0,l.kt)("td",{parentName:"tr",align:null},"28 days"),(0,l.kt)("td",{parentName:"tr",align:null},"403_200"),(0,l.kt)("td",{parentName:"tr",align:null},"How long the public can select which proposal to hold a referendum on, i.e., every week, the highest-weighted proposal will be selected to have a referendum.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Enactment period"),(0,l.kt)("td",{parentName:"tr",align:null},"28 days"),(0,l.kt)("td",{parentName:"tr",align:null},"403_200"),(0,l.kt)("td",{parentName:"tr",align:null},"Time it takes for a successful referendum to be implemented on the network.")))),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Council"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Term duration"),(0,l.kt)("td",{parentName:"tr",align:null},"7 days"),(0,l.kt)("td",{parentName:"tr",align:null},"100_800"),(0,l.kt)("td",{parentName:"tr",align:null},"The length of a council member's term until the next election round.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Voting period"),(0,l.kt)("td",{parentName:"tr",align:null},"7 days"),(0,l.kt)("td",{parentName:"tr",align:null},"100_800"),(0,l.kt)("td",{parentName:"tr",align:null},"The council's voting period for motions.")))),(0,l.kt)("p",null,"The Polkadot Council consists of up to 13 members and up to 20 runners up."),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Technical committee"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Cool-off period"),(0,l.kt)("td",{parentName:"tr",align:null},"7 days"),(0,l.kt)("td",{parentName:"tr",align:null},"100_800"),(0,l.kt)("td",{parentName:"tr",align:null},"The time a veto from the technical committee lasts before the proposal can be submitted again.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Emergency voting period"),(0,l.kt)("td",{parentName:"tr",align:null},"3 hours"),(0,l.kt)("td",{parentName:"tr",align:null},"1_800"),(0,l.kt)("td",{parentName:"tr",align:null},"The voting period after the technical committee expedites voting.")))),(0,l.kt)("h3",{id:"staking-validating-and-nominating"},"Staking, Validating, and Nominating"),(0,l.kt)("p",null,"The maximum number of validators that can be nominated by a nominator is\n",(0,l.kt)(i.Z,{network:"polkadot",path:"consts.staking.maxNominations",defaultValue:16,mdxType:"RPC"}),".\n",""),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Polkadot"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Term duration"),(0,l.kt)("td",{parentName:"tr",align:null},"1 Day"),(0,l.kt)("td",{parentName:"tr",align:null},"14_400"),(0,l.kt)("td",{parentName:"tr",align:null},"The time for which a validator is in the set after being elected. Note, this duration can be shortened in the case that a validator misbehaves.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Nomination period"),(0,l.kt)("td",{parentName:"tr",align:null},"1 Day"),(0,l.kt)("td",{parentName:"tr",align:null},"14_400"),(0,l.kt)("td",{parentName:"tr",align:null},"How often a new validator set is elected according to Phragm\xe9n's method.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Bonding duration"),(0,l.kt)("td",{parentName:"tr",align:null},"28 days"),(0,l.kt)("td",{parentName:"tr",align:null},"403_200"),(0,l.kt)("td",{parentName:"tr",align:null},"How long until your funds will be transferrable after unbonding. Note that the bonding duration is defined in eras, not directly by slots.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Slash defer duration"),(0,l.kt)("td",{parentName:"tr",align:null},"28 days"),(0,l.kt)("td",{parentName:"tr",align:null},"403_200"),(0,l.kt)("td",{parentName:"tr",align:null},'Prevents overslashing and validators "escaping" and getting their nominators slashed with no repercussions to themselves. Note that the bonding duration is defined in eras, not directly by slots.')))),(0,l.kt)("h3",{id:"parachains"},"Parachains"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Crowdloans and Auctions"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Auction duration"),(0,l.kt)("td",{parentName:"tr",align:null},"7 days"),(0,l.kt)("td",{parentName:"tr",align:null},"100_800"),(0,l.kt)("td",{parentName:"tr",align:null},"The total duration of the slot auction, subject to the candle auction mechanism.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Opening period"),(0,l.kt)("td",{parentName:"tr",align:null},"2 days"),(0,l.kt)("td",{parentName:"tr",align:null},"28_800"),(0,l.kt)("td",{parentName:"tr",align:null},"The opening period of the slot auction.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Ending period"),(0,l.kt)("td",{parentName:"tr",align:null},"5 days"),(0,l.kt)("td",{parentName:"tr",align:null},"72_000"),(0,l.kt)("td",{parentName:"tr",align:null},"The ending period of the slot auction.")))),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Parachain Slot"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Lease period"),(0,l.kt)("td",{parentName:"tr",align:null},"12 weeks"),(0,l.kt)("td",{parentName:"tr",align:null},"1_209_600"),(0,l.kt)("td",{parentName:"tr",align:null},"The length of one lease period in a parachain slot.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Total slot duration"),(0,l.kt)("td",{parentName:"tr",align:null},"2 years"),(0,l.kt)("td",{parentName:"tr",align:null},"10_512_000"),(0,l.kt)("td",{parentName:"tr",align:null},"The maximum duration a parachain can lease by winning a slot auction (8 lease periods).")))),(0,l.kt)("h3",{id:"treasury"},"Treasury"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Treasury"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Periods between spends"),(0,l.kt)("td",{parentName:"tr",align:null},"24 days"),(0,l.kt)("td",{parentName:"tr",align:null},"345_600"),(0,l.kt)("td",{parentName:"tr",align:null},"When the treasury can spend again after spending previously.")))),(0,l.kt)("p",null,"Burn percentage is currently ",(0,l.kt)("inlineCode",{parentName:"p"},"1.00%"),"."),(0,l.kt)("h3",{id:"precision"},"Precision"),(0,l.kt)("p",null,"DOT have 10 decimals of precision. In other words, 10 ","*","*"," 10 (10_000_000_000 or ten billion)\nPlancks make up a DOT."),(0,l.kt)("p",null,"The denomination of DOT was changed from 12 decimals of precision at block #1,248,328 in an event\nknown as ",(0,l.kt)("em",{parentName:"p"},"Denomination Day"),". See ",(0,l.kt)("a",{parentName:"p",href:"/docs/learn-redenomination"},"Redenomination")," for details."))}g.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/1646726c.81226cb7.js b/assets/js/1646726c.81226cb7.js deleted file mode 100644 index 022d2c37b4bf..000000000000 --- a/assets/js/1646726c.81226cb7.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[2169],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>p});var n=a(74165),o=a(15861),i=a(67294),r=a(87152),s=a(17145),l=a(67425);function d(e,t,a){return h.apply(this,arguments)}function h(){return(h=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var i,l,d,h,c;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return d=new r.U(i),e.next=21,s.G.create({provider:d});case 21:h=e.sent,(c=a.split(".")).forEach((function(e){e in h&&(h=h[e])})),e.t1=c[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=h.toString(),e.abrupt("break",35);case 29:return e.next=31,h();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function c(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(e){var t=e.network,a=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,h=(0,i.useState)(""),p=h[0],u=h[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?c(r.toString(),l,t,u):u(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t,a,u);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?c(o,l,t,u):u(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),p}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},78381:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>m,frontMatter:()=>l,metadata:()=>h,toc:()=>p});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),r=a(47940),s=["components"],l={id:"learn-staking",title:"Introduction to Staking",sidebar_label:"Introduction to Staking",description:"Overview of Staking and NPoS on Polkadot.",keywords:["staking","stake","nominate","nominating","NPoS","faq"],slug:"../learn-staking"},d=void 0,h={unversionedId:"learn/learn-staking",id:"learn/learn-staking",title:"Introduction to Staking",description:"Overview of Staking and NPoS on Polkadot.",source:"@site/../docs/learn/learn-staking.md",sourceDirName:"learn",slug:"/learn-staking",permalink:"/docs/learn-staking",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-staking.md",tags:[],version:"current",lastUpdatedBy:"github-actions[bot]",lastUpdatedAt:1697437685,formattedLastUpdatedAt:"Oct 16, 2023",frontMatter:{id:"learn-staking",title:"Introduction to Staking",sidebar_label:"Introduction to Staking",description:"Overview of Staking and NPoS on Polkadot.",keywords:["staking","stake","nominate","nominating","NPoS","faq"],slug:"../learn-staking"},sidebar:"docs",previous:{title:"Staking",permalink:"/docs/learn-staking-index"},next:{title:"Nomination Pools",permalink:"/docs/learn-nomination-pools"}},c={},p=[{value:"Proof-of-Stake (PoS)",id:"proof-of-stake-pos",level:2},{value:"Nominated Proof-of-Stake (NPoS)",id:"nominated-proof-of-stake-npos",level:2},{value:"Nominating Validators",id:"nominating-validators",level:3},{value:"Eras and Sessions",id:"eras-and-sessions",level:3},{value:"Staking Rewards",id:"staking-rewards",level:3},{value:"Skin in the game when Staking",id:"skin-in-the-game-when-staking",level:3},{value:"Being a Nominator",id:"being-a-nominator",level:2},{value:"Tasks and Responsibilities of a Nominator",id:"tasks-and-responsibilities-of-a-nominator",level:3},{value:"Selection of Validators",id:"selection-of-validators",level:3},{value:"Validator Selection Criteria",id:"validator-selection-criteria",level:4},{value:"Network Providers",id:"network-providers",level:4},{value:"Keeping Track of Nominated Validators",id:"keeping-track-of-nominated-validators",level:4},{value:"Stash Account and Staking Proxy",id:"stash-account-and-staking-proxy",level:3},{value:"Claiming Staking Rewards",id:"claiming-staking-rewards",level:3},{value:"Slashing",id:"slashing",level:3},{value:"Chilling",id:"chilling",level:3},{value:"Fast Unstake",id:"fast-unstake",level:3},{value:"Why and Why not to Stake?",id:"why-and-why-not-to-stake",level:2},{value:"Pros of Staking",id:"pros-of-staking",level:3},{value:"Cons of Staking",id:"cons-of-staking",level:3},{value:"How many Validators?",id:"how-many-validators",level:2},{value:"Why am I not receiving rewards?",id:"why-am-i-not-receiving-rewards",level:2},{value:"Staking FAQ",id:"staking-faq",level:2},{value:"Resources",id:"resources",level:2}],u={toc:p},k="wrapper";function m(e){var t=e.components,l=(0,o.Z)(e,s);return(0,i.kt)(k,(0,n.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{title:"New to Staking?",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"Start your staking journey or explore more information about staking on\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/staking/"},"Polkadot's Home Page"),". Discover the new\n",(0,i.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/#/overview"},"Staking Dashboard")," that makes staking much easier and\ncheck this\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182104"},"extensive article list")," to\nhelp you get started. The dashboard supports ",(0,i.kt)("a",{parentName:"p",href:"/docs/ledger"},"Ledger")," devices natively and\ndoes not require an extension or wallet as an interface.")),(0,i.kt)("admonition",{title:"Stake through Nomination Pools",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The minimum amount required to become an active nominator and earn rewards may change from era to\nera.\nIt is currently ",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.minimumActiveStake",defaultValue:3269785922095,filter:"humanReadable",mdxType:"RPC"})),".\n","\nIf you have less DOT than the minimum active\nnomination and still want to participate in staking, you can join the nomination pools. You can now\nstake on Polkadot natively with just\n",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)(r.Z,{network:"polkadot",path:"query.nominationPools.minJoinBond",filter:"humanReadable",defaultValue:1e10,mdxType:"RPC"})),"\n","\nin the nomination pools and earn staking rewards. For additional information, check out\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/nomination-pools-are-live-stake-natively-with-just-1-dot/"},"this blog post"),".\nCheck the wiki doc on ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pools")," for more information.")),(0,i.kt)("p",null,"Here you will learn about what staking is, why it is important and how it works on\nPolkadot."),(0,i.kt)("h2",{id:"proof-of-stake-pos"},"Proof-of-Stake (PoS)"),(0,i.kt)("p",null,"Blockchain networks use ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus/#why-do-we-need-consensus"},"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:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Block production"),", i.e. the way multiple blocks candidates are produced, and"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Block finality"),", i.e. the way only one block out of many candidates is selected and added to\nthe canonical chain (see ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-consensus/#probabilistic-vs-provable-finality"},"this")," article\nfor more information about finality).")),(0,i.kt)("p",null,"Proof-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."),(0,i.kt)("p",null,"In PoS networks like Polkadot the security of\nthe network depends on the amount of capital locked on the chain: the more the capital locked, the\nlower the chance of an attack on the network, as the attacker needs to incur a heavy loss to\norchestrate a successful attack (more on this later on). The process of locking tokens on the chain\nis called ",(0,i.kt)("strong",{parentName:"p"},"staking"),"."),(0,i.kt)("p",null,"Similar to the miners in PoW networks, PoS networks have ",(0,i.kt)("strong",{parentName:"p"},"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 ",(0,i.kt)("strong",{parentName:"p"},"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."),(0,i.kt)("p",null,'PoS 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',(0,i.kt)("strong",{parentName:"p"},"slashed"),", and depending on the gravity of the situation, their stake can be partly or fully\nconfiscated by the network. It is not in a staker's economic interest to orchestrate an attack and\nrisk losing tokens. Any rational actor staking on the network would want to get rewarded, and the\nPoS network rewards good behavior and punishes bad behavior."),(0,i.kt)("h2",{id:"nominated-proof-of-stake-npos"},"Nominated Proof-of-Stake (NPoS)"),(0,i.kt)("p",null,"Polkadot implements\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus/#nominated-proof-of-stake"},"Nominated Proof-of-Stake (NPoS)"),", a relatively novel\nand sophisticated mechanism to select the validators who are allowed to participate in its\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus"},"consensus")," protocol. NPoS encourages\nDOT holders to participate as ",(0,i.kt)("strong",{parentName:"p"},"nominators"),"."),(0,i.kt)("p",null,"Any 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 list of up to\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominations",defaultValue:16,mdxType:"RPC"}),"\n","\ncandidates that it supports, and the network will automatically distribute the stake among\nvalidators in an even manner so that the economic security is maximized. In the next era, a certain\nnumber of validators having the most DOT backing\nget elected and become active. For more information about the election algorithm go to\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"this")," page on the wiki or\n",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/protocols/NPoS/Paper"},"this")," research article. As a\nnominator, a minimum of\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.minNominatorBond",defaultValue:1e12,filter:"humanReadable",mdxType:"RPC"}),"\n","\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 slashed. For an\nin-depth review of NPoS see\n",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/protocols/NPoS/Overview"},"this")," research article."),(0,i.kt)("admonition",{title:"Minimum Nomination to Receive Staking Rewards",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"Although the minimum nomination intent is\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.minNominatorBond",defaultValue:1e12,filter:"humanReadable",mdxType:"RPC"}),",\n","\nit does not guarantee staking rewards. The nominated amount has to be greater than\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nominator#minimum-active-nomination-to-receive-staking-rewards"},"minimum active nomination"),",\nwhich is a dynamic value that can be much higher than\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.minNominatorBond",defaultValue:1e12,filter:"humanReadable",mdxType:"RPC"}),".\n","\nThis dynamic value depends on the amount of DOT\nbeing staked, in addition to the selected nominations.")),(0,i.kt)("h3",{id:"nominating-validators"},"Nominating Validators"),(0,i.kt)("p",null,"Nominating on Polkadot requires 2 actions:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Locking tokens on-chain."),(0,i.kt)("li",{parentName:"ul"},"Selecting a set of validators, to whom these locked tokens will automatically be allocated to.")),(0,i.kt)("p",null,"How 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 ",(0,i.kt)("strong",{parentName:"p"},"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."),(0,i.kt)("p",null,"Once 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 on\nPolkadot."),(0,i.kt)("p",null,"Unlike other staking systems, Polkadot\nautomatically chooses which of your selected validators will be backed by your bonded tokens.\nSelecting a group of validators increases your chances of consistently backing at least one who is\nactive. This results in your bonded tokens being allocated to validators more often, which means\nmore network security and more rewards. This is in strong contrast to other staking systems that\nonly allow you to back one validator; if that validator is not active, you as a staker will also not\nbe. Polkadot's nomination model solves this."),(0,i.kt)("p",null,"Polkadot uses tools ranging from election\ntheory to game theory to discrete optimization, to develop an efficient validator selection process\nthat offers fair representation and security, thus avoiding uneven power and influence among\nvalidators. The election algorithms used by\nPolkadot are based on the Proportional\nJustified Representation (PJR) methods like ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"Phragmen"),". For more information\nabout PJR methods visit ",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/protocols/NPoS/Overview"},"this"),"\nresearch article."),(0,i.kt)("h3",{id:"eras-and-sessions"},"Eras and Sessions"),(0,i.kt)("p",null,"The 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 ",(0,i.kt)("strong",{parentName:"p"},"era"),". An era is a period of 24 hours\nduring which an ",(0,i.kt)("strong",{parentName:"p"},"active set")," of validators is producing blocks and performing other actions on the\nchain. This means that not all validators are in the active set and such set changes between eras.\nEach era is divided into 6 epochs or ",(0,i.kt)("strong",{parentName:"p"},"sessions")," during which validators are assigned as block\nproducers to specific time frames or ",(0,i.kt)("strong",{parentName:"p"},"slots"),". This means that validators know the slots when they\nwill be required to produce a block within a specific session, but they do not know all the slots\nwithin a specific era. Having sessions adds a layer of security because it decreases the chance of\nhaving multiple validators assigned to a slot colluding to harm the network."),(0,i.kt)("h3",{id:"staking-rewards"},"Staking Rewards"),(0,i.kt)("p",null,"Validators 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 ",(0,i.kt)("strong",{parentName:"p"},"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 ",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-validator-payout"},"dedicated page"),". Distribution of the\nrewards is pro-rata to all stakers after the validator's commission is deducted."),(0,i.kt)("h3",{id:"skin-in-the-game-when-staking"},"Skin in the game when Staking"),(0,i.kt)("p",null,"The 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."),(0,i.kt)("h2",{id:"being-a-nominator"},"Being a Nominator"),(0,i.kt)("h3",{id:"tasks-and-responsibilities-of-a-nominator"},"Tasks and Responsibilities of a Nominator"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Validators.")," Since validator slots are limited, most of those who wish to stake their\nDOT and contribute to the economic security of\nthe network will be nominators, thus here we focus on the role of nominators. However, it is worth\nmentioning that validators do most of the heavy lifting: they run the validator nodes and manage\n",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/security/keys/session"},"session keys"),", produce new block\ncandidates in ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus/#block-production-babe"},"BABE"),", vote and come to consensus in\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus/#finality-gadget-grandpa"},"GRANDPA"),", validate the state transition function of\nparachains, and possibly some other responsibilities regarding data availability and\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-xcm"},"XCM"),". For more information, you can take a look at the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-validator"},"validator docs")," to understand what you need to do as a validator. If you want\nto become a validator you can consult\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-validate-polkadot"},"this")," guide."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"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",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pools"),". For more information, you can take a look at the\nnominator ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nominator"},"guide")," to understanding your responsibilities as a nominator."),(0,i.kt)("p",null,"If you want to become a nominator, see\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-nominate-polkadot"},"this")," guide. If you are a beginner and\nwould like to securely stake your tokens using the Polkadot-JS UI, refer to\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000168057-how-do-i-stake-nominate-on-polkadot-"},"this"),"\nsupport article.\n"),(0,i.kt)("admonition",{title:"Polkadot Staking Dashboard",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The ",(0,i.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/dashboard/#/overview"},"Staking Dashboard")," provides a more\nuser-friendly alternative to staking. See the instructions in\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182133-how-to-use-the-staking-dashboard-staking-your-dot"},"this"),"\nsupport article to learn how to stake with the dashboard.")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"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.'),(0,i.kt)("h3",{id:"selection-of-validators"},"Selection of Validators"),(0,i.kt)("p",null,"The 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):"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"recent history of the era points earned across eras"),(0,i.kt)("li",{parentName:"ul"},"validator's self stake (shows skin in the game)"),(0,i.kt)("li",{parentName:"ul"},"total stake backing the validator (which is the sum of self stake and the stake coming from\nnominators)"),(0,i.kt)("li",{parentName:"ul"},"commission fees (i.e. how much validators charge nominators)"),(0,i.kt)("li",{parentName:"ul"},"verified identity"),(0,i.kt)("li",{parentName:"ul"},"previous slashes")),(0,i.kt)("p",null,"The diagram below shows how the selection of those criteria affects the reward-to-risk ratio."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"rewards and risks diagram",src:a(89303).Z,width:"1920",height:"800"})),(0,i.kt)("h4",{id:"validator-selection-criteria"},"Validator Selection Criteria"),(0,i.kt)("p",null,"To maximize rewards and minimize risk, one could select those validators that:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"have era points above average (because they will get more rewards for being active),"),(0,i.kt)("li",{parentName:"ul"},"have the total stake backing the validator below the average active validator stake (because they\nwill pay out more rewards per staked DOT),"),(0,i.kt)("li",{parentName:"ul"},"have high own stake (because if slashed they have something to lose),"),(0,i.kt)("li",{parentName:"ul"},"have low commission fees but not 0% (because it makes sense that for doing the heavy lifting,\nvalidators ask for a small commission),"),(0,i.kt)("li",{parentName:"ul"},"have on-chain registered identity (because it adds a layer of trust and possibly provides access\nto their website and contact details),"),(0,i.kt)("li",{parentName:"ul"},"and have not been slashed (meaning that their on-chain behavior is genuine).")),(0,i.kt)("h4",{id:"network-providers"},"Network Providers"),(0,i.kt)("p",null,"For successful operation, a Validator node should always be ensured to meet the required\n",(0,i.kt)("a",{parentName:"p",href:"../maintain/maintain-guides-how-to-validate-polkadot#reference-hardware"},"software, hardware, and network bandwidth specifications"),".\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 might be subject to\n",(0,i.kt)("a",{parentName:"p",href:"./learn-staking-advanced#unresponsiveness"},"slashing due to unresponsiveness"),". As\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus#block-production-babe"},"Polkadot's block production mechanism")," is reasonably\nresilient to a small proportion of validators going offline, no slashing is imposed until 10% of the\nvalidators in the active set go offline. Hence, if multiple nodes are running on a single cloud\nservice provider and go offline simultaneously due to an outage or due to a change in their terms\nand conditions policy regarding the support of Proof-of-Stake (PoS) operations, the offline\nvalidators and all the nominators backing them can be slashed up 7% of their stake on Polkadot.\nHence, it is recommended that you check if you are nominating the validator nodes that are running\non cloud service providers, and if they do, check if they allow for Proof-of-Stake operations."),(0,i.kt)("admonition",{title:"Checking Validators using Network Providers",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"You can connect your stash account to the ",(0,i.kt)("a",{parentName:"p",href:"https://polkawatch.app/"},"Polkawatch app"),". The app will\nshow your rewards earned in the past 60 eras divided by network provider and country. You will be\nable to see networks used by each validator and verify if your validators are using providers who\nsupport PoS. This is also a great tool to explore how decentralized your nominations are and act\naccordingly.")),(0,i.kt)("h4",{id:"keeping-track-of-nominated-validators"},"Keeping Track of Nominated Validators"),(0,i.kt)("admonition",{title:"Nominators must periodically check their validators",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"Nominating is ",(0,i.kt)("em",{parentName:"p"},"not"),' a "set and forget" operation. The whole NPoS system is dynamic and nominators\nshould periodically monitor the performance and reputation of their validators. Failing to do so\ncould result in applied slashes and/or rewards not being paid out, possibly for a prolonged period.')),(0,i.kt)("p",null,"Although 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 the criteria like on-chain identity,\nslash history and low commission make the staking rewards deterministic. But some criteria vary more\nthan 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",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-validator-payout#era-points"},"this")," page for more information). The\nrole can switch between sessions, and you can look at\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking"},"the staking tab on the Polkadot-JS UI")," to know which\nvalidator is producing blocks for the relay chain or parachains."),(0,i.kt)("p",null,"It 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",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000150130-how-do-i-know-which-validators-to-choose-"},"this"),"\nsupport article to understand in detail how to select the set of validators to nominate."),(0,i.kt)("h3",{id:"stash-account-and-staking-proxy"},"Stash Account and Staking Proxy"),(0,i.kt)("p",null,"Two different accounts can be used to securely manage your funds while staking."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Stash:")," This account holds funds bonded for staking, but delegates all staking functions to a\nstaking proxy account. You may actively participate in staking with a stash private key kept in a\ncold wallet like Ledger, meaning it stays offline all the time. Having a staking proxy will allow\nyou to sign all staking-related transactions with the proxy instead of using your Ledger device.\nThis will allow you:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"to avoid carrying around your Ledger device just to sign staking-related transactions, and"),(0,i.kt)("li",{parentName:"ul"},"to and to keep the transaction history of your stash clean"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Staking Proxy:")," This account acts on behalf of the stash account, signaling decisions about\nnominating and validating. It can set preferences like commission (for validators) and the staking\nrewards payout account. The earned rewards can be bonded (locked) immediately for bonding on your\nstash account, which would effectively compound the rewards you receive over time. You could also\nchoose to have them deposited to a different account as a free (transferable) balance. If you are\na validator, it can also be used to set your ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"session keys"),". Staking\nproxies only need sufficient funds to pay for the transaction fees."))),(0,i.kt)("admonition",{type:"warning"},(0,i.kt)("p",{parentName:"admonition"},'Never leave a high balance on a proxy account which are usually "hot" as their private key is stored\non the device (PC, phone) and it is always exposed to the internet for potential hacks and scams. It\nis good practice to deposit rewards on the stash account or to send them to another account on a\ncold wallet.')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"staking",src:a(4080).Z,width:"1920",height:"800"})),(0,i.kt)("p",null,"This 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 ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-accounts/#derivation-paths"},"here"),"."),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"For Ledger users staking directly on Ledger Live, currently, there is no option to use separate\nstash and staking proxy accounts."),(0,i.kt)("p",{parentName:"admonition"},"Ledger devices are now supported in ",(0,i.kt)("a",{parentName:"p",href:"https://www.subwallet.app/download.html"},"SubWallet")," and\n",(0,i.kt)("a",{parentName:"p",href:"https://talisman.xyz/"},"Talisman")," extension. Users can import their Ledger accounts in the extension\nand use them as a stash in staking. You can find more information about SubWallet, Talisman and\nother wallets that officially secured funding from the treasury\n",(0,i.kt)("a",{parentName:"p",href:"/docs/wallets-and-extensions"},"here"),".")),(0,i.kt)("h3",{id:"claiming-staking-rewards"},"Claiming Staking Rewards"),(0,i.kt)("p",null,""),(0,i.kt)("p",null,"Rewards 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 ",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-validator-payout"},"Validator Payout Guide"),"."),(0,i.kt)("p",null,"The 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 84 eras. The following calculation can be used to\napproximate this length in days on Polkadot:"),(0,i.kt)("p",null,"",(0,i.kt)("inlineCode",{parentName:"p"},"84 eras")," \xd7 ",(0,i.kt)("inlineCode",{parentName:"p"},"24 hours in a single era")," \xf7 ",(0,i.kt)("inlineCode",{parentName:"p"},"24 hours in a day")," = ",(0,i.kt)("inlineCode",{parentName:"p"},"84 days"),"\n","","","",""),(0,i.kt)("p",null,"For more information on why this is so, see the page on ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced"},"simple payouts"),"."),(0,i.kt)("admonition",{title:"Payouts",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Payouts are unclaimed rewards waiting to be paid out to both validators and nominators. If you go to\nthe Staking payouts page on ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking"},"Polkadot-JS"),", you will see a\nlist of all validators that you have nominated in the past 84 eras and for which you have not yet\nreceived a payout. The payout page is visible only to stakers."),(0,i.kt)("p",{parentName:"admonition"},"Each 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.")),(0,i.kt)("admonition",{title:"Time limit to claim staking rewards",type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"If nobody claims your staking rewards within 84 eras, then you will not be able to claim them and\nthey will be lost. Additionally, if the validator unbonds all their own stake, any pending payouts\nwill also be lost. Since unbonding takes\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.bondingDuration",defaultValue:28,mdxType:"RPC"}),"\n","\ndays, nominators should check if they have pending payouts at least this often.")),(0,i.kt)("p",null,"Rewards 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."),(0,i.kt)("p",null,"If you wish to know if you received a payout, you will have to check via a block explorer. See\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000168954-how-can-i-see-my-staking-rewards-"},"the relevant Support page"),"\nfor details. For specific details about validator payouts, please see\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-validator-payout"},"this guide"),"."),(0,i.kt)("h3",{id:"slashing"},"Slashing"),(0,i.kt)("p",null,"Slashing will happen if a validator misbehaves (e.g. goes offline, attacks the network, or runs\nmodified software) in the network. They and their nominators will get slashed by losing a percentage\nof their bonded/staked DOT."),(0,i.kt)("p",null,"Any slashed DOT will be added to the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-treasury"},"Treasury"),". The rationale for this (rather\nthan burning or distributing them as rewards) is that slashes may then be reverted by the Council by\nsimply paying out from the Treasury. This would be useful in situations such as faulty slashes. In\nthe case of legitimate slashing, it moves tokens away from malicious validators to those building\nthe ecosystem through the normal Treasury process."),(0,i.kt)("p",null,"Validators with a larger total stake backing them will get slashed more harshly than less popular\nones, so we encourage nominators to shift their nominations to less popular validators to reduce\ntheir possible losses."),(0,i.kt)("p",null,"It is important to realize that slashing only occurs for active validations for a given nominator,\nand slashes are not mitigated by having other inactive or waiting nominations. They are also not\nmitigated by the validator operator running separate validators; each validator is considered its\nown entity for purposes of slashing, just as they are for staking rewards."),(0,i.kt)("p",null,"In rare instances, a nominator may be actively nominating several validators in a single era. In\nthis case, the slash is proportionate to the amount staked to that specific validator. With very\nlarge bonds, such as parachain liquid staking accounts, a nominator has multiple active nominations\nper era (Acala's LDOT nominator typically has 7-12 active nominations per era). Note that you cannot\ncontrol the percentage of stake you have allocated to each validator or choose who your active\nvalidator will be (except in the trivial case of nominating a single validator). Staking allocations\nare controlled by the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"Phragm\xe9n algorithm"),"."),(0,i.kt)("p",null,'Once a validator gets slashed, it goes into the state as an "unapplied slash". You can check this\nvia\n',(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/staking/slashes"},"Polkadot-JS UI"),".\nThe UI shows it per validator and then all the affected nominators along with the amounts. While\nunapplied, a governance proposal can be made to reverse it during this period (7 days on Kusama, 28\ndays on Polkadot). After the grace period, the slashes are applied."),(0,i.kt)("p",null,"The following levels of offense are\n",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/security/slashing/amounts"},"defined"),". However, these\nparticular levels are not implemented or referred to in the code or in the system; they are meant as\nguidelines for different levels of severity for offenses. To understand how slash amounts are\ncalculated, see the equations in the section below."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Level 1: isolated ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking-advanced/#unresponsiveness"},"unresponsiveness"),", i.e. being\noffline for an entire session. Generally no slashing, only ",(0,i.kt)("a",{parentName:"li",href:"#chilling"},"chilling"),"."),(0,i.kt)("li",{parentName:"ul"},"Level 2: concurrent unresponsiveness or isolated\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking-advanced/#equivocation"},"equivocation"),", slashes a very small amount of the\nstake and chills."),(0,i.kt)("li",{parentName:"ul"},"Level 3: misconducts unlikely to be accidental, but which do not harm the network's security to\nany large extent. Examples include concurrent equivocation or isolated cases of unjustified voting\nin ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-consensus"},"GRANDPA"),". Slashes a moderately small amount of the stake and chills."),(0,i.kt)("li",{parentName:"ul"},"Level 4: misconduct that poses serious security or monetary risk to the system, or mass collusion.\nSlashes all or most of the stake behind the validator and chills.")),(0,i.kt)("p",null,"If you want to know more details about slashing, please look at our\n",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/security/slashing/amounts"},"research page"),"."),(0,i.kt)("h3",{id:"chilling"},"Chilling"),(0,i.kt)("p",null,"Chilling 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. It can also specifically mean\nremoving a validator from the active validator set by another validator, disqualifying them from the\nset of electable candidates in the next NPoS cycle."),(0,i.kt)("p",null,"Chilling may be voluntary and validator-initiated, e.g. if there is a planned outage in the\nvalidator's surroundings or hosting provider, and the validator wants to exit to protect themselves\nagainst slashing. When voluntary, chilling will keep the validator active in the current session,\nbut will move them to the inactive set in the next. The validator will not lose their nominators."),(0,i.kt)("p",null,"When used as part of a punishment (initiated externally), being chilled carries an implied penalty\nof being un-nominated. It also disables the validator for the remainder of the current era and\nremoves the offending validator from the next election."),(0,i.kt)("p",null,"Polkadot allows some validators to be\ndisabled, but if the number of disabled validators gets too large,\nPolkadot will trigger a new validator election\nto get a full set. Disabled validators will need to resubmit their intention to validate and\nre-garner support from nominators."),(0,i.kt)("p",null,'For more on chilling, see the "',(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-chill"},"How to Chill"),'" page on\nthis wiki.'),(0,i.kt)("h3",{id:"fast-unstake"},"Fast Unstake"),(0,i.kt)("admonition",{title:"Fast Unstaking feature is live!",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"If you accidentally bonded your DOT or your\nbonded DOT never backed any active validator, you\ncan now unbond them immediately.")),(0,i.kt)("p",null,"If your bonded balance did not back any validators in the last\n28 days on Polkadot, you are\neligible to perform fast unstaking. The\n",(0,i.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/#/overview"},"staking dashboard")," will automatically check if you\nqualify. For more information, visit the\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000169433-can-i-transfer-dot-without-unbonding-and-waiting-28-days-"},'"Fast Unstake" section in this support article'),"."),(0,i.kt)("h2",{id:"why-and-why-not-to-stake"},"Why and Why not to Stake?"),(0,i.kt)("h3",{id:"pros-of-staking"},"Pros of Staking"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Earn rewards for contributing to the network's security through staking."),(0,i.kt)("li",{parentName:"ul"},"Low barrier of entry through ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-nomination-pools"},"Nomination Pools"),"."),(0,i.kt)("li",{parentName:"ul"},"Can choose up-to\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominations",defaultValue:16,mdxType:"RPC"}),"\nvalidators which can help to decentralize the network through the sophisticated\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-consensus/#nominated-proof-of-stake"},"NPoS system")),(0,i.kt)("li",{parentName:"ul"},"10% inflation/year of the tokens is primarily intended for staking rewards.")),(0,i.kt)("p",null,"When the system staking rate matches with the ideal staking rate, the entire inflation of the\nnetwork is given away as the staking rewards.\nUp until now, the network has been following an inflation model that excludes the metric of active parachains.\nThe ideal staking rate is a dynamic value - as the number of active parachains influences the\navailable liquidity that is available to secure the network."),(0,i.kt)("p",null,"Any divergence from the ideal staking rate will result in the distribution of a proportion of the\nnewly minted tokens through inflation to go to the treasury. Keep in mind that when the system's\nstaking rate is lower than the ideal staking rate, the annual nominal return rate will be higher,\nencouraging more users to use their tokens for staking. On the contrary, when the system staking\nrate is higher than the ideal staking rate, the annual nominal return will be less, encouraging some\nusers to withdraw. For in-depth understanding, check the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced#inflation"},"inflation")," section on the Wiki."),(0,i.kt)("h3",{id:"cons-of-staking"},"Cons of Staking"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Tokens will be locked for about 28 days on\nPolkadot. No rewards will be earned during\nthe unbonding period.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Possible punishment in case of the active validator found to be misbehaving (see\n",(0,i.kt)("a",{parentName:"p",href:"#slashing"},"slashing"),").")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Lack of liquidity i.e. You would not be able to use the tokens for participating in crowdloans or\ntransfer them to different account etc."))),(0,i.kt)("h2",{id:"how-many-validators"},"How many Validators?"),(0,i.kt)("p",null,"Polkadot currently has\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.validatorCount",defaultValue:297,mdxType:"RPC"}),"\n","\nvalidators. The top bound on the number of validators has not been determined yet, but should only\nbe limited by the bandwidth strain of the network due to peer-to-peer message passing."),(0,i.kt)("p",null,"The estimate of the number of validators that Polkadot will have at maturity is around 1000.\nKusama is already operating at this threshold."),(0,i.kt)("h2",{id:"why-am-i-not-receiving-rewards"},"Why am I not receiving rewards?"),(0,i.kt)("p",null,"Nominating on Polkadot is not a set-and-forget\naction. Nominators need to monitor their nominations and ensure they are eligible to receive staking\nrewards. Otherwise, they would be risking their funds to secure the chain with no reward. If you are\nbonding significantly more than the Minimum Active Bond and yet not receiving rewards, your\nnominations are all waiting, or your active validator has 100% commission. However, if you bond\nfunds close to the Minimum Active Bond, there could be several possibilities for not receiving\nstaking rewards. The table below can be used to troubleshoot why you might not be receiving staking\nrewards using Polkadot-JS UI."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:"center"},"Nomination Status"),(0,i.kt)("th",{parentName:"tr",align:"center"},"What's happening?"),(0,i.kt)("th",{parentName:"tr",align:"center"},"Causes"),(0,i.kt)("th",{parentName:"tr",align:"center"},"What to do?"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Nominated validators are all in waiting status."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Your stake has not been assigned to any of the nominated validators. You cannot earn rewards, nor be slashed in that era."),(0,i.kt)("td",{parentName:"tr",align:"center"},'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".'),(0,i.kt)("td",{parentName:"tr",align:"center"},"Change your nominations. Try to select validators (with reasonable commission) that have high chances to end up in the active set.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"You have some inactive, and some waiting nominations."),(0,i.kt)("td",{parentName:"tr",align:"center"},'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.'),(0,i.kt)("td",{parentName:"tr",align:"center"},(0,i.kt)("strong",{parentName:"td"},"Scenario 1:")," You have bonded less than the Minimum Active Bond. ",(0,i.kt)("strong",{parentName:"td"},"Scenario 2:")," You have more than the Minimum Active Bond, but your account is at the tail end of the ",(0,i.kt)("a",{parentName:"td",href:"/docs/learn-staking-advanced#bags-list"},"bags list")," and within your bag there are acounts with less stake than you, in front of you."),(0,i.kt)("td",{parentName:"tr",align:"center"},(0,i.kt)("strong",{parentName:"td"},"Scenario 1:")," Try bonding more funds. ",(0,i.kt)("strong",{parentName:"td"},"Scenario 2:")," Try to put your account in front of the accounts with less stake than you. Instructions available ",(0,i.kt)("a",{parentName:"td",href:"https://support.polkadot.network/support/solutions/articles/65000181018-i-have-more-than-the-minimum-bonded-but-i-m-not-getting-rewards"},"here"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"You have one active validator."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Active validators are producing blocks in the current era, and your stake has been assigned to them. Even if you are not earning rewards, you can be slashed."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Your validator is oversubscribed, meaning that it has more than 512 nominators (ranked by stake), and your stake is less than that of those nominators."),(0,i.kt)("td",{parentName:"tr",align:"center"},"You can try to select validators that are not oversubscribed but in the long term you might want to bond more funds (even more than the Minimum Active Bond) to increase the chance of earning rewards also with oversubscribed validators.")))),(0,i.kt)("admonition",{title:"Join a Nomination Pool",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"By joining a ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pool")," that is active and earning rewards, you\ncan start earning staking rewards with as low as 1 DOT. The nomination pools typically have a\ndedicated pool operator who ensures that the pool's stake is always backing an active validator and\nis receiving rewards.")),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"You can find information about why you might not receive staking rewards on\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000170805-why-am-i-not-getting-staking-rewards-"},"this support page"),".")),(0,i.kt)("h2",{id:"staking-faq"},"Staking FAQ"),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"See\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181959-staking-faq-s"},"this support page"),"\nfor the FAQs about staking.")),(0,i.kt)("h2",{id:"resources"},"Resources"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://medium.com/web3foundation/how-nominated-proof-of-stake-will-work-in-polkadot-377d70c6bd43"},"How Nominated Proof of Stake will work in Polkadot")," -\nBlog post by Web3 Foundation researcher Alfonso Cevallos covering NPoS in Polkadot."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/maintain-guides-secure-validator"},"Validator setup"))))}m.isMDXComponent=!0},89303:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/reward-risk-fee9f991186d4097ca3d3f0a713f4ad4.png"},4080:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/stash-and-staking-proxy-ea4d09387a4b56d1349ee896427d9f1d.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/1646726c.fef949d2.js b/assets/js/1646726c.fef949d2.js new file mode 100644 index 000000000000..2f8156401c2e --- /dev/null +++ b/assets/js/1646726c.fef949d2.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[2169],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>p});var n=a(74165),o=a(15861),i=a(67294),r=a(87152),s=a(17145),l=a(67425);function d(e,t,a){return h.apply(this,arguments)}function h(){return(h=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var i,l,d,h,c;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return d=new r.U(i),e.next=21,s.G.create({provider:d});case 21:h=e.sent,(c=a.split(".")).forEach((function(e){e in h&&(h=h[e])})),e.t1=c[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=h.toString(),e.abrupt("break",35);case 29:return e.next=31,h();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function c(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"permillToPercent":(0,l.PermillToPercent)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(e){var t=e.network,a=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,h=(0,i.useState)(""),p=h[0],u=h[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?c(r.toString(),l,t,u):u(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t,a,u);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?c(o,l,t,u):u(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),p}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},78381:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>m,frontMatter:()=>l,metadata:()=>h,toc:()=>p});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),r=a(47940),s=["components"],l={id:"learn-staking",title:"Introduction to Staking",sidebar_label:"Introduction to Staking",description:"Overview of Staking and NPoS on Polkadot.",keywords:["staking","stake","nominate","nominating","NPoS","faq"],slug:"../learn-staking"},d=void 0,h={unversionedId:"learn/learn-staking",id:"learn/learn-staking",title:"Introduction to Staking",description:"Overview of Staking and NPoS on Polkadot.",source:"@site/../docs/learn/learn-staking.md",sourceDirName:"learn",slug:"/learn-staking",permalink:"/docs/learn-staking",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-staking.md",tags:[],version:"current",lastUpdatedBy:"github-actions[bot]",lastUpdatedAt:1697437685,formattedLastUpdatedAt:"Oct 16, 2023",frontMatter:{id:"learn-staking",title:"Introduction to Staking",sidebar_label:"Introduction to Staking",description:"Overview of Staking and NPoS on Polkadot.",keywords:["staking","stake","nominate","nominating","NPoS","faq"],slug:"../learn-staking"},sidebar:"docs",previous:{title:"Staking",permalink:"/docs/learn-staking-index"},next:{title:"Nomination Pools",permalink:"/docs/learn-nomination-pools"}},c={},p=[{value:"Proof-of-Stake (PoS)",id:"proof-of-stake-pos",level:2},{value:"Nominated Proof-of-Stake (NPoS)",id:"nominated-proof-of-stake-npos",level:2},{value:"Nominating Validators",id:"nominating-validators",level:3},{value:"Eras and Sessions",id:"eras-and-sessions",level:3},{value:"Staking Rewards",id:"staking-rewards",level:3},{value:"Skin in the game when Staking",id:"skin-in-the-game-when-staking",level:3},{value:"Being a Nominator",id:"being-a-nominator",level:2},{value:"Tasks and Responsibilities of a Nominator",id:"tasks-and-responsibilities-of-a-nominator",level:3},{value:"Selection of Validators",id:"selection-of-validators",level:3},{value:"Validator Selection Criteria",id:"validator-selection-criteria",level:4},{value:"Network Providers",id:"network-providers",level:4},{value:"Keeping Track of Nominated Validators",id:"keeping-track-of-nominated-validators",level:4},{value:"Stash Account and Staking Proxy",id:"stash-account-and-staking-proxy",level:3},{value:"Claiming Staking Rewards",id:"claiming-staking-rewards",level:3},{value:"Slashing",id:"slashing",level:3},{value:"Chilling",id:"chilling",level:3},{value:"Fast Unstake",id:"fast-unstake",level:3},{value:"Why and Why not to Stake?",id:"why-and-why-not-to-stake",level:2},{value:"Pros of Staking",id:"pros-of-staking",level:3},{value:"Cons of Staking",id:"cons-of-staking",level:3},{value:"How many Validators?",id:"how-many-validators",level:2},{value:"Why am I not receiving rewards?",id:"why-am-i-not-receiving-rewards",level:2},{value:"Staking FAQ",id:"staking-faq",level:2},{value:"Resources",id:"resources",level:2}],u={toc:p},k="wrapper";function m(e){var t=e.components,l=(0,o.Z)(e,s);return(0,i.kt)(k,(0,n.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{title:"New to Staking?",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"Start your staking journey or explore more information about staking on\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/staking/"},"Polkadot's Home Page"),". Discover the new\n",(0,i.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/#/overview"},"Staking Dashboard")," that makes staking much easier and\ncheck this\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182104"},"extensive article list")," to\nhelp you get started. The dashboard supports ",(0,i.kt)("a",{parentName:"p",href:"/docs/ledger"},"Ledger")," devices natively and\ndoes not require an extension or wallet as an interface.")),(0,i.kt)("admonition",{title:"Stake through Nomination Pools",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The minimum amount required to become an active nominator and earn rewards may change from era to\nera.\nIt is currently ",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.minimumActiveStake",defaultValue:3269785922095,filter:"humanReadable",mdxType:"RPC"})),".\n","\nIf you have less DOT than the minimum active\nnomination and still want to participate in staking, you can join the nomination pools. You can now\nstake on Polkadot natively with just\n",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)(r.Z,{network:"polkadot",path:"query.nominationPools.minJoinBond",filter:"humanReadable",defaultValue:1e10,mdxType:"RPC"})),"\n","\nin the nomination pools and earn staking rewards. For additional information, check out\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/nomination-pools-are-live-stake-natively-with-just-1-dot/"},"this blog post"),".\nCheck the wiki doc on ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pools")," for more information.")),(0,i.kt)("p",null,"Here you will learn about what staking is, why it is important and how it works on\nPolkadot."),(0,i.kt)("h2",{id:"proof-of-stake-pos"},"Proof-of-Stake (PoS)"),(0,i.kt)("p",null,"Blockchain networks use ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus/#why-do-we-need-consensus"},"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:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Block production"),", i.e. the way multiple blocks candidates are produced, and"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Block finality"),", i.e. the way only one block out of many candidates is selected and added to\nthe canonical chain (see ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-consensus/#probabilistic-vs-provable-finality"},"this")," article\nfor more information about finality).")),(0,i.kt)("p",null,"Proof-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."),(0,i.kt)("p",null,"In PoS networks like Polkadot the security of\nthe network depends on the amount of capital locked on the chain: the more the capital locked, the\nlower the chance of an attack on the network, as the attacker needs to incur a heavy loss to\norchestrate a successful attack (more on this later on). The process of locking tokens on the chain\nis called ",(0,i.kt)("strong",{parentName:"p"},"staking"),"."),(0,i.kt)("p",null,"Similar to the miners in PoW networks, PoS networks have ",(0,i.kt)("strong",{parentName:"p"},"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 ",(0,i.kt)("strong",{parentName:"p"},"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."),(0,i.kt)("p",null,'PoS 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',(0,i.kt)("strong",{parentName:"p"},"slashed"),", and depending on the gravity of the situation, their stake can be partly or fully\nconfiscated by the network. It is not in a staker's economic interest to orchestrate an attack and\nrisk losing tokens. Any rational actor staking on the network would want to get rewarded, and the\nPoS network rewards good behavior and punishes bad behavior."),(0,i.kt)("h2",{id:"nominated-proof-of-stake-npos"},"Nominated Proof-of-Stake (NPoS)"),(0,i.kt)("p",null,"Polkadot implements\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus/#nominated-proof-of-stake"},"Nominated Proof-of-Stake (NPoS)"),", a relatively novel\nand sophisticated mechanism to select the validators who are allowed to participate in its\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus"},"consensus")," protocol. NPoS encourages\nDOT holders to participate as ",(0,i.kt)("strong",{parentName:"p"},"nominators"),"."),(0,i.kt)("p",null,"Any 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 list of up to\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominations",defaultValue:16,mdxType:"RPC"}),"\n","\ncandidates that it supports, and the network will automatically distribute the stake among\nvalidators in an even manner so that the economic security is maximized. In the next era, a certain\nnumber of validators having the most DOT backing\nget elected and become active. For more information about the election algorithm go to\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"this")," page on the wiki or\n",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/protocols/NPoS/Paper"},"this")," research article. As a\nnominator, a minimum of\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.minNominatorBond",defaultValue:1e12,filter:"humanReadable",mdxType:"RPC"}),"\n","\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 slashed. For an\nin-depth review of NPoS see\n",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/protocols/NPoS/Overview"},"this")," research article."),(0,i.kt)("admonition",{title:"Minimum Nomination to Receive Staking Rewards",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"Although the minimum nomination intent is\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.minNominatorBond",defaultValue:1e12,filter:"humanReadable",mdxType:"RPC"}),",\n","\nit does not guarantee staking rewards. The nominated amount has to be greater than\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nominator#minimum-active-nomination-to-receive-staking-rewards"},"minimum active nomination"),",\nwhich is a dynamic value that can be much higher than\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.minNominatorBond",defaultValue:1e12,filter:"humanReadable",mdxType:"RPC"}),".\n","\nThis dynamic value depends on the amount of DOT\nbeing staked, in addition to the selected nominations.")),(0,i.kt)("h3",{id:"nominating-validators"},"Nominating Validators"),(0,i.kt)("p",null,"Nominating on Polkadot requires 2 actions:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Locking tokens on-chain."),(0,i.kt)("li",{parentName:"ul"},"Selecting a set of validators, to whom these locked tokens will automatically be allocated to.")),(0,i.kt)("p",null,"How 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 ",(0,i.kt)("strong",{parentName:"p"},"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."),(0,i.kt)("p",null,"Once 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 on\nPolkadot."),(0,i.kt)("p",null,"Unlike other staking systems, Polkadot\nautomatically chooses which of your selected validators will be backed by your bonded tokens.\nSelecting a group of validators increases your chances of consistently backing at least one who is\nactive. This results in your bonded tokens being allocated to validators more often, which means\nmore network security and more rewards. This is in strong contrast to other staking systems that\nonly allow you to back one validator; if that validator is not active, you as a staker will also not\nbe. Polkadot's nomination model solves this."),(0,i.kt)("p",null,"Polkadot uses tools ranging from election\ntheory to game theory to discrete optimization, to develop an efficient validator selection process\nthat offers fair representation and security, thus avoiding uneven power and influence among\nvalidators. The election algorithms used by\nPolkadot are based on the Proportional\nJustified Representation (PJR) methods like ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"Phragmen"),". For more information\nabout PJR methods visit ",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/protocols/NPoS/Overview"},"this"),"\nresearch article."),(0,i.kt)("h3",{id:"eras-and-sessions"},"Eras and Sessions"),(0,i.kt)("p",null,"The 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 ",(0,i.kt)("strong",{parentName:"p"},"era"),". An era is a period of 24 hours\nduring which an ",(0,i.kt)("strong",{parentName:"p"},"active set")," of validators is producing blocks and performing other actions on the\nchain. This means that not all validators are in the active set and such set changes between eras.\nEach era is divided into 6 epochs or ",(0,i.kt)("strong",{parentName:"p"},"sessions")," during which validators are assigned as block\nproducers to specific time frames or ",(0,i.kt)("strong",{parentName:"p"},"slots"),". This means that validators know the slots when they\nwill be required to produce a block within a specific session, but they do not know all the slots\nwithin a specific era. Having sessions adds a layer of security because it decreases the chance of\nhaving multiple validators assigned to a slot colluding to harm the network."),(0,i.kt)("h3",{id:"staking-rewards"},"Staking Rewards"),(0,i.kt)("p",null,"Validators 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 ",(0,i.kt)("strong",{parentName:"p"},"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 ",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-validator-payout"},"dedicated page"),". Distribution of the\nrewards is pro-rata to all stakers after the validator's commission is deducted."),(0,i.kt)("h3",{id:"skin-in-the-game-when-staking"},"Skin in the game when Staking"),(0,i.kt)("p",null,"The 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."),(0,i.kt)("h2",{id:"being-a-nominator"},"Being a Nominator"),(0,i.kt)("h3",{id:"tasks-and-responsibilities-of-a-nominator"},"Tasks and Responsibilities of a Nominator"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Validators.")," Since validator slots are limited, most of those who wish to stake their\nDOT and contribute to the economic security of\nthe network will be nominators, thus here we focus on the role of nominators. However, it is worth\nmentioning that validators do most of the heavy lifting: they run the validator nodes and manage\n",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/security/keys/session"},"session keys"),", produce new block\ncandidates in ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus/#block-production-babe"},"BABE"),", vote and come to consensus in\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus/#finality-gadget-grandpa"},"GRANDPA"),", validate the state transition function of\nparachains, and possibly some other responsibilities regarding data availability and\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-xcm"},"XCM"),". For more information, you can take a look at the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-validator"},"validator docs")," to understand what you need to do as a validator. If you want\nto become a validator you can consult\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-validate-polkadot"},"this")," guide."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"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",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pools"),". For more information, you can take a look at the\nnominator ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nominator"},"guide")," to understanding your responsibilities as a nominator."),(0,i.kt)("p",null,"If you want to become a nominator, see\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-nominate-polkadot"},"this")," guide. If you are a beginner and\nwould like to securely stake your tokens using the Polkadot-JS UI, refer to\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000168057-how-do-i-stake-nominate-on-polkadot-"},"this"),"\nsupport article.\n"),(0,i.kt)("admonition",{title:"Polkadot Staking Dashboard",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The ",(0,i.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/dashboard/#/overview"},"Staking Dashboard")," provides a more\nuser-friendly alternative to staking. See the instructions in\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182133-how-to-use-the-staking-dashboard-staking-your-dot"},"this"),"\nsupport article to learn how to stake with the dashboard.")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"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.'),(0,i.kt)("h3",{id:"selection-of-validators"},"Selection of Validators"),(0,i.kt)("p",null,"The 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):"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"recent history of the era points earned across eras"),(0,i.kt)("li",{parentName:"ul"},"validator's self stake (shows skin in the game)"),(0,i.kt)("li",{parentName:"ul"},"total stake backing the validator (which is the sum of self stake and the stake coming from\nnominators)"),(0,i.kt)("li",{parentName:"ul"},"commission fees (i.e. how much validators charge nominators)"),(0,i.kt)("li",{parentName:"ul"},"verified identity"),(0,i.kt)("li",{parentName:"ul"},"previous slashes")),(0,i.kt)("p",null,"The diagram below shows how the selection of those criteria affects the reward-to-risk ratio."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"rewards and risks diagram",src:a(89303).Z,width:"1920",height:"800"})),(0,i.kt)("h4",{id:"validator-selection-criteria"},"Validator Selection Criteria"),(0,i.kt)("p",null,"To maximize rewards and minimize risk, one could select those validators that:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"have era points above average (because they will get more rewards for being active),"),(0,i.kt)("li",{parentName:"ul"},"have the total stake backing the validator below the average active validator stake (because they\nwill pay out more rewards per staked DOT),"),(0,i.kt)("li",{parentName:"ul"},"have high own stake (because if slashed they have something to lose),"),(0,i.kt)("li",{parentName:"ul"},"have low commission fees but not 0% (because it makes sense that for doing the heavy lifting,\nvalidators ask for a small commission),"),(0,i.kt)("li",{parentName:"ul"},"have on-chain registered identity (because it adds a layer of trust and possibly provides access\nto their website and contact details),"),(0,i.kt)("li",{parentName:"ul"},"and have not been slashed (meaning that their on-chain behavior is genuine).")),(0,i.kt)("h4",{id:"network-providers"},"Network Providers"),(0,i.kt)("p",null,"For successful operation, a Validator node should always be ensured to meet the required\n",(0,i.kt)("a",{parentName:"p",href:"../maintain/maintain-guides-how-to-validate-polkadot#reference-hardware"},"software, hardware, and network bandwidth specifications"),".\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 might be subject to\n",(0,i.kt)("a",{parentName:"p",href:"./learn-staking-advanced#unresponsiveness"},"slashing due to unresponsiveness"),". As\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus#block-production-babe"},"Polkadot's block production mechanism")," is reasonably\nresilient to a small proportion of validators going offline, no slashing is imposed until 10% of the\nvalidators in the active set go offline. Hence, if multiple nodes are running on a single cloud\nservice provider and go offline simultaneously due to an outage or due to a change in their terms\nand conditions policy regarding the support of Proof-of-Stake (PoS) operations, the offline\nvalidators and all the nominators backing them can be slashed up 7% of their stake on Polkadot.\nHence, it is recommended that you check if you are nominating the validator nodes that are running\non cloud service providers, and if they do, check if they allow for Proof-of-Stake operations."),(0,i.kt)("admonition",{title:"Checking Validators using Network Providers",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"You can connect your stash account to the ",(0,i.kt)("a",{parentName:"p",href:"https://polkawatch.app/"},"Polkawatch app"),". The app will\nshow your rewards earned in the past 60 eras divided by network provider and country. You will be\nable to see networks used by each validator and verify if your validators are using providers who\nsupport PoS. This is also a great tool to explore how decentralized your nominations are and act\naccordingly.")),(0,i.kt)("h4",{id:"keeping-track-of-nominated-validators"},"Keeping Track of Nominated Validators"),(0,i.kt)("admonition",{title:"Nominators must periodically check their validators",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"Nominating is ",(0,i.kt)("em",{parentName:"p"},"not"),' a "set and forget" operation. The whole NPoS system is dynamic and nominators\nshould periodically monitor the performance and reputation of their validators. Failing to do so\ncould result in applied slashes and/or rewards not being paid out, possibly for a prolonged period.')),(0,i.kt)("p",null,"Although 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 the criteria like on-chain identity,\nslash history and low commission make the staking rewards deterministic. But some criteria vary more\nthan 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",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-validator-payout#era-points"},"this")," page for more information). The\nrole can switch between sessions, and you can look at\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking"},"the staking tab on the Polkadot-JS UI")," to know which\nvalidator is producing blocks for the relay chain or parachains."),(0,i.kt)("p",null,"It 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",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000150130-how-do-i-know-which-validators-to-choose-"},"this"),"\nsupport article to understand in detail how to select the set of validators to nominate."),(0,i.kt)("h3",{id:"stash-account-and-staking-proxy"},"Stash Account and Staking Proxy"),(0,i.kt)("p",null,"Two different accounts can be used to securely manage your funds while staking."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Stash:")," This account holds funds bonded for staking, but delegates all staking functions to a\nstaking proxy account. You may actively participate in staking with a stash private key kept in a\ncold wallet like Ledger, meaning it stays offline all the time. Having a staking proxy will allow\nyou to sign all staking-related transactions with the proxy instead of using your Ledger device.\nThis will allow you:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"to avoid carrying around your Ledger device just to sign staking-related transactions, and"),(0,i.kt)("li",{parentName:"ul"},"to and to keep the transaction history of your stash clean"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Staking Proxy:")," This account acts on behalf of the stash account, signaling decisions about\nnominating and validating. It can set preferences like commission (for validators) and the staking\nrewards payout account. The earned rewards can be bonded (locked) immediately for bonding on your\nstash account, which would effectively compound the rewards you receive over time. You could also\nchoose to have them deposited to a different account as a free (transferable) balance. If you are\na validator, it can also be used to set your ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"session keys"),". Staking\nproxies only need sufficient funds to pay for the transaction fees."))),(0,i.kt)("admonition",{type:"warning"},(0,i.kt)("p",{parentName:"admonition"},'Never leave a high balance on a proxy account which are usually "hot" as their private key is stored\non the device (PC, phone) and it is always exposed to the internet for potential hacks and scams. It\nis good practice to deposit rewards on the stash account or to send them to another account on a\ncold wallet.')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"staking",src:a(4080).Z,width:"1920",height:"800"})),(0,i.kt)("p",null,"This 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 ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-accounts/#derivation-paths"},"here"),"."),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"For Ledger users staking directly on Ledger Live, currently, there is no option to use separate\nstash and staking proxy accounts."),(0,i.kt)("p",{parentName:"admonition"},"Ledger devices are now supported in ",(0,i.kt)("a",{parentName:"p",href:"https://www.subwallet.app/download.html"},"SubWallet")," and\n",(0,i.kt)("a",{parentName:"p",href:"https://talisman.xyz/"},"Talisman")," extension. Users can import their Ledger accounts in the extension\nand use them as a stash in staking. You can find more information about SubWallet, Talisman and\nother wallets that officially secured funding from the treasury\n",(0,i.kt)("a",{parentName:"p",href:"/docs/wallets-and-extensions"},"here"),".")),(0,i.kt)("h3",{id:"claiming-staking-rewards"},"Claiming Staking Rewards"),(0,i.kt)("p",null,""),(0,i.kt)("p",null,"Rewards 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 ",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-validator-payout"},"Validator Payout Guide"),"."),(0,i.kt)("p",null,"The 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 84 eras. The following calculation can be used to\napproximate this length in days on Polkadot:"),(0,i.kt)("p",null,"",(0,i.kt)("inlineCode",{parentName:"p"},"84 eras")," \xd7 ",(0,i.kt)("inlineCode",{parentName:"p"},"24 hours in a single era")," \xf7 ",(0,i.kt)("inlineCode",{parentName:"p"},"24 hours in a day")," = ",(0,i.kt)("inlineCode",{parentName:"p"},"84 days"),"\n","","","",""),(0,i.kt)("p",null,"For more information on why this is so, see the page on ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced"},"simple payouts"),"."),(0,i.kt)("admonition",{title:"Payouts",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Payouts are unclaimed rewards waiting to be paid out to both validators and nominators. If you go to\nthe Staking payouts page on ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking"},"Polkadot-JS"),", you will see a\nlist of all validators that you have nominated in the past 84 eras and for which you have not yet\nreceived a payout. The payout page is visible only to stakers."),(0,i.kt)("p",{parentName:"admonition"},"Each 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.")),(0,i.kt)("admonition",{title:"Time limit to claim staking rewards",type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"If nobody claims your staking rewards within 84 eras, then you will not be able to claim them and\nthey will be lost. Additionally, if the validator unbonds all their own stake, any pending payouts\nwill also be lost. Since unbonding takes\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.bondingDuration",defaultValue:28,mdxType:"RPC"}),"\n","\ndays, nominators should check if they have pending payouts at least this often.")),(0,i.kt)("p",null,"Rewards 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."),(0,i.kt)("p",null,"If you wish to know if you received a payout, you will have to check via a block explorer. See\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000168954-how-can-i-see-my-staking-rewards-"},"the relevant Support page"),"\nfor details. For specific details about validator payouts, please see\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-validator-payout"},"this guide"),"."),(0,i.kt)("h3",{id:"slashing"},"Slashing"),(0,i.kt)("p",null,"Slashing will happen if a validator misbehaves (e.g. goes offline, attacks the network, or runs\nmodified software) in the network. They and their nominators will get slashed by losing a percentage\nof their bonded/staked DOT."),(0,i.kt)("p",null,"Any slashed DOT will be added to the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-treasury"},"Treasury"),". The rationale for this (rather\nthan burning or distributing them as rewards) is that slashes may then be reverted by the Council by\nsimply paying out from the Treasury. This would be useful in situations such as faulty slashes. In\nthe case of legitimate slashing, it moves tokens away from malicious validators to those building\nthe ecosystem through the normal Treasury process."),(0,i.kt)("p",null,"Validators with a larger total stake backing them will get slashed more harshly than less popular\nones, so we encourage nominators to shift their nominations to less popular validators to reduce\ntheir possible losses."),(0,i.kt)("p",null,"It is important to realize that slashing only occurs for active validations for a given nominator,\nand slashes are not mitigated by having other inactive or waiting nominations. They are also not\nmitigated by the validator operator running separate validators; each validator is considered its\nown entity for purposes of slashing, just as they are for staking rewards."),(0,i.kt)("p",null,"In rare instances, a nominator may be actively nominating several validators in a single era. In\nthis case, the slash is proportionate to the amount staked to that specific validator. With very\nlarge bonds, such as parachain liquid staking accounts, a nominator has multiple active nominations\nper era (Acala's LDOT nominator typically has 7-12 active nominations per era). Note that you cannot\ncontrol the percentage of stake you have allocated to each validator or choose who your active\nvalidator will be (except in the trivial case of nominating a single validator). Staking allocations\nare controlled by the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"Phragm\xe9n algorithm"),"."),(0,i.kt)("p",null,'Once a validator gets slashed, it goes into the state as an "unapplied slash". You can check this\nvia\n',(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/staking/slashes"},"Polkadot-JS UI"),".\nThe UI shows it per validator and then all the affected nominators along with the amounts. While\nunapplied, a governance proposal can be made to reverse it during this period (7 days on Kusama, 28\ndays on Polkadot). After the grace period, the slashes are applied."),(0,i.kt)("p",null,"The following levels of offense are\n",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/security/slashing/amounts"},"defined"),". However, these\nparticular levels are not implemented or referred to in the code or in the system; they are meant as\nguidelines for different levels of severity for offenses. To understand how slash amounts are\ncalculated, see the equations in the section below."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Level 1: isolated ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking-advanced/#unresponsiveness"},"unresponsiveness"),", i.e. being\noffline for an entire session. Generally no slashing, only ",(0,i.kt)("a",{parentName:"li",href:"#chilling"},"chilling"),"."),(0,i.kt)("li",{parentName:"ul"},"Level 2: concurrent unresponsiveness or isolated\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking-advanced/#equivocation"},"equivocation"),", slashes a very small amount of the\nstake and chills."),(0,i.kt)("li",{parentName:"ul"},"Level 3: misconducts unlikely to be accidental, but which do not harm the network's security to\nany large extent. Examples include concurrent equivocation or isolated cases of unjustified voting\nin ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-consensus"},"GRANDPA"),". Slashes a moderately small amount of the stake and chills."),(0,i.kt)("li",{parentName:"ul"},"Level 4: misconduct that poses serious security or monetary risk to the system, or mass collusion.\nSlashes all or most of the stake behind the validator and chills.")),(0,i.kt)("p",null,"If you want to know more details about slashing, please look at our\n",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/security/slashing/amounts"},"research page"),"."),(0,i.kt)("h3",{id:"chilling"},"Chilling"),(0,i.kt)("p",null,"Chilling 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. It can also specifically mean\nremoving a validator from the active validator set by another validator, disqualifying them from the\nset of electable candidates in the next NPoS cycle."),(0,i.kt)("p",null,"Chilling may be voluntary and validator-initiated, e.g. if there is a planned outage in the\nvalidator's surroundings or hosting provider, and the validator wants to exit to protect themselves\nagainst slashing. When voluntary, chilling will keep the validator active in the current session,\nbut will move them to the inactive set in the next. The validator will not lose their nominators."),(0,i.kt)("p",null,"When used as part of a punishment (initiated externally), being chilled carries an implied penalty\nof being un-nominated. It also disables the validator for the remainder of the current era and\nremoves the offending validator from the next election."),(0,i.kt)("p",null,"Polkadot allows some validators to be\ndisabled, but if the number of disabled validators gets too large,\nPolkadot will trigger a new validator election\nto get a full set. Disabled validators will need to resubmit their intention to validate and\nre-garner support from nominators."),(0,i.kt)("p",null,'For more on chilling, see the "',(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-chill"},"How to Chill"),'" page on\nthis wiki.'),(0,i.kt)("h3",{id:"fast-unstake"},"Fast Unstake"),(0,i.kt)("admonition",{title:"Fast Unstaking feature is live!",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"If you accidentally bonded your DOT or your\nbonded DOT never backed any active validator, you\ncan now unbond them immediately.")),(0,i.kt)("p",null,"If your bonded balance did not back any validators in the last\n28 days on Polkadot, you are\neligible to perform fast unstaking. The\n",(0,i.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/#/overview"},"staking dashboard")," will automatically check if you\nqualify. For more information, visit the\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000169433-can-i-transfer-dot-without-unbonding-and-waiting-28-days-"},'"Fast Unstake" section in this support article'),"."),(0,i.kt)("h2",{id:"why-and-why-not-to-stake"},"Why and Why not to Stake?"),(0,i.kt)("h3",{id:"pros-of-staking"},"Pros of Staking"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Earn rewards for contributing to the network's security through staking."),(0,i.kt)("li",{parentName:"ul"},"Low barrier of entry through ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-nomination-pools"},"Nomination Pools"),"."),(0,i.kt)("li",{parentName:"ul"},"Can choose up-to\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominations",defaultValue:16,mdxType:"RPC"}),"\nvalidators which can help to decentralize the network through the sophisticated\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-consensus/#nominated-proof-of-stake"},"NPoS system")),(0,i.kt)("li",{parentName:"ul"},"10% inflation/year of the tokens is primarily intended for staking rewards.")),(0,i.kt)("p",null,"When the system staking rate matches with the ideal staking rate, the entire inflation of the\nnetwork is given away as the staking rewards.\nUp until now, the network has been following an inflation model that excludes the metric of active parachains.\nThe ideal staking rate is a dynamic value - as the number of active parachains influences the\navailable liquidity that is available to secure the network."),(0,i.kt)("p",null,"Any divergence from the ideal staking rate will result in the distribution of a proportion of the\nnewly minted tokens through inflation to go to the treasury. Keep in mind that when the system's\nstaking rate is lower than the ideal staking rate, the annual nominal return rate will be higher,\nencouraging more users to use their tokens for staking. On the contrary, when the system staking\nrate is higher than the ideal staking rate, the annual nominal return will be less, encouraging some\nusers to withdraw. For in-depth understanding, check the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced#inflation"},"inflation")," section on the Wiki."),(0,i.kt)("h3",{id:"cons-of-staking"},"Cons of Staking"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Tokens will be locked for about 28 days on\nPolkadot. No rewards will be earned during\nthe unbonding period.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Possible punishment in case of the active validator found to be misbehaving (see\n",(0,i.kt)("a",{parentName:"p",href:"#slashing"},"slashing"),").")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Lack of liquidity i.e. You would not be able to use the tokens for participating in crowdloans or\ntransfer them to different account etc."))),(0,i.kt)("h2",{id:"how-many-validators"},"How many Validators?"),(0,i.kt)("p",null,"Polkadot currently has\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.validatorCount",defaultValue:297,mdxType:"RPC"}),"\n","\nvalidators. The top bound on the number of validators has not been determined yet, but should only\nbe limited by the bandwidth strain of the network due to peer-to-peer message passing."),(0,i.kt)("p",null,"The estimate of the number of validators that Polkadot will have at maturity is around 1000.\nKusama is already operating at this threshold."),(0,i.kt)("h2",{id:"why-am-i-not-receiving-rewards"},"Why am I not receiving rewards?"),(0,i.kt)("p",null,"Nominating on Polkadot is not a set-and-forget\naction. Nominators need to monitor their nominations and ensure they are eligible to receive staking\nrewards. Otherwise, they would be risking their funds to secure the chain with no reward. If you are\nbonding significantly more than the Minimum Active Bond and yet not receiving rewards, your\nnominations are all waiting, or your active validator has 100% commission. However, if you bond\nfunds close to the Minimum Active Bond, there could be several possibilities for not receiving\nstaking rewards. The table below can be used to troubleshoot why you might not be receiving staking\nrewards using Polkadot-JS UI."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:"center"},"Nomination Status"),(0,i.kt)("th",{parentName:"tr",align:"center"},"What's happening?"),(0,i.kt)("th",{parentName:"tr",align:"center"},"Causes"),(0,i.kt)("th",{parentName:"tr",align:"center"},"What to do?"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Nominated validators are all in waiting status."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Your stake has not been assigned to any of the nominated validators. You cannot earn rewards, nor be slashed in that era."),(0,i.kt)("td",{parentName:"tr",align:"center"},'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".'),(0,i.kt)("td",{parentName:"tr",align:"center"},"Change your nominations. Try to select validators (with reasonable commission) that have high chances to end up in the active set.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"You have some inactive, and some waiting nominations."),(0,i.kt)("td",{parentName:"tr",align:"center"},'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.'),(0,i.kt)("td",{parentName:"tr",align:"center"},(0,i.kt)("strong",{parentName:"td"},"Scenario 1:")," You have bonded less than the Minimum Active Bond. ",(0,i.kt)("strong",{parentName:"td"},"Scenario 2:")," You have more than the Minimum Active Bond, but your account is at the tail end of the ",(0,i.kt)("a",{parentName:"td",href:"/docs/learn-staking-advanced#bags-list"},"bags list")," and within your bag there are acounts with less stake than you, in front of you."),(0,i.kt)("td",{parentName:"tr",align:"center"},(0,i.kt)("strong",{parentName:"td"},"Scenario 1:")," Try bonding more funds. ",(0,i.kt)("strong",{parentName:"td"},"Scenario 2:")," Try to put your account in front of the accounts with less stake than you. Instructions available ",(0,i.kt)("a",{parentName:"td",href:"https://support.polkadot.network/support/solutions/articles/65000181018-i-have-more-than-the-minimum-bonded-but-i-m-not-getting-rewards"},"here"))),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"You have one active validator."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Active validators are producing blocks in the current era, and your stake has been assigned to them. Even if you are not earning rewards, you can be slashed."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Your validator is oversubscribed, meaning that it has more than 512 nominators (ranked by stake), and your stake is less than that of those nominators."),(0,i.kt)("td",{parentName:"tr",align:"center"},"You can try to select validators that are not oversubscribed but in the long term you might want to bond more funds (even more than the Minimum Active Bond) to increase the chance of earning rewards also with oversubscribed validators.")))),(0,i.kt)("admonition",{title:"Join a Nomination Pool",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"By joining a ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pool")," that is active and earning rewards, you\ncan start earning staking rewards with as low as 1 DOT. The nomination pools typically have a\ndedicated pool operator who ensures that the pool's stake is always backing an active validator and\nis receiving rewards.")),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"You can find information about why you might not receive staking rewards on\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000170805-why-am-i-not-getting-staking-rewards-"},"this support page"),".")),(0,i.kt)("h2",{id:"staking-faq"},"Staking FAQ"),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"See\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181959-staking-faq-s"},"this support page"),"\nfor the FAQs about staking.")),(0,i.kt)("h2",{id:"resources"},"Resources"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://medium.com/web3foundation/how-nominated-proof-of-stake-will-work-in-polkadot-377d70c6bd43"},"How Nominated Proof of Stake will work in Polkadot")," -\nBlog post by Web3 Foundation researcher Alfonso Cevallos covering NPoS in Polkadot."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/maintain-guides-secure-validator"},"Validator setup"))))}m.isMDXComponent=!0},89303:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/reward-risk-fee9f991186d4097ca3d3f0a713f4ad4.png"},4080:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/stash-and-staking-proxy-ea4d09387a4b56d1349ee896427d9f1d.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/1ae2b102.182a3714.js b/assets/js/1ae2b102.182a3714.js new file mode 100644 index 000000000000..599b7f8b95b8 --- /dev/null +++ b/assets/js/1ae2b102.182a3714.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[4537],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>u});var n=a(74165),o=a(15861),i=a(67294),r=a(87152),s=a(17145),l=a(67425);function c(e,t,a){return d.apply(this,arguments)}function d(){return(d=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var i,l,c,d,h;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return c=new r.U(i),e.next=21,s.G.create({provider:c});case 21:d=e.sent,(h=a.split(".")).forEach((function(e){e in d&&(d=d[e])})),e.t1=h[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=d.toString(),e.abrupt("break",35);case 29:return e.next=31,d();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+h[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function h(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"permillToPercent":(0,l.PermillToPercent)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(e){var t=e.network,a=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,d=(0,i.useState)(""),u=d[0],p=d[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?h(r.toString(),l,t,p):p(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c(t,a,p);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?h(o,l,t,p):p(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),u}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},1799:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>c,default:()=>m,frontMatter:()=>l,metadata:()=>d,toc:()=>u});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),r=a(47940),s=["components"],l={id:"build-protocol-info",title:"Polkadot Protocol Information",sidebar_label:"Polkadot Protocol",description:"Characteristics about the Polkadot protocol, and what you need to consider when building.",keywords:["build","protocol","extrinsics","events","transaction"],slug:"../build-protocol-info"},c=void 0,d={unversionedId:"build/build-protocol-info",id:"build/build-protocol-info",title:"Polkadot Protocol Information",description:"Characteristics about the Polkadot protocol, and what you need to consider when building.",source:"@site/../docs/build/build-protocol-info.md",sourceDirName:"build",slug:"/build-protocol-info",permalink:"/docs/build-protocol-info",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/build/build-protocol-info.md",tags:[],version:"current",lastUpdatedBy:"vuittont60",lastUpdatedAt:1697188456,formattedLastUpdatedAt:"Oct 13, 2023",frontMatter:{id:"build-protocol-info",title:"Polkadot Protocol Information",sidebar_label:"Polkadot Protocol",description:"Characteristics about the Polkadot protocol, and what you need to consider when building.",keywords:["build","protocol","extrinsics","events","transaction"],slug:"../build-protocol-info"},sidebar:"docs",previous:{title:"Integration Initiation",permalink:"/docs/build-integration"},next:{title:"Integrating Assets",permalink:"/docs/build-integrate-assets"}},h={},u=[{value:"Tokens",id:"tokens",level:2},{value:"Redenomination",id:"redenomination",level:3},{value:"Addresses",id:"addresses",level:2},{value:"Cryptography",id:"cryptography",level:3},{value:"Existential Deposit",id:"existential-deposit",level:2},{value:"Free vs. Reserved vs. Locked vs. Vesting Balance",id:"free-vs-reserved-vs-locked-vs-vesting-balance",level:2},{value:"Extrinsics and Events",id:"extrinsics-and-events",level:2},{value:"Block Format",id:"block-format",level:3},{value:"Extrinsics",id:"extrinsics",level:3},{value:"Transaction Mortality",id:"transaction-mortality",level:3},{value:"Unique Identifiers for Extrinsics",id:"unique-identifiers-for-extrinsics",level:3},{value:"Events",id:"events",level:3},{value:"Fees",id:"fees",level:3},{value:"Encoding",id:"encoding",level:3},{value:"Runtime Upgrades",id:"runtime-upgrades",level:2},{value:"Transaction Version Upgrades",id:"transaction-version-upgrades",level:3},{value:"Smart Contracts",id:"smart-contracts",level:2},{value:"Other Networks",id:"other-networks",level:2},{value:"Other F.A.Q.",id:"other-faq",level:2}],p={toc:u},k="wrapper";function m(e){var t=e.components,a=(0,o.Z)(e,s);return(0,i.kt)(k,(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"This page serves as a high-level introduction to the Polkadot protocol with terminology that may be\nspecific to Polkadot, notable differences to other chains that you may have worked with, and\npractical information for dealing with the chain."),(0,i.kt)("h2",{id:"tokens"},"Tokens"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Token decimals:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Polkadot (DOT): 10"),(0,i.kt)("li",{parentName:"ul"},"Kusama (KSM): 12"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Base unit:"),' "Planck"'),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Balance type:")," ",(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/u128/index.html"},(0,i.kt)("inlineCode",{parentName:"a"},"u128")))),(0,i.kt)("h3",{id:"redenomination"},"Redenomination"),(0,i.kt)("p",null,'Polkadot conducted a poll, which ended on 27 July 2020 (block 888_888), in which the stakeholders\ndecided to redenominate the DOT token. The redenomination does not change the number of base units\n(called "plancks" in Polkadot) in the network. The only change is that a single DOT token will be\n1e10 plancks instead of the original 1e12 plancks. See the Polkadot blog posts explaining the\n',(0,i.kt)("a",{parentName:"p",href:"https://medium.com/polkadot-network/the-first-polkadot-vote-1fc1b8bd357b"},"details")," and the\n",(0,i.kt)("a",{parentName:"p",href:"https://medium.com/polkadot-network/the-results-are-in-8f6b1ca2a4e6"},"results")," of the vote."),(0,i.kt)("p",null,"The redenomination took effect 72 hours after transfers were enabled, at block 1_248_326, which\noccurred at approximately 16:50 UTC on 21 Aug 2020. You can find more information about the\nredenomination ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-redenomination"},"here"),"."),(0,i.kt)("h2",{id:"addresses"},"Addresses"),(0,i.kt)("p",null,"In Polkadot (and most Substrate chains), user accounts are identified by a 32-byte (256-bit)\n",(0,i.kt)("inlineCode",{parentName:"p"},"AccountId"),". This is often, but not always, the public key of a cryptographic key pair."),(0,i.kt)("p",null,'Polkadot (and Substrate) use the SS58 address format. This is a broad "meta-format" designed to\nhandle many different cryptographic schemes and chains. It has much in common with Bitcoin\'s\nBase58Check format such as a version prefix, a hash-based checksum suffix, and base-58 encoding.'),(0,i.kt)("p",null,"See the\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/main-docs/fundamentals/accounts-addresses-keys/#address-encoding-and-chain-specific-addresses"},"SS58 page"),"\nin the Substrate documentation for encoding information and a more comprehensive list of network\nprefixes."),(0,i.kt)("admonition",{title:"Do not use regular expressions (regex) to validate addresses",type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"Always verify using the prefix and checksum of the address. Substrate API Sidecar provides an\n",(0,i.kt)("inlineCode",{parentName:"p"},"accounts/{accountId}/validate")," path that returns a boolean ",(0,i.kt)("inlineCode",{parentName:"p"},"isValid")," response for a provided\naddress.")),(0,i.kt)("p",null,"Relevant SS58 prefixes for this guide:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Polkadot: 0"),(0,i.kt)("li",{parentName:"ul"},"Kusama: 2"),(0,i.kt)("li",{parentName:"ul"},"Westend: 42")),(0,i.kt)("h3",{id:"cryptography"},"Cryptography"),(0,i.kt)("p",null,"Polkadot supports the following ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"cryptographic")," key pairs and\nsigning algorithms:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Ed25519"),(0,i.kt)("li",{parentName:"ul"},"Sr25519 - Schnorr signatures on the Ristretto group"),(0,i.kt)("li",{parentName:"ul"},"ECDSA signatures on secp256k1")),(0,i.kt)("p",null,"Note that the address for a secp256k1 key is the SS58 encoding of the ",(0,i.kt)("em",{parentName:"p"},"hash of the public key")," in\norder to reduce the public key from 33 bytes to 32 bytes."),(0,i.kt)("h2",{id:"existential-deposit"},"Existential Deposit"),(0,i.kt)("p",null,"Polkadot, and most Substrate-based chains, use an ",(0,i.kt)("em",{parentName:"p"},"existential deposit")," (ED) to prevent dust\naccounts from bloating chain state. If an account drops below the ED, it will be ",(0,i.kt)("em",{parentName:"p"},"reaped,")," i.e.\ncompletely removed from storage and the nonce reset. Polkadot's ED is\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.balances.existentialDeposit",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),",\n","\nwhile Kusama's is\n",(0,i.kt)(r.Z,{network:"kusama",path:"consts.balances.existentialDeposit",defaultValue:333333333,filter:"humanReadable",mdxType:"RPC"}),".\n","\nYou can always verify the existential deposit by checking the\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate"},"chain state")," for the constant\n",(0,i.kt)("inlineCode",{parentName:"p"},"balances.existentialDeposit"),"."),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"For more information about the existential deposit visit the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-accounts#existential-deposit-and-reaping"},"dedicated section")," in the Accounts\npage.")),(0,i.kt)("p",null,"Likewise, if you send a transfer with value below the ED to a new account, it will fail. Custodial\nwallets should set a minimum withdrawal amount that is greater than the ED to guarantee successful\nwithdrawals."),(0,i.kt)("p",null,"Wallets and custodians who track account nonces for auditing purposes should take care not to have\naccounts reaped, as users could refund the address and try making transactions from it. The Balances\npallet provides a ",(0,i.kt)("inlineCode",{parentName:"p"},"transfer_keep_alive")," function that will return an error and abort rather than\nmake the transfer if doing so would result in reaping the sender's account."),(0,i.kt)("admonition",{title:"The existential deposit is a property of the Relay Chain",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Your account on the Relay Chain has no direct impact on parachains as you have separate accounts on\neach parachain. Still, parachains are able to define an existential deposit of their own, but this\nis separate to that of the Relay Chain ED.")),(0,i.kt)("admonition",{title:"Existential deposit for the Asset Hub",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"The Asset Hub parachain has a lower existential deposit (0.1 DOT) than the Relay Chain (1 DOT) as\nwell as lower transaction fees. It is highly recommended to handle balance transfers on the Asset\nHub. Asset Hub integration is discussed in the next page of the guide.")),(0,i.kt)("h2",{id:"free-vs-reserved-vs-locked-vs-vesting-balance"},"Free vs. Reserved vs. Locked vs. Vesting Balance"),(0,i.kt)("p",null,"Account balance information is stored in\n",(0,i.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_balances/struct.AccountData.html"},(0,i.kt)("inlineCode",{parentName:"a"},"AccountData")),".\nPolkadot primarily deals with two types of balances: free and reserved."),(0,i.kt)("p",null,'For most operations, free balance is what you are interested in. It is the "power" of an account in\nstaking and governance, for example. Reserved balance represents funds that have been set aside by\nsome operation and still belong to the account holder, but cannot be used.'),(0,i.kt)("p",null,"Locks are an abstraction over free balance that prevent spending for certain purposes. Several locks\ncan operate on the same account, but they overlap rather than add. Locks are automatically added\nonto accounts when tasks are done on the network (e.g. leasing a parachain slot or voting), these\nare not customizable. For example, an account could have a free balance of 200 DOT with two locks on\nit: 150 DOT for ",(0,i.kt)("inlineCode",{parentName:"p"},"Transfer")," purposes and 100 DOT for ",(0,i.kt)("inlineCode",{parentName:"p"},"Reserve")," purposes. The account could not make a\ntransfer that brings its free balance below 150 DOT, but an operation could result in reserving DOT\nsuch that the free balance is below 150, but above 100 DOT."),(0,i.kt)("p",null,"Bonding tokens for staking and voting in governance referenda both utilize locks."),(0,i.kt)("p",null,"Vesting is another abstraction that uses locks on free balance. Vesting sets a lock that decreases\nover time until all the funds are transferable."),(0,i.kt)("p",null,"More info:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://paritytech.github.io/substrate/master/frame_support/traits/trait.LockableCurrency.html"},"Lockable Currency")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://paritytech.github.io/substrate/master/frame_support/traits/struct.WithdrawReasons.html"},"Lock Withdraw Reasons")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://paritytech.github.io/substrate/master/pallet_vesting/struct.VestingInfo.html"},"Vesting Info"))),(0,i.kt)("h2",{id:"extrinsics-and-events"},"Extrinsics and Events"),(0,i.kt)("h3",{id:"block-format"},"Block Format"),(0,i.kt)("p",null,"A Polkadot block consists of a block header and a block body. The block body is made up of\nextrinsics representing the generalization of the concept of transactions. Extrinsics can contain\nany external data the underlying chain wishes to validate and track."),(0,i.kt)("p",null,"The block header is a 5-tuple containing the following elements:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"parent_hash"),": a 32-byte Blake2b hash of the SCALE encoded parent block header."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"number"),": an integer representing the index of the current block in the chain. It is equal to the\nnumber of the ancestor blocks. The genesis state has number 0."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"state_root"),": the root of the Merkle tree, used as storage for the system."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"extrinsics_root"),": field which is reserved for the Runtime to validate the integrity of the\nextrinsics composing the block body."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"digest"),": field used to store any chain-specific auxiliary data, which could help the light\nclients interact with the block without the need of accessing the full storage as well as\nconsensus-related data including the block signature.")),(0,i.kt)("p",null,"A node creating or receiving a block must gossip that block to the network (i.e. to the other\nnodes). Other nodes within the network will track this announcement and can request information\nabout the block. Additional details on the process are outlined\n",(0,i.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#sect-msg-block-announce"},"here")," in the Polkadot Spec."),(0,i.kt)("h3",{id:"extrinsics"},"Extrinsics"),(0,i.kt)("p",null,"An extrinsic is a ",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/scale-codec/"},"SCALE encoded")," array consisting\nof a ",(0,i.kt)("inlineCode",{parentName:"p"},"version number"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"signature"),", and varying ",(0,i.kt)("inlineCode",{parentName:"p"},"data")," types indicating the resulting runtime\nfunction to be called, including the parameters required for that function to be executed."),(0,i.kt)("p",null,"Extrinsics constitute information from the outside world and take on three forms:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Inherents"),(0,i.kt)("li",{parentName:"ul"},"Signed Transactions"),(0,i.kt)("li",{parentName:"ul"},"Unsigned Transactions")),(0,i.kt)("p",null,"As an infrastructure provider, you will deal almost exclusively with signed transactions. You will,\nhowever, see other extrinsics within the blocks that you decode. Find more information in the\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/main-docs/build/tx-weights-fees/"},"Substrate documentation"),"."),(0,i.kt)("p",null,"Inherent extrinsics are unsigned and contain information that is not provably true, but validators\nagree on based on some measure of reasonability. For example, a timestamp cannot be proved, but\nvalidators can agree that it is within some time difference on their system clock. Inherents are\nbroadcasted as part of the produced blocks rather than being gossiped as individual extrinsics."),(0,i.kt)("p",null,"Signed transactions contain a signature of the account that issued the transaction and stands to pay\na fee to have the transaction included on chain. Because the value of including signed transactions\non-chain can be recognized prior to execution, they can be gossiped on the network between nodes\nwith a low risk of spam. Signed transactions fit the concept of a transaction in Ethereum or\nBitcoin."),(0,i.kt)("p",null,"Some transactions cannot be signed by a fee-paying account and use unsigned transactions. For\nexample, when a user claims their DOT from the Ethereum DOT indicator contract to a new DOT address,\nthe new address doesn't yet have any funds with which to pay fees."),(0,i.kt)("p",null,"The Polkadot Host does not specify or limit the internals of each extrinsics and those are defined\nand dealt with by the Runtime."),(0,i.kt)("h3",{id:"transaction-mortality"},"Transaction Mortality"),(0,i.kt)("p",null,'Extrinsics can be mortal or immortal. The transaction payload includes a block number and block hash\ncheckpoint from which a transaction is valid and a validity period (also called "era" in some\nplaces) that represents the number of blocks after the checkpoint for which the transaction is\nvalid. If the extrinsic is not included in a block within this validity window, it will be discarded\nfrom the transaction queue.'),(0,i.kt)("p",null,"The chain only stores a limited number of prior block hashes as reference. You can query this\nparameter, called ",(0,i.kt)("inlineCode",{parentName:"p"},"BlockHashCount"),", from the chain state or metadata. This parameter is set to\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.system.blockHashCount",defaultValue:4096,mdxType:"RPC"}),"\nblocks (about seven hours) at genesis. If the validity period is larger than the number of blocks\nstored on-chain, then the transaction will only be valid as long as there is a block to check it\nagainst, i.e. the minimum value of validity period and block hash count."),(0,i.kt)("p",null,'Setting the block checkpoint to zero, using the genesis hash, and a validity period of zero will\nmake the transaction "immortal".'),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"NOTE:")," If an account is reaped and a user re-funds the account, then they could replay an\nimmortal transaction. Always default to using a mortal extrinsic."),(0,i.kt)("h3",{id:"unique-identifiers-for-extrinsics"},"Unique Identifiers for Extrinsics"),(0,i.kt)("admonition",{title:"Transaction Hash is not a unique identifier",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"The assumption that a transaction's hash is a unique identifier is the number one mistake that\nindexing services and custodians make. This error will cause major issues for your users. Make sure\nthat you read this section carefully.")),(0,i.kt)("p",null,"Many infrastructure providers on existing blockchains, e.g. Ethereum, consider a transaction's hash\nas a unique identifier. In Substrate-based chains like Polkadot, a transaction's hash only serves as\na fingerprint of the information within a transaction, and there are times when two transactions\nwith the same hash are both valid. In the case that one is invalid, the network properly handles the\ntransaction and does not charge a transaction fee to the sender nor consider the transaction in the\nblock's fullness."),(0,i.kt)("p",null,"Imagine this contrived example with a ",(0,i.kt)("a",{parentName:"p",href:"#existential-deposit"},"reaped account"),". The first and last\ntransactions are identical, and both valid."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:"center"},"Index"),(0,i.kt)("th",{parentName:"tr",align:"center"},"Hash"),(0,i.kt)("th",{parentName:"tr",align:"left"},"Origin"),(0,i.kt)("th",{parentName:"tr",align:"center"},"Nonce"),(0,i.kt)("th",{parentName:"tr",align:"left"},"Call"),(0,i.kt)("th",{parentName:"tr",align:"left"},"Results"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"0"),(0,i.kt)("td",{parentName:"tr",align:"center"},"0x01"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Account A"),(0,i.kt)("td",{parentName:"tr",align:"center"},"0"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Transfer 5 DOT to B"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Account A reaped")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"1"),(0,i.kt)("td",{parentName:"tr",align:"center"},"0x02"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Account B"),(0,i.kt)("td",{parentName:"tr",align:"center"},"4"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Transfer 7 DOT to A"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Account A created (nonce = 0)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"2"),(0,i.kt)("td",{parentName:"tr",align:"center"},"0x01"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Account A"),(0,i.kt)("td",{parentName:"tr",align:"center"},"0"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Transfer 5 DOT to B"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Successful transaction")))),(0,i.kt)("p",null,"In addition, not every extrinsic in a Substrate-based chain comes from an account as a\npublic/private key pair; Substrate, rather, has the concept of dispatch \u201corigin\u201d, which could be\ncreated from a public key account, but could also form from other means such as governance. These\norigins do not have a nonce associated with them the way that an account does. For example,\ngovernance might dispatch the same call with the same arguments multiple times, like \u201cincrease the\nvalidator set by 10%.\u201d This dispatch information (and therefore its hash) would be the same, and the\nhash would be a reliable representative of the call, but its execution would have different effects\ndepending on the chain\u2019s state at the time of dispatch."),(0,i.kt)("p",null,"The correct way to uniquely identify an extrinsic on a Substrate-based chain is to use the block ID\n(height or hash) and the extrinsic's index. Substrate defines a block as a header and an array of\nextrinsics; therefore, an index in the array at a canonical height will always uniquely identify a\ntransaction. This methodology is reflected in the Substrate codebase itself, for example to\n",(0,i.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_multisig/struct.Timepoint.html"},"reference a previous transaction"),"\nfrom the Multisig pallet."),(0,i.kt)("h3",{id:"events"},"Events"),(0,i.kt)("p",null,"While extrinsics represent information from the outside world, events represent information from the\nchain. Extrinsics can trigger events. For example, the Staking pallet emits a ",(0,i.kt)("inlineCode",{parentName:"p"},"Reward")," event when\nclaiming staking rewards to tell the user how much the account was credited."),(0,i.kt)("p",null,"If you want to monitor deposits into an address, keep in mind that several transactions can initiate\na balance transfer (such as ",(0,i.kt)("inlineCode",{parentName:"p"},"balances.transferKeepAlive")," and a ",(0,i.kt)("inlineCode",{parentName:"p"},"utility.batch")," transaction with a\ntransfer inside of it). Only monitoring ",(0,i.kt)("inlineCode",{parentName:"p"},"balances.transfer")," transactions will not be sufficient.\nMake sure that you monitor events in each block for events that contain your addresses of interest.\nMonitor events instead of transaction names to ensure that you can properly credit deposits."),(0,i.kt)("h3",{id:"fees"},"Fees"),(0,i.kt)("p",null,"Polkadot uses weight-based fees that, unlike gas, are charged ",(0,i.kt)("em",{parentName:"p"},"pre-dispatch."),' Users can also add a\n"tip" to increase transaction priority during congested periods. See the\n',(0,i.kt)("a",{parentName:"p",href:"/docs/learn-transaction-fees"},"transaction fee")," page for more info."),(0,i.kt)("h3",{id:"encoding"},"Encoding"),(0,i.kt)("p",null,"Parity's integration tools should allow you to deal with decoded data. If you'd like to bypass them\nand interact directly with the chain data or implement your own codec, Polkadot encodes block and\ntransaction data using the ",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/scale-codec/"},"SCALE codec"),"."),(0,i.kt)("h2",{id:"runtime-upgrades"},"Runtime Upgrades"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"/docs/learn-runtime-upgrades"},"Runtime upgrades")," allow Polkadot to change the logic of the\nchain without the need for a hard fork. A hard fork would require node operators to manually upgrade\ntheir nodes to the latest runtime version. In a distributed system, this is a complex process to\ncoordinate and communicate. Polkadot can upgrade without a hard fork. The existing runtime logic is\nfollowed to update the Wasm runtime stored on the blockchain to a new version. The upgrade is then\nincluded in the blockchain itself, meaning that all the nodes on the network execute it."),(0,i.kt)("p",null,"Generally there is no need to upgrade your nodes manually before the runtime upgrade as they will\nautomatically start to follow the new logic of the chain. Nodes only need to be updated when the\nruntime requires new host functions or there is a change in networking or consensus."),(0,i.kt)("p",null,"Transactions 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 don't think you can submit a transaction before the upgrade, it is better to wait and construct\nit after the upgrade takes place."),(0,i.kt)("p",null,"Although upgrading your nodes is generally not necessary to follow an upgrade, we recommend\nfollowing the Polkadot releases and upgrading in a timely manner, especially for high priority or\ncritical releases."),(0,i.kt)("h3",{id:"transaction-version-upgrades"},"Transaction Version Upgrades"),(0,i.kt)("p",null,"Apart the ",(0,i.kt)("inlineCode",{parentName:"p"},"runtime_version")," there is also the ",(0,i.kt)("inlineCode",{parentName:"p"},"transaction_version")," which denotes how to correctly\nencode/decode calls for a given runtime (useful for hardware wallets). The reason\n",(0,i.kt)("inlineCode",{parentName:"p"},"transaction_version")," is separate from ",(0,i.kt)("inlineCode",{parentName:"p"},"runtime_version")," is that it explicitly notes that the call\ninterface is broken/not compatible."),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"transaction_version")," is updated in the cases mentioned in the\n",(0,i.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/sp_version/struct.RuntimeVersion.html#structfield.transaction_version"},"Substrate docs"),".\nSo when a new transaction version is introduced (during a runtime upgrade), it indicates a breaking\nchange to transaction serialization. In that case, any custom application/tool that constructs &\nsigns transactions should also be updated in order to be compatible with the new transaction\nversion. It is the responsibility of the maintainers of the custom application/tool to keep up with\nthe ",(0,i.kt)("inlineCode",{parentName:"p"},"transaction_version")," updates. However, if you do not want to keep monitoring these changes\nyourself, you can also use the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/txwrapper-core"},"txwrapper-core")," tool\nthat handles these breaking changes for you and allows you to construct transactions using the\nfunction names and chain metadata."),(0,i.kt)("h2",{id:"smart-contracts"},"Smart Contracts"),(0,i.kt)("p",null,"The Polkadot Relay Chain does not support smart contracts."),(0,i.kt)("h2",{id:"other-networks"},"Other Networks"),(0,i.kt)("p",null,"Besides running a private network, Polkadot has two other networks where you could test\ninfrastructure prior to deploying to the Polkadot mainnet."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Kusama Canary Network:")," Kusama is Polkadot's cutting-edge cousin. Many risky features are\ndeployed to Kusama prior to making their way into Polkadot."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Westend Testnet:")," Westend is Polkadot's testnet and uses the Polkadot runtime."),(0,i.kt)("h2",{id:"other-faq"},"Other F.A.Q."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Can an account's balance change without a corresponding, on-chain transaction?")),(0,i.kt)("p",null,"No, but not all balance changes are in a ",(0,i.kt)("em",{parentName:"p"},"transaction,")," some are in ",(0,i.kt)("em",{parentName:"p"},"events.")," You will need to run\nan archive node and listen for events and transactions to track all account activity. This\nespecially applies to ",(0,i.kt)("em",{parentName:"p"},"locking")," operations if you are calculating balance as the spendable balance,\ni.e. free balance minus the maximum lock."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},'What chain depth is considered "safe"?')),(0,i.kt)("p",null,"Polkadot uses a deterministic finality mechanism. Once a block is finalized, it cannot be reverted\nexcept by a hard fork. Kusama has had hard forks that had to revert four finalized blocks in order\nto cancel a runtime upgrade. Using a finalized depth of ten blocks should be safe."),(0,i.kt)("p",null,"Note that block production and finality are isolated processes in Polkadot, and the chain can have a\nlong unfinalized head."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Do users need to interact with any smart contracts?")),(0,i.kt)("p",null,"No, users interact directly with the chain's logic."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Does Polkadot have state rent?")),(0,i.kt)("p",null,"No, Polkadot uses the existential deposit to prevent dust accounts and other economic mechanisms\nlike locking or reserving tokens for operations that utilize state."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"What is an external source to see the current chain height?")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"Polkadot-JS explorer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://polkascan.io/"},"Polkascan block explorer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.subscan.io/"},"Subscan block explorer"))))}m.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/1ae2b102.690d2f4b.js b/assets/js/1ae2b102.690d2f4b.js deleted file mode 100644 index 37bff545f5bb..000000000000 --- a/assets/js/1ae2b102.690d2f4b.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[4537],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>u});var n=a(74165),o=a(15861),i=a(67294),r=a(87152),s=a(17145),l=a(67425);function c(e,t,a){return d.apply(this,arguments)}function d(){return(d=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var i,l,c,d,h;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return c=new r.U(i),e.next=21,s.G.create({provider:c});case 21:d=e.sent,(h=a.split(".")).forEach((function(e){e in d&&(d=d[e])})),e.t1=h[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=d.toString(),e.abrupt("break",35);case 29:return e.next=31,d();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+h[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function h(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(e){var t=e.network,a=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,d=(0,i.useState)(""),u=d[0],p=d[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?h(r.toString(),l,t,p):p(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c(t,a,p);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?h(o,l,t,p):p(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),u}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},1799:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>c,default:()=>m,frontMatter:()=>l,metadata:()=>d,toc:()=>u});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),r=a(47940),s=["components"],l={id:"build-protocol-info",title:"Polkadot Protocol Information",sidebar_label:"Polkadot Protocol",description:"Characteristics about the Polkadot protocol, and what you need to consider when building.",keywords:["build","protocol","extrinsics","events","transaction"],slug:"../build-protocol-info"},c=void 0,d={unversionedId:"build/build-protocol-info",id:"build/build-protocol-info",title:"Polkadot Protocol Information",description:"Characteristics about the Polkadot protocol, and what you need to consider when building.",source:"@site/../docs/build/build-protocol-info.md",sourceDirName:"build",slug:"/build-protocol-info",permalink:"/docs/build-protocol-info",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/build/build-protocol-info.md",tags:[],version:"current",lastUpdatedBy:"vuittont60",lastUpdatedAt:1697188456,formattedLastUpdatedAt:"Oct 13, 2023",frontMatter:{id:"build-protocol-info",title:"Polkadot Protocol Information",sidebar_label:"Polkadot Protocol",description:"Characteristics about the Polkadot protocol, and what you need to consider when building.",keywords:["build","protocol","extrinsics","events","transaction"],slug:"../build-protocol-info"},sidebar:"docs",previous:{title:"Integration Initiation",permalink:"/docs/build-integration"},next:{title:"Integrating Assets",permalink:"/docs/build-integrate-assets"}},h={},u=[{value:"Tokens",id:"tokens",level:2},{value:"Redenomination",id:"redenomination",level:3},{value:"Addresses",id:"addresses",level:2},{value:"Cryptography",id:"cryptography",level:3},{value:"Existential Deposit",id:"existential-deposit",level:2},{value:"Free vs. Reserved vs. Locked vs. Vesting Balance",id:"free-vs-reserved-vs-locked-vs-vesting-balance",level:2},{value:"Extrinsics and Events",id:"extrinsics-and-events",level:2},{value:"Block Format",id:"block-format",level:3},{value:"Extrinsics",id:"extrinsics",level:3},{value:"Transaction Mortality",id:"transaction-mortality",level:3},{value:"Unique Identifiers for Extrinsics",id:"unique-identifiers-for-extrinsics",level:3},{value:"Events",id:"events",level:3},{value:"Fees",id:"fees",level:3},{value:"Encoding",id:"encoding",level:3},{value:"Runtime Upgrades",id:"runtime-upgrades",level:2},{value:"Transaction Version Upgrades",id:"transaction-version-upgrades",level:3},{value:"Smart Contracts",id:"smart-contracts",level:2},{value:"Other Networks",id:"other-networks",level:2},{value:"Other F.A.Q.",id:"other-faq",level:2}],p={toc:u},k="wrapper";function m(e){var t=e.components,a=(0,o.Z)(e,s);return(0,i.kt)(k,(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"This page serves as a high-level introduction to the Polkadot protocol with terminology that may be\nspecific to Polkadot, notable differences to other chains that you may have worked with, and\npractical information for dealing with the chain."),(0,i.kt)("h2",{id:"tokens"},"Tokens"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Token decimals:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Polkadot (DOT): 10"),(0,i.kt)("li",{parentName:"ul"},"Kusama (KSM): 12"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Base unit:"),' "Planck"'),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Balance type:")," ",(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/u128/index.html"},(0,i.kt)("inlineCode",{parentName:"a"},"u128")))),(0,i.kt)("h3",{id:"redenomination"},"Redenomination"),(0,i.kt)("p",null,'Polkadot conducted a poll, which ended on 27 July 2020 (block 888_888), in which the stakeholders\ndecided to redenominate the DOT token. The redenomination does not change the number of base units\n(called "plancks" in Polkadot) in the network. The only change is that a single DOT token will be\n1e10 plancks instead of the original 1e12 plancks. See the Polkadot blog posts explaining the\n',(0,i.kt)("a",{parentName:"p",href:"https://medium.com/polkadot-network/the-first-polkadot-vote-1fc1b8bd357b"},"details")," and the\n",(0,i.kt)("a",{parentName:"p",href:"https://medium.com/polkadot-network/the-results-are-in-8f6b1ca2a4e6"},"results")," of the vote."),(0,i.kt)("p",null,"The redenomination took effect 72 hours after transfers were enabled, at block 1_248_326, which\noccurred at approximately 16:50 UTC on 21 Aug 2020. You can find more information about the\nredenomination ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-redenomination"},"here"),"."),(0,i.kt)("h2",{id:"addresses"},"Addresses"),(0,i.kt)("p",null,"In Polkadot (and most Substrate chains), user accounts are identified by a 32-byte (256-bit)\n",(0,i.kt)("inlineCode",{parentName:"p"},"AccountId"),". This is often, but not always, the public key of a cryptographic key pair."),(0,i.kt)("p",null,'Polkadot (and Substrate) use the SS58 address format. This is a broad "meta-format" designed to\nhandle many different cryptographic schemes and chains. It has much in common with Bitcoin\'s\nBase58Check format such as a version prefix, a hash-based checksum suffix, and base-58 encoding.'),(0,i.kt)("p",null,"See the\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/main-docs/fundamentals/accounts-addresses-keys/#address-encoding-and-chain-specific-addresses"},"SS58 page"),"\nin the Substrate documentation for encoding information and a more comprehensive list of network\nprefixes."),(0,i.kt)("admonition",{title:"Do not use regular expressions (regex) to validate addresses",type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"Always verify using the prefix and checksum of the address. Substrate API Sidecar provides an\n",(0,i.kt)("inlineCode",{parentName:"p"},"accounts/{accountId}/validate")," path that returns a boolean ",(0,i.kt)("inlineCode",{parentName:"p"},"isValid")," response for a provided\naddress.")),(0,i.kt)("p",null,"Relevant SS58 prefixes for this guide:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Polkadot: 0"),(0,i.kt)("li",{parentName:"ul"},"Kusama: 2"),(0,i.kt)("li",{parentName:"ul"},"Westend: 42")),(0,i.kt)("h3",{id:"cryptography"},"Cryptography"),(0,i.kt)("p",null,"Polkadot supports the following ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"cryptographic")," key pairs and\nsigning algorithms:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Ed25519"),(0,i.kt)("li",{parentName:"ul"},"Sr25519 - Schnorr signatures on the Ristretto group"),(0,i.kt)("li",{parentName:"ul"},"ECDSA signatures on secp256k1")),(0,i.kt)("p",null,"Note that the address for a secp256k1 key is the SS58 encoding of the ",(0,i.kt)("em",{parentName:"p"},"hash of the public key")," in\norder to reduce the public key from 33 bytes to 32 bytes."),(0,i.kt)("h2",{id:"existential-deposit"},"Existential Deposit"),(0,i.kt)("p",null,"Polkadot, and most Substrate-based chains, use an ",(0,i.kt)("em",{parentName:"p"},"existential deposit")," (ED) to prevent dust\naccounts from bloating chain state. If an account drops below the ED, it will be ",(0,i.kt)("em",{parentName:"p"},"reaped,")," i.e.\ncompletely removed from storage and the nonce reset. Polkadot's ED is\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.balances.existentialDeposit",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),",\n","\nwhile Kusama's is\n",(0,i.kt)(r.Z,{network:"kusama",path:"consts.balances.existentialDeposit",defaultValue:333333333,filter:"humanReadable",mdxType:"RPC"}),".\n","\nYou can always verify the existential deposit by checking the\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate"},"chain state")," for the constant\n",(0,i.kt)("inlineCode",{parentName:"p"},"balances.existentialDeposit"),"."),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"For more information about the existential deposit visit the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-accounts#existential-deposit-and-reaping"},"dedicated section")," in the Accounts\npage.")),(0,i.kt)("p",null,"Likewise, if you send a transfer with value below the ED to a new account, it will fail. Custodial\nwallets should set a minimum withdrawal amount that is greater than the ED to guarantee successful\nwithdrawals."),(0,i.kt)("p",null,"Wallets and custodians who track account nonces for auditing purposes should take care not to have\naccounts reaped, as users could refund the address and try making transactions from it. The Balances\npallet provides a ",(0,i.kt)("inlineCode",{parentName:"p"},"transfer_keep_alive")," function that will return an error and abort rather than\nmake the transfer if doing so would result in reaping the sender's account."),(0,i.kt)("admonition",{title:"The existential deposit is a property of the Relay Chain",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Your account on the Relay Chain has no direct impact on parachains as you have separate accounts on\neach parachain. Still, parachains are able to define an existential deposit of their own, but this\nis separate to that of the Relay Chain ED.")),(0,i.kt)("admonition",{title:"Existential deposit for the Asset Hub",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"The Asset Hub parachain has a lower existential deposit (0.1 DOT) than the Relay Chain (1 DOT) as\nwell as lower transaction fees. It is highly recommended to handle balance transfers on the Asset\nHub. Asset Hub integration is discussed in the next page of the guide.")),(0,i.kt)("h2",{id:"free-vs-reserved-vs-locked-vs-vesting-balance"},"Free vs. Reserved vs. Locked vs. Vesting Balance"),(0,i.kt)("p",null,"Account balance information is stored in\n",(0,i.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_balances/struct.AccountData.html"},(0,i.kt)("inlineCode",{parentName:"a"},"AccountData")),".\nPolkadot primarily deals with two types of balances: free and reserved."),(0,i.kt)("p",null,'For most operations, free balance is what you are interested in. It is the "power" of an account in\nstaking and governance, for example. Reserved balance represents funds that have been set aside by\nsome operation and still belong to the account holder, but cannot be used.'),(0,i.kt)("p",null,"Locks are an abstraction over free balance that prevent spending for certain purposes. Several locks\ncan operate on the same account, but they overlap rather than add. Locks are automatically added\nonto accounts when tasks are done on the network (e.g. leasing a parachain slot or voting), these\nare not customizable. For example, an account could have a free balance of 200 DOT with two locks on\nit: 150 DOT for ",(0,i.kt)("inlineCode",{parentName:"p"},"Transfer")," purposes and 100 DOT for ",(0,i.kt)("inlineCode",{parentName:"p"},"Reserve")," purposes. The account could not make a\ntransfer that brings its free balance below 150 DOT, but an operation could result in reserving DOT\nsuch that the free balance is below 150, but above 100 DOT."),(0,i.kt)("p",null,"Bonding tokens for staking and voting in governance referenda both utilize locks."),(0,i.kt)("p",null,"Vesting is another abstraction that uses locks on free balance. Vesting sets a lock that decreases\nover time until all the funds are transferable."),(0,i.kt)("p",null,"More info:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://paritytech.github.io/substrate/master/frame_support/traits/trait.LockableCurrency.html"},"Lockable Currency")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://paritytech.github.io/substrate/master/frame_support/traits/struct.WithdrawReasons.html"},"Lock Withdraw Reasons")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://paritytech.github.io/substrate/master/pallet_vesting/struct.VestingInfo.html"},"Vesting Info"))),(0,i.kt)("h2",{id:"extrinsics-and-events"},"Extrinsics and Events"),(0,i.kt)("h3",{id:"block-format"},"Block Format"),(0,i.kt)("p",null,"A Polkadot block consists of a block header and a block body. The block body is made up of\nextrinsics representing the generalization of the concept of transactions. Extrinsics can contain\nany external data the underlying chain wishes to validate and track."),(0,i.kt)("p",null,"The block header is a 5-tuple containing the following elements:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"parent_hash"),": a 32-byte Blake2b hash of the SCALE encoded parent block header."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"number"),": an integer representing the index of the current block in the chain. It is equal to the\nnumber of the ancestor blocks. The genesis state has number 0."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"state_root"),": the root of the Merkle tree, used as storage for the system."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"extrinsics_root"),": field which is reserved for the Runtime to validate the integrity of the\nextrinsics composing the block body."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"digest"),": field used to store any chain-specific auxiliary data, which could help the light\nclients interact with the block without the need of accessing the full storage as well as\nconsensus-related data including the block signature.")),(0,i.kt)("p",null,"A node creating or receiving a block must gossip that block to the network (i.e. to the other\nnodes). Other nodes within the network will track this announcement and can request information\nabout the block. Additional details on the process are outlined\n",(0,i.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#sect-msg-block-announce"},"here")," in the Polkadot Spec."),(0,i.kt)("h3",{id:"extrinsics"},"Extrinsics"),(0,i.kt)("p",null,"An extrinsic is a ",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/scale-codec/"},"SCALE encoded")," array consisting\nof a ",(0,i.kt)("inlineCode",{parentName:"p"},"version number"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"signature"),", and varying ",(0,i.kt)("inlineCode",{parentName:"p"},"data")," types indicating the resulting runtime\nfunction to be called, including the parameters required for that function to be executed."),(0,i.kt)("p",null,"Extrinsics constitute information from the outside world and take on three forms:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Inherents"),(0,i.kt)("li",{parentName:"ul"},"Signed Transactions"),(0,i.kt)("li",{parentName:"ul"},"Unsigned Transactions")),(0,i.kt)("p",null,"As an infrastructure provider, you will deal almost exclusively with signed transactions. You will,\nhowever, see other extrinsics within the blocks that you decode. Find more information in the\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/main-docs/build/tx-weights-fees/"},"Substrate documentation"),"."),(0,i.kt)("p",null,"Inherent extrinsics are unsigned and contain information that is not provably true, but validators\nagree on based on some measure of reasonability. For example, a timestamp cannot be proved, but\nvalidators can agree that it is within some time difference on their system clock. Inherents are\nbroadcasted as part of the produced blocks rather than being gossiped as individual extrinsics."),(0,i.kt)("p",null,"Signed transactions contain a signature of the account that issued the transaction and stands to pay\na fee to have the transaction included on chain. Because the value of including signed transactions\non-chain can be recognized prior to execution, they can be gossiped on the network between nodes\nwith a low risk of spam. Signed transactions fit the concept of a transaction in Ethereum or\nBitcoin."),(0,i.kt)("p",null,"Some transactions cannot be signed by a fee-paying account and use unsigned transactions. For\nexample, when a user claims their DOT from the Ethereum DOT indicator contract to a new DOT address,\nthe new address doesn't yet have any funds with which to pay fees."),(0,i.kt)("p",null,"The Polkadot Host does not specify or limit the internals of each extrinsics and those are defined\nand dealt with by the Runtime."),(0,i.kt)("h3",{id:"transaction-mortality"},"Transaction Mortality"),(0,i.kt)("p",null,'Extrinsics can be mortal or immortal. The transaction payload includes a block number and block hash\ncheckpoint from which a transaction is valid and a validity period (also called "era" in some\nplaces) that represents the number of blocks after the checkpoint for which the transaction is\nvalid. If the extrinsic is not included in a block within this validity window, it will be discarded\nfrom the transaction queue.'),(0,i.kt)("p",null,"The chain only stores a limited number of prior block hashes as reference. You can query this\nparameter, called ",(0,i.kt)("inlineCode",{parentName:"p"},"BlockHashCount"),", from the chain state or metadata. This parameter is set to\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.system.blockHashCount",defaultValue:4096,mdxType:"RPC"}),"\nblocks (about seven hours) at genesis. If the validity period is larger than the number of blocks\nstored on-chain, then the transaction will only be valid as long as there is a block to check it\nagainst, i.e. the minimum value of validity period and block hash count."),(0,i.kt)("p",null,'Setting the block checkpoint to zero, using the genesis hash, and a validity period of zero will\nmake the transaction "immortal".'),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"NOTE:")," If an account is reaped and a user re-funds the account, then they could replay an\nimmortal transaction. Always default to using a mortal extrinsic."),(0,i.kt)("h3",{id:"unique-identifiers-for-extrinsics"},"Unique Identifiers for Extrinsics"),(0,i.kt)("admonition",{title:"Transaction Hash is not a unique identifier",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"The assumption that a transaction's hash is a unique identifier is the number one mistake that\nindexing services and custodians make. This error will cause major issues for your users. Make sure\nthat you read this section carefully.")),(0,i.kt)("p",null,"Many infrastructure providers on existing blockchains, e.g. Ethereum, consider a transaction's hash\nas a unique identifier. In Substrate-based chains like Polkadot, a transaction's hash only serves as\na fingerprint of the information within a transaction, and there are times when two transactions\nwith the same hash are both valid. In the case that one is invalid, the network properly handles the\ntransaction and does not charge a transaction fee to the sender nor consider the transaction in the\nblock's fullness."),(0,i.kt)("p",null,"Imagine this contrived example with a ",(0,i.kt)("a",{parentName:"p",href:"#existential-deposit"},"reaped account"),". The first and last\ntransactions are identical, and both valid."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:"center"},"Index"),(0,i.kt)("th",{parentName:"tr",align:"center"},"Hash"),(0,i.kt)("th",{parentName:"tr",align:"left"},"Origin"),(0,i.kt)("th",{parentName:"tr",align:"center"},"Nonce"),(0,i.kt)("th",{parentName:"tr",align:"left"},"Call"),(0,i.kt)("th",{parentName:"tr",align:"left"},"Results"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"0"),(0,i.kt)("td",{parentName:"tr",align:"center"},"0x01"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Account A"),(0,i.kt)("td",{parentName:"tr",align:"center"},"0"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Transfer 5 DOT to B"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Account A reaped")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"1"),(0,i.kt)("td",{parentName:"tr",align:"center"},"0x02"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Account B"),(0,i.kt)("td",{parentName:"tr",align:"center"},"4"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Transfer 7 DOT to A"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Account A created (nonce = 0)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"2"),(0,i.kt)("td",{parentName:"tr",align:"center"},"0x01"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Account A"),(0,i.kt)("td",{parentName:"tr",align:"center"},"0"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Transfer 5 DOT to B"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Successful transaction")))),(0,i.kt)("p",null,"In addition, not every extrinsic in a Substrate-based chain comes from an account as a\npublic/private key pair; Substrate, rather, has the concept of dispatch \u201corigin\u201d, which could be\ncreated from a public key account, but could also form from other means such as governance. These\norigins do not have a nonce associated with them the way that an account does. For example,\ngovernance might dispatch the same call with the same arguments multiple times, like \u201cincrease the\nvalidator set by 10%.\u201d This dispatch information (and therefore its hash) would be the same, and the\nhash would be a reliable representative of the call, but its execution would have different effects\ndepending on the chain\u2019s state at the time of dispatch."),(0,i.kt)("p",null,"The correct way to uniquely identify an extrinsic on a Substrate-based chain is to use the block ID\n(height or hash) and the extrinsic's index. Substrate defines a block as a header and an array of\nextrinsics; therefore, an index in the array at a canonical height will always uniquely identify a\ntransaction. This methodology is reflected in the Substrate codebase itself, for example to\n",(0,i.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_multisig/struct.Timepoint.html"},"reference a previous transaction"),"\nfrom the Multisig pallet."),(0,i.kt)("h3",{id:"events"},"Events"),(0,i.kt)("p",null,"While extrinsics represent information from the outside world, events represent information from the\nchain. Extrinsics can trigger events. For example, the Staking pallet emits a ",(0,i.kt)("inlineCode",{parentName:"p"},"Reward")," event when\nclaiming staking rewards to tell the user how much the account was credited."),(0,i.kt)("p",null,"If you want to monitor deposits into an address, keep in mind that several transactions can initiate\na balance transfer (such as ",(0,i.kt)("inlineCode",{parentName:"p"},"balances.transferKeepAlive")," and a ",(0,i.kt)("inlineCode",{parentName:"p"},"utility.batch")," transaction with a\ntransfer inside of it). Only monitoring ",(0,i.kt)("inlineCode",{parentName:"p"},"balances.transfer")," transactions will not be sufficient.\nMake sure that you monitor events in each block for events that contain your addresses of interest.\nMonitor events instead of transaction names to ensure that you can properly credit deposits."),(0,i.kt)("h3",{id:"fees"},"Fees"),(0,i.kt)("p",null,"Polkadot uses weight-based fees that, unlike gas, are charged ",(0,i.kt)("em",{parentName:"p"},"pre-dispatch."),' Users can also add a\n"tip" to increase transaction priority during congested periods. See the\n',(0,i.kt)("a",{parentName:"p",href:"/docs/learn-transaction-fees"},"transaction fee")," page for more info."),(0,i.kt)("h3",{id:"encoding"},"Encoding"),(0,i.kt)("p",null,"Parity's integration tools should allow you to deal with decoded data. If you'd like to bypass them\nand interact directly with the chain data or implement your own codec, Polkadot encodes block and\ntransaction data using the ",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/scale-codec/"},"SCALE codec"),"."),(0,i.kt)("h2",{id:"runtime-upgrades"},"Runtime Upgrades"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"/docs/learn-runtime-upgrades"},"Runtime upgrades")," allow Polkadot to change the logic of the\nchain without the need for a hard fork. A hard fork would require node operators to manually upgrade\ntheir nodes to the latest runtime version. In a distributed system, this is a complex process to\ncoordinate and communicate. Polkadot can upgrade without a hard fork. The existing runtime logic is\nfollowed to update the Wasm runtime stored on the blockchain to a new version. The upgrade is then\nincluded in the blockchain itself, meaning that all the nodes on the network execute it."),(0,i.kt)("p",null,"Generally there is no need to upgrade your nodes manually before the runtime upgrade as they will\nautomatically start to follow the new logic of the chain. Nodes only need to be updated when the\nruntime requires new host functions or there is a change in networking or consensus."),(0,i.kt)("p",null,"Transactions 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 don't think you can submit a transaction before the upgrade, it is better to wait and construct\nit after the upgrade takes place."),(0,i.kt)("p",null,"Although upgrading your nodes is generally not necessary to follow an upgrade, we recommend\nfollowing the Polkadot releases and upgrading in a timely manner, especially for high priority or\ncritical releases."),(0,i.kt)("h3",{id:"transaction-version-upgrades"},"Transaction Version Upgrades"),(0,i.kt)("p",null,"Apart the ",(0,i.kt)("inlineCode",{parentName:"p"},"runtime_version")," there is also the ",(0,i.kt)("inlineCode",{parentName:"p"},"transaction_version")," which denotes how to correctly\nencode/decode calls for a given runtime (useful for hardware wallets). The reason\n",(0,i.kt)("inlineCode",{parentName:"p"},"transaction_version")," is separate from ",(0,i.kt)("inlineCode",{parentName:"p"},"runtime_version")," is that it explicitly notes that the call\ninterface is broken/not compatible."),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"transaction_version")," is updated in the cases mentioned in the\n",(0,i.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/sp_version/struct.RuntimeVersion.html#structfield.transaction_version"},"Substrate docs"),".\nSo when a new transaction version is introduced (during a runtime upgrade), it indicates a breaking\nchange to transaction serialization. In that case, any custom application/tool that constructs &\nsigns transactions should also be updated in order to be compatible with the new transaction\nversion. It is the responsibility of the maintainers of the custom application/tool to keep up with\nthe ",(0,i.kt)("inlineCode",{parentName:"p"},"transaction_version")," updates. However, if you do not want to keep monitoring these changes\nyourself, you can also use the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/txwrapper-core"},"txwrapper-core")," tool\nthat handles these breaking changes for you and allows you to construct transactions using the\nfunction names and chain metadata."),(0,i.kt)("h2",{id:"smart-contracts"},"Smart Contracts"),(0,i.kt)("p",null,"The Polkadot Relay Chain does not support smart contracts."),(0,i.kt)("h2",{id:"other-networks"},"Other Networks"),(0,i.kt)("p",null,"Besides running a private network, Polkadot has two other networks where you could test\ninfrastructure prior to deploying to the Polkadot mainnet."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Kusama Canary Network:")," Kusama is Polkadot's cutting-edge cousin. Many risky features are\ndeployed to Kusama prior to making their way into Polkadot."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Westend Testnet:")," Westend is Polkadot's testnet and uses the Polkadot runtime."),(0,i.kt)("h2",{id:"other-faq"},"Other F.A.Q."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Can an account's balance change without a corresponding, on-chain transaction?")),(0,i.kt)("p",null,"No, but not all balance changes are in a ",(0,i.kt)("em",{parentName:"p"},"transaction,")," some are in ",(0,i.kt)("em",{parentName:"p"},"events.")," You will need to run\nan archive node and listen for events and transactions to track all account activity. This\nespecially applies to ",(0,i.kt)("em",{parentName:"p"},"locking")," operations if you are calculating balance as the spendable balance,\ni.e. free balance minus the maximum lock."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},'What chain depth is considered "safe"?')),(0,i.kt)("p",null,"Polkadot uses a deterministic finality mechanism. Once a block is finalized, it cannot be reverted\nexcept by a hard fork. Kusama has had hard forks that had to revert four finalized blocks in order\nto cancel a runtime upgrade. Using a finalized depth of ten blocks should be safe."),(0,i.kt)("p",null,"Note that block production and finality are isolated processes in Polkadot, and the chain can have a\nlong unfinalized head."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Do users need to interact with any smart contracts?")),(0,i.kt)("p",null,"No, users interact directly with the chain's logic."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Does Polkadot have state rent?")),(0,i.kt)("p",null,"No, Polkadot uses the existential deposit to prevent dust accounts and other economic mechanisms\nlike locking or reserving tokens for operations that utilize state."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"What is an external source to see the current chain height?")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"Polkadot-JS explorer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://polkascan.io/"},"Polkascan block explorer")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.subscan.io/"},"Subscan block explorer"))))}m.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/21877fa5.3aff56f3.js b/assets/js/21877fa5.3aff56f3.js deleted file mode 100644 index 64e5964992d8..000000000000 --- a/assets/js/21877fa5.3aff56f3.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[2117],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>d});var n=a(74165),o=a(15861),s=a(67294),i=a(87152),r=a(17145),l=a(67425);function c(e,t,a){return p.apply(this,arguments)}function p(){return(p=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var s,l,c,p,h;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:s=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return s="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return s="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return s="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return s="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==s){e.next=18;break}return e.abrupt("return");case 18:return c=new i.U(s),e.next=21,r.G.create({provider:c});case 21:p=e.sent,(h=a.split(".")).forEach((function(e){e in p&&(p=p[e])})),e.t1=h[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=p.toString(),e.abrupt("break",35);case 29:return e.next=31,p();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+h[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function h(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const d=function(e){var t=e.network,a=e.path,i=e.defaultValue,r=e.filter,l=void 0===r?void 0:r,p=(0,s.useState)(""),d=p[0],u=p[1];return t=t.toLowerCase(),(0,s.useEffect)((function(){void 0!==l?h(i.toString(),l,t,u):u(i.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var s=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c(t,a,u);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?h(o,l,t,u):u(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{s()}catch(r){console.log(r)}}}),[]),d}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},4381:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>c,default:()=>k,frontMatter:()=>l,metadata:()=>p,toc:()=>d});var n=a(87462),o=a(63366),s=(a(67294),a(3905)),i=a(47940),r=["components"],l={id:"learn-system-chains",title:"System Parachains",sidebar_label:"System Parachains",description:"System Parachains currently deployed on Polkadot.",keywords:["common good","system","parachains","system level","public utility"],slug:"../learn-system-chains"},c=void 0,p={unversionedId:"learn/learn-system-chains",id:"learn/learn-system-chains",title:"System Parachains",description:"System Parachains currently deployed on Polkadot.",source:"@site/../docs/learn/learn-system-chains.md",sourceDirName:"learn",slug:"/learn-system-chains",permalink:"/docs/learn-system-chains",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-system-chains.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696484972,formattedLastUpdatedAt:"Oct 5, 2023",frontMatter:{id:"learn-system-chains",title:"System Parachains",sidebar_label:"System Parachains",description:"System Parachains currently deployed on Polkadot.",keywords:["common good","system","parachains","system level","public utility"],slug:"../learn-system-chains"},sidebar:"docs",previous:{title:"Protocol Overview",permalink:"/docs/learn-parachains-protocol"},next:{title:"Parachain Slot Auctions",permalink:"/docs/learn-auction"}},h={},d=[{value:"Overview",id:"overview",level:2},{value:"Existing System Chains",id:"existing-system-chains",level:2},{value:"Asset Hub",id:"asset-hub",level:3},{value:"Encointer",id:"encointer",level:3},{value:"Collectives",id:"collectives",level:3},{value:"Bridge Hubs",id:"bridge-hubs",level:3}],u={toc:d},m="wrapper";function k(e){var t=e.components,a=(0,o.Z)(e,r);return(0,s.kt)(m,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("h2",{id:"overview"},"Overview"),(0,s.kt)("p",null,"System parachains are those that contain core Polkadot protocol features, but in parachains rather\nthan the Relay Chain. Rather than leasing an execution core by economic means (e.g., auction),\nexecution cores are allocated by network ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-governance"},"governance"),"."),(0,s.kt)("p",null,"By hosting core protocol logic in parachains instead of the Relay Chain, Polkadot uses its own\nscaling technology -- namely, parallel execution -- to host ",(0,s.kt)("em",{parentName:"p"},"itself"),". System parachains remove\ntransactions from the Relay Chain, allowing more Relay Chain\n",(0,s.kt)("a",{parentName:"p",href:"https://www.rob.tech/polkadot-blockspace-over-blockchains/"},"blockspace")," to be used for Polkadot's\nprimary purpose: validating parachains."),(0,s.kt)("p",null,"System 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."),(0,s.kt)("admonition",{type:"note"},(0,s.kt)("p",{parentName:"admonition"},'In the past, these were often called "Common Good Parachains", so you may come across articles and\ndiscussions using that term. As the network has evolved, that term has been confusing in many cases,\nso "System Parachains" is preferred now. A discussion on this evolution can be found in\n',(0,s.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/t/polkadot-protocol-and-common-good-parachains/866"},"this forum thread"),".")),(0,s.kt)("h2",{id:"existing-system-chains"},"Existing System Chains"),(0,s.kt)("h3",{id:"asset-hub"},"Asset Hub"),(0,s.kt)("p",null,"The ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/paritytech/cumulus#asset-hub-"},"Asset Hub")," on both Polkadot and Kusama are\nthe first system parachains."),(0,s.kt)("p",null,"The Asset Hub is an asset portal for the entire network. It helps asset creators (e.g. reserve\nbacked stablecoin issuers) to track the total issuance of their asset in the\nPolkadot network, including amounts that have\nbeen transferred to other parachains. It is also the point where they can transact, to mint and\nburn, to manage the on-chain asset."),(0,s.kt)("p",null,"The Asset Hub also supports non-fungible assets (NFTs) via the\n",(0,s.kt)("a",{parentName:"p",href:"https://polkadot.js.org/docs/substrate/extrinsics#uniques"},"Uniques pallet")," and the new\n",(0,s.kt)("a",{parentName:"p",href:"https://polkadot.js.org/docs/substrate/extrinsics#nfts"},"nfts pallet"),". For more information about\nNFTs see the ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-nft-pallets"},"dedicated wiki page"),"."),(0,s.kt)("p",null,"This logic for asset management is not encoded in smart contracts, but rather directly in the\nruntime of the chain. Because of the efficiency of executing logic in a parachain, fees and deposits\nare about 1/10th of their respective value on the Relay Chain."),(0,s.kt)("p",null,"These low fee levels mean that the Asset Hub is well suited for handling\nDOT balances and transfers as well as managing\non-chain assets. For example, the existential deposit for\nPolkadot is\n",(0,s.kt)(i.Z,{network:"polkadot",path:"consts.balances.existentialDeposit",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),",\n","\nwhile only\n",(0,s.kt)(i.Z,{network:"statemint",path:"consts.balances.existentialDeposit",defaultValue:1e9,filter:"humanReadable",mdxType:"RPC"}),"\n","\non the Asset Hub."),(0,s.kt)("h3",{id:"encointer"},"Encointer"),(0,s.kt)("p",null,"Encointer is a blockchain platform for self-sovereign ID and a global universal basic income. With\n",(0,s.kt)("a",{parentName:"p",href:"https://kusama.polkassembly.io/referendum/158"},"referendum 158")," Encointer was registered as the\nsecond system parachain on Kusama's network. The functionality of Encointer adds logic to the Relay\nChain that aims to bring financial inclusivity to Web3 and mitigate Sybil attacks with a novel Proof\nof Personhood (PoP) system for unique identity."),(0,s.kt)("p",null,"Encointer offers a framework that, in principle, allows for any group of real people to create,\ndistribute, and use their own digital community tokens.\n",(0,s.kt)("a",{parentName:"p",href:"https://kusama.polkassembly.io/referendum/187"},"Referendum 187")," introduced a runtime upgrade\nbringing governance and full functionality for communities to be able to use the protocol."),(0,s.kt)("p",null,"Encointer aims to invert the\n",(0,s.kt)("a",{parentName:"p",href:"https://www.newworldencyclopedia.org/entry/Richard_Cantillon"},"Cantillon Effect"),", where money is\nissued at the bottom, and not as credit to businesses or creditworthy individuals. This way, every\nindividual gets a ",(0,s.kt)("a",{parentName:"p",href:"https://book.encointer.org/economics-ubi.html"},"universal basic income (UBI)"),"."),(0,s.kt)("p",null,"To resist Sybil attacks, the Encointer protocol uses a PoP mechanism to foster a unique identity\nsystem. The notion is that a person can only be present at one place at a given time. Participants\nare requested to attend physical key-signing ceremonies with small groups of random people at\nrandomized locations, where these local meetings are part of one global ceremony that co-occur.\nParticipants use the Encointer wallet app to participate in these ceremonies, and the wallet enables\nthe management of local community currencies. Watch an Encointer ceremony in action in\n",(0,s.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=tcgpCCYBqko"},"this video"),"."),(0,s.kt)("p",null,"The protocol involves ",(0,s.kt)("a",{parentName:"p",href:"https://book.encointer.org/ssi.html#privacy-considerations"},"other mechanisms"),"\nto protect the privacy of users in addition to the physical key-signing ceremonies."),(0,s.kt)("p",null,"Encointer was accepted as a system chain based on its offer of a Sybil defense mechanism as a basis\nfor digital democracy. This can also be adapted by other chains, which can use the unique identity\nsystem to prevent Sybil attacks and use PoP for token airdrops or faucets."),(0,s.kt)("admonition",{type:"tip"},(0,s.kt)("p",{parentName:"admonition"},"To learn more about Encointer, check out the official\n",(0,s.kt)("a",{parentName:"p",href:"https://book.encointer.org/introduction.html"},"Encointer book"),".")),(0,s.kt)("h3",{id:"collectives"},"Collectives"),(0,s.kt)("p",null,"The Polkadot Collectives parachain was added in\n",(0,s.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/referendum/81"},"Referendum 81")," and exists only on Polkadot (i.e.,\nthere is no Kusama equivalent). The Collectives chain hosts on-chain collectives that serve the\nPolkadot network."),(0,s.kt)("p",null,"Some of these collectives are the\n",(0,s.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/referendum/94"},"Polkadot Alliance")," and the Polkadot Technical\n",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov#the-technical-fellowship"},"Fellowship"),". These on-chain collectives will\nplay important roles in the future of network stewardship and decentralized governance."),(0,s.kt)("p",null,"Networks themselves can act as collectives and express their legislative voices as single opinions\nwithin other networks. This is achieved with the assistance from a ",(0,s.kt)("a",{parentName:"p",href:"#bridge-hubs"},"bridge hub"),"."),(0,s.kt)("h3",{id:"bridge-hubs"},"Bridge Hubs"),(0,s.kt)("p",null,"Before Polkadot and Kusama supported their first parachains, the only way to design a bridge was to\nput the logic onto the Relay Chain itself. Since both networks now support parachains, it makes\nsense to have a parachain on each network dedicated to bridges. This is because of the execution\nisolation provided by parachains."),(0,s.kt)("p",null,"See the ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-bridges"},"Bridges page")," for information on the latest bridge projects. Currently, a\nBridge Hub parachain is in development that will be a portal for trust-minimized bridges to other\nnetworks."))}k.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/21877fa5.680ee20e.js b/assets/js/21877fa5.680ee20e.js new file mode 100644 index 000000000000..03e6da5cf7fc --- /dev/null +++ b/assets/js/21877fa5.680ee20e.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[2117],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>d});var n=a(74165),o=a(15861),s=a(67294),i=a(87152),r=a(17145),l=a(67425);function c(e,t,a){return p.apply(this,arguments)}function p(){return(p=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var s,l,c,p,h;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:s=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return s="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return s="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return s="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return s="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==s){e.next=18;break}return e.abrupt("return");case 18:return c=new i.U(s),e.next=21,r.G.create({provider:c});case 21:p=e.sent,(h=a.split(".")).forEach((function(e){e in p&&(p=p[e])})),e.t1=h[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=p.toString(),e.abrupt("break",35);case 29:return e.next=31,p();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+h[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function h(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"permillToPercent":(0,l.PermillToPercent)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const d=function(e){var t=e.network,a=e.path,i=e.defaultValue,r=e.filter,l=void 0===r?void 0:r,p=(0,s.useState)(""),d=p[0],u=p[1];return t=t.toLowerCase(),(0,s.useEffect)((function(){void 0!==l?h(i.toString(),l,t,u):u(i.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var s=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c(t,a,u);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?h(o,l,t,u):u(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{s()}catch(r){console.log(r)}}}),[]),d}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},4381:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>c,default:()=>k,frontMatter:()=>l,metadata:()=>p,toc:()=>d});var n=a(87462),o=a(63366),s=(a(67294),a(3905)),i=a(47940),r=["components"],l={id:"learn-system-chains",title:"System Parachains",sidebar_label:"System Parachains",description:"System Parachains currently deployed on Polkadot.",keywords:["common good","system","parachains","system level","public utility"],slug:"../learn-system-chains"},c=void 0,p={unversionedId:"learn/learn-system-chains",id:"learn/learn-system-chains",title:"System Parachains",description:"System Parachains currently deployed on Polkadot.",source:"@site/../docs/learn/learn-system-chains.md",sourceDirName:"learn",slug:"/learn-system-chains",permalink:"/docs/learn-system-chains",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-system-chains.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696484972,formattedLastUpdatedAt:"Oct 5, 2023",frontMatter:{id:"learn-system-chains",title:"System Parachains",sidebar_label:"System Parachains",description:"System Parachains currently deployed on Polkadot.",keywords:["common good","system","parachains","system level","public utility"],slug:"../learn-system-chains"},sidebar:"docs",previous:{title:"Protocol Overview",permalink:"/docs/learn-parachains-protocol"},next:{title:"Parachain Slot Auctions",permalink:"/docs/learn-auction"}},h={},d=[{value:"Overview",id:"overview",level:2},{value:"Existing System Chains",id:"existing-system-chains",level:2},{value:"Asset Hub",id:"asset-hub",level:3},{value:"Encointer",id:"encointer",level:3},{value:"Collectives",id:"collectives",level:3},{value:"Bridge Hubs",id:"bridge-hubs",level:3}],u={toc:d},m="wrapper";function k(e){var t=e.components,a=(0,o.Z)(e,r);return(0,s.kt)(m,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("h2",{id:"overview"},"Overview"),(0,s.kt)("p",null,"System parachains are those that contain core Polkadot protocol features, but in parachains rather\nthan the Relay Chain. Rather than leasing an execution core by economic means (e.g., auction),\nexecution cores are allocated by network ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-governance"},"governance"),"."),(0,s.kt)("p",null,"By hosting core protocol logic in parachains instead of the Relay Chain, Polkadot uses its own\nscaling technology -- namely, parallel execution -- to host ",(0,s.kt)("em",{parentName:"p"},"itself"),". System parachains remove\ntransactions from the Relay Chain, allowing more Relay Chain\n",(0,s.kt)("a",{parentName:"p",href:"https://www.rob.tech/polkadot-blockspace-over-blockchains/"},"blockspace")," to be used for Polkadot's\nprimary purpose: validating parachains."),(0,s.kt)("p",null,"System 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."),(0,s.kt)("admonition",{type:"note"},(0,s.kt)("p",{parentName:"admonition"},'In the past, these were often called "Common Good Parachains", so you may come across articles and\ndiscussions using that term. As the network has evolved, that term has been confusing in many cases,\nso "System Parachains" is preferred now. A discussion on this evolution can be found in\n',(0,s.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/t/polkadot-protocol-and-common-good-parachains/866"},"this forum thread"),".")),(0,s.kt)("h2",{id:"existing-system-chains"},"Existing System Chains"),(0,s.kt)("h3",{id:"asset-hub"},"Asset Hub"),(0,s.kt)("p",null,"The ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/paritytech/cumulus#asset-hub-"},"Asset Hub")," on both Polkadot and Kusama are\nthe first system parachains."),(0,s.kt)("p",null,"The Asset Hub is an asset portal for the entire network. It helps asset creators (e.g. reserve\nbacked stablecoin issuers) to track the total issuance of their asset in the\nPolkadot network, including amounts that have\nbeen transferred to other parachains. It is also the point where they can transact, to mint and\nburn, to manage the on-chain asset."),(0,s.kt)("p",null,"The Asset Hub also supports non-fungible assets (NFTs) via the\n",(0,s.kt)("a",{parentName:"p",href:"https://polkadot.js.org/docs/substrate/extrinsics#uniques"},"Uniques pallet")," and the new\n",(0,s.kt)("a",{parentName:"p",href:"https://polkadot.js.org/docs/substrate/extrinsics#nfts"},"nfts pallet"),". For more information about\nNFTs see the ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-nft-pallets"},"dedicated wiki page"),"."),(0,s.kt)("p",null,"This logic for asset management is not encoded in smart contracts, but rather directly in the\nruntime of the chain. Because of the efficiency of executing logic in a parachain, fees and deposits\nare about 1/10th of their respective value on the Relay Chain."),(0,s.kt)("p",null,"These low fee levels mean that the Asset Hub is well suited for handling\nDOT balances and transfers as well as managing\non-chain assets. For example, the existential deposit for\nPolkadot is\n",(0,s.kt)(i.Z,{network:"polkadot",path:"consts.balances.existentialDeposit",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),",\n","\nwhile only\n",(0,s.kt)(i.Z,{network:"statemint",path:"consts.balances.existentialDeposit",defaultValue:1e9,filter:"humanReadable",mdxType:"RPC"}),"\n","\non the Asset Hub."),(0,s.kt)("h3",{id:"encointer"},"Encointer"),(0,s.kt)("p",null,"Encointer is a blockchain platform for self-sovereign ID and a global universal basic income. With\n",(0,s.kt)("a",{parentName:"p",href:"https://kusama.polkassembly.io/referendum/158"},"referendum 158")," Encointer was registered as the\nsecond system parachain on Kusama's network. The functionality of Encointer adds logic to the Relay\nChain that aims to bring financial inclusivity to Web3 and mitigate Sybil attacks with a novel Proof\nof Personhood (PoP) system for unique identity."),(0,s.kt)("p",null,"Encointer offers a framework that, in principle, allows for any group of real people to create,\ndistribute, and use their own digital community tokens.\n",(0,s.kt)("a",{parentName:"p",href:"https://kusama.polkassembly.io/referendum/187"},"Referendum 187")," introduced a runtime upgrade\nbringing governance and full functionality for communities to be able to use the protocol."),(0,s.kt)("p",null,"Encointer aims to invert the\n",(0,s.kt)("a",{parentName:"p",href:"https://www.newworldencyclopedia.org/entry/Richard_Cantillon"},"Cantillon Effect"),", where money is\nissued at the bottom, and not as credit to businesses or creditworthy individuals. This way, every\nindividual gets a ",(0,s.kt)("a",{parentName:"p",href:"https://book.encointer.org/economics-ubi.html"},"universal basic income (UBI)"),"."),(0,s.kt)("p",null,"To resist Sybil attacks, the Encointer protocol uses a PoP mechanism to foster a unique identity\nsystem. The notion is that a person can only be present at one place at a given time. Participants\nare requested to attend physical key-signing ceremonies with small groups of random people at\nrandomized locations, where these local meetings are part of one global ceremony that co-occur.\nParticipants use the Encointer wallet app to participate in these ceremonies, and the wallet enables\nthe management of local community currencies. Watch an Encointer ceremony in action in\n",(0,s.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=tcgpCCYBqko"},"this video"),"."),(0,s.kt)("p",null,"The protocol involves ",(0,s.kt)("a",{parentName:"p",href:"https://book.encointer.org/ssi.html#privacy-considerations"},"other mechanisms"),"\nto protect the privacy of users in addition to the physical key-signing ceremonies."),(0,s.kt)("p",null,"Encointer was accepted as a system chain based on its offer of a Sybil defense mechanism as a basis\nfor digital democracy. This can also be adapted by other chains, which can use the unique identity\nsystem to prevent Sybil attacks and use PoP for token airdrops or faucets."),(0,s.kt)("admonition",{type:"tip"},(0,s.kt)("p",{parentName:"admonition"},"To learn more about Encointer, check out the official\n",(0,s.kt)("a",{parentName:"p",href:"https://book.encointer.org/introduction.html"},"Encointer book"),".")),(0,s.kt)("h3",{id:"collectives"},"Collectives"),(0,s.kt)("p",null,"The Polkadot Collectives parachain was added in\n",(0,s.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/referendum/81"},"Referendum 81")," and exists only on Polkadot (i.e.,\nthere is no Kusama equivalent). The Collectives chain hosts on-chain collectives that serve the\nPolkadot network."),(0,s.kt)("p",null,"Some of these collectives are the\n",(0,s.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/referendum/94"},"Polkadot Alliance")," and the Polkadot Technical\n",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov#the-technical-fellowship"},"Fellowship"),". These on-chain collectives will\nplay important roles in the future of network stewardship and decentralized governance."),(0,s.kt)("p",null,"Networks themselves can act as collectives and express their legislative voices as single opinions\nwithin other networks. This is achieved with the assistance from a ",(0,s.kt)("a",{parentName:"p",href:"#bridge-hubs"},"bridge hub"),"."),(0,s.kt)("h3",{id:"bridge-hubs"},"Bridge Hubs"),(0,s.kt)("p",null,"Before Polkadot and Kusama supported their first parachains, the only way to design a bridge was to\nput the logic onto the Relay Chain itself. Since both networks now support parachains, it makes\nsense to have a parachain on each network dedicated to bridges. This is because of the execution\nisolation provided by parachains."),(0,s.kt)("p",null,"See the ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-bridges"},"Bridges page")," for information on the latest bridge projects. Currently, a\nBridge Hub parachain is in development that will be a portal for trust-minimized bridges to other\nnetworks."))}k.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/279fb1d6.7552fe6b.js b/assets/js/279fb1d6.7552fe6b.js deleted file mode 100644 index 7ce708136788..000000000000 --- a/assets/js/279fb1d6.7552fe6b.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[6827],{47940:(a,t,e)=>{"use strict";e.d(t,{Z:()=>k});var n=e(74165),i=e(15861),s=e(67294),r=e(87152),o=e(17145),l=e(67425);function d(a,t,e){return c.apply(this,arguments)}function c(){return(c=(0,i.Z)((0,n.Z)().mark((function a(t,e,i){var s,l,d,c,u;return(0,n.Z)().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:s=void 0,l=void 0,a.t0=t,a.next="polkadot"===a.t0?5:"kusama"===a.t0?7:"statemine"===a.t0?9:"statemint"===a.t0?11:13;break;case 5:return s="wss://rpc.polkadot.io",a.abrupt("break",14);case 7:return s="wss://kusama-rpc.polkadot.io/",a.abrupt("break",14);case 9:return s="wss://statemine-rpc.polkadot.io/",a.abrupt("break",14);case 11:return s="wss://statemint-rpc.polkadot.io/",a.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==s){a.next=18;break}return a.abrupt("return");case 18:return d=new r.U(s),a.next=21,o.G.create({provider:d});case 21:c=a.sent,(u=e.split(".")).forEach((function(a){a in c&&(c=c[a])})),a.t1=u[0],a.next="consts"===a.t1?27:"query"===a.t1?29:34;break;case 27:return l=c.toString(),a.abrupt("break",35);case 29:return a.next=31,c();case 31:return l=(l=a.sent).toString(),a.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+e);case 35:return a.abrupt("return",l);case 36:case"end":return a.stop()}}),a)})))).apply(this,arguments)}function u(a,t,e,n){switch(t){case"humanReadable":(0,l.HumanReadable)(a,e,n);break;case"precise":(0,l.Precise)(a,e,n);break;case"blocksToDays":(0,l.BlocksToDays)(a,n);break;case"percentage":(0,l.Percentage)(a,n);break;case"arrayLength":(0,l.ArrayLength)(a,n);break;default:return void console.log("Ignoring unknown filter type")}}const k=function(a){var t=a.network,e=a.path,r=a.defaultValue,o=a.filter,l=void 0===o?void 0:o,c=(0,s.useState)(""),k=c[0],m=c[1];return t=t.toLowerCase(),(0,s.useEffect)((function(){void 0!==l?u(r.toString(),l,t,m):m(r.toString());var a=void 0;switch(t){case"polkadot":a="wss://rpc.polkadot.io";break;case"kusama":a="wss://kusama-rpc.polkadot.io/";break;case"statemine":a="wss://statemine-rpc.polkadot.io/";break;case"statemint":a="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===a)console.log("Failed to connect to a valid websocket, applying default");else{var s=function(){var a=(0,i.Z)((0,n.Z)().mark((function a(){var i;return(0,n.Z)().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.next=2,d(t,e,m);case 2:if(void 0!==(i=a.sent)){a.next=7;break}return a.abrupt("return");case 7:void 0!==l?u(i,l,t,m):m(i);case 8:case"end":return a.stop()}}),a)})));return function(){return a.apply(this,arguments)}}();try{s()}catch(o){console.log(o)}}}),[]),k}},67425:a=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};a.exports={HumanReadable:function(a,e,n){var i=void 0;if("polkadot"===e||"statemint"===e)i=3;else{if("kusama"!==e&&"statemine"!==e)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");i=6}a=parseFloat(a),n((a=Number.isInteger(a/t[e].precision)?a/t[e].precision+" "+t[e].symbol:(a/t[e].precision).toFixed(i)+" "+t[e].symbol).toString())},Precise:function(a,e,n){n(a=(a=parseFloat(a))/t[e].precision+" "+t[e].symbol)},BlocksToDays:function(a,t){t((a=6*a/86400).toString())},Percentage:function(a,t){t((a/=1e7).toString())},ArrayLength:function(a,t){t((a=a.split(",").length).toString())}}},81807:(a,t,e)=>{"use strict";e.r(t),e.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>d,toc:()=>u});var n=e(87462),i=e(63366),s=(e(67294),e(3905)),r=(e(47940),["components"]),o={id:"kusama-getting-started",title:"Interact with Kusama",sidebar_label:"Home",description:"Reference point for Kusama content.",keywords:["getting started","introduction","kusama","interact"],slug:"../../kusama-getting-started"},l=void 0,d={unversionedId:"general/kusama/kusama-getting-started",id:"general/kusama/kusama-getting-started",title:"Interact with Kusama",description:"Reference point for Kusama content.",source:"@site/../docs/general/kusama/kusama-getting-started.md",sourceDirName:"general/kusama",slug:"/kusama-getting-started",permalink:"/docs/kusama-getting-started",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/general/kusama/kusama-getting-started.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1687933561,formattedLastUpdatedAt:"Jun 28, 2023",frontMatter:{id:"kusama-getting-started",title:"Interact with Kusama",sidebar_label:"Home",description:"Reference point for Kusama content.",keywords:["getting started","introduction","kusama","interact"],slug:"../../kusama-getting-started"}},c={},u=[{value:"Polkadot's Canary Network",id:"polkadots-canary-network",level:3},{value:"What can I do with my KSM?",id:"what-can-i-do-with-my-ksm",level:3},{value:"Kusama Gifts",id:"kusama-gifts",level:3}],k={toc:u},m="wrapper";function p(a){var t=a.components,e=(0,i.Z)(a,r);return(0,s.kt)(m,(0,n.Z)({},k,e,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("h3",{id:"polkadots-canary-network"},"Polkadot's Canary Network"),(0,s.kt)("p",null,"Kusama is a ",(0,s.kt)("em",{parentName:"p"},"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."),(0,s.kt)("admonition",{title:"No Promises",type:"info"},(0,s.kt)("p",{parentName:"admonition"},"Kusama is owned by those who hold the Kusama tokens (KSM). There's no central kill switch and all\nchanges are made through the protocol's on-chain governance."),(0,s.kt)("p",{parentName:"admonition"},"The network is a permissionless and anyone can come along and start using it. Those who participated\nin the Polkadot sale can claim a proportional amount of KSM through the\n",(0,s.kt)("a",{parentName:"p",href:"kusama-claims"},"Kusama Claims process"),"."),(0,s.kt)("p",{parentName:"admonition"},"Kusama is experimental. ",(0,s.kt)("strong",{parentName:"p"},"Expect Chaos"),".")),(0,s.kt)("admonition",{title:"As a KSM holder",type:"tip"},(0,s.kt)("p",{parentName:"admonition"},"You can interact with all the features of the Kusama network such as staking (i.e. validating or\nnominating), governance, parachain auctions, basic transfers and everything else.")),(0,s.kt)("tr",{class:"cards-container"},(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-account-generation"},(0,s.kt)("img",{src:"/img/kusama-guide/Account.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Creating an Account")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-balance-transfers"},(0,s.kt)("img",{src:"/img/kusama-guide/Transfer.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Balance Transfers")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-staking"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Stake.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Staking"))))),(0,s.kt)("br",null),(0,s.kt)("tr",{class:"cards-container"},(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-parachains"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Parachain.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Parachains")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-bridges"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Bridges.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Bridges")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/maintain-guides-how-to-vote-councillor"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Voting.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Vote for Councilors"))))),(0,s.kt)("br",null),(0,s.kt)("tr",{class:"cards-container"},(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-treasury#creating-the-proposal"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Proposal.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Make Proposals")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/maintain-guides-how-to-join-council#submit-candidacy"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Council.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Council Candidacy")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-treasury"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Treasury.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Treasury"))))),(0,s.kt)("br",null),(0,s.kt)("tr",{class:"cards-container"},(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-identity"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Identity.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Set an Identity")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/maintain-guides-how-to-nominate-kusama"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Nominate.png",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Become a Nominator")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-proxies"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Proxy.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Proxy Accounts"))))),(0,s.kt)("br",null),(0,s.kt)("tr",{class:"cards-container"},(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-crowdloans/"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Crowdloans.png",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Participate in Crowdloans")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/maintain-guides-society-kusama"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Kusama-Society.png",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Join Kappa Sigma Mu")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/ambassadors"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Ambassadors.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Become an Ambassador"))))),(0,s.kt)("br",null),(0,s.kt)("p",null,"For brand-new learners of Kusama's cousin network, Polkadot, please head over to the\n",(0,s.kt)("a",{parentName:"p",href:"https://wiki.polkadot.network/"},"Polkadot Wiki"),"."),(0,s.kt)("h3",{id:"what-can-i-do-with-my-ksm"},"What can I do with my KSM?"),(0,s.kt)("p",null,"KSM is the native token of the Kusama Network. KSM can be used for transaction fees, staking,\ngovernance, acquisition of a parachain slot and for enabling several key functionalities on Kusama."),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"","\nthe minimum balance required to have an active account on Kusama Network. If your account balance\ndrops below the minimum, your account will be reaped. Learn more about\n",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-accounts"},"Accounts")," and the\n",(0,s.kt)("a",{parentName:"p",href:"/docs/build-protocol-info#existential-deposit"},"Existential Deposit")," requirement.")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"","\nthe minimum contribution required to join a\n",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pool")," and earn staking rewards for contributing\nto the security of the network. Learn more about\n",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pools"),".")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"","\nthe minimum contribution required to participate in ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-crowdloans"},"crowdloans"),"\nfor ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-auction"},"parachain slot auctions"),".")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"","\nregister an ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-identity"},"on-chain identity"))),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"","\ncreate a ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-proxies"},"proxy account"),".")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"","\nyou can create your own ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pool"),".")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"","\nthe minimum amount of KSM required to become an active nominator and earn rewards."))),(0,s.kt)("p",null,"KSM has utility in ",(0,s.kt)("a",{parentName:"p",href:"/docs/maintain-guides-democracy"},"Kusama's democracy"),". Bonding KSM is\na requirement to create proposals, to endorse them and to vote on them when they become referendums.\nBonding\n","\nor 5% of requested funding is a requirement to make a\n",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-treasury#creating-a-treasury-proposal"},"treasury proposal"),"."),(0,s.kt)("h3",{id:"kusama-gifts"},"Kusama Gifts"),(0,s.kt)("img",{align:"right",src:"/img/kusama-gift.png",width:"210",height:"200"}),(0,s.kt)("p",null,"Kusama Gifts provide an easy way to:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Onboard friends or family who are curious about blockchain but haven\u2019t made the leap yet."),(0,s.kt)("li",{parentName:"ul"},"Share your love of Kusama and send any amount of KSM."),(0,s.kt)("li",{parentName:"ul"},"Say \u2018thank you\u2019 or send someone tokens when you don\u2019t know their address."),(0,s.kt)("li",{parentName:"ul"},"Get friends and family set up to participate in crowdloans.")),(0,s.kt)("p",null,"Learn more about how you can create and send Kusama Gifts\n",(0,s.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/introducing-polkadot-kusama-gifts/"},"here"),"."),(0,s.kt)("p",null,"While Kusama does not support smart contracts natively, building apps on it is still possible (e.g.\n",(0,s.kt)("a",{parentName:"p",href:"https://rmrk.app"},"RMRK.app"),"). If you're interested in diving deeper into ",(0,s.kt)("em",{parentName:"p"},"proper")," development,\nhowever, check out the ",(0,s.kt)("a",{parentName:"p",href:"build-index"},"builders guide"),"."),(0,s.kt)("p",null,"Additional Resources:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://mooc.web3.foundation/course/blockchain-fundamentals/"},"mooc")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://medium.com/polkadot-network/kusama-network-7446706b8f4c"},"medium")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"kusama-claims"},"claims")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"maintain-endpoints"},"endpoints")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://claim.kusama.network/"},"tokens")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-validate-kusama"},"validator")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-nominate-kusama"},"nominator")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://wiki.polkadot.network/"},"polkadot wiki"))))}p.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/279fb1d6.b56bc48f.js b/assets/js/279fb1d6.b56bc48f.js new file mode 100644 index 000000000000..ee0e96570529 --- /dev/null +++ b/assets/js/279fb1d6.b56bc48f.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[6827],{47940:(a,t,e)=>{"use strict";e.d(t,{Z:()=>k});var n=e(74165),i=e(15861),s=e(67294),r=e(87152),o=e(17145),l=e(67425);function c(a,t,e){return d.apply(this,arguments)}function d(){return(d=(0,i.Z)((0,n.Z)().mark((function a(t,e,i){var s,l,c,d,u;return(0,n.Z)().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:s=void 0,l=void 0,a.t0=t,a.next="polkadot"===a.t0?5:"kusama"===a.t0?7:"statemine"===a.t0?9:"statemint"===a.t0?11:13;break;case 5:return s="wss://rpc.polkadot.io",a.abrupt("break",14);case 7:return s="wss://kusama-rpc.polkadot.io/",a.abrupt("break",14);case 9:return s="wss://statemine-rpc.polkadot.io/",a.abrupt("break",14);case 11:return s="wss://statemint-rpc.polkadot.io/",a.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==s){a.next=18;break}return a.abrupt("return");case 18:return c=new r.U(s),a.next=21,o.G.create({provider:c});case 21:d=a.sent,(u=e.split(".")).forEach((function(a){a in d&&(d=d[a])})),a.t1=u[0],a.next="consts"===a.t1?27:"query"===a.t1?29:34;break;case 27:return l=d.toString(),a.abrupt("break",35);case 29:return a.next=31,d();case 31:return l=(l=a.sent).toString(),a.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+e);case 35:return a.abrupt("return",l);case 36:case"end":return a.stop()}}),a)})))).apply(this,arguments)}function u(a,t,e,n){switch(t){case"humanReadable":(0,l.HumanReadable)(a,e,n);break;case"precise":(0,l.Precise)(a,e,n);break;case"blocksToDays":(0,l.BlocksToDays)(a,n);break;case"percentage":(0,l.Percentage)(a,n);break;case"permillToPercent":(0,l.PermillToPercent)(a,n);break;case"arrayLength":(0,l.ArrayLength)(a,n);break;default:return void console.log("Ignoring unknown filter type")}}const k=function(a){var t=a.network,e=a.path,r=a.defaultValue,o=a.filter,l=void 0===o?void 0:o,d=(0,s.useState)(""),k=d[0],m=d[1];return t=t.toLowerCase(),(0,s.useEffect)((function(){void 0!==l?u(r.toString(),l,t,m):m(r.toString());var a=void 0;switch(t){case"polkadot":a="wss://rpc.polkadot.io";break;case"kusama":a="wss://kusama-rpc.polkadot.io/";break;case"statemine":a="wss://statemine-rpc.polkadot.io/";break;case"statemint":a="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===a)console.log("Failed to connect to a valid websocket, applying default");else{var s=function(){var a=(0,i.Z)((0,n.Z)().mark((function a(){var i;return(0,n.Z)().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.next=2,c(t,e,m);case 2:if(void 0!==(i=a.sent)){a.next=7;break}return a.abrupt("return");case 7:void 0!==l?u(i,l,t,m):m(i);case 8:case"end":return a.stop()}}),a)})));return function(){return a.apply(this,arguments)}}();try{s()}catch(o){console.log(o)}}}),[]),k}},67425:a=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};a.exports={HumanReadable:function(a,e,n){var i=void 0;if("polkadot"===e||"statemint"===e)i=3;else{if("kusama"!==e&&"statemine"!==e)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");i=6}a=parseFloat(a),n((a=Number.isInteger(a/t[e].precision)?a/t[e].precision+" "+t[e].symbol:(a/t[e].precision).toFixed(i)+" "+t[e].symbol).toString())},Precise:function(a,e,n){n(a=(a=parseFloat(a))/t[e].precision+" "+t[e].symbol)},BlocksToDays:function(a,t){t((a=6*a/86400).toString())},Percentage:function(a,t){t((a/=1e7).toString())},PermillToPercent:function(a,t){t((a/=1e4).toString())},ArrayLength:function(a,t){t((a=a.split(",").length).toString())}}},81807:(a,t,e)=>{"use strict";e.r(t),e.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>u});var n=e(87462),i=e(63366),s=(e(67294),e(3905)),r=(e(47940),["components"]),o={id:"kusama-getting-started",title:"Interact with Kusama",sidebar_label:"Home",description:"Reference point for Kusama content.",keywords:["getting started","introduction","kusama","interact"],slug:"../../kusama-getting-started"},l=void 0,c={unversionedId:"general/kusama/kusama-getting-started",id:"general/kusama/kusama-getting-started",title:"Interact with Kusama",description:"Reference point for Kusama content.",source:"@site/../docs/general/kusama/kusama-getting-started.md",sourceDirName:"general/kusama",slug:"/kusama-getting-started",permalink:"/docs/kusama-getting-started",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/general/kusama/kusama-getting-started.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1687933561,formattedLastUpdatedAt:"Jun 28, 2023",frontMatter:{id:"kusama-getting-started",title:"Interact with Kusama",sidebar_label:"Home",description:"Reference point for Kusama content.",keywords:["getting started","introduction","kusama","interact"],slug:"../../kusama-getting-started"}},d={},u=[{value:"Polkadot's Canary Network",id:"polkadots-canary-network",level:3},{value:"What can I do with my KSM?",id:"what-can-i-do-with-my-ksm",level:3},{value:"Kusama Gifts",id:"kusama-gifts",level:3}],k={toc:u},m="wrapper";function p(a){var t=a.components,e=(0,i.Z)(a,r);return(0,s.kt)(m,(0,n.Z)({},k,e,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("h3",{id:"polkadots-canary-network"},"Polkadot's Canary Network"),(0,s.kt)("p",null,"Kusama is a ",(0,s.kt)("em",{parentName:"p"},"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."),(0,s.kt)("admonition",{title:"No Promises",type:"info"},(0,s.kt)("p",{parentName:"admonition"},"Kusama is owned by those who hold the Kusama tokens (KSM). There's no central kill switch and all\nchanges are made through the protocol's on-chain governance."),(0,s.kt)("p",{parentName:"admonition"},"The network is a permissionless and anyone can come along and start using it. Those who participated\nin the Polkadot sale can claim a proportional amount of KSM through the\n",(0,s.kt)("a",{parentName:"p",href:"kusama-claims"},"Kusama Claims process"),"."),(0,s.kt)("p",{parentName:"admonition"},"Kusama is experimental. ",(0,s.kt)("strong",{parentName:"p"},"Expect Chaos"),".")),(0,s.kt)("admonition",{title:"As a KSM holder",type:"tip"},(0,s.kt)("p",{parentName:"admonition"},"You can interact with all the features of the Kusama network such as staking (i.e. validating or\nnominating), governance, parachain auctions, basic transfers and everything else.")),(0,s.kt)("tr",{class:"cards-container"},(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-account-generation"},(0,s.kt)("img",{src:"/img/kusama-guide/Account.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Creating an Account")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-balance-transfers"},(0,s.kt)("img",{src:"/img/kusama-guide/Transfer.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Balance Transfers")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-staking"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Stake.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Staking"))))),(0,s.kt)("br",null),(0,s.kt)("tr",{class:"cards-container"},(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-parachains"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Parachain.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Parachains")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-bridges"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Bridges.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Bridges")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/maintain-guides-how-to-vote-councillor"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Voting.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Vote for Councilors"))))),(0,s.kt)("br",null),(0,s.kt)("tr",{class:"cards-container"},(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-treasury#creating-the-proposal"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Proposal.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Make Proposals")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/maintain-guides-how-to-join-council#submit-candidacy"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Council.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Council Candidacy")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-treasury"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Treasury.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Treasury"))))),(0,s.kt)("br",null),(0,s.kt)("tr",{class:"cards-container"},(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-identity"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Identity.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Set an Identity")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/maintain-guides-how-to-nominate-kusama"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Nominate.png",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Become a Nominator")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-proxies"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Proxy.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Proxy Accounts"))))),(0,s.kt)("br",null),(0,s.kt)("tr",{class:"cards-container"},(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/learn-crowdloans/"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Crowdloans.png",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Participate in Crowdloans")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/maintain-guides-society-kusama"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Kusama-Society.png",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Join Kappa Sigma Mu")))),(0,s.kt)("td",null,(0,s.kt)("a",{class:"guide-link",href:"https://guide.kusama.network/docs/ambassadors"},(0,s.kt)("img",{class:"guide-image",src:"/img/kusama-guide/Ambassadors.jpg",alt:"Drawing",width:"250",height:"150"}),(0,s.kt)("div",{class:"cards-body"},(0,s.kt)("h5",{class:"cards-title"},"Become an Ambassador"))))),(0,s.kt)("br",null),(0,s.kt)("p",null,"For brand-new learners of Kusama's cousin network, Polkadot, please head over to the\n",(0,s.kt)("a",{parentName:"p",href:"https://wiki.polkadot.network/"},"Polkadot Wiki"),"."),(0,s.kt)("h3",{id:"what-can-i-do-with-my-ksm"},"What can I do with my KSM?"),(0,s.kt)("p",null,"KSM is the native token of the Kusama Network. KSM can be used for transaction fees, staking,\ngovernance, acquisition of a parachain slot and for enabling several key functionalities on Kusama."),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"","\nthe minimum balance required to have an active account on Kusama Network. If your account balance\ndrops below the minimum, your account will be reaped. Learn more about\n",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-accounts"},"Accounts")," and the\n",(0,s.kt)("a",{parentName:"p",href:"/docs/build-protocol-info#existential-deposit"},"Existential Deposit")," requirement.")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"","\nthe minimum contribution required to join a\n",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pool")," and earn staking rewards for contributing\nto the security of the network. Learn more about\n",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pools"),".")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"","\nthe minimum contribution required to participate in ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-crowdloans"},"crowdloans"),"\nfor ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-auction"},"parachain slot auctions"),".")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"","\nregister an ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-identity"},"on-chain identity"))),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"","\ncreate a ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-proxies"},"proxy account"),".")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"","\nyou can create your own ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pool"),".")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},"","\nthe minimum amount of KSM required to become an active nominator and earn rewards."))),(0,s.kt)("p",null,"KSM has utility in ",(0,s.kt)("a",{parentName:"p",href:"/docs/maintain-guides-democracy"},"Kusama's democracy"),". Bonding KSM is\na requirement to create proposals, to endorse them and to vote on them when they become referendums.\nBonding\n","\nor 5% of requested funding is a requirement to make a\n",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-treasury#creating-a-treasury-proposal"},"treasury proposal"),"."),(0,s.kt)("h3",{id:"kusama-gifts"},"Kusama Gifts"),(0,s.kt)("img",{align:"right",src:"/img/kusama-gift.png",width:"210",height:"200"}),(0,s.kt)("p",null,"Kusama Gifts provide an easy way to:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Onboard friends or family who are curious about blockchain but haven\u2019t made the leap yet."),(0,s.kt)("li",{parentName:"ul"},"Share your love of Kusama and send any amount of KSM."),(0,s.kt)("li",{parentName:"ul"},"Say \u2018thank you\u2019 or send someone tokens when you don\u2019t know their address."),(0,s.kt)("li",{parentName:"ul"},"Get friends and family set up to participate in crowdloans.")),(0,s.kt)("p",null,"Learn more about how you can create and send Kusama Gifts\n",(0,s.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/introducing-polkadot-kusama-gifts/"},"here"),"."),(0,s.kt)("p",null,"While Kusama does not support smart contracts natively, building apps on it is still possible (e.g.\n",(0,s.kt)("a",{parentName:"p",href:"https://rmrk.app"},"RMRK.app"),"). If you're interested in diving deeper into ",(0,s.kt)("em",{parentName:"p"},"proper")," development,\nhowever, check out the ",(0,s.kt)("a",{parentName:"p",href:"build-index"},"builders guide"),"."),(0,s.kt)("p",null,"Additional Resources:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://mooc.web3.foundation/course/blockchain-fundamentals/"},"mooc")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://medium.com/polkadot-network/kusama-network-7446706b8f4c"},"medium")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"kusama-claims"},"claims")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"maintain-endpoints"},"endpoints")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://claim.kusama.network/"},"tokens")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-validate-kusama"},"validator")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-nominate-kusama"},"nominator")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://wiki.polkadot.network/"},"polkadot wiki"))))}p.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/2d429218.3789530f.js b/assets/js/2d429218.3789530f.js new file mode 100644 index 000000000000..a482121c6402 --- /dev/null +++ b/assets/js/2d429218.3789530f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[502],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var o=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=o.createContext({}),c=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=c(e.components);return o.createElement(l.Provider,{value:t},e.children)},h="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},u=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,d=r(e,["components","mdxType","originalType","parentName"]),h=c(n),u=a,m=h["".concat(l,".").concat(u)]||h[u]||p[u]||i;return n?o.createElement(m,s(s({ref:t},d),{},{components:n})):o.createElement(m,s({ref:t},d))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,s=new Array(i);s[0]=u;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r[h]="string"==typeof e?e:a,s[1]=r;for(var c=2;c{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>r,metadata:()=>c,toc:()=>h});var o=n(87462),a=n(63366),i=(n(67294),n(3905)),s=["components"],r={id:"learn-consensus",title:"Polkadot Consensus",sidebar_label:"Consensus",description:"The Consensus Mechanism of Polkadot.",keywords:["consensus","proof of stake","nominated proof of stake","hybrid consensus","finality"],slug:"../learn-consensus"},l=void 0,c={unversionedId:"learn/learn-consensus",id:"learn/learn-consensus",title:"Polkadot Consensus",description:"The Consensus Mechanism of Polkadot.",source:"@site/../docs/learn/learn-consensus.md",sourceDirName:"learn",slug:"/learn-consensus",permalink:"/docs/learn-consensus",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-consensus.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1695800641,formattedLastUpdatedAt:"Sep 27, 2023",frontMatter:{id:"learn-consensus",title:"Polkadot Consensus",sidebar_label:"Consensus",description:"The Consensus Mechanism of Polkadot.",keywords:["consensus","proof of stake","nominated proof of stake","hybrid consensus","finality"],slug:"../learn-consensus"},sidebar:"docs",previous:{title:"Runtime Upgrades",permalink:"/docs/learn-runtime-upgrades"},next:{title:"Advanced",permalink:"/docs/learn-advanced-index"}},d={},h=[{value:"Why do we need Consensus?",id:"why-do-we-need-consensus",level:2},{value:"What are PoW and PoS?",id:"what-are-pow-and-pos",level:2},{value:"Why not Proof of Work?",id:"why-not-proof-of-work",level:2},{value:"Nominated Proof of Stake",id:"nominated-proof-of-stake",level:2},{value:"Probabilistic vs. Provable Finality",id:"probabilistic-vs-provable-finality",level:2},{value:"Hybrid Consensus",id:"hybrid-consensus",level:2},{value:"Block Production: BABE",id:"block-production-babe",level:2},{value:"Multiple Validators per Slot",id:"multiple-validators-per-slot",level:3},{value:"No Validators in Slot",id:"no-validators-in-slot",level:3},{value:"Finality Gadget: GRANDPA",id:"finality-gadget-grandpa",level:2},{value:"Protocol",id:"protocol",level:3},{value:"Implementation",id:"implementation",level:3},{value:"Bridging: BEEFY",id:"bridging-beefy",level:2},{value:"Fork Choice",id:"fork-choice",level:2},{value:"Nakamoto consensus",id:"nakamoto-consensus",level:2},{value:"PBFT / Tendermint",id:"pbft--tendermint",level:2},{value:"Casper FFG",id:"casper-ffg",level:2}],p={toc:h},u="wrapper";function m(e){var t=e.components,r=(0,a.Z)(e,s);return(0,i.kt)(u,(0,o.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"why-do-we-need-consensus"},"Why do we need Consensus?"),(0,i.kt)("p",null,"Consensus 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 ",(0,i.kt)("em",{parentName:"p"},"objective")," view of the state amid participants who each have their own ",(0,i.kt)("em",{parentName:"p"},"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."),(0,i.kt)("h2",{id:"what-are-pow-and-pos"},"What are PoW and PoS?"),(0,i.kt)("p",null,"Proof 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 ",(0,i.kt)("a",{parentName:"p",href:"#nakamoto-consensus"},"Nakamoto consensus")," that\nalso encompasses a chain selection algorithm (longest chain rule in Bitcoin). Similarly, PoS is a\nset of rules for selecting the validator set and does not specify a chain selection rule or how a\nchain might reach finality. PoS algorithms have traditionally been paired with an algorithm for\ncoming to Byzantine agreement between nodes. For example, ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-comparisons-cosmos"},"Tendermint"),"\nis a practical Byzantine fault tolerant algorithm that uses PoS as its validator set selection\nmethod."),(0,i.kt)("h2",{id:"why-not-proof-of-work"},"Why not Proof of Work?"),(0,i.kt)("p",null,"Although 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."),(0,i.kt)("h2",{id:"nominated-proof-of-stake"},"Nominated Proof of Stake"),(0,i.kt)("p",null,"In traditional PoS systems, block production participation is dependent on token holdings as opposed\nto computational power. While PoS developers usually have a proponent for equitable participation in\na decentralized manner, most projects end up proposing some level of centralized operation, where\nthe number of validators with full participation rights is limited. These validators are often seen\nto be the most wealthy, and, as a result, influence the PoS network as they are the most staked.\nUsually, the number of candidates to maintain the network with the necessary knowledge (and\nequipment) is limited; this can directly increase operational costs as well. Systems with a large\nnumber of validators tend to form pools to decrease the variance of their revenue and profit from\neconomies of scale. These pools are often off-chain."),(0,i.kt)("p",null,"A way to alleviate this is to implement pool formation on-chain and allow token holders to vote with\ntheir stake for validators to represent them."),(0,i.kt)("p",null,"Polkadot uses NPoS (Nominated Proof-of-Stake)\nas its mechanism for selecting the validator set. It is designed with the roles of ",(0,i.kt)("strong",{parentName:"p"},"validators"),"\nand ",(0,i.kt)("strong",{parentName:"p"},"nominators"),", to maximize chain security. Actors who are interested in maintaining the network\ncan run a validator node."),(0,i.kt)("p",null,"Validators assume the role of producing new blocks in ",(0,i.kt)("a",{parentName:"p",href:"#block-production-babe"},"BABE"),", validating\nparachain blocks, and guaranteeing finality. Nominators can choose to back select validators with\ntheir stake. Nominators can approve candidates that they trust and back them with their tokens."),(0,i.kt)("h2",{id:"probabilistic-vs-provable-finality"},"Probabilistic vs. Provable Finality"),(0,i.kt)("p",null,"A pure Nakamoto consensus blockchain that runs PoW is only able to achieve the notion of\n",(0,i.kt)("em",{parentName:"p"},"probabilistic finality")," and reach ",(0,i.kt)("em",{parentName:"p"},"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 be determined 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",(0,i.kt)("em",{parentName:"p"},"provable finality.")),(0,i.kt)("p",null,"In the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/w3f/consensus/blob/master/pdf/grandpa.pdf"},"GRANDPA paper"),", it is phrased\nin this way:"),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"We say an oracle A in a protocol is ",(0,i.kt)("em",{parentName:"p"},"eventually consistent")," if it returns the same value to all\nparticipants after some unspecified time.")),(0,i.kt)("h2",{id:"hybrid-consensus"},"Hybrid Consensus"),(0,i.kt)("p",null,"There are two protocols we use when we talk about the consensus protocol of\nPolkadot, GRANDPA and BABE (Blind Assignment\nfor Blockchain Extension). We talk about both of these because\nPolkadot uses what is known as ",(0,i.kt)("em",{parentName:"p"},"hybrid\nconsensus"),". Hybrid consensus splits up the finality gadget from the block production mechanism."),(0,i.kt)("p",null,'This is a way of getting the benefits of probabilistic finality (the ability to always produce new\nblocks) and provable finality (having a universal agreement on the canonical chain with no chance\nfor reversion) in Polkadot. It also avoids the\ncorresponding drawbacks of each mechanism (the chance of unknowingly following the wrong fork in\nprobabilistic finality, and a chance for "stalling" - not being able to produce new blocks - in\nprovable finality). By combining these two mechanisms,\nPolkadot allows for blocks to be rapidly\nproduced, and the slower finality mechanism to run in a separate process to finalize blocks without\nrisking slower transaction processing or stalling.'),(0,i.kt)("p",null,"Hybrid 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 ",(0,i.kt)("a",{parentName:"p",href:"http://eips.ethereum.org/EIPS/eip-1011"},"EIP 1011"),", which\nspecified ",(0,i.kt)("a",{parentName:"p",href:"#casper-ffg"},"Casper FFG"),"."),(0,i.kt)("h2",{id:"block-production-babe"},"Block Production: BABE"),(0,i.kt)("p",null,"BABE (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",(0,i.kt)("a",{parentName:"p",href:"https://eprint.iacr.org/2017/573.pdf"},"Ouroboros Praos"),", 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 Polkadot\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography#randomness"},"randomness cycle"),". The chains 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."),(0,i.kt)("p",null,"BABE 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",(0,i.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#algo-block-production-lottery"},"Block-Production-Lottery algorithm"),"\nto find out in which slots it should produce a block and gossip to the other block producers."),(0,i.kt)("p",null,"Validators 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."),(0,i.kt)("h3",{id:"multiple-validators-per-slot"},"Multiple Validators per Slot"),(0,i.kt)("p",null,"When 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 Fork Choice below for\nhow that works."),(0,i.kt)("h3",{id:"no-validators-in-slot"},"No Validators in Slot"),(0,i.kt)("p",null,"When no validators have rolled low enough in the randomness lottery to qualify for block production,\na slot can remain seemingly blockless. We avoid this by running a secondary, round-robin style\nvalidator selection algorithm in the background. The validators selected to produce blocks through\nthis algorithm always produce blocks, but these ",(0,i.kt)("em",{parentName:"p"},"secondary")," blocks are ignored if the same slot also\nproduces a primary block from a ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography#randomness"},"VRF-selected")," validator. Thus,\na slot can have either a ",(0,i.kt)("em",{parentName:"p"},"primary")," or a ",(0,i.kt)("em",{parentName:"p"},"secondary")," block, and no slots are ever skipped."),(0,i.kt)("p",null,"For more details on BABE, please see the\n",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/protocols/block-production/Babe"},"BABE paper"),"."),(0,i.kt)("h2",{id:"finality-gadget-grandpa"},"Finality Gadget: GRANDPA"),(0,i.kt)("p",null,"GRANDPA (GHOST-based Recursive ANcestor Deriving Prefix Agreement) is the finality gadget that is\nimplemented for the Polkadot Relay Chain."),(0,i.kt)("p",null,"The Polkadot Host uses the GRANDPA Finality\nprotocol to finalize blocks. Finality is obtained by consecutive rounds of voting by the validator\nnodes. Validators execute GRANDPA finality process in parallel to Block Production as an independent\nservice."),(0,i.kt)("p",null,"It 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."),(0,i.kt)("p",null,"A 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."),(0,i.kt)("p",null,"In other words, as soon as more than 2/3 of validators attest to a chain containing a certain block,\nall blocks leading up to that one are finalized at once."),(0,i.kt)("h3",{id:"protocol"},"Protocol"),(0,i.kt)("p",null,"Please refer to ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/w3f/consensus/blob/master/pdf/grandpa.pdf"},"the GRANDPA paper"),"\nfor a full description of the protocol."),(0,i.kt)("h3",{id:"implementation"},"Implementation"),(0,i.kt)("p",null,"The\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/master/frame/grandpa/src/lib.rs"},"Substrate implementation of GRANDPA"),"\nis part of Substrate Frame."),(0,i.kt)("h2",{id:"bridging-beefy"},"Bridging: BEEFY"),(0,i.kt)("p",null,"The BEEFY (Bridge Efficiency Enabling Finality Yielder) is a secondary protocol to GRANDPA to\nsupport efficient bridging between the\nPolkadot network (relay chain) and remote,\nsegregated blockchains, such as Ethereum, which were not built with the\nPolkadot interchain operability in mind. The\nprotocol allows participants of the remote network to verify finality proofs created by the\nPolkadot relay chain validators. In other\nwords: clients in the Ethereum network should able to verify that the\nPolkadot network is at a specific state."),(0,i.kt)("p",null,"Storing all the information necessary to verify the state of the remote chain, such as the block\nheaders, is too expensive. BEEFY stores the information in a space-efficient way and clients can\nrequest additional information over the protocol."),(0,i.kt)("p",null,"For additional implementation details, check out\n",(0,i.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#sect-grandpa-beefy"},"this")," section of the Polkadot Spec."),(0,i.kt)("h2",{id:"fork-choice"},"Fork Choice"),(0,i.kt)("p",null,"Bringing BABE and GRANDPA together, the fork choice of\nPolkadot becomes clear. BABE must always build\non the chain that has been finalized by GRANDPA. When there are forks after the finalized head, BABE\nprovides probabilistic finality by building on the chain with the most primary blocks."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Best chain choice",src:n(74532).Z,width:"1739",height:"817"})),(0,i.kt)("p",null,'In 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.'),(0,i.kt)("h1",{id:"comparisons"},"Comparisons"),(0,i.kt)("h2",{id:"nakamoto-consensus"},"Nakamoto consensus"),(0,i.kt)("p",null,"Nakamoto consensus consists of the longest chain rule using proof of work as its Sybil resistance\nmechanism and leader election."),(0,i.kt)("p",null,"Nakamoto 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."),(0,i.kt)("h2",{id:"pbft--tendermint"},"PBFT / Tendermint"),(0,i.kt)("p",null,"Please see the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-comparisons-cosmos#consensus"},"relevant section")," in the Cosmos comparison\narticle."),(0,i.kt)("h2",{id:"casper-ffg"},"Casper FFG"),(0,i.kt)("p",null,"The two main differences between GRANDPA and Casper FFG are:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"in GRANDPA, different voters can cast votes simultaneously for blocks at different heights"),(0,i.kt)("li",{parentName:"ul"},"GRANDPA only depends on finalized blocks to affect the fork-choice rule of the underlying block\nproduction mechanism")),(0,i.kt)("h1",{id:"resources"},"Resources"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://research.web3.foundation/Polkadot/protocols/block-production/Babe"},"BABE paper")," - The\nacademic description of the BABE protocol."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/w3f/consensus/blob/master/pdf/grandpa.pdf"},"GRANDPA paper")," - The academic\ndescription of the GRANDPA finality gadget. Contains formal proofs of the algorithm."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/paritytech/finality-grandpa"},"Rust implementation")," - The reference\nimplementation and the accompanying\n",(0,i.kt)("a",{parentName:"li",href:"https://github.com/paritytech/substrate/blob/master/frame/grandpa/src/lib.rs"},"Substrate pallet"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.crowdcast.io/e/polkadot-block-production"},"Block Production and Finalization in Polkadot")," -\nAn explanation of how BABE and GRANDPA work together to produce and finalize blocks on Kusama,\nwith Bill Laboon."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=1CuTSluL7v4&t=4s"},"Block Production and Finalization in Polkadot: Understanding the BABE and GRANDPA Protocols")," -\nAn academic talk by Bill Laboon, given at MIT Cryptoeconomic Systems 2020, describing Polkadot's\nhybrid consensus model in-depth.")))}m.isMDXComponent=!0},74532:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/best_chain-52a3da00fb2f804a198c73690fcedc4f.png"}}]); \ No newline at end of file diff --git a/assets/js/2d429218.b0bc7324.js b/assets/js/2d429218.b0bc7324.js deleted file mode 100644 index 0e95d74d7b0f..000000000000 --- a/assets/js/2d429218.b0bc7324.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[502],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var o=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function s(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=o.createContext({}),c=function(e){var t=o.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=c(e.components);return o.createElement(l.Provider,{value:t},e.children)},h="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},u=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,d=r(e,["components","mdxType","originalType","parentName"]),h=c(n),u=a,m=h["".concat(l,".").concat(u)]||h[u]||p[u]||i;return n?o.createElement(m,s(s({ref:t},d),{},{components:n})):o.createElement(m,s({ref:t},d))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,s=new Array(i);s[0]=u;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r[h]="string"==typeof e?e:a,s[1]=r;for(var c=2;c{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>r,metadata:()=>c,toc:()=>h});var o=n(87462),a=n(63366),i=(n(67294),n(3905)),s=["components"],r={id:"learn-consensus",title:"Polkadot Consensus",sidebar_label:"Consensus",description:"The Consensus Mechanism of Polkadot.",keywords:["consensus","proof of stake","nominated proof of stake","hybrid consensus","finality"],slug:"../learn-consensus"},l=void 0,c={unversionedId:"learn/learn-consensus",id:"learn/learn-consensus",title:"Polkadot Consensus",description:"The Consensus Mechanism of Polkadot.",source:"@site/../docs/learn/learn-consensus.md",sourceDirName:"learn",slug:"/learn-consensus",permalink:"/docs/learn-consensus",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-consensus.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1695800641,formattedLastUpdatedAt:"Sep 27, 2023",frontMatter:{id:"learn-consensus",title:"Polkadot Consensus",sidebar_label:"Consensus",description:"The Consensus Mechanism of Polkadot.",keywords:["consensus","proof of stake","nominated proof of stake","hybrid consensus","finality"],slug:"../learn-consensus"},sidebar:"docs",previous:{title:"Treasury",permalink:"/docs/learn-polkadot-opengov-treasury"},next:{title:"Staking",permalink:"/docs/learn-staking-index"}},d={},h=[{value:"Why do we need Consensus?",id:"why-do-we-need-consensus",level:2},{value:"What are PoW and PoS?",id:"what-are-pow-and-pos",level:2},{value:"Why not Proof of Work?",id:"why-not-proof-of-work",level:2},{value:"Nominated Proof of Stake",id:"nominated-proof-of-stake",level:2},{value:"Probabilistic vs. Provable Finality",id:"probabilistic-vs-provable-finality",level:2},{value:"Hybrid Consensus",id:"hybrid-consensus",level:2},{value:"Block Production: BABE",id:"block-production-babe",level:2},{value:"Multiple Validators per Slot",id:"multiple-validators-per-slot",level:3},{value:"No Validators in Slot",id:"no-validators-in-slot",level:3},{value:"Finality Gadget: GRANDPA",id:"finality-gadget-grandpa",level:2},{value:"Protocol",id:"protocol",level:3},{value:"Implementation",id:"implementation",level:3},{value:"Bridging: BEEFY",id:"bridging-beefy",level:2},{value:"Fork Choice",id:"fork-choice",level:2},{value:"Nakamoto consensus",id:"nakamoto-consensus",level:2},{value:"PBFT / Tendermint",id:"pbft--tendermint",level:2},{value:"Casper FFG",id:"casper-ffg",level:2}],p={toc:h},u="wrapper";function m(e){var t=e.components,r=(0,a.Z)(e,s);return(0,i.kt)(u,(0,o.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"why-do-we-need-consensus"},"Why do we need Consensus?"),(0,i.kt)("p",null,"Consensus 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 ",(0,i.kt)("em",{parentName:"p"},"objective")," view of the state amid participants who each have their own ",(0,i.kt)("em",{parentName:"p"},"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."),(0,i.kt)("h2",{id:"what-are-pow-and-pos"},"What are PoW and PoS?"),(0,i.kt)("p",null,"Proof 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 ",(0,i.kt)("a",{parentName:"p",href:"#nakamoto-consensus"},"Nakamoto consensus")," that\nalso encompasses a chain selection algorithm (longest chain rule in Bitcoin). Similarly, PoS is a\nset of rules for selecting the validator set and does not specify a chain selection rule or how a\nchain might reach finality. PoS algorithms have traditionally been paired with an algorithm for\ncoming to Byzantine agreement between nodes. For example, ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-comparisons-cosmos"},"Tendermint"),"\nis a practical Byzantine fault tolerant algorithm that uses PoS as its validator set selection\nmethod."),(0,i.kt)("h2",{id:"why-not-proof-of-work"},"Why not Proof of Work?"),(0,i.kt)("p",null,"Although 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."),(0,i.kt)("h2",{id:"nominated-proof-of-stake"},"Nominated Proof of Stake"),(0,i.kt)("p",null,"In traditional PoS systems, block production participation is dependent on token holdings as opposed\nto computational power. While PoS developers usually have a proponent for equitable participation in\na decentralized manner, most projects end up proposing some level of centralized operation, where\nthe number of validators with full participation rights is limited. These validators are often seen\nto be the most wealthy, and, as a result, influence the PoS network as they are the most staked.\nUsually, the number of candidates to maintain the network with the necessary knowledge (and\nequipment) is limited; this can directly increase operational costs as well. Systems with a large\nnumber of validators tend to form pools to decrease the variance of their revenue and profit from\neconomies of scale. These pools are often off-chain."),(0,i.kt)("p",null,"A way to alleviate this is to implement pool formation on-chain and allow token holders to vote with\ntheir stake for validators to represent them."),(0,i.kt)("p",null,"Polkadot uses NPoS (Nominated Proof-of-Stake)\nas its mechanism for selecting the validator set. It is designed with the roles of ",(0,i.kt)("strong",{parentName:"p"},"validators"),"\nand ",(0,i.kt)("strong",{parentName:"p"},"nominators"),", to maximize chain security. Actors who are interested in maintaining the network\ncan run a validator node."),(0,i.kt)("p",null,"Validators assume the role of producing new blocks in ",(0,i.kt)("a",{parentName:"p",href:"#block-production-babe"},"BABE"),", validating\nparachain blocks, and guaranteeing finality. Nominators can choose to back select validators with\ntheir stake. Nominators can approve candidates that they trust and back them with their tokens."),(0,i.kt)("h2",{id:"probabilistic-vs-provable-finality"},"Probabilistic vs. Provable Finality"),(0,i.kt)("p",null,"A pure Nakamoto consensus blockchain that runs PoW is only able to achieve the notion of\n",(0,i.kt)("em",{parentName:"p"},"probabilistic finality")," and reach ",(0,i.kt)("em",{parentName:"p"},"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 be determined 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",(0,i.kt)("em",{parentName:"p"},"provable finality.")),(0,i.kt)("p",null,"In the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/w3f/consensus/blob/master/pdf/grandpa.pdf"},"GRANDPA paper"),", it is phrased\nin this way:"),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"We say an oracle A in a protocol is ",(0,i.kt)("em",{parentName:"p"},"eventually consistent")," if it returns the same value to all\nparticipants after some unspecified time.")),(0,i.kt)("h2",{id:"hybrid-consensus"},"Hybrid Consensus"),(0,i.kt)("p",null,"There are two protocols we use when we talk about the consensus protocol of\nPolkadot, GRANDPA and BABE (Blind Assignment\nfor Blockchain Extension). We talk about both of these because\nPolkadot uses what is known as ",(0,i.kt)("em",{parentName:"p"},"hybrid\nconsensus"),". Hybrid consensus splits up the finality gadget from the block production mechanism."),(0,i.kt)("p",null,'This is a way of getting the benefits of probabilistic finality (the ability to always produce new\nblocks) and provable finality (having a universal agreement on the canonical chain with no chance\nfor reversion) in Polkadot. It also avoids the\ncorresponding drawbacks of each mechanism (the chance of unknowingly following the wrong fork in\nprobabilistic finality, and a chance for "stalling" - not being able to produce new blocks - in\nprovable finality). By combining these two mechanisms,\nPolkadot allows for blocks to be rapidly\nproduced, and the slower finality mechanism to run in a separate process to finalize blocks without\nrisking slower transaction processing or stalling.'),(0,i.kt)("p",null,"Hybrid 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 ",(0,i.kt)("a",{parentName:"p",href:"http://eips.ethereum.org/EIPS/eip-1011"},"EIP 1011"),", which\nspecified ",(0,i.kt)("a",{parentName:"p",href:"#casper-ffg"},"Casper FFG"),"."),(0,i.kt)("h2",{id:"block-production-babe"},"Block Production: BABE"),(0,i.kt)("p",null,"BABE (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",(0,i.kt)("a",{parentName:"p",href:"https://eprint.iacr.org/2017/573.pdf"},"Ouroboros Praos"),", 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 Polkadot\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography#randomness"},"randomness cycle"),". The chains 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."),(0,i.kt)("p",null,"BABE 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",(0,i.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#algo-block-production-lottery"},"Block-Production-Lottery algorithm"),"\nto find out in which slots it should produce a block and gossip to the other block producers."),(0,i.kt)("p",null,"Validators 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."),(0,i.kt)("h3",{id:"multiple-validators-per-slot"},"Multiple Validators per Slot"),(0,i.kt)("p",null,"When 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 Fork Choice below for\nhow that works."),(0,i.kt)("h3",{id:"no-validators-in-slot"},"No Validators in Slot"),(0,i.kt)("p",null,"When no validators have rolled low enough in the randomness lottery to qualify for block production,\na slot can remain seemingly blockless. We avoid this by running a secondary, round-robin style\nvalidator selection algorithm in the background. The validators selected to produce blocks through\nthis algorithm always produce blocks, but these ",(0,i.kt)("em",{parentName:"p"},"secondary")," blocks are ignored if the same slot also\nproduces a primary block from a ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography#randomness"},"VRF-selected")," validator. Thus,\na slot can have either a ",(0,i.kt)("em",{parentName:"p"},"primary")," or a ",(0,i.kt)("em",{parentName:"p"},"secondary")," block, and no slots are ever skipped."),(0,i.kt)("p",null,"For more details on BABE, please see the\n",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/protocols/block-production/Babe"},"BABE paper"),"."),(0,i.kt)("h2",{id:"finality-gadget-grandpa"},"Finality Gadget: GRANDPA"),(0,i.kt)("p",null,"GRANDPA (GHOST-based Recursive ANcestor Deriving Prefix Agreement) is the finality gadget that is\nimplemented for the Polkadot Relay Chain."),(0,i.kt)("p",null,"The Polkadot Host uses the GRANDPA Finality\nprotocol to finalize blocks. Finality is obtained by consecutive rounds of voting by the validator\nnodes. Validators execute GRANDPA finality process in parallel to Block Production as an independent\nservice."),(0,i.kt)("p",null,"It 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."),(0,i.kt)("p",null,"A 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."),(0,i.kt)("p",null,"In other words, as soon as more than 2/3 of validators attest to a chain containing a certain block,\nall blocks leading up to that one are finalized at once."),(0,i.kt)("h3",{id:"protocol"},"Protocol"),(0,i.kt)("p",null,"Please refer to ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/w3f/consensus/blob/master/pdf/grandpa.pdf"},"the GRANDPA paper"),"\nfor a full description of the protocol."),(0,i.kt)("h3",{id:"implementation"},"Implementation"),(0,i.kt)("p",null,"The\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/master/frame/grandpa/src/lib.rs"},"Substrate implementation of GRANDPA"),"\nis part of Substrate Frame."),(0,i.kt)("h2",{id:"bridging-beefy"},"Bridging: BEEFY"),(0,i.kt)("p",null,"The BEEFY (Bridge Efficiency Enabling Finality Yielder) is a secondary protocol to GRANDPA to\nsupport efficient bridging between the\nPolkadot network (relay chain) and remote,\nsegregated blockchains, such as Ethereum, which were not built with the\nPolkadot interchain operability in mind. The\nprotocol allows participants of the remote network to verify finality proofs created by the\nPolkadot relay chain validators. In other\nwords: clients in the Ethereum network should able to verify that the\nPolkadot network is at a specific state."),(0,i.kt)("p",null,"Storing all the information necessary to verify the state of the remote chain, such as the block\nheaders, is too expensive. BEEFY stores the information in a space-efficient way and clients can\nrequest additional information over the protocol."),(0,i.kt)("p",null,"For additional implementation details, check out\n",(0,i.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#sect-grandpa-beefy"},"this")," section of the Polkadot Spec."),(0,i.kt)("h2",{id:"fork-choice"},"Fork Choice"),(0,i.kt)("p",null,"Bringing BABE and GRANDPA together, the fork choice of\nPolkadot becomes clear. BABE must always build\non the chain that has been finalized by GRANDPA. When there are forks after the finalized head, BABE\nprovides probabilistic finality by building on the chain with the most primary blocks."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Best chain choice",src:n(74532).Z,width:"1739",height:"817"})),(0,i.kt)("p",null,'In 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.'),(0,i.kt)("h1",{id:"comparisons"},"Comparisons"),(0,i.kt)("h2",{id:"nakamoto-consensus"},"Nakamoto consensus"),(0,i.kt)("p",null,"Nakamoto consensus consists of the longest chain rule using proof of work as its Sybil resistance\nmechanism and leader election."),(0,i.kt)("p",null,"Nakamoto 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."),(0,i.kt)("h2",{id:"pbft--tendermint"},"PBFT / Tendermint"),(0,i.kt)("p",null,"Please see the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-comparisons-cosmos#consensus"},"relevant section")," in the Cosmos comparison\narticle."),(0,i.kt)("h2",{id:"casper-ffg"},"Casper FFG"),(0,i.kt)("p",null,"The two main differences between GRANDPA and Casper FFG are:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"in GRANDPA, different voters can cast votes simultaneously for blocks at different heights"),(0,i.kt)("li",{parentName:"ul"},"GRANDPA only depends on finalized blocks to affect the fork-choice rule of the underlying block\nproduction mechanism")),(0,i.kt)("h1",{id:"resources"},"Resources"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://research.web3.foundation/Polkadot/protocols/block-production/Babe"},"BABE paper")," - The\nacademic description of the BABE protocol."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/w3f/consensus/blob/master/pdf/grandpa.pdf"},"GRANDPA paper")," - The academic\ndescription of the GRANDPA finality gadget. Contains formal proofs of the algorithm."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/paritytech/finality-grandpa"},"Rust implementation")," - The reference\nimplementation and the accompanying\n",(0,i.kt)("a",{parentName:"li",href:"https://github.com/paritytech/substrate/blob/master/frame/grandpa/src/lib.rs"},"Substrate pallet"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.crowdcast.io/e/polkadot-block-production"},"Block Production and Finalization in Polkadot")," -\nAn explanation of how BABE and GRANDPA work together to produce and finalize blocks on Kusama,\nwith Bill Laboon."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=1CuTSluL7v4&t=4s"},"Block Production and Finalization in Polkadot: Understanding the BABE and GRANDPA Protocols")," -\nAn academic talk by Bill Laboon, given at MIT Cryptoeconomic Systems 2020, describing Polkadot's\nhybrid consensus model in-depth.")))}m.isMDXComponent=!0},74532:(e,t,n)=>{n.d(t,{Z:()=>o});const o=n.p+"assets/images/best_chain-52a3da00fb2f804a198c73690fcedc4f.png"}}]); \ No newline at end of file diff --git a/assets/js/2f3b630e.39b618c8.js b/assets/js/2f3b630e.39b618c8.js new file mode 100644 index 000000000000..ecd786889991 --- /dev/null +++ b/assets/js/2f3b630e.39b618c8.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[9226],{47940:(e,t,n)=>{"use strict";n.d(t,{Z:()=>h});var a=n(74165),o=n(15861),i=n(67294),r=n(87152),l=n(17145),s=n(67425);function p(e,t,n){return d.apply(this,arguments)}function d(){return(d=(0,o.Z)((0,a.Z)().mark((function e(t,n,o){var i,s,p,d,c;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,s=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return p=new r.U(i),e.next=21,l.G.create({provider:p});case 21:d=e.sent,(c=n.split(".")).forEach((function(e){e in d&&(d=d[e])})),e.t1=c[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return s=d.toString(),e.abrupt("break",35);case 29:return e.next=31,d();case 31:return s=(s=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+n);case 35:return e.abrupt("return",s);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function c(e,t,n,a){switch(t){case"humanReadable":(0,s.HumanReadable)(e,n,a);break;case"precise":(0,s.Precise)(e,n,a);break;case"blocksToDays":(0,s.BlocksToDays)(e,a);break;case"percentage":(0,s.Percentage)(e,a);break;case"permillToPercent":(0,s.PermillToPercent)(e,a);break;case"arrayLength":(0,s.ArrayLength)(e,a);break;default:return void console.log("Ignoring unknown filter type")}}const h=function(e){var t=e.network,n=e.path,r=e.defaultValue,l=e.filter,s=void 0===l?void 0:l,d=(0,i.useState)(""),h=d[0],m=d[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==s?c(r.toString(),s,t,m):m(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,a.Z)().mark((function e(){var o;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p(t,n,m);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==s?c(o,s,t,m):m(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(l){console.log(l)}}}),[]),h}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,n,a){var o=void 0;if("polkadot"===n||"statemint"===n)o=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),a((e=Number.isInteger(e/t[n].precision)?e/t[n].precision+" "+t[n].symbol:(e/t[n].precision).toFixed(o)+" "+t[n].symbol).toString())},Precise:function(e,n,a){a(e=(e=parseFloat(e))/t[n].precision+" "+t[n].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},42569:(e,t,n)=>{"use strict";n.r(t),n.d(t,{assets:()=>f,contentTitle:()=>k,default:()=>y,frontMatter:()=>u,metadata:()=>g,toc:()=>v});var a=n(87462),o=n(63366),i=n(67294),r=n(3905),l=(n(47940),i.createElement("table",null,i.createElement("tbody",null,i.createElement("tr",null,i.createElement("th",null,"Lock Periods"),i.createElement("th",null,"Vote Multiplier"),i.createElement("th",null,"Length in Days")),i.createElement("tr",null,i.createElement("td",null,"0"),i.createElement("td",null,"0.1"),i.createElement("td",{id:"p0"})),i.createElement("tr",null,i.createElement("td",null,"1"),i.createElement("td",null,"1"),i.createElement("td",{id:"p1"})),i.createElement("tr",null,i.createElement("td",null,"2"),i.createElement("td",null,"2"),i.createElement("td",{id:"p2"})),i.createElement("tr",null,i.createElement("td",null,"4"),i.createElement("td",null,"3"),i.createElement("td",{id:"p4"})),i.createElement("tr",null,i.createElement("td",null,"8"),i.createElement("td",null,"4"),i.createElement("td",{id:"p8"})),i.createElement("tr",null,i.createElement("td",null,"16"),i.createElement("td",null,"5"),i.createElement("td",{id:"p16"})),i.createElement("tr",null,i.createElement("td",null,"32"),i.createElement("td",null,"6"),i.createElement("td",{id:"p32"}))))),s=["p0","p1","p2","p4","p8","p16","p32"],p={p0:0,p1:28,p2:56,p4:112,p8:224,p16:448,p32:896},d={p0:0,p1:7,p2:14,p4:28,p8:56,p16:112,p32:224};function c(e){s.forEach((function(t){var n=document.getElementById(t);"polkadot"===e?n.innerText=p[t]:"kusama"===e&&(n.innerText=d[t])}))}const h=function(){var e=(0,i.useState)("");return e[0],e[1],(0,i.useEffect)((function(){var e=document.title;"Governance V1 \xb7 Polkadot Wiki"===e||"Polkadot OpenGov \xb7 Polkadot Wiki"===e?c("polkadot"):"Governance V1 \xb7 Guide"===e||"Polkadot OpenGov \xb7 Guide"===e?c("kusama"):console.log("Unknown wiki/guide type")}),[]),l};var m=["components"],u={id:"learn-polkadot-opengov",title:"Polkadot OpenGov",sidebar_label:"Polkadot OpenGov",description:"Polkadot\u2019s Latest Model for Decentralized Governance.",keywords:["governance","referenda","proposal","voting","endorse"],slug:"../learn-polkadot-opengov"},k=void 0,g={unversionedId:"learn/learn-polkadot-opengov",id:"learn/learn-polkadot-opengov",title:"Polkadot OpenGov",description:"Polkadot\u2019s Latest Model for Decentralized Governance.",source:"@site/../docs/learn/learn-polkadot-opengov.md",sourceDirName:"learn",slug:"/learn-polkadot-opengov",permalink:"/docs/learn-polkadot-opengov",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-polkadot-opengov.md",tags:[],version:"current",lastUpdatedBy:"Radha",lastUpdatedAt:1697469489,formattedLastUpdatedAt:"Oct 16, 2023",frontMatter:{id:"learn-polkadot-opengov",title:"Polkadot OpenGov",sidebar_label:"Polkadot OpenGov",description:"Polkadot\u2019s Latest Model for Decentralized Governance.",keywords:["governance","referenda","proposal","voting","endorse"],slug:"../learn-polkadot-opengov"},sidebar:"docs",previous:{title:"Nomination Pools",permalink:"/docs/learn-nomination-pools"},next:{title:"Treasury",permalink:"/docs/learn-polkadot-opengov-treasury"}},f={},v=[{value:"Premise",id:"premise",level:2},{value:"Summary",id:"summary",level:2},{value:"Gov1 vs. Polkadot OpenGov",id:"gov1-vs-polkadot-opengov",level:2},{value:"Proposals",id:"proposals",level:2},{value:"Cancelling and Blacklisting",id:"cancelling-and-blacklisting",level:3},{value:"Referenda",id:"referenda",level:2},{value:"Referenda Timeline",id:"referenda-timeline",level:3},{value:"Origins and Tracks",id:"origins-and-tracks",level:3},{value:"Approval and Support",id:"approval-and-support",level:3},{value:"Enactment",id:"enactment",level:3},{value:"Voting on a Referendum",id:"voting-on-a-referendum",level:2},{value:"Voluntary Locking",id:"voluntary-locking",level:3},{value:"Multirole Delegation",id:"multirole-delegation",level:3},{value:"The Polkadot Technical Fellowship",id:"the-polkadot-technical-fellowship",level:2},{value:"Ranking System",id:"ranking-system",level:3},{value:"Whitelisting",id:"whitelisting",level:3},{value:"Becoming a Polkadot Technical Fellowship Member",id:"becoming-a-polkadot-technical-fellowship-member",level:3},{value:"Resources",id:"resources",level:2}],w={toc:v},b="wrapper";function y(e){var t=e.components,i=(0,o.Z)(e,m);return(0,r.kt)(b,(0,a.Z)({},w,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("admonition",{title:"The content in this document is subject to change",type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"The governance protocol has already undergone iterations (see\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance"},"Governance V1"),"). Governance is a constantly evolving protocol at this stage\nin its lifecycle."),(0,r.kt)("p",{parentName:"admonition"},"For technical information about Polkadot OpenGov and how to interact with it, please refer to this\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov"},"dedicated Wiki page"),"."),(0,r.kt)("p",{parentName:"admonition"},"For additional support about Polkadot OpenGov see the\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/65000105211"},"dedicated support pages"),".")),(0,r.kt)("admonition",{title:"Polkadot Delegation Dashboard",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"You can easily delegate your votes to somebody else using the\n",(0,r.kt)("a",{parentName:"p",href:"https://delegation.polkadot.network/"},"Polkadot Delegation Dashboard"),". See\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=RapBYZc5ZPo"},"this video tutorial")," to learn how to use the\ndashboard. ",(0,r.kt)("strong",{parentName:"p"},"If you become a nomination pool member or a pool admin, you cannot participate in\nGovernance with the bonded tokens in the pool, as they are held in a\n",(0,r.kt)("a",{parentName:"strong",href:"/docs/learn-account-advanced#system-accounts"},"system account"),"."))),(0,r.kt)("p",null,"Polkadot uses a sophisticated governance\nmechanism that allows it to evolve gracefully overtime at the ultimate behest of its assembled\nstakeholders. The stated goal is to ensure that the majority of the stake can always command the\nnetwork."),(0,r.kt)("p",null,"Polkadot brings together various novel\nmechanisms, including an amorphous (abstract) form of state-transition function stored on-chain\ndefined in a platform-agnostic language (i.e. ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-wasm"},"WebAssembly"),"), and several on-chain\nvoting mechanisms such as referenda and batch approval voting. All changes to the protocol must be\nagreed upon by stake-weighted referenda."),(0,r.kt)("h2",{id:"premise"},"Premise"),(0,r.kt)("p",null,"Polkadot's first governance system\n(",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance"},"Governance V1"),") included three main components."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("a",{parentName:"li",href:"/docs/learn-governance#technical-committee"},"Technical Committee"),": A technocratic committee to\nmanage upgrade timelines."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("a",{parentName:"li",href:"/docs/learn-governance#council"},"Council"),': An approval-voted, elected executive "government" to\nmanage parameters, admin, and spending proposals.'),(0,r.kt)("li",{parentName:"ul"},"The Public: All token holders.")),(0,r.kt)("p",null,"Over the first few years of operation, Governance V1 ensured the appropriate usage of treasury funds\nand enabled timely upgrades and fixes. Like most early technologies, protocols must evolve as they\nmature to improve their shortcomings and keep up with modern advancements. In Governance V1, all\nreferenda carried the same weight as only one referendum could be voted on at a time (except for\nemergency proposals), and the voting period could last multiple weeks. Also, an\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#alternating-voting-timetable"},"alternating voting timetable")," allowed to vote\neither for a public referendum or a council motion every\n28 days. This resulted in the system favoring\ncareful consideration of very few proposals instead of broad consideration of many."),(0,r.kt)("p",null,"Polkadot OpenGov changes how the practical means of day-to-day decisions are made, making the\nrepercussions of referenda better scoped and agile to increase the number of collective decisions\nthe system can make at any given time."),(0,r.kt)("p",null,"The following content is focused on what the new Polkadot OpenGov version brings to the governance\non Polkadot, and on the main differences with\nprevious governance versions. We recommend learning about ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance"},"Governance v1")," to\nbetter understand the need for and the direction of Polkadot OpenGov."),(0,r.kt)("h2",{id:"summary"},"Summary"),(0,r.kt)("p",null,"In Governance v1, active token holders (public) and the Council together administrated network's\nupgrade decisions. Whether the public or the council initiated the proposal, it would eventually\nhave to go through a referendum to let all holders (weighted by stake and conviction) make the\ndecision."),(0,r.kt)("p",null,"The Council fulfilled its role as the representative of the public, guardian of the treasury and\ninitiator of legislation, but it was often seen as a centralized entity. To further decentralize\nPolkadot, Polkadot OpenGov proposes the\nfollowing main changes:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Migrating all responsibilities of the Council to the public via a direct democracy voting system."),(0,r.kt)("li",{parentName:"ul"},"Dissolving the current ",(0,r.kt)("a",{parentName:"li",href:"/docs/learn-governance#council"},"Council")," collective"),(0,r.kt)("li",{parentName:"ul"},"Allowing users to delegate voting power in more ways to community members"),(0,r.kt)("li",{parentName:"ul"},"Dissolving the ",(0,r.kt)("a",{parentName:"li",href:"/docs/learn-governance#technical-committee"},"Technical Committee")," and establishing\nthe broader ",(0,r.kt)("a",{parentName:"li",href:"#the-technical-fellowship"},"Polkadot Technical Fellowship"))),(0,r.kt)("p",null,"The figure below shows an overview of Polkadot OpenGov's structure."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#summary"},"this page")," for a comparison with the structure of Governance V1.")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"opengov-overview",src:n(40176).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"In Polkadot OpenGov, all the proposals are initiated by the public. The proposal will enter a\nLead-in period (for more information, see ",(0,r.kt)("a",{parentName:"p",href:"#referenda-timeline"},"Referenda Timeline"),"), after which it\nwill follow a specific ",(0,r.kt)("a",{parentName:"p",href:"#origins-and-tracks"},"Track")," which has a dedicated Origin. There are\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#origins-and-tracks-info"},"15 Origins"),", each with a\ndifferent track. The origins and tracks parameters are preset values that set the duration of a\nreferendum as well as how many referenda can be voted on simultaneously. For example, a treasury\nproposal can now be submitted in different tracks depending on the amount requested. A proposal for\na small tip will need to be submitted in the Small Tipper track, while a proposal requiring\nsubstantial funds will need to be submitted to the Medium or Big Spender track."),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"#the-technical-fellowship"},"Polkadot Technical Fellowship")," can decide to\n",(0,r.kt)("a",{parentName:"p",href:"#whitelisting"},"whitelist")," 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\nRoot Origin track."),(0,r.kt)("p",null,"Each track has its own preset ",(0,r.kt)("a",{parentName:"p",href:"#approval-and-support"},"Approval and Support")," curves which are based\non the origin's privileges. When both the approval and support criteria are satisfied for a specific\nperiod (called the confirmation period), the referenda passes and will be executed after the\nenactment period."),(0,r.kt)("p",null,"All referenda within each track and across tracks can be voted on simultaneously (assuming track\nmaximum capacity is not reached)."),(0,r.kt)("p",null,"Polkadot OpenGov also comes with multi-role delegations 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."),(0,r.kt)("admonition",{title:"Delegation Dashboard",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"To easily delegate your votes you can use the\n",(0,r.kt)("a",{parentName:"p",href:"https://delegation.polkadot.network/"},"Polkadot Delegation Dashboard"),". See\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=RapBYZc5ZPo"},"this video tutorial")," to know more about the dashboard\nand learn how to use it.")),(0,r.kt)("h2",{id:"gov1-vs-polkadot-opengov"},"Gov1 vs. Polkadot OpenGov"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Governance V1"),(0,r.kt)("th",{parentName:"tr",align:null},"Polkadot OpenGov"),(0,r.kt)("th",{parentName:"tr",align:null},"Polkadot OpenGov Benefit"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Includes the ",(0,r.kt)("a",{parentName:"td",href:"/docs/learn-governance#council"},"Council"),", the ",(0,r.kt)("a",{parentName:"td",href:"/docs/learn-governance#technical-committee"},"Technical Committee"),", and the Public (i.e. token holders)."),(0,r.kt)("td",{parentName:"tr",align:null},"Includes the Public and the ",(0,r.kt)("a",{parentName:"td",href:"#the-technical-fellowship"},"Technical Fellowship"),"."),(0,r.kt)("td",{parentName:"tr",align:null},"Simpler and more decentralized structure.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"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)."),(0,r.kt)("td",{parentName:"tr",align:null},"Referenda executed from ",(0,r.kt)("a",{parentName:"td",href:"/docs/maintain-guides-polkadot-opengov#origins-and-tracks-info"},"multiple origins"),", each with a different track that shapes proposals\u2019 timelines. Depending on the origin, multiple referenda within the same track are possible."),(0,r.kt)("td",{parentName:"tr",align:null},"Possibility to categorize proposals (based on importance and urgency) and execute them simultaneously within and between origin tracks.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Proposals can be submitted by either the Council or the Public."),(0,r.kt)("td",{parentName:"tr",align:null},"The public submits proposals."),(0,r.kt)("td",{parentName:"tr",align:null},"More democratic.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Uses ",(0,r.kt)("a",{parentName:"td",href:"/docs/learn-governance#adaptive-quorum-biasing"},"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."),(0,r.kt)("td",{parentName:"tr",align:null},"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."),(0,r.kt)("td",{parentName:"tr",align:null},"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.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Uses ",(0,r.kt)("a",{parentName:"td",href:"/docs/learn-governance#alternating-voting-timetable"},"alternating voting timetable")," allowing voters to cast votes for either council or public referenda every 28 eras."),(0,r.kt)("td",{parentName:"tr",align:null},"Multiple referenda can be voted at the same time."),(0,r.kt)("td",{parentName:"tr",align:null},"More flexible and agile governance system.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Except for emergency proposals, all referenda have fixed voting and enactment periods of 28 eras."),(0,r.kt)("td",{parentName:"tr",align:null},"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."),(0,r.kt)("td",{parentName:"tr",align:null},"Referenda\u2019s timeline is tailored to their importance and urgency. Flexible enactment period based on origin.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"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."),(0,r.kt)("td",{parentName:"tr",align:null},"No emergency proposals. The Technical Fellowship can whitelist proposals that will have their origin with shorter lead-in, confirmation, and enactment periods."),(0,r.kt)("td",{parentName:"tr",align:null},"The Technical Fellowship is a more decentralized entity when compared to the Technical Committee. Whitelisting a proposal requires a majority of approval from the fellowship.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Only the ",(0,r.kt)("a",{parentName:"td",href:"/docs/learn-governance#endorsing-proposals"},"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."),(0,r.kt)("td",{parentName:"tr",align:null},"All proposals will eventually be voted on (given track capacity and deposit are met and the Lead-in period has ended)."),(0,r.kt)("td",{parentName:"tr",align:null},"It allows all proposals to get a chance to be voted on in a timely predictive manner.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Only ",(0,r.kt)("em",{parentName:"td"},"aye")," or ",(0,r.kt)("em",{parentName:"td"},"nay")," votes possible."),(0,r.kt)("td",{parentName:"tr",align:null},"Voters can have the additional voting options of abstaining or splitting votes."),(0,r.kt)("td",{parentName:"tr",align:null},"More ways to engage in voting and increase turnout.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Voters can decide to delegate votes to another account."),(0,r.kt)("td",{parentName:"tr",align:null},"Voters can use ",(0,r.kt)("a",{parentName:"td",href:"#multirole-delegation"},"multirole delegations")," and delegate votes to different accounts depending on origins."),(0,r.kt)("td",{parentName:"tr",align:null},"More agile delegations tailored by expertise.")))),(0,r.kt)("h2",{id:"proposals"},"Proposals"),(0,r.kt)("admonition",{title:"Starting a proposal in Governance v1",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#proposals"},"this page")," for more information about starting referenda in\nGovernance v1.")),(0,r.kt)("p",null,"In Polkadot OpenGov, anyone can start a referendum at any time and do so as often as they wish.\nPrevious features were expanded and improved, most notably\n",(0,r.kt)("a",{parentName:"p",href:"#origins-and-tracks"},(0,r.kt)("strong",{parentName:"a"},"Origins and Tracks"))," help aid in the flow and processing of the submitted\nreferenda."),(0,r.kt)("h3",{id:"cancelling-and-blacklisting"},"Cancelling and Blacklisting"),(0,r.kt)("admonition",{title:"Cancelling Referenda in Governance v1",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#cancelling-proposals"},"this page")," for more information about cancelling\nreferenda in Governance v1.")),(0,r.kt)("p",null,"In Polkadot OpenGov, there is a special operation called ",(0,r.kt)("strong",{parentName:"p"},"Cancellation")," for intervening with a\nproposal already being voted on. The operation will immediately reject an ongoing referendum\nregardless of its status. There is also a provision to ensure the deposit of the proposer is slashed\nif the proposal is malicious or spam."),(0,r.kt)("p",null,"Cancellation is a governance operation the network must vote on to be executed. Cancellation comes\nwith\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#referendum-canceller"},"its own Origin and Track"),"\nwhich has a low lead-time and Approval/Support curves with slightly sharper reductions in their\nthresholds for passing, given that it is invoked with a sense of urgency."),(0,r.kt)("p",null,"For more information about how to cancel a referendum see the\n",(0,r.kt)("a",{parentName:"p",href:"./learn-guides-polkadot-opengov#cancel-or-kill-a-referendum"},"advanced how-to guides"),"."),(0,r.kt)("admonition",{title:"Blacklisting",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Blacklisting referenda in Polkadot OpenGov is\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#blacklisting-proposals"},"the same as in Governance v1"),".")),(0,r.kt)("h2",{id:"referenda"},"Referenda"),(0,r.kt)("admonition",{title:"Public and Council Referenda in Governance v1",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"With the Council's dissolution, ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#council-referenda"},"council referenda")," are no\nlonger present in Polkadot OpenGov."),(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#public-referenda"},"this page")," for more information about public referenda\nin Governance v1.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"In Polkadot OpenGov all referenda are public.")," The\n",(0,r.kt)("a",{parentName:"p",href:"#the-technical-fellowship"},"Technical Fellowship")," has the option to ",(0,r.kt)("a",{parentName:"p",href:"#whitelisting"},"whitelist"),"\nreferenda that can be then proposed in the track with\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#whitelisted-caller"},"whitelist origin"),"."),(0,r.kt)("h3",{id:"referenda-timeline"},"Referenda Timeline"),(0,r.kt)("admonition",{title:"Voting timetable in Governance v1",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#referenda-timeline"},"this page")," for more information about the voting\ntimetable in Governance v1.")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"opengov-timeline",src:n(1671).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"The figure above provides a summary view of the referenda timeline for Polkadot OpenGov."),(0,r.kt)("p",null,"In (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, be approved,\nand ultimately enacted. Instead, the proposal will stay within a ",(0,r.kt)("strong",{parentName:"p"},"Lead-in Period")," until it\nfulfills three criteria:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},'Proposals must stay within the lead-in period for a pre-defined minimum amount of time. This helps\nmitigate against the possibility of "decision sniping" where an attacker controlling a substantial\namount of voting power might seek to have a proposal passed immediately after proposing, not\nallowing the overall voting population adequate time to consider and participate.'),(0,r.kt)("li",{parentName:"ul"},"There must be enough room for the decision within the origin. Different origins have their limit\non the number of proposals that can be decided simultaneously. Tracks that have more potent\nabilities will have lower limits. For example, the Root level Origin has a limit of one, implying\nthat only a single proposal may be decided on at once."),(0,r.kt)("li",{parentName:"ul"},"A decision deposit must be submitted. Creating a referendum is cheap as the deposit value consists\nof only the value required for the on-chain storage needed to track it. But, having a referendum\nreviewed and decided upon carries the risk of using up the limited spots available in the\nreferenda queue. Having a more significant but refundable deposit requirement makes sense to help\nmitigate spam. Failing to submit the decision deposit will lead to a referendum ",(0,r.kt)("em",{parentName:"li"},"timeout"),".")),(0,r.kt)("p",null,"Until they are in the lead-in period, proposals remain undecided. Once the criteria above are met,\nthe referendum moves to the ",(0,r.kt)("em",{parentName:"p"},"deciding")," state. The votes of the referendum are now counted towards\nthe outcome."),(0,r.kt)("p",null,"In (2), the proposal enters the ",(0,r.kt)("strong",{parentName:"p"},"Decision Period")," where votes can be cast. For a proposal to be\napproved, votes must satisfy the approval and support criteria for at least the ",(0,r.kt)("strong",{parentName:"p"},"Confirmation\nPeriod"),"; otherwise, the proposal is automatically rejected. A rejected proposal can be resubmitted\nanytime and as many times as needed."),(0,r.kt)("p",null,"In (3), approved proposals will enter the ",(0,r.kt)("strong",{parentName:"p"},"Enactment Period"),", after which proposed changes will be\nexecuted."),(0,r.kt)("p",null,"Note 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 origins. Also, the number of\nreferenda within each track differs, with the Root origin track only accepting one. proposal at a\ntime (see below)."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"opengov-track-capacity",src:n(67506).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"This 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 in 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."),(0,r.kt)("h3",{id:"origins-and-tracks"},"Origins and Tracks"),(0,r.kt)("p",null,"An ",(0,r.kt)("strong",{parentName:"p"},"Origin")," is a specific level of privilege that will determine the ",(0,r.kt)("strong",{parentName:"p"},"Track")," of all referenda\nexecuted with that origin. The track is basically a pipeline in which the proposal lives and\nproceeds and is independent from other origins' tracks. The proposer of the referenda now selects an\nappropriate Origin for their request based on the proposal\u2019s requirements."),(0,r.kt)("p",null,"Although the track structure is the same for all origins, track parameters are not. Such parameters\ninclude:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Maximum Deciding or Capacity"),": the limit for the number of referenda that can be decided at\nonce (i.e. the number of tracks within each origin)."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Decision deposit"),": the amount of funds that must be placed on deposit to enter the Decision\nPeriod (note that more requirements must be met to enter the Decision Period)."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Preparation Period"),": the minimum amount of voting time needed before entering the Decision\nPeriod (given capacity and deposit are met)."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Decision Period"),": the maximum time to approve a proposal. The proposal will be accepted if\napproved by the end of the period."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Confirmation Period"),": the minimum amount of time (within the Decision Period) the approval and\nsupport criteria must hold before the proposal is approved and moved to the enactment period."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Minimum Enactment Period"),": the minimum amount of waiting time before the proposed changes are\napplied"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Approval Curve"),": the curve describing the minimum % of ",(0,r.kt)("em",{parentName:"li"},"aye")," votes as a function of time within\nthe Decision Period. The approval % is the portion of ",(0,r.kt)("em",{parentName:"li"},"aye")," votes (adjusted for conviction) over\nthe total votes (",(0,r.kt)("em",{parentName:"li"},"aye"),", ",(0,r.kt)("em",{parentName:"li"},"nay"),", and ",(0,r.kt)("em",{parentName:"li"},"abstained"),")."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Support Curve"),": the curve describing the minimum % of all votes in support of a proposal as a\nfunction of time within the Decision Period. The support % is defined as the portion of all votes\n(",(0,r.kt)("em",{parentName:"li"},"aye")," and ",(0,r.kt)("em",{parentName:"li"},"abstained"),") without conviction over the total possible amount of votes in the system\n(i.e. the total active issuance).")),(0,r.kt)("p",null,"For example, a runtime upgrade (requiring a ",(0,r.kt)("inlineCode",{parentName:"p"},"set_code")," call, if approved) does not have the same\nimplications for the ecosystem as the approval of a treasury tip (",(0,r.kt)("inlineCode",{parentName:"p"},"reportAwesome")," call), and\ntherefore different Origins for these two actions are needed in which different deposits, support,\napproval, and a minimum ",(0,r.kt)("a",{parentName:"p",href:"#enactment"},"enactment")," periods will be predetermined on the pallet."),(0,r.kt)("p",null,"For detailed information about origin and tracks, and parameter values in Kusama, see\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#origins-and-tracks-info"},"this page"),"."),(0,r.kt)("h3",{id:"approval-and-support"},"Approval and Support"),(0,r.kt)("admonition",{title:"Adaptive Quorum Biasing is deprecated",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"In Polkadot OpenGov, ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#adaptive-quorum-biasing"},"Adaptive quorum biasing")," used\nin Governance V1 has been replaced with the ",(0,r.kt)("strong",{parentName:"p"},"Approval and Support system"),".")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"opengov-curves-pass",src:n(65993).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"The figure above provides a summary view of how the approval and support system works during the\nDecision Period."),(0,r.kt)("p",null,"Once 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 ",(0,r.kt)("strong",{parentName:"p"},"Confirmation Period"),"."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Approval")," is defined as the share of approval (",(0,r.kt)("em",{parentName:"li"},"aye")," votes) vote-weight (after adjustment for\n",(0,r.kt)("a",{parentName:"li",href:"#voluntary-locking"},"conviction"),") against the total vote-weight (",(0,r.kt)("em",{parentName:"li"},"aye"),", ",(0,r.kt)("em",{parentName:"li"},"nay"),", and ",(0,r.kt)("em",{parentName:"li"},"abstained"),")."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Support")," is the total number of ",(0,r.kt)("em",{parentName:"li"},"aye")," and ",(0,r.kt)("em",{parentName:"li"},"abstain")," votes (ignoring any adjustment for\nconviction) compared to the total possible votes that could be made in the system. In case of\n",(0,r.kt)("em",{parentName:"li"},"split")," votes, only ",(0,r.kt)("em",{parentName:"li"},"aye")," and ",(0,r.kt)("em",{parentName:"li"},"abstain")," will count.")),(0,r.kt)("admonition",{title:"Nay votes are not counted towards Support",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Support is a measure of voters who turned out either in favor of the referenda and who consciously\nabstained from it. Support does not include ",(0,r.kt)("em",{parentName:"p"},"nay")," votes. This avoids edge situations where ",(0,r.kt)("em",{parentName:"p"},"nay"),"\nvotes could push a referendum into confirming state. For example, imagine current approval is high\n(near 100%, way above the approval curve), and current support is just below the support curve. A\n",(0,r.kt)("em",{parentName:"p"},"nay")," could bump support above the support curve but not reduce approval below the approval curve.\nTherefore someone voting against a proposal would make it pass. Hence, a decrease in % of current\napproval through new votes does not directly translate into increasing support because Support needs\nto consider ",(0,r.kt)("em",{parentName:"p"},"nay")," votes.")),(0,r.kt)("p",null,"The figure above shows the followings:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Even if the approval threshold is reached (i.e. % of current approval is greater than the approval\ncurve), the proposal only enters the confirmation period once the support threshold is also\nreached (i.e. % current support is greater than the underlying support curve)."),(0,r.kt)("li",{parentName:"ul"},"If the referendum meets the criteria for the confirmation period, then the proposal is approved\nand scheduled for enactment. The Enactment Period can be specified when the referendum is proposed\nbut is also subject to a minimum value based on the Track. More powerful Tracks enforce a larger\nEnactment Period to ensure the network has ample time to prepare for any changes the proposal may\nbring."),(0,r.kt)("li",{parentName:"ul"},"A referendum may exit the confirmation period when the thresholds are no longer met, due to new\n",(0,r.kt)("em",{parentName:"li"},"Nay")," votes or a change of existing ",(0,r.kt)("em",{parentName:"li"},"Aye")," or ",(0,r.kt)("em",{parentName:"li"},"Abstain")," votes to ",(0,r.kt)("em",{parentName:"li"},"Nay")," . Each time it exits, the\nconfirmation period resets. For example, if the confirmation period is 20 minutes and a referendum\nenters it just for 5 min, the next time it enters, it must stay for 20 minutes (not 15 minutes)."),(0,r.kt)("li",{parentName:"ul"},"During the decision period, if a referendum fails to meet the approval and support thresholds for\nthe duration of the track-specific confirmation period, it fails and does not go to the enactment\nperiod (it may have to be resubmitted, see below)."),(0,r.kt)("li",{parentName:"ul"},"The current approval must be above 50% for a referendum to pass, and the approval curve never goes\nbelow 50%.")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"opengov-curves-pass",src:n(55745).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"Note that support may not increase monotonically as shown in the figure, as people might switch\nvotes."),(0,r.kt)("p",null,"Different Origins' tracks have different Confirmation Periods and requirements for approval and\nsupport. For additional details on the various origins and tracks, check out\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#origins-and-tracks-info"},"this table"),". Configuring\nthe amount of support and overall approval required for it to pass is now possible. With proposals\nthat use less privileged origins, it is far more reasonable to drop the required support to a more\nrealistic amount earlier than those which use highly privileged classes such as ",(0,r.kt)("inlineCode",{parentName:"p"},"Root"),". Classes with\nmore significance can be made to require higher approval early on, to avoid controversy."),(0,r.kt)("h3",{id:"enactment"},"Enactment"),(0,r.kt)("admonition",{title:"Enactment in Governance v1",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#enactment"},"this page")," for more information about enactment in Governance\nv1.")),(0,r.kt)("p",null,"In Polkadot OpenGov, the proposer suggests the enactment period, but there are also minimums set for\neach Origin Track. For example, root Origin approvals require a more extended period because of the\nimportance of the changes they bring to the network."),(0,r.kt)("h2",{id:"voting-on-a-referendum"},"Voting on a Referendum"),(0,r.kt)("p",null,"In Governance V1, voters could cast only an ",(0,r.kt)("em",{parentName:"p"},"aye")," or ",(0,r.kt)("em",{parentName:"p"},"nay")," vote. In Polkadot OpenGov, voters can\nadditionally cast a ",(0,r.kt)("em",{parentName:"p"},"abstain")," and ",(0,r.kt)("em",{parentName:"p"},"split")," votes.\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#voting-on-referenda"},"Vote splitting")," allows voters\nto allocate different votes for ",(0,r.kt)("em",{parentName:"p"},"aye"),", ",(0,r.kt)("em",{parentName:"p"},"nay"),", and ",(0,r.kt)("em",{parentName:"p"},"abstain"),"."),(0,r.kt)("admonition",{title:"Only the last vote counts",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Voting a second time replaces your original vote, e.g. voting with 10\nDOT, then a second extrinsic to vote with 5\nDOT, means that you are voting with 5\nDOT, not 10\nDOT.")),(0,r.kt)("h3",{id:"voluntary-locking"},"Voluntary Locking"),(0,r.kt)("p",null,"Polkadot utilizes an idea called voluntary\nlocking that allows token holders to increase their voting power by declaring how long they are\nwilling to lock up their tokens; hence, the number of votes for each token holder will be calculated\nby the following formula:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"votes = tokens * conviction_multiplier\n")),(0,r.kt)("p",null,"The conviction multiplier increases the vote multiplier by one every time the number of lock periods\ndouble."),(0,r.kt)(h,{mdxType:"VLTable"}),(0,r.kt)("p",null,"",(0,r.kt)("strong",{parentName:"p"},"The table above shows the correct duration values. However, the current values for Polkadot are the same as those for Kusama. This is going to be fixed. For more information, see ",(0,r.kt)("a",{parentName:"strong",href:"https://github.com/paritytech/polkadot/issues/7394"},"this GitHub issue"),"."),""),(0,r.kt)("p",null,'The maximum number of "doublings" of the lock period is set to 6 (and thus 32 lock periods in\ntotal), and one lock period equals 28\n',"\ndays. For additional information regarding the timeline of governance events, check out the\ngovernance section on the\n",(0,r.kt)("a",{parentName:"p",href:"maintain-polkadot-parameters/#governance"},"Polkadot Parameters page"),"","."),(0,r.kt)("admonition",{title:"do votes stack?",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"You can use the same number of tokens to vote on different referenda. Votes with conviction do not\nstack. If you voted with 5 DOT on Referenda A, B\nand C with 2x conviction you would have 10 votes on all those referenda and 5\nDOT locked up only for the 2x conviction period\n(i.e. 8 weeks), with the unlocking\ncountdown starting when the last referendum you voted on ends (assuming you are on the winning\nside). If you voted with conviction on referendum and then a week later voted on another one with\nthe same conviction, the lock on your DOT will be\nextended by a week (always assuming you are on the winning side).")),(0,r.kt)("admonition",{title:"Staked tokens can be used in governance",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"While a token is locked, you can still use it for voting and ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-staking"},"staking"),". You are\nonly prohibited from transferring these tokens to another account.")),(0,r.kt)("p",null,'Votes are always "counted" at the same time (at the end of the voting period), no matter for how\nlong the tokens are locked.'),(0,r.kt)("p",null,"See below an example that shows how voluntary locking works."),(0,r.kt)("p",null,"Peter: Votes ",(0,r.kt)("inlineCode",{parentName:"p"},"No")," with\n10 DOT for a 128-week lock period\n=> 10 x 6 = 60 Votes"),(0,r.kt)("p",null,"Logan: Votes ",(0,r.kt)("inlineCode",{parentName:"p"},"Yes")," with\n20 DOT for a 4-week lock period =>\n20 x 1 = 20 Votes"),(0,r.kt)("p",null,"Kevin: Votes ",(0,r.kt)("inlineCode",{parentName:"p"},"Yes")," with\n15 DOT for a 8-week lock period\n=> 15 x 2 = 30 Votes"),(0,r.kt)("p",null,"Even though combined both Logan and Kevin vote with more\nDOT than Peter, the lock period for both of them\nis less than Peter, leading to their voting power counting as less."),(0,r.kt)("admonition",{title:"Conviction Voting Locks created during Gov 1",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Conviction voting locks in Governance v1 will not be carried over to OpenGov. Voting with conviction\nin OpenGov will create a new lock (as this will use the ",(0,r.kt)("inlineCode",{parentName:"p"},"convictionVoting")," pallet), while any\nexisting lock under Governance v1 (using the deprecated ",(0,r.kt)("inlineCode",{parentName:"p"},"democracy")," pallet) will be left to expire.\nDelegations under Governance v1 will need to be re-issued under OpenGov.")),(0,r.kt)("h3",{id:"multirole-delegation"},"Multirole Delegation"),(0,r.kt)("p",null,"Polkadot OpenGov builds on the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#delegations"},"vote delegation feature from Governance v1")," where a voter can\ndelegate their voting power to another voter. It does so by introducing a feature known as\n",(0,r.kt)("strong",{parentName:"p"},"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."),(0,r.kt)("p",null,"For 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."),(0,r.kt)("admonition",{title:"Delegate your votes",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"In Polkadot OpenGov you can delegate your votes to different entities, who will vote on your behalf.\nYou can delegate your votes using the\n",(0,r.kt)("a",{parentName:"p",href:"https://delegation.polkadot.network/"},(0,r.kt)("strong",{parentName:"a"},"Polkadot Delegation Dashboard")),". See\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=tlh_KmWQiSQ"},"this video tutorial")," to learn about the features of\nthe dashboard."),(0,r.kt)("p",{parentName:"admonition"},"If you are staking directly and not through a nomination pool, you can use bonded tokens for voting.\nNote that if you are voting with conviction, your tokens will have a democracy lock in addition to\nthe staking lock. For more information about locks, see\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-accounts/#unlocking-locks"},"this page"),"."),(0,r.kt)("p",{parentName:"admonition"},"Democracy locks created through ",(0,r.kt)("a",{parentName:"p",href:"#voluntary-locking"},"conviction voting")," start the unlocking period\nafter a referendum ends, provided you voted with the winning side. In the case of delegations, the\nunlocking period countdown begins after the account undelegates. There can be different scenarios:"),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"if the account delegated votes to one delegate, then after undelegating, there will be one\nunlocking period with length dependent on the conviction multiplier."),(0,r.kt)("li",{parentName:"ul"},"if the account delegated votes to different delegates using different convictions, then after\nundelegating those delegates, there will be different unlocking periods with lengths dependent on\nthe conviction multipliers."))),(0,r.kt)("p",null,"Occasional delegation and undelegation calls are fee-free: creating an incentive for token holders\nto use this feature and ensure that wallets can do it \u201cby default\u201d without any cost to end-users. It\nis worth noting that a user delegating their voting power does not imply that the delegate will have\ncontrol over the funds of the delegating account: they can vote with a user's voting power: but they\nwon't be able to transfer your balance, nominate a different set of validators or execute any call\nother than voting on the defined call/s by the user."),(0,r.kt)("p",null,"With the new delegation features, the goal is to ensure the required support for proposals to be\nenacted is reached while maintaining the anonymity of voters and keeping the overall design\ncensorship-free."),(0,r.kt)("p",null,"For a step-by-step outline of how to delegate voting power in Polkadot OpenGov, check out the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#delegating-voting-power"},"Delegating Voting Power"),"\nsection on the ",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov"},"Polkadot OpenGov Maintenance")," page."),(0,r.kt)("h2",{id:"the-polkadot-technical-fellowship"},"The Polkadot Technical Fellowship"),(0,r.kt)("admonition",{title:"From Technical Committee to the Technical Fellowship",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The Polkadot Technical Fellowship is a collection of Substrate experts. This fellowship was\nestablished in 2022. In Polkadot OpenGov, this fellowship replaces the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#technical-committee"},"Technical Committee")," in Governance v1, and will serve\nboth the Polkadot and Kusama networks."),(0,r.kt)("p",{parentName:"admonition"},"For more information about the Fellowship see the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/polkadot-fellows/manifesto/blob/0c3df46d76625980b8b48742cb86f4d8fa6dda8d/manifesto.pdf"},"Fellowship Manifesto"),".")),(0,r.kt)("p",null,"The Technical Fellowship is a mostly self-governing expert body with a primary goal of representing\nhumans who embody and contain the technical knowledge base of the Kusama and/or Polkadot networks\nand protocols. This is accomplished by associating a rank with members to categorize the degree to\nwhich the system expects their opinion to be well-informed, of a sound technical basis, and in line\nwith the interests of Polkadot and/or Kusama."),(0,r.kt)("p",null,"Unlike the Technical Committee in Governance V1, the Fellowship is designed to be far broader in\nmembership (i.e. to work well with even tens of thousands of members) and with far lower barriers to\nentry (both in terms of administrative process flow and expectations of expertise)."),(0,r.kt)("p",null,"The mechanism by which the Fellowship votes is the same as what is used for Polkadot and Kusama\nstakeholder voting for a proposed referendum. Members of the Fellowship can vote on any given\nFellowship proposal and the aggregated opinion of the members (weighted by their rank) constitutes\nthe Fellowship's considered opinion."),(0,r.kt)("p",null,"The Polkadot Technical Fellowship resides on the\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-collectives-rpc.polkadot.io#/fellowship/referenda"},"Collectives"),"\nparachain and maintains the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/polkadot-fellows"},"Polkadot Fellows")," repository. The\nfellowship also has its own governance model with multiple tracks with approval and support\nparameters, where the votes are weighted by the rank of the member.",(0,r.kt)("br",{parentName:"p"}),"\n","The fellowship governance is primarily used for its membership management,\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/polkadot-fellows/RFCs"},"approving RFCs")," and whitelisting Polkadot OpenGov\nproposals."),(0,r.kt)("p",null,"",""),(0,r.kt)("h3",{id:"ranking-system"},"Ranking System"),(0,r.kt)("p",null,"To prevent a small group of participants from gaining effective control over the network, this\nsystem will adhere to three main principles:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The Fellowship must never have hard power over the network: it cannot change the parameters,\nconduct rescues or move assets. Their only power in governance is reducing the effective timeline\non which a referendum takes place through ",(0,r.kt)("a",{parentName:"li",href:"#whitelisting"},"whitelisting"),"."),(0,r.kt)("li",{parentName:"ul"},"The Fellowship weights those with a higher rank more in the aggregate opinion. However, the weight\nshould not be so high as to make a small number of higher members\u2019 opinions be insurmountable\ncompared to a coherent opinion from lower-ranked membership."),(0,r.kt)("li",{parentName:"ul"},"The Fellowship should be designed to grow and develop its membership, aggregate levels of\nexpertise and ensure that its overall decision-making capacity strengthens over time.")),(0,r.kt)("p",null,"To support these conditions, the Fellowship will have a constitution that outlines the requirements\nand expectations for individuals to attain and retain any given rank. Higher ranks can vote and\npromote lower ranks based on this constitution."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Demotion")," occurs automatically after a given period has elapsed, and the member is unable to\ndefend their position to their peers."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Suspension")," can happen only through a referendum, which ensures that the Fellowship's bias alone\ndoes not necessarily result in expulsion."),(0,r.kt)("p",null,"To prevent the Fellowship from becoming a cabal (popularity with Fellowship peers alone should not\nbe enough to gain access to a top rank), gaining access to the top tiers of the ranks will require a\nreferendum."),(0,r.kt)("h3",{id:"whitelisting"},"Whitelisting"),(0,r.kt)("p",null,'Polkadot OpenGov allows the Fellowship to authorize a new origin (known as "Whitelisted-Caller") to\nexecute with Root-level privileges for calls that have been approved by the Fellowship (currently\nonly level-three fellows and above can vote for whitelist calls).'),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_whitelist/"},"Whitelist")," pallet allows one\nOrigin to escalate the privilege level of another Origin for a certain operation. The pallet\nverifies two things:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The origin of the escalation is the Whitelisted-Root (i.e. that the referendum passed on this\ntrack), and"),(0,r.kt)("li",{parentName:"ul"},"The whitelist contains the given proposal (in the configuration of Polkadot OpenGov, it gets there\nvia a separate Fellowship referendum).")),(0,r.kt)("p",null,"If both conditions are true, the operation executes with Root-level privileges."),(0,r.kt)("p",null,"This system enables a new parallel Track (Whitelisted-Caller), whose parameters have less\nrestrictive passing parameters than Root in the short term. Through an open and transparent process,\na body of global experts on the Polkadot\nprotocol have determined that the action is both safe and time-critical."),(0,r.kt)("admonition",{title:"Submitting Whitelisted Proposals",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"For more information about how to submit a whitelisted proposal see the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#submitting-a-referendum-on-the-whitelisted-caller-track"},"dedicated advanced how-to guides"),".")),(0,r.kt)("h3",{id:"becoming-a-polkadot-technical-fellowship-member"},"Becoming a Polkadot Technical Fellowship Member"),(0,r.kt)("p",null,'Currently, the only way to become a fellowship member is through a referenda. To get added as a\nmember of "Rank 1", an existing member of the fellowship needs to submit a referendum with the preimage of a\nbatch call that has ',(0,r.kt)("inlineCode",{parentName:"p"},"fellowshipCollective.addMember")," and\n",(0,r.kt)("inlineCode",{parentName:"p"},"fellowshipCollective.promoteMember"),' on "2/Proficients" track. On Polkadot-JS UI for Polkadot\nCollectives, navigate to Governance > Fellowship > Referenda and click on "Add Preimage". This\npreimage can be submitted by anyone.'),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"fellowship-add-promote-member-preimage",src:n(68937).Z,width:"2156",height:"1746"})),(0,r.kt)("p",null,'After the preimage is successfully noted, navigate to Governance > Fellowship > Referenda and click\non "Submit Proposal" (This button is active on the UI only if you have an account that belongs to\nthe Fellowship). Choose the appropriate track and the origin, and enter the preimage hash of the\nbatch call that adds and promotes the member.'),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"fellowship-add-promote-member-proposal",src:n(16046).Z,width:"2150",height:"1492"})),(0,r.kt)("p",null,'After the referendum is successfully executed, the member is added to the fellowship with "rank 1".\nFor example, check the ',(0,r.kt)("a",{parentName:"p",href:"https://collectives.subsquare.io/fellowship/referenda/23"},"Referenda 23")," on\nthe Collectives parachain. If a member has to be added and promoted to \u201crank 5\u201d, the proposal has to\nbe submitted through track \u201c6/Senior Experts\u201d (Always a track with a rank higher). For example,\ncheck the ",(0,r.kt)("a",{parentName:"p",href:"https://collectives.subsquare.io/fellowship/referenda/25"},"Referenda 25")," on the\nCollectives parachain."),(0,r.kt)("p",null,"Future plans include that public members can apply to become a Fellowship candidate by placing a\nsmall deposit (which will be returned once they become members). Their candidacy will go through a\nreferendum to be approved to become a member."),(0,r.kt)("h2",{id:"resources"},"Resources"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/paritytech/substrate/tree/master/frame/democracy/src"},"Democracy Pallet")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://medium.com/polkadot-network/gov2-polkadots-next-generation-of-decentralised-governance-4d9ef657d11b"},"Governance v2")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://matrix.to/#/#Polkadot-Direction:parity.io"},"Polkadot Direction")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://matrix.to/#/#Kusama-Direction:parity.io"},"Kusama Direction")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot.polkassembly.io/"},"PolkAssembly"))))}y.isMDXComponent=!0},68937:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/fellowship-add-member-preimage-90d52688c691ac21a26fd067a3ba6524.png"},16046:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/fellowship-add-member-proposal-5d832ecf298a03c8de37b001d43be34c.png"},55745:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/opengov-curves-nopass-27f6968907aeb88e87069d29ca062568.png"},65993:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/opengov-curves-pass-73b6c7d1849e26082880cd7d629a633e.png"},40176:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/opengov-overview-a56ef29a3a173f9dc2b60a9008dcfc1b.png"},1671:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/opengov-timeline-26e5a1fae159676ab5052a4fd7416be5.png"},67506:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/opengov-track-capacity-a1e00e5bd7961ea13d38f79cf6fa4b9c.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/2f3b630e.5a240a6d.js b/assets/js/2f3b630e.5a240a6d.js deleted file mode 100644 index c6202679ce5e..000000000000 --- a/assets/js/2f3b630e.5a240a6d.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[9226],{47940:(e,t,n)=>{"use strict";n.d(t,{Z:()=>h});var a=n(74165),o=n(15861),i=n(67294),r=n(87152),l=n(17145),s=n(67425);function p(e,t,n){return d.apply(this,arguments)}function d(){return(d=(0,o.Z)((0,a.Z)().mark((function e(t,n,o){var i,s,p,d,c;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,s=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return p=new r.U(i),e.next=21,l.G.create({provider:p});case 21:d=e.sent,(c=n.split(".")).forEach((function(e){e in d&&(d=d[e])})),e.t1=c[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return s=d.toString(),e.abrupt("break",35);case 29:return e.next=31,d();case 31:return s=(s=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+n);case 35:return e.abrupt("return",s);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function c(e,t,n,a){switch(t){case"humanReadable":(0,s.HumanReadable)(e,n,a);break;case"precise":(0,s.Precise)(e,n,a);break;case"blocksToDays":(0,s.BlocksToDays)(e,a);break;case"percentage":(0,s.Percentage)(e,a);break;case"arrayLength":(0,s.ArrayLength)(e,a);break;default:return void console.log("Ignoring unknown filter type")}}const h=function(e){var t=e.network,n=e.path,r=e.defaultValue,l=e.filter,s=void 0===l?void 0:l,d=(0,i.useState)(""),h=d[0],m=d[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==s?c(r.toString(),s,t,m):m(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,a.Z)().mark((function e(){var o;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p(t,n,m);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==s?c(o,s,t,m):m(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(l){console.log(l)}}}),[]),h}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,n,a){var o=void 0;if("polkadot"===n||"statemint"===n)o=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),a((e=Number.isInteger(e/t[n].precision)?e/t[n].precision+" "+t[n].symbol:(e/t[n].precision).toFixed(o)+" "+t[n].symbol).toString())},Precise:function(e,n,a){a(e=(e=parseFloat(e))/t[n].precision+" "+t[n].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},42569:(e,t,n)=>{"use strict";n.r(t),n.d(t,{assets:()=>f,contentTitle:()=>k,default:()=>y,frontMatter:()=>u,metadata:()=>g,toc:()=>v});var a=n(87462),o=n(63366),i=n(67294),r=n(3905),l=(n(47940),i.createElement("table",null,i.createElement("tbody",null,i.createElement("tr",null,i.createElement("th",null,"Lock Periods"),i.createElement("th",null,"Vote Multiplier"),i.createElement("th",null,"Length in Days")),i.createElement("tr",null,i.createElement("td",null,"0"),i.createElement("td",null,"0.1"),i.createElement("td",{id:"p0"})),i.createElement("tr",null,i.createElement("td",null,"1"),i.createElement("td",null,"1"),i.createElement("td",{id:"p1"})),i.createElement("tr",null,i.createElement("td",null,"2"),i.createElement("td",null,"2"),i.createElement("td",{id:"p2"})),i.createElement("tr",null,i.createElement("td",null,"4"),i.createElement("td",null,"3"),i.createElement("td",{id:"p4"})),i.createElement("tr",null,i.createElement("td",null,"8"),i.createElement("td",null,"4"),i.createElement("td",{id:"p8"})),i.createElement("tr",null,i.createElement("td",null,"16"),i.createElement("td",null,"5"),i.createElement("td",{id:"p16"})),i.createElement("tr",null,i.createElement("td",null,"32"),i.createElement("td",null,"6"),i.createElement("td",{id:"p32"}))))),s=["p0","p1","p2","p4","p8","p16","p32"],p={p0:0,p1:28,p2:56,p4:112,p8:224,p16:448,p32:896},d={p0:0,p1:7,p2:14,p4:28,p8:56,p16:112,p32:224};function c(e){s.forEach((function(t){var n=document.getElementById(t);"polkadot"===e?n.innerText=p[t]:"kusama"===e&&(n.innerText=d[t])}))}const h=function(){var e=(0,i.useState)("");return e[0],e[1],(0,i.useEffect)((function(){var e=document.title;"Governance V1 \xb7 Polkadot Wiki"===e||"Polkadot OpenGov \xb7 Polkadot Wiki"===e?c("polkadot"):"Governance V1 \xb7 Guide"===e||"Polkadot OpenGov \xb7 Guide"===e?c("kusama"):console.log("Unknown wiki/guide type")}),[]),l};var m=["components"],u={id:"learn-polkadot-opengov",title:"Polkadot OpenGov",sidebar_label:"Polkadot OpenGov",description:"Polkadot\u2019s Latest Model for Decentralized Governance.",keywords:["governance","referenda","proposal","voting","endorse"],slug:"../learn-polkadot-opengov"},k=void 0,g={unversionedId:"learn/learn-polkadot-opengov",id:"learn/learn-polkadot-opengov",title:"Polkadot OpenGov",description:"Polkadot\u2019s Latest Model for Decentralized Governance.",source:"@site/../docs/learn/learn-polkadot-opengov.md",sourceDirName:"learn",slug:"/learn-polkadot-opengov",permalink:"/docs/learn-polkadot-opengov",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-polkadot-opengov.md",tags:[],version:"current",lastUpdatedBy:"Radha",lastUpdatedAt:1697469489,formattedLastUpdatedAt:"Oct 16, 2023",frontMatter:{id:"learn-polkadot-opengov",title:"Polkadot OpenGov",sidebar_label:"Polkadot OpenGov",description:"Polkadot\u2019s Latest Model for Decentralized Governance.",keywords:["governance","referenda","proposal","voting","endorse"],slug:"../learn-polkadot-opengov"},sidebar:"docs",previous:{title:"Runtime Upgrades",permalink:"/docs/learn-runtime-upgrades"},next:{title:"Treasury",permalink:"/docs/learn-polkadot-opengov-treasury"}},f={},v=[{value:"Premise",id:"premise",level:2},{value:"Summary",id:"summary",level:2},{value:"Gov1 vs. Polkadot OpenGov",id:"gov1-vs-polkadot-opengov",level:2},{value:"Proposals",id:"proposals",level:2},{value:"Cancelling and Blacklisting",id:"cancelling-and-blacklisting",level:3},{value:"Referenda",id:"referenda",level:2},{value:"Referenda Timeline",id:"referenda-timeline",level:3},{value:"Origins and Tracks",id:"origins-and-tracks",level:3},{value:"Approval and Support",id:"approval-and-support",level:3},{value:"Enactment",id:"enactment",level:3},{value:"Voting on a Referendum",id:"voting-on-a-referendum",level:2},{value:"Voluntary Locking",id:"voluntary-locking",level:3},{value:"Multirole Delegation",id:"multirole-delegation",level:3},{value:"The Polkadot Technical Fellowship",id:"the-polkadot-technical-fellowship",level:2},{value:"Ranking System",id:"ranking-system",level:3},{value:"Whitelisting",id:"whitelisting",level:3},{value:"Becoming a Polkadot Technical Fellowship Member",id:"becoming-a-polkadot-technical-fellowship-member",level:3},{value:"Resources",id:"resources",level:2}],w={toc:v},b="wrapper";function y(e){var t=e.components,i=(0,o.Z)(e,m);return(0,r.kt)(b,(0,a.Z)({},w,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("admonition",{title:"The content in this document is subject to change",type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"The governance protocol has already undergone iterations (see\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance"},"Governance V1"),"). Governance is a constantly evolving protocol at this stage\nin its lifecycle."),(0,r.kt)("p",{parentName:"admonition"},"For technical information about Polkadot OpenGov and how to interact with it, please refer to this\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov"},"dedicated Wiki page"),"."),(0,r.kt)("p",{parentName:"admonition"},"For additional support about Polkadot OpenGov see the\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/65000105211"},"dedicated support pages"),".")),(0,r.kt)("admonition",{title:"Polkadot Delegation Dashboard",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"You can easily delegate your votes to somebody else using the\n",(0,r.kt)("a",{parentName:"p",href:"https://delegation.polkadot.network/"},"Polkadot Delegation Dashboard"),". See\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=RapBYZc5ZPo"},"this video tutorial")," to learn how to use the\ndashboard. ",(0,r.kt)("strong",{parentName:"p"},"If you become a nomination pool member or a pool admin, you cannot participate in\nGovernance with the bonded tokens in the pool, as they are held in a\n",(0,r.kt)("a",{parentName:"strong",href:"/docs/learn-account-advanced#system-accounts"},"system account"),"."))),(0,r.kt)("p",null,"Polkadot uses a sophisticated governance\nmechanism that allows it to evolve gracefully overtime at the ultimate behest of its assembled\nstakeholders. The stated goal is to ensure that the majority of the stake can always command the\nnetwork."),(0,r.kt)("p",null,"Polkadot brings together various novel\nmechanisms, including an amorphous (abstract) form of state-transition function stored on-chain\ndefined in a platform-agnostic language (i.e. ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-wasm"},"WebAssembly"),"), and several on-chain\nvoting mechanisms such as referenda and batch approval voting. All changes to the protocol must be\nagreed upon by stake-weighted referenda."),(0,r.kt)("h2",{id:"premise"},"Premise"),(0,r.kt)("p",null,"Polkadot's first governance system\n(",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance"},"Governance V1"),") included three main components."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("a",{parentName:"li",href:"/docs/learn-governance#technical-committee"},"Technical Committee"),": A technocratic committee to\nmanage upgrade timelines."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("a",{parentName:"li",href:"/docs/learn-governance#council"},"Council"),': An approval-voted, elected executive "government" to\nmanage parameters, admin, and spending proposals.'),(0,r.kt)("li",{parentName:"ul"},"The Public: All token holders.")),(0,r.kt)("p",null,"Over the first few years of operation, Governance V1 ensured the appropriate usage of treasury funds\nand enabled timely upgrades and fixes. Like most early technologies, protocols must evolve as they\nmature to improve their shortcomings and keep up with modern advancements. In Governance V1, all\nreferenda carried the same weight as only one referendum could be voted on at a time (except for\nemergency proposals), and the voting period could last multiple weeks. Also, an\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#alternating-voting-timetable"},"alternating voting timetable")," allowed to vote\neither for a public referendum or a council motion every\n28 days. This resulted in the system favoring\ncareful consideration of very few proposals instead of broad consideration of many."),(0,r.kt)("p",null,"Polkadot OpenGov changes how the practical means of day-to-day decisions are made, making the\nrepercussions of referenda better scoped and agile to increase the number of collective decisions\nthe system can make at any given time."),(0,r.kt)("p",null,"The following content is focused on what the new Polkadot OpenGov version brings to the governance\non Polkadot, and on the main differences with\nprevious governance versions. We recommend learning about ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance"},"Governance v1")," to\nbetter understand the need for and the direction of Polkadot OpenGov."),(0,r.kt)("h2",{id:"summary"},"Summary"),(0,r.kt)("p",null,"In Governance v1, active token holders (public) and the Council together administrated network's\nupgrade decisions. Whether the public or the council initiated the proposal, it would eventually\nhave to go through a referendum to let all holders (weighted by stake and conviction) make the\ndecision."),(0,r.kt)("p",null,"The Council fulfilled its role as the representative of the public, guardian of the treasury and\ninitiator of legislation, but it was often seen as a centralized entity. To further decentralize\nPolkadot, Polkadot OpenGov proposes the\nfollowing main changes:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Migrating all responsibilities of the Council to the public via a direct democracy voting system."),(0,r.kt)("li",{parentName:"ul"},"Dissolving the current ",(0,r.kt)("a",{parentName:"li",href:"/docs/learn-governance#council"},"Council")," collective"),(0,r.kt)("li",{parentName:"ul"},"Allowing users to delegate voting power in more ways to community members"),(0,r.kt)("li",{parentName:"ul"},"Dissolving the ",(0,r.kt)("a",{parentName:"li",href:"/docs/learn-governance#technical-committee"},"Technical Committee")," and establishing\nthe broader ",(0,r.kt)("a",{parentName:"li",href:"#the-technical-fellowship"},"Polkadot Technical Fellowship"))),(0,r.kt)("p",null,"The figure below shows an overview of Polkadot OpenGov's structure."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#summary"},"this page")," for a comparison with the structure of Governance V1.")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"opengov-overview",src:n(40176).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"In Polkadot OpenGov, all the proposals are initiated by the public. The proposal will enter a\nLead-in period (for more information, see ",(0,r.kt)("a",{parentName:"p",href:"#referenda-timeline"},"Referenda Timeline"),"), after which it\nwill follow a specific ",(0,r.kt)("a",{parentName:"p",href:"#origins-and-tracks"},"Track")," which has a dedicated Origin. There are\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#origins-and-tracks-info"},"15 Origins"),", each with a\ndifferent track. The origins and tracks parameters are preset values that set the duration of a\nreferendum as well as how many referenda can be voted on simultaneously. For example, a treasury\nproposal can now be submitted in different tracks depending on the amount requested. A proposal for\na small tip will need to be submitted in the Small Tipper track, while a proposal requiring\nsubstantial funds will need to be submitted to the Medium or Big Spender track."),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"#the-technical-fellowship"},"Polkadot Technical Fellowship")," can decide to\n",(0,r.kt)("a",{parentName:"p",href:"#whitelisting"},"whitelist")," 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\nRoot Origin track."),(0,r.kt)("p",null,"Each track has its own preset ",(0,r.kt)("a",{parentName:"p",href:"#approval-and-support"},"Approval and Support")," curves which are based\non the origin's privileges. When both the approval and support criteria are satisfied for a specific\nperiod (called the confirmation period), the referenda passes and will be executed after the\nenactment period."),(0,r.kt)("p",null,"All referenda within each track and across tracks can be voted on simultaneously (assuming track\nmaximum capacity is not reached)."),(0,r.kt)("p",null,"Polkadot OpenGov also comes with multi-role delegations 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."),(0,r.kt)("admonition",{title:"Delegation Dashboard",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"To easily delegate your votes you can use the\n",(0,r.kt)("a",{parentName:"p",href:"https://delegation.polkadot.network/"},"Polkadot Delegation Dashboard"),". See\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=RapBYZc5ZPo"},"this video tutorial")," to know more about the dashboard\nand learn how to use it.")),(0,r.kt)("h2",{id:"gov1-vs-polkadot-opengov"},"Gov1 vs. Polkadot OpenGov"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Governance V1"),(0,r.kt)("th",{parentName:"tr",align:null},"Polkadot OpenGov"),(0,r.kt)("th",{parentName:"tr",align:null},"Polkadot OpenGov Benefit"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Includes the ",(0,r.kt)("a",{parentName:"td",href:"/docs/learn-governance#council"},"Council"),", the ",(0,r.kt)("a",{parentName:"td",href:"/docs/learn-governance#technical-committee"},"Technical Committee"),", and the Public (i.e. token holders)."),(0,r.kt)("td",{parentName:"tr",align:null},"Includes the Public and the ",(0,r.kt)("a",{parentName:"td",href:"#the-technical-fellowship"},"Technical Fellowship"),"."),(0,r.kt)("td",{parentName:"tr",align:null},"Simpler and more decentralized structure.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"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)."),(0,r.kt)("td",{parentName:"tr",align:null},"Referenda executed from ",(0,r.kt)("a",{parentName:"td",href:"/docs/maintain-guides-polkadot-opengov#origins-and-tracks-info"},"multiple origins"),", each with a different track that shapes proposals\u2019 timelines. Depending on the origin, multiple referenda within the same track are possible."),(0,r.kt)("td",{parentName:"tr",align:null},"Possibility to categorize proposals (based on importance and urgency) and execute them simultaneously within and between origin tracks.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Proposals can be submitted by either the Council or the Public."),(0,r.kt)("td",{parentName:"tr",align:null},"The public submits proposals."),(0,r.kt)("td",{parentName:"tr",align:null},"More democratic.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Uses ",(0,r.kt)("a",{parentName:"td",href:"/docs/learn-governance#adaptive-quorum-biasing"},"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."),(0,r.kt)("td",{parentName:"tr",align:null},"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."),(0,r.kt)("td",{parentName:"tr",align:null},"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.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Uses ",(0,r.kt)("a",{parentName:"td",href:"/docs/learn-governance#alternating-voting-timetable"},"alternating voting timetable")," allowing voters to cast votes for either council or public referenda every 28 eras."),(0,r.kt)("td",{parentName:"tr",align:null},"Multiple referenda can be voted at the same time."),(0,r.kt)("td",{parentName:"tr",align:null},"More flexible and agile governance system.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Except for emergency proposals, all referenda have fixed voting and enactment periods of 28 eras."),(0,r.kt)("td",{parentName:"tr",align:null},"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."),(0,r.kt)("td",{parentName:"tr",align:null},"Referenda\u2019s timeline is tailored to their importance and urgency. Flexible enactment period based on origin.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"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."),(0,r.kt)("td",{parentName:"tr",align:null},"No emergency proposals. The Technical Fellowship can whitelist proposals that will have their origin with shorter lead-in, confirmation, and enactment periods."),(0,r.kt)("td",{parentName:"tr",align:null},"The Technical Fellowship is a more decentralized entity when compared to the Technical Committee. Whitelisting a proposal requires a majority of approval from the fellowship.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Only the ",(0,r.kt)("a",{parentName:"td",href:"/docs/learn-governance#endorsing-proposals"},"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."),(0,r.kt)("td",{parentName:"tr",align:null},"All proposals will eventually be voted on (given track capacity and deposit are met and the Lead-in period has ended)."),(0,r.kt)("td",{parentName:"tr",align:null},"It allows all proposals to get a chance to be voted on in a timely predictive manner.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Only ",(0,r.kt)("em",{parentName:"td"},"aye")," or ",(0,r.kt)("em",{parentName:"td"},"nay")," votes possible."),(0,r.kt)("td",{parentName:"tr",align:null},"Voters can have the additional voting options of abstaining or splitting votes."),(0,r.kt)("td",{parentName:"tr",align:null},"More ways to engage in voting and increase turnout.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Voters can decide to delegate votes to another account."),(0,r.kt)("td",{parentName:"tr",align:null},"Voters can use ",(0,r.kt)("a",{parentName:"td",href:"#multirole-delegation"},"multirole delegations")," and delegate votes to different accounts depending on origins."),(0,r.kt)("td",{parentName:"tr",align:null},"More agile delegations tailored by expertise.")))),(0,r.kt)("h2",{id:"proposals"},"Proposals"),(0,r.kt)("admonition",{title:"Starting a proposal in Governance v1",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#proposals"},"this page")," for more information about starting referenda in\nGovernance v1.")),(0,r.kt)("p",null,"In Polkadot OpenGov, anyone can start a referendum at any time and do so as often as they wish.\nPrevious features were expanded and improved, most notably\n",(0,r.kt)("a",{parentName:"p",href:"#origins-and-tracks"},(0,r.kt)("strong",{parentName:"a"},"Origins and Tracks"))," help aid in the flow and processing of the submitted\nreferenda."),(0,r.kt)("h3",{id:"cancelling-and-blacklisting"},"Cancelling and Blacklisting"),(0,r.kt)("admonition",{title:"Cancelling Referenda in Governance v1",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#cancelling-proposals"},"this page")," for more information about cancelling\nreferenda in Governance v1.")),(0,r.kt)("p",null,"In Polkadot OpenGov, there is a special operation called ",(0,r.kt)("strong",{parentName:"p"},"Cancellation")," for intervening with a\nproposal already being voted on. The operation will immediately reject an ongoing referendum\nregardless of its status. There is also a provision to ensure the deposit of the proposer is slashed\nif the proposal is malicious or spam."),(0,r.kt)("p",null,"Cancellation is a governance operation the network must vote on to be executed. Cancellation comes\nwith\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#referendum-canceller"},"its own Origin and Track"),"\nwhich has a low lead-time and Approval/Support curves with slightly sharper reductions in their\nthresholds for passing, given that it is invoked with a sense of urgency."),(0,r.kt)("p",null,"For more information about how to cancel a referendum see the\n",(0,r.kt)("a",{parentName:"p",href:"./learn-guides-polkadot-opengov#cancel-or-kill-a-referendum"},"advanced how-to guides"),"."),(0,r.kt)("admonition",{title:"Blacklisting",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Blacklisting referenda in Polkadot OpenGov is\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#blacklisting-proposals"},"the same as in Governance v1"),".")),(0,r.kt)("h2",{id:"referenda"},"Referenda"),(0,r.kt)("admonition",{title:"Public and Council Referenda in Governance v1",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"With the Council's dissolution, ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#council-referenda"},"council referenda")," are no\nlonger present in Polkadot OpenGov."),(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#public-referenda"},"this page")," for more information about public referenda\nin Governance v1.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"In Polkadot OpenGov all referenda are public.")," The\n",(0,r.kt)("a",{parentName:"p",href:"#the-technical-fellowship"},"Technical Fellowship")," has the option to ",(0,r.kt)("a",{parentName:"p",href:"#whitelisting"},"whitelist"),"\nreferenda that can be then proposed in the track with\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#whitelisted-caller"},"whitelist origin"),"."),(0,r.kt)("h3",{id:"referenda-timeline"},"Referenda Timeline"),(0,r.kt)("admonition",{title:"Voting timetable in Governance v1",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#referenda-timeline"},"this page")," for more information about the voting\ntimetable in Governance v1.")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"opengov-timeline",src:n(1671).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"The figure above provides a summary view of the referenda timeline for Polkadot OpenGov."),(0,r.kt)("p",null,"In (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, be approved,\nand ultimately enacted. Instead, the proposal will stay within a ",(0,r.kt)("strong",{parentName:"p"},"Lead-in Period")," until it\nfulfills three criteria:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},'Proposals must stay within the lead-in period for a pre-defined minimum amount of time. This helps\nmitigate against the possibility of "decision sniping" where an attacker controlling a substantial\namount of voting power might seek to have a proposal passed immediately after proposing, not\nallowing the overall voting population adequate time to consider and participate.'),(0,r.kt)("li",{parentName:"ul"},"There must be enough room for the decision within the origin. Different origins have their limit\non the number of proposals that can be decided simultaneously. Tracks that have more potent\nabilities will have lower limits. For example, the Root level Origin has a limit of one, implying\nthat only a single proposal may be decided on at once."),(0,r.kt)("li",{parentName:"ul"},"A decision deposit must be submitted. Creating a referendum is cheap as the deposit value consists\nof only the value required for the on-chain storage needed to track it. But, having a referendum\nreviewed and decided upon carries the risk of using up the limited spots available in the\nreferenda queue. Having a more significant but refundable deposit requirement makes sense to help\nmitigate spam. Failing to submit the decision deposit will lead to a referendum ",(0,r.kt)("em",{parentName:"li"},"timeout"),".")),(0,r.kt)("p",null,"Until they are in the lead-in period, proposals remain undecided. Once the criteria above are met,\nthe referendum moves to the ",(0,r.kt)("em",{parentName:"p"},"deciding")," state. The votes of the referendum are now counted towards\nthe outcome."),(0,r.kt)("p",null,"In (2), the proposal enters the ",(0,r.kt)("strong",{parentName:"p"},"Decision Period")," where votes can be cast. For a proposal to be\napproved, votes must satisfy the approval and support criteria for at least the ",(0,r.kt)("strong",{parentName:"p"},"Confirmation\nPeriod"),"; otherwise, the proposal is automatically rejected. A rejected proposal can be resubmitted\nanytime and as many times as needed."),(0,r.kt)("p",null,"In (3), approved proposals will enter the ",(0,r.kt)("strong",{parentName:"p"},"Enactment Period"),", after which proposed changes will be\nexecuted."),(0,r.kt)("p",null,"Note 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 origins. Also, the number of\nreferenda within each track differs, with the Root origin track only accepting one. proposal at a\ntime (see below)."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"opengov-track-capacity",src:n(67506).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"This 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 in 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."),(0,r.kt)("h3",{id:"origins-and-tracks"},"Origins and Tracks"),(0,r.kt)("p",null,"An ",(0,r.kt)("strong",{parentName:"p"},"Origin")," is a specific level of privilege that will determine the ",(0,r.kt)("strong",{parentName:"p"},"Track")," of all referenda\nexecuted with that origin. The track is basically a pipeline in which the proposal lives and\nproceeds and is independent from other origins' tracks. The proposer of the referenda now selects an\nappropriate Origin for their request based on the proposal\u2019s requirements."),(0,r.kt)("p",null,"Although the track structure is the same for all origins, track parameters are not. Such parameters\ninclude:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Maximum Deciding or Capacity"),": the limit for the number of referenda that can be decided at\nonce (i.e. the number of tracks within each origin)."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Decision deposit"),": the amount of funds that must be placed on deposit to enter the Decision\nPeriod (note that more requirements must be met to enter the Decision Period)."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Preparation Period"),": the minimum amount of voting time needed before entering the Decision\nPeriod (given capacity and deposit are met)."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Decision Period"),": the maximum time to approve a proposal. The proposal will be accepted if\napproved by the end of the period."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Confirmation Period"),": the minimum amount of time (within the Decision Period) the approval and\nsupport criteria must hold before the proposal is approved and moved to the enactment period."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Minimum Enactment Period"),": the minimum amount of waiting time before the proposed changes are\napplied"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Approval Curve"),": the curve describing the minimum % of ",(0,r.kt)("em",{parentName:"li"},"aye")," votes as a function of time within\nthe Decision Period. The approval % is the portion of ",(0,r.kt)("em",{parentName:"li"},"aye")," votes (adjusted for conviction) over\nthe total votes (",(0,r.kt)("em",{parentName:"li"},"aye"),", ",(0,r.kt)("em",{parentName:"li"},"nay"),", and ",(0,r.kt)("em",{parentName:"li"},"abstained"),")."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Support Curve"),": the curve describing the minimum % of all votes in support of a proposal as a\nfunction of time within the Decision Period. The support % is defined as the portion of all votes\n(",(0,r.kt)("em",{parentName:"li"},"aye")," and ",(0,r.kt)("em",{parentName:"li"},"abstained"),") without conviction over the total possible amount of votes in the system\n(i.e. the total active issuance).")),(0,r.kt)("p",null,"For example, a runtime upgrade (requiring a ",(0,r.kt)("inlineCode",{parentName:"p"},"set_code")," call, if approved) does not have the same\nimplications for the ecosystem as the approval of a treasury tip (",(0,r.kt)("inlineCode",{parentName:"p"},"reportAwesome")," call), and\ntherefore different Origins for these two actions are needed in which different deposits, support,\napproval, and a minimum ",(0,r.kt)("a",{parentName:"p",href:"#enactment"},"enactment")," periods will be predetermined on the pallet."),(0,r.kt)("p",null,"For detailed information about origin and tracks, and parameter values in Kusama, see\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#origins-and-tracks-info"},"this page"),"."),(0,r.kt)("h3",{id:"approval-and-support"},"Approval and Support"),(0,r.kt)("admonition",{title:"Adaptive Quorum Biasing is deprecated",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"In Polkadot OpenGov, ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#adaptive-quorum-biasing"},"Adaptive quorum biasing")," used\nin Governance V1 has been replaced with the ",(0,r.kt)("strong",{parentName:"p"},"Approval and Support system"),".")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"opengov-curves-pass",src:n(65993).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"The figure above provides a summary view of how the approval and support system works during the\nDecision Period."),(0,r.kt)("p",null,"Once 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 ",(0,r.kt)("strong",{parentName:"p"},"Confirmation Period"),"."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Approval")," is defined as the share of approval (",(0,r.kt)("em",{parentName:"li"},"aye")," votes) vote-weight (after adjustment for\n",(0,r.kt)("a",{parentName:"li",href:"#voluntary-locking"},"conviction"),") against the total vote-weight (",(0,r.kt)("em",{parentName:"li"},"aye"),", ",(0,r.kt)("em",{parentName:"li"},"nay"),", and ",(0,r.kt)("em",{parentName:"li"},"abstained"),")."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Support")," is the total number of ",(0,r.kt)("em",{parentName:"li"},"aye")," and ",(0,r.kt)("em",{parentName:"li"},"abstain")," votes (ignoring any adjustment for\nconviction) compared to the total possible votes that could be made in the system. In case of\n",(0,r.kt)("em",{parentName:"li"},"split")," votes, only ",(0,r.kt)("em",{parentName:"li"},"aye")," and ",(0,r.kt)("em",{parentName:"li"},"abstain")," will count.")),(0,r.kt)("admonition",{title:"Nay votes are not counted towards Support",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Support is a measure of voters who turned out either in favor of the referenda and who consciously\nabstained from it. Support does not include ",(0,r.kt)("em",{parentName:"p"},"nay")," votes. This avoids edge situations where ",(0,r.kt)("em",{parentName:"p"},"nay"),"\nvotes could push a referendum into confirming state. For example, imagine current approval is high\n(near 100%, way above the approval curve), and current support is just below the support curve. A\n",(0,r.kt)("em",{parentName:"p"},"nay")," could bump support above the support curve but not reduce approval below the approval curve.\nTherefore someone voting against a proposal would make it pass. Hence, a decrease in % of current\napproval through new votes does not directly translate into increasing support because Support needs\nto consider ",(0,r.kt)("em",{parentName:"p"},"nay")," votes.")),(0,r.kt)("p",null,"The figure above shows the followings:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Even if the approval threshold is reached (i.e. % of current approval is greater than the approval\ncurve), the proposal only enters the confirmation period once the support threshold is also\nreached (i.e. % current support is greater than the underlying support curve)."),(0,r.kt)("li",{parentName:"ul"},"If the referendum meets the criteria for the confirmation period, then the proposal is approved\nand scheduled for enactment. The Enactment Period can be specified when the referendum is proposed\nbut is also subject to a minimum value based on the Track. More powerful Tracks enforce a larger\nEnactment Period to ensure the network has ample time to prepare for any changes the proposal may\nbring."),(0,r.kt)("li",{parentName:"ul"},"A referendum may exit the confirmation period when the thresholds are no longer met, due to new\n",(0,r.kt)("em",{parentName:"li"},"Nay")," votes or a change of existing ",(0,r.kt)("em",{parentName:"li"},"Aye")," or ",(0,r.kt)("em",{parentName:"li"},"Abstain")," votes to ",(0,r.kt)("em",{parentName:"li"},"Nay")," . Each time it exits, the\nconfirmation period resets. For example, if the confirmation period is 20 minutes and a referendum\nenters it just for 5 min, the next time it enters, it must stay for 20 minutes (not 15 minutes)."),(0,r.kt)("li",{parentName:"ul"},"During the decision period, if a referendum fails to meet the approval and support thresholds for\nthe duration of the track-specific confirmation period, it fails and does not go to the enactment\nperiod (it may have to be resubmitted, see below)."),(0,r.kt)("li",{parentName:"ul"},"The current approval must be above 50% for a referendum to pass, and the approval curve never goes\nbelow 50%.")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"opengov-curves-pass",src:n(55745).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"Note that support may not increase monotonically as shown in the figure, as people might switch\nvotes."),(0,r.kt)("p",null,"Different Origins' tracks have different Confirmation Periods and requirements for approval and\nsupport. For additional details on the various origins and tracks, check out\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#origins-and-tracks-info"},"this table"),". Configuring\nthe amount of support and overall approval required for it to pass is now possible. With proposals\nthat use less privileged origins, it is far more reasonable to drop the required support to a more\nrealistic amount earlier than those which use highly privileged classes such as ",(0,r.kt)("inlineCode",{parentName:"p"},"Root"),". Classes with\nmore significance can be made to require higher approval early on, to avoid controversy."),(0,r.kt)("h3",{id:"enactment"},"Enactment"),(0,r.kt)("admonition",{title:"Enactment in Governance v1",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#enactment"},"this page")," for more information about enactment in Governance\nv1.")),(0,r.kt)("p",null,"In Polkadot OpenGov, the proposer suggests the enactment period, but there are also minimums set for\neach Origin Track. For example, root Origin approvals require a more extended period because of the\nimportance of the changes they bring to the network."),(0,r.kt)("h2",{id:"voting-on-a-referendum"},"Voting on a Referendum"),(0,r.kt)("p",null,"In Governance V1, voters could cast only an ",(0,r.kt)("em",{parentName:"p"},"aye")," or ",(0,r.kt)("em",{parentName:"p"},"nay")," vote. In Polkadot OpenGov, voters can\nadditionally cast a ",(0,r.kt)("em",{parentName:"p"},"abstain")," and ",(0,r.kt)("em",{parentName:"p"},"split")," votes.\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#voting-on-referenda"},"Vote splitting")," allows voters\nto allocate different votes for ",(0,r.kt)("em",{parentName:"p"},"aye"),", ",(0,r.kt)("em",{parentName:"p"},"nay"),", and ",(0,r.kt)("em",{parentName:"p"},"abstain"),"."),(0,r.kt)("admonition",{title:"Only the last vote counts",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Voting a second time replaces your original vote, e.g. voting with 10\nDOT, then a second extrinsic to vote with 5\nDOT, means that you are voting with 5\nDOT, not 10\nDOT.")),(0,r.kt)("h3",{id:"voluntary-locking"},"Voluntary Locking"),(0,r.kt)("p",null,"Polkadot utilizes an idea called voluntary\nlocking that allows token holders to increase their voting power by declaring how long they are\nwilling to lock up their tokens; hence, the number of votes for each token holder will be calculated\nby the following formula:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"votes = tokens * conviction_multiplier\n")),(0,r.kt)("p",null,"The conviction multiplier increases the vote multiplier by one every time the number of lock periods\ndouble."),(0,r.kt)(h,{mdxType:"VLTable"}),(0,r.kt)("p",null,"",(0,r.kt)("strong",{parentName:"p"},"The table above shows the correct duration values. However, the current values for Polkadot are the same as those for Kusama. This is going to be fixed. For more information, see ",(0,r.kt)("a",{parentName:"strong",href:"https://github.com/paritytech/polkadot/issues/7394"},"this GitHub issue"),"."),""),(0,r.kt)("p",null,'The maximum number of "doublings" of the lock period is set to 6 (and thus 32 lock periods in\ntotal), and one lock period equals 28\n',"\ndays. For additional information regarding the timeline of governance events, check out the\ngovernance section on the\n",(0,r.kt)("a",{parentName:"p",href:"maintain-polkadot-parameters/#governance"},"Polkadot Parameters page"),"","."),(0,r.kt)("admonition",{title:"do votes stack?",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"You can use the same number of tokens to vote on different referenda. Votes with conviction do not\nstack. If you voted with 5 DOT on Referenda A, B\nand C with 2x conviction you would have 10 votes on all those referenda and 5\nDOT locked up only for the 2x conviction period\n(i.e. 8 weeks), with the unlocking\ncountdown starting when the last referendum you voted on ends (assuming you are on the winning\nside). If you voted with conviction on referendum and then a week later voted on another one with\nthe same conviction, the lock on your DOT will be\nextended by a week (always assuming you are on the winning side).")),(0,r.kt)("admonition",{title:"Staked tokens can be used in governance",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"While a token is locked, you can still use it for voting and ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-staking"},"staking"),". You are\nonly prohibited from transferring these tokens to another account.")),(0,r.kt)("p",null,'Votes are always "counted" at the same time (at the end of the voting period), no matter for how\nlong the tokens are locked.'),(0,r.kt)("p",null,"See below an example that shows how voluntary locking works."),(0,r.kt)("p",null,"Peter: Votes ",(0,r.kt)("inlineCode",{parentName:"p"},"No")," with\n10 DOT for a 128-week lock period\n=> 10 x 6 = 60 Votes"),(0,r.kt)("p",null,"Logan: Votes ",(0,r.kt)("inlineCode",{parentName:"p"},"Yes")," with\n20 DOT for a 4-week lock period =>\n20 x 1 = 20 Votes"),(0,r.kt)("p",null,"Kevin: Votes ",(0,r.kt)("inlineCode",{parentName:"p"},"Yes")," with\n15 DOT for a 8-week lock period\n=> 15 x 2 = 30 Votes"),(0,r.kt)("p",null,"Even though combined both Logan and Kevin vote with more\nDOT than Peter, the lock period for both of them\nis less than Peter, leading to their voting power counting as less."),(0,r.kt)("admonition",{title:"Conviction Voting Locks created during Gov 1",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Conviction voting locks in Governance v1 will not be carried over to OpenGov. Voting with conviction\nin OpenGov will create a new lock (as this will use the ",(0,r.kt)("inlineCode",{parentName:"p"},"convictionVoting")," pallet), while any\nexisting lock under Governance v1 (using the deprecated ",(0,r.kt)("inlineCode",{parentName:"p"},"democracy")," pallet) will be left to expire.\nDelegations under Governance v1 will need to be re-issued under OpenGov.")),(0,r.kt)("h3",{id:"multirole-delegation"},"Multirole Delegation"),(0,r.kt)("p",null,"Polkadot OpenGov builds on the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#delegations"},"vote delegation feature from Governance v1")," where a voter can\ndelegate their voting power to another voter. It does so by introducing a feature known as\n",(0,r.kt)("strong",{parentName:"p"},"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."),(0,r.kt)("p",null,"For 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."),(0,r.kt)("admonition",{title:"Delegate your votes",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"In Polkadot OpenGov you can delegate your votes to different entities, who will vote on your behalf.\nYou can delegate your votes using the\n",(0,r.kt)("a",{parentName:"p",href:"https://delegation.polkadot.network/"},(0,r.kt)("strong",{parentName:"a"},"Polkadot Delegation Dashboard")),". See\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=tlh_KmWQiSQ"},"this video tutorial")," to learn about the features of\nthe dashboard."),(0,r.kt)("p",{parentName:"admonition"},"If you are staking directly and not through a nomination pool, you can use bonded tokens for voting.\nNote that if you are voting with conviction, your tokens will have a democracy lock in addition to\nthe staking lock. For more information about locks, see\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-accounts/#unlocking-locks"},"this page"),"."),(0,r.kt)("p",{parentName:"admonition"},"Democracy locks created through ",(0,r.kt)("a",{parentName:"p",href:"#voluntary-locking"},"conviction voting")," start the unlocking period\nafter a referendum ends, provided you voted with the winning side. In the case of delegations, the\nunlocking period countdown begins after the account undelegates. There can be different scenarios:"),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"if the account delegated votes to one delegate, then after undelegating, there will be one\nunlocking period with length dependent on the conviction multiplier."),(0,r.kt)("li",{parentName:"ul"},"if the account delegated votes to different delegates using different convictions, then after\nundelegating those delegates, there will be different unlocking periods with lengths dependent on\nthe conviction multipliers."))),(0,r.kt)("p",null,"Occasional delegation and undelegation calls are fee-free: creating an incentive for token holders\nto use this feature and ensure that wallets can do it \u201cby default\u201d without any cost to end-users. It\nis worth noting that a user delegating their voting power does not imply that the delegate will have\ncontrol over the funds of the delegating account: they can vote with a user's voting power: but they\nwon't be able to transfer your balance, nominate a different set of validators or execute any call\nother than voting on the defined call/s by the user."),(0,r.kt)("p",null,"With the new delegation features, the goal is to ensure the required support for proposals to be\nenacted is reached while maintaining the anonymity of voters and keeping the overall design\ncensorship-free."),(0,r.kt)("p",null,"For a step-by-step outline of how to delegate voting power in Polkadot OpenGov, check out the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#delegating-voting-power"},"Delegating Voting Power"),"\nsection on the ",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov"},"Polkadot OpenGov Maintenance")," page."),(0,r.kt)("h2",{id:"the-polkadot-technical-fellowship"},"The Polkadot Technical Fellowship"),(0,r.kt)("admonition",{title:"From Technical Committee to the Technical Fellowship",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The Polkadot Technical Fellowship is a collection of Substrate experts. This fellowship was\nestablished in 2022. In Polkadot OpenGov, this fellowship replaces the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#technical-committee"},"Technical Committee")," in Governance v1, and will serve\nboth the Polkadot and Kusama networks."),(0,r.kt)("p",{parentName:"admonition"},"For more information about the Fellowship see the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/polkadot-fellows/manifesto/blob/0c3df46d76625980b8b48742cb86f4d8fa6dda8d/manifesto.pdf"},"Fellowship Manifesto"),".")),(0,r.kt)("p",null,"The Technical Fellowship is a mostly self-governing expert body with a primary goal of representing\nhumans who embody and contain the technical knowledge base of the Kusama and/or Polkadot networks\nand protocols. This is accomplished by associating a rank with members to categorize the degree to\nwhich the system expects their opinion to be well-informed, of a sound technical basis, and in line\nwith the interests of Polkadot and/or Kusama."),(0,r.kt)("p",null,"Unlike the Technical Committee in Governance V1, the Fellowship is designed to be far broader in\nmembership (i.e. to work well with even tens of thousands of members) and with far lower barriers to\nentry (both in terms of administrative process flow and expectations of expertise)."),(0,r.kt)("p",null,"The mechanism by which the Fellowship votes is the same as what is used for Polkadot and Kusama\nstakeholder voting for a proposed referendum. Members of the Fellowship can vote on any given\nFellowship proposal and the aggregated opinion of the members (weighted by their rank) constitutes\nthe Fellowship's considered opinion."),(0,r.kt)("p",null,"The Polkadot Technical Fellowship resides on the\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fpolkadot-collectives-rpc.polkadot.io#/fellowship/referenda"},"Collectives"),"\nparachain and maintains the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/polkadot-fellows"},"Polkadot Fellows")," repository. The\nfellowship also has its own governance model with multiple tracks with approval and support\nparameters, where the votes are weighted by the rank of the member.",(0,r.kt)("br",{parentName:"p"}),"\n","The fellowship governance is primarily used for its membership management,\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/polkadot-fellows/RFCs"},"approving RFCs")," and whitelisting Polkadot OpenGov\nproposals."),(0,r.kt)("p",null,"",""),(0,r.kt)("h3",{id:"ranking-system"},"Ranking System"),(0,r.kt)("p",null,"To prevent a small group of participants from gaining effective control over the network, this\nsystem will adhere to three main principles:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The Fellowship must never have hard power over the network: it cannot change the parameters,\nconduct rescues or move assets. Their only power in governance is reducing the effective timeline\non which a referendum takes place through ",(0,r.kt)("a",{parentName:"li",href:"#whitelisting"},"whitelisting"),"."),(0,r.kt)("li",{parentName:"ul"},"The Fellowship weights those with a higher rank more in the aggregate opinion. However, the weight\nshould not be so high as to make a small number of higher members\u2019 opinions be insurmountable\ncompared to a coherent opinion from lower-ranked membership."),(0,r.kt)("li",{parentName:"ul"},"The Fellowship should be designed to grow and develop its membership, aggregate levels of\nexpertise and ensure that its overall decision-making capacity strengthens over time.")),(0,r.kt)("p",null,"To support these conditions, the Fellowship will have a constitution that outlines the requirements\nand expectations for individuals to attain and retain any given rank. Higher ranks can vote and\npromote lower ranks based on this constitution."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Demotion")," occurs automatically after a given period has elapsed, and the member is unable to\ndefend their position to their peers."),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Suspension")," can happen only through a referendum, which ensures that the Fellowship's bias alone\ndoes not necessarily result in expulsion."),(0,r.kt)("p",null,"To prevent the Fellowship from becoming a cabal (popularity with Fellowship peers alone should not\nbe enough to gain access to a top rank), gaining access to the top tiers of the ranks will require a\nreferendum."),(0,r.kt)("h3",{id:"whitelisting"},"Whitelisting"),(0,r.kt)("p",null,'Polkadot OpenGov allows the Fellowship to authorize a new origin (known as "Whitelisted-Caller") to\nexecute with Root-level privileges for calls that have been approved by the Fellowship (currently\nonly level-three fellows and above can vote for whitelist calls).'),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_whitelist/"},"Whitelist")," pallet allows one\nOrigin to escalate the privilege level of another Origin for a certain operation. The pallet\nverifies two things:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The origin of the escalation is the Whitelisted-Root (i.e. that the referendum passed on this\ntrack), and"),(0,r.kt)("li",{parentName:"ul"},"The whitelist contains the given proposal (in the configuration of Polkadot OpenGov, it gets there\nvia a separate Fellowship referendum).")),(0,r.kt)("p",null,"If both conditions are true, the operation executes with Root-level privileges."),(0,r.kt)("p",null,"This system enables a new parallel Track (Whitelisted-Caller), whose parameters have less\nrestrictive passing parameters than Root in the short term. Through an open and transparent process,\na body of global experts on the Polkadot\nprotocol have determined that the action is both safe and time-critical."),(0,r.kt)("admonition",{title:"Submitting Whitelisted Proposals",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"For more information about how to submit a whitelisted proposal see the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#submitting-a-referendum-on-the-whitelisted-caller-track"},"dedicated advanced how-to guides"),".")),(0,r.kt)("h3",{id:"becoming-a-polkadot-technical-fellowship-member"},"Becoming a Polkadot Technical Fellowship Member"),(0,r.kt)("p",null,'Currently, the only way to become a fellowship member is through a referenda. To get added as a\nmember of "Rank 1", an existing member of the fellowship needs to submit a referendum with the preimage of a\nbatch call that has ',(0,r.kt)("inlineCode",{parentName:"p"},"fellowshipCollective.addMember")," and\n",(0,r.kt)("inlineCode",{parentName:"p"},"fellowshipCollective.promoteMember"),' on "2/Proficients" track. On Polkadot-JS UI for Polkadot\nCollectives, navigate to Governance > Fellowship > Referenda and click on "Add Preimage". This\npreimage can be submitted by anyone.'),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"fellowship-add-promote-member-preimage",src:n(68937).Z,width:"2156",height:"1746"})),(0,r.kt)("p",null,'After the preimage is successfully noted, navigate to Governance > Fellowship > Referenda and click\non "Submit Proposal" (This button is active on the UI only if you have an account that belongs to\nthe Fellowship). Choose the appropriate track and the origin, and enter the preimage hash of the\nbatch call that adds and promotes the member.'),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"fellowship-add-promote-member-proposal",src:n(16046).Z,width:"2150",height:"1492"})),(0,r.kt)("p",null,'After the referendum is successfully executed, the member is added to the fellowship with "rank 1".\nFor example, check the ',(0,r.kt)("a",{parentName:"p",href:"https://collectives.subsquare.io/fellowship/referenda/23"},"Referenda 23")," on\nthe Collectives parachain. If a member has to be added and promoted to \u201crank 5\u201d, the proposal has to\nbe submitted through track \u201c6/Senior Experts\u201d (Always a track with a rank higher). For example,\ncheck the ",(0,r.kt)("a",{parentName:"p",href:"https://collectives.subsquare.io/fellowship/referenda/25"},"Referenda 25")," on the\nCollectives parachain."),(0,r.kt)("p",null,"Future plans include that public members can apply to become a Fellowship candidate by placing a\nsmall deposit (which will be returned once they become members). Their candidacy will go through a\nreferendum to be approved to become a member."),(0,r.kt)("h2",{id:"resources"},"Resources"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/paritytech/substrate/tree/master/frame/democracy/src"},"Democracy Pallet")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://medium.com/polkadot-network/gov2-polkadots-next-generation-of-decentralised-governance-4d9ef657d11b"},"Governance v2")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://matrix.to/#/#Polkadot-Direction:parity.io"},"Polkadot Direction")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://matrix.to/#/#Kusama-Direction:parity.io"},"Kusama Direction")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot.polkassembly.io/"},"PolkAssembly"))))}y.isMDXComponent=!0},68937:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/fellowship-add-member-preimage-90d52688c691ac21a26fd067a3ba6524.png"},16046:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/fellowship-add-member-proposal-5d832ecf298a03c8de37b001d43be34c.png"},55745:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/opengov-curves-nopass-27f6968907aeb88e87069d29ca062568.png"},65993:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/opengov-curves-pass-73b6c7d1849e26082880cd7d629a633e.png"},40176:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/opengov-overview-a56ef29a3a173f9dc2b60a9008dcfc1b.png"},1671:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/opengov-timeline-26e5a1fae159676ab5052a4fd7416be5.png"},67506:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/opengov-track-capacity-a1e00e5bd7961ea13d38f79cf6fa4b9c.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/32e8da05.18198d19.js b/assets/js/32e8da05.18198d19.js deleted file mode 100644 index 93a08b511f9f..000000000000 --- a/assets/js/32e8da05.18198d19.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[6140],{47940:(a,t,e)=>{"use strict";e.d(t,{Z:()=>u});var n=e(74165),o=e(15861),i=e(67294),r=e(87152),s=e(17145),l=e(67425);function c(a,t,e){return d.apply(this,arguments)}function d(){return(d=(0,o.Z)((0,n.Z)().mark((function a(t,e,o){var i,l,c,d,p;return(0,n.Z)().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:i=void 0,l=void 0,a.t0=t,a.next="polkadot"===a.t0?5:"kusama"===a.t0?7:"statemine"===a.t0?9:"statemint"===a.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",a.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",a.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",a.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",a.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){a.next=18;break}return a.abrupt("return");case 18:return c=new r.U(i),a.next=21,s.G.create({provider:c});case 21:d=a.sent,(p=e.split(".")).forEach((function(a){a in d&&(d=d[a])})),a.t1=p[0],a.next="consts"===a.t1?27:"query"===a.t1?29:34;break;case 27:return l=d.toString(),a.abrupt("break",35);case 29:return a.next=31,d();case 31:return l=(l=a.sent).toString(),a.abrupt("break",35);case 34:console.log("Unknown path prefix ("+p[0]+") in "+e);case 35:return a.abrupt("return",l);case 36:case"end":return a.stop()}}),a)})))).apply(this,arguments)}function p(a,t,e,n){switch(t){case"humanReadable":(0,l.HumanReadable)(a,e,n);break;case"precise":(0,l.Precise)(a,e,n);break;case"blocksToDays":(0,l.BlocksToDays)(a,n);break;case"percentage":(0,l.Percentage)(a,n);break;case"arrayLength":(0,l.ArrayLength)(a,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(a){var t=a.network,e=a.path,r=a.defaultValue,s=a.filter,l=void 0===s?void 0:s,d=(0,i.useState)(""),u=d[0],h=d[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?p(r.toString(),l,t,h):h(r.toString());var a=void 0;switch(t){case"polkadot":a="wss://rpc.polkadot.io";break;case"kusama":a="wss://kusama-rpc.polkadot.io/";break;case"statemine":a="wss://statemine-rpc.polkadot.io/";break;case"statemint":a="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===a)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var a=(0,o.Z)((0,n.Z)().mark((function a(){var o;return(0,n.Z)().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.next=2,c(t,e,h);case 2:if(void 0!==(o=a.sent)){a.next=7;break}return a.abrupt("return");case 7:void 0!==l?p(o,l,t,h):h(o);case 8:case"end":return a.stop()}}),a)})));return function(){return a.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),u}},67425:a=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};a.exports={HumanReadable:function(a,e,n){var o=void 0;if("polkadot"===e||"statemint"===e)o=3;else{if("kusama"!==e&&"statemine"!==e)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}a=parseFloat(a),n((a=Number.isInteger(a/t[e].precision)?a/t[e].precision+" "+t[e].symbol:(a/t[e].precision).toFixed(o)+" "+t[e].symbol).toString())},Precise:function(a,e,n){n(a=(a=parseFloat(a))/t[e].precision+" "+t[e].symbol)},BlocksToDays:function(a,t){t((a=6*a/86400).toString())},Percentage:function(a,t){t((a/=1e7).toString())},ArrayLength:function(a,t){t((a=a.split(",").length).toString())}}},65779:(a,t,e)=>{"use strict";e.r(t),e.d(t,{assets:()=>p,contentTitle:()=>c,default:()=>w,frontMatter:()=>l,metadata:()=>d,toc:()=>u});var n=e(87462),o=e(63366),i=(e(67294),e(3905)),r=e(47940),s=["components"],l={id:"learn-crowdloans",title:"Parachain Crowdloans",sidebar_label:"Parachain Crowdloans",description:"Polkadot's Crowdloans and How to Participate.",keywords:["crowdloans","parachains","lending","auction"],slug:"../learn-crowdloans"},c=void 0,d={unversionedId:"learn/learn-crowdloans",id:"learn/learn-crowdloans",title:"Parachain Crowdloans",description:"Polkadot's Crowdloans and How to Participate.",source:"@site/../docs/learn/learn-crowdloans.md",sourceDirName:"learn",slug:"/learn-crowdloans",permalink:"/docs/learn-crowdloans",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-crowdloans.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1695728743,formattedLastUpdatedAt:"Sep 26, 2023",frontMatter:{id:"learn-crowdloans",title:"Parachain Crowdloans",sidebar_label:"Parachain Crowdloans",description:"Polkadot's Crowdloans and How to Participate.",keywords:["crowdloans","parachains","lending","auction"],slug:"../learn-crowdloans"},sidebar:"docs",previous:{title:"Parachain Slot Auctions",permalink:"/docs/learn-auction"},next:{title:"Parachains FAQ",permalink:"/docs/learn-parachains-faq"}},p={},u=[{value:"Crowdloan Campaigns vs Parachain Auctions",id:"crowdloan-campaigns-vs-parachain-auctions",level:2},{value:"Starting a Crowdloan Campaign",id:"starting-a-crowdloan-campaign",level:2},{value:"Supporting a Crowdloan Campaign",id:"supporting-a-crowdloan-campaign",level:2},{value:"Contributing to Crowdloans",id:"contributing-to-crowdloans",level:3},{value:"Withdraw Crowdloaned Tokens",id:"withdraw-crowdloaned-tokens",level:3}],h={toc:u},m="wrapper";function w(a){var t=a.components,l=(0,o.Z)(a,s);return(0,i.kt)(m,(0,n.Z)({},h,l,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Polkadot allows parachains to source tokens\nfor their parachain bids in a decentralized crowdloan."),(0,i.kt)("admonition",{title:"Contributing to a crowdloan",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If you are here for guidance on how to contribute to a crowdloan, watch the video below or read this\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000177341-how-to-participate-in-crowdloans-on-polkadot-or-kusama"},"support article on crowdloans"),".")),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://youtu.be/AA9mPANmzmU"},(0,i.kt)("img",{parentName:"a",src:"https://img.youtube.com/vi/AA9mPANmzmU/0.jpg",alt:"Crowdloans on Polkadot JS"}))),(0,i.kt)("admonition",{title:"Testing on Rococo",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"For information on how to participate in the crowdloan and parachain auction testing on Rococo,\nplease see the ",(0,i.kt)("a",{parentName:"p",href:"/docs/build-pdk##testing-a-parachains:-rococo-testnet"},"Rococo content"))),(0,i.kt)("h2",{id:"crowdloan-campaigns-vs-parachain-auctions"},"Crowdloan Campaigns vs Parachain Auctions"),(0,i.kt)("p",null,"It is important to recognize that starting a crowdloan campaign is ",(0,i.kt)("strong",{parentName:"p"},"optional")," for participating in\na parachain slot auction. The parachain slot auction can also be won directly through self-funding\nwithout community involvement. To reiterate, crowdloan campaigns are just one of the means to win\nauctions, which allow the community to participate in a trustless and permissionless way."),(0,i.kt)("p",null,"Let's look at a scenario where Project A is hoping to gain a parachain slot on\nPolkadot, but they don't have enough tokens to\nbid directly to win the parachain auction. Project A could benefit from starting a new crowdloan\ncampaign to help secure a parachain slot. Crowdloans are trustless and are supported natively on\nPolkadot, allowing the community to bond their\ntokens on Project A's behalf for the entire parachain lease duration. This will allow Project A to\ncompete with projects that may have access to greater capital, given the project has sufficient\ncommunity support. In return, the community contributors are rewarded by the projects that win the\nparachain slot, which would compensate for the opportunity cost of bonding their tokens for the\nlease duration."),(0,i.kt)("p",null,"On the other hand, let's say Project B, which is more established and has access to capital, is\nhoping to secure a parachain slot through self-funding. Project B is not relying on community\nfunding (at least via the crowdloan mechanism), so they must determine how much funding they can\nallocate towards winning a slot."),(0,i.kt)("p",null,"Project B fully controls how much they are willing to contribute to gaining a parachain slot.\nProject B need not work on creating a reward model for community contributors like Project A. In\ncontrast, crowdloan campaigns benefit projects with access to limited capital but have strong\ncommunity support. They are also beneficial for projects that can successfully bid to win the\nauction with self-funding but are looking for a mechanism to bootstrap their community and get\nnoticed by the key actors in the ecosystem."),(0,i.kt)("p",null,"It is publicly visible on-chain whether or not a project is bidding directly or through a crowdloan\ncampaign. More details regarding creating and executing a crowdloan campaign are provided below."),(0,i.kt)("h2",{id:"starting-a-crowdloan-campaign"},"Starting a Crowdloan Campaign"),(0,i.kt)("p",null,"Anyone who has registered a parachain can create a new crowdloan campaign for a slot by depositing a\nspecified number of tokens. A campaign is configured as a range of slots (i.e. the duration of the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains"},"parachain")," will bid for), a cap, and a duration. The duration can last over\nseveral auctions as long as the range of slots matches those of the auction (i.e. the first lease\nperiod of the crowdloan is the same or bigger than that of the auction). This means a team will not\nneed to restart the campaign just because they do not secure a slot on their first attempt."),(0,i.kt)("admonition",{title:"Crowdloan Submission Deposit Required",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"To create a new crowdloan campaign, your account must have\n500 DOT transferrable which will be reserved\nfor the duration of the crowdloan.")),(0,i.kt)("p",null,"When setting the parameters of a crowdloan campaign, consider the following:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"A crowdloan campaign can start well before the auction slot is opened.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"The campaign creation form requires setting a crowdloan cap ","\u2014"," the maximum amount a campaign\ncan collect. A team can still win an ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-auction"},"auction")," if the cap is not reached.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},'Set the desired end of the crowdloan in the "Ending block" field. This helps ensure that the\ncrowdloan is live during the entire auction. For example, if an auction starts in three days and\nlasts five days, you should set your crowdloan to end in 10 days or a similar timescale.')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"One way of calculating the ending block number is adding: ",(0,i.kt)("inlineCode",{parentName:"p"},"(10 * 60 * 24 * 7) * (x * 6) + y")),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"x")," is the number of auction periods you want the crowdloan to continue for")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"y")," is the current block number")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"(Blocks/Min * Min/Hour * Hour/Day * Day/Week) * (x[Period] * Week/Period) + y[BlockNumber]"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},'"First period" field refers to the first period you want to bid for. If the current auction\nencompasses periods ',(0,i.kt)("inlineCode",{parentName:"p"},"(3, 4, 5, 6)"),", your first period can be at least ",(0,i.kt)("inlineCode",{parentName:"p"},"3"),". The last slot must\nalso be within that range.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"You can only cancel an ongoing crowdloan if no contributions have been made. Your deposit will\nbe returned to you."))))),(0,i.kt)("p",null,"Before the start of the crowdloan campaign, the owner will upload the parachain data. Once the\ncrowdloan is live, ",(0,i.kt)("strong",{parentName:"p"},"the parachain configuration will be locked")," and will be deployed as the\nparachain's runtime. Of course, once the parachain is running, it can always change via runtime\nupgrades (as determined through its local governance)."),(0,i.kt)("h2",{id:"supporting-a-crowdloan-campaign"},"Supporting a Crowdloan Campaign"),(0,i.kt)("h3",{id:"contributing-to-crowdloans"},"Contributing to Crowdloans"),(0,i.kt)("admonition",{title:"Minimum Crowdloan Contribution",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The minimum balance for contributions for a crowdloan campaign is currently set to\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.crowdloan.minContribution",defaultValue:5e10,filter:"humanReadable",mdxType:"RPC"}),".\n","\nThis is to make crowdloans as accessible as possible while maintaining a balance to justify using\nthe network's resources.")),(0,i.kt)("p",null,"Each created campaign will have an index. Once a crowdloan campaign is open, anyone can participate\nby sending a transaction referencing the campaign's index. Tokens used to participate must be\ntransferable ","\u2014"," that is, not locked for any reason, including staking, vesting, and governance\n","\u2014"," because they will be moved into a module-controlled account that was generated uniquely for\nthis campaign. See ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced#system-accounts"},"system accounts")," for more\ninformation."),(0,i.kt)("admonition",{title:"Do not send Crowdloan contributions directly to the Parachain address",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"All crowdloan contributions are handled by the Crowdloan module\u2019s logic, where a campaign is\nidentified by an index, not by address. ",(0,i.kt)("strong",{parentName:"p"},"Never transfer tokens to an address in support of a\ncampaign"),".")),(0,i.kt)("p",null,"It is up to individual parachain teams to decide if and how they want to reward participants who\nforgo staking and choose to lock their tokens in support of the parachain\u2019s campaign. As one can\nimagine, rewards will take many forms and may vary widely among projects."),(0,i.kt)("p",null,"If a crowdloan campaign is successful, that parachain will be on-boarded to the Relay Chain. The\ncollective tokens will be locked in that parachain's account for the entire duration that it is\nactive."),(0,i.kt)("h3",{id:"withdraw-crowdloaned-tokens"},"Withdraw Crowdloaned Tokens"),(0,i.kt)("p",null,"Participants will be able to reclaim their tokens in one of two ways:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"If the campaign succeeds, the parachain will enter a retirement phase at the end of its lease.\nDuring this phase, participants can withdraw the tokens with which they participated."),(0,i.kt)("li",{parentName:"ul"},"If the campaign is unsuccessful, this retirement phase will begin at its configured end, and\nparticipants can likewise withdraw their tokens.")),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("mdxAdmonitionTitle",{parentName:"admonition"},(0,i.kt)("inlineCode",{parentName:"mdxAdmonitionTitle"},"crowdloan.contribute")," extrinsic is trustless"),(0,i.kt)("p",{parentName:"admonition"},"Contributing to a crowdloan through Polkadot JS Apps (which uses ",(0,i.kt)("inlineCode",{parentName:"p"},"crowdloan.contribute")," extrinsic)\nguarantees that you receive your tokens after the campaign ends. If you intend to contribute through\nother websites and custodial service providers like central exchanges, review their terms and\nconditions thoroughly and assess the associated risks.")),(0,i.kt)("p",null,"Note: When the lease periods won by the crowdloan have finished, or the crowdloan has ended without\nwinning a slot, anyone can trigger the refund of crowdloan contributions back to their original\nowners. This can be done through the permissionless ",(0,i.kt)("inlineCode",{parentName:"p"},"crowdloan.refund")," extrinsic available on\nPolkadot JS Apps > Developer > Extrinsics page, by specifying the parachain ID. This extrinsic may\nneed to be issued multiple times if the list of contributors is too long. All contributions must be\nreturned before the crowdloan is entirely deleted."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Crowdloan refund",src:e(72239).Z,width:"1440",height:"552"})),(0,i.kt)("p",null,"Many projects will have dashboards that allow users to participate in their crowdloans. PolkadotJS\napps also offer a breakdown of ongoing crowdloans on the\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama-rpc.polkadot.io#/parachains/crowdloan"},"Apps page"),"."),(0,i.kt)("p",null,"Here is an example of the crowdloans in play during the very first Kusama auction."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"crowdloan dashboard",src:e(30931).Z,width:"2328",height:"1540"})),(0,i.kt)("p",null,"Furthermore, check out this video on\n",(0,i.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=YrTxDufrcQM"},"How to Participate in Crowdloans")," for steps on how to\naccess available crowdloans on PolkadotJS apps."))}w.isMDXComponent=!0},72239:(a,t,e)=>{"use strict";e.d(t,{Z:()=>n});const n=e.p+"assets/images/crowdloan-refund-a452b6b303e27c25b3e87c42577a9265.png"},30931:(a,t,e)=>{"use strict";e.d(t,{Z:()=>n});const n=e.p+"assets/images/kusama-crowdloans-0237f5d573dee5e221b51678b2ed25f1.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/32e8da05.c8902230.js b/assets/js/32e8da05.c8902230.js new file mode 100644 index 000000000000..61aa8f8a413a --- /dev/null +++ b/assets/js/32e8da05.c8902230.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[6140],{47940:(a,e,t)=>{"use strict";t.d(e,{Z:()=>u});var n=t(74165),o=t(15861),i=t(67294),r=t(87152),s=t(17145),l=t(67425);function c(a,e,t){return d.apply(this,arguments)}function d(){return(d=(0,o.Z)((0,n.Z)().mark((function a(e,t,o){var i,l,c,d,p;return(0,n.Z)().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:i=void 0,l=void 0,a.t0=e,a.next="polkadot"===a.t0?5:"kusama"===a.t0?7:"statemine"===a.t0?9:"statemint"===a.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",a.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",a.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",a.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",a.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){a.next=18;break}return a.abrupt("return");case 18:return c=new r.U(i),a.next=21,s.G.create({provider:c});case 21:d=a.sent,(p=t.split(".")).forEach((function(a){a in d&&(d=d[a])})),a.t1=p[0],a.next="consts"===a.t1?27:"query"===a.t1?29:34;break;case 27:return l=d.toString(),a.abrupt("break",35);case 29:return a.next=31,d();case 31:return l=(l=a.sent).toString(),a.abrupt("break",35);case 34:console.log("Unknown path prefix ("+p[0]+") in "+t);case 35:return a.abrupt("return",l);case 36:case"end":return a.stop()}}),a)})))).apply(this,arguments)}function p(a,e,t,n){switch(e){case"humanReadable":(0,l.HumanReadable)(a,t,n);break;case"precise":(0,l.Precise)(a,t,n);break;case"blocksToDays":(0,l.BlocksToDays)(a,n);break;case"percentage":(0,l.Percentage)(a,n);break;case"permillToPercent":(0,l.PermillToPercent)(a,n);break;case"arrayLength":(0,l.ArrayLength)(a,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(a){var e=a.network,t=a.path,r=a.defaultValue,s=a.filter,l=void 0===s?void 0:s,d=(0,i.useState)(""),u=d[0],h=d[1];return e=e.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?p(r.toString(),l,e,h):h(r.toString());var a=void 0;switch(e){case"polkadot":a="wss://rpc.polkadot.io";break;case"kusama":a="wss://kusama-rpc.polkadot.io/";break;case"statemine":a="wss://statemine-rpc.polkadot.io/";break;case"statemint":a="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===a)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var a=(0,o.Z)((0,n.Z)().mark((function a(){var o;return(0,n.Z)().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.next=2,c(e,t,h);case 2:if(void 0!==(o=a.sent)){a.next=7;break}return a.abrupt("return");case 7:void 0!==l?p(o,l,e,h):h(o);case 8:case"end":return a.stop()}}),a)})));return function(){return a.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),u}},67425:a=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};a.exports={HumanReadable:function(a,t,n){var o=void 0;if("polkadot"===t||"statemint"===t)o=3;else{if("kusama"!==t&&"statemine"!==t)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}a=parseFloat(a),n((a=Number.isInteger(a/e[t].precision)?a/e[t].precision+" "+e[t].symbol:(a/e[t].precision).toFixed(o)+" "+e[t].symbol).toString())},Precise:function(a,t,n){n(a=(a=parseFloat(a))/e[t].precision+" "+e[t].symbol)},BlocksToDays:function(a,e){e((a=6*a/86400).toString())},Percentage:function(a,e){e((a/=1e7).toString())},PermillToPercent:function(a,e){e((a/=1e4).toString())},ArrayLength:function(a,e){e((a=a.split(",").length).toString())}}},65779:(a,e,t)=>{"use strict";t.r(e),t.d(e,{assets:()=>p,contentTitle:()=>c,default:()=>w,frontMatter:()=>l,metadata:()=>d,toc:()=>u});var n=t(87462),o=t(63366),i=(t(67294),t(3905)),r=t(47940),s=["components"],l={id:"learn-crowdloans",title:"Parachain Crowdloans",sidebar_label:"Parachain Crowdloans",description:"Polkadot's Crowdloans and How to Participate.",keywords:["crowdloans","parachains","lending","auction"],slug:"../learn-crowdloans"},c=void 0,d={unversionedId:"learn/learn-crowdloans",id:"learn/learn-crowdloans",title:"Parachain Crowdloans",description:"Polkadot's Crowdloans and How to Participate.",source:"@site/../docs/learn/learn-crowdloans.md",sourceDirName:"learn",slug:"/learn-crowdloans",permalink:"/docs/learn-crowdloans",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-crowdloans.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1695728743,formattedLastUpdatedAt:"Sep 26, 2023",frontMatter:{id:"learn-crowdloans",title:"Parachain Crowdloans",sidebar_label:"Parachain Crowdloans",description:"Polkadot's Crowdloans and How to Participate.",keywords:["crowdloans","parachains","lending","auction"],slug:"../learn-crowdloans"},sidebar:"docs",previous:{title:"Parachain Slot Auctions",permalink:"/docs/learn-auction"},next:{title:"Parachains FAQ",permalink:"/docs/learn-parachains-faq"}},p={},u=[{value:"Crowdloan Campaigns vs Parachain Auctions",id:"crowdloan-campaigns-vs-parachain-auctions",level:2},{value:"Starting a Crowdloan Campaign",id:"starting-a-crowdloan-campaign",level:2},{value:"Supporting a Crowdloan Campaign",id:"supporting-a-crowdloan-campaign",level:2},{value:"Contributing to Crowdloans",id:"contributing-to-crowdloans",level:3},{value:"Withdraw Crowdloaned Tokens",id:"withdraw-crowdloaned-tokens",level:3}],h={toc:u},m="wrapper";function w(a){var e=a.components,l=(0,o.Z)(a,s);return(0,i.kt)(m,(0,n.Z)({},h,l,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Polkadot allows parachains to source tokens\nfor their parachain bids in a decentralized crowdloan."),(0,i.kt)("admonition",{title:"Contributing to a crowdloan",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If you are here for guidance on how to contribute to a crowdloan, watch the video below or read this\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000177341-how-to-participate-in-crowdloans-on-polkadot-or-kusama"},"support article on crowdloans"),".")),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://youtu.be/AA9mPANmzmU"},(0,i.kt)("img",{parentName:"a",src:"https://img.youtube.com/vi/AA9mPANmzmU/0.jpg",alt:"Crowdloans on Polkadot JS"}))),(0,i.kt)("admonition",{title:"Testing on Rococo",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"For information on how to participate in the crowdloan and parachain auction testing on Rococo,\nplease see the ",(0,i.kt)("a",{parentName:"p",href:"/docs/build-pdk##testing-a-parachains:-rococo-testnet"},"Rococo content"))),(0,i.kt)("h2",{id:"crowdloan-campaigns-vs-parachain-auctions"},"Crowdloan Campaigns vs Parachain Auctions"),(0,i.kt)("p",null,"It is important to recognize that starting a crowdloan campaign is ",(0,i.kt)("strong",{parentName:"p"},"optional")," for participating in\na parachain slot auction. The parachain slot auction can also be won directly through self-funding\nwithout community involvement. To reiterate, crowdloan campaigns are just one of the means to win\nauctions, which allow the community to participate in a trustless and permissionless way."),(0,i.kt)("p",null,"Let's look at a scenario where Project A is hoping to gain a parachain slot on\nPolkadot, but they don't have enough tokens to\nbid directly to win the parachain auction. Project A could benefit from starting a new crowdloan\ncampaign to help secure a parachain slot. Crowdloans are trustless and are supported natively on\nPolkadot, allowing the community to bond their\ntokens on Project A's behalf for the entire parachain lease duration. This will allow Project A to\ncompete with projects that may have access to greater capital, given the project has sufficient\ncommunity support. In return, the community contributors are rewarded by the projects that win the\nparachain slot, which would compensate for the opportunity cost of bonding their tokens for the\nlease duration."),(0,i.kt)("p",null,"On the other hand, let's say Project B, which is more established and has access to capital, is\nhoping to secure a parachain slot through self-funding. Project B is not relying on community\nfunding (at least via the crowdloan mechanism), so they must determine how much funding they can\nallocate towards winning a slot."),(0,i.kt)("p",null,"Project B fully controls how much they are willing to contribute to gaining a parachain slot.\nProject B need not work on creating a reward model for community contributors like Project A. In\ncontrast, crowdloan campaigns benefit projects with access to limited capital but have strong\ncommunity support. They are also beneficial for projects that can successfully bid to win the\nauction with self-funding but are looking for a mechanism to bootstrap their community and get\nnoticed by the key actors in the ecosystem."),(0,i.kt)("p",null,"It is publicly visible on-chain whether or not a project is bidding directly or through a crowdloan\ncampaign. More details regarding creating and executing a crowdloan campaign are provided below."),(0,i.kt)("h2",{id:"starting-a-crowdloan-campaign"},"Starting a Crowdloan Campaign"),(0,i.kt)("p",null,"Anyone who has registered a parachain can create a new crowdloan campaign for a slot by depositing a\nspecified number of tokens. A campaign is configured as a range of slots (i.e. the duration of the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains"},"parachain")," will bid for), a cap, and a duration. The duration can last over\nseveral auctions as long as the range of slots matches those of the auction (i.e. the first lease\nperiod of the crowdloan is the same or bigger than that of the auction). This means a team will not\nneed to restart the campaign just because they do not secure a slot on their first attempt."),(0,i.kt)("admonition",{title:"Crowdloan Submission Deposit Required",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"To create a new crowdloan campaign, your account must have\n500 DOT transferrable which will be reserved\nfor the duration of the crowdloan.")),(0,i.kt)("p",null,"When setting the parameters of a crowdloan campaign, consider the following:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"A crowdloan campaign can start well before the auction slot is opened.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"The campaign creation form requires setting a crowdloan cap ","\u2014"," the maximum amount a campaign\ncan collect. A team can still win an ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-auction"},"auction")," if the cap is not reached.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},'Set the desired end of the crowdloan in the "Ending block" field. This helps ensure that the\ncrowdloan is live during the entire auction. For example, if an auction starts in three days and\nlasts five days, you should set your crowdloan to end in 10 days or a similar timescale.')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"One way of calculating the ending block number is adding: ",(0,i.kt)("inlineCode",{parentName:"p"},"(10 * 60 * 24 * 7) * (x * 6) + y")),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"x")," is the number of auction periods you want the crowdloan to continue for")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"y")," is the current block number")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"(Blocks/Min * Min/Hour * Hour/Day * Day/Week) * (x[Period] * Week/Period) + y[BlockNumber]"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},'"First period" field refers to the first period you want to bid for. If the current auction\nencompasses periods ',(0,i.kt)("inlineCode",{parentName:"p"},"(3, 4, 5, 6)"),", your first period can be at least ",(0,i.kt)("inlineCode",{parentName:"p"},"3"),". The last slot must\nalso be within that range.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"You can only cancel an ongoing crowdloan if no contributions have been made. Your deposit will\nbe returned to you."))))),(0,i.kt)("p",null,"Before the start of the crowdloan campaign, the owner will upload the parachain data. Once the\ncrowdloan is live, ",(0,i.kt)("strong",{parentName:"p"},"the parachain configuration will be locked")," and will be deployed as the\nparachain's runtime. Of course, once the parachain is running, it can always change via runtime\nupgrades (as determined through its local governance)."),(0,i.kt)("h2",{id:"supporting-a-crowdloan-campaign"},"Supporting a Crowdloan Campaign"),(0,i.kt)("h3",{id:"contributing-to-crowdloans"},"Contributing to Crowdloans"),(0,i.kt)("admonition",{title:"Minimum Crowdloan Contribution",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The minimum balance for contributions for a crowdloan campaign is currently set to\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.crowdloan.minContribution",defaultValue:5e10,filter:"humanReadable",mdxType:"RPC"}),".\n","\nThis is to make crowdloans as accessible as possible while maintaining a balance to justify using\nthe network's resources.")),(0,i.kt)("p",null,"Each created campaign will have an index. Once a crowdloan campaign is open, anyone can participate\nby sending a transaction referencing the campaign's index. Tokens used to participate must be\ntransferable ","\u2014"," that is, not locked for any reason, including staking, vesting, and governance\n","\u2014"," because they will be moved into a module-controlled account that was generated uniquely for\nthis campaign. See ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced#system-accounts"},"system accounts")," for more\ninformation."),(0,i.kt)("admonition",{title:"Do not send Crowdloan contributions directly to the Parachain address",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"All crowdloan contributions are handled by the Crowdloan module\u2019s logic, where a campaign is\nidentified by an index, not by address. ",(0,i.kt)("strong",{parentName:"p"},"Never transfer tokens to an address in support of a\ncampaign"),".")),(0,i.kt)("p",null,"It is up to individual parachain teams to decide if and how they want to reward participants who\nforgo staking and choose to lock their tokens in support of the parachain\u2019s campaign. As one can\nimagine, rewards will take many forms and may vary widely among projects."),(0,i.kt)("p",null,"If a crowdloan campaign is successful, that parachain will be on-boarded to the Relay Chain. The\ncollective tokens will be locked in that parachain's account for the entire duration that it is\nactive."),(0,i.kt)("h3",{id:"withdraw-crowdloaned-tokens"},"Withdraw Crowdloaned Tokens"),(0,i.kt)("p",null,"Participants will be able to reclaim their tokens in one of two ways:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"If the campaign succeeds, the parachain will enter a retirement phase at the end of its lease.\nDuring this phase, participants can withdraw the tokens with which they participated."),(0,i.kt)("li",{parentName:"ul"},"If the campaign is unsuccessful, this retirement phase will begin at its configured end, and\nparticipants can likewise withdraw their tokens.")),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("mdxAdmonitionTitle",{parentName:"admonition"},(0,i.kt)("inlineCode",{parentName:"mdxAdmonitionTitle"},"crowdloan.contribute")," extrinsic is trustless"),(0,i.kt)("p",{parentName:"admonition"},"Contributing to a crowdloan through Polkadot JS Apps (which uses ",(0,i.kt)("inlineCode",{parentName:"p"},"crowdloan.contribute")," extrinsic)\nguarantees that you receive your tokens after the campaign ends. If you intend to contribute through\nother websites and custodial service providers like central exchanges, review their terms and\nconditions thoroughly and assess the associated risks.")),(0,i.kt)("p",null,"Note: When the lease periods won by the crowdloan have finished, or the crowdloan has ended without\nwinning a slot, anyone can trigger the refund of crowdloan contributions back to their original\nowners. This can be done through the permissionless ",(0,i.kt)("inlineCode",{parentName:"p"},"crowdloan.refund")," extrinsic available on\nPolkadot JS Apps > Developer > Extrinsics page, by specifying the parachain ID. This extrinsic may\nneed to be issued multiple times if the list of contributors is too long. All contributions must be\nreturned before the crowdloan is entirely deleted."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Crowdloan refund",src:t(72239).Z,width:"1440",height:"552"})),(0,i.kt)("p",null,"Many projects will have dashboards that allow users to participate in their crowdloans. PolkadotJS\napps also offer a breakdown of ongoing crowdloans on the\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama-rpc.polkadot.io#/parachains/crowdloan"},"Apps page"),"."),(0,i.kt)("p",null,"Here is an example of the crowdloans in play during the very first Kusama auction."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"crowdloan dashboard",src:t(30931).Z,width:"2328",height:"1540"})),(0,i.kt)("p",null,"Furthermore, check out this video on\n",(0,i.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=YrTxDufrcQM"},"How to Participate in Crowdloans")," for steps on how to\naccess available crowdloans on PolkadotJS apps."))}w.isMDXComponent=!0},72239:(a,e,t)=>{"use strict";t.d(e,{Z:()=>n});const n=t.p+"assets/images/crowdloan-refund-a452b6b303e27c25b3e87c42577a9265.png"},30931:(a,e,t)=>{"use strict";t.d(e,{Z:()=>n});const n=t.p+"assets/images/kusama-crowdloans-0237f5d573dee5e221b51678b2ed25f1.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/386099fc.3678089c.js b/assets/js/386099fc.3678089c.js deleted file mode 100644 index 99eb361c75e9..000000000000 --- a/assets/js/386099fc.3678089c.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[8139],{47940:(e,t,r)=>{"use strict";r.d(t,{Z:()=>c});var a=r(74165),n=r(15861),o=r(67294),s=r(87152),i=r(17145),l=r(67425);function u(e,t,r){return p.apply(this,arguments)}function p(){return(p=(0,n.Z)((0,a.Z)().mark((function e(t,r,n){var o,l,u,p,d;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:o=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return o="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return o="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return o="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return o="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==o){e.next=18;break}return e.abrupt("return");case 18:return u=new s.U(o),e.next=21,i.G.create({provider:u});case 21:p=e.sent,(d=r.split(".")).forEach((function(e){e in p&&(p=p[e])})),e.t1=d[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=p.toString(),e.abrupt("break",35);case 29:return e.next=31,p();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+d[0]+") in "+r);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function d(e,t,r,a){switch(t){case"humanReadable":(0,l.HumanReadable)(e,r,a);break;case"precise":(0,l.Precise)(e,r,a);break;case"blocksToDays":(0,l.BlocksToDays)(e,a);break;case"percentage":(0,l.Percentage)(e,a);break;case"arrayLength":(0,l.ArrayLength)(e,a);break;default:return void console.log("Ignoring unknown filter type")}}const c=function(e){var t=e.network,r=e.path,s=e.defaultValue,i=e.filter,l=void 0===i?void 0:i,p=(0,o.useState)(""),c=p[0],k=p[1];return t=t.toLowerCase(),(0,o.useEffect)((function(){void 0!==l?d(s.toString(),l,t,k):k(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var o=function(){var e=(0,n.Z)((0,a.Z)().mark((function e(){var n;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,u(t,r,k);case 2:if(void 0!==(n=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?d(n,l,t,k):k(n);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{o()}catch(i){console.log(i)}}}),[]),c}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,r,a){var n=void 0;if("polkadot"===r||"statemint"===r)n=3;else{if("kusama"!==r&&"statemine"!==r)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");n=6}e=parseFloat(e),a((e=Number.isInteger(e/t[r].precision)?e/t[r].precision+" "+t[r].symbol:(e/t[r].precision).toFixed(n)+" "+t[r].symbol).toString())},Precise:function(e,r,a){a(e=(e=parseFloat(e))/t[r].precision+" "+t[r].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},60283:(e,t,r)=>{"use strict";r.r(t),r.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var a=r(87462),n=r(63366),o=(r(67294),r(3905)),s=(r(47940),["components"]),i={id:"learn-polkadot-opengov-treasury",title:"Treasury",sidebar_label:"Treasury",description:"Polkadot's On-chain Treasury.",keywords:["treasury","funds","funding","tips","tipping"],slug:"../learn-polkadot-opengov-treasury"},l=void 0,u={unversionedId:"learn/learn-polkadot-opengov-treasury",id:"learn/learn-polkadot-opengov-treasury",title:"Treasury",description:"Polkadot's On-chain Treasury.",source:"@site/../docs/learn/learn-polkadot-opengov-treasury.md",sourceDirName:"learn",slug:"/learn-polkadot-opengov-treasury",permalink:"/docs/learn-polkadot-opengov-treasury",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-polkadot-opengov-treasury.md",tags:[],version:"current",lastUpdatedBy:"Radha",lastUpdatedAt:1697115725,formattedLastUpdatedAt:"Oct 12, 2023",frontMatter:{id:"learn-polkadot-opengov-treasury",title:"Treasury",sidebar_label:"Treasury",description:"Polkadot's On-chain Treasury.",keywords:["treasury","funds","funding","tips","tipping"],slug:"../learn-polkadot-opengov-treasury"},sidebar:"docs",previous:{title:"Polkadot OpenGov",permalink:"/docs/learn-polkadot-opengov"},next:{title:"Consensus",permalink:"/docs/learn-consensus"}},p={},d=[{value:"Treasury Inflow and Outflow",id:"treasury-inflow-and-outflow",level:2},{value:"Treasury Tracks",id:"treasury-tracks",level:2},{value:"Treasurer",id:"treasurer",level:3},{value:"Big Spender",id:"big-spender",level:3},{value:"Medium Spender",id:"medium-spender",level:3},{value:"Small Spender",id:"small-spender",level:3},{value:"Big Tipper",id:"big-tipper",level:3},{value:"Small Tipper",id:"small-tipper",level:3}],c={toc:d},k="wrapper";function m(e){var t=e.components,r=(0,n.Z)(e,s);return(0,o.kt)(k,(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"The Treasury is a pot of funds collected through a portion of block production rewards, transaction\nfees, slashing, and ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-inflation"},"staking inefficiencies"),".Treasury funds are held in a\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced#system-accounts"},"system account")," that cannot be controlled by any\nexternal account; only the system internal logic can access it."),(0,o.kt)("admonition",{title:"Creating a Treasury Proposal on Polkadot OpenGov",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"If you would like to create a treasury proposal on Polkadot OpenGov, follow the instructions\noutlined on ",(0,o.kt)("a",{parentName:"p",href:"./learn-guides-treasury#creating-a-treasury-proposal"},"this how-to guide"),".")),(0,o.kt)("h2",{id:"treasury-inflow-and-outflow"},"Treasury Inflow and Outflow"),(0,o.kt)("p",null,"Tokens that are deposited into the Treasury (i.e. the inflow) is determined by the following\nmechanisms:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Transaction fees:")," 80% of the transaction fees of every submitted extrinsic is diverted to the\nTreasury, while 20% is given to the block producers."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Staking inefficiencies:")," the network knows an exogenously determined parameter called ideal\nstaking rate. The APY for stakers (nominators & validators) decreases whenever the actual staking\nrate is not equal to the ideal staking rate. To keep inflation constant at 10%, the system does\nnot creates less tokens, rather some share of the overall reward for stakers is diverted to the\nTreasury (more information\n",(0,o.kt)("a",{parentName:"li",href:"https://research.web3.foundation/Polkadot/overview/token-economics"},"here"),")."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Slashes:")," whenever validators and nominators are slashed, a share of the slashed tokens are\ndiverted to Treasury. They are typically rare and unpredictable events."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Transfers:")," everyone can send funds to the Treasury directly. This is a rare event and\ntypically due to grantees reimbursing some of the amount they got allocated for various reasons.")),(0,o.kt)("p",null,"The outflow is determined by the following mechanisms:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Burned tokens:")," at the end of each spending period lasting\n24 days on Polkadot, 1% of\nthe available funds are burned, respectively."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Treasury proposals & Bounties:")," they make up the largest share of outflow tokens to the\ncommunity and need to be approved by governance. Then, payouts occur at the end of a spending\nperiod."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Tips:")," smaller payouts directly to grantees that can happen within a spending period.")),(0,o.kt)("h2",{id:"treasury-tracks"},"Treasury Tracks"),(0,o.kt)("p",null,"OpenGov allows for managing funds through six tracks, each with its own\n",(0,o.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#origins-and-tracks-info"},"origin and track parameters"),"."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Treasurer"),(0,o.kt)("li",{parentName:"ul"},"Big Spender"),(0,o.kt)("li",{parentName:"ul"},"Medium Spender"),(0,o.kt)("li",{parentName:"ul"},"Small Spender"),(0,o.kt)("li",{parentName:"ul"},"Big Tipper"),(0,o.kt)("li",{parentName:"ul"},"Small Tipper")),(0,o.kt)("admonition",{title:"How to access Treasury funds?",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Access to Treasury funds requires successful enactment of referendum in the respective treasury\ntrack on-chain. Learn how to submit a treasury proposal for referendum\n",(0,o.kt)("a",{parentName:"p",href:"./learn-guides-treasury#creating-a-treasury-proposal"},"here"),".")),(0,o.kt)("h3",{id:"treasurer"},"Treasurer"),(0,o.kt)("p",null,"This track can be used for treasury spending requests up to\n10M DOT per referendum. Each\nreferendum requires a decision deposit of\n1000 DOT."),(0,o.kt)("h3",{id:"big-spender"},"Big Spender"),(0,o.kt)("p",null,"This track can be used for treasury spending requests up to\n1M DOT per referendum. Each referendum\nrequires a decision deposit of 400 DOT."),(0,o.kt)("h3",{id:"medium-spender"},"Medium Spender"),(0,o.kt)("p",null,"This track can be used for treasury spending requests up to\n100K DOT per referendum. Each\nreferendum requires a decision deposit of\n200 DOT."),(0,o.kt)("h3",{id:"small-spender"},"Small Spender"),(0,o.kt)("p",null,"This track can be used for treasury spending requests up to\n10K DOT per referendum. Each referendum\nrequires a decision deposit of 100 DOT."),(0,o.kt)("h3",{id:"big-tipper"},"Big Tipper"),(0,o.kt)("p",null,"This track can be used for treasury spending requests up to\n1000 DOT per referendum. Each referendum\nrequires a decision deposit of 10 DOT."),(0,o.kt)("h3",{id:"small-tipper"},"Small Tipper"),(0,o.kt)("p",null,"This track can be used for treasury spending requests up to\n100 DOT per referendum. Each referendum\nrequires a decision deposit of 1 DOT."))}m.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/386099fc.4a3b4f33.js b/assets/js/386099fc.4a3b4f33.js new file mode 100644 index 000000000000..20238e622b33 --- /dev/null +++ b/assets/js/386099fc.4a3b4f33.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[8139],{47940:(e,t,r)=>{"use strict";r.d(t,{Z:()=>c});var a=r(74165),n=r(15861),o=r(67294),s=r(87152),i=r(17145),l=r(67425);function p(e,t,r){return u.apply(this,arguments)}function u(){return(u=(0,n.Z)((0,a.Z)().mark((function e(t,r,n){var o,l,p,u,d;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:o=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return o="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return o="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return o="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return o="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==o){e.next=18;break}return e.abrupt("return");case 18:return p=new s.U(o),e.next=21,i.G.create({provider:p});case 21:u=e.sent,(d=r.split(".")).forEach((function(e){e in u&&(u=u[e])})),e.t1=d[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=u.toString(),e.abrupt("break",35);case 29:return e.next=31,u();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+d[0]+") in "+r);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function d(e,t,r,a){switch(t){case"humanReadable":(0,l.HumanReadable)(e,r,a);break;case"precise":(0,l.Precise)(e,r,a);break;case"blocksToDays":(0,l.BlocksToDays)(e,a);break;case"percentage":(0,l.Percentage)(e,a);break;case"permillToPercent":(0,l.PermillToPercent)(e,a);break;case"arrayLength":(0,l.ArrayLength)(e,a);break;default:return void console.log("Ignoring unknown filter type")}}const c=function(e){var t=e.network,r=e.path,s=e.defaultValue,i=e.filter,l=void 0===i?void 0:i,u=(0,o.useState)(""),c=u[0],k=u[1];return t=t.toLowerCase(),(0,o.useEffect)((function(){void 0!==l?d(s.toString(),l,t,k):k(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var o=function(){var e=(0,n.Z)((0,a.Z)().mark((function e(){var n;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p(t,r,k);case 2:if(void 0!==(n=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?d(n,l,t,k):k(n);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{o()}catch(i){console.log(i)}}}),[]),c}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,r,a){var n=void 0;if("polkadot"===r||"statemint"===r)n=3;else{if("kusama"!==r&&"statemine"!==r)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");n=6}e=parseFloat(e),a((e=Number.isInteger(e/t[r].precision)?e/t[r].precision+" "+t[r].symbol:(e/t[r].precision).toFixed(n)+" "+t[r].symbol).toString())},Precise:function(e,r,a){a(e=(e=parseFloat(e))/t[r].precision+" "+t[r].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},60283:(e,t,r)=>{"use strict";r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>p,default:()=>f,frontMatter:()=>l,metadata:()=>u,toc:()=>c});var a=r(87462),n=r(63366),o=(r(67294),r(3905)),s=r(47940),i=["components"],l={id:"learn-polkadot-opengov-treasury",title:"Treasury",sidebar_label:"Treasury",description:"Polkadot's On-chain Treasury.",keywords:["treasury","funds","funding","tips","tipping"],slug:"../learn-polkadot-opengov-treasury"},p=void 0,u={unversionedId:"learn/learn-polkadot-opengov-treasury",id:"learn/learn-polkadot-opengov-treasury",title:"Treasury",description:"Polkadot's On-chain Treasury.",source:"@site/../docs/learn/learn-polkadot-opengov-treasury.md",sourceDirName:"learn",slug:"/learn-polkadot-opengov-treasury",permalink:"/docs/learn-polkadot-opengov-treasury",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-polkadot-opengov-treasury.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1697709829,formattedLastUpdatedAt:"Oct 19, 2023",frontMatter:{id:"learn-polkadot-opengov-treasury",title:"Treasury",sidebar_label:"Treasury",description:"Polkadot's On-chain Treasury.",keywords:["treasury","funds","funding","tips","tipping"],slug:"../learn-polkadot-opengov-treasury"},sidebar:"docs",previous:{title:"Polkadot OpenGov",permalink:"/docs/learn-polkadot-opengov"},next:{title:"Tokens and Assets",permalink:"/docs/learn-assets-index"}},d={},c=[{value:"Treasury Inflow and Outflow",id:"treasury-inflow-and-outflow",level:2},{value:"Treasury Tracks",id:"treasury-tracks",level:2},{value:"Treasurer",id:"treasurer",level:3},{value:"Big Spender",id:"big-spender",level:3},{value:"Medium Spender",id:"medium-spender",level:3},{value:"Small Spender",id:"small-spender",level:3},{value:"Big Tipper",id:"big-tipper",level:3},{value:"Small Tipper",id:"small-tipper",level:3}],k={toc:c},m="wrapper";function f(e){var t=e.components,l=(0,n.Z)(e,i);return(0,o.kt)(m,(0,a.Z)({},k,l,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"The Treasury is a pot of funds collected through a portion of block production rewards, transaction\nfees, slashing, and ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-inflation"},"staking inefficiencies"),".Treasury funds are held in a\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced#system-accounts"},"system account")," that cannot be controlled by any\nexternal account; only the system internal logic can access it."),(0,o.kt)("admonition",{title:"Creating a Treasury Proposal on Polkadot OpenGov",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"If you would like to create a treasury proposal on Polkadot OpenGov, follow the instructions\noutlined on ",(0,o.kt)("a",{parentName:"p",href:"./learn-guides-treasury#creating-a-treasury-proposal"},"this how-to guide"),".")),(0,o.kt)("h2",{id:"treasury-inflow-and-outflow"},"Treasury Inflow and Outflow"),(0,o.kt)("p",null,"Tokens that are deposited into the Treasury (i.e. the inflow) is determined by the following\nmechanisms:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Transaction fees:")," 80% of the transaction fees of every submitted extrinsic is diverted to the\nTreasury, while 20% is given to the block producers."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Staking inefficiencies:")," the network knows an exogenously determined parameter called ideal\nstaking rate. The APY for stakers (nominators & validators) decreases whenever the actual staking\nrate is not equal to the ideal staking rate. To keep inflation constant at 10%, the system does\nnot creates less tokens, rather some share of the overall reward for stakers is diverted to the\nTreasury (more information\n",(0,o.kt)("a",{parentName:"li",href:"https://research.web3.foundation/Polkadot/overview/token-economics"},"here"),")."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Slashes:")," whenever validators and nominators are slashed, a share of the slashed tokens are\ndiverted to Treasury. They are typically rare and unpredictable events."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Transfers:")," everyone can send funds to the Treasury directly. This is a rare event and\ntypically due to grantees reimbursing some of the amount they got allocated for various reasons.")),(0,o.kt)("p",null,"The outflow is determined by the following mechanisms:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Burned tokens:")," at the end of each spend period\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.treasury.burn",defaultValue:1e4,filter:"permillToPercent",mdxType:"RPC"}),"","%\nof the available funds are burned."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Treasury proposals & Bounties:")," they make up the largest share of outflow tokens to the\ncommunity and need to be approved by governance. Then, payouts occur at the end of a\n",(0,o.kt)("a",{parentName:"li",href:"/docs/glossary#spend-period"},"spend period"),"."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Tips:")," smaller payouts directly to grantees that can happen within a\n",(0,o.kt)("a",{parentName:"li",href:"/docs/glossary#spend-period"},"spend period"),".")),(0,o.kt)("admonition",{title:"Spend Period Schedule",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"On Polkadot-JS UI, navigate to Governance > Treasury to view the status of current\n",(0,o.kt)("a",{parentName:"p",href:"/docs/glossary#spend-period"},"spend period"),"."),(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("img",{alt:"preimage-whitelist",src:r(29620).Z,width:"2508",height:"413"}))),(0,o.kt)("h2",{id:"treasury-tracks"},"Treasury Tracks"),(0,o.kt)("p",null,"OpenGov allows for managing funds through six tracks, each with its own\n",(0,o.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#origins-and-tracks-info"},"origin and track parameters"),"."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Treasurer"),(0,o.kt)("li",{parentName:"ul"},"Big Spender"),(0,o.kt)("li",{parentName:"ul"},"Medium Spender"),(0,o.kt)("li",{parentName:"ul"},"Small Spender"),(0,o.kt)("li",{parentName:"ul"},"Big Tipper"),(0,o.kt)("li",{parentName:"ul"},"Small Tipper")),(0,o.kt)("admonition",{title:"How to access Treasury funds?",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Access to Treasury funds requires successful enactment of referendum in the respective treasury\ntrack on-chain. Learn how to submit a treasury proposal for referendum\n",(0,o.kt)("a",{parentName:"p",href:"./learn-guides-treasury#creating-a-treasury-proposal"},"here"),".")),(0,o.kt)("h3",{id:"treasurer"},"Treasurer"),(0,o.kt)("p",null,"This track can be used for treasury spending requests up to\n10M DOT per referendum. Each\nreferendum requires a decision deposit of\n1000 DOT."),(0,o.kt)("h3",{id:"big-spender"},"Big Spender"),(0,o.kt)("p",null,"This track can be used for treasury spending requests up to\n1M DOT per referendum. Each referendum\nrequires a decision deposit of 400 DOT."),(0,o.kt)("h3",{id:"medium-spender"},"Medium Spender"),(0,o.kt)("p",null,"This track can be used for treasury spending requests up to\n100K DOT per referendum. Each\nreferendum requires a decision deposit of\n200 DOT."),(0,o.kt)("h3",{id:"small-spender"},"Small Spender"),(0,o.kt)("p",null,"This track can be used for treasury spending requests up to\n10K DOT per referendum. Each referendum\nrequires a decision deposit of 100 DOT."),(0,o.kt)("h3",{id:"big-tipper"},"Big Tipper"),(0,o.kt)("p",null,"This track can be used for treasury spending requests up to\n1000 DOT per referendum. Each referendum\nrequires a decision deposit of 10 DOT."),(0,o.kt)("h3",{id:"small-tipper"},"Small Tipper"),(0,o.kt)("p",null,"This track can be used for treasury spending requests up to\n100 DOT per referendum. Each referendum\nrequires a decision deposit of 1 DOT."))}f.isMDXComponent=!0},29620:(e,t,r)=>{"use strict";r.d(t,{Z:()=>a});const a=r.p+"assets/images/treasury-spend-period-a4883f21d69a6f05ca497b9893cc89a5.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/408829bd.1f73546c.js b/assets/js/408829bd.1f73546c.js deleted file mode 100644 index 63ac21b6a825..000000000000 --- a/assets/js/408829bd.1f73546c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>m});var n=a(67294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function r(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var l=n.createContext({}),c=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},h=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var a=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,h=s(e,["components","mdxType","originalType","parentName"]),d=c(a),p=i,m=d["".concat(l,".").concat(p)]||d[p]||u[p]||o;return a?n.createElement(m,r(r({ref:t},h),{},{components:a})):n.createElement(m,r({ref:t},h))}));function m(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=a.length,r=new Array(o);r[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:i,r[1]=s;for(var c=2;c{a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var n=a(87462),i=a(63366),o=(a(67294),a(3905)),r=["components"],s={id:"learn-transaction-fees",title:"Transaction Fees",sidebar_label:"Transaction Fees",description:"How Transaction Fees are Calculated and Handled.",keywords:["transaction","fees"],slug:"../learn-transaction-fees"},l=void 0,c={unversionedId:"learn/learn-transaction-fees",id:"learn/learn-transaction-fees",title:"Transaction Fees",description:"How Transaction Fees are Calculated and Handled.",source:"@site/../docs/learn/learn-transaction-fees.md",sourceDirName:"learn",slug:"/learn-transaction-fees",permalink:"/docs/learn-transaction-fees",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-transaction-fees.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1688135081,formattedLastUpdatedAt:"Jun 30, 2023",frontMatter:{id:"learn-transaction-fees",title:"Transaction Fees",sidebar_label:"Transaction Fees",description:"How Transaction Fees are Calculated and Handled.",keywords:["transaction","fees"],slug:"../learn-transaction-fees"},sidebar:"docs",previous:{title:"Balances Transfers",permalink:"/docs/learn-balance-transfers"},next:{title:"Tokens and Assets",permalink:"/docs/learn-assets-index"}},h={},d=[{value:"Fee Calculation",id:"fee-calculation",level:2},{value:"Block Limits and Transaction Priority",id:"block-limits-and-transaction-priority",level:2},{value:"Fees",id:"fees",level:2},{value:"Fee Multiplier",id:"fee-multiplier",level:3},{value:"Calcuating Fees with Polkadot-JS",id:"calcuating-fees-with-polkadot-js",level:2},{value:"Shard Transactions",id:"shard-transactions",level:2},{value:"Other Resource Limitation Strategies",id:"other-resource-limitation-strategies",level:2},{value:"Advanced",id:"advanced",level:2},{value:"Learn More",id:"learn-more",level:2}],u={toc:d},p="wrapper";function m(e){var t=e.components,a=(0,i.Z)(e,r);return(0,o.kt)(p,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Several resources in a blockchain network are limited, for example, storage and computation.\nTransaction fees prevent individual users from consuming too many resources.\nPolkadot uses a weight-based fee model as\nopposed to a gas-metering model. As such, fees are charged prior to transaction execution; once the\nfee is paid, nodes will execute the transaction."),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/overview/token-economics#2-slow-adjusting-mechanism"},"Web3 Foundation Research"),"\ndesigned the Polkadot fee system with the following objectives:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Each Relay Chain block should be processed efficiently to avoid delays in block production."),(0,o.kt)("li",{parentName:"ul"},"The growth rate of the Relay Chain should be bounded."),(0,o.kt)("li",{parentName:"ul"},"Each block should have space for special, high-priority transactions like misconduct reports."),(0,o.kt)("li",{parentName:"ul"},"The system should be able to handle spikes in demand."),(0,o.kt)("li",{parentName:"ul"},"Fees should change slowly so that senders can accurately predict the fee for a given transaction.")),(0,o.kt)("h2",{id:"fee-calculation"},"Fee Calculation"),(0,o.kt)("p",null,"Fees on the Polkadot Relay Chain are calculated based on three parameters:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"A Weight fee",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"Base weight"),(0,o.kt)("li",{parentName:"ul"},"Call(s) weight"))),(0,o.kt)("li",{parentName:"ul"},"A Length fee"),(0,o.kt)("li",{parentName:"ul"},"A Tip (optional).")),(0,o.kt)("p",null,"As a permissionless system, the Polkadot\nnetwork needs to implement a mechanism to measure and to limit the usage in order to establish an\neconomic incentive structure, to prevent the network overload, and to mitigate DoS vulnerabilities.\nPolkadot enforces a limited time-window for\nblock producers to create a block, including limitations on block size, which can make the selection\nand execution of certain extrinsics too expensive and decelerate the network. Extrinsics which\nrequire too many resources are discarded by the network."),(0,o.kt)("p",null,"Polkadot defines a specified\n",(0,o.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#sect-limitations"},"block ratio")," ensuring that only a certain portion\nof the total block size gets used for regular extrinsics. The remaining space is reserved for\ncritical, operational extrinsics required for the functionality by network itself."),(0,o.kt)("p",null,"This is handled by a ",(0,o.kt)("a",{parentName:"p",href:"/docs/glossary#weights"},"weight")," system, where the cost of the\ntransactions (referred to as ",(0,o.kt)("a",{parentName:"p",href:"/docs/glossary#extrinsics"},"extrinsics"),") are determined before\nexecution. Weights are a fixed set of numbers used in Substrate-based chains to manage the time it\ntakes to validate a block. Each transaction has a base weight that accounts for the overhead of\ninclusion (e.g. signature verification) and a dispatch weight that accounts for the time to execute\nthe transaction. All weights, even the base weight, are a measure of time to execute on some\nstandard hardware."),(0,o.kt)("p",null,"The runtime\n",(0,o.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/how-to-guides/weights/calculate-fees/"},"converts weight units to balance units"),"\nas part of the fee calculation."),(0,o.kt)("p",null,"The weight fee is the sum of the base weight and the sum of the total weight consumed by call(s)."),(0,o.kt)("admonition",{title:"A transaction can include several calls",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"For instance, a ",(0,o.kt)("inlineCode",{parentName:"p"},"batch")," can contain ",(0,o.kt)("inlineCode",{parentName:"p"},"bond")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"nominate"),", and the weight would be one base weight\nand then the sum of the weights for ",(0,o.kt)("inlineCode",{parentName:"p"},"bond")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"nominate"),".")),(0,o.kt)("p",null,"To learn more about the motivation of a weight fee, check out this\n",(0,o.kt)("a",{parentName:"p",href:"https://docs.substrate.io/main-docs/build/tx-weights-fees/"},"Substrate doc")," on weights."),(0,o.kt)("p",null,"The length fee is a per-byte fee multiplier for the size of the transaction in bytes."),(0,o.kt)("p",null,"There is also a targeted fee adjustment that serves as a multiplier which tunes the final fee based\non network congestion. This can constitute an adjusted weight fee calculated as the targeted fee\nadjustment times the weight fee."),(0,o.kt)("p",null,"Together, these fees constitute the inclusion fee. The inclusion fee is the base fee plus the length\nfee plus the adjusted weight fee."),(0,o.kt)("p",null,"The inclusion fee is deducted from the sender's account before transaction execution. A portion of\nthe fee will go to the block author, and the remainder will go to the ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-treasury"},"Treasury"),".\nThis is 20% and 80%, respectively."),(0,o.kt)("p",null,"Tips are an optional transaction fee that users can add. Tips are not part of the inclusion fee and\nare an incentive to block authors for prioritizing a transaction, and the entire tip goes directly\nto the block author."),(0,o.kt)("p",null,'Final weights are assigned based on the worst case scenario of each runtime function. The runtime\nhas the ability to "refund" the amount of weight which was overestimated once the runtime function\nis actually executed.'),(0,o.kt)("p",null,"The runtime only returns weights if the difference between the assigned weight and the actual weight\ncalculated during execution is greater than 20%."),(0,o.kt)("p",null,"Checkout some examples of how various weights are gauged in the\nPolkadot runtime for several different types\nof operations:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://spec.polkadot.network/#id-practical-example-1-request_judgement"},"request_judgement")," -\nfrom the identity pallet, allows users to request judgement from a specific registrar"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://spec.polkadot.network/#sect-practical-example-payout-stakers"},"payout_stakers")," - from the\nstaking Pallet, is invoked by a single account in order to payout the reward for all nominators\nwho back a particular validator"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://spec.polkadot.network/#id-practical-example-3-transfer"},"transfer")," - from the balances\nmodule, is designed to move the specified balance by the sender to the receiver"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://spec.polkadot.network/#id-practical-example-4-withdraw_unbounded"},"withdraw_unbounded")," -\nfrom the staking module, is designed to move any unlocked funds from the staking management system\nto be ready for transfer")),(0,o.kt)("h2",{id:"block-limits-and-transaction-priority"},"Block Limits and Transaction Priority"),(0,o.kt)("p",null,"Blocks in Polkadot have both a maximum length\n(in bytes) and a maximum weight. Block producers will fill blocks with transactions up to these\nlimits. A portion of each block - currently 25% - is reserved for critical transactions that are\nrelated to the chain's operation. Block producers will only fill up to 75% of a block with normal\ntransactions. Some examples of operational transactions:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Misbehavior reports"),(0,o.kt)("li",{parentName:"ul"},"Council operations"),(0,o.kt)("li",{parentName:"ul"},"Member operations in an election (e.g. renouncing candidacy)")),(0,o.kt)("p",null,"Block 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."),(0,o.kt)("h2",{id:"fees"},"Fees"),(0,o.kt)("p",null,"Block producers charge a fee in order to be economically sustainable. That fee must always be\ncovered by the sender of the transaction.\nPolkadot has a flexible mechanism to determine\nthe minimum cost to include transactions in a block."),(0,o.kt)("p",null,"Transaction volume on blockchains is highly irregular, and therefore transaction fees need a\nmechanism to adjust. However, users should be able to predict transaction fees."),(0,o.kt)("p",null,"Polkadot uses a slow-adjusting fee mechanism\nwith tips to balance these two considerations. In addition to block ",(0,o.kt)("em",{parentName:"p"},"limits"),",\nPolkadot also has a block fullness ",(0,o.kt)("em",{parentName:"p"},"target."),"\nFees increase or decrease for the next block based on the fullness of the current block relative to\nthe target. The per-weight fee can change up to 30% in a 24 hour period. This rate captures\nlong-term trends in demand, but not short-term spikes. To consider short-term spikes,\nPolkadot uses tips on top of the length and\nweight fees. Users can optionally add a tip to the fee to give the transaction a higher priority."),(0,o.kt)("p",null,"Polkadot fees consists of three parts:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"Base fee"),": a fixed fee that is applied to every transaction and set by the runtime."),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"Length fee"),": a fee that gets multiplied by the length of the transaction, in bytes."),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"Weight fee"),": a fee for each, varying runtime function. Runtime implementers need to implement a\nconversion mechanism which determines the corresponding currency amount for the calculated\nweight.")),(0,o.kt)("p",null,"The final fee can be summarized as:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"fee = base_fee + length_of_transaction_in_bytes * length_fee + weight_fee\n")),(0,o.kt)("p",null,"For example, the Polkadot Runtime defines the following values:"),(0,o.kt)("p",null,"Base fee: 100 uDOTs"),(0,o.kt)("p",null,"Length fee: Length fee: 0.1 uDOTs"),(0,o.kt)("p",null,"So, the weight to fee conversion is calculated as follows:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"weight_fee = weight * (100 uDots / (10 * 10\u2019000))\n")),(0,o.kt)("p",null,"A weight of 10\u2019000 (the smallest non-zero weight) is mapped to 1/10 of 100 uDOT. This fee will never\nexceed the max size of an unsigned 128 bit integer."),(0,o.kt)("h3",{id:"fee-multiplier"},"Fee Multiplier"),(0,o.kt)("p",null,"Polkadot can add a additional fee to\ntransactions if the network becomes too busy and starts to decelerate the system. This fee can\ncreate an incentive to avoid the production of low priority or insignificant transactions. In\ncontrast, those additional fees will decrease if the network calms down and can execute transactions\nwithout much difficulties."),(0,o.kt)("p",null,"This additional fee is known as the ",(0,o.kt)("inlineCode",{parentName:"p"},"Fee Multiplier")," and its value is defined by the\nPolkadot runtime. The multiplier works by\ncomparing the saturation of blocks; if the previous block is less saturated than the current block\n(implying an uptrend), the fee is slightly increased. Similarly, if the previous block is more\nsaturated than the current block (implying a downtrend), the fee is slightly decreased."),(0,o.kt)("p",null,"The final fee is calculated as:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"final_fee = fee * fee_multiplier\n")),(0,o.kt)("p",null,"The ",(0,o.kt)("inlineCode",{parentName:"p"},"Update Multiplier")," defines how the multiplier can change. Each runtime has the ability to\ndefine this behavior accordingly. For example, the\nPolkadot runtime internally updates the\nmultiplier after each block according to a custom formula defined\n",(0,o.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#id-update-multiplier"},"here"),"."),(0,o.kt)("h2",{id:"calcuating-fees-with-polkadot-js"},"Calcuating Fees with Polkadot-JS"),(0,o.kt)("p",null,"One useful utility for estimating transaction fees programmatically is the via the\n",(0,o.kt)("a",{parentName:"p",href:"https://www.npmjs.com/package/@polkadot/api"},"@polkadot/api"),". Check out the following script that\nlogs some relevant fee information:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-js"},"// 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")),(0,o.kt)("p",null,"For additional information on interacting with the API, checkout\n",(0,o.kt)("a",{parentName:"p",href:"/docs/polkadotjs"},"Polkadot-JS"),"."),(0,o.kt)("h2",{id:"shard-transactions"},"Shard Transactions"),(0,o.kt)("p",null,"The transactions that take place within\nPolkadot's shards - parachains and\nparathreads - do not incur Relay Chain transaction fees. Users of shard applications do not even\nneed to hold DOT tokens, as each shard has its own economic model and may or may not have a token.\nThere are, however, situations where shards themselves make transactions on the Relay Chain."),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"/docs/learn-parachains"},"Parachains")," have a dedicated slot 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 ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-xcm"},"XCM")," channel, participating\nin an ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-auction"},"auction")," to renew its slot, or upgrading its runtime. Parachains have their\nown accounts on the Relay Chain and will need to use those funds to issue transactions on the\nparachain's behalf."),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"/docs/learn-parathreads"},"Parathreads")," will also make all the same transactions that a parachain might.\nIn addition, the collators need to participate in an auction every block to progress their chain.\nThe collators will need to have DOT to participate in these auctions."),(0,o.kt)("h2",{id:"other-resource-limitation-strategies"},"Other Resource Limitation Strategies"),(0,o.kt)("p",null,"Transaction weight must be computable prior to execution, and therefore can only represent fixed\nlogic. Some transactions warrant limiting resources with other strategies. For example:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Bonds: Some transactions, like voting, may require a bond that will be returned or slashed after\nan on-chain event. In the voting example, returned at the end of the election or slashed if the\nvoter tried anything malicious."),(0,o.kt)("li",{parentName:"ul"},"Deposits: Some transactions, like setting an ",(0,o.kt)("a",{parentName:"li",href:"/docs/learn-identity"},"identity")," or claiming an index,\nuse storage space indefinitely. These require a deposit that will be returned if the user decides\nto free storage (e.g. clear their IDE)."),(0,o.kt)("li",{parentName:"ul"},"Burns: A transaction may burn funds internally based on its logic. For example, a transaction may\nburn funds from the sender if it creates new storage entries, thus increasing the state size."),(0,o.kt)("li",{parentName:"ul"},"Limits: Some limits are part of the protocol. For example, nominators can only nominate 16\nvalidators. This limits the complexity of ",(0,o.kt)("a",{parentName:"li",href:"/docs/learn-phragmen"},"Phragm\xe9n"),".")),(0,o.kt)("h2",{id:"advanced"},"Advanced"),(0,o.kt)("p",null,'This page only covered transactions that come from normal users. If you look at blocks in a block\nexplorer, though, you may see some "extrinsics" that look different from these transactions. In\nPolkadot (and any chain built on Substrate),\nan extrinsic is a piece of information that comes from outside the chain. Extrinsics fall into three\ncategories:'),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Signed transactions"),(0,o.kt)("li",{parentName:"ul"},"Unsigned transactions"),(0,o.kt)("li",{parentName:"ul"},"Inherents")),(0,o.kt)("p",null,"This page only covered signed transactions, which is the way that most users will interact with\nPolkadot . Signed transactions come from an\naccount that has funds, and therefore Polkadot\ncan charge a transaction fee as a way to prevent spam."),(0,o.kt)("p",null,"Unsigned transactions are for special cases where a user needs to submit an extrinsic from a key\npair that does not control funds. For example, when users\n",(0,o.kt)("a",{parentName:"p",href:"https://claims.polkadot.network"},"claim their DOT tokens")," after genesis, their DOT address doesn't\nhave any funds yet, so that uses an unsigned transaction. Validators also submit unsigned\ntransactions in the form of \"heartbeat\" messages to indicate that they are online. These heartbeats\nmust be signed by one of the validator's ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"session keys"),". Session keys never\ncontrol funds. Unsigned transactions are only used in special cases because, since Polkadot cannot\ncharge a fee for them, each one needs its own, custom validation logic."),(0,o.kt)("p",null,'Finally, inherents are pieces of information that are not signed or included in the transaction\nqueue. As such, only the block author can add inherents to a block. Inherents are assumed to be\n"true" simply because a sufficiently large number of validators have agreed on them being\nreasonable. For example, Polkadot blocks\ninclude a timestamp inherent. There is no way to prove that a timestamp is true the way one proves\nthe desire to send funds with a signature. Rather, validators accept or reject the block based on\nhow reasonable they find the timestamp. In\nPolkadot, it must be within some acceptable\nrange of their own system clocks.'),(0,o.kt)("h2",{id:"learn-more"},"Learn More"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://research.web3.foundation/Polkadot/overview/token-economics"},"Web3 Foundation Research")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://docs.substrate.io/main-docs/build/tx-weights-fees/"},"Substrate Extrinsics, Weights & Fees"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/408829bd.434ecd5d.js b/assets/js/408829bd.434ecd5d.js new file mode 100644 index 000000000000..9815fa0dc433 --- /dev/null +++ b/assets/js/408829bd.434ecd5d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6],{3905:(e,t,a)=>{a.d(t,{Zo:()=>h,kt:()=>m});var n=a(67294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function r(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var l=n.createContext({}),c=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},h=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var a=e.components,i=e.mdxType,o=e.originalType,l=e.parentName,h=s(e,["components","mdxType","originalType","parentName"]),d=c(a),p=i,m=d["".concat(l,".").concat(p)]||d[p]||u[p]||o;return a?n.createElement(m,r(r({ref:t},h),{},{components:a})):n.createElement(m,r({ref:t},h))}));function m(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=a.length,r=new Array(o);r[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[d]="string"==typeof e?e:i,r[1]=s;for(var c=2;c{a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var n=a(87462),i=a(63366),o=(a(67294),a(3905)),r=["components"],s={id:"learn-transaction-fees",title:"Transaction Fees",sidebar_label:"Transaction Fees",description:"How Transaction Fees are Calculated and Handled.",keywords:["transaction","fees"],slug:"../learn-transaction-fees"},l=void 0,c={unversionedId:"learn/learn-transaction-fees",id:"learn/learn-transaction-fees",title:"Transaction Fees",description:"How Transaction Fees are Calculated and Handled.",source:"@site/../docs/learn/learn-transaction-fees.md",sourceDirName:"learn",slug:"/learn-transaction-fees",permalink:"/docs/learn-transaction-fees",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-transaction-fees.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1688135081,formattedLastUpdatedAt:"Jun 30, 2023",frontMatter:{id:"learn-transaction-fees",title:"Transaction Fees",sidebar_label:"Transaction Fees",description:"How Transaction Fees are Calculated and Handled.",keywords:["transaction","fees"],slug:"../learn-transaction-fees"},sidebar:"docs",previous:{title:"Balances Transfers",permalink:"/docs/learn-balance-transfers"},next:{title:"Staking",permalink:"/docs/learn-staking-index"}},h={},d=[{value:"Fee Calculation",id:"fee-calculation",level:2},{value:"Block Limits and Transaction Priority",id:"block-limits-and-transaction-priority",level:2},{value:"Fees",id:"fees",level:2},{value:"Fee Multiplier",id:"fee-multiplier",level:3},{value:"Calcuating Fees with Polkadot-JS",id:"calcuating-fees-with-polkadot-js",level:2},{value:"Shard Transactions",id:"shard-transactions",level:2},{value:"Other Resource Limitation Strategies",id:"other-resource-limitation-strategies",level:2},{value:"Advanced",id:"advanced",level:2},{value:"Learn More",id:"learn-more",level:2}],u={toc:d},p="wrapper";function m(e){var t=e.components,a=(0,i.Z)(e,r);return(0,o.kt)(p,(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Several resources in a blockchain network are limited, for example, storage and computation.\nTransaction fees prevent individual users from consuming too many resources.\nPolkadot uses a weight-based fee model as\nopposed to a gas-metering model. As such, fees are charged prior to transaction execution; once the\nfee is paid, nodes will execute the transaction."),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/overview/token-economics#2-slow-adjusting-mechanism"},"Web3 Foundation Research"),"\ndesigned the Polkadot fee system with the following objectives:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Each Relay Chain block should be processed efficiently to avoid delays in block production."),(0,o.kt)("li",{parentName:"ul"},"The growth rate of the Relay Chain should be bounded."),(0,o.kt)("li",{parentName:"ul"},"Each block should have space for special, high-priority transactions like misconduct reports."),(0,o.kt)("li",{parentName:"ul"},"The system should be able to handle spikes in demand."),(0,o.kt)("li",{parentName:"ul"},"Fees should change slowly so that senders can accurately predict the fee for a given transaction.")),(0,o.kt)("h2",{id:"fee-calculation"},"Fee Calculation"),(0,o.kt)("p",null,"Fees on the Polkadot Relay Chain are calculated based on three parameters:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"A Weight fee",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"Base weight"),(0,o.kt)("li",{parentName:"ul"},"Call(s) weight"))),(0,o.kt)("li",{parentName:"ul"},"A Length fee"),(0,o.kt)("li",{parentName:"ul"},"A Tip (optional).")),(0,o.kt)("p",null,"As a permissionless system, the Polkadot\nnetwork needs to implement a mechanism to measure and to limit the usage in order to establish an\neconomic incentive structure, to prevent the network overload, and to mitigate DoS vulnerabilities.\nPolkadot enforces a limited time-window for\nblock producers to create a block, including limitations on block size, which can make the selection\nand execution of certain extrinsics too expensive and decelerate the network. Extrinsics which\nrequire too many resources are discarded by the network."),(0,o.kt)("p",null,"Polkadot defines a specified\n",(0,o.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#sect-limitations"},"block ratio")," ensuring that only a certain portion\nof the total block size gets used for regular extrinsics. The remaining space is reserved for\ncritical, operational extrinsics required for the functionality by network itself."),(0,o.kt)("p",null,"This is handled by a ",(0,o.kt)("a",{parentName:"p",href:"/docs/glossary#weights"},"weight")," system, where the cost of the\ntransactions (referred to as ",(0,o.kt)("a",{parentName:"p",href:"/docs/glossary#extrinsics"},"extrinsics"),") are determined before\nexecution. Weights are a fixed set of numbers used in Substrate-based chains to manage the time it\ntakes to validate a block. Each transaction has a base weight that accounts for the overhead of\ninclusion (e.g. signature verification) and a dispatch weight that accounts for the time to execute\nthe transaction. All weights, even the base weight, are a measure of time to execute on some\nstandard hardware."),(0,o.kt)("p",null,"The runtime\n",(0,o.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/how-to-guides/weights/calculate-fees/"},"converts weight units to balance units"),"\nas part of the fee calculation."),(0,o.kt)("p",null,"The weight fee is the sum of the base weight and the sum of the total weight consumed by call(s)."),(0,o.kt)("admonition",{title:"A transaction can include several calls",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"For instance, a ",(0,o.kt)("inlineCode",{parentName:"p"},"batch")," can contain ",(0,o.kt)("inlineCode",{parentName:"p"},"bond")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"nominate"),", and the weight would be one base weight\nand then the sum of the weights for ",(0,o.kt)("inlineCode",{parentName:"p"},"bond")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"nominate"),".")),(0,o.kt)("p",null,"To learn more about the motivation of a weight fee, check out this\n",(0,o.kt)("a",{parentName:"p",href:"https://docs.substrate.io/main-docs/build/tx-weights-fees/"},"Substrate doc")," on weights."),(0,o.kt)("p",null,"The length fee is a per-byte fee multiplier for the size of the transaction in bytes."),(0,o.kt)("p",null,"There is also a targeted fee adjustment that serves as a multiplier which tunes the final fee based\non network congestion. This can constitute an adjusted weight fee calculated as the targeted fee\nadjustment times the weight fee."),(0,o.kt)("p",null,"Together, these fees constitute the inclusion fee. The inclusion fee is the base fee plus the length\nfee plus the adjusted weight fee."),(0,o.kt)("p",null,"The inclusion fee is deducted from the sender's account before transaction execution. A portion of\nthe fee will go to the block author, and the remainder will go to the ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-treasury"},"Treasury"),".\nThis is 20% and 80%, respectively."),(0,o.kt)("p",null,"Tips are an optional transaction fee that users can add. Tips are not part of the inclusion fee and\nare an incentive to block authors for prioritizing a transaction, and the entire tip goes directly\nto the block author."),(0,o.kt)("p",null,'Final weights are assigned based on the worst case scenario of each runtime function. The runtime\nhas the ability to "refund" the amount of weight which was overestimated once the runtime function\nis actually executed.'),(0,o.kt)("p",null,"The runtime only returns weights if the difference between the assigned weight and the actual weight\ncalculated during execution is greater than 20%."),(0,o.kt)("p",null,"Checkout some examples of how various weights are gauged in the\nPolkadot runtime for several different types\nof operations:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://spec.polkadot.network/#id-practical-example-1-request_judgement"},"request_judgement")," -\nfrom the identity pallet, allows users to request judgement from a specific registrar"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://spec.polkadot.network/#sect-practical-example-payout-stakers"},"payout_stakers")," - from the\nstaking Pallet, is invoked by a single account in order to payout the reward for all nominators\nwho back a particular validator"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://spec.polkadot.network/#id-practical-example-3-transfer"},"transfer")," - from the balances\nmodule, is designed to move the specified balance by the sender to the receiver"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://spec.polkadot.network/#id-practical-example-4-withdraw_unbounded"},"withdraw_unbounded")," -\nfrom the staking module, is designed to move any unlocked funds from the staking management system\nto be ready for transfer")),(0,o.kt)("h2",{id:"block-limits-and-transaction-priority"},"Block Limits and Transaction Priority"),(0,o.kt)("p",null,"Blocks in Polkadot have both a maximum length\n(in bytes) and a maximum weight. Block producers will fill blocks with transactions up to these\nlimits. A portion of each block - currently 25% - is reserved for critical transactions that are\nrelated to the chain's operation. Block producers will only fill up to 75% of a block with normal\ntransactions. Some examples of operational transactions:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Misbehavior reports"),(0,o.kt)("li",{parentName:"ul"},"Council operations"),(0,o.kt)("li",{parentName:"ul"},"Member operations in an election (e.g. renouncing candidacy)")),(0,o.kt)("p",null,"Block 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."),(0,o.kt)("h2",{id:"fees"},"Fees"),(0,o.kt)("p",null,"Block producers charge a fee in order to be economically sustainable. That fee must always be\ncovered by the sender of the transaction.\nPolkadot has a flexible mechanism to determine\nthe minimum cost to include transactions in a block."),(0,o.kt)("p",null,"Transaction volume on blockchains is highly irregular, and therefore transaction fees need a\nmechanism to adjust. However, users should be able to predict transaction fees."),(0,o.kt)("p",null,"Polkadot uses a slow-adjusting fee mechanism\nwith tips to balance these two considerations. In addition to block ",(0,o.kt)("em",{parentName:"p"},"limits"),",\nPolkadot also has a block fullness ",(0,o.kt)("em",{parentName:"p"},"target."),"\nFees increase or decrease for the next block based on the fullness of the current block relative to\nthe target. The per-weight fee can change up to 30% in a 24 hour period. This rate captures\nlong-term trends in demand, but not short-term spikes. To consider short-term spikes,\nPolkadot uses tips on top of the length and\nweight fees. Users can optionally add a tip to the fee to give the transaction a higher priority."),(0,o.kt)("p",null,"Polkadot fees consists of three parts:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"Base fee"),": a fixed fee that is applied to every transaction and set by the runtime."),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"Length fee"),": a fee that gets multiplied by the length of the transaction, in bytes."),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"Weight fee"),": a fee for each, varying runtime function. Runtime implementers need to implement a\nconversion mechanism which determines the corresponding currency amount for the calculated\nweight.")),(0,o.kt)("p",null,"The final fee can be summarized as:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"fee = base_fee + length_of_transaction_in_bytes * length_fee + weight_fee\n")),(0,o.kt)("p",null,"For example, the Polkadot Runtime defines the following values:"),(0,o.kt)("p",null,"Base fee: 100 uDOTs"),(0,o.kt)("p",null,"Length fee: Length fee: 0.1 uDOTs"),(0,o.kt)("p",null,"So, the weight to fee conversion is calculated as follows:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"weight_fee = weight * (100 uDots / (10 * 10\u2019000))\n")),(0,o.kt)("p",null,"A weight of 10\u2019000 (the smallest non-zero weight) is mapped to 1/10 of 100 uDOT. This fee will never\nexceed the max size of an unsigned 128 bit integer."),(0,o.kt)("h3",{id:"fee-multiplier"},"Fee Multiplier"),(0,o.kt)("p",null,"Polkadot can add a additional fee to\ntransactions if the network becomes too busy and starts to decelerate the system. This fee can\ncreate an incentive to avoid the production of low priority or insignificant transactions. In\ncontrast, those additional fees will decrease if the network calms down and can execute transactions\nwithout much difficulties."),(0,o.kt)("p",null,"This additional fee is known as the ",(0,o.kt)("inlineCode",{parentName:"p"},"Fee Multiplier")," and its value is defined by the\nPolkadot runtime. The multiplier works by\ncomparing the saturation of blocks; if the previous block is less saturated than the current block\n(implying an uptrend), the fee is slightly increased. Similarly, if the previous block is more\nsaturated than the current block (implying a downtrend), the fee is slightly decreased."),(0,o.kt)("p",null,"The final fee is calculated as:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"final_fee = fee * fee_multiplier\n")),(0,o.kt)("p",null,"The ",(0,o.kt)("inlineCode",{parentName:"p"},"Update Multiplier")," defines how the multiplier can change. Each runtime has the ability to\ndefine this behavior accordingly. For example, the\nPolkadot runtime internally updates the\nmultiplier after each block according to a custom formula defined\n",(0,o.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#id-update-multiplier"},"here"),"."),(0,o.kt)("h2",{id:"calcuating-fees-with-polkadot-js"},"Calcuating Fees with Polkadot-JS"),(0,o.kt)("p",null,"One useful utility for estimating transaction fees programmatically is the via the\n",(0,o.kt)("a",{parentName:"p",href:"https://www.npmjs.com/package/@polkadot/api"},"@polkadot/api"),". Check out the following script that\nlogs some relevant fee information:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-js"},"// 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")),(0,o.kt)("p",null,"For additional information on interacting with the API, checkout\n",(0,o.kt)("a",{parentName:"p",href:"/docs/polkadotjs"},"Polkadot-JS"),"."),(0,o.kt)("h2",{id:"shard-transactions"},"Shard Transactions"),(0,o.kt)("p",null,"The transactions that take place within\nPolkadot's shards - parachains and\nparathreads - do not incur Relay Chain transaction fees. Users of shard applications do not even\nneed to hold DOT tokens, as each shard has its own economic model and may or may not have a token.\nThere are, however, situations where shards themselves make transactions on the Relay Chain."),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"/docs/learn-parachains"},"Parachains")," have a dedicated slot 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 ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-xcm"},"XCM")," channel, participating\nin an ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-auction"},"auction")," to renew its slot, or upgrading its runtime. Parachains have their\nown accounts on the Relay Chain and will need to use those funds to issue transactions on the\nparachain's behalf."),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"/docs/learn-parathreads"},"Parathreads")," will also make all the same transactions that a parachain might.\nIn addition, the collators need to participate in an auction every block to progress their chain.\nThe collators will need to have DOT to participate in these auctions."),(0,o.kt)("h2",{id:"other-resource-limitation-strategies"},"Other Resource Limitation Strategies"),(0,o.kt)("p",null,"Transaction weight must be computable prior to execution, and therefore can only represent fixed\nlogic. Some transactions warrant limiting resources with other strategies. For example:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Bonds: Some transactions, like voting, may require a bond that will be returned or slashed after\nan on-chain event. In the voting example, returned at the end of the election or slashed if the\nvoter tried anything malicious."),(0,o.kt)("li",{parentName:"ul"},"Deposits: Some transactions, like setting an ",(0,o.kt)("a",{parentName:"li",href:"/docs/learn-identity"},"identity")," or claiming an index,\nuse storage space indefinitely. These require a deposit that will be returned if the user decides\nto free storage (e.g. clear their IDE)."),(0,o.kt)("li",{parentName:"ul"},"Burns: A transaction may burn funds internally based on its logic. For example, a transaction may\nburn funds from the sender if it creates new storage entries, thus increasing the state size."),(0,o.kt)("li",{parentName:"ul"},"Limits: Some limits are part of the protocol. For example, nominators can only nominate 16\nvalidators. This limits the complexity of ",(0,o.kt)("a",{parentName:"li",href:"/docs/learn-phragmen"},"Phragm\xe9n"),".")),(0,o.kt)("h2",{id:"advanced"},"Advanced"),(0,o.kt)("p",null,'This page only covered transactions that come from normal users. If you look at blocks in a block\nexplorer, though, you may see some "extrinsics" that look different from these transactions. In\nPolkadot (and any chain built on Substrate),\nan extrinsic is a piece of information that comes from outside the chain. Extrinsics fall into three\ncategories:'),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Signed transactions"),(0,o.kt)("li",{parentName:"ul"},"Unsigned transactions"),(0,o.kt)("li",{parentName:"ul"},"Inherents")),(0,o.kt)("p",null,"This page only covered signed transactions, which is the way that most users will interact with\nPolkadot . Signed transactions come from an\naccount that has funds, and therefore Polkadot\ncan charge a transaction fee as a way to prevent spam."),(0,o.kt)("p",null,"Unsigned transactions are for special cases where a user needs to submit an extrinsic from a key\npair that does not control funds. For example, when users\n",(0,o.kt)("a",{parentName:"p",href:"https://claims.polkadot.network"},"claim their DOT tokens")," after genesis, their DOT address doesn't\nhave any funds yet, so that uses an unsigned transaction. Validators also submit unsigned\ntransactions in the form of \"heartbeat\" messages to indicate that they are online. These heartbeats\nmust be signed by one of the validator's ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"session keys"),". Session keys never\ncontrol funds. Unsigned transactions are only used in special cases because, since Polkadot cannot\ncharge a fee for them, each one needs its own, custom validation logic."),(0,o.kt)("p",null,'Finally, inherents are pieces of information that are not signed or included in the transaction\nqueue. As such, only the block author can add inherents to a block. Inherents are assumed to be\n"true" simply because a sufficiently large number of validators have agreed on them being\nreasonable. For example, Polkadot blocks\ninclude a timestamp inherent. There is no way to prove that a timestamp is true the way one proves\nthe desire to send funds with a signature. Rather, validators accept or reject the block based on\nhow reasonable they find the timestamp. In\nPolkadot, it must be within some acceptable\nrange of their own system clocks.'),(0,o.kt)("h2",{id:"learn-more"},"Learn More"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://research.web3.foundation/Polkadot/overview/token-economics"},"Web3 Foundation Research")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://docs.substrate.io/main-docs/build/tx-weights-fees/"},"Substrate Extrinsics, Weights & Fees"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/41b7b3e8.44b53777.js b/assets/js/41b7b3e8.44b53777.js new file mode 100644 index 000000000000..8de87834985a --- /dev/null +++ b/assets/js/41b7b3e8.44b53777.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[3513],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>p});var n=a(74165),i=a(15861),o=a(67294),s=a(87152),r=a(17145),l=a(67425);function d(e,t,a){return h.apply(this,arguments)}function h(){return(h=(0,i.Z)((0,n.Z)().mark((function e(t,a,i){var o,l,d,h,c;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:o=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return o="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return o="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return o="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return o="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==o){e.next=18;break}return e.abrupt("return");case 18:return d=new s.U(o),e.next=21,r.G.create({provider:d});case 21:h=e.sent,(c=a.split(".")).forEach((function(e){e in h&&(h=h[e])})),e.t1=c[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=h.toString(),e.abrupt("break",35);case 29:return e.next=31,h();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function c(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"permillToPercent":(0,l.PermillToPercent)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(e){var t=e.network,a=e.path,s=e.defaultValue,r=e.filter,l=void 0===r?void 0:r,h=(0,o.useState)(""),p=h[0],m=h[1];return t=t.toLowerCase(),(0,o.useEffect)((function(){void 0!==l?c(s.toString(),l,t,m):m(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var o=function(){var e=(0,i.Z)((0,n.Z)().mark((function e(){var i;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t,a,m);case 2:if(void 0!==(i=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?c(i,l,t,m):m(i);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{o()}catch(r){console.log(r)}}}),[]),p}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var i=void 0;if("polkadot"===a||"statemint"===a)i=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");i=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(i)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},84358:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>k,frontMatter:()=>l,metadata:()=>h,toc:()=>p});var n=a(87462),i=a(63366),o=(a(67294),a(3905)),s=a(47940),r=["components"],l={id:"learn-staking-advanced",title:"Advanced Staking Concepts",sidebar_label:"Advanced Staking Concepts",description:"Advanced Concepts about Staking on Polkadot.",keywords:["staking","stake","nominate","nominating","NPoS","proxies","payouts","simple payouts","rewards","staking miner","phragm\xe9n"],slug:"../learn-staking-advanced"},d=void 0,h={unversionedId:"learn/learn-staking-advanced",id:"learn/learn-staking-advanced",title:"Advanced Staking Concepts",description:"Advanced Concepts about Staking on Polkadot.",source:"@site/../docs/learn/learn-staking-advanced.md",sourceDirName:"learn",slug:"/learn-staking-advanced",permalink:"/docs/learn-staking-advanced",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-staking-advanced.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696928140,formattedLastUpdatedAt:"Oct 10, 2023",frontMatter:{id:"learn-staking-advanced",title:"Advanced Staking Concepts",sidebar_label:"Advanced Staking Concepts",description:"Advanced Concepts about Staking on Polkadot.",keywords:["staking","stake","nominate","nominating","NPoS","proxies","payouts","simple payouts","rewards","staking miner","phragm\xe9n"],slug:"../learn-staking-advanced"},sidebar:"docs",previous:{title:"Accounts",permalink:"/docs/learn-account-advanced"},next:{title:"NFT Pallets",permalink:"/docs/learn-nft-pallets"}},c={},p=[{value:"Staking Proxies",id:"staking-proxies",level:2},{value:"Bags List",id:"bags-list",level:2},{value:"Rewards Distribution",id:"rewards-distribution",level:2},{value:"Oversubscription, Commission Fees & Slashes",id:"oversubscription-commission-fees--slashes",level:4},{value:"Slashing",id:"slashing",level:2},{value:"Unresponsiveness",id:"unresponsiveness",level:3},{value:"Equivocation",id:"equivocation",level:3},{value:"Slashing Across Eras",id:"slashing-across-eras",level:3},{value:"Simple Payouts",id:"simple-payouts",level:2},{value:"Claiming Rewards",id:"claiming-rewards",level:3},{value:"FAQ and Cautionary Notes",id:"faq-and-cautionary-notes",level:3},{value:"Staking Miner",id:"staking-miner",level:2},{value:"NPoS election optimization",id:"npos-election-optimization",level:3},{value:"Signed Phase of the election pallet",id:"signed-phase-of-the-election-pallet",level:3},{value:"Deposit and reward mechanics",id:"deposit-and-reward-mechanics",level:3},{value:"Deposit",id:"deposit",level:4},{value:"Reward",id:"reward",level:4},{value:"Further Resources",id:"further-resources",level:3}],m={toc:p},u="wrapper";function k(e){var t=e.components,l=(0,i.Z)(e,r);return(0,o.kt)(u,(0,n.Z)({},m,l,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{title:"New to Staking?",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Start your staking journey or explore more information about staking on\n",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.network/staking/"},"Polkadot's Home Page"),". Discover the new\n",(0,o.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/#/overview"},"Staking Dashboard")," that makes staking much easier and\ncheck this\n",(0,o.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182104"},"extensive article list")," to\nhelp you get started. You can now stake on\nPolkadot natively with just\n",(0,o.kt)(s.Z,{network:"polkadot",path:"query.nominationPools.minJoinBond",filter:"humanReadable",defaultValue:1e10,mdxType:"RPC"}),"\n","\nand earn staking rewards. For additional information, check out\n",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/nomination-pools-are-live-stake-natively-with-just-1-dot/"},"this blog post"),".")),(0,o.kt)("p",null,"This page is meant to be an advanced guide to staking with\nPolkadot. For a more general introduction,\ncheckout the ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-staking"},"Introduction to Staking")," page."),(0,o.kt)("h2",{id:"staking-proxies"},"Staking Proxies"),(0,o.kt)("p",null,"Polkadot makes it possible to create accounts\nhaving special permissions also called ",(0,o.kt)("strong",{parentName:"p"},"proxy accounts"),". For mode details about proxy accounts\nvisit the ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-proxies"},"dedicated page")," on this wiki."),(0,o.kt)("p",null,"Proxy accounts are special accounts which can sign\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-extrinsics/#pallets-and-extrinsics"},(0,o.kt)("strong",{parentName:"a"},"extrinsic calls"))," made to specific ",(0,o.kt)("strong",{parentName:"p"},"pallets")," on\nbehalf of the proxied account. There is thus the possibility to create staking proxy accounts that\ncan be used to sign extrinsic calls specific to the staking, session and utility pallets."),(0,o.kt)("p",null,"Staking on Polkadot is not a set-and-forget\naction, as a nominator you will need to monitor the performance of your validators and make changes\nif needed. There will be this transactions such as nominating that will be needed to regularly\nsigned. Each time you sign with an account, in the case of hot accounts, you expose the private key\nof that account to the internet with consequent risk of attack. A hot stash will be exposed all the\ntime a transaction is signed. Even in the case of a cold stash created with a Ledger device, signing\nwith the stash will build a transaction history that might tell something about your habits and\npreferences, or even your location."),(0,o.kt)("p",null,"Ideally, 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 staking transaction history will be built by the proxy."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"stash-stakingProxy",src:a(56789).Z,width:"1920",height:"800"})),(0,o.kt)("p",null,"For 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."),(0,o.kt)("p",null,"It is important to remember that actions that can be performed by the proxy accounts are limited,\nand in the case of staking proxy, extrinsic calls to the balances pallet cannot be signed. This\nmeans it is not possible to do balance transfers on the proxied account through a staking proxy."),(0,o.kt)("p",null,"Note that to change the staking proxy you will need to sign with the stash or an ",(0,o.kt)("em",{parentName:"p"},"any")," proxy."),(0,o.kt)("h2",{id:"bags-list"},"Bags List"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"On Polkadot and Kusama, the instance of the pallet\n",(0,o.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_bags_list/"},"Bags-List")," is named as\n'voterList'."),(0,o.kt)("p",{parentName:"admonition"},"For a demo about bags list see ",(0,o.kt)("a",{parentName:"p",href:"https://youtu.be/hIIZRJLrBZA"},"this video tutorial"),".")),(0,o.kt)("p",null,"In Polkadot's NPoS nomination intents are\nplaced in a semi-sorted list called ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/pull/9507"},"bags-list"),".\nThe\nBags-List substrate pallet is designed to be self-maintaining, with minimal effort from the\nblockchain, making it extremely scalable. The bags list has two primary components, bags and nodes\n(or nominators' accounts), with bags containing the nodes with bonded balance within a specific\nrange. In the figure below the 1st empty bag will contain nominators whose bonded balance is in the\nrange of 21 - 30 DOT, the 2nd bag 11 - 20 DOT, and the 3rd bag 0-10 DOT. The nomination intents are\nthe nominators' accounts with bonded tokens (in the example shown below, there are eight nomination\nintents) that will be put inside each of those three bags depending on their stake."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"bags list example 0",src:a(71842).Z,width:"1920",height:"800"})),(0,o.kt)("p",null,"The 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, but 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 yellow circle). The same scenario\napplies for the node with 8 DOT (green circle) in the 3rd bag. Placing the node above all nodes with\na lesser stake requires an additional step (more on this later)."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"bags list example 1",src:a(79098).Z,width:"1920",height:"800"})),(0,o.kt)("p",null,"The mentioned two nodes (19 DOT and 8 DOT) have the option to move up in their respective bags,\nwhich can put them in front of the nodes with less stake than them (see figure below). This action\nmust be done manually by submitting the ",(0,o.kt)("inlineCode",{parentName:"p"},"putInFrontOf")," extrinsic within the ",(0,o.kt)("inlineCode",{parentName:"p"},"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 ",(0,o.kt)("inlineCode",{parentName:"p"},"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).'),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"bags list example 2",src:a(86983).Z,width:"1920",height:"800"})),(0,o.kt)("p",null,"If 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 automatically. 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 ",(0,o.kt)("inlineCode",{parentName:"p"},"rebag")," within the ",(0,o.kt)("inlineCode",{parentName:"p"},"voterList")," pallet instance to update the positions of\nthe nodes that do not belong to their bag and place them in the correct one. To reiterate, actions\nlike bonding/unbonding tokens automatically rebag the nominator node, but events like staking\nrewards/slashing do not. See the ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-nominator#bags-list"},"bags-list")," section for more\ninformation."),(0,o.kt)("p",null,"The bags-list is capable of including an unlimited number of nodes, subject to the chain's runtime\nstorage. In the current staking system configuration, the bags list keeps\n",(0,o.kt)(s.Z,{network:"polkadot",path:"query.staking.maxNominatorsCount",defaultValue:5e4,mdxType:"RPC"}),"\n","\nnomination intents, of which, at most\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.maxElectingVoters",defaultValue:22500,mdxType:"RPC"}),"\n","\ncome out as the electing nominators. See\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-nominator#staking-election-stages"},"Staking Election Stages")," section for more info."),(0,o.kt)("p",null,"This means that only a portion of the nomination intents is kept. Once the nomination period ends,\nthe NPoS election system takes all nomination intents and their associated votes as input, and it\noutputs a set of validators. The bags are iterated from the most staked to the least staked. If the\naccounts are not appropriately sorted, this could leave the last touched bag to only be partially\niterated. Thus, in some edge cases, the order of the members within a bag is important. Continuing\nwith the example used in the previous figures, there are 8 nomination intents of which only 7 will\nbe kept. If the bags list stays semi-sorted (i.e. no accounts call the ",(0,o.kt)("inlineCode",{parentName:"p"},"putInFrontOf")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"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. The sorting\nfunctionality of nomination intents using bags is extremely important for the\n",(0,o.kt)("a",{parentName:"p",href:"https://gist.github.com/kianenigma/aa835946455b9a3f167821b9d05ba376"},"long-term improvements")," of the\nstaking/election system."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"bags list example 3",src:a(54258).Z,width:"1920",height:"800"})),(0,o.kt)("admonition",{title:"Minimum active nomination threshold to earn rewards is dynamic",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Submitting a nomination intent does not guarantee staking rewards. The stake of the top\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.maxElectingVoters",defaultValue:22500,mdxType:"RPC"}),"\n","\nnominators is applied to the validators in the active set. To avail of staking rewards, ensure that\nthe number of tokens bonded is higher than the minimum active bond. For more information, see the\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-nominator"},"nominator guide"),".")),(0,o.kt)("p",null,'The "election solution" which is a connected graph between nominators and validators with the stake\nas edge weights, has to meet certain requirements, such as maximizing the amount of stake to\nnominate validators and distributing the stake backing validators as evenly as possible. The\nobjectives of this election mechanism are to maximize the security of the network, 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',(0,o.kt)("a",{parentName:"p",href:"http://research.web3.foundation/en/latest/polkadot/NPoS.html"},"here"),"."),(0,o.kt)("h2",{id:"rewards-distribution"},"Rewards Distribution"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"The general rule for rewards across validators is that two validators get paid essentially the same\namount of tokens for equal work, i.e. they are not paid proportional to their total stakes. There is\na probabilistic component to staking rewards in the form of\n",(0,o.kt)("a",{parentName:"p",href:"/docs/maintain-guides-validator-payout##era-points"},"era points")," and\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-transaction-fees#fee-calculation"},"tips")," but these should average out over time.")),(0,o.kt)("p",null,"Validators 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."),(0,o.kt)("p",null,"Before 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."),(0,o.kt)("p",null,"For example, assume the block reward for a validator is 10 DOT. A validator may specify\n",(0,o.kt)("inlineCode",{parentName:"p"},"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."),(0,o.kt)("p",null,"Thus, 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."),(0,o.kt)("p",null,"The following example should clarify the above. For simplicity, we have the following assumptions:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"These validators do not have a stake of their own."),(0,o.kt)("li",{parentName:"ul"},"They each receive the same number of era points."),(0,o.kt)("li",{parentName:"ul"},"There are no tips for any transactions processed."),(0,o.kt)("li",{parentName:"ul"},"They do NOT charge any commission fees."),(0,o.kt)("li",{parentName:"ul"},"Total reward amount is 100 DOT tokens."),(0,o.kt)("li",{parentName:"ul"},"The current minimum amount of DOT to be a validator is 350 (note that this is ",(0,o.kt)("em",{parentName:"li"},"not")," the actual\nvalue, which fluctuates, but merely an assumption for purposes of this example; to understand how\nthe actual minimal stake is calculated, see\n",(0,o.kt)("a",{parentName:"li",href:"/docs/faq#what-is-the-minimum-stake-necessary-to-be-elected-as-an-active-validator"},"here"),").")),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:"center"}),(0,o.kt)("th",{parentName:"tr",align:"center"},(0,o.kt)("strong",{parentName:"th"},"Validator A")),(0,o.kt)("th",{parentName:"tr",align:"center"}),(0,o.kt)("th",{parentName:"tr",align:"center"}))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},"Nominator (4)"),(0,o.kt)("td",{parentName:"tr",align:"center"},"Stake (600)"),(0,o.kt)("td",{parentName:"tr",align:"center"},"Fraction of the Total Stake"),(0,o.kt)("td",{parentName:"tr",align:"center"},"Rewards")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},"Jin"),(0,o.kt)("td",{parentName:"tr",align:"center"},"100"),(0,o.kt)("td",{parentName:"tr",align:"center"},"0.167"),(0,o.kt)("td",{parentName:"tr",align:"center"},"16.7")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},(0,o.kt)("strong",{parentName:"td"},"Sam")),(0,o.kt)("td",{parentName:"tr",align:"center"},"50"),(0,o.kt)("td",{parentName:"tr",align:"center"},"0.083"),(0,o.kt)("td",{parentName:"tr",align:"center"},"8.3")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},"Anson"),(0,o.kt)("td",{parentName:"tr",align:"center"},"250"),(0,o.kt)("td",{parentName:"tr",align:"center"},"0.417"),(0,o.kt)("td",{parentName:"tr",align:"center"},"41.7")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},"Bobby"),(0,o.kt)("td",{parentName:"tr",align:"center"},"200"),(0,o.kt)("td",{parentName:"tr",align:"center"},"0.333"),(0,o.kt)("td",{parentName:"tr",align:"center"},"33.3")))),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:"center"}),(0,o.kt)("th",{parentName:"tr",align:"center"},(0,o.kt)("strong",{parentName:"th"},"Validator B")),(0,o.kt)("th",{parentName:"tr",align:"center"}),(0,o.kt)("th",{parentName:"tr",align:"center"}))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},"Nominator (4)"),(0,o.kt)("td",{parentName:"tr",align:"center"},"Stake (400)"),(0,o.kt)("td",{parentName:"tr",align:"center"},"Fraction of the Total Stake"),(0,o.kt)("td",{parentName:"tr",align:"center"},"Rewards")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},"Alice"),(0,o.kt)("td",{parentName:"tr",align:"center"},"100"),(0,o.kt)("td",{parentName:"tr",align:"center"},"0.25"),(0,o.kt)("td",{parentName:"tr",align:"center"},"25")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},"Peter"),(0,o.kt)("td",{parentName:"tr",align:"center"},"100"),(0,o.kt)("td",{parentName:"tr",align:"center"},"0.25"),(0,o.kt)("td",{parentName:"tr",align:"center"},"25")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},"John"),(0,o.kt)("td",{parentName:"tr",align:"center"},"150"),(0,o.kt)("td",{parentName:"tr",align:"center"},"0.375"),(0,o.kt)("td",{parentName:"tr",align:"center"},"37.5")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},(0,o.kt)("strong",{parentName:"td"},"Kitty")),(0,o.kt)("td",{parentName:"tr",align:"center"},"50"),(0,o.kt)("td",{parentName:"tr",align:"center"},"0.125"),(0,o.kt)("td",{parentName:"tr",align:"center"},"12.5")))),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},"Both validators A & B have 4 nominators with a total stake 600 and 400 respectively.")),(0,o.kt)("p",null,"Based 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."),(0,o.kt)("p",null,"To estimate how many tokens you can get each month as a nominator or validator, you can use this\n",(0,o.kt)("a",{parentName:"p",href:"https://www.stakingrewards.com/earn/polkadot/calculate"},"tool")," 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."),(0,o.kt)("h4",{id:"oversubscription-commission-fees--slashes"},"Oversubscription, Commission Fees & Slashes"),(0,o.kt)("p",null,"There is an additional factor to consider in terms of rewards. While there is no limit to the number\nof nominators a validator may have, a validator does have a limit to how many nominators to which it\ncan pay rewards. In Polkadot this limit is\ncurrently\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),",\n","\nalthough this can be modified via runtime upgrade. A validator with more than\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n","\nnominators is ",(0,o.kt)("em",{parentName:"p"},"oversubscribed"),". When payouts occur, only the top\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n",'\nnominators as measured by the amount of stake allocated to that validator will receive rewards. All\nother nominators are essentially "wasting" their stake - they used their nomination to elect that\nvalidator to the active stake, but receive no rewards in exchange for doing so.'),(0,o.kt)("p",null,"Note that the network slashes a validator for a misbehavior (e.g. validator offline, equivocation,\netc.) the slashed amount is a fixed percentage (and not a fixed amount), which means that validators\nwith more stake get slashed more DOT. Again, this is done to provide nominators with an economic\nincentive to shift their preferences and back less popular validators whom they consider to be\ntrustworthy."),(0,o.kt)("p",null,"Also, 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)."),(0,o.kt)("h2",{id:"slashing"},"Slashing"),(0,o.kt)("h3",{id:"unresponsiveness"},"Unresponsiveness"),(0,o.kt)("p",null,'For every session, validators will send an "I\'m online" heartbeat to indicate they are live. If a\nvalidator produces no blocks during an epoch and fails to send the heartbeat, it will be reported as\nunresponsive. Slashing may occur depending on the repeated offenses and how many other validators\nwere unresponsive or offline during the epoch.'),(0,o.kt)("p",null,"Validators should have a well-architected network infrastructure to ensure the node runs to reduce\nthe risk of slashing or chilling. A high availability setup is desirable, preferably with backup\nnodes that kick in ",(0,o.kt)("strong",{parentName:"p"},"only once the original node is verifiably offline")," (to avoid double-signing\nand being slashed for equivocation - see below). A comprehensive guide on validator setup is\navailable ",(0,o.kt)("a",{parentName:"p",href:"/docs/maintain-guides-secure-validator"},"here"),"."),(0,o.kt)("p",null,"Here is the formula for calculating slashing due to unresponsiveness:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"Let x = offenders, n = total no. validators in the active set\n\nmin((3 * (x - (n / 10 + 1))) / n, 1) * 0.07\n")),(0,o.kt)("p",null,"The examples demonstrate how to calculate the slashing penalty for unresponsiveness."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In all of the examples, assume that there are 100 validators in the active set.")),(0,o.kt)("p",null,"No slashing would enact if < 10% of all validators are unresponsive."),(0,o.kt)("p",null,"For example, if exactly 10 validators were unresponsive, the expression 3 ",(0,o.kt)("em",{parentName:"p"}," (x - (n / 10 + 1))) / n\nwould be 3 ")," (10 - (100 / 10 + 1)) / 100 = 3 ","*"," (10 - (10 + 1)) / 100 = -0.03 which is rounded to 0."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"The minimum value between 0 and 1 is 0. 0 multiplied by 0.07 is 0.")),(0,o.kt)("p",null,"If 14 validators are unresponsive, then slashing would occur, as > 10% of validators are\nunresponsive."),(0,o.kt)("p",null,"The slashing penalty would be min((3 ",(0,o.kt)("em",{parentName:"p"}," (14 - (100 / 10 + 1))) / 100, 1) ")," 0.07 = min((3 ",(0,o.kt)("em",{parentName:"p"}," (14 -\n11))/100, 1) ")," 0.07 = min(0.09, 1) ","*"," 0.07 = 0.6%"),(0,o.kt)("p",null,"Similarly, if one-third of the validator set (around 33/100) are unresponsive, the slashing penalty\nwould be about 5%."),(0,o.kt)("p",null,"The maximum slashing that can occur due to unresponsiveness is 7%. After around 45% of the\nvalidators go offline, the expression 3 ",(0,o.kt)("em",{parentName:"p"}," (x - (n / 10 + 1))) / n will go beyond 1. Hence, min((3 "),"\n(x - (n / 10 + 1))) / n, 1) ","*"," 0.07 will be ceiled to 7%."),(0,o.kt)("h3",{id:"equivocation"},"Equivocation"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"GRANDPA Equivocation"),": A validator signs two or more votes in the same round on different chains."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"BABE Equivocation"),": A validator produces two or more blocks on the Relay Chain in the same time\nslot."),(0,o.kt)("p",null,"Both GRANDPA and BABE equivocation use the same formula for calculating the slashing penalty:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"Let x = offenders, n = total no. validators in the active set\n\nmin( (3 * x / n )^2, 1)\n")),(0,o.kt)("p",null,"As an example, assume that there are 100 validators in the active set, and one of them equivocates\nin a slot (for our purposes, it does not matter whether it was a BABE or GRANDPA equivocation). This\nis unlikely 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)."),(0,o.kt)("p",null,"Now assume that there is a group running several validators, and all of them have an issue in the\nsame slot. The penalty would be min((3 ","*"," 5 / 100)^2, 1) = 0.0225, or a 2.25% slash. If 20\nvalidators equivocate, this is a much more serious offense and possibly indicates a coordinated\nattack on the network, and so the slash will be much greater - min((3 ","*"," 20 / 100)^2, 1) = 0.36, or\na 36% slash on all of these validators and their nominators. All slashed validators will also be\nchilled."),(0,o.kt)("p",null,"From the example above, the risk of nominating or running many validators in the active set are\napparent. While rewards grow linearly (two validators will get you approximately twice as many\nstaking rewards as one), slashing grows exponentially. A single validator equivocating causes a\n0.09% slash, two validators equivocating does not cause a 0.09 ","*"," 2 = 0.18% slash, but rather a\n0.36% slash - 4x as much as the single validator."),(0,o.kt)("p",null,"Validators may run their nodes on multiple machines to make sure they can still perform validation\nwork in case one of their nodes goes down, but validator operators should be extremely careful in\nsetting these up. If they do not have good coordination to manage signing machines, equivocation is\npossible, and equivocation offenses are slashed at much higher rates than equivalent offline\noffenses."),(0,o.kt)("p",null,"If a validator is reported for any one of the offenses they will be removed from the validator set\n(",(0,o.kt)("a",{parentName:"p",href:"#chilling"},"chilled"),") and they will not be paid while they are out. They will be considered\ninactive immediately and will lose their nominators. They need to re-issue intent to validate and\nagain gather support from nominators."),(0,o.kt)("h3",{id:"slashing-across-eras"},"Slashing Across Eras"),(0,o.kt)("p",null,"There are 3 main difficulties to account for with slashing in NPoS:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"A nominator can nominate multiple validators and be slashed via any of them."),(0,o.kt)("li",{parentName:"ul"},"Until slashed, the stake is reused from era to era. Nominating with N coins for E eras in a row\ndoes not mean you have N","*","E coins to be slashed - you've only ever had N."),(0,o.kt)("li",{parentName:"ul"},"Slashable offenses can be found after the fact and out of order.")),(0,o.kt)("p",null,"To balance this, we only slash for the maximum slash a participant can receive in some time period,\nrather than the sum. This ensures protection from overslashing. Likewise, the period over which\nmaximum slashes are computed is finite and the validator is chilled with nominations withdrawn after\na slashing event, as stated in the previous section. This prevents rage-quit attacks in which, once\ncaught misbehaving, a participant deliberately misbehaves more because their slashing amount is\nalready maxed out."),(0,o.kt)("h2",{id:"simple-payouts"},"Simple Payouts"),(0,o.kt)("p",null,"Polkadot makes stakers claim their rewards for\npast eras by submitting a transaction. This naturally leads to spreading out reward distribution, as\npeople make transactions at disparate times, rather than updating the accounts of all stakers in a\nsingle block."),(0,o.kt)("p",null,"Even 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."),(0,o.kt)("p",null,"Simple payouts require one transaction per validator, per ",(0,o.kt)("a",{parentName:"p",href:"/docs/glossary##era"},"era"),", to\nclaim rewards. The reason Polkadot requires\nthis is to avoid an attack where someone has several thousand accounts nominating a single\nvalidator. The major cost in reward distribution is mutating the accounts in storage, and\nPolkadot cannot pay out several thousand\naccounts in a single transaction."),(0,o.kt)("h3",{id:"claiming-rewards"},"Claiming Rewards"),(0,o.kt)("p",null,"Polkadot stores the last 84 eras of reward\ninformation (e.g. maps of era number to validator points, staking rewards, nomination exposure,\netc.). Rewards will not be claimable more than 84 eras after they were earned. This means that all\nrewards must be claimed within a maximum of 84 eras, although under certain circumstances (described\nbelow) this may be as low as 28 eras."),(0,o.kt)("p",null,"If 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."),(0,o.kt)("admonition",{title:"Advanced How-to Guides",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"In order to be absolutely sure that staking rewards can be claimed, users should trigger a payout\nbefore 28 eras have passed. See\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-guides-staking#claiming-rewards-with-the-polkadot-js-ui"},"this page")," for more information\nabout how to claim rewards using the Polkadot-JS UI.")),(0,o.kt)("h3",{id:"faq-and-cautionary-notes"},"FAQ and Cautionary Notes"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Rewards expire after 84 eras. On Polkadot, that's about 84 days. On Kusama, it is approximately\n21 days. Validators should claim all pending rewards before killing their stash in the event the\nvalidator decides to ",(0,o.kt)("inlineCode",{parentName:"li"},"chill")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"unbonds all")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"withdraws unbonded"),". Nominators will not miss\nout on rewards if they claim the pending rewards for a validator within 28 days. Essentially, the\ndeadline to ensure you get staking rewards is 28 eras. If the validator verifies its intent and\ndoes not unbond and withdraw, the 84 era timeline holds."),(0,o.kt)("li",{parentName:"ol"},"Claiming rewards (or neglecting to claim rewards) does not affect nominations in any way.\nNominations will persist after claiming rewards or after the rewards expire."),(0,o.kt)("li",{parentName:"ol"},'Rewards are not minted until they are claimed. Therefore, if your reward destination is "stash,\nincreasing amount at stake", then your staked amount does not reflect your rewards until you\nclaim them. If you want to maximize compounding, then you will need to claim often or nominate\nvalidators which regularly claim for you.'),(0,o.kt)("li",{parentName:"ol"},"Staking operations at the end of an era are closed to allow the off-chain validator election to\ntake place. See ",(0,o.kt)("a",{parentName:"li",href:"/docs/learn-phragmen#off-chain-phragmen"},"Off-chain Phragm\xe9n")," for more information.")),(0,o.kt)("h2",{id:"staking-miner"},"Staking Miner"),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"The staking-miner code is experimental and it is still in the development phase. Use is at your own\ndiscretion, as there is a risk of losing some funds.")),(0,o.kt)("p",null,"At the end of each era on Polkadot and Kusama, using ",(0,o.kt)("a",{parentName:"p",href:"learn-phragmen"},"NPoS"),', 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',(0,o.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/how-to-guides/offchain-workers/"},"off-chain workers")," 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\xe9n 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",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced#deposit-and-reward-mechanics"},"The bond and the fee")," are lost if the\nsolution is invalid."),(0,o.kt)("p",null,"Staking miner uses a pallet called ",(0,o.kt)("inlineCode",{parentName:"p"},"pallet_election_provider_multi_phase")," and can only produce\nsolutions during the\n",(0,o.kt)("a",{parentName:"p",href:"https://crates.parity.io/pallet_election_provider_multi_phase/index.html#signed-phase"},(0,o.kt)("inlineCode",{parentName:"a"},"SignedPhase")),"\nof the pallet's life cycle. Once the ",(0,o.kt)("inlineCode",{parentName:"p"},"SignedPhase")," is over and the\n",(0,o.kt)("a",{parentName:"p",href:"https://crates.parity.io/pallet_election_provider_multi_phase/index.html#unsigned-phase"},(0,o.kt)("inlineCode",{parentName:"a"},"UnsignedPhase")),"\nstarts, only the off-chain workers can provide election results."),(0,o.kt)("p",null,"Running 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."),(0,o.kt)("h3",{id:"npos-election-optimization"},"NPoS election optimization"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NPoS election optimization",src:a(83471).Z,width:"1868",height:"804"})),(0,o.kt)("p",null,"A 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\xe9n with a\nconfigurable number of balancing iterations that improve the score."),(0,o.kt)("h3",{id:"signed-phase-of-the-election-pallet"},"Signed Phase of the election pallet"),(0,o.kt)("p",null,"The election provider pallet ",(0,o.kt)("inlineCode",{parentName:"p"},"pallet_election_provider_multi_phase")," is divided into two phases,\n",(0,o.kt)("strong",{parentName:"p"},"signed")," and ",(0,o.kt)("strong",{parentName:"p"},"unsigned"),". At the end of the pallet's timeline, the function ",(0,o.kt)("inlineCode",{parentName:"p"},"elect()")," is called."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"}," elect()\n + <--T::SignedPhase--\x3e + <--T::UnsignedPhase--\x3e +\n +-------------------------------------------------------------------+\n Phase::Off + Phase::Signed + Phase::Unsigned +\n")),(0,o.kt)("p",null,"Solutions provided by the staking miner can only be submitted during the signed phase. Solutions are\nsubmitted and queued on the chain as a ",(0,o.kt)("inlineCode",{parentName:"p"},"RawSolution"),". Once submitted, a solution cannot be retracted\nby the originating account."),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"RawSolution")," struct definition:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"pub struct RawSolution {\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")),(0,o.kt)("p",null,"A maximum of ",(0,o.kt)("inlineCode",{parentName:"p"},"pallet::Config::SignedMaxSubmissions")," will be stored on-chain and they will be sorted\nbased on score. Higher the score the more optimal the election solution is. On both Polkadot and\nKusama the\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/blob/f610ffc05876d4b98a14cee245b4cc27bd3c0c15/runtime/polkadot/src/lib.rs#L390"},"'SignedMaxSubmissions'"),"\nis set to\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.signedMaxSubmissions",defaultValue:16,mdxType:"RPC"}),"\n","\nsubmissions. This variable can be modified if needed through governance."),(0,o.kt)("p",null,"Upon arrival of a new solution:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"If the queue is not full, it is stored in the appropriate sorted index."),(0,o.kt)("li",{parentName:"ol"},"If the queue is full but the submitted solution is better than one of the queued ones, the worse\nsolution is discarded, the deposit of the outgoing solution is returned, and the new solution is\nstored in the correct index."),(0,o.kt)("li",{parentName:"ol"},"If the queue is full and the solution is not an improvement compared to any of the queued ones,\nit is instantly rejected and no deposit is reserved.")),(0,o.kt)("p",null,"Upon the end of the ",(0,o.kt)("inlineCode",{parentName:"p"},"SignedPhase"),", no more solutions can be submitted and the solutions in the queue\nwill be checked using\n",(0,o.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_election_provider_multi_phase/pallet/struct.Pallet.html#method.feasibility_check"},(0,o.kt)("inlineCode",{parentName:"a"},"Pallet::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",(0,o.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/f2bc08a3071a91b71fec63cf2b22c707411cec0e/frame/election-provider-multi-phase/src/signed.rs#L453-L474"},(0,o.kt)("inlineCode",{parentName:"a"},"finalize_signed_phase_accept_solution")),"\nwhich reward account associated with the winning solution."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"Queue\n+-------------------------------+\n|Solution(score=20, valid=false)| +--\x3e Slashed\n+-------------------------------+\n|Solution(score=15, valid=true )| +--\x3e Rewarded, Saved\n+-------------------------------+\n|Solution(score=10, valid=true )| +--\x3e Discarded\n+-------------------------------+\n|Solution(score=05, valid=false)| +--\x3e Discarded\n+-------------------------------+\n| None |\n+-------------------------------+\n")),(0,o.kt)("h3",{id:"deposit-and-reward-mechanics"},"Deposit and reward mechanics"),(0,o.kt)("p",null,"The staking miners are required to pay a deposit to post their solutions. Deposit amount is the sum\nof ",(0,o.kt)("inlineCode",{parentName:"p"},"SignedDepositBase")," +",(0,o.kt)("inlineCode",{parentName:"p"},"SignedDepositByte")," + ",(0,o.kt)("inlineCode",{parentName:"p"},"SignedDepositWeight"),". All good solutions are subject\nto receiving a ",(0,o.kt)("inlineCode",{parentName:"p"},"SignedRewardBase"),"."),(0,o.kt)("h4",{id:"deposit"},"Deposit"),(0,o.kt)("p",null,"Current deposit(",(0,o.kt)("inlineCode",{parentName:"p"},"SignedDepositBase"),") is\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.signedDepositBase",defaultValue:4e11,filter:"humanReadable",mdxType:"RPC"}),"\n","\nwhich is a fixed amount."),(0,o.kt)("p",null,"Current deposit per byte(",(0,o.kt)("inlineCode",{parentName:"p"},"SignedDepositByte"),") is\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.signedDepositByte",defaultValue:97656,filter:"precise",mdxType:"RPC"}),"\n","\nand the total is variable depending on the size of the solution data. For example, a solution\nweighing 200KB would yield 200 x 0.0000097656 = ",(0,o.kt)("strong",{parentName:"p"},"0.00195312 DOT"),".\n",""),(0,o.kt)("p",null,"And the weight deposit(",(0,o.kt)("inlineCode",{parentName:"p"},"SignedDepositWeight"),") is currently set to ",(0,o.kt)("inlineCode",{parentName:"p"},"0")," and has no effect."),(0,o.kt)("h4",{id:"reward"},"Reward"),(0,o.kt)("p",null,"Current reward(",(0,o.kt)("inlineCode",{parentName:"p"},"SignedRewardBase"),") is\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.signedRewardBase",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),"\n","\nwhich is a fixed amount."),(0,o.kt)("h3",{id:"further-resources"},"Further Resources"),(0,o.kt)("p",null,"If you want to run a staking miner on your validator, refer to the repository provided in the\nresources section below."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/paritytech/staking-miner-v2"},"Staking Miner repository")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://crates.parity.io/pallet_election_provider_multi_phase/index.html"},"Election Pallet definition")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/paritytech/polkadot-sdk/blob/f610ffc05876d4b98a14cee245b4cc27bd3c0c15/runtime/polkadot/src/lib.rs#L389:L397"},"Signed phase parameter configuration on Polkadot"))))}k.isMDXComponent=!0},71842:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/bags-list-example-0-6836e3658c32484103ffcd06d6372427.png"},79098:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/bags-list-example-1-6aeffdb212b7af723f00e38b40780dcc.png"},86983:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/bags-list-example-2-aec08a8679a23e697f416374cbcdf735.png"},54258:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/bags-list-example-3-08c2b290f95e036e026f667fca527704.png"},83471:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/NPoS-election-optimization-3ef1b7bd0a99f64c4198511b4216989d.png"},56789:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/stash-vs-stash-and-staking-proxy-2104e1a23d5c29821cec15fb9b67eba5.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/41b7b3e8.983042f3.js b/assets/js/41b7b3e8.983042f3.js deleted file mode 100644 index 4a23ab0bf0be..000000000000 --- a/assets/js/41b7b3e8.983042f3.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[3513],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>p});var n=a(74165),i=a(15861),o=a(67294),s=a(87152),r=a(17145),l=a(67425);function d(e,t,a){return h.apply(this,arguments)}function h(){return(h=(0,i.Z)((0,n.Z)().mark((function e(t,a,i){var o,l,d,h,c;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:o=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return o="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return o="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return o="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return o="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==o){e.next=18;break}return e.abrupt("return");case 18:return d=new s.U(o),e.next=21,r.G.create({provider:d});case 21:h=e.sent,(c=a.split(".")).forEach((function(e){e in h&&(h=h[e])})),e.t1=c[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=h.toString(),e.abrupt("break",35);case 29:return e.next=31,h();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function c(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(e){var t=e.network,a=e.path,s=e.defaultValue,r=e.filter,l=void 0===r?void 0:r,h=(0,o.useState)(""),p=h[0],m=h[1];return t=t.toLowerCase(),(0,o.useEffect)((function(){void 0!==l?c(s.toString(),l,t,m):m(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var o=function(){var e=(0,i.Z)((0,n.Z)().mark((function e(){var i;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t,a,m);case 2:if(void 0!==(i=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?c(i,l,t,m):m(i);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{o()}catch(r){console.log(r)}}}),[]),p}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var i=void 0;if("polkadot"===a||"statemint"===a)i=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");i=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(i)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},84358:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>k,frontMatter:()=>l,metadata:()=>h,toc:()=>p});var n=a(87462),i=a(63366),o=(a(67294),a(3905)),s=a(47940),r=["components"],l={id:"learn-staking-advanced",title:"Advanced Staking Concepts",sidebar_label:"Advanced Staking Concepts",description:"Advanced Concepts about Staking on Polkadot.",keywords:["staking","stake","nominate","nominating","NPoS","proxies","payouts","simple payouts","rewards","staking miner","phragm\xe9n"],slug:"../learn-staking-advanced"},d=void 0,h={unversionedId:"learn/learn-staking-advanced",id:"learn/learn-staking-advanced",title:"Advanced Staking Concepts",description:"Advanced Concepts about Staking on Polkadot.",source:"@site/../docs/learn/learn-staking-advanced.md",sourceDirName:"learn",slug:"/learn-staking-advanced",permalink:"/docs/learn-staking-advanced",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-staking-advanced.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696928140,formattedLastUpdatedAt:"Oct 10, 2023",frontMatter:{id:"learn-staking-advanced",title:"Advanced Staking Concepts",sidebar_label:"Advanced Staking Concepts",description:"Advanced Concepts about Staking on Polkadot.",keywords:["staking","stake","nominate","nominating","NPoS","proxies","payouts","simple payouts","rewards","staking miner","phragm\xe9n"],slug:"../learn-staking-advanced"},sidebar:"docs",previous:{title:"Accounts",permalink:"/docs/learn-account-advanced"},next:{title:"NFT Pallets",permalink:"/docs/learn-nft-pallets"}},c={},p=[{value:"Staking Proxies",id:"staking-proxies",level:2},{value:"Bags List",id:"bags-list",level:2},{value:"Rewards Distribution",id:"rewards-distribution",level:2},{value:"Oversubscription, Commission Fees & Slashes",id:"oversubscription-commission-fees--slashes",level:4},{value:"Slashing",id:"slashing",level:2},{value:"Unresponsiveness",id:"unresponsiveness",level:3},{value:"Equivocation",id:"equivocation",level:3},{value:"Slashing Across Eras",id:"slashing-across-eras",level:3},{value:"Simple Payouts",id:"simple-payouts",level:2},{value:"Claiming Rewards",id:"claiming-rewards",level:3},{value:"FAQ and Cautionary Notes",id:"faq-and-cautionary-notes",level:3},{value:"Staking Miner",id:"staking-miner",level:2},{value:"NPoS election optimization",id:"npos-election-optimization",level:3},{value:"Signed Phase of the election pallet",id:"signed-phase-of-the-election-pallet",level:3},{value:"Deposit and reward mechanics",id:"deposit-and-reward-mechanics",level:3},{value:"Deposit",id:"deposit",level:4},{value:"Reward",id:"reward",level:4},{value:"Further Resources",id:"further-resources",level:3}],m={toc:p},u="wrapper";function k(e){var t=e.components,l=(0,i.Z)(e,r);return(0,o.kt)(u,(0,n.Z)({},m,l,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("admonition",{title:"New to Staking?",type:"tip"},(0,o.kt)("p",{parentName:"admonition"},"Start your staking journey or explore more information about staking on\n",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.network/staking/"},"Polkadot's Home Page"),". Discover the new\n",(0,o.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/#/overview"},"Staking Dashboard")," that makes staking much easier and\ncheck this\n",(0,o.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182104"},"extensive article list")," to\nhelp you get started. You can now stake on\nPolkadot natively with just\n",(0,o.kt)(s.Z,{network:"polkadot",path:"query.nominationPools.minJoinBond",filter:"humanReadable",defaultValue:1e10,mdxType:"RPC"}),"\n","\nand earn staking rewards. For additional information, check out\n",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/nomination-pools-are-live-stake-natively-with-just-1-dot/"},"this blog post"),".")),(0,o.kt)("p",null,"This page is meant to be an advanced guide to staking with\nPolkadot. For a more general introduction,\ncheckout the ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-staking"},"Introduction to Staking")," page."),(0,o.kt)("h2",{id:"staking-proxies"},"Staking Proxies"),(0,o.kt)("p",null,"Polkadot makes it possible to create accounts\nhaving special permissions also called ",(0,o.kt)("strong",{parentName:"p"},"proxy accounts"),". For mode details about proxy accounts\nvisit the ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-proxies"},"dedicated page")," on this wiki."),(0,o.kt)("p",null,"Proxy accounts are special accounts which can sign\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-extrinsics/#pallets-and-extrinsics"},(0,o.kt)("strong",{parentName:"a"},"extrinsic calls"))," made to specific ",(0,o.kt)("strong",{parentName:"p"},"pallets")," on\nbehalf of the proxied account. There is thus the possibility to create staking proxy accounts that\ncan be used to sign extrinsic calls specific to the staking, session and utility pallets."),(0,o.kt)("p",null,"Staking on Polkadot is not a set-and-forget\naction, as a nominator you will need to monitor the performance of your validators and make changes\nif needed. There will be this transactions such as nominating that will be needed to regularly\nsigned. Each time you sign with an account, in the case of hot accounts, you expose the private key\nof that account to the internet with consequent risk of attack. A hot stash will be exposed all the\ntime a transaction is signed. Even in the case of a cold stash created with a Ledger device, signing\nwith the stash will build a transaction history that might tell something about your habits and\npreferences, or even your location."),(0,o.kt)("p",null,"Ideally, 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 staking transaction history will be built by the proxy."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"stash-stakingProxy",src:a(56789).Z,width:"1920",height:"800"})),(0,o.kt)("p",null,"For 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."),(0,o.kt)("p",null,"It is important to remember that actions that can be performed by the proxy accounts are limited,\nand in the case of staking proxy, extrinsic calls to the balances pallet cannot be signed. This\nmeans it is not possible to do balance transfers on the proxied account through a staking proxy."),(0,o.kt)("p",null,"Note that to change the staking proxy you will need to sign with the stash or an ",(0,o.kt)("em",{parentName:"p"},"any")," proxy."),(0,o.kt)("h2",{id:"bags-list"},"Bags List"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"On Polkadot and Kusama, the instance of the pallet\n",(0,o.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_bags_list/"},"Bags-List")," is named as\n'voterList'."),(0,o.kt)("p",{parentName:"admonition"},"For a demo about bags list see ",(0,o.kt)("a",{parentName:"p",href:"https://youtu.be/hIIZRJLrBZA"},"this video tutorial"),".")),(0,o.kt)("p",null,"In Polkadot's NPoS nomination intents are\nplaced in a semi-sorted list called ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/pull/9507"},"bags-list"),".\nThe\nBags-List substrate pallet is designed to be self-maintaining, with minimal effort from the\nblockchain, making it extremely scalable. The bags list has two primary components, bags and nodes\n(or nominators' accounts), with bags containing the nodes with bonded balance within a specific\nrange. In the figure below the 1st empty bag will contain nominators whose bonded balance is in the\nrange of 21 - 30 DOT, the 2nd bag 11 - 20 DOT, and the 3rd bag 0-10 DOT. The nomination intents are\nthe nominators' accounts with bonded tokens (in the example shown below, there are eight nomination\nintents) that will be put inside each of those three bags depending on their stake."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"bags list example 0",src:a(71842).Z,width:"1920",height:"800"})),(0,o.kt)("p",null,"The 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, but 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 yellow circle). The same scenario\napplies for the node with 8 DOT (green circle) in the 3rd bag. Placing the node above all nodes with\na lesser stake requires an additional step (more on this later)."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"bags list example 1",src:a(79098).Z,width:"1920",height:"800"})),(0,o.kt)("p",null,"The mentioned two nodes (19 DOT and 8 DOT) have the option to move up in their respective bags,\nwhich can put them in front of the nodes with less stake than them (see figure below). This action\nmust be done manually by submitting the ",(0,o.kt)("inlineCode",{parentName:"p"},"putInFrontOf")," extrinsic within the ",(0,o.kt)("inlineCode",{parentName:"p"},"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 ",(0,o.kt)("inlineCode",{parentName:"p"},"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).'),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"bags list example 2",src:a(86983).Z,width:"1920",height:"800"})),(0,o.kt)("p",null,"If 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 automatically. 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 ",(0,o.kt)("inlineCode",{parentName:"p"},"rebag")," within the ",(0,o.kt)("inlineCode",{parentName:"p"},"voterList")," pallet instance to update the positions of\nthe nodes that do not belong to their bag and place them in the correct one. To reiterate, actions\nlike bonding/unbonding tokens automatically rebag the nominator node, but events like staking\nrewards/slashing do not. See the ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-nominator#bags-list"},"bags-list")," section for more\ninformation."),(0,o.kt)("p",null,"The bags-list is capable of including an unlimited number of nodes, subject to the chain's runtime\nstorage. In the current staking system configuration, the bags list keeps\n",(0,o.kt)(s.Z,{network:"polkadot",path:"query.staking.maxNominatorsCount",defaultValue:5e4,mdxType:"RPC"}),"\n","\nnomination intents, of which, at most\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.maxElectingVoters",defaultValue:22500,mdxType:"RPC"}),"\n","\ncome out as the electing nominators. See\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-nominator#staking-election-stages"},"Staking Election Stages")," section for more info."),(0,o.kt)("p",null,"This means that only a portion of the nomination intents is kept. Once the nomination period ends,\nthe NPoS election system takes all nomination intents and their associated votes as input, and it\noutputs a set of validators. The bags are iterated from the most staked to the least staked. If the\naccounts are not appropriately sorted, this could leave the last touched bag to only be partially\niterated. Thus, in some edge cases, the order of the members within a bag is important. Continuing\nwith the example used in the previous figures, there are 8 nomination intents of which only 7 will\nbe kept. If the bags list stays semi-sorted (i.e. no accounts call the ",(0,o.kt)("inlineCode",{parentName:"p"},"putInFrontOf")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"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. The sorting\nfunctionality of nomination intents using bags is extremely important for the\n",(0,o.kt)("a",{parentName:"p",href:"https://gist.github.com/kianenigma/aa835946455b9a3f167821b9d05ba376"},"long-term improvements")," of the\nstaking/election system."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"bags list example 3",src:a(54258).Z,width:"1920",height:"800"})),(0,o.kt)("admonition",{title:"Minimum active nomination threshold to earn rewards is dynamic",type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Submitting a nomination intent does not guarantee staking rewards. The stake of the top\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.maxElectingVoters",defaultValue:22500,mdxType:"RPC"}),"\n","\nnominators is applied to the validators in the active set. To avail of staking rewards, ensure that\nthe number of tokens bonded is higher than the minimum active bond. For more information, see the\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-nominator"},"nominator guide"),".")),(0,o.kt)("p",null,'The "election solution" which is a connected graph between nominators and validators with the stake\nas edge weights, has to meet certain requirements, such as maximizing the amount of stake to\nnominate validators and distributing the stake backing validators as evenly as possible. The\nobjectives of this election mechanism are to maximize the security of the network, 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',(0,o.kt)("a",{parentName:"p",href:"http://research.web3.foundation/en/latest/polkadot/NPoS.html"},"here"),"."),(0,o.kt)("h2",{id:"rewards-distribution"},"Rewards Distribution"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"The general rule for rewards across validators is that two validators get paid essentially the same\namount of tokens for equal work, i.e. they are not paid proportional to their total stakes. There is\na probabilistic component to staking rewards in the form of\n",(0,o.kt)("a",{parentName:"p",href:"/docs/maintain-guides-validator-payout##era-points"},"era points")," and\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-transaction-fees#fee-calculation"},"tips")," but these should average out over time.")),(0,o.kt)("p",null,"Validators 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."),(0,o.kt)("p",null,"Before 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."),(0,o.kt)("p",null,"For example, assume the block reward for a validator is 10 DOT. A validator may specify\n",(0,o.kt)("inlineCode",{parentName:"p"},"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."),(0,o.kt)("p",null,"Thus, 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."),(0,o.kt)("p",null,"The following example should clarify the above. For simplicity, we have the following assumptions:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"These validators do not have a stake of their own."),(0,o.kt)("li",{parentName:"ul"},"They each receive the same number of era points."),(0,o.kt)("li",{parentName:"ul"},"There are no tips for any transactions processed."),(0,o.kt)("li",{parentName:"ul"},"They do NOT charge any commission fees."),(0,o.kt)("li",{parentName:"ul"},"Total reward amount is 100 DOT tokens."),(0,o.kt)("li",{parentName:"ul"},"The current minimum amount of DOT to be a validator is 350 (note that this is ",(0,o.kt)("em",{parentName:"li"},"not")," the actual\nvalue, which fluctuates, but merely an assumption for purposes of this example; to understand how\nthe actual minimal stake is calculated, see\n",(0,o.kt)("a",{parentName:"li",href:"/docs/faq#what-is-the-minimum-stake-necessary-to-be-elected-as-an-active-validator"},"here"),").")),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:"center"}),(0,o.kt)("th",{parentName:"tr",align:"center"},(0,o.kt)("strong",{parentName:"th"},"Validator A")),(0,o.kt)("th",{parentName:"tr",align:"center"}),(0,o.kt)("th",{parentName:"tr",align:"center"}))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},"Nominator (4)"),(0,o.kt)("td",{parentName:"tr",align:"center"},"Stake (600)"),(0,o.kt)("td",{parentName:"tr",align:"center"},"Fraction of the Total Stake"),(0,o.kt)("td",{parentName:"tr",align:"center"},"Rewards")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},"Jin"),(0,o.kt)("td",{parentName:"tr",align:"center"},"100"),(0,o.kt)("td",{parentName:"tr",align:"center"},"0.167"),(0,o.kt)("td",{parentName:"tr",align:"center"},"16.7")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},(0,o.kt)("strong",{parentName:"td"},"Sam")),(0,o.kt)("td",{parentName:"tr",align:"center"},"50"),(0,o.kt)("td",{parentName:"tr",align:"center"},"0.083"),(0,o.kt)("td",{parentName:"tr",align:"center"},"8.3")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},"Anson"),(0,o.kt)("td",{parentName:"tr",align:"center"},"250"),(0,o.kt)("td",{parentName:"tr",align:"center"},"0.417"),(0,o.kt)("td",{parentName:"tr",align:"center"},"41.7")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},"Bobby"),(0,o.kt)("td",{parentName:"tr",align:"center"},"200"),(0,o.kt)("td",{parentName:"tr",align:"center"},"0.333"),(0,o.kt)("td",{parentName:"tr",align:"center"},"33.3")))),(0,o.kt)("table",null,(0,o.kt)("thead",{parentName:"table"},(0,o.kt)("tr",{parentName:"thead"},(0,o.kt)("th",{parentName:"tr",align:"center"}),(0,o.kt)("th",{parentName:"tr",align:"center"},(0,o.kt)("strong",{parentName:"th"},"Validator B")),(0,o.kt)("th",{parentName:"tr",align:"center"}),(0,o.kt)("th",{parentName:"tr",align:"center"}))),(0,o.kt)("tbody",{parentName:"table"},(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},"Nominator (4)"),(0,o.kt)("td",{parentName:"tr",align:"center"},"Stake (400)"),(0,o.kt)("td",{parentName:"tr",align:"center"},"Fraction of the Total Stake"),(0,o.kt)("td",{parentName:"tr",align:"center"},"Rewards")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},"Alice"),(0,o.kt)("td",{parentName:"tr",align:"center"},"100"),(0,o.kt)("td",{parentName:"tr",align:"center"},"0.25"),(0,o.kt)("td",{parentName:"tr",align:"center"},"25")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},"Peter"),(0,o.kt)("td",{parentName:"tr",align:"center"},"100"),(0,o.kt)("td",{parentName:"tr",align:"center"},"0.25"),(0,o.kt)("td",{parentName:"tr",align:"center"},"25")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},"John"),(0,o.kt)("td",{parentName:"tr",align:"center"},"150"),(0,o.kt)("td",{parentName:"tr",align:"center"},"0.375"),(0,o.kt)("td",{parentName:"tr",align:"center"},"37.5")),(0,o.kt)("tr",{parentName:"tbody"},(0,o.kt)("td",{parentName:"tr",align:"center"},(0,o.kt)("strong",{parentName:"td"},"Kitty")),(0,o.kt)("td",{parentName:"tr",align:"center"},"50"),(0,o.kt)("td",{parentName:"tr",align:"center"},"0.125"),(0,o.kt)("td",{parentName:"tr",align:"center"},"12.5")))),(0,o.kt)("p",null,(0,o.kt)("em",{parentName:"p"},"Both validators A & B have 4 nominators with a total stake 600 and 400 respectively.")),(0,o.kt)("p",null,"Based 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."),(0,o.kt)("p",null,"To estimate how many tokens you can get each month as a nominator or validator, you can use this\n",(0,o.kt)("a",{parentName:"p",href:"https://www.stakingrewards.com/earn/polkadot/calculate"},"tool")," 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."),(0,o.kt)("h4",{id:"oversubscription-commission-fees--slashes"},"Oversubscription, Commission Fees & Slashes"),(0,o.kt)("p",null,"There is an additional factor to consider in terms of rewards. While there is no limit to the number\nof nominators a validator may have, a validator does have a limit to how many nominators to which it\ncan pay rewards. In Polkadot this limit is\ncurrently\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),",\n","\nalthough this can be modified via runtime upgrade. A validator with more than\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n","\nnominators is ",(0,o.kt)("em",{parentName:"p"},"oversubscribed"),". When payouts occur, only the top\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n",'\nnominators as measured by the amount of stake allocated to that validator will receive rewards. All\nother nominators are essentially "wasting" their stake - they used their nomination to elect that\nvalidator to the active stake, but receive no rewards in exchange for doing so.'),(0,o.kt)("p",null,"Note that the network slashes a validator for a misbehavior (e.g. validator offline, equivocation,\netc.) the slashed amount is a fixed percentage (and not a fixed amount), which means that validators\nwith more stake get slashed more DOT. Again, this is done to provide nominators with an economic\nincentive to shift their preferences and back less popular validators whom they consider to be\ntrustworthy."),(0,o.kt)("p",null,"Also, 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)."),(0,o.kt)("h2",{id:"slashing"},"Slashing"),(0,o.kt)("h3",{id:"unresponsiveness"},"Unresponsiveness"),(0,o.kt)("p",null,'For every session, validators will send an "I\'m online" heartbeat to indicate they are live. If a\nvalidator produces no blocks during an epoch and fails to send the heartbeat, it will be reported as\nunresponsive. Slashing may occur depending on the repeated offenses and how many other validators\nwere unresponsive or offline during the epoch.'),(0,o.kt)("p",null,"Validators should have a well-architected network infrastructure to ensure the node runs to reduce\nthe risk of slashing or chilling. A high availability setup is desirable, preferably with backup\nnodes that kick in ",(0,o.kt)("strong",{parentName:"p"},"only once the original node is verifiably offline")," (to avoid double-signing\nand being slashed for equivocation - see below). A comprehensive guide on validator setup is\navailable ",(0,o.kt)("a",{parentName:"p",href:"/docs/maintain-guides-secure-validator"},"here"),"."),(0,o.kt)("p",null,"Here is the formula for calculating slashing due to unresponsiveness:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"Let x = offenders, n = total no. validators in the active set\n\nmin((3 * (x - (n / 10 + 1))) / n, 1) * 0.07\n")),(0,o.kt)("p",null,"The examples demonstrate how to calculate the slashing penalty for unresponsiveness."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"In all of the examples, assume that there are 100 validators in the active set.")),(0,o.kt)("p",null,"No slashing would enact if < 10% of all validators are unresponsive."),(0,o.kt)("p",null,"For example, if exactly 10 validators were unresponsive, the expression 3 ",(0,o.kt)("em",{parentName:"p"}," (x - (n / 10 + 1))) / n\nwould be 3 ")," (10 - (100 / 10 + 1)) / 100 = 3 ","*"," (10 - (10 + 1)) / 100 = -0.03 which is rounded to 0."),(0,o.kt)("admonition",{type:"note"},(0,o.kt)("p",{parentName:"admonition"},"The minimum value between 0 and 1 is 0. 0 multiplied by 0.07 is 0.")),(0,o.kt)("p",null,"If 14 validators are unresponsive, then slashing would occur, as > 10% of validators are\nunresponsive."),(0,o.kt)("p",null,"The slashing penalty would be min((3 ",(0,o.kt)("em",{parentName:"p"}," (14 - (100 / 10 + 1))) / 100, 1) ")," 0.07 = min((3 ",(0,o.kt)("em",{parentName:"p"}," (14 -\n11))/100, 1) ")," 0.07 = min(0.09, 1) ","*"," 0.07 = 0.6%"),(0,o.kt)("p",null,"Similarly, if one-third of the validator set (around 33/100) are unresponsive, the slashing penalty\nwould be about 5%."),(0,o.kt)("p",null,"The maximum slashing that can occur due to unresponsiveness is 7%. After around 45% of the\nvalidators go offline, the expression 3 ",(0,o.kt)("em",{parentName:"p"}," (x - (n / 10 + 1))) / n will go beyond 1. Hence, min((3 "),"\n(x - (n / 10 + 1))) / n, 1) ","*"," 0.07 will be ceiled to 7%."),(0,o.kt)("h3",{id:"equivocation"},"Equivocation"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"GRANDPA Equivocation"),": A validator signs two or more votes in the same round on different chains."),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},"BABE Equivocation"),": A validator produces two or more blocks on the Relay Chain in the same time\nslot."),(0,o.kt)("p",null,"Both GRANDPA and BABE equivocation use the same formula for calculating the slashing penalty:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"Let x = offenders, n = total no. validators in the active set\n\nmin( (3 * x / n )^2, 1)\n")),(0,o.kt)("p",null,"As an example, assume that there are 100 validators in the active set, and one of them equivocates\nin a slot (for our purposes, it does not matter whether it was a BABE or GRANDPA equivocation). This\nis unlikely 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)."),(0,o.kt)("p",null,"Now assume that there is a group running several validators, and all of them have an issue in the\nsame slot. The penalty would be min((3 ","*"," 5 / 100)^2, 1) = 0.0225, or a 2.25% slash. If 20\nvalidators equivocate, this is a much more serious offense and possibly indicates a coordinated\nattack on the network, and so the slash will be much greater - min((3 ","*"," 20 / 100)^2, 1) = 0.36, or\na 36% slash on all of these validators and their nominators. All slashed validators will also be\nchilled."),(0,o.kt)("p",null,"From the example above, the risk of nominating or running many validators in the active set are\napparent. While rewards grow linearly (two validators will get you approximately twice as many\nstaking rewards as one), slashing grows exponentially. A single validator equivocating causes a\n0.09% slash, two validators equivocating does not cause a 0.09 ","*"," 2 = 0.18% slash, but rather a\n0.36% slash - 4x as much as the single validator."),(0,o.kt)("p",null,"Validators may run their nodes on multiple machines to make sure they can still perform validation\nwork in case one of their nodes goes down, but validator operators should be extremely careful in\nsetting these up. If they do not have good coordination to manage signing machines, equivocation is\npossible, and equivocation offenses are slashed at much higher rates than equivalent offline\noffenses."),(0,o.kt)("p",null,"If a validator is reported for any one of the offenses they will be removed from the validator set\n(",(0,o.kt)("a",{parentName:"p",href:"#chilling"},"chilled"),") and they will not be paid while they are out. They will be considered\ninactive immediately and will lose their nominators. They need to re-issue intent to validate and\nagain gather support from nominators."),(0,o.kt)("h3",{id:"slashing-across-eras"},"Slashing Across Eras"),(0,o.kt)("p",null,"There are 3 main difficulties to account for with slashing in NPoS:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"A nominator can nominate multiple validators and be slashed via any of them."),(0,o.kt)("li",{parentName:"ul"},"Until slashed, the stake is reused from era to era. Nominating with N coins for E eras in a row\ndoes not mean you have N","*","E coins to be slashed - you've only ever had N."),(0,o.kt)("li",{parentName:"ul"},"Slashable offenses can be found after the fact and out of order.")),(0,o.kt)("p",null,"To balance this, we only slash for the maximum slash a participant can receive in some time period,\nrather than the sum. This ensures protection from overslashing. Likewise, the period over which\nmaximum slashes are computed is finite and the validator is chilled with nominations withdrawn after\na slashing event, as stated in the previous section. This prevents rage-quit attacks in which, once\ncaught misbehaving, a participant deliberately misbehaves more because their slashing amount is\nalready maxed out."),(0,o.kt)("h2",{id:"simple-payouts"},"Simple Payouts"),(0,o.kt)("p",null,"Polkadot makes stakers claim their rewards for\npast eras by submitting a transaction. This naturally leads to spreading out reward distribution, as\npeople make transactions at disparate times, rather than updating the accounts of all stakers in a\nsingle block."),(0,o.kt)("p",null,"Even 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."),(0,o.kt)("p",null,"Simple payouts require one transaction per validator, per ",(0,o.kt)("a",{parentName:"p",href:"/docs/glossary##era"},"era"),", to\nclaim rewards. The reason Polkadot requires\nthis is to avoid an attack where someone has several thousand accounts nominating a single\nvalidator. The major cost in reward distribution is mutating the accounts in storage, and\nPolkadot cannot pay out several thousand\naccounts in a single transaction."),(0,o.kt)("h3",{id:"claiming-rewards"},"Claiming Rewards"),(0,o.kt)("p",null,"Polkadot stores the last 84 eras of reward\ninformation (e.g. maps of era number to validator points, staking rewards, nomination exposure,\netc.). Rewards will not be claimable more than 84 eras after they were earned. This means that all\nrewards must be claimed within a maximum of 84 eras, although under certain circumstances (described\nbelow) this may be as low as 28 eras."),(0,o.kt)("p",null,"If 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."),(0,o.kt)("admonition",{title:"Advanced How-to Guides",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"In order to be absolutely sure that staking rewards can be claimed, users should trigger a payout\nbefore 28 eras have passed. See\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-guides-staking#claiming-rewards-with-the-polkadot-js-ui"},"this page")," for more information\nabout how to claim rewards using the Polkadot-JS UI.")),(0,o.kt)("h3",{id:"faq-and-cautionary-notes"},"FAQ and Cautionary Notes"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Rewards expire after 84 eras. On Polkadot, that's about 84 days. On Kusama, it is approximately\n21 days. Validators should claim all pending rewards before killing their stash in the event the\nvalidator decides to ",(0,o.kt)("inlineCode",{parentName:"li"},"chill")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"unbonds all")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"withdraws unbonded"),". Nominators will not miss\nout on rewards if they claim the pending rewards for a validator within 28 days. Essentially, the\ndeadline to ensure you get staking rewards is 28 eras. If the validator verifies its intent and\ndoes not unbond and withdraw, the 84 era timeline holds."),(0,o.kt)("li",{parentName:"ol"},"Claiming rewards (or neglecting to claim rewards) does not affect nominations in any way.\nNominations will persist after claiming rewards or after the rewards expire."),(0,o.kt)("li",{parentName:"ol"},'Rewards are not minted until they are claimed. Therefore, if your reward destination is "stash,\nincreasing amount at stake", then your staked amount does not reflect your rewards until you\nclaim them. If you want to maximize compounding, then you will need to claim often or nominate\nvalidators which regularly claim for you.'),(0,o.kt)("li",{parentName:"ol"},"Staking operations at the end of an era are closed to allow the off-chain validator election to\ntake place. See ",(0,o.kt)("a",{parentName:"li",href:"/docs/learn-phragmen#off-chain-phragmen"},"Off-chain Phragm\xe9n")," for more information.")),(0,o.kt)("h2",{id:"staking-miner"},"Staking Miner"),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"The staking-miner code is experimental and it is still in the development phase. Use is at your own\ndiscretion, as there is a risk of losing some funds.")),(0,o.kt)("p",null,"At the end of each era on Polkadot and Kusama, using ",(0,o.kt)("a",{parentName:"p",href:"learn-phragmen"},"NPoS"),', 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',(0,o.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/how-to-guides/offchain-workers/"},"off-chain workers")," 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\xe9n 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",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced#deposit-and-reward-mechanics"},"The bond and the fee")," are lost if the\nsolution is invalid."),(0,o.kt)("p",null,"Staking miner uses a pallet called ",(0,o.kt)("inlineCode",{parentName:"p"},"pallet_election_provider_multi_phase")," and can only produce\nsolutions during the\n",(0,o.kt)("a",{parentName:"p",href:"https://crates.parity.io/pallet_election_provider_multi_phase/index.html#signed-phase"},(0,o.kt)("inlineCode",{parentName:"a"},"SignedPhase")),"\nof the pallet's life cycle. Once the ",(0,o.kt)("inlineCode",{parentName:"p"},"SignedPhase")," is over and the\n",(0,o.kt)("a",{parentName:"p",href:"https://crates.parity.io/pallet_election_provider_multi_phase/index.html#unsigned-phase"},(0,o.kt)("inlineCode",{parentName:"a"},"UnsignedPhase")),"\nstarts, only the off-chain workers can provide election results."),(0,o.kt)("p",null,"Running 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."),(0,o.kt)("h3",{id:"npos-election-optimization"},"NPoS election optimization"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"NPoS election optimization",src:a(83471).Z,width:"1868",height:"804"})),(0,o.kt)("p",null,"A 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\xe9n with a\nconfigurable number of balancing iterations that improve the score."),(0,o.kt)("h3",{id:"signed-phase-of-the-election-pallet"},"Signed Phase of the election pallet"),(0,o.kt)("p",null,"The election provider pallet ",(0,o.kt)("inlineCode",{parentName:"p"},"pallet_election_provider_multi_phase")," is divided into two phases,\n",(0,o.kt)("strong",{parentName:"p"},"signed")," and ",(0,o.kt)("strong",{parentName:"p"},"unsigned"),". At the end of the pallet's timeline, the function ",(0,o.kt)("inlineCode",{parentName:"p"},"elect()")," is called."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"}," elect()\n + <--T::SignedPhase--\x3e + <--T::UnsignedPhase--\x3e +\n +-------------------------------------------------------------------+\n Phase::Off + Phase::Signed + Phase::Unsigned +\n")),(0,o.kt)("p",null,"Solutions provided by the staking miner can only be submitted during the signed phase. Solutions are\nsubmitted and queued on the chain as a ",(0,o.kt)("inlineCode",{parentName:"p"},"RawSolution"),". Once submitted, a solution cannot be retracted\nby the originating account."),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"RawSolution")," struct definition:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"pub struct RawSolution {\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")),(0,o.kt)("p",null,"A maximum of ",(0,o.kt)("inlineCode",{parentName:"p"},"pallet::Config::SignedMaxSubmissions")," will be stored on-chain and they will be sorted\nbased on score. Higher the score the more optimal the election solution is. On both Polkadot and\nKusama the\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/blob/f610ffc05876d4b98a14cee245b4cc27bd3c0c15/runtime/polkadot/src/lib.rs#L390"},"'SignedMaxSubmissions'"),"\nis set to\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.signedMaxSubmissions",defaultValue:16,mdxType:"RPC"}),"\n","\nsubmissions. This variable can be modified if needed through governance."),(0,o.kt)("p",null,"Upon arrival of a new solution:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"If the queue is not full, it is stored in the appropriate sorted index."),(0,o.kt)("li",{parentName:"ol"},"If the queue is full but the submitted solution is better than one of the queued ones, the worse\nsolution is discarded, the deposit of the outgoing solution is returned, and the new solution is\nstored in the correct index."),(0,o.kt)("li",{parentName:"ol"},"If the queue is full and the solution is not an improvement compared to any of the queued ones,\nit is instantly rejected and no deposit is reserved.")),(0,o.kt)("p",null,"Upon the end of the ",(0,o.kt)("inlineCode",{parentName:"p"},"SignedPhase"),", no more solutions can be submitted and the solutions in the queue\nwill be checked using\n",(0,o.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_election_provider_multi_phase/pallet/struct.Pallet.html#method.feasibility_check"},(0,o.kt)("inlineCode",{parentName:"a"},"Pallet::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",(0,o.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/f2bc08a3071a91b71fec63cf2b22c707411cec0e/frame/election-provider-multi-phase/src/signed.rs#L453-L474"},(0,o.kt)("inlineCode",{parentName:"a"},"finalize_signed_phase_accept_solution")),"\nwhich reward account associated with the winning solution."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"Queue\n+-------------------------------+\n|Solution(score=20, valid=false)| +--\x3e Slashed\n+-------------------------------+\n|Solution(score=15, valid=true )| +--\x3e Rewarded, Saved\n+-------------------------------+\n|Solution(score=10, valid=true )| +--\x3e Discarded\n+-------------------------------+\n|Solution(score=05, valid=false)| +--\x3e Discarded\n+-------------------------------+\n| None |\n+-------------------------------+\n")),(0,o.kt)("h3",{id:"deposit-and-reward-mechanics"},"Deposit and reward mechanics"),(0,o.kt)("p",null,"The staking miners are required to pay a deposit to post their solutions. Deposit amount is the sum\nof ",(0,o.kt)("inlineCode",{parentName:"p"},"SignedDepositBase")," +",(0,o.kt)("inlineCode",{parentName:"p"},"SignedDepositByte")," + ",(0,o.kt)("inlineCode",{parentName:"p"},"SignedDepositWeight"),". All good solutions are subject\nto receiving a ",(0,o.kt)("inlineCode",{parentName:"p"},"SignedRewardBase"),"."),(0,o.kt)("h4",{id:"deposit"},"Deposit"),(0,o.kt)("p",null,"Current deposit(",(0,o.kt)("inlineCode",{parentName:"p"},"SignedDepositBase"),") is\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.signedDepositBase",defaultValue:4e11,filter:"humanReadable",mdxType:"RPC"}),"\n","\nwhich is a fixed amount."),(0,o.kt)("p",null,"Current deposit per byte(",(0,o.kt)("inlineCode",{parentName:"p"},"SignedDepositByte"),") is\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.signedDepositByte",defaultValue:97656,filter:"precise",mdxType:"RPC"}),"\n","\nand the total is variable depending on the size of the solution data. For example, a solution\nweighing 200KB would yield 200 x 0.0000097656 = ",(0,o.kt)("strong",{parentName:"p"},"0.00195312 DOT"),".\n",""),(0,o.kt)("p",null,"And the weight deposit(",(0,o.kt)("inlineCode",{parentName:"p"},"SignedDepositWeight"),") is currently set to ",(0,o.kt)("inlineCode",{parentName:"p"},"0")," and has no effect."),(0,o.kt)("h4",{id:"reward"},"Reward"),(0,o.kt)("p",null,"Current reward(",(0,o.kt)("inlineCode",{parentName:"p"},"SignedRewardBase"),") is\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.signedRewardBase",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),"\n","\nwhich is a fixed amount."),(0,o.kt)("h3",{id:"further-resources"},"Further Resources"),(0,o.kt)("p",null,"If you want to run a staking miner on your validator, refer to the repository provided in the\nresources section below."),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/paritytech/staking-miner-v2"},"Staking Miner repository")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://crates.parity.io/pallet_election_provider_multi_phase/index.html"},"Election Pallet definition")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://github.com/paritytech/polkadot-sdk/blob/f610ffc05876d4b98a14cee245b4cc27bd3c0c15/runtime/polkadot/src/lib.rs#L389:L397"},"Signed phase parameter configuration on Polkadot"))))}k.isMDXComponent=!0},71842:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/bags-list-example-0-6836e3658c32484103ffcd06d6372427.png"},79098:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/bags-list-example-1-6aeffdb212b7af723f00e38b40780dcc.png"},86983:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/bags-list-example-2-aec08a8679a23e697f416374cbcdf735.png"},54258:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/bags-list-example-3-08c2b290f95e036e026f667fca527704.png"},83471:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/NPoS-election-optimization-3ef1b7bd0a99f64c4198511b4216989d.png"},56789:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/stash-vs-stash-and-staking-proxy-2104e1a23d5c29821cec15fb9b67eba5.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/48074a08.7886665d.js b/assets/js/48074a08.e74d3142.js similarity index 57% rename from assets/js/48074a08.7886665d.js rename to assets/js/48074a08.e74d3142.js index 592b43588f7f..42c3d09d5ee1 100644 --- a/assets/js/48074a08.7886665d.js +++ b/assets/js/48074a08.e74d3142.js @@ -1 +1 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[1825],{64515:e=>{e.exports=JSON.parse('{"title":"Advanced Concepts","description":"Advanced concepts to better understand Polkadot.","slug":"/learn-advanced-index","permalink":"/docs/learn-advanced-index","navigation":{"previous":{"title":"Nomination Pools","permalink":"/docs/learn-nomination-pools"},"next":{"title":"Accounts","permalink":"/docs/learn-account-advanced"}}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[1825],{64515:e=>{e.exports=JSON.parse('{"title":"Advanced Concepts","description":"Advanced concepts to better understand Polkadot.","slug":"/learn-advanced-index","permalink":"/docs/learn-advanced-index","navigation":{"previous":{"title":"Consensus","permalink":"/docs/learn-consensus"},"next":{"title":"Accounts","permalink":"/docs/learn-account-advanced"}}}')}}]); \ No newline at end of file diff --git a/assets/js/48d75399.3029a983.js b/assets/js/48d75399.3029a983.js deleted file mode 100644 index 330a3e54ad7e..000000000000 --- a/assets/js/48d75399.3029a983.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[4620],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>p});var o=a(74165),n=a(15861),i=a(67294),r=a(87152),s=a(17145),l=a(67425);function h(e,t,a){return d.apply(this,arguments)}function d(){return(d=(0,n.Z)((0,o.Z)().mark((function e(t,a,n){var i,l,h,d,c;return(0,o.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return h=new r.U(i),e.next=21,s.G.create({provider:h});case 21:d=e.sent,(c=a.split(".")).forEach((function(e){e in d&&(d=d[e])})),e.t1=c[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=d.toString(),e.abrupt("break",35);case 29:return e.next=31,d();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function c(e,t,a,o){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,o);break;case"precise":(0,l.Precise)(e,a,o);break;case"blocksToDays":(0,l.BlocksToDays)(e,o);break;case"percentage":(0,l.Percentage)(e,o);break;case"arrayLength":(0,l.ArrayLength)(e,o);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(e){var t=e.network,a=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,d=(0,i.useState)(""),p=d[0],u=d[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?c(r.toString(),l,t,u):u(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,n.Z)((0,o.Z)().mark((function e(){var n;return(0,o.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,h(t,a,u);case 2:if(void 0!==(n=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?c(n,l,t,u):u(n);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),p}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,o){var n=void 0;if("polkadot"===a||"statemint"===a)n=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");n=6}e=parseFloat(e),o((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(n)+" "+t[a].symbol).toString())},Precise:function(e,a,o){o(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},17384:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>h,default:()=>k,frontMatter:()=>l,metadata:()=>d,toc:()=>p});var o=a(87462),n=a(63366),i=(a(67294),a(3905)),r=a(47940),s=["components"],l={id:"faq",title:"Frequently Asked Questions (FAQs)",sidebar_label:"FAQ",description:"FAQs to Help you Navigate on Polkadot.",keywords:["FAQ","questions"],slug:"../faq"},h=void 0,d={unversionedId:"general/faq",id:"general/faq",title:"Frequently Asked Questions (FAQs)",description:"FAQs to Help you Navigate on Polkadot.",source:"@site/../docs/general/faq.md",sourceDirName:"general",slug:"/faq",permalink:"/docs/faq",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/general/faq.md",tags:[],version:"current",lastUpdatedBy:"vuittont60",lastUpdatedAt:1697188456,formattedLastUpdatedAt:"Oct 13, 2023",frontMatter:{id:"faq",title:"Frequently Asked Questions (FAQs)",sidebar_label:"FAQ",description:"FAQs to Help you Navigate on Polkadot.",keywords:["FAQ","questions"],slug:"../faq"},sidebar:"docs",previous:{title:"Metadata Explorer",permalink:"/docs/metadata"},next:{title:"Glossary",permalink:"/docs/glossary"}},c={},p=[{value:"Polkadot Launch",id:"polkadot-launch",level:2},{value:"Polkadot Roadmap",id:"polkadot-roadmap",level:2},{value:"Validators",id:"validators",level:2},{value:"How do I apply to be a validator?",id:"how-do-i-apply-to-be-a-validator",level:3},{value:"How are validators rewarded?",id:"how-are-validators-rewarded",level:3},{value:"What is the minimum stake necessary to be elected as an active validator?",id:"what-is-the-minimum-stake-necessary-to-be-elected-as-an-active-validator",level:3},{value:"Why will Polkadot have only 1000 validators while other projects have hundreds of thousands?",id:"why-will-polkadot-have-only-1000-validators-while-other-projects-have-hundreds-of-thousands",level:3},{value:"Relay Chain",id:"relay-chain",level:2},{value:"What is the block time of the Relay Chain?",id:"what-is-the-block-time-of-the-relay-chain",level:3},{value:"Does Polkadot have smart contracts?",id:"does-polkadot-have-smart-contracts",level:3},{value:"How will the Polkadot Relay Chain connect to external chains in the ecosystem?",id:"how-will-the-polkadot-relay-chain-connect-to-external-chains-in-the-ecosystem",level:3},{value:"What is Polkadot's Transactions Per Second (TPS)?",id:"what-is-polkadots-transactions-per-second-tps",level:3},{value:"DOT",id:"dot",level:2},{value:"What is the difference between DOT (old) and new DOT?",id:"what-is-the-difference-between-dot-old-and-new-dot",level:3},{value:"What is the inflation rate of the DOT?",id:"what-is-the-inflation-rate-of-the-dot",level:3},{value:"Why can't crowdloaned DOT be staked?",id:"why-cant-crowdloaned-dot-be-staked",level:3},{value:"Governance",id:"governance",level:2},{value:"What prevents Polkadot governance from failing?",id:"what-prevents-polkadot-governance-from-failing",level:3},{value:"What prevents Polkadot governance from becoming plutocratic?",id:"what-prevents-polkadot-governance-from-becoming-plutocratic",level:3},{value:"Parachains",id:"parachains",level:2},{value:"How do parachain economics work?",id:"how-do-parachain-economics-work",level:3},{value:"Are parachains ephemeral? What happens when a parachain loses the next auction?",id:"are-parachains-ephemeral-what-happens-when-a-parachain-loses-the-next-auction",level:3},{value:"Networking",id:"networking",level:2},{value:"What is libp2p?",id:"what-is-libp2p",level:3},{value:"Does Polkadot use libp2p?",id:"does-polkadot-use-libp2p",level:3},{value:"How does libp2p differ from IPFS?",id:"how-does-libp2p-differ-from-ipfs",level:3},{value:"Kusama",id:"kusama",level:2},{value:"What is the minimum amount of KSM / DOT I can have in my account?",id:"what-is-the-minimum-amount-of-ksm--dot-i-can-have-in-my-account",level:3},{value:"What are the transfer fees for Kusama?",id:"what-are-the-transfer-fees-for-kusama",level:3},{value:"Answered by Gav series",id:"answered-by-gav-series",level:2}],u={toc:p},m="wrapper";function k(e){var t=e.components,a=(0,n.Z)(e,s);return(0,i.kt)(m,(0,o.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"This FAQ focuses on technical questions for users interested in developing applications for\nPolkadot. If you have a more general question, you may wish to search for the answer on our support\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/home"},"Knowledge Base")," or the main\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/faq"},"Polkadot network FAQ"),". If you have a question that is not answered,\nplease feel free to ask on the Polkadot Watercooler\n",(0,i.kt)("a",{parentName:"p",href:"https://app.element.io/#/room/#polkadot-watercooler:web3.foundation"},"Element channel")," or contact\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network"},"Polkadot Support"),".")),(0,i.kt)("h2",{id:"polkadot-launch"},"Polkadot Launch"),(0,i.kt)("p",null,"The Genesis block of the Polkadot network was launched 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."),(0,i.kt)("p",null,"The 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."),(0,i.kt)("p",null,"The 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."),(0,i.kt)("p",null,"On August 21, 2020, Redenomination of DOT occurred. From this date, one DOT (old) equals 100 new\nDOT."),(0,i.kt)("h2",{id:"polkadot-roadmap"},"Polkadot Roadmap"),(0,i.kt)("p",null,"For more information on the Polkadot roadmap please visit the\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/technology/#roadmap"},"official Polkadot website"),"."),(0,i.kt)("h2",{id:"validators"},"Validators"),(0,i.kt)("h3",{id:"how-do-i-apply-to-be-a-validator"},"How do I apply to be a validator?"),(0,i.kt)("p",null,"There is no central authority that decides on validators, so there is not per se an ",(0,i.kt)("em",{parentName:"p"},"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 this you can consult the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-validate-kusama"},"Kusama validator guide")," on validating\nfor Kusama or the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-validate-polkadot"},"Polkadot validator guide")," for validating\non Polkadot."),(0,i.kt)("p",null,"However, once you've set up a validator and have registered your intention it does not mean that you\nwill be included in the ",(0,i.kt)("em",{parentName:"p"},"active set")," right away. The validators are elected to the active set based\non the results of an election algorithm known as ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"Phragm\xe9n's method"),".\nPhragm\xe9n's method tries to accomplish two goals: 1) select ",(0,i.kt)("inlineCode",{parentName:"p"},"n")," members from a larger set based on\nstake-weighted votes and 2) equalize the stake backing each validator as much as possible."),(0,i.kt)("p",null,"You will likely want to campaign your validator to the community in order to get more backing. You\nare looking for ",(0,i.kt)("em",{parentName:"p"},"nominators")," that will put up their tokens to increase the stake for your validator.\nFor validators who cannot acquire the minimum stake from the community, Parity and Web3 Foundation\nalso run a joint program called ",(0,i.kt)("a",{parentName:"p",href:"/docs/thousand-validators"},"Thousand Validators")," that will nominate\nvalidators if they apply and fit the requirements."),(0,i.kt)("h3",{id:"how-are-validators-rewarded"},"How are validators rewarded?"),(0,i.kt)("p",null,"Validators are rewarded from the inflation of the Relay Chain, transaction fees, and tips. However,\nthey only take a percentage of the former two. More details can be read on the page for\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-validator-payout"},"validator payouts"),"."),(0,i.kt)("h3",{id:"what-is-the-minimum-stake-necessary-to-be-elected-as-an-active-validator"},"What is the minimum stake necessary to be elected as an active validator?"),(0,i.kt)("p",null,"The 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."),(0,i.kt)("p",null,"There are a few ways to estimate the minimum stake."),(0,i.kt)("p",null,"One way can be to navigate to the\n",(0,i.kt)("a",{parentName:"p",href:"https://ipfs.io/ipns/polkadot.dotapps.io/#/staking/targets"},"Polkadot Apps Targets tab"),'. The value\nat the top of the screen saying "Lowest" is the least staked validator. You need at least this\nmuch + 1 to enter the set.'),(0,i.kt)("p",null,"You can also use some tools some to perform estimations."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate-debug-kit/tree/master/offline-election"},"Offline Election"),"\ncan provide exact results of running an election on the current set of validators using the same\nRust code that is ran in Polkadot.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("a",{parentName:"p",href:"https://github.com/w3f/validator-stats"},"Validator stats script")," can give you an estimate that is\nbased on the currently elected set, as well as some statistics about Kusama validators."))),(0,i.kt)("h3",{id:"why-will-polkadot-have-only-1000-validators-while-other-projects-have-hundreds-of-thousands"},"Why will Polkadot have only 1000 validators while other projects have hundreds of thousands?"),(0,i.kt)("p",null,"Polkadot's goal to have 1000 validators is set to be something that is practically achievable in the\nshort term with high confidence of good performance in a live environment. Furthermore, validators\nin Polkadot are not the only stakers, and if we consider the number of stakers that can be possible\non Polkadot the number can scale up to hundreds of thousands. Since validators are performing\ncritical consensus work to maintain the security of the chain including all of its shards, a more\nmodest number of validators is estimated to start. Upon later improvements, such as implementing\nsignature aggregation for finalization messages, the number of validators could reasonably scale up.\nHowever, increasing validators above one thousand remains a goal for later iterations of Polkadot."),(0,i.kt)("p",null,"It is also worth mentioning that one thousand validators is more than the number of validators of\nsimilar PoS chains with comparable levels of economic security as Polkadot. The closest contenders\nare operating with around 150 validators, while Polkadot is already securely running with\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.validatorCount",defaultValue:297,mdxType:"RPC"}),"\n","\nvalidators."),(0,i.kt)("p",null,"Additionally, other projects sometimes have a different definition of ",(0,i.kt)("em",{parentName:"p"},"validator"),' that approximates\nmore closely to remote signing keys without the full operation of a validating node. On Polkadot,\neach validator is running their own validating node and performing full verification of the Relay\nChain, voting on finality, producing blocks in their decided slots, and verifying parachain state\ntransitions. Other projects may consider validators and "validating nodes" as separate entities.'),(0,i.kt)("p",null,"Finally, individuals may participate in the block production process indirectly by\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nominator"},"nominating")," validators. In this way, individuals who are not running a\nnode can still share in staking rewards."),(0,i.kt)("h2",{id:"relay-chain"},"Relay Chain"),(0,i.kt)("h3",{id:"what-is-the-block-time-of-the-relay-chain"},"What is the block time of the Relay Chain?"),(0,i.kt)("p",null,"Both the Kusama and Polkadot networks are currently operating at a rate of one block every six\nseconds."),(0,i.kt)("p",null,"This may be changed in the future. It may go as low as two to three seconds after optimizations, or\npotentially increase in order to handle the capacity of the parachain networking in a live\nenvironment."),(0,i.kt)("h3",{id:"does-polkadot-have-smart-contracts"},"Does Polkadot have smart contracts?"),(0,i.kt)("p",null,"No - and yes. The Polkadot Relay Chain does not implement smart contracts natively. The reason for\nnot having smart contracts on the Relay Chain is part of the design philosophy for Polkadot that\ndictates that the Relay Chain should be the minimal logic required to accomplish its job."),(0,i.kt)("p",null,"However, Polkadot will be a platform for other chains that ",(0,i.kt)("em",{parentName:"p"},"do")," implement smart contracts. It's\npossible for parachains to enable smart contract functionality and then benefit from the security\nand interoperability features of Polkadot. Additionally, existing smart contract chains can connect\nto Polkadot as a parachain, or via a bridge."),(0,i.kt)("p",null,"While the Polkadot Relay Chain does not implement smart contracts directly, undoubtedly there will\nbe parachains that do. So it's better to say that the Polkadot ",(0,i.kt)("em",{parentName:"p"},"ecosystem"),' has smart contracts\nversus "Polkadot has smart contracts."'),(0,i.kt)("h3",{id:"how-will-the-polkadot-relay-chain-connect-to-external-chains-in-the-ecosystem"},"How will the Polkadot Relay Chain connect to external chains in the ecosystem?"),(0,i.kt)("p",null,"One of the cornerstone interoperability technologies being researched and developed for deployment\non Polkadot is cross-chain bridges. Bridges come in a variety of flavors with varying levels of\ntrust associated with them. Polkadot is predominantly researching the trust-minimized flavor that\nimposes economic costs on the operators of the bridge, and therefore makes it economically secure.\nBridge efforts are being worked on in concert with other projects in the ecosystem. Eventually,\nthere will be bridges between Polkadot and most of the other major chains."),(0,i.kt)("h3",{id:"what-is-polkadots-transactions-per-second-tps"},"What is Polkadot's Transactions Per Second (TPS)?"),(0,i.kt)("p",null,"Polkadot is a heterogeneous sharded network comprising a relay chain and numerous parachains, which\nare all individual blockchains built on ",(0,i.kt)("a",{parentName:"p",href:"https://substrate.io/"},"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 ",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/build/tx-weights-fees/"},"weights based"),", it makes sense to\nuse TPS as a measure for the network performance if all the transactions carry the same weight.\n",(0,i.kt)("a",{parentName:"p",href:"https://twitter.com/gavofyork/status/1270025498580656134"},"Performance benchmark tests")," show that\nSubstrate-based blockchains can achieve over 1000 TPS for balance transfer transactions. Assuming\nPolkadot is running over 100 parachains; the projected TPS is well over 100,000. With\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-async-backing"},"asynchronous backing upgrade"),", the TPS is expected to increase\ntenfold to 1,000,000."),(0,i.kt)("p",null,"It 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(",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-stps/blob/main/docs/introduction.md"},"Standard Transaction Per Second"),")\nto consider precisely how benchmarking was performed for Polkadot."),(0,i.kt)("h2",{id:"dot"},"DOT"),(0,i.kt)("h3",{id:"what-is-the-difference-between-dot-old-and-new-dot"},"What is the difference between DOT (old) and new DOT?"),(0,i.kt)("p",null,"The DOT (old) unit on Polkadot was at twelve decimal places, otherwise known as 1e12 Plancks. On 21\nAugust, 2020, Denomination Day, the DOT (old) value was redenominated to 1e10 (10_000_000_000, or\nten billion) Plancks, meaning that the new DOT was valued at ten decimal places. Following the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-redenomination"},"redenomination"),", the new DOT is called DOT."),(0,i.kt)("h3",{id:"what-is-the-inflation-rate-of-the-dot"},"What is the inflation rate of the DOT?"),(0,i.kt)("p",null,"The inflation rate is approximately 10% per year."),(0,i.kt)("p",null,"A portion of the inflation is rewarded to validators for performing their duties, while another\nportion may go directly to the treasury. The exact percentage that goes into both varies and is\nbased on the amount of DOT that are staked. Please see the article on\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking/#inflation"},"inflation")," for more information."),(0,i.kt)("h3",{id:"why-cant-crowdloaned-dot-be-staked"},"Why can't crowdloaned DOT be staked?"),(0,i.kt)("p",null,"DOTs contributed to a successful crowdloan campaign by a parachain are bonded for the entire lease\nperiod, which is two years on Polkadot. The crowdloaned DOT cannot be used for any other DOT utility\nfunctionalities like staking and democracy. In exchange to the lost staking rewards or liquidity of\nDOTs, the parachain team may offer rewards to the contributor."),(0,i.kt)("p",null,"The utility of crowdloaned DOT is to provide a lease for a parachain. The utility of staked DOT is\nto secure the network through a reward/slash mechanism. Allowing crowdloaned DOT to be staked\nresults in complex consequences like applying a slash on crowdloaned DOT that was meant to be bonded\nfor the entire lease period of a parachain. In a way, the inaccessibility of crowdloaned DOTs and\nthe lack of staking rewards for the entire lease duration encourages the contributors to back\nprojects that are valuable to the ecosystem."),(0,i.kt)("h2",{id:"governance"},"Governance"),(0,i.kt)("h3",{id:"what-prevents-polkadot-governance-from-failing"},"What prevents Polkadot governance from failing?"),(0,i.kt)("p",null,"Polkadot's governance has already been shown to work. Examples can be found in the runtime upgrades\nthat have successfully taken place through on the testnets as well as in a real economic environment\non ",(0,i.kt)("a",{parentName:"p",href:"https://guide.kusama.network"},"Kusama")," and Polkadot itself."),(0,i.kt)("p",null,"It 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."),(0,i.kt)("p",null,"Blockchains 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."),(0,i.kt)("h3",{id:"what-prevents-polkadot-governance-from-becoming-plutocratic"},"What prevents Polkadot governance from becoming plutocratic?"),(0,i.kt)("p",null,"A 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 ",(0,i.kt)("em",{parentName:"p"},"whales")," in trading parlance) and therefore become a mere\nplutocracy (rule of the rich)."),(0,i.kt)("p",null,"There 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 ",(0,i.kt)("em",{parentName:"p"},"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",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-governance"},"governance page"),"."),(0,i.kt)("h2",{id:"parachains"},"Parachains"),(0,i.kt)("h3",{id:"how-do-parachain-economics-work"},"How do parachain economics work?"),(0,i.kt)("p",null,"Parachains 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."),(0,i.kt)("h3",{id:"are-parachains-ephemeral-what-happens-when-a-parachain-loses-the-next-auction"},"Are parachains ephemeral? What happens when a parachain loses the next auction?"),(0,i.kt)("p",null,"Parachains are not ephemeral. As long as someone is keeping the data for a parachain, the parachain\ncan move between being a parachain, a parathread, or a separate sovereign chain at different points\nof its lifetime. Especially with parathreads, parachains can be decommissioned to only produce\nblocks when their usage and throughput makes it necessary."),(0,i.kt)("p",null,"When a parachain loses an auction for renewal, that parachain has a few options. In most cases,\nbecoming a parathread instead would be a suitable choice. Parathreads are still secured by the Relay\nChain, but don't need to hold a parachain slot and can produce a block when its economically\nfeasible for them. For more on parachains please see the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains"},"parachains page")," and for more on parathreads see\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parathreads"},"the parathreads page"),"."),(0,i.kt)("h2",{id:"networking"},"Networking"),(0,i.kt)("h3",{id:"what-is-libp2p"},"What is libp2p?"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://libp2p.io"},"Libp2p")," is a modular and extensible networking stack that is used by IPFS,\nSubstrate, and many other projects. It is a collection of peer-to-peer protocols for finding peers\nand connecting to them. Its modules have logic for content routing, peer routing, peer discovery,\ndifferent transports, and NAT traversals. It is intended to be used by applications for building\nlarge scale peer-to-peer networks by only selecting the parts of the protocol suite that are needed."),(0,i.kt)("p",null,"The Rust implementation of the specification was built and primarily maintained by a team of\ncontributors at Parity Technologies. The Go and JavaScript versions are maintained by Protocol Labs\nas well as community contributors. A ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/status-im/nim-libp2p"},"Nim")," version of the\nlibrary also exists. Libp2p as a whole is an open source project that is actively developed and\nexpanded on various code repositories hosted on ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/libp2p"},"their GitHub"),"."),(0,i.kt)("h3",{id:"does-polkadot-use-libp2p"},"Does Polkadot use libp2p?"),(0,i.kt)("p",null,"Yes, since Polkadot is built with Substrate. Substrate uses a networking protocol that is based on\nlibp2p (specifically the Rust libp2p library). However, Substrate uses a mix of standard libp2p\nprotocols and protocols that are homegrown and not official libp2p standards. Of the standards\nprotocols, those which are shared with other implementations of libp2p such as IPFS, are\nconnection-checking (ping), asking for information on a peer (identity), and Kademlia random walks\n(kad)."),(0,i.kt)("p",null,"Of the protocols that are custom to Substrate, there are the legacy Substrate stream, a\nrequest-response for getting information on blocks (sync), a light client protocol, a notification\nprotocol for transactions, and block announcement. For detailed information on how Substrate uses\nlibp2p and the standard and custom protocols, please see the\n",(0,i.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/sc_network/index.html"},"networking documentation"),"."),(0,i.kt)("h3",{id:"how-does-libp2p-differ-from-ipfs"},"How does libp2p differ from IPFS?"),(0,i.kt)("p",null,"The ",(0,i.kt)("a",{parentName:"p",href:"https://ipfs.io/"},"Interplanetary File System"),' (IPFS) is a peer-to-peer hypermedia protocol used\nprimarily for storage of files. It allows one to upload a file onto the network and share it with\nits content addressable URI. IPFS, like Substrate, is an application of libp2p and exists higher on\nthe technology stack. Although both IPFS and Substrate use libp2p, it cannot be said that Substrate\n"uses" IPFS since besides sharing the underlying library for networking there is no native\nintegration between the two applications.'),(0,i.kt)("h2",{id:"kusama"},"Kusama"),(0,i.kt)("h3",{id:"what-is-the-minimum-amount-of-ksm--dot-i-can-have-in-my-account"},"What is the minimum amount of KSM / DOT I can have in my account?"),(0,i.kt)("p",null,"Please see information about ",(0,i.kt)("a",{parentName:"p",href:"/docs/build-protocol-info"},"Existential Deposits"),"."),(0,i.kt)("h3",{id:"what-are-the-transfer-fees-for-kusama"},"What are the transfer fees for Kusama?"),(0,i.kt)("p",null,"It is important to note that the cost of transferring KSM is dynamic. Currently, the minimum cost of\ntransferring KSM is 0.01 KSM (the base fee), although this can be changed via governance. However,\nactual transaction fees will vary based on a variety of factors. Specifically, fee calculation\nfollows the following formula:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"base_fee + (tx_length * length_fee) + WeightToFee(weight)\n")),(0,i.kt)("p",null,"Please see the\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/how-to-guides/weights/calculate-fees/"},"fee calculation")," page in\nthe Substrate documentation for more detailed information."),(0,i.kt)("h2",{id:"answered-by-gav-series"},"Answered by Gav series"),(0,i.kt)("p",null,'The "Answered by Gav" series is a collection of posts uploaded to Reddit of questions that have been\nasked in the Polkadot Watercooler Riot channel and answered by Polkadot founder Gavin Wood.'),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.reddit.com/r/dot/comments/b87d96/answered_by_gav_reason_for_using_asynchronous/"},"Reason for using asynchronous rather than synchronous communication? Difference in terms of TPS?")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.reddit.com/r/dot/comments/b87awr/answered_by_gav_how_exactly_do_validators_in_an/"},"How exactly do validators in an ETH parachain keep moving around and how is communication between zones trustless?")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.reddit.com/r/dot/comments/b87bua/answered_by_gav_what_are_the_main_issues_with/"},"What are the main issues with Bitcoin integration and will it ever be possible? Same problem with other POW chains? Is Polkadot only going to work with POS chains? How is it trust-less in comparison to Cosmos though?")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.reddit.com/r/dot/comments/b87cjz/answered_by_gav_what_are_the_current_thoughts/"},"What are the current thoughts around governance especially since projects have to be voted in to receive the parachains security?")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.reddit.com/r/dot/comments/b87ds8/answered_by_gav_also_is_there_any_detailed/"},"Also is there any detailed overview of how exactly a token transfer from ETH could be exchanged with another chain's currency?")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.reddit.com/r/dot/comments/bcqrx9/answered_by_gav_can_i_run_multiple_validators/"},"Can I run multiple Validators with the same Session Key?")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.reddit.com/r/dot/comments/bcqwit/answered_by_gav_how_to_tackle_the_concentration/"},"How to tackle the concentration risk of Validators in data centers?"))))}k.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/48d75399.30c50980.js b/assets/js/48d75399.30c50980.js new file mode 100644 index 000000000000..1e428ebac4b1 --- /dev/null +++ b/assets/js/48d75399.30c50980.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[4620],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>p});var o=a(74165),n=a(15861),i=a(67294),r=a(87152),s=a(17145),l=a(67425);function h(e,t,a){return d.apply(this,arguments)}function d(){return(d=(0,n.Z)((0,o.Z)().mark((function e(t,a,n){var i,l,h,d,c;return(0,o.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return h=new r.U(i),e.next=21,s.G.create({provider:h});case 21:d=e.sent,(c=a.split(".")).forEach((function(e){e in d&&(d=d[e])})),e.t1=c[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=d.toString(),e.abrupt("break",35);case 29:return e.next=31,d();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function c(e,t,a,o){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,o);break;case"precise":(0,l.Precise)(e,a,o);break;case"blocksToDays":(0,l.BlocksToDays)(e,o);break;case"percentage":(0,l.Percentage)(e,o);break;case"permillToPercent":(0,l.PermillToPercent)(e,o);break;case"arrayLength":(0,l.ArrayLength)(e,o);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(e){var t=e.network,a=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,d=(0,i.useState)(""),p=d[0],u=d[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?c(r.toString(),l,t,u):u(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,n.Z)((0,o.Z)().mark((function e(){var n;return(0,o.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,h(t,a,u);case 2:if(void 0!==(n=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?c(n,l,t,u):u(n);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),p}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,o){var n=void 0;if("polkadot"===a||"statemint"===a)n=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");n=6}e=parseFloat(e),o((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(n)+" "+t[a].symbol).toString())},Precise:function(e,a,o){o(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},17384:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>h,default:()=>k,frontMatter:()=>l,metadata:()=>d,toc:()=>p});var o=a(87462),n=a(63366),i=(a(67294),a(3905)),r=a(47940),s=["components"],l={id:"faq",title:"Frequently Asked Questions (FAQs)",sidebar_label:"FAQ",description:"FAQs to Help you Navigate on Polkadot.",keywords:["FAQ","questions"],slug:"../faq"},h=void 0,d={unversionedId:"general/faq",id:"general/faq",title:"Frequently Asked Questions (FAQs)",description:"FAQs to Help you Navigate on Polkadot.",source:"@site/../docs/general/faq.md",sourceDirName:"general",slug:"/faq",permalink:"/docs/faq",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/general/faq.md",tags:[],version:"current",lastUpdatedBy:"vuittont60",lastUpdatedAt:1697188456,formattedLastUpdatedAt:"Oct 13, 2023",frontMatter:{id:"faq",title:"Frequently Asked Questions (FAQs)",sidebar_label:"FAQ",description:"FAQs to Help you Navigate on Polkadot.",keywords:["FAQ","questions"],slug:"../faq"},sidebar:"docs",previous:{title:"Metadata Explorer",permalink:"/docs/metadata"},next:{title:"Glossary",permalink:"/docs/glossary"}},c={},p=[{value:"Polkadot Launch",id:"polkadot-launch",level:2},{value:"Polkadot Roadmap",id:"polkadot-roadmap",level:2},{value:"Validators",id:"validators",level:2},{value:"How do I apply to be a validator?",id:"how-do-i-apply-to-be-a-validator",level:3},{value:"How are validators rewarded?",id:"how-are-validators-rewarded",level:3},{value:"What is the minimum stake necessary to be elected as an active validator?",id:"what-is-the-minimum-stake-necessary-to-be-elected-as-an-active-validator",level:3},{value:"Why will Polkadot have only 1000 validators while other projects have hundreds of thousands?",id:"why-will-polkadot-have-only-1000-validators-while-other-projects-have-hundreds-of-thousands",level:3},{value:"Relay Chain",id:"relay-chain",level:2},{value:"What is the block time of the Relay Chain?",id:"what-is-the-block-time-of-the-relay-chain",level:3},{value:"Does Polkadot have smart contracts?",id:"does-polkadot-have-smart-contracts",level:3},{value:"How will the Polkadot Relay Chain connect to external chains in the ecosystem?",id:"how-will-the-polkadot-relay-chain-connect-to-external-chains-in-the-ecosystem",level:3},{value:"What is Polkadot's Transactions Per Second (TPS)?",id:"what-is-polkadots-transactions-per-second-tps",level:3},{value:"DOT",id:"dot",level:2},{value:"What is the difference between DOT (old) and new DOT?",id:"what-is-the-difference-between-dot-old-and-new-dot",level:3},{value:"What is the inflation rate of the DOT?",id:"what-is-the-inflation-rate-of-the-dot",level:3},{value:"Why can't crowdloaned DOT be staked?",id:"why-cant-crowdloaned-dot-be-staked",level:3},{value:"Governance",id:"governance",level:2},{value:"What prevents Polkadot governance from failing?",id:"what-prevents-polkadot-governance-from-failing",level:3},{value:"What prevents Polkadot governance from becoming plutocratic?",id:"what-prevents-polkadot-governance-from-becoming-plutocratic",level:3},{value:"Parachains",id:"parachains",level:2},{value:"How do parachain economics work?",id:"how-do-parachain-economics-work",level:3},{value:"Are parachains ephemeral? What happens when a parachain loses the next auction?",id:"are-parachains-ephemeral-what-happens-when-a-parachain-loses-the-next-auction",level:3},{value:"Networking",id:"networking",level:2},{value:"What is libp2p?",id:"what-is-libp2p",level:3},{value:"Does Polkadot use libp2p?",id:"does-polkadot-use-libp2p",level:3},{value:"How does libp2p differ from IPFS?",id:"how-does-libp2p-differ-from-ipfs",level:3},{value:"Kusama",id:"kusama",level:2},{value:"What is the minimum amount of KSM / DOT I can have in my account?",id:"what-is-the-minimum-amount-of-ksm--dot-i-can-have-in-my-account",level:3},{value:"What are the transfer fees for Kusama?",id:"what-are-the-transfer-fees-for-kusama",level:3},{value:"Answered by Gav series",id:"answered-by-gav-series",level:2}],u={toc:p},m="wrapper";function k(e){var t=e.components,a=(0,n.Z)(e,s);return(0,i.kt)(m,(0,o.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"This FAQ focuses on technical questions for users interested in developing applications for\nPolkadot. If you have a more general question, you may wish to search for the answer on our support\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/home"},"Knowledge Base")," or the main\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/faq"},"Polkadot network FAQ"),". If you have a question that is not answered,\nplease feel free to ask on the Polkadot Watercooler\n",(0,i.kt)("a",{parentName:"p",href:"https://app.element.io/#/room/#polkadot-watercooler:web3.foundation"},"Element channel")," or contact\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network"},"Polkadot Support"),".")),(0,i.kt)("h2",{id:"polkadot-launch"},"Polkadot Launch"),(0,i.kt)("p",null,"The Genesis block of the Polkadot network was launched 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."),(0,i.kt)("p",null,"The 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."),(0,i.kt)("p",null,"The 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."),(0,i.kt)("p",null,"On August 21, 2020, Redenomination of DOT occurred. From this date, one DOT (old) equals 100 new\nDOT."),(0,i.kt)("h2",{id:"polkadot-roadmap"},"Polkadot Roadmap"),(0,i.kt)("p",null,"For more information on the Polkadot roadmap please visit the\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/technology/#roadmap"},"official Polkadot website"),"."),(0,i.kt)("h2",{id:"validators"},"Validators"),(0,i.kt)("h3",{id:"how-do-i-apply-to-be-a-validator"},"How do I apply to be a validator?"),(0,i.kt)("p",null,"There is no central authority that decides on validators, so there is not per se an ",(0,i.kt)("em",{parentName:"p"},"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 this you can consult the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-validate-kusama"},"Kusama validator guide")," on validating\nfor Kusama or the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-validate-polkadot"},"Polkadot validator guide")," for validating\non Polkadot."),(0,i.kt)("p",null,"However, once you've set up a validator and have registered your intention it does not mean that you\nwill be included in the ",(0,i.kt)("em",{parentName:"p"},"active set")," right away. The validators are elected to the active set based\non the results of an election algorithm known as ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"Phragm\xe9n's method"),".\nPhragm\xe9n's method tries to accomplish two goals: 1) select ",(0,i.kt)("inlineCode",{parentName:"p"},"n")," members from a larger set based on\nstake-weighted votes and 2) equalize the stake backing each validator as much as possible."),(0,i.kt)("p",null,"You will likely want to campaign your validator to the community in order to get more backing. You\nare looking for ",(0,i.kt)("em",{parentName:"p"},"nominators")," that will put up their tokens to increase the stake for your validator.\nFor validators who cannot acquire the minimum stake from the community, Parity and Web3 Foundation\nalso run a joint program called ",(0,i.kt)("a",{parentName:"p",href:"/docs/thousand-validators"},"Thousand Validators")," that will nominate\nvalidators if they apply and fit the requirements."),(0,i.kt)("h3",{id:"how-are-validators-rewarded"},"How are validators rewarded?"),(0,i.kt)("p",null,"Validators are rewarded from the inflation of the Relay Chain, transaction fees, and tips. However,\nthey only take a percentage of the former two. More details can be read on the page for\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-validator-payout"},"validator payouts"),"."),(0,i.kt)("h3",{id:"what-is-the-minimum-stake-necessary-to-be-elected-as-an-active-validator"},"What is the minimum stake necessary to be elected as an active validator?"),(0,i.kt)("p",null,"The 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."),(0,i.kt)("p",null,"There are a few ways to estimate the minimum stake."),(0,i.kt)("p",null,"One way can be to navigate to the\n",(0,i.kt)("a",{parentName:"p",href:"https://ipfs.io/ipns/polkadot.dotapps.io/#/staking/targets"},"Polkadot Apps Targets tab"),'. The value\nat the top of the screen saying "Lowest" is the least staked validator. You need at least this\nmuch + 1 to enter the set.'),(0,i.kt)("p",null,"You can also use some tools some to perform estimations."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate-debug-kit/tree/master/offline-election"},"Offline Election"),"\ncan provide exact results of running an election on the current set of validators using the same\nRust code that is ran in Polkadot.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("a",{parentName:"p",href:"https://github.com/w3f/validator-stats"},"Validator stats script")," can give you an estimate that is\nbased on the currently elected set, as well as some statistics about Kusama validators."))),(0,i.kt)("h3",{id:"why-will-polkadot-have-only-1000-validators-while-other-projects-have-hundreds-of-thousands"},"Why will Polkadot have only 1000 validators while other projects have hundreds of thousands?"),(0,i.kt)("p",null,"Polkadot's goal to have 1000 validators is set to be something that is practically achievable in the\nshort term with high confidence of good performance in a live environment. Furthermore, validators\nin Polkadot are not the only stakers, and if we consider the number of stakers that can be possible\non Polkadot the number can scale up to hundreds of thousands. Since validators are performing\ncritical consensus work to maintain the security of the chain including all of its shards, a more\nmodest number of validators is estimated to start. Upon later improvements, such as implementing\nsignature aggregation for finalization messages, the number of validators could reasonably scale up.\nHowever, increasing validators above one thousand remains a goal for later iterations of Polkadot."),(0,i.kt)("p",null,"It is also worth mentioning that one thousand validators is more than the number of validators of\nsimilar PoS chains with comparable levels of economic security as Polkadot. The closest contenders\nare operating with around 150 validators, while Polkadot is already securely running with\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.validatorCount",defaultValue:297,mdxType:"RPC"}),"\n","\nvalidators."),(0,i.kt)("p",null,"Additionally, other projects sometimes have a different definition of ",(0,i.kt)("em",{parentName:"p"},"validator"),' that approximates\nmore closely to remote signing keys without the full operation of a validating node. On Polkadot,\neach validator is running their own validating node and performing full verification of the Relay\nChain, voting on finality, producing blocks in their decided slots, and verifying parachain state\ntransitions. Other projects may consider validators and "validating nodes" as separate entities.'),(0,i.kt)("p",null,"Finally, individuals may participate in the block production process indirectly by\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nominator"},"nominating")," validators. In this way, individuals who are not running a\nnode can still share in staking rewards."),(0,i.kt)("h2",{id:"relay-chain"},"Relay Chain"),(0,i.kt)("h3",{id:"what-is-the-block-time-of-the-relay-chain"},"What is the block time of the Relay Chain?"),(0,i.kt)("p",null,"Both the Kusama and Polkadot networks are currently operating at a rate of one block every six\nseconds."),(0,i.kt)("p",null,"This may be changed in the future. It may go as low as two to three seconds after optimizations, or\npotentially increase in order to handle the capacity of the parachain networking in a live\nenvironment."),(0,i.kt)("h3",{id:"does-polkadot-have-smart-contracts"},"Does Polkadot have smart contracts?"),(0,i.kt)("p",null,"No - and yes. The Polkadot Relay Chain does not implement smart contracts natively. The reason for\nnot having smart contracts on the Relay Chain is part of the design philosophy for Polkadot that\ndictates that the Relay Chain should be the minimal logic required to accomplish its job."),(0,i.kt)("p",null,"However, Polkadot will be a platform for other chains that ",(0,i.kt)("em",{parentName:"p"},"do")," implement smart contracts. It's\npossible for parachains to enable smart contract functionality and then benefit from the security\nand interoperability features of Polkadot. Additionally, existing smart contract chains can connect\nto Polkadot as a parachain, or via a bridge."),(0,i.kt)("p",null,"While the Polkadot Relay Chain does not implement smart contracts directly, undoubtedly there will\nbe parachains that do. So it's better to say that the Polkadot ",(0,i.kt)("em",{parentName:"p"},"ecosystem"),' has smart contracts\nversus "Polkadot has smart contracts."'),(0,i.kt)("h3",{id:"how-will-the-polkadot-relay-chain-connect-to-external-chains-in-the-ecosystem"},"How will the Polkadot Relay Chain connect to external chains in the ecosystem?"),(0,i.kt)("p",null,"One of the cornerstone interoperability technologies being researched and developed for deployment\non Polkadot is cross-chain bridges. Bridges come in a variety of flavors with varying levels of\ntrust associated with them. Polkadot is predominantly researching the trust-minimized flavor that\nimposes economic costs on the operators of the bridge, and therefore makes it economically secure.\nBridge efforts are being worked on in concert with other projects in the ecosystem. Eventually,\nthere will be bridges between Polkadot and most of the other major chains."),(0,i.kt)("h3",{id:"what-is-polkadots-transactions-per-second-tps"},"What is Polkadot's Transactions Per Second (TPS)?"),(0,i.kt)("p",null,"Polkadot is a heterogeneous sharded network comprising a relay chain and numerous parachains, which\nare all individual blockchains built on ",(0,i.kt)("a",{parentName:"p",href:"https://substrate.io/"},"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 ",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/build/tx-weights-fees/"},"weights based"),", it makes sense to\nuse TPS as a measure for the network performance if all the transactions carry the same weight.\n",(0,i.kt)("a",{parentName:"p",href:"https://twitter.com/gavofyork/status/1270025498580656134"},"Performance benchmark tests")," show that\nSubstrate-based blockchains can achieve over 1000 TPS for balance transfer transactions. Assuming\nPolkadot is running over 100 parachains; the projected TPS is well over 100,000. With\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-async-backing"},"asynchronous backing upgrade"),", the TPS is expected to increase\ntenfold to 1,000,000."),(0,i.kt)("p",null,"It 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(",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-stps/blob/main/docs/introduction.md"},"Standard Transaction Per Second"),")\nto consider precisely how benchmarking was performed for Polkadot."),(0,i.kt)("h2",{id:"dot"},"DOT"),(0,i.kt)("h3",{id:"what-is-the-difference-between-dot-old-and-new-dot"},"What is the difference between DOT (old) and new DOT?"),(0,i.kt)("p",null,"The DOT (old) unit on Polkadot was at twelve decimal places, otherwise known as 1e12 Plancks. On 21\nAugust, 2020, Denomination Day, the DOT (old) value was redenominated to 1e10 (10_000_000_000, or\nten billion) Plancks, meaning that the new DOT was valued at ten decimal places. Following the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-redenomination"},"redenomination"),", the new DOT is called DOT."),(0,i.kt)("h3",{id:"what-is-the-inflation-rate-of-the-dot"},"What is the inflation rate of the DOT?"),(0,i.kt)("p",null,"The inflation rate is approximately 10% per year."),(0,i.kt)("p",null,"A portion of the inflation is rewarded to validators for performing their duties, while another\nportion may go directly to the treasury. The exact percentage that goes into both varies and is\nbased on the amount of DOT that are staked. Please see the article on\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking/#inflation"},"inflation")," for more information."),(0,i.kt)("h3",{id:"why-cant-crowdloaned-dot-be-staked"},"Why can't crowdloaned DOT be staked?"),(0,i.kt)("p",null,"DOTs contributed to a successful crowdloan campaign by a parachain are bonded for the entire lease\nperiod, which is two years on Polkadot. The crowdloaned DOT cannot be used for any other DOT utility\nfunctionalities like staking and democracy. In exchange to the lost staking rewards or liquidity of\nDOTs, the parachain team may offer rewards to the contributor."),(0,i.kt)("p",null,"The utility of crowdloaned DOT is to provide a lease for a parachain. The utility of staked DOT is\nto secure the network through a reward/slash mechanism. Allowing crowdloaned DOT to be staked\nresults in complex consequences like applying a slash on crowdloaned DOT that was meant to be bonded\nfor the entire lease period of a parachain. In a way, the inaccessibility of crowdloaned DOTs and\nthe lack of staking rewards for the entire lease duration encourages the contributors to back\nprojects that are valuable to the ecosystem."),(0,i.kt)("h2",{id:"governance"},"Governance"),(0,i.kt)("h3",{id:"what-prevents-polkadot-governance-from-failing"},"What prevents Polkadot governance from failing?"),(0,i.kt)("p",null,"Polkadot's governance has already been shown to work. Examples can be found in the runtime upgrades\nthat have successfully taken place through on the testnets as well as in a real economic environment\non ",(0,i.kt)("a",{parentName:"p",href:"https://guide.kusama.network"},"Kusama")," and Polkadot itself."),(0,i.kt)("p",null,"It 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."),(0,i.kt)("p",null,"Blockchains 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."),(0,i.kt)("h3",{id:"what-prevents-polkadot-governance-from-becoming-plutocratic"},"What prevents Polkadot governance from becoming plutocratic?"),(0,i.kt)("p",null,"A 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 ",(0,i.kt)("em",{parentName:"p"},"whales")," in trading parlance) and therefore become a mere\nplutocracy (rule of the rich)."),(0,i.kt)("p",null,"There 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 ",(0,i.kt)("em",{parentName:"p"},"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",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-governance"},"governance page"),"."),(0,i.kt)("h2",{id:"parachains"},"Parachains"),(0,i.kt)("h3",{id:"how-do-parachain-economics-work"},"How do parachain economics work?"),(0,i.kt)("p",null,"Parachains 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."),(0,i.kt)("h3",{id:"are-parachains-ephemeral-what-happens-when-a-parachain-loses-the-next-auction"},"Are parachains ephemeral? What happens when a parachain loses the next auction?"),(0,i.kt)("p",null,"Parachains are not ephemeral. As long as someone is keeping the data for a parachain, the parachain\ncan move between being a parachain, a parathread, or a separate sovereign chain at different points\nof its lifetime. Especially with parathreads, parachains can be decommissioned to only produce\nblocks when their usage and throughput makes it necessary."),(0,i.kt)("p",null,"When a parachain loses an auction for renewal, that parachain has a few options. In most cases,\nbecoming a parathread instead would be a suitable choice. Parathreads are still secured by the Relay\nChain, but don't need to hold a parachain slot and can produce a block when its economically\nfeasible for them. For more on parachains please see the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains"},"parachains page")," and for more on parathreads see\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parathreads"},"the parathreads page"),"."),(0,i.kt)("h2",{id:"networking"},"Networking"),(0,i.kt)("h3",{id:"what-is-libp2p"},"What is libp2p?"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://libp2p.io"},"Libp2p")," is a modular and extensible networking stack that is used by IPFS,\nSubstrate, and many other projects. It is a collection of peer-to-peer protocols for finding peers\nand connecting to them. Its modules have logic for content routing, peer routing, peer discovery,\ndifferent transports, and NAT traversals. It is intended to be used by applications for building\nlarge scale peer-to-peer networks by only selecting the parts of the protocol suite that are needed."),(0,i.kt)("p",null,"The Rust implementation of the specification was built and primarily maintained by a team of\ncontributors at Parity Technologies. The Go and JavaScript versions are maintained by Protocol Labs\nas well as community contributors. A ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/status-im/nim-libp2p"},"Nim")," version of the\nlibrary also exists. Libp2p as a whole is an open source project that is actively developed and\nexpanded on various code repositories hosted on ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/libp2p"},"their GitHub"),"."),(0,i.kt)("h3",{id:"does-polkadot-use-libp2p"},"Does Polkadot use libp2p?"),(0,i.kt)("p",null,"Yes, since Polkadot is built with Substrate. Substrate uses a networking protocol that is based on\nlibp2p (specifically the Rust libp2p library). However, Substrate uses a mix of standard libp2p\nprotocols and protocols that are homegrown and not official libp2p standards. Of the standards\nprotocols, those which are shared with other implementations of libp2p such as IPFS, are\nconnection-checking (ping), asking for information on a peer (identity), and Kademlia random walks\n(kad)."),(0,i.kt)("p",null,"Of the protocols that are custom to Substrate, there are the legacy Substrate stream, a\nrequest-response for getting information on blocks (sync), a light client protocol, a notification\nprotocol for transactions, and block announcement. For detailed information on how Substrate uses\nlibp2p and the standard and custom protocols, please see the\n",(0,i.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/sc_network/index.html"},"networking documentation"),"."),(0,i.kt)("h3",{id:"how-does-libp2p-differ-from-ipfs"},"How does libp2p differ from IPFS?"),(0,i.kt)("p",null,"The ",(0,i.kt)("a",{parentName:"p",href:"https://ipfs.io/"},"Interplanetary File System"),' (IPFS) is a peer-to-peer hypermedia protocol used\nprimarily for storage of files. It allows one to upload a file onto the network and share it with\nits content addressable URI. IPFS, like Substrate, is an application of libp2p and exists higher on\nthe technology stack. Although both IPFS and Substrate use libp2p, it cannot be said that Substrate\n"uses" IPFS since besides sharing the underlying library for networking there is no native\nintegration between the two applications.'),(0,i.kt)("h2",{id:"kusama"},"Kusama"),(0,i.kt)("h3",{id:"what-is-the-minimum-amount-of-ksm--dot-i-can-have-in-my-account"},"What is the minimum amount of KSM / DOT I can have in my account?"),(0,i.kt)("p",null,"Please see information about ",(0,i.kt)("a",{parentName:"p",href:"/docs/build-protocol-info"},"Existential Deposits"),"."),(0,i.kt)("h3",{id:"what-are-the-transfer-fees-for-kusama"},"What are the transfer fees for Kusama?"),(0,i.kt)("p",null,"It is important to note that the cost of transferring KSM is dynamic. Currently, the minimum cost of\ntransferring KSM is 0.01 KSM (the base fee), although this can be changed via governance. However,\nactual transaction fees will vary based on a variety of factors. Specifically, fee calculation\nfollows the following formula:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"base_fee + (tx_length * length_fee) + WeightToFee(weight)\n")),(0,i.kt)("p",null,"Please see the\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/how-to-guides/weights/calculate-fees/"},"fee calculation")," page in\nthe Substrate documentation for more detailed information."),(0,i.kt)("h2",{id:"answered-by-gav-series"},"Answered by Gav series"),(0,i.kt)("p",null,'The "Answered by Gav" series is a collection of posts uploaded to Reddit of questions that have been\nasked in the Polkadot Watercooler Riot channel and answered by Polkadot founder Gavin Wood.'),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.reddit.com/r/dot/comments/b87d96/answered_by_gav_reason_for_using_asynchronous/"},"Reason for using asynchronous rather than synchronous communication? Difference in terms of TPS?")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.reddit.com/r/dot/comments/b87awr/answered_by_gav_how_exactly_do_validators_in_an/"},"How exactly do validators in an ETH parachain keep moving around and how is communication between zones trustless?")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.reddit.com/r/dot/comments/b87bua/answered_by_gav_what_are_the_main_issues_with/"},"What are the main issues with Bitcoin integration and will it ever be possible? Same problem with other POW chains? Is Polkadot only going to work with POS chains? How is it trust-less in comparison to Cosmos though?")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.reddit.com/r/dot/comments/b87cjz/answered_by_gav_what_are_the_current_thoughts/"},"What are the current thoughts around governance especially since projects have to be voted in to receive the parachains security?")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.reddit.com/r/dot/comments/b87ds8/answered_by_gav_also_is_there_any_detailed/"},"Also is there any detailed overview of how exactly a token transfer from ETH could be exchanged with another chain's currency?")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.reddit.com/r/dot/comments/bcqrx9/answered_by_gav_can_i_run_multiple_validators/"},"Can I run multiple Validators with the same Session Key?")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.reddit.com/r/dot/comments/bcqwit/answered_by_gav_how_to_tackle_the_concentration/"},"How to tackle the concentration risk of Validators in data centers?"))))}k.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/493c7fdf.45bc5497.js b/assets/js/493c7fdf.45bc5497.js deleted file mode 100644 index 4c329b4b0b01..000000000000 --- a/assets/js/493c7fdf.45bc5497.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[2354],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>u});var n=a(74165),o=a(15861),i=a(67294),s=a(87152),r=a(17145),l=a(67425);function d(e,t,a){return c.apply(this,arguments)}function c(){return(c=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var i,l,d,c,h;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return d=new s.U(i),e.next=21,r.G.create({provider:d});case 21:c=e.sent,(h=a.split(".")).forEach((function(e){e in c&&(c=c[e])})),e.t1=h[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=c.toString(),e.abrupt("break",35);case 29:return e.next=31,c();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+h[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function h(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(e){var t=e.network,a=e.path,s=e.defaultValue,r=e.filter,l=void 0===r?void 0:r,c=(0,i.useState)(""),u=c[0],p=c[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?h(s.toString(),l,t,p):p(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t,a,p);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?h(o,l,t,p):p(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(r){console.log(r)}}}),[]),u}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},22703:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>d,default:()=>k,frontMatter:()=>l,metadata:()=>c,toc:()=>u});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),s=a(47940),r=["components"],l={id:"glossary",title:"Glossary",sidebar_label:"Glossary",description:"Common Terms and Concepts in the Polkadot Ecosystem.",keywords:["glossary","questions","definitions"],slug:"../glossary"},d=void 0,c={unversionedId:"general/glossary",id:"general/glossary",title:"Glossary",description:"Common Terms and Concepts in the Polkadot Ecosystem.",source:"@site/../docs/general/glossary.md",sourceDirName:"general",slug:"/glossary",permalink:"/docs/glossary",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/general/glossary.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696484972,formattedLastUpdatedAt:"Oct 5, 2023",frontMatter:{id:"glossary",title:"Glossary",sidebar_label:"Glossary",description:"Common Terms and Concepts in the Polkadot Ecosystem.",keywords:["glossary","questions","definitions"],slug:"../glossary"},sidebar:"docs",previous:{title:"FAQ",permalink:"/docs/faq"},next:{title:"Basics",permalink:"/docs/learn-basics-index"}},h={},u=[{value:"Active Nomination",id:"active-nomination",level:2},{value:"Alexander",id:"alexander",level:2},{value:"Asset Hub",id:"asset-hub",level:2},{value:"Attestation",id:"attestation",level:2},{value:"Auction (Parachain)",id:"auction-parachain",level:2},{value:"Aura",id:"aura",level:2},{value:"Authority",id:"authority",level:2},{value:"Availability Cores",id:"availability-cores",level:2},{value:"BABE",id:"babe",level:2},{value:"Bitfield Array",id:"bitfield-array",level:2},{value:"Block",id:"block",level:2},{value:"Blockspace",id:"blockspace",level:2},{value:"Block Explorer",id:"block-explorer",level:2},{value:"Blocks Nominations",id:"blocks-nominations",level:2},{value:"BLS",id:"bls",level:2},{value:"Bonding",id:"bonding",level:2},{value:"Bounty",id:"bounty",level:2},{value:"Bridge",id:"bridge",level:2},{value:"Byzantine Fault Tolerance",id:"byzantine-fault-tolerance",level:2},{value:"Capacity",id:"capacity",level:2},{value:"Candidate",id:"candidate",level:2},{value:"Collations",id:"collations",level:2},{value:"Collator",id:"collator",level:2},{value:"Collectives",id:"collectives",level:2},{value:"Commission",id:"commission",level:2},{value:"Common Good (Parachain)",id:"common-good-parachain",level:2},{value:"Community Queue",id:"community-queue",level:2},{value:"Consensus",id:"consensus",level:2},{value:"Crowdloan",id:"crowdloan",level:2},{value:"Curator",id:"curator",level:2},{value:"Dapps",id:"dapps",level:2},{value:"DOT",id:"dot",level:2},{value:"Duty Roster",id:"duty-roster",level:2},{value:"Epoch",id:"epoch",level:2},{value:"Era",id:"era",level:2},{value:"Equivocation",id:"equivocation",level:2},{value:"External Queue",id:"external-queue",level:2},{value:"Extrinsic",id:"extrinsic",level:2},{value:"Fellowship",id:"fellowship",level:2},{value:"Finality",id:"finality",level:2},{value:"Finality Gadget",id:"finality-gadget",level:2},{value:"Frame",id:"frame",level:2},{value:"Genesis",id:"genesis",level:2},{value:"Governance",id:"governance",level:2},{value:"Governance Council",id:"governance-council",level:2},{value:"GRANDPA Finality Gadget",id:"grandpa-finality-gadget",level:2},{value:"Hard Fork",id:"hard-fork",level:2},{value:"Hard Spoon",id:"hard-spoon",level:2},{value:"Horizontal Relay-routed Message Passing",id:"horizontal-relay-routed-message-passing",level:2},{value:"Inactive Nomination",id:"inactive-nomination",level:2},{value:"Inherent",id:"inherent",level:2},{value:"Injected Account",id:"injected-account",level:2},{value:"Interoperability",id:"interoperability",level:2},{value:"Keep-Alive Check",id:"keep-alive-check",level:2},{value:"KSM",id:"ksm",level:2},{value:"Kusama",id:"kusama",level:2},{value:"Lease Period",id:"lease-period",level:2},{value:"LIBP2P",id:"libp2p",level:2},{value:"Liveness",id:"liveness",level:2},{value:"Mainnet",id:"mainnet",level:2},{value:"Message",id:"message",level:2},{value:"Message Queue",id:"message-queue",level:2},{value:"Metadata",id:"metadata",level:2},{value:"Motion",id:"motion",level:2},{value:"Next Session",id:"next-session",level:2},{value:"Node Explorer",id:"node-explorer",level:2},{value:"Nominated Proof of Stake (NPoS)",id:"nominated-proof-of-stake-npos",level:2},{value:"Nominator",id:"nominator",level:2},{value:"Non-fungible Token (NFT)",id:"non-fungible-token-nft",level:2},{value:"On-chain Governance",id:"on-chain-governance",level:2},{value:"Online Message",id:"online-message",level:2},{value:"Polkadot OpenGov",id:"polkadot-opengov",level:2},{value:"Origin",id:"origin",level:2},{value:"Oversubscribed",id:"oversubscribed",level:2},{value:"Pallet",id:"pallet",level:2},{value:"Parachain",id:"parachain",level:2},{value:"Parachain Development Kit (PDK)",id:"parachain-development-kit-pdk",level:2},{value:"ParaID",id:"paraid",level:2},{value:"Parathread",id:"parathread",level:2},{value:"Parachain Registry",id:"parachain-registry",level:2},{value:"Parity Technologies",id:"parity-technologies",level:2},{value:"Polkadot",id:"polkadot",level:2},{value:"Polkadot Alliance",id:"polkadot-alliance",level:2},{value:"Host",id:"host",level:2},{value:"Runtime Environment",id:"runtime-environment",level:2},{value:"Preimage",id:"preimage",level:2},{value:"Proof of Stake (PoS)",id:"proof-of-stake-pos",level:2},{value:"Proof of Validity",id:"proof-of-validity",level:2},{value:"Proof of Work (PoW)",id:"proof-of-work-pow",level:2},{value:"Proposal",id:"proposal",level:2},{value:"Protocol",id:"protocol",level:2},{value:"Random Seed",id:"random-seed",level:2},{value:"Referendum",id:"referendum",level:2},{value:"Re-Genesis",id:"re-genesis",level:2},{value:"Relay Chain",id:"relay-chain",level:2},{value:"Remarks",id:"remarks",level:2},{value:"Rococo",id:"rococo",level:2},{value:"Root Origin",id:"root-origin",level:2},{value:"Runtime",id:"runtime",level:2},{value:"Runtime Module",id:"runtime-module",level:2},{value:"Safety",id:"safety",level:2},{value:"Scalability",id:"scalability",level:2},{value:"Sealing",id:"sealing",level:2},{value:"Session",id:"session",level:2},{value:"Session Certificate",id:"session-certificate",level:2},{value:"Session Key",id:"session-key",level:2},{value:"Shared Security",id:"shared-security",level:2},{value:"Slashing",id:"slashing",level:2},{value:"Soft Fork",id:"soft-fork",level:2},{value:"Software Development Kit (SDK)",id:"software-development-kit-sdk",level:2},{value:"Staking",id:"staking",level:2},{value:"State transition function",id:"state-transition-function",level:2},{value:"Substrate",id:"substrate",level:2},{value:"System Parachains",id:"system-parachains",level:2},{value:"Tabling",id:"tabling",level:2},{value:"Teleport",id:"teleport",level:2},{value:"Testnet",id:"testnet",level:2},{value:"Tokenization",id:"tokenization",level:2},{value:"Tracks",id:"tracks",level:2},{value:"Tranche",id:"tranche",level:2},{value:"Transfer",id:"transfer",level:2},{value:"Transaction",id:"transaction",level:2},{value:"Validator",id:"validator",level:2},{value:"Vertical Message Passing",id:"vertical-message-passing",level:2},{value:"Voting",id:"voting",level:2},{value:"Waiting Nomination",id:"waiting-nomination",level:2},{value:"Wallet",id:"wallet",level:2},{value:"Wasm",id:"wasm",level:2},{value:"Watermark",id:"watermark",level:2},{value:"Web3 Foundation",id:"web3-foundation",level:2},{value:"WebAssembly",id:"webassembly",level:2},{value:"Weights",id:"weights",level:2},{value:"Witness",id:"witness",level:2},{value:"Whitelist Pallet",id:"whitelist-pallet",level:2}],p={toc:u},m="wrapper";function k(e){var t=e.components,a=(0,o.Z)(e,r);return(0,i.kt)(m,(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"active-nomination"},"Active Nomination"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"alexander"},"Alexander"),(0,i.kt)("p",null,"The fourth (now defunct) proof of concept (PoC-4) ",(0,i.kt)("a",{parentName:"p",href:"#testnet"},"testnet")," for Polkadot."),(0,i.kt)("h2",{id:"asset-hub"},"Asset Hub"),(0,i.kt)("p",null,"A system parachain used for asset management."),(0,i.kt)("h2",{id:"attestation"},"Attestation"),(0,i.kt)("p",null,"In the Polkadot validity system, an\n",(0,i.kt)("em",{parentName:"p"},"attestation")," is a type of message that validators broadcast that says whether they think a\nparachain candidate block is valid or invalid."),(0,i.kt)("h2",{id:"auction-parachain"},"Auction (Parachain)"),(0,i.kt)("p",null,"Parachain auctions are how non-common-good parathreads win a slot to become a parachain."),(0,i.kt)("h2",{id:"aura"},"Aura"),(0,i.kt)("p",null,"Authority-based round-robin scheduling (AURA) provides a slot-based block authoring mechanism, where\na known set of authorities take turns producing blocks."),(0,i.kt)("h2",{id:"authority"},"Authority"),(0,i.kt)("p",null,"An authority is a generic term for the role in a blockchain that can participate in the consensus\nmechanisms. In ",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA"),", 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."),(0,i.kt)("h2",{id:"availability-cores"},"Availability Cores"),(0,i.kt)("p",null,"Slots 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."),(0,i.kt)("h2",{id:"babe"},"BABE"),(0,i.kt)("p",null,"Blind Assignment for Blockchain Extension (BABE) is\nPolkadot's block production mechanism."),(0,i.kt)("h2",{id:"bitfield-array"},"Bitfield Array"),(0,i.kt)("p",null,"A bitfield array contains single-bit values which indicate whether a ",(0,i.kt)("a",{parentName:"p",href:"#candidate"},"candidate")," is\navailable. The number of items is equal of to the number of\n",(0,i.kt)("a",{parentName:"p",href:"#availability-cores"},"availability cores")," and each bit represents a vote on the corresponding core\nin the given order."),(0,i.kt)("h2",{id:"block"},"Block"),(0,i.kt)("p",null,"A collection of data, such as transactions, that together indicate a state transition of the\nblockchain."),(0,i.kt)("h2",{id:"blockspace"},"Blockspace"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/blockspace-blockspace-ecosystems-how-polkadot-is-unlocking-the-full-potential-of-web3"},"Blockspace"),"\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",(0,i.kt)("a",{parentName:"p",href:"https://www.rob.tech/blog/polkadot-blockspace-over-blockchains/"},"blockspace-centric architecture"),"."),(0,i.kt)("h2",{id:"block-explorer"},"Block Explorer"),(0,i.kt)("p",null,"An application that allows a user to explore the different blocks on a blockchain."),(0,i.kt)("h2",{id:"blocks-nominations"},"Blocks Nominations"),(0,i.kt)("p",null,"This indicates that a validator does not currently allow any more nominations. This is controlled by\nthe validator."),(0,i.kt)("h2",{id:"bls"},"BLS"),(0,i.kt)("p",null,"Boneh-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."),(0,i.kt)("h2",{id:"bonding"},"Bonding"),(0,i.kt)("p",null,'A 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. You can\nalso bond tokens in exchange for a parachain slot.'),(0,i.kt)("h2",{id:"bounty"},"Bounty"),(0,i.kt)("p",null,"A mechanism which works in some sense as the reverse of a Treasury Proposal, allowing the\nPolkadot Council to indicate that there is a\nneed to do some task for the Polkadot network\nand allowing users to receive DOT in return for working on that task."),(0,i.kt)("h2",{id:"bridge"},"Bridge"),(0,i.kt)("p",null,"A parachain that acts as an intermediary between the\nPolkadot Relay Chain and an external chain, in\nsuch a way that it appears to the Relay Chain that the external chain is a parachain (i.e., meets\nthe Polkadot Host's requirements of\nparachains). Bridges allow for interaction between other blockchains, such as Ethereum and Bitcoin,\nthat are not natively compatible with\nPolkadot."),(0,i.kt)("h2",{id:"byzantine-fault-tolerance"},"Byzantine Fault Tolerance"),(0,i.kt)("p",null,"The 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."),(0,i.kt)("h2",{id:"capacity"},"Capacity"),(0,i.kt)("p",null,'The maximum number of nominators signalling intent to nominate a validator (and thus could\npotentially actively nominate that validator in the next session). This maximum number will equal\nthe number of nominators necessary to oversubscribe a validator. Any validator which is "at\ncapacity" or higher may potentially be oversubscribed in the next session; a validator that is not\nat capacity cannot be oversubscribed unless more nominators select it before the next election.'),(0,i.kt)("h2",{id:"candidate"},"Candidate"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"collations"},"Collations"),(0,i.kt)("p",null,"Parachain blocks or candidates that are being proposed to the\nPolkadot relay chain validators. More\nspecifically, a collation is a ",(0,i.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#defn-collation"},"data structure")," which\ncontains the proposed parachain candidate, including an optional validation parachain Runtime update\nand upward messages."),(0,i.kt)("h2",{id:"collator"},"Collator"),(0,i.kt)("p",null,"A node that maintains a parachain by collecting parachain transactions and producing state\ntransition proofs for the validators."),(0,i.kt)("h2",{id:"collectives"},"Collectives"),(0,i.kt)("p",null,"The Polkadot Collectives parachain was added in\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/referendum/81"},"Referendum 81")," and exists only on Polkadot (i.e.,\nthere is no Kusama equivalent). The Collectives chain hosts on-chain collectives that serve the\nPolkadot network, such as the ",(0,i.kt)("a",{parentName:"p",href:"#fellowship"},"Fellowship")," and ",(0,i.kt)("a",{parentName:"p",href:"#polkadot-alliance"},"Polkadot Alliance"),"."),(0,i.kt)("h2",{id:"commission"},"Commission"),(0,i.kt)("p",null,"Validators 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."),(0,i.kt)("h2",{id:"common-good-parachain"},"Common Good (Parachain)"),(0,i.kt)("p",null,"See ",(0,i.kt)("a",{parentName:"p",href:"#system-parachains"},"System Parachains"),', which is generally preferred over the term "common\ngood".'),(0,i.kt)("h2",{id:"community-queue"},"Community Queue"),(0,i.kt)("p",null,"The queue for proposals originating from individual accounts (i.e. not the Council) which are\nwaiting to become referenda. Compare the External queue."),(0,i.kt)("h2",{id:"consensus"},"Consensus"),(0,i.kt)("p",null,"The 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\n",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA"),"."),(0,i.kt)("h2",{id:"crowdloan"},"Crowdloan"),(0,i.kt)("p",null,"A mechanism for potential parachains to temporarily source tokens to win an auction for a parachain\nslot. Tokens gathered in this way are programmatically returned to the lender after the lease period\nis over or the crowdloan period ends."),(0,i.kt)("h2",{id:"curator"},"Curator"),(0,i.kt)("p",null,"A person, group, or other entity charged with judging and verifying the successful completion of a\nBounty."),(0,i.kt)("h2",{id:"dapps"},"Dapps"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"dot"},"DOT"),(0,i.kt)("p",null,'The 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).'),(0,i.kt)("h2",{id:"duty-roster"},"Duty Roster"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"epoch"},"Epoch"),(0,i.kt)("p",null,"An 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 ",(0,i.kt)("a",{parentName:"p",href:"#session"},"session"),"."),(0,i.kt)("h2",{id:"era"},"Era"),(0,i.kt)("p",null,"A (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."),(0,i.kt)("h2",{id:"equivocation"},"Equivocation"),(0,i.kt)("p",null,"Providing conflicting information to the network. BABE equivocation entails creating multiple blocks\nin the same slot. ",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA")," equivocation would consist of signing multiple\nconflicting chains."),(0,i.kt)("h2",{id:"external-queue"},"External Queue"),(0,i.kt)("p",null,"The queue for proposals originating with the\nPolkadot Council which are waiting to become\nreferenda. Compare the Community queue."),(0,i.kt)("h2",{id:"extrinsic"},"Extrinsic"),(0,i.kt)("p",null,"A ",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/scale-codec/"},"SCALE encoded"),' 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"',(0,i.kt)("a",{parentName:"p",href:"#inherent"},"inherents"),'" and "',(0,i.kt)("a",{parentName:"p",href:"#transaction"},"transactions"),'". For more technical details see the\n',(0,i.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#id-extrinsics"},"polkadot spec")),(0,i.kt)("h2",{id:"fellowship"},"Fellowship"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"finality"},"Finality"),(0,i.kt)("p",null,'The 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\nPolkadot Relay Chain uses a deterministic\nfinality gadget known as ',(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA"),"."),(0,i.kt)("h2",{id:"finality-gadget"},"Finality Gadget"),(0,i.kt)("p",null,"A mechanism that determines finality."),(0,i.kt)("h2",{id:"frame"},"Frame"),(0,i.kt)("p",null,"The collection of Substrate-provided pallets (Substrate Runtime Modules)."),(0,i.kt)("h2",{id:"genesis"},"Genesis"),(0,i.kt)("p",null,"The origin of a blockchain, also known as block 0. It can also be used to reference the initial\nstate of the blockchain at origination."),(0,i.kt)("admonition",{title:"Example",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"In the ",(0,i.kt)("em",{parentName:"p"},"genesis")," state Alice, Bob, and Charlie had 30 tokens each.")),(0,i.kt)("h2",{id:"governance"},"Governance"),(0,i.kt)("p",null,"The process of determining what changes to the network are permissible, such as modifications to\ncode or movement of funds. The governance system in\nPolkadot is on-chain and revolves around\nstakeholder voting."),(0,i.kt)("h2",{id:"governance-council"},"Governance Council"),(0,i.kt)("p",null,'An 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.'),(0,i.kt)("h2",{id:"grandpa-finality-gadget"},"GRANDPA Finality Gadget"),(0,i.kt)("p",null,"GHOST-based Recursive ANcestor Deriving Prefix Agreement. It is the finality gadget for\nPolkadot, which allows asynchronous,\naccountable, and safe finality to the blockchain. For an overview of GRANDPA, see\n",(0,i.kt)("a",{parentName:"p",href:"https://medium.com/polkadot-network/polkadot-proof-of-concept-3-a-better-consensus-algorithm-e81c380a2372"},"this Medium post")),(0,i.kt)("h2",{id:"hard-fork"},"Hard Fork"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"hard-spoon"},"Hard Spoon"),(0,i.kt)("p",null,'Defined 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 ',(0,i.kt)("em",{parentName:"p"},"the same blockchain"),"."),(0,i.kt)("h2",{id:"horizontal-relay-routed-message-passing"},"Horizontal Relay-routed Message Passing"),(0,i.kt)("p",null,"Horizontal 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."),(0,i.kt)("h2",{id:"inactive-nomination"},"Inactive Nomination"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"inherent"},"Inherent"),(0,i.kt)("p",null,'Extrinsics 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 ',(0,i.kt)("a",{parentName:"p",href:"#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."),(0,i.kt)("h2",{id:"injected-account"},"Injected Account"),(0,i.kt)("p",null,"An account that is not directly managed by the Polkadot UI but can be accessed through it, such as\naccounts controlled by the Polkadot{.js} extension."),(0,i.kt)("h2",{id:"interoperability"},"Interoperability"),(0,i.kt)("p",null,'The ability for some sort of system to exchange and make use of information often compared to\n"cross-chain" technologies.'),(0,i.kt)("h2",{id:"keep-alive-check"},"Keep-Alive Check"),(0,i.kt)("p",null,"The 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."),(0,i.kt)("h2",{id:"ksm"},"KSM"),(0,i.kt)("p",null,"The abbreviation for Kusama network tokens."),(0,i.kt)("h2",{id:"kusama"},"Kusama"),(0,i.kt)("p",null,'The "canary network" for Polkadot. It consists of an early-release, unaudited version of the\nPolkadot software. It is ',(0,i.kt)("strong",{parentName:"p"},"not")," a ",(0,i.kt)("a",{parentName:"p",href:"#testnet"},"testnet")," - after the transition to NPoS, the network\nis entirely in the hands of the community (i.e., Kusama token holders)."),(0,i.kt)("h2",{id:"lease-period"},"Lease Period"),(0,i.kt)("p",null,"A particular amount of time that a parachain for which the parachain can connect to the Relay Chain."),(0,i.kt)("h2",{id:"libp2p"},"LIBP2P"),(0,i.kt)("p",null,"An open-source library for encrypted peer-to-peer communications and other networking functions.\nMore information at: ",(0,i.kt)("a",{parentName:"p",href:"https://libp2p.io/"},"https://libp2p.io/")),(0,i.kt)("h2",{id:"liveness"},"Liveness"),(0,i.kt)("p",null,"The 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."),(0,i.kt)("h2",{id:"mainnet"},"Mainnet"),(0,i.kt)("p",null,'Short for "main network": the fully functional and acting chain that runs its own network.'),(0,i.kt)("h2",{id:"message"},"Message"),(0,i.kt)("p",null,"In Polkadot's XCMP protocol, a ",(0,i.kt)("em",{parentName:"p"},"message")," is\narbitrary data that is sent from one parachain (the egress chain) to another (the ingress chain)\nthrough a channel and ensured delivery by the validator set."),(0,i.kt)("h2",{id:"message-queue"},"Message Queue"),(0,i.kt)("p",null,"In Polkadot's XCMP protocol, a ",(0,i.kt)("em",{parentName:"p"},"message queue"),"\nis the list of messages waiting to be processed by a particular receiving parachain over a channel."),(0,i.kt)("h2",{id:"metadata"},"Metadata"),(0,i.kt)("p",null,"Data that includes information about other data, such as information about a specific transaction."),(0,i.kt)("h2",{id:"motion"},"Motion"),(0,i.kt)("p",null,'A 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.'),(0,i.kt)("h2",{id:"next-session"},"Next Session"),(0,i.kt)("p",null,"This indicates that the validator will be a member of the active set in the next session."),(0,i.kt)("h2",{id:"node-explorer"},"Node Explorer"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"nominated-proof-of-stake-npos"},"Nominated Proof of Stake (NPoS)"),(0,i.kt)("p",null,"A 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. Polkadot uses the\nPhragm\xe9n method to allocate stake to nominees."),(0,i.kt)("h2",{id:"nominator"},"Nominator"),(0,i.kt)("p",null,"Accounts 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."),(0,i.kt)("h2",{id:"non-fungible-token-nft"},"Non-fungible Token (NFT)"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"on-chain-governance"},"On-chain Governance"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"online-message"},"Online Message"),(0,i.kt)("p",null,'This is a message that is broadcast by a validator to verify to the network that the validator is\nonline, even if they haven\'t published a block this epoch. This is sometimes referred to as\n"ImOnline".'),(0,i.kt)("h2",{id:"polkadot-opengov"},"Polkadot OpenGov"),(0,i.kt)("p",null,"Previously known as Governance v2 (Gov2) during early development,\n",(0,i.kt)("a",{parentName:"p",href:"../learn/learn-polkadot-opengov"},"Polkadot OpenGov")," serves as the current governance protocol for\nboth Kusama and Polkadot."),(0,i.kt)("h2",{id:"origin"},"Origin"),(0,i.kt)("p",null,"The initiator of an extrinsic. A simple origin would be the account that is sending a token to\nanother account. Polkadot also supports more\ncomplex origin types, such as the ",(0,i.kt)("a",{parentName:"p",href:"#root-origin"},"root origin"),", from which privileged functions can\nbe called."),(0,i.kt)("h2",{id:"oversubscribed"},"Oversubscribed"),(0,i.kt)("p",null,'If more than the maximum number of nominators nominate the same validator, it is "oversubscribed",\nand only the top staked nominators (ranked by the amount of stake, up to the maximum number of\nnominators) are paid rewards. Other nominators will receive no rewards for that era. The current\nmaximum number of nominators is\n',(0,i.kt)(s.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"})," on Polkadot,\n","\nbut it can be modified via governance."),(0,i.kt)("h2",{id:"pallet"},"Pallet"),(0,i.kt)("p",null,"A ",(0,i.kt)("a",{parentName:"p",href:"#substrate"},"Substrate")," runtime module."),(0,i.kt)("h2",{id:"parachain"},"Parachain"),(0,i.kt)("p",null,'A blockchain that meets several characteristics that allow it to work within the confines of the\nPolkadot Host. Also known as "parallelized\nchain."'),(0,i.kt)("h2",{id:"parachain-development-kit-pdk"},"Parachain Development Kit (PDK)"),(0,i.kt)("p",null,"Similar to an ",(0,i.kt)("a",{parentName:"p",href:"#sdk"},"SDK"),", parachain development kits (PDK) is a set of tools that make it easy for\ndevelopers to create Polkadot compatible\n",(0,i.kt)("a",{parentName:"p",href:"#parachain"},"parachains"),"."),(0,i.kt)("h2",{id:"paraid"},"ParaID"),(0,i.kt)("p",null,"A unique numeric (non-negative integer) identifier for a parathread."),(0,i.kt)("h2",{id:"parathread"},"Parathread"),(0,i.kt)("p",null,'A blockchain that works within the confines of the\nPolkadot Host, thus allowing it to connect to\nthe Polkadot Relay Chain. This can be done either by becoming a parachain or connecting on a "pay as\nyou go" basis. All parachains start their life-cycle as a parathread.'),(0,i.kt)("h2",{id:"parachain-registry"},"Parachain Registry"),(0,i.kt)("p",null,"A relatively simple database-like construct that holds both static and dynamic information on each\nchain."),(0,i.kt)("h2",{id:"parity-technologies"},"Parity Technologies"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"polkadot"},"Polkadot"),(0,i.kt)("p",null,"A heterogeneous, multi-chain network allowing various blockchains of different characteristics to\nperform arbitrary, cross-chain communication under shared security."),(0,i.kt)("h2",{id:"polkadot-alliance"},"Polkadot Alliance"),(0,i.kt)("p",null,"The Polkadot Alliance is an ",(0,i.kt)("a",{parentName:"p",href:"#collectives"},"on-chain collective")," founded by Acala, Astar, Interlay,\nKilt, Moonbeam, Phala, and Subscan, to establish standards and ethics for open-source development in\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/referendum/94"},"referendum #94"),". It aims to support development\nstandards and expose bad actors within the ecosystems of Polkadot."),(0,i.kt)("h2",{id:"host"},"Host"),(0,i.kt)("p",null,"The environment in which a runtime module can be executed. Parachains must support the\nPolkadot Host - external chains that do not\nwill have to use a bridge. Previously known as the\nPolkadot Runtime Environment."),(0,i.kt)("h2",{id:"runtime-environment"},"Runtime Environment"),(0,i.kt)("p",null,"The previous name for the Polkadot\n",(0,i.kt)("a",{parentName:"p",href:"#polkadot-host"},"Host"),"."),(0,i.kt)("h2",{id:"preimage"},"Preimage"),(0,i.kt)("p",null,"The 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",(0,i.kt)("strong",{parentName:"p"},"preimage")," can be submitted and stored on-chain against the hash later, upon the proposal's\ndispatch."),(0,i.kt)("h2",{id:"proof-of-stake-pos"},"Proof of Stake (PoS)"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"proof-of-validity"},"Proof of Validity"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"proof-of-work-pow"},"Proof of Work (PoW)"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"proposal"},"Proposal"),(0,i.kt)("p",null,"A potential function call to be voted on in a referendum. Proposals modify the behavior of the\nPolkadot network, from minor parameter tuning\nup to replacing the runtime code."),(0,i.kt)("h2",{id:"protocol"},"Protocol"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"random-seed"},"Random Seed"),(0,i.kt)("p",null,"A random seed is a pseudo-random number available on-chain. It is used in various places of the\nPolkadot protocol, most prominently in\n",(0,i.kt)("a",{parentName:"p",href:"#babe"},"BABE")," the block production mechanism."),(0,i.kt)("h2",{id:"referendum"},"Referendum"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"re-genesis"},"Re-Genesis"),(0,i.kt)("p",null,"Re-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",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/issues/7458"},"Re-Genesis Rationale and Design"),"."),(0,i.kt)("h2",{id:"relay-chain"},"Relay Chain"),(0,i.kt)("p",null,"The chain that coordinates consensus and communication between parachains (and external chains, via\nbridges)."),(0,i.kt)("h2",{id:"remarks"},"Remarks"),(0,i.kt)("p",null,"Remarks are extrinsics with no effect. They provide additional information to external inputs,\nacting as ",(0,i.kt)("em",{parentName:"p"},"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."),(0,i.kt)("h2",{id:"rococo"},"Rococo"),(0,i.kt)("p",null,"The ",(0,i.kt)("a",{parentName:"p",href:"#testnet"},"testnet")," set aside for testing parachains, cumulus, and related technology."),(0,i.kt)("h2",{id:"root-origin"},"Root Origin"),(0,i.kt)("p",null,"A system-level origin in ",(0,i.kt)("a",{parentName:"p",href:"#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 ",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/main-docs/build/origins/"},"Substrate Docs")),(0,i.kt)("h2",{id:"runtime"},"Runtime"),(0,i.kt)("p",null,"The state transition function of a blockchain. It defines a valid algorithm for determining the\nstate of the next block given the previous state."),(0,i.kt)("h2",{id:"runtime-module"},"Runtime Module"),(0,i.kt)("p",null,'A 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".'),(0,i.kt)("h2",{id:"safety"},"Safety"),(0,i.kt)("p",null,"The property of a distributed system indicating that a particular state transition will not be\nreverted. ",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA")," provides ",(0,i.kt)("em",{parentName:"p"},"deterministic"),' safety. That is, for a state\nchanged marked as "safe" or "final", one would require a hard fork to revert that change.'),(0,i.kt)("h2",{id:"scalability"},"Scalability"),(0,i.kt)("p",null,"While 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."),(0,i.kt)("h2",{id:"sealing"},"Sealing"),(0,i.kt)("p",null,"The process of adding a block to the Relay Chain. Note that finalization is a separate process -\nblocks are finalized sometime after they are sealed."),(0,i.kt)("h2",{id:"session"},"Session"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"session-certificate"},"Session Certificate"),(0,i.kt)("p",null,"A message containing a signature on the concatenation of all the Session keys."),(0,i.kt)("h2",{id:"session-key"},"Session Key"),(0,i.kt)("p",null,"Hot keys that are used for performing network operations by validators, for example, signing\n",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA")," commit messages."),(0,i.kt)("h2",{id:"shared-security"},"Shared Security"),(0,i.kt)("p",null,"The security model that Polkadot uses whereby\nall chains are equally secured. This is achieved by placing proofs of the validity of parachain\nblocks into the Relay Chain such that, in order to revert finality of a single parachain, an\nattacker would need to attack the entire\nPolkadot system."),(0,i.kt)("h2",{id:"slashing"},"Slashing"),(0,i.kt)("p",null,"The removal of a percentage of an account's DOT as a punishment for a validator acting maliciously\nor incompetently (e.g., equivocating or remaining offline for an extended period)."),(0,i.kt)("h2",{id:"soft-fork"},"Soft Fork"),(0,i.kt)("p",null,'A 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.'),(0,i.kt)("h2",{id:"software-development-kit-sdk"},"Software Development Kit (SDK)"),(0,i.kt)("p",null,"A collection of software tools (and programs) packaged together that can be used to develop\nsoftware."),(0,i.kt)("h2",{id:"staking"},"Staking"),(0,i.kt)("p",null,'The act of bonding tokens for Polkadot (DOT)\nby putting them up as "collateral" for a chance to produce a\nvalid block (and thus obtain a block reward). Validators and nominators stake their\nDOT in order to secure the network.'),(0,i.kt)("h2",{id:"state-transition-function"},"State transition function"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"substrate"},"Substrate"),(0,i.kt)("p",null,"A modular framework for building blockchains.\nPolkadot is built using\n",(0,i.kt)("a",{parentName:"p",href:"https://substrate.io/"},"Substrate"),". Chains built with Substrate will be easy to connect as\nparachains. For developers, see the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate"},"Substrate GitHub repository"),"."),(0,i.kt)("h2",{id:"system-parachains"},"System Parachains"),(0,i.kt)("p",null,"Parachains that are part of the Polkadot core protocol. These are allocated a parachain execution\ncore by governance rather than auction."),(0,i.kt)("h2",{id:"tabling"},"Tabling"),(0,i.kt)("p",null,'In Polkadot governance, bringing a proposal to\na vote via referendum. Note that this is the British meaning of "tabling", which is different from\nthe US version, which means "to postpone" a measure.'),(0,i.kt)("h2",{id:"teleport"},"Teleport"),(0,i.kt)("p",null,"Send 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."),(0,i.kt)("h2",{id:"testnet"},"Testnet"),(0,i.kt)("p",null,'Short 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 ',(0,i.kt)("a",{parentName:"p",href:"#mainnet"},"mainnet"),"."),(0,i.kt)("h2",{id:"tokenization"},"Tokenization"),(0,i.kt)("p",null,"The process of replacing sensitive data with non-sensitive data."),(0,i.kt)("h2",{id:"tracks"},"Tracks"),(0,i.kt)("p",null,"Each ",(0,i.kt)("a",{parentName:"p",href:"#origin"},"Origin")," is associated with a single referendum class and each class is associated\nwith a ",(0,i.kt)("a",{parentName:"p",href:"../maintain/maintain-guides-polkadot-opengov#origins-and-tracks"},"Track"),". 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."),(0,i.kt)("h2",{id:"tranche"},"Tranche"),(0,i.kt)("p",null,"Validators 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",(0,i.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#sect-rt-api-availability-cores"},"Runtime API"),", and increments the\ntick every 500 milliseconds. Each tick/increment is referred to as a \u201ctranche\u201d, represented as an\ninteger, starting at 0."),(0,i.kt)("h2",{id:"transfer"},"Transfer"),(0,i.kt)("p",null,"Send an asset from one account to another. This generally refers to transfers that occur only on the\nsame chain."),(0,i.kt)("h2",{id:"transaction"},"Transaction"),(0,i.kt)("p",null,'An 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.'),(0,i.kt)("h2",{id:"validator"},"Validator"),(0,i.kt)("p",null,"A node that secures the Relay Chain by staking DOT, validating proofs from collators on parachains\nand voting on consensus along with other validators."),(0,i.kt)("h2",{id:"vertical-message-passing"},"Vertical Message Passing"),(0,i.kt)("p",null,"Vertical 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",(0,i.kt)("a",{parentName:"p",href:"#Horizontal-Relay-routed-Message-Passing"},"HRMP"),". Upward messages originate from parachains and go\nup to the Relay Chain via runtime entry points."),(0,i.kt)("h2",{id:"voting"},"Voting"),(0,i.kt)("p",null,"The 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."),(0,i.kt)("h2",{id:"waiting-nomination"},"Waiting Nomination"),(0,i.kt)("p",null,"The 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."),(0,i.kt)("h2",{id:"wallet"},"Wallet"),(0,i.kt)("p",null,"A program that allows one to store private keys and sign transactions for\nPolkadot or other blockchain networks."),(0,i.kt)("h2",{id:"wasm"},"Wasm"),(0,i.kt)("p",null,"The abbreviation for ",(0,i.kt)("a",{parentName:"p",href:"#webassembly"},"WebAssembly"),"."),(0,i.kt)("h2",{id:"watermark"},"Watermark"),(0,i.kt)("p",null,"In Polkadot's parachain messaging scheme, the ",(0,i.kt)("em",{parentName:"p"},"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."),(0,i.kt)("h2",{id:"web3-foundation"},"Web3 Foundation"),(0,i.kt)("p",null,"A 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",(0,i.kt)("a",{parentName:"p",href:"/docs/web3-and-polkadot"},"Web3 ecosystem"),"."),(0,i.kt)("h2",{id:"webassembly"},"WebAssembly"),(0,i.kt)("p",null,"An instruction format for a virtual, stack-based machine.\nPolkadot Runtime Modules are compiled to\nWebAssembly. Also known as Wasm."),(0,i.kt)("h2",{id:"weights"},"Weights"),(0,i.kt)("p",null,"A 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 ",(0,i.kt)("a",{parentName:"p",href:"#extrinsic"},"extrinsics"),") are determined before\nexecution. Checkout this section of the Substrate docs covering\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/build/tx-weights-fees/"},"transaction weights and fees"),"."),(0,i.kt)("h2",{id:"witness"},"Witness"),(0,i.kt)("p",null,"Cryptographic proof statements of data validity."),(0,i.kt)("h2",{id:"whitelist-pallet"},"Whitelist Pallet"),(0,i.kt)("p",null,"Allows one ",(0,i.kt)("a",{parentName:"p",href:"#origin"},"Origin ")," to escalate the privilege level of another Origin for a certain\noperation. In terms of OpenGov, it allows the ",(0,i.kt)("a",{parentName:"p",href:"#fellowship"},"Fellowship")," to authorise a new origin\n(which we will call Whitelisted-Root) to be executed with Root-level privileges."))}k.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/493c7fdf.ced4c426.js b/assets/js/493c7fdf.ced4c426.js new file mode 100644 index 000000000000..55a7a8102672 --- /dev/null +++ b/assets/js/493c7fdf.ced4c426.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[2354],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>u});var n=a(74165),o=a(15861),i=a(67294),s=a(87152),r=a(17145),l=a(67425);function d(e,t,a){return c.apply(this,arguments)}function c(){return(c=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var i,l,d,c,h;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return d=new s.U(i),e.next=21,r.G.create({provider:d});case 21:c=e.sent,(h=a.split(".")).forEach((function(e){e in c&&(c=c[e])})),e.t1=h[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=c.toString(),e.abrupt("break",35);case 29:return e.next=31,c();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+h[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function h(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"permillToPercent":(0,l.PermillToPercent)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(e){var t=e.network,a=e.path,s=e.defaultValue,r=e.filter,l=void 0===r?void 0:r,c=(0,i.useState)(""),u=c[0],p=c[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?h(s.toString(),l,t,p):p(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t,a,p);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?h(o,l,t,p):p(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(r){console.log(r)}}}),[]),u}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},22703:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>d,default:()=>k,frontMatter:()=>l,metadata:()=>c,toc:()=>u});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),s=a(47940),r=["components"],l={id:"glossary",title:"Glossary",sidebar_label:"Glossary",description:"Common Terms and Concepts in the Polkadot Ecosystem.",keywords:["glossary","questions","definitions"],slug:"../glossary"},d=void 0,c={unversionedId:"general/glossary",id:"general/glossary",title:"Glossary",description:"Common Terms and Concepts in the Polkadot Ecosystem.",source:"@site/../docs/general/glossary.md",sourceDirName:"general",slug:"/glossary",permalink:"/docs/glossary",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/general/glossary.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1697709829,formattedLastUpdatedAt:"Oct 19, 2023",frontMatter:{id:"glossary",title:"Glossary",sidebar_label:"Glossary",description:"Common Terms and Concepts in the Polkadot Ecosystem.",keywords:["glossary","questions","definitions"],slug:"../glossary"},sidebar:"docs",previous:{title:"FAQ",permalink:"/docs/faq"},next:{title:"Basics",permalink:"/docs/learn-basics-index"}},h={},u=[{value:"Active Nomination",id:"active-nomination",level:2},{value:"Alexander",id:"alexander",level:2},{value:"Asset Hub",id:"asset-hub",level:2},{value:"Attestation",id:"attestation",level:2},{value:"Auction (Parachain)",id:"auction-parachain",level:2},{value:"Aura",id:"aura",level:2},{value:"Authority",id:"authority",level:2},{value:"Availability Cores",id:"availability-cores",level:2},{value:"BABE",id:"babe",level:2},{value:"Bitfield Array",id:"bitfield-array",level:2},{value:"Block",id:"block",level:2},{value:"Blockspace",id:"blockspace",level:2},{value:"Block Explorer",id:"block-explorer",level:2},{value:"Blocks Nominations",id:"blocks-nominations",level:2},{value:"BLS",id:"bls",level:2},{value:"Bonding",id:"bonding",level:2},{value:"Bounty",id:"bounty",level:2},{value:"Bridge",id:"bridge",level:2},{value:"Byzantine Fault Tolerance",id:"byzantine-fault-tolerance",level:2},{value:"Capacity",id:"capacity",level:2},{value:"Candidate",id:"candidate",level:2},{value:"Collations",id:"collations",level:2},{value:"Collator",id:"collator",level:2},{value:"Collectives",id:"collectives",level:2},{value:"Commission",id:"commission",level:2},{value:"Common Good (Parachain)",id:"common-good-parachain",level:2},{value:"Community Queue",id:"community-queue",level:2},{value:"Consensus",id:"consensus",level:2},{value:"Crowdloan",id:"crowdloan",level:2},{value:"Curator",id:"curator",level:2},{value:"Dapps",id:"dapps",level:2},{value:"DOT",id:"dot",level:2},{value:"Duty Roster",id:"duty-roster",level:2},{value:"Epoch",id:"epoch",level:2},{value:"Era",id:"era",level:2},{value:"Equivocation",id:"equivocation",level:2},{value:"External Queue",id:"external-queue",level:2},{value:"Extrinsic",id:"extrinsic",level:2},{value:"Fellowship",id:"fellowship",level:2},{value:"Finality",id:"finality",level:2},{value:"Finality Gadget",id:"finality-gadget",level:2},{value:"Frame",id:"frame",level:2},{value:"Genesis",id:"genesis",level:2},{value:"Governance",id:"governance",level:2},{value:"Governance Council",id:"governance-council",level:2},{value:"GRANDPA Finality Gadget",id:"grandpa-finality-gadget",level:2},{value:"Hard Fork",id:"hard-fork",level:2},{value:"Hard Spoon",id:"hard-spoon",level:2},{value:"Horizontal Relay-routed Message Passing",id:"horizontal-relay-routed-message-passing",level:2},{value:"Inactive Nomination",id:"inactive-nomination",level:2},{value:"Inherent",id:"inherent",level:2},{value:"Injected Account",id:"injected-account",level:2},{value:"Interoperability",id:"interoperability",level:2},{value:"Keep-Alive Check",id:"keep-alive-check",level:2},{value:"KSM",id:"ksm",level:2},{value:"Kusama",id:"kusama",level:2},{value:"Lease Period",id:"lease-period",level:2},{value:"LIBP2P",id:"libp2p",level:2},{value:"Liveness",id:"liveness",level:2},{value:"Mainnet",id:"mainnet",level:2},{value:"Message",id:"message",level:2},{value:"Message Queue",id:"message-queue",level:2},{value:"Metadata",id:"metadata",level:2},{value:"Motion",id:"motion",level:2},{value:"Next Session",id:"next-session",level:2},{value:"Node Explorer",id:"node-explorer",level:2},{value:"Nominated Proof of Stake (NPoS)",id:"nominated-proof-of-stake-npos",level:2},{value:"Nominator",id:"nominator",level:2},{value:"Non-fungible Token (NFT)",id:"non-fungible-token-nft",level:2},{value:"On-chain Governance",id:"on-chain-governance",level:2},{value:"Online Message",id:"online-message",level:2},{value:"Polkadot OpenGov",id:"polkadot-opengov",level:2},{value:"Origin",id:"origin",level:2},{value:"Oversubscribed",id:"oversubscribed",level:2},{value:"Pallet",id:"pallet",level:2},{value:"Parachain",id:"parachain",level:2},{value:"Parachain Development Kit (PDK)",id:"parachain-development-kit-pdk",level:2},{value:"ParaID",id:"paraid",level:2},{value:"Parathread",id:"parathread",level:2},{value:"Parachain Registry",id:"parachain-registry",level:2},{value:"Parity Technologies",id:"parity-technologies",level:2},{value:"Polkadot",id:"polkadot",level:2},{value:"Polkadot Alliance",id:"polkadot-alliance",level:2},{value:"Host",id:"host",level:2},{value:"Runtime Environment",id:"runtime-environment",level:2},{value:"Preimage",id:"preimage",level:2},{value:"Proof of Stake (PoS)",id:"proof-of-stake-pos",level:2},{value:"Proof of Validity",id:"proof-of-validity",level:2},{value:"Proof of Work (PoW)",id:"proof-of-work-pow",level:2},{value:"Proposal",id:"proposal",level:2},{value:"Protocol",id:"protocol",level:2},{value:"Random Seed",id:"random-seed",level:2},{value:"Referendum",id:"referendum",level:2},{value:"Re-Genesis",id:"re-genesis",level:2},{value:"Relay Chain",id:"relay-chain",level:2},{value:"Remarks",id:"remarks",level:2},{value:"Rococo",id:"rococo",level:2},{value:"Root Origin",id:"root-origin",level:2},{value:"Runtime",id:"runtime",level:2},{value:"Runtime Module",id:"runtime-module",level:2},{value:"Safety",id:"safety",level:2},{value:"Scalability",id:"scalability",level:2},{value:"Sealing",id:"sealing",level:2},{value:"Session",id:"session",level:2},{value:"Session Certificate",id:"session-certificate",level:2},{value:"Session Key",id:"session-key",level:2},{value:"Shared Security",id:"shared-security",level:2},{value:"Slashing",id:"slashing",level:2},{value:"Soft Fork",id:"soft-fork",level:2},{value:"Software Development Kit (SDK)",id:"software-development-kit-sdk",level:2},{value:"Spend Period",id:"spend-period",level:2},{value:"Staking",id:"staking",level:2},{value:"State transition function",id:"state-transition-function",level:2},{value:"Substrate",id:"substrate",level:2},{value:"System Parachains",id:"system-parachains",level:2},{value:"Tabling",id:"tabling",level:2},{value:"Teleport",id:"teleport",level:2},{value:"Testnet",id:"testnet",level:2},{value:"Tokenization",id:"tokenization",level:2},{value:"Tracks",id:"tracks",level:2},{value:"Tranche",id:"tranche",level:2},{value:"Transfer",id:"transfer",level:2},{value:"Transaction",id:"transaction",level:2},{value:"Validator",id:"validator",level:2},{value:"Vertical Message Passing",id:"vertical-message-passing",level:2},{value:"Voting",id:"voting",level:2},{value:"Waiting Nomination",id:"waiting-nomination",level:2},{value:"Wallet",id:"wallet",level:2},{value:"Wasm",id:"wasm",level:2},{value:"Watermark",id:"watermark",level:2},{value:"Web3 Foundation",id:"web3-foundation",level:2},{value:"WebAssembly",id:"webassembly",level:2},{value:"Weights",id:"weights",level:2},{value:"Witness",id:"witness",level:2},{value:"Whitelist Pallet",id:"whitelist-pallet",level:2}],p={toc:u},m="wrapper";function k(e){var t=e.components,a=(0,o.Z)(e,r);return(0,i.kt)(m,(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"active-nomination"},"Active Nomination"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"alexander"},"Alexander"),(0,i.kt)("p",null,"The fourth (now defunct) proof of concept (PoC-4) ",(0,i.kt)("a",{parentName:"p",href:"#testnet"},"testnet")," for Polkadot."),(0,i.kt)("h2",{id:"asset-hub"},"Asset Hub"),(0,i.kt)("p",null,"A system parachain used for asset management."),(0,i.kt)("h2",{id:"attestation"},"Attestation"),(0,i.kt)("p",null,"In the Polkadot validity system, an\n",(0,i.kt)("em",{parentName:"p"},"attestation")," is a type of message that validators broadcast that says whether they think a\nparachain candidate block is valid or invalid."),(0,i.kt)("h2",{id:"auction-parachain"},"Auction (Parachain)"),(0,i.kt)("p",null,"Parachain auctions are how non-common-good parathreads win a slot to become a parachain."),(0,i.kt)("h2",{id:"aura"},"Aura"),(0,i.kt)("p",null,"Authority-based round-robin scheduling (AURA) provides a slot-based block authoring mechanism, where\na known set of authorities take turns producing blocks."),(0,i.kt)("h2",{id:"authority"},"Authority"),(0,i.kt)("p",null,"An authority is a generic term for the role in a blockchain that can participate in the consensus\nmechanisms. In ",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA"),", 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."),(0,i.kt)("h2",{id:"availability-cores"},"Availability Cores"),(0,i.kt)("p",null,"Slots 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."),(0,i.kt)("h2",{id:"babe"},"BABE"),(0,i.kt)("p",null,"Blind Assignment for Blockchain Extension (BABE) is\nPolkadot's block production mechanism."),(0,i.kt)("h2",{id:"bitfield-array"},"Bitfield Array"),(0,i.kt)("p",null,"A bitfield array contains single-bit values which indicate whether a ",(0,i.kt)("a",{parentName:"p",href:"#candidate"},"candidate")," is\navailable. The number of items is equal of to the number of\n",(0,i.kt)("a",{parentName:"p",href:"#availability-cores"},"availability cores")," and each bit represents a vote on the corresponding core\nin the given order."),(0,i.kt)("h2",{id:"block"},"Block"),(0,i.kt)("p",null,"A collection of data, such as transactions, that together indicate a state transition of the\nblockchain."),(0,i.kt)("h2",{id:"blockspace"},"Blockspace"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/blockspace-blockspace-ecosystems-how-polkadot-is-unlocking-the-full-potential-of-web3"},"Blockspace"),"\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",(0,i.kt)("a",{parentName:"p",href:"https://www.rob.tech/blog/polkadot-blockspace-over-blockchains/"},"blockspace-centric architecture"),"."),(0,i.kt)("h2",{id:"block-explorer"},"Block Explorer"),(0,i.kt)("p",null,"An application that allows a user to explore the different blocks on a blockchain."),(0,i.kt)("h2",{id:"blocks-nominations"},"Blocks Nominations"),(0,i.kt)("p",null,"This indicates that a validator does not currently allow any more nominations. This is controlled by\nthe validator."),(0,i.kt)("h2",{id:"bls"},"BLS"),(0,i.kt)("p",null,"Boneh-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."),(0,i.kt)("h2",{id:"bonding"},"Bonding"),(0,i.kt)("p",null,'A 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. You can\nalso bond tokens in exchange for a parachain slot.'),(0,i.kt)("h2",{id:"bounty"},"Bounty"),(0,i.kt)("p",null,"A mechanism which works in some sense as the reverse of a Treasury Proposal, allowing the\nPolkadot Council to indicate that there is a\nneed to do some task for the Polkadot network\nand allowing users to receive DOT in return for working on that task."),(0,i.kt)("h2",{id:"bridge"},"Bridge"),(0,i.kt)("p",null,"A parachain that acts as an intermediary between the\nPolkadot Relay Chain and an external chain, in\nsuch a way that it appears to the Relay Chain that the external chain is a parachain (i.e., meets\nthe Polkadot Host's requirements of\nparachains). Bridges allow for interaction between other blockchains, such as Ethereum and Bitcoin,\nthat are not natively compatible with\nPolkadot."),(0,i.kt)("h2",{id:"byzantine-fault-tolerance"},"Byzantine Fault Tolerance"),(0,i.kt)("p",null,"The 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."),(0,i.kt)("h2",{id:"capacity"},"Capacity"),(0,i.kt)("p",null,'The maximum number of nominators signalling intent to nominate a validator (and thus could\npotentially actively nominate that validator in the next session). This maximum number will equal\nthe number of nominators necessary to oversubscribe a validator. Any validator which is "at\ncapacity" or higher may potentially be oversubscribed in the next session; a validator that is not\nat capacity cannot be oversubscribed unless more nominators select it before the next election.'),(0,i.kt)("h2",{id:"candidate"},"Candidate"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"collations"},"Collations"),(0,i.kt)("p",null,"Parachain blocks or candidates that are being proposed to the\nPolkadot relay chain validators. More\nspecifically, a collation is a ",(0,i.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#defn-collation"},"data structure")," which\ncontains the proposed parachain candidate, including an optional validation parachain Runtime update\nand upward messages."),(0,i.kt)("h2",{id:"collator"},"Collator"),(0,i.kt)("p",null,"A node that maintains a parachain by collecting parachain transactions and producing state\ntransition proofs for the validators."),(0,i.kt)("h2",{id:"collectives"},"Collectives"),(0,i.kt)("p",null,"The Polkadot Collectives parachain was added in\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/referendum/81"},"Referendum 81")," and exists only on Polkadot (i.e.,\nthere is no Kusama equivalent). The Collectives chain hosts on-chain collectives that serve the\nPolkadot network, such as the ",(0,i.kt)("a",{parentName:"p",href:"#fellowship"},"Fellowship")," and ",(0,i.kt)("a",{parentName:"p",href:"#polkadot-alliance"},"Polkadot Alliance"),"."),(0,i.kt)("h2",{id:"commission"},"Commission"),(0,i.kt)("p",null,"Validators 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."),(0,i.kt)("h2",{id:"common-good-parachain"},"Common Good (Parachain)"),(0,i.kt)("p",null,"See ",(0,i.kt)("a",{parentName:"p",href:"#system-parachains"},"System Parachains"),', which is generally preferred over the term "common\ngood".'),(0,i.kt)("h2",{id:"community-queue"},"Community Queue"),(0,i.kt)("p",null,"The queue for proposals originating from individual accounts (i.e. not the Council) which are\nwaiting to become referenda. Compare the External queue."),(0,i.kt)("h2",{id:"consensus"},"Consensus"),(0,i.kt)("p",null,"The 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\n",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA"),"."),(0,i.kt)("h2",{id:"crowdloan"},"Crowdloan"),(0,i.kt)("p",null,"A mechanism for potential parachains to temporarily source tokens to win an auction for a parachain\nslot. Tokens gathered in this way are programmatically returned to the lender after the lease period\nis over or the crowdloan period ends."),(0,i.kt)("h2",{id:"curator"},"Curator"),(0,i.kt)("p",null,"A person, group, or other entity charged with judging and verifying the successful completion of a\nBounty."),(0,i.kt)("h2",{id:"dapps"},"Dapps"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"dot"},"DOT"),(0,i.kt)("p",null,'The 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).'),(0,i.kt)("h2",{id:"duty-roster"},"Duty Roster"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"epoch"},"Epoch"),(0,i.kt)("p",null,"An 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 ",(0,i.kt)("a",{parentName:"p",href:"#session"},"session"),"."),(0,i.kt)("h2",{id:"era"},"Era"),(0,i.kt)("p",null,"A (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."),(0,i.kt)("h2",{id:"equivocation"},"Equivocation"),(0,i.kt)("p",null,"Providing conflicting information to the network. BABE equivocation entails creating multiple blocks\nin the same slot. ",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA")," equivocation would consist of signing multiple\nconflicting chains."),(0,i.kt)("h2",{id:"external-queue"},"External Queue"),(0,i.kt)("p",null,"The queue for proposals originating with the\nPolkadot Council which are waiting to become\nreferenda. Compare the Community queue."),(0,i.kt)("h2",{id:"extrinsic"},"Extrinsic"),(0,i.kt)("p",null,"A ",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/scale-codec/"},"SCALE encoded"),' 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"',(0,i.kt)("a",{parentName:"p",href:"#inherent"},"inherents"),'" and "',(0,i.kt)("a",{parentName:"p",href:"#transaction"},"transactions"),'". For more technical details see the\n',(0,i.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#id-extrinsics"},"polkadot spec")),(0,i.kt)("h2",{id:"fellowship"},"Fellowship"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"finality"},"Finality"),(0,i.kt)("p",null,'The 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\nPolkadot Relay Chain uses a deterministic\nfinality gadget known as ',(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA"),"."),(0,i.kt)("h2",{id:"finality-gadget"},"Finality Gadget"),(0,i.kt)("p",null,"A mechanism that determines finality."),(0,i.kt)("h2",{id:"frame"},"Frame"),(0,i.kt)("p",null,"The collection of Substrate-provided pallets (Substrate Runtime Modules)."),(0,i.kt)("h2",{id:"genesis"},"Genesis"),(0,i.kt)("p",null,"The origin of a blockchain, also known as block 0. It can also be used to reference the initial\nstate of the blockchain at origination."),(0,i.kt)("admonition",{title:"Example",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"In the ",(0,i.kt)("em",{parentName:"p"},"genesis")," state Alice, Bob, and Charlie had 30 tokens each.")),(0,i.kt)("h2",{id:"governance"},"Governance"),(0,i.kt)("p",null,"The process of determining what changes to the network are permissible, such as modifications to\ncode or movement of funds. The governance system in\nPolkadot is on-chain and revolves around\nstakeholder voting."),(0,i.kt)("h2",{id:"governance-council"},"Governance Council"),(0,i.kt)("p",null,'An 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.'),(0,i.kt)("h2",{id:"grandpa-finality-gadget"},"GRANDPA Finality Gadget"),(0,i.kt)("p",null,"GHOST-based Recursive ANcestor Deriving Prefix Agreement. It is the finality gadget for\nPolkadot, which allows asynchronous,\naccountable, and safe finality to the blockchain. For an overview of GRANDPA, see\n",(0,i.kt)("a",{parentName:"p",href:"https://medium.com/polkadot-network/polkadot-proof-of-concept-3-a-better-consensus-algorithm-e81c380a2372"},"this Medium post")),(0,i.kt)("h2",{id:"hard-fork"},"Hard Fork"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"hard-spoon"},"Hard Spoon"),(0,i.kt)("p",null,'Defined 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 ',(0,i.kt)("em",{parentName:"p"},"the same blockchain"),"."),(0,i.kt)("h2",{id:"horizontal-relay-routed-message-passing"},"Horizontal Relay-routed Message Passing"),(0,i.kt)("p",null,"Horizontal 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."),(0,i.kt)("h2",{id:"inactive-nomination"},"Inactive Nomination"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"inherent"},"Inherent"),(0,i.kt)("p",null,'Extrinsics 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 ',(0,i.kt)("a",{parentName:"p",href:"#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."),(0,i.kt)("h2",{id:"injected-account"},"Injected Account"),(0,i.kt)("p",null,"An account that is not directly managed by the Polkadot UI but can be accessed through it, such as\naccounts controlled by the Polkadot{.js} extension."),(0,i.kt)("h2",{id:"interoperability"},"Interoperability"),(0,i.kt)("p",null,'The ability for some sort of system to exchange and make use of information often compared to\n"cross-chain" technologies.'),(0,i.kt)("h2",{id:"keep-alive-check"},"Keep-Alive Check"),(0,i.kt)("p",null,"The 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."),(0,i.kt)("h2",{id:"ksm"},"KSM"),(0,i.kt)("p",null,"The abbreviation for Kusama network tokens."),(0,i.kt)("h2",{id:"kusama"},"Kusama"),(0,i.kt)("p",null,'The "canary network" for Polkadot. It consists of an early-release, unaudited version of the\nPolkadot software. It is ',(0,i.kt)("strong",{parentName:"p"},"not")," a ",(0,i.kt)("a",{parentName:"p",href:"#testnet"},"testnet")," - after the transition to NPoS, the network\nis entirely in the hands of the community (i.e., Kusama token holders)."),(0,i.kt)("h2",{id:"lease-period"},"Lease Period"),(0,i.kt)("p",null,"A particular amount of time that a parachain for which the parachain can connect to the Relay Chain."),(0,i.kt)("h2",{id:"libp2p"},"LIBP2P"),(0,i.kt)("p",null,"An open-source library for encrypted peer-to-peer communications and other networking functions.\nMore information at: ",(0,i.kt)("a",{parentName:"p",href:"https://libp2p.io/"},"https://libp2p.io/")),(0,i.kt)("h2",{id:"liveness"},"Liveness"),(0,i.kt)("p",null,"The 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."),(0,i.kt)("h2",{id:"mainnet"},"Mainnet"),(0,i.kt)("p",null,'Short for "main network": the fully functional and acting chain that runs its own network.'),(0,i.kt)("h2",{id:"message"},"Message"),(0,i.kt)("p",null,"In Polkadot's XCMP protocol, a ",(0,i.kt)("em",{parentName:"p"},"message")," is\narbitrary data that is sent from one parachain (the egress chain) to another (the ingress chain)\nthrough a channel and ensured delivery by the validator set."),(0,i.kt)("h2",{id:"message-queue"},"Message Queue"),(0,i.kt)("p",null,"In Polkadot's XCMP protocol, a ",(0,i.kt)("em",{parentName:"p"},"message queue"),"\nis the list of messages waiting to be processed by a particular receiving parachain over a channel."),(0,i.kt)("h2",{id:"metadata"},"Metadata"),(0,i.kt)("p",null,"Data that includes information about other data, such as information about a specific transaction."),(0,i.kt)("h2",{id:"motion"},"Motion"),(0,i.kt)("p",null,'A 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.'),(0,i.kt)("h2",{id:"next-session"},"Next Session"),(0,i.kt)("p",null,"This indicates that the validator will be a member of the active set in the next session."),(0,i.kt)("h2",{id:"node-explorer"},"Node Explorer"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"nominated-proof-of-stake-npos"},"Nominated Proof of Stake (NPoS)"),(0,i.kt)("p",null,"A 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. Polkadot uses the\nPhragm\xe9n method to allocate stake to nominees."),(0,i.kt)("h2",{id:"nominator"},"Nominator"),(0,i.kt)("p",null,"Accounts 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."),(0,i.kt)("h2",{id:"non-fungible-token-nft"},"Non-fungible Token (NFT)"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"on-chain-governance"},"On-chain Governance"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"online-message"},"Online Message"),(0,i.kt)("p",null,'This is a message that is broadcast by a validator to verify to the network that the validator is\nonline, even if they haven\'t published a block this epoch. This is sometimes referred to as\n"ImOnline".'),(0,i.kt)("h2",{id:"polkadot-opengov"},"Polkadot OpenGov"),(0,i.kt)("p",null,"Previously known as Governance v2 (Gov2) during early development,\n",(0,i.kt)("a",{parentName:"p",href:"../learn/learn-polkadot-opengov"},"Polkadot OpenGov")," serves as the current governance protocol for\nboth Kusama and Polkadot."),(0,i.kt)("h2",{id:"origin"},"Origin"),(0,i.kt)("p",null,"The initiator of an extrinsic. A simple origin would be the account that is sending a token to\nanother account. Polkadot also supports more\ncomplex origin types, such as the ",(0,i.kt)("a",{parentName:"p",href:"#root-origin"},"root origin"),", from which privileged functions can\nbe called."),(0,i.kt)("h2",{id:"oversubscribed"},"Oversubscribed"),(0,i.kt)("p",null,'If more than the maximum number of nominators nominate the same validator, it is "oversubscribed",\nand only the top staked nominators (ranked by the amount of stake, up to the maximum number of\nnominators) are paid rewards. Other nominators will receive no rewards for that era. The current\nmaximum number of nominators is\n',(0,i.kt)(s.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"})," on Polkadot,\n","\nbut it can be modified via governance."),(0,i.kt)("h2",{id:"pallet"},"Pallet"),(0,i.kt)("p",null,"A ",(0,i.kt)("a",{parentName:"p",href:"#substrate"},"Substrate")," runtime module."),(0,i.kt)("h2",{id:"parachain"},"Parachain"),(0,i.kt)("p",null,'A blockchain that meets several characteristics that allow it to work within the confines of the\nPolkadot Host. Also known as "parallelized\nchain."'),(0,i.kt)("h2",{id:"parachain-development-kit-pdk"},"Parachain Development Kit (PDK)"),(0,i.kt)("p",null,"Similar to an ",(0,i.kt)("a",{parentName:"p",href:"#sdk"},"SDK"),", parachain development kits (PDK) is a set of tools that make it easy for\ndevelopers to create Polkadot compatible\n",(0,i.kt)("a",{parentName:"p",href:"#parachain"},"parachains"),"."),(0,i.kt)("h2",{id:"paraid"},"ParaID"),(0,i.kt)("p",null,"A unique numeric (non-negative integer) identifier for a parathread."),(0,i.kt)("h2",{id:"parathread"},"Parathread"),(0,i.kt)("p",null,'A blockchain that works within the confines of the\nPolkadot Host, thus allowing it to connect to\nthe Polkadot Relay Chain. This can be done either by becoming a parachain or connecting on a "pay as\nyou go" basis. All parachains start their life-cycle as a parathread.'),(0,i.kt)("h2",{id:"parachain-registry"},"Parachain Registry"),(0,i.kt)("p",null,"A relatively simple database-like construct that holds both static and dynamic information on each\nchain."),(0,i.kt)("h2",{id:"parity-technologies"},"Parity Technologies"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"polkadot"},"Polkadot"),(0,i.kt)("p",null,"A heterogeneous, multi-chain network allowing various blockchains of different characteristics to\nperform arbitrary, cross-chain communication under shared security."),(0,i.kt)("h2",{id:"polkadot-alliance"},"Polkadot Alliance"),(0,i.kt)("p",null,"The Polkadot Alliance is an ",(0,i.kt)("a",{parentName:"p",href:"#collectives"},"on-chain collective")," founded by Acala, Astar, Interlay,\nKilt, Moonbeam, Phala, and Subscan, to establish standards and ethics for open-source development in\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/referendum/94"},"referendum #94"),". It aims to support development\nstandards and expose bad actors within the ecosystems of Polkadot."),(0,i.kt)("h2",{id:"host"},"Host"),(0,i.kt)("p",null,"The environment in which a runtime module can be executed. Parachains must support the\nPolkadot Host - external chains that do not\nwill have to use a bridge. Previously known as the\nPolkadot Runtime Environment."),(0,i.kt)("h2",{id:"runtime-environment"},"Runtime Environment"),(0,i.kt)("p",null,"The previous name for the Polkadot\n",(0,i.kt)("a",{parentName:"p",href:"#polkadot-host"},"Host"),"."),(0,i.kt)("h2",{id:"preimage"},"Preimage"),(0,i.kt)("p",null,"The 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",(0,i.kt)("strong",{parentName:"p"},"preimage")," can be submitted and stored on-chain against the hash later, upon the proposal's\ndispatch."),(0,i.kt)("h2",{id:"proof-of-stake-pos"},"Proof of Stake (PoS)"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"proof-of-validity"},"Proof of Validity"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"proof-of-work-pow"},"Proof of Work (PoW)"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"proposal"},"Proposal"),(0,i.kt)("p",null,"A potential function call to be voted on in a referendum. Proposals modify the behavior of the\nPolkadot network, from minor parameter tuning\nup to replacing the runtime code."),(0,i.kt)("h2",{id:"protocol"},"Protocol"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"random-seed"},"Random Seed"),(0,i.kt)("p",null,"A random seed is a pseudo-random number available on-chain. It is used in various places of the\nPolkadot protocol, most prominently in\n",(0,i.kt)("a",{parentName:"p",href:"#babe"},"BABE")," the block production mechanism."),(0,i.kt)("h2",{id:"referendum"},"Referendum"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"re-genesis"},"Re-Genesis"),(0,i.kt)("p",null,"Re-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",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/issues/7458"},"Re-Genesis Rationale and Design"),"."),(0,i.kt)("h2",{id:"relay-chain"},"Relay Chain"),(0,i.kt)("p",null,"The chain that coordinates consensus and communication between parachains (and external chains, via\nbridges)."),(0,i.kt)("h2",{id:"remarks"},"Remarks"),(0,i.kt)("p",null,"Remarks are extrinsics with no effect. They provide additional information to external inputs,\nacting as ",(0,i.kt)("em",{parentName:"p"},"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."),(0,i.kt)("h2",{id:"rococo"},"Rococo"),(0,i.kt)("p",null,"The ",(0,i.kt)("a",{parentName:"p",href:"#testnet"},"testnet")," set aside for testing parachains, cumulus, and related technology."),(0,i.kt)("h2",{id:"root-origin"},"Root Origin"),(0,i.kt)("p",null,"A system-level origin in ",(0,i.kt)("a",{parentName:"p",href:"#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 ",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/main-docs/build/origins/"},"Substrate Docs")),(0,i.kt)("h2",{id:"runtime"},"Runtime"),(0,i.kt)("p",null,"The state transition function of a blockchain. It defines a valid algorithm for determining the\nstate of the next block given the previous state."),(0,i.kt)("h2",{id:"runtime-module"},"Runtime Module"),(0,i.kt)("p",null,'A 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".'),(0,i.kt)("h2",{id:"safety"},"Safety"),(0,i.kt)("p",null,"The property of a distributed system indicating that a particular state transition will not be\nreverted. ",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA")," provides ",(0,i.kt)("em",{parentName:"p"},"deterministic"),' safety. That is, for a state\nchanged marked as "safe" or "final", one would require a hard fork to revert that change.'),(0,i.kt)("h2",{id:"scalability"},"Scalability"),(0,i.kt)("p",null,"While 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."),(0,i.kt)("h2",{id:"sealing"},"Sealing"),(0,i.kt)("p",null,"The process of adding a block to the Relay Chain. Note that finalization is a separate process -\nblocks are finalized sometime after they are sealed."),(0,i.kt)("h2",{id:"session"},"Session"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"session-certificate"},"Session Certificate"),(0,i.kt)("p",null,"A message containing a signature on the concatenation of all the Session keys."),(0,i.kt)("h2",{id:"session-key"},"Session Key"),(0,i.kt)("p",null,"Hot keys that are used for performing network operations by validators, for example, signing\n",(0,i.kt)("a",{parentName:"p",href:"#grandpa-finality-gadget"},"GRANDPA")," commit messages."),(0,i.kt)("h2",{id:"shared-security"},"Shared Security"),(0,i.kt)("p",null,"The security model that Polkadot uses whereby\nall chains are equally secured. This is achieved by placing proofs of the validity of parachain\nblocks into the Relay Chain such that, in order to revert finality of a single parachain, an\nattacker would need to attack the entire\nPolkadot system."),(0,i.kt)("h2",{id:"slashing"},"Slashing"),(0,i.kt)("p",null,"The removal of a percentage of an account's DOT as a punishment for a validator acting maliciously\nor incompetently (e.g., equivocating or remaining offline for an extended period)."),(0,i.kt)("h2",{id:"soft-fork"},"Soft Fork"),(0,i.kt)("p",null,'A 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.'),(0,i.kt)("h2",{id:"software-development-kit-sdk"},"Software Development Kit (SDK)"),(0,i.kt)("p",null,"A collection of software tools (and programs) packaged together that can be used to develop\nsoftware."),(0,i.kt)("h2",{id:"spend-period"},"Spend Period"),(0,i.kt)("p",null,"Successfully enacted Treasury track referenda will get funded at the end of the spending period that\nresets every\n",(0,i.kt)(s.Z,{network:"polkadot",path:"consts.treasury.spendPeriod",defaultValue:345600,filter:"blocksToDays",mdxType:"RPC"}),"\n","\ndays. Treasury funds are directly sent to the beneficiary account at the end of the spend period."),(0,i.kt)("h2",{id:"staking"},"Staking"),(0,i.kt)("p",null,'The act of bonding tokens for Polkadot (DOT)\nby putting them up as "collateral" for a chance to produce a\nvalid block (and thus obtain a block reward). Validators and nominators stake their\nDOT in order to secure the network.'),(0,i.kt)("h2",{id:"state-transition-function"},"State transition function"),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"substrate"},"Substrate"),(0,i.kt)("p",null,"A modular framework for building blockchains.\nPolkadot is built using\n",(0,i.kt)("a",{parentName:"p",href:"https://substrate.io/"},"Substrate"),". Chains built with Substrate will be easy to connect as\nparachains. For developers, see the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate"},"Substrate GitHub repository"),"."),(0,i.kt)("h2",{id:"system-parachains"},"System Parachains"),(0,i.kt)("p",null,"Parachains that are part of the Polkadot core protocol. These are allocated a parachain execution\ncore by governance rather than auction."),(0,i.kt)("h2",{id:"tabling"},"Tabling"),(0,i.kt)("p",null,'In Polkadot governance, bringing a proposal to\na vote via referendum. Note that this is the British meaning of "tabling", which is different from\nthe US version, which means "to postpone" a measure.'),(0,i.kt)("h2",{id:"teleport"},"Teleport"),(0,i.kt)("p",null,"Send 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."),(0,i.kt)("h2",{id:"testnet"},"Testnet"),(0,i.kt)("p",null,'Short 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 ',(0,i.kt)("a",{parentName:"p",href:"#mainnet"},"mainnet"),"."),(0,i.kt)("h2",{id:"tokenization"},"Tokenization"),(0,i.kt)("p",null,"The process of replacing sensitive data with non-sensitive data."),(0,i.kt)("h2",{id:"tracks"},"Tracks"),(0,i.kt)("p",null,"Each ",(0,i.kt)("a",{parentName:"p",href:"#origin"},"Origin")," is associated with a single referendum class and each class is associated\nwith a ",(0,i.kt)("a",{parentName:"p",href:"../maintain/maintain-guides-polkadot-opengov#origins-and-tracks"},"Track"),". 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."),(0,i.kt)("h2",{id:"tranche"},"Tranche"),(0,i.kt)("p",null,"Validators 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",(0,i.kt)("a",{parentName:"p",href:"https://spec.polkadot.network/#sect-rt-api-availability-cores"},"Runtime API"),", and increments the\ntick every 500 milliseconds. Each tick/increment is referred to as a \u201ctranche\u201d, represented as an\ninteger, starting at 0."),(0,i.kt)("h2",{id:"transfer"},"Transfer"),(0,i.kt)("p",null,"Send an asset from one account to another. This generally refers to transfers that occur only on the\nsame chain."),(0,i.kt)("h2",{id:"transaction"},"Transaction"),(0,i.kt)("p",null,'An 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.'),(0,i.kt)("h2",{id:"validator"},"Validator"),(0,i.kt)("p",null,"A node that secures the Relay Chain by staking DOT, validating proofs from collators on parachains\nand voting on consensus along with other validators."),(0,i.kt)("h2",{id:"vertical-message-passing"},"Vertical Message Passing"),(0,i.kt)("p",null,"Vertical 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",(0,i.kt)("a",{parentName:"p",href:"#Horizontal-Relay-routed-Message-Passing"},"HRMP"),". Upward messages originate from parachains and go\nup to the Relay Chain via runtime entry points."),(0,i.kt)("h2",{id:"voting"},"Voting"),(0,i.kt)("p",null,"The 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."),(0,i.kt)("h2",{id:"waiting-nomination"},"Waiting Nomination"),(0,i.kt)("p",null,"The 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."),(0,i.kt)("h2",{id:"wallet"},"Wallet"),(0,i.kt)("p",null,"A program that allows one to store private keys and sign transactions for\nPolkadot or other blockchain networks."),(0,i.kt)("h2",{id:"wasm"},"Wasm"),(0,i.kt)("p",null,"The abbreviation for ",(0,i.kt)("a",{parentName:"p",href:"#webassembly"},"WebAssembly"),"."),(0,i.kt)("h2",{id:"watermark"},"Watermark"),(0,i.kt)("p",null,"In Polkadot's parachain messaging scheme, the ",(0,i.kt)("em",{parentName:"p"},"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."),(0,i.kt)("h2",{id:"web3-foundation"},"Web3 Foundation"),(0,i.kt)("p",null,"A 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",(0,i.kt)("a",{parentName:"p",href:"/docs/web3-and-polkadot"},"Web3 ecosystem"),"."),(0,i.kt)("h2",{id:"webassembly"},"WebAssembly"),(0,i.kt)("p",null,"An instruction format for a virtual, stack-based machine.\nPolkadot Runtime Modules are compiled to\nWebAssembly. Also known as Wasm."),(0,i.kt)("h2",{id:"weights"},"Weights"),(0,i.kt)("p",null,"A 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 ",(0,i.kt)("a",{parentName:"p",href:"#extrinsic"},"extrinsics"),") are determined before\nexecution. Checkout this section of the Substrate docs covering\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/build/tx-weights-fees/"},"transaction weights and fees"),"."),(0,i.kt)("h2",{id:"witness"},"Witness"),(0,i.kt)("p",null,"Cryptographic proof statements of data validity."),(0,i.kt)("h2",{id:"whitelist-pallet"},"Whitelist Pallet"),(0,i.kt)("p",null,"Allows one ",(0,i.kt)("a",{parentName:"p",href:"#origin"},"Origin ")," to escalate the privilege level of another Origin for a certain\noperation. In terms of OpenGov, it allows the ",(0,i.kt)("a",{parentName:"p",href:"#fellowship"},"Fellowship")," to authorise a new origin\n(which we will call Whitelisted-Root) to be executed with Root-level privileges."))}k.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/4a8eb552.c371002a.js b/assets/js/4a8eb552.c371002a.js deleted file mode 100644 index b3b46fcaa758..000000000000 --- a/assets/js/4a8eb552.c371002a.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[7202],{47940:(e,a,t)=>{"use strict";t.d(a,{Z:()=>p});var n=t(74165),o=t(15861),s=t(67294),r=t(87152),i=t(17145),l=t(67425);function d(e,a,t){return u.apply(this,arguments)}function u(){return(u=(0,o.Z)((0,n.Z)().mark((function e(a,t,o){var s,l,d,u,c;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:s=void 0,l=void 0,e.t0=a,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return s="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return s="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return s="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return s="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==s){e.next=18;break}return e.abrupt("return");case 18:return d=new r.U(s),e.next=21,i.G.create({provider:d});case 21:u=e.sent,(c=t.split(".")).forEach((function(e){e in u&&(u=u[e])})),e.t1=c[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=u.toString(),e.abrupt("break",35);case 29:return e.next=31,u();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+t);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function c(e,a,t,n){switch(a){case"humanReadable":(0,l.HumanReadable)(e,t,n);break;case"precise":(0,l.Precise)(e,t,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(e){var a=e.network,t=e.path,r=e.defaultValue,i=e.filter,l=void 0===i?void 0:i,u=(0,s.useState)(""),p=u[0],m=u[1];return a=a.toLowerCase(),(0,s.useEffect)((function(){void 0!==l?c(r.toString(),l,a,m):m(r.toString());var e=void 0;switch(a){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+a)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var s=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(a,t,m);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?c(o,l,a,m):m(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{s()}catch(i){console.log(i)}}}),[]),p}},67425:e=>{var a={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,t,n){var o=void 0;if("polkadot"===t||"statemint"===t)o=3;else{if("kusama"!==t&&"statemine"!==t)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/a[t].precision)?e/a[t].precision+" "+a[t].symbol:(e/a[t].precision).toFixed(o)+" "+a[t].symbol).toString())},Precise:function(e,t,n){n(e=(e=parseFloat(e))/a[t].precision+" "+a[t].symbol)},BlocksToDays:function(e,a){a((e=6*e/86400).toString())},Percentage:function(e,a){a((e/=1e7).toString())},ArrayLength:function(e,a){a((e=e.split(",").length).toString())}}},87149:(e,a,t)=>{"use strict";t.r(a),t.d(a,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>l,metadata:()=>u,toc:()=>p});var n=t(87462),o=t(63366),s=(t(67294),t(3905)),r=t(47940),i=["components"],l={id:"learn-comparisons-kusama",title:"Polkadot vs. Kusama",sidebar_label:"Kusama",description:"Comparing the cousins.",keywords:["polkadot","kusama","polkadot vs kusama","canary"],slug:"../learn-comparisons-kusama"},d=void 0,u={unversionedId:"learn/learn-comparisons-kusama",id:"learn/learn-comparisons-kusama",title:"Polkadot vs. Kusama",description:"Comparing the cousins.",source:"@site/../docs/learn/learn-comparisons-kusama.md",sourceDirName:"learn",slug:"/learn-comparisons-kusama",permalink:"/docs/learn-comparisons-kusama",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-comparisons-kusama.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1679996989,formattedLastUpdatedAt:"Mar 28, 2023",frontMatter:{id:"learn-comparisons-kusama",title:"Polkadot vs. Kusama",sidebar_label:"Kusama",description:"Comparing the cousins.",keywords:["polkadot","kusama","polkadot vs kusama","canary"],slug:"../learn-comparisons-kusama"},sidebar:"docs",previous:{title:"Polkadot Comparisons",permalink:"/docs/learn-comparisons-index"},next:{title:"Ethereum",permalink:"/docs/learn-comparisons-ethereum-2"}},c={},p=[{value:"Cost and Speed",id:"cost-and-speed",level:2},{value:"Canary network",id:"canary-network",level:2},{value:"Going forward",id:"going-forward",level:2},{value:"Explore more",id:"explore-more",level:2}],m={toc:p},k="wrapper";function h(e){var a=e.components,t=(0,o.Z)(e,i);return(0,s.kt)(k,(0,n.Z)({},m,t,{components:a,mdxType:"MDXLayout"}),(0,s.kt)("p",null,"Although they are like cousins and share many parts of their code, Polkadot and Kusama are\nindependent, standalone networks with different priorities. Kusama is wild and fast, and great for\nbold experimentation and early-stage deployment. Polkadot is more conservative, prioritizing\nstability and dependability. Cousins have their differences after all."),(0,s.kt)("admonition",{type:"info"},(0,s.kt)("p",{parentName:"admonition"},"To get a better understanding of the key similarities and difference between Polkadot and Kusama,\ncheckout\n",(0,s.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182146-kusama-and-polkadot-what-s-the-difference-"},"this support article"),".")),(0,s.kt)("h2",{id:"cost-and-speed"},"Cost and Speed"),(0,s.kt)("p",null,"Teams 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."),(0,s.kt)("p",null,"Another 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. On\nPolkadot, the voting period on referendums lasts\n",(0,s.kt)(r.Z,{network:"polkadot",path:"consts.democracy.votingPeriod",defaultValue:403200,filter:"blocksToDays",mdxType:"RPC"}),"\n","\ndays, followed by an enactment period of\n",(0,s.kt)(r.Z,{network:"polkadot",path:"consts.democracy.enactmentPeriod",defaultValue:403200,filter:"blocksToDays",mdxType:"RPC"}),"\n","\ndays before the changes are enacted on-chain. On Kusama, voting lasts\n",(0,s.kt)(r.Z,{network:"kusama",path:"consts.democracy.votingPeriod",defaultValue:100800,filter:"blocksToDays",mdxType:"RPC"}),"\n","\ndays, followed by an\n",(0,s.kt)(r.Z,{network:"kusama",path:"consts.democracy.enactmentPeriod",defaultValue:115200,filter:"blocksToDays",mdxType:"RPC"}),"\n","\nday enactment period. This means stakeholders need to stay active and vigilant if they want to keep\nup with all the proposals, referenda, and upgrades, and validators on Kusama often need to update on\nshort notice."),(0,s.kt)("p",null,"This does not mean that the Kusama blockchain itself is faster, in the sense of faster block times\nor transaction throughput (these are the same on both networks), but that there's a shorter amount\nof time between governance events such as proposing new referenda, voting, and enacting approved\nupgrades. This allows Kusama to adapt and evolve faster than Polkadot."),(0,s.kt)("h2",{id:"canary-network"},"Canary network"),(0,s.kt)("p",null,"The initial use case for Kusama was as a pre-production environment, a \u201ccanary network\u201d."),(0,s.kt)("p",null,"Canary 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."),(0,s.kt)("p",null,"Releases made onto Kusama can be thought of as\n",(0,s.kt)("a",{parentName:"p",href:"https://martinfowler.com/bliki/CanaryRelease.html"},"Canary Releases"),". 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."),(0,s.kt)("p",null,'Kusama 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":'),(0,s.kt)("admonition",{title:"Testnet --\x3e Kusama --\x3e Polkadot",type:"info"}),(0,s.kt)("p",null,"As 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."),(0,s.kt)("p",null,"Many 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\u2019t necessarily require\nbank-like security, such as some gaming, social networking, and content distribution applications,\nare particularly good candidates for this use case."),(0,s.kt)("p",null,"Kusama 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."),(0,s.kt)("h2",{id:"going-forward"},"Going forward"),(0,s.kt)("p",null,"Ultimately, Kusama and Polkadot will live on as 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. In\nthe future, we\u2019re also likely to see Kusama bridged to Polkadot for cross-network interoperability.\nWeb3 Foundation remains committed to both networks going forward, providing crucial support and\nguidance to teams building for the ecosystem."),(0,s.kt)("h2",{id:"explore-more"},"Explore more"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://kusama.network"},"About Kusama")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://guide.kusama.network"},"The Kusama Wiki")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://kusama.dotapps.io"},"Kusama on Polkadot-JS Apps")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000182146-kusama-and-polkadot-what-s-the-difference-"},"Polkadot and Kusama: What's the difference?"))))}h.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/4a8eb552.f21bbb35.js b/assets/js/4a8eb552.f21bbb35.js new file mode 100644 index 000000000000..3a5546b2fcd4 --- /dev/null +++ b/assets/js/4a8eb552.f21bbb35.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[7202],{47940:(e,a,t)=>{"use strict";t.d(a,{Z:()=>p});var n=t(74165),o=t(15861),s=t(67294),r=t(87152),i=t(17145),l=t(67425);function d(e,a,t){return u.apply(this,arguments)}function u(){return(u=(0,o.Z)((0,n.Z)().mark((function e(a,t,o){var s,l,d,u,c;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:s=void 0,l=void 0,e.t0=a,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return s="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return s="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return s="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return s="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==s){e.next=18;break}return e.abrupt("return");case 18:return d=new r.U(s),e.next=21,i.G.create({provider:d});case 21:u=e.sent,(c=t.split(".")).forEach((function(e){e in u&&(u=u[e])})),e.t1=c[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=u.toString(),e.abrupt("break",35);case 29:return e.next=31,u();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+t);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function c(e,a,t,n){switch(a){case"humanReadable":(0,l.HumanReadable)(e,t,n);break;case"precise":(0,l.Precise)(e,t,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"permillToPercent":(0,l.PermillToPercent)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(e){var a=e.network,t=e.path,r=e.defaultValue,i=e.filter,l=void 0===i?void 0:i,u=(0,s.useState)(""),p=u[0],m=u[1];return a=a.toLowerCase(),(0,s.useEffect)((function(){void 0!==l?c(r.toString(),l,a,m):m(r.toString());var e=void 0;switch(a){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+a)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var s=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(a,t,m);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?c(o,l,a,m):m(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{s()}catch(i){console.log(i)}}}),[]),p}},67425:e=>{var a={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,t,n){var o=void 0;if("polkadot"===t||"statemint"===t)o=3;else{if("kusama"!==t&&"statemine"!==t)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/a[t].precision)?e/a[t].precision+" "+a[t].symbol:(e/a[t].precision).toFixed(o)+" "+a[t].symbol).toString())},Precise:function(e,t,n){n(e=(e=parseFloat(e))/a[t].precision+" "+a[t].symbol)},BlocksToDays:function(e,a){a((e=6*e/86400).toString())},Percentage:function(e,a){a((e/=1e7).toString())},PermillToPercent:function(e,a){a((e/=1e4).toString())},ArrayLength:function(e,a){a((e=e.split(",").length).toString())}}},87149:(e,a,t)=>{"use strict";t.r(a),t.d(a,{assets:()=>c,contentTitle:()=>d,default:()=>h,frontMatter:()=>l,metadata:()=>u,toc:()=>p});var n=t(87462),o=t(63366),s=(t(67294),t(3905)),r=t(47940),i=["components"],l={id:"learn-comparisons-kusama",title:"Polkadot vs. Kusama",sidebar_label:"Kusama",description:"Comparing the cousins.",keywords:["polkadot","kusama","polkadot vs kusama","canary"],slug:"../learn-comparisons-kusama"},d=void 0,u={unversionedId:"learn/learn-comparisons-kusama",id:"learn/learn-comparisons-kusama",title:"Polkadot vs. Kusama",description:"Comparing the cousins.",source:"@site/../docs/learn/learn-comparisons-kusama.md",sourceDirName:"learn",slug:"/learn-comparisons-kusama",permalink:"/docs/learn-comparisons-kusama",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-comparisons-kusama.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1679996989,formattedLastUpdatedAt:"Mar 28, 2023",frontMatter:{id:"learn-comparisons-kusama",title:"Polkadot vs. Kusama",sidebar_label:"Kusama",description:"Comparing the cousins.",keywords:["polkadot","kusama","polkadot vs kusama","canary"],slug:"../learn-comparisons-kusama"},sidebar:"docs",previous:{title:"Polkadot Comparisons",permalink:"/docs/learn-comparisons-index"},next:{title:"Ethereum",permalink:"/docs/learn-comparisons-ethereum-2"}},c={},p=[{value:"Cost and Speed",id:"cost-and-speed",level:2},{value:"Canary network",id:"canary-network",level:2},{value:"Going forward",id:"going-forward",level:2},{value:"Explore more",id:"explore-more",level:2}],m={toc:p},k="wrapper";function h(e){var a=e.components,t=(0,o.Z)(e,i);return(0,s.kt)(k,(0,n.Z)({},m,t,{components:a,mdxType:"MDXLayout"}),(0,s.kt)("p",null,"Although they are like cousins and share many parts of their code, Polkadot and Kusama are\nindependent, standalone networks with different priorities. Kusama is wild and fast, and great for\nbold experimentation and early-stage deployment. Polkadot is more conservative, prioritizing\nstability and dependability. Cousins have their differences after all."),(0,s.kt)("admonition",{type:"info"},(0,s.kt)("p",{parentName:"admonition"},"To get a better understanding of the key similarities and difference between Polkadot and Kusama,\ncheckout\n",(0,s.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182146-kusama-and-polkadot-what-s-the-difference-"},"this support article"),".")),(0,s.kt)("h2",{id:"cost-and-speed"},"Cost and Speed"),(0,s.kt)("p",null,"Teams 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."),(0,s.kt)("p",null,"Another 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. On\nPolkadot, the voting period on referendums lasts\n",(0,s.kt)(r.Z,{network:"polkadot",path:"consts.democracy.votingPeriod",defaultValue:403200,filter:"blocksToDays",mdxType:"RPC"}),"\n","\ndays, followed by an enactment period of\n",(0,s.kt)(r.Z,{network:"polkadot",path:"consts.democracy.enactmentPeriod",defaultValue:403200,filter:"blocksToDays",mdxType:"RPC"}),"\n","\ndays before the changes are enacted on-chain. On Kusama, voting lasts\n",(0,s.kt)(r.Z,{network:"kusama",path:"consts.democracy.votingPeriod",defaultValue:100800,filter:"blocksToDays",mdxType:"RPC"}),"\n","\ndays, followed by an\n",(0,s.kt)(r.Z,{network:"kusama",path:"consts.democracy.enactmentPeriod",defaultValue:115200,filter:"blocksToDays",mdxType:"RPC"}),"\n","\nday enactment period. This means stakeholders need to stay active and vigilant if they want to keep\nup with all the proposals, referenda, and upgrades, and validators on Kusama often need to update on\nshort notice."),(0,s.kt)("p",null,"This does not mean that the Kusama blockchain itself is faster, in the sense of faster block times\nor transaction throughput (these are the same on both networks), but that there's a shorter amount\nof time between governance events such as proposing new referenda, voting, and enacting approved\nupgrades. This allows Kusama to adapt and evolve faster than Polkadot."),(0,s.kt)("h2",{id:"canary-network"},"Canary network"),(0,s.kt)("p",null,"The initial use case for Kusama was as a pre-production environment, a \u201ccanary network\u201d."),(0,s.kt)("p",null,"Canary 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."),(0,s.kt)("p",null,"Releases made onto Kusama can be thought of as\n",(0,s.kt)("a",{parentName:"p",href:"https://martinfowler.com/bliki/CanaryRelease.html"},"Canary Releases"),". 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."),(0,s.kt)("p",null,'Kusama 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":'),(0,s.kt)("admonition",{title:"Testnet --\x3e Kusama --\x3e Polkadot",type:"info"}),(0,s.kt)("p",null,"As 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."),(0,s.kt)("p",null,"Many 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\u2019t necessarily require\nbank-like security, such as some gaming, social networking, and content distribution applications,\nare particularly good candidates for this use case."),(0,s.kt)("p",null,"Kusama 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."),(0,s.kt)("h2",{id:"going-forward"},"Going forward"),(0,s.kt)("p",null,"Ultimately, Kusama and Polkadot will live on as 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. In\nthe future, we\u2019re also likely to see Kusama bridged to Polkadot for cross-network interoperability.\nWeb3 Foundation remains committed to both networks going forward, providing crucial support and\nguidance to teams building for the ecosystem."),(0,s.kt)("h2",{id:"explore-more"},"Explore more"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://kusama.network"},"About Kusama")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://guide.kusama.network"},"The Kusama Wiki")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://kusama.dotapps.io"},"Kusama on Polkadot-JS Apps")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000182146-kusama-and-polkadot-what-s-the-difference-"},"Polkadot and Kusama: What's the difference?"))))}h.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/4f031749.7cb1291f.js b/assets/js/4f031749.7cb1291f.js deleted file mode 100644 index 4bd88b4f471e..000000000000 --- a/assets/js/4f031749.7cb1291f.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[2008],{47940:(e,t,o)=>{"use strict";o.d(t,{Z:()=>u});var a=o(74165),n=o(15861),s=o(67294),i=o(87152),r=o(17145),l=o(67425);function p(e,t,o){return d.apply(this,arguments)}function d(){return(d=(0,n.Z)((0,a.Z)().mark((function e(t,o,n){var s,l,p,d,c;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:s=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return s="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return s="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return s="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return s="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==s){e.next=18;break}return e.abrupt("return");case 18:return p=new i.U(s),e.next=21,r.G.create({provider:p});case 21:d=e.sent,(c=o.split(".")).forEach((function(e){e in d&&(d=d[e])})),e.t1=c[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=d.toString(),e.abrupt("break",35);case 29:return e.next=31,d();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+o);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function c(e,t,o,a){switch(t){case"humanReadable":(0,l.HumanReadable)(e,o,a);break;case"precise":(0,l.Precise)(e,o,a);break;case"blocksToDays":(0,l.BlocksToDays)(e,a);break;case"percentage":(0,l.Percentage)(e,a);break;case"arrayLength":(0,l.ArrayLength)(e,a);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(e){var t=e.network,o=e.path,i=e.defaultValue,r=e.filter,l=void 0===r?void 0:r,d=(0,s.useState)(""),u=d[0],m=d[1];return t=t.toLowerCase(),(0,s.useEffect)((function(){void 0!==l?c(i.toString(),l,t,m):m(i.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var s=function(){var e=(0,n.Z)((0,a.Z)().mark((function e(){var n;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p(t,o,m);case 2:if(void 0!==(n=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?c(n,l,t,m):m(n);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{s()}catch(r){console.log(r)}}}),[]),u}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,o,a){var n=void 0;if("polkadot"===o||"statemint"===o)n=3;else{if("kusama"!==o&&"statemine"!==o)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");n=6}e=parseFloat(e),a((e=Number.isInteger(e/t[o].precision)?e/t[o].precision+" "+t[o].symbol:(e/t[o].precision).toFixed(n)+" "+t[o].symbol).toString())},Precise:function(e,o,a){a(e=(e=parseFloat(e))/t[o].precision+" "+t[o].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},44002:(e,t,o)=>{"use strict";o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>p,default:()=>h,frontMatter:()=>l,metadata:()=>d,toc:()=>u});var a=o(87462),n=o(63366),s=(o(67294),o(3905)),i=o(47940),r=["components"],l={id:"learn-guides-staking-pools",title:"Nomination Pools How-to Guides",sidebar_label:"Nomination Pools",description:"Advanced How-to Guides about Nomination Pools.",keyword:["nominate","stake","staking","pools","create","destroy","claim","rewards"],slug:"../learn-guides-staking-pools"},p=void 0,d={unversionedId:"learn/learn-guides-staking-pools",id:"learn/learn-guides-staking-pools",title:"Nomination Pools How-to Guides",description:"Advanced How-to Guides about Nomination Pools.",source:"@site/../docs/learn/learn-guides-staking-pools.md",sourceDirName:"learn",slug:"/learn-guides-staking-pools",permalink:"/docs/learn-guides-staking-pools",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-guides-staking-pools.md",tags:[],version:"current",lastUpdatedBy:"github-actions[bot]",lastUpdatedAt:1695621828,formattedLastUpdatedAt:"Sep 25, 2023",frontMatter:{id:"learn-guides-staking-pools",title:"Nomination Pools How-to Guides",sidebar_label:"Nomination Pools",description:"Advanced How-to Guides about Nomination Pools.",keyword:["nominate","stake","staking","pools","create","destroy","claim","rewards"],slug:"../learn-guides-staking-pools"},sidebar:"docs",previous:{title:"Staking",permalink:"/docs/learn-guides-staking"},next:{title:"OpenGov",permalink:"/docs/learn-guides-polkadot-opengov"}},c={},u=[{value:"Pool Creation",id:"pool-creation",level:2},{value:"Pool Upkeep",id:"pool-upkeep",level:2},{value:"Pool Destruction",id:"pool-destruction",level:2},{value:"Claim Rewards for Other Pool Members",id:"claim-rewards-for-other-pool-members",level:2}],m={toc:u},k="wrapper";function h(e){var t=e.components,l=(0,n.Z)(e,r);return(0,s.kt)(k,(0,a.Z)({},m,l,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("p",null,"This page is for pool creators and maintainers. If you like to participate in staking through\nnomination pools, please navigate to this page on\n",(0,s.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182376-staking-dashboard-how-to-join-a-nomination-pool"},"how to join a nomination pool.")),(0,s.kt)("h2",{id:"pool-creation"},"Pool Creation"),(0,s.kt)("admonition",{type:"info"},(0,s.kt)("p",{parentName:"admonition"},"You easily create a pool using the\n",(0,s.kt)("a",{parentName:"p",href:"/docs/staking-dashboard#pools"},"Polkadot Staking Dashboard"),". See\n",(0,s.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182388-staking-dashboard-how-to-create-a-nomination-pool#How-to-create-a-pool"},"this support article"),"\nfor more information.")),(0,s.kt)("p",null,"The depositor calls the ",(0,s.kt)("inlineCode",{parentName:"p"},"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."),(0,s.kt)("p",null,(0,s.kt)("strong",{parentName:"p"},"The current minimum bond to create a pool on"),"\n",(0,s.kt)("strong",{parentName:"p"},"Polkadot"),"","\n",(0,s.kt)("strong",{parentName:"p"},"is ",(0,s.kt)(i.Z,{network:"polkadot",path:"query.nominationPools.minCreateBond",defaultValue:5e12,filter:"humanReadable",mdxType:"RPC"}),"."),"\n",""),(0,s.kt)("p",null,"The pool\u2019s \u2018nominator role\u2019 selects validators with the nominate extrinsic. On Polkadot JS Apps UI,\nnavigate to Network > Staking > Pools and click on Add Pool button."),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"Create Nomination Pools",src:o(85209).Z,width:"1412",height:"638"})),(0,s.kt)("p",null,"The UI automatically assigns an ID to the pool and allows for entering the name of the pools and the\ndeposit to be bonded."),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"Create Nomination Pools - deposit",src:o(58732).Z,width:"1164",height:"458"})),(0,s.kt)("p",null,"When 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",(0,s.kt)("inlineCode",{parentName:"p"},"create")," extrinsic available in\n",(0,s.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/extrinsics"},"Developer > Extrinsics > nominationPools")," on Polkadot JS\nApps UI."),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"Nomination Pool Roles",src:o(12920).Z,width:"1426",height:"558"})),(0,s.kt)("h2",{id:"pool-upkeep"},"Pool Upkeep"),(0,s.kt)("p",null,"The nominator can update the pool\u2019s validator selection. On Polkadot JS Apps UI, navigate to\n",(0,s.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/actions"},"Network > Staking > Accounts page")," 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."),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"Nominate validators",src:o(22455).Z,width:"1810",height:"786"})),(0,s.kt)("p",null,"The root and bouncer can update the pool\u2019s state to blocked through ",(0,s.kt)("inlineCode",{parentName:"p"},"setState")," extrinsic and kick\nmembers by calling ",(0,s.kt)("inlineCode",{parentName:"p"},"unbond")," and ",(0,s.kt)("inlineCode",{parentName:"p"},"withdrawUnbonded"),". (The state can also be toggled back to open)."),(0,s.kt)("h2",{id:"pool-destruction"},"Pool Destruction"),(0,s.kt)("admonition",{type:"info"},(0,s.kt)("p",{parentName:"admonition"},"As a pool admin, you can easily destroy a pool and permissionlessly remove all members using the\n",(0,s.kt)("a",{parentName:"p",href:"/docs/staking-dashboard#pools"},"Polkadot Staking Dashboard"),". See\n",(0,s.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182388-staking-dashboard-how-to-create-a-nomination-pool#How-to-destroy-a-pool"},"this support article"),"\nfor more information.")),(0,s.kt)("p",null,"A pool can be pushed into the \u201cdestroying\u201d state via one of:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"The root and bouncer set the pool to \u201cdestroying\u201d. This can be done by submitting the\n",(0,s.kt)("inlineCode",{parentName:"li"},"nominationPools.setState(poolId, state)")," extrinsic using the\n",(0,s.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/extrinsics"},"Polkadot-JS UI extrinsic tab"),". Where ",(0,s.kt)("inlineCode",{parentName:"li"},"poolId")," is the\nspecific ID of the pool and ",(0,s.kt)("inlineCode",{parentName:"li"},"state"),' is the pool\'s state that must be set to "destroying". Other\npossible states are "open" and "blocked".'),(0,s.kt)("li",{parentName:"ul"},"Any account can set the pool to destroying if over 90% of the pool's active bonded balance has\nbeen slashed.")),(0,s.kt)("p",null,"When a pool is in \u2018destroying\u2019 state, ",(0,s.kt)("inlineCode",{parentName:"p"},"unbond")," and ",(0,s.kt)("inlineCode",{parentName:"p"},"withdrawUnbonded")," become permissionless, so\nanyone can help all the members exit."),(0,s.kt)("p",null,"The pool is destroyed once the depositor withdraws, no members belong to the pool, and all the\npool\u2019s resources are wiped from the state."),(0,s.kt)("h2",{id:"claim-rewards-for-other-pool-members"},"Claim Rewards for Other Pool Members"),(0,s.kt)("p",null,"As a pool member you can claim rewards for any other members who set their\n",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools#claim-permissions"},"claim permissions")," to one of the ",(0,s.kt)("em",{parentName:"p"},"permissionless"),"\noptions."),(0,s.kt)("p",null,"Let's take the example of ALICE setting the claim permissions to ",(0,s.kt)("inlineCode",{parentName:"p"},"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",(0,s.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/extrinsics"},"Polkadot-JS UI Extrinsic Tab")," and issue the following\nextrisics:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("inlineCode",{parentName:"li"},"nominationPools.claimPayoutOthers")," extrinsic specifying ALICE's account. This will claim the\nrewards as a free balance on ALICE's account.")),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"pools-payoutOthers",src:o(51546).Z,width:"1499",height:"458"})),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("inlineCode",{parentName:"li"},"nominationPools.bondExtraOthers")," extrinsic specifying ALICE's account and the option to bond:",(0,s.kt)("ul",{parentName:"li"},(0,s.kt)("li",{parentName:"ul"},"the free balance currently available in ALICE's account (",(0,s.kt)("inlineCode",{parentName:"li"},"FreeBalance"),") or"),(0,s.kt)("li",{parentName:"ul"},"the pool rewards (",(0,s.kt)("inlineCode",{parentName:"li"},"Rewards"),") unclaimed by ALICE.")))),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"pools-bondExtraOthers",src:o(63547).Z,width:"1496",height:"643"})))}h.isMDXComponent=!0},63547:(e,t,o)=>{"use strict";o.d(t,{Z:()=>a});const a=o.p+"assets/images/nomination-pools-bondExtraOthers-d4492df464bbc1cd2c04be211a78eb46.png"},51546:(e,t,o)=>{"use strict";o.d(t,{Z:()=>a});const a=o.p+"assets/images/nomination-pools-payoutOthers-bfe1ad190e494f39c2c74d65e7edd12c.png"},85209:(e,t,o)=>{"use strict";o.d(t,{Z:()=>a});const a=o.p+"assets/images/Nomination-Pools-1-98ee6b5592f6851aa57c9d427d70598f.png"},58732:(e,t,o)=>{"use strict";o.d(t,{Z:()=>a});const a=o.p+"assets/images/Nomination-Pools-2-84da587a4d7591f2e2f79a4054214984.png"},22455:(e,t,o)=>{"use strict";o.d(t,{Z:()=>a});const a=o.p+"assets/images/Nomination-Pools-5-9b16b01bde4e095d3c8fa71aa9a9a6ca.png"},12920:(e,t,o)=>{"use strict";o.d(t,{Z:()=>a});const a=o.p+"assets/images/Nomination-Pools-7-74928d7825f19208592498e7b12dee5c.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/4f031749.a03081a9.js b/assets/js/4f031749.a03081a9.js new file mode 100644 index 000000000000..0697f1d4ac62 --- /dev/null +++ b/assets/js/4f031749.a03081a9.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[2008],{47940:(e,t,o)=>{"use strict";o.d(t,{Z:()=>u});var n=o(74165),a=o(15861),s=o(67294),i=o(87152),r=o(17145),l=o(67425);function p(e,t,o){return d.apply(this,arguments)}function d(){return(d=(0,a.Z)((0,n.Z)().mark((function e(t,o,a){var s,l,p,d,c;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:s=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return s="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return s="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return s="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return s="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==s){e.next=18;break}return e.abrupt("return");case 18:return p=new i.U(s),e.next=21,r.G.create({provider:p});case 21:d=e.sent,(c=o.split(".")).forEach((function(e){e in d&&(d=d[e])})),e.t1=c[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=d.toString(),e.abrupt("break",35);case 29:return e.next=31,d();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+o);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function c(e,t,o,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,o,n);break;case"precise":(0,l.Precise)(e,o,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"permillToPercent":(0,l.PermillToPercent)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(e){var t=e.network,o=e.path,i=e.defaultValue,r=e.filter,l=void 0===r?void 0:r,d=(0,s.useState)(""),u=d[0],m=d[1];return t=t.toLowerCase(),(0,s.useEffect)((function(){void 0!==l?c(i.toString(),l,t,m):m(i.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var s=function(){var e=(0,a.Z)((0,n.Z)().mark((function e(){var a;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p(t,o,m);case 2:if(void 0!==(a=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?c(a,l,t,m):m(a);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{s()}catch(r){console.log(r)}}}),[]),u}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,o,n){var a=void 0;if("polkadot"===o||"statemint"===o)a=3;else{if("kusama"!==o&&"statemine"!==o)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");a=6}e=parseFloat(e),n((e=Number.isInteger(e/t[o].precision)?e/t[o].precision+" "+t[o].symbol:(e/t[o].precision).toFixed(a)+" "+t[o].symbol).toString())},Precise:function(e,o,n){n(e=(e=parseFloat(e))/t[o].precision+" "+t[o].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},44002:(e,t,o)=>{"use strict";o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>p,default:()=>h,frontMatter:()=>l,metadata:()=>d,toc:()=>u});var n=o(87462),a=o(63366),s=(o(67294),o(3905)),i=o(47940),r=["components"],l={id:"learn-guides-staking-pools",title:"Nomination Pools How-to Guides",sidebar_label:"Nomination Pools",description:"Advanced How-to Guides about Nomination Pools.",keyword:["nominate","stake","staking","pools","create","destroy","claim","rewards"],slug:"../learn-guides-staking-pools"},p=void 0,d={unversionedId:"learn/learn-guides-staking-pools",id:"learn/learn-guides-staking-pools",title:"Nomination Pools How-to Guides",description:"Advanced How-to Guides about Nomination Pools.",source:"@site/../docs/learn/learn-guides-staking-pools.md",sourceDirName:"learn",slug:"/learn-guides-staking-pools",permalink:"/docs/learn-guides-staking-pools",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-guides-staking-pools.md",tags:[],version:"current",lastUpdatedBy:"github-actions[bot]",lastUpdatedAt:1695621828,formattedLastUpdatedAt:"Sep 25, 2023",frontMatter:{id:"learn-guides-staking-pools",title:"Nomination Pools How-to Guides",sidebar_label:"Nomination Pools",description:"Advanced How-to Guides about Nomination Pools.",keyword:["nominate","stake","staking","pools","create","destroy","claim","rewards"],slug:"../learn-guides-staking-pools"},sidebar:"docs",previous:{title:"Staking",permalink:"/docs/learn-guides-staking"},next:{title:"OpenGov",permalink:"/docs/learn-guides-polkadot-opengov"}},c={},u=[{value:"Pool Creation",id:"pool-creation",level:2},{value:"Pool Upkeep",id:"pool-upkeep",level:2},{value:"Pool Destruction",id:"pool-destruction",level:2},{value:"Claim Rewards for Other Pool Members",id:"claim-rewards-for-other-pool-members",level:2}],m={toc:u},k="wrapper";function h(e){var t=e.components,l=(0,a.Z)(e,r);return(0,s.kt)(k,(0,n.Z)({},m,l,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("p",null,"This page is for pool creators and maintainers. If you like to participate in staking through\nnomination pools, please navigate to this page on\n",(0,s.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182376-staking-dashboard-how-to-join-a-nomination-pool"},"how to join a nomination pool.")),(0,s.kt)("h2",{id:"pool-creation"},"Pool Creation"),(0,s.kt)("admonition",{type:"info"},(0,s.kt)("p",{parentName:"admonition"},"You easily create a pool using the\n",(0,s.kt)("a",{parentName:"p",href:"/docs/staking-dashboard#pools"},"Polkadot Staking Dashboard"),". See\n",(0,s.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182388-staking-dashboard-how-to-create-a-nomination-pool#How-to-create-a-pool"},"this support article"),"\nfor more information.")),(0,s.kt)("p",null,"The depositor calls the ",(0,s.kt)("inlineCode",{parentName:"p"},"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."),(0,s.kt)("p",null,(0,s.kt)("strong",{parentName:"p"},"The current minimum bond to create a pool on"),"\n",(0,s.kt)("strong",{parentName:"p"},"Polkadot"),"","\n",(0,s.kt)("strong",{parentName:"p"},"is ",(0,s.kt)(i.Z,{network:"polkadot",path:"query.nominationPools.minCreateBond",defaultValue:5e12,filter:"humanReadable",mdxType:"RPC"}),"."),"\n",""),(0,s.kt)("p",null,"The pool\u2019s \u2018nominator role\u2019 selects validators with the nominate extrinsic. On Polkadot JS Apps UI,\nnavigate to Network > Staking > Pools and click on Add Pool button."),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"Create Nomination Pools",src:o(85209).Z,width:"1412",height:"638"})),(0,s.kt)("p",null,"The UI automatically assigns an ID to the pool and allows for entering the name of the pools and the\ndeposit to be bonded."),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"Create Nomination Pools - deposit",src:o(58732).Z,width:"1164",height:"458"})),(0,s.kt)("p",null,"When 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",(0,s.kt)("inlineCode",{parentName:"p"},"create")," extrinsic available in\n",(0,s.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/extrinsics"},"Developer > Extrinsics > nominationPools")," on Polkadot JS\nApps UI."),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"Nomination Pool Roles",src:o(12920).Z,width:"1426",height:"558"})),(0,s.kt)("h2",{id:"pool-upkeep"},"Pool Upkeep"),(0,s.kt)("p",null,"The nominator can update the pool\u2019s validator selection. On Polkadot JS Apps UI, navigate to\n",(0,s.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/actions"},"Network > Staking > Accounts page")," 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."),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"Nominate validators",src:o(22455).Z,width:"1810",height:"786"})),(0,s.kt)("p",null,"The root and bouncer can update the pool\u2019s state to blocked through ",(0,s.kt)("inlineCode",{parentName:"p"},"setState")," extrinsic and kick\nmembers by calling ",(0,s.kt)("inlineCode",{parentName:"p"},"unbond")," and ",(0,s.kt)("inlineCode",{parentName:"p"},"withdrawUnbonded"),". (The state can also be toggled back to open)."),(0,s.kt)("h2",{id:"pool-destruction"},"Pool Destruction"),(0,s.kt)("admonition",{type:"info"},(0,s.kt)("p",{parentName:"admonition"},"As a pool admin, you can easily destroy a pool and permissionlessly remove all members using the\n",(0,s.kt)("a",{parentName:"p",href:"/docs/staking-dashboard#pools"},"Polkadot Staking Dashboard"),". See\n",(0,s.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182388-staking-dashboard-how-to-create-a-nomination-pool#How-to-destroy-a-pool"},"this support article"),"\nfor more information.")),(0,s.kt)("p",null,"A pool can be pushed into the \u201cdestroying\u201d state via one of:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"The root and bouncer set the pool to \u201cdestroying\u201d. This can be done by submitting the\n",(0,s.kt)("inlineCode",{parentName:"li"},"nominationPools.setState(poolId, state)")," extrinsic using the\n",(0,s.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/extrinsics"},"Polkadot-JS UI extrinsic tab"),". Where ",(0,s.kt)("inlineCode",{parentName:"li"},"poolId")," is the\nspecific ID of the pool and ",(0,s.kt)("inlineCode",{parentName:"li"},"state"),' is the pool\'s state that must be set to "destroying". Other\npossible states are "open" and "blocked".'),(0,s.kt)("li",{parentName:"ul"},"Any account can set the pool to destroying if over 90% of the pool's active bonded balance has\nbeen slashed.")),(0,s.kt)("p",null,"When a pool is in \u2018destroying\u2019 state, ",(0,s.kt)("inlineCode",{parentName:"p"},"unbond")," and ",(0,s.kt)("inlineCode",{parentName:"p"},"withdrawUnbonded")," become permissionless, so\nanyone can help all the members exit."),(0,s.kt)("p",null,"The pool is destroyed once the depositor withdraws, no members belong to the pool, and all the\npool\u2019s resources are wiped from the state."),(0,s.kt)("h2",{id:"claim-rewards-for-other-pool-members"},"Claim Rewards for Other Pool Members"),(0,s.kt)("p",null,"As a pool member you can claim rewards for any other members who set their\n",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools#claim-permissions"},"claim permissions")," to one of the ",(0,s.kt)("em",{parentName:"p"},"permissionless"),"\noptions."),(0,s.kt)("p",null,"Let's take the example of ALICE setting the claim permissions to ",(0,s.kt)("inlineCode",{parentName:"p"},"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",(0,s.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/extrinsics"},"Polkadot-JS UI Extrinsic Tab")," and issue the following\nextrisics:"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("inlineCode",{parentName:"li"},"nominationPools.claimPayoutOthers")," extrinsic specifying ALICE's account. This will claim the\nrewards as a free balance on ALICE's account.")),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"pools-payoutOthers",src:o(51546).Z,width:"1499",height:"458"})),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("inlineCode",{parentName:"li"},"nominationPools.bondExtraOthers")," extrinsic specifying ALICE's account and the option to bond:",(0,s.kt)("ul",{parentName:"li"},(0,s.kt)("li",{parentName:"ul"},"the free balance currently available in ALICE's account (",(0,s.kt)("inlineCode",{parentName:"li"},"FreeBalance"),") or"),(0,s.kt)("li",{parentName:"ul"},"the pool rewards (",(0,s.kt)("inlineCode",{parentName:"li"},"Rewards"),") unclaimed by ALICE.")))),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"pools-bondExtraOthers",src:o(63547).Z,width:"1496",height:"643"})))}h.isMDXComponent=!0},63547:(e,t,o)=>{"use strict";o.d(t,{Z:()=>n});const n=o.p+"assets/images/nomination-pools-bondExtraOthers-d4492df464bbc1cd2c04be211a78eb46.png"},51546:(e,t,o)=>{"use strict";o.d(t,{Z:()=>n});const n=o.p+"assets/images/nomination-pools-payoutOthers-bfe1ad190e494f39c2c74d65e7edd12c.png"},85209:(e,t,o)=>{"use strict";o.d(t,{Z:()=>n});const n=o.p+"assets/images/Nomination-Pools-1-98ee6b5592f6851aa57c9d427d70598f.png"},58732:(e,t,o)=>{"use strict";o.d(t,{Z:()=>n});const n=o.p+"assets/images/Nomination-Pools-2-84da587a4d7591f2e2f79a4054214984.png"},22455:(e,t,o)=>{"use strict";o.d(t,{Z:()=>n});const n=o.p+"assets/images/Nomination-Pools-5-9b16b01bde4e095d3c8fa71aa9a9a6ca.png"},12920:(e,t,o)=>{"use strict";o.d(t,{Z:()=>n});const n=o.p+"assets/images/Nomination-Pools-7-74928d7825f19208592498e7b12dee5c.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/54338ffb.474887e6.js b/assets/js/54338ffb.474887e6.js new file mode 100644 index 000000000000..e39051d38cec --- /dev/null +++ b/assets/js/54338ffb.474887e6.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[4634],{47940:(t,e,a)=>{"use strict";a.d(e,{Z:()=>d});var n=a(74165),i=a(15861),o=a(67294),s=a(87152),r=a(17145),l=a(67425);function c(t,e,a){return u.apply(this,arguments)}function u(){return(u=(0,i.Z)((0,n.Z)().mark((function t(e,a,i){var o,l,c,u,p;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:o=void 0,l=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return o="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return o="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return o="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return o="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==o){t.next=18;break}return t.abrupt("return");case 18:return c=new s.U(o),t.next=21,r.G.create({provider:c});case 21:u=t.sent,(p=a.split(".")).forEach((function(t){t in u&&(u=u[t])})),t.t1=p[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return l=u.toString(),t.abrupt("break",35);case 29:return t.next=31,u();case 31:return l=(l=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+p[0]+") in "+a);case 35:return t.abrupt("return",l);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function p(t,e,a,n){switch(e){case"humanReadable":(0,l.HumanReadable)(t,a,n);break;case"precise":(0,l.Precise)(t,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(t,n);break;case"percentage":(0,l.Percentage)(t,n);break;case"permillToPercent":(0,l.PermillToPercent)(t,n);break;case"arrayLength":(0,l.ArrayLength)(t,n);break;default:return void console.log("Ignoring unknown filter type")}}const d=function(t){var e=t.network,a=t.path,s=t.defaultValue,r=t.filter,l=void 0===r?void 0:r,u=(0,o.useState)(""),d=u[0],h=u[1];return e=e.toLowerCase(),(0,o.useEffect)((function(){void 0!==l?p(s.toString(),l,e,h):h(s.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var o=function(){var t=(0,i.Z)((0,n.Z)().mark((function t(){var i;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,c(e,a,h);case 2:if(void 0!==(i=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==l?p(i,l,e,h):h(i);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{o()}catch(r){console.log(r)}}}),[]),d}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,a,n){var i=void 0;if("polkadot"===a||"statemint"===a)i=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");i=6}t=parseFloat(t),n((t=Number.isInteger(t/e[a].precision)?t/e[a].precision+" "+e[a].symbol:(t/e[a].precision).toFixed(i)+" "+e[a].symbol).toString())},Precise:function(t,a,n){n(t=(t=parseFloat(t))/e[a].precision+" "+e[a].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},PermillToPercent:function(t,e){e((t/=1e4).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},97765:(t,e,a)=>{"use strict";a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>c,default:()=>g,frontMatter:()=>l,metadata:()=>u,toc:()=>d});var n=a(87462),i=a(63366),o=(a(67294),a(3905)),s=a(47940),r=["components"],l={id:"learn-account-multisig",title:"Multi-Signature Accounts",sidebar_label:"Multi-Signature Accounts",description:"Multi-signature Accounts on Polkadot.",keywords:["account","multisig","polkadot account","polkadotjs","multix"],slug:"../learn-account-multisig"},c=void 0,u={unversionedId:"learn/learn-account-multisig",id:"learn/learn-account-multisig",title:"Multi-Signature Accounts",description:"Multi-signature Accounts on Polkadot.",source:"@site/../docs/learn/learn-account-multisig.md",sourceDirName:"learn",slug:"/learn-account-multisig",permalink:"/docs/learn-account-multisig",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-account-multisig.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1697439762,formattedLastUpdatedAt:"Oct 16, 2023",frontMatter:{id:"learn-account-multisig",title:"Multi-Signature Accounts",sidebar_label:"Multi-Signature Accounts",description:"Multi-signature Accounts on Polkadot.",keywords:["account","multisig","polkadot account","polkadotjs","multix"],slug:"../learn-account-multisig"},sidebar:"docs",previous:{title:"Account Identity",permalink:"/docs/learn-identity"},next:{title:"Proxy Accounts",permalink:"/docs/learn-proxies"}},p={},d=[{value:"Introduction to Multisig Accounts",id:"introduction-to-multisig-accounts",level:2},{value:"Multisig Accounts with the Polkadot-JS UI",id:"multisig-accounts-with-the-polkadot-js-ui",level:2},{value:"Multisig Transactions with Accounts Tab",id:"multisig-transactions-with-accounts-tab",level:3},{value:"Multisig Transactions with Extrinsic Tab",id:"multisig-transactions-with-extrinsic-tab",level:3},{value:"Example using Multisig Accounts",id:"example-using-multisig-accounts",level:4},{value:"Multisig with Multix Tool",id:"multisig-with-multix-tool",level:2},{value:"Decoding Multisig Call Data",id:"decoding-multisig-call-data",level:2}],h={toc:d},m="wrapper";function g(t){var e=t.components,l=(0,i.Z)(t,r);return(0,o.kt)(m,(0,n.Z)({},h,l,{components:e,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"introduction-to-multisig-accounts"},"Introduction to Multisig Accounts"),(0,o.kt)("p",null,"It is possible to create multi-signature accounts (multisig) in Substrate-based chains. A multisig\nis composed of one or more addresses and a threshold. The threshold defines how many signatories\n(participating addresses) need to agree on submitting an extrinsic for the call to be successful."),(0,o.kt)("p",null,"For example, Alice, Bob, and Charlie set up a multisig with a threshold of 2. This means Alice and\nBob can execute any call even if Charlie disagrees with it. Likewise, Charlie and Bob can execute\nany call without Alice. A threshold is typically a number smaller than the total number of members\nbut can also be equal to it, which means they all have to agree."),(0,o.kt)("admonition",{title:"Learn more about multisig accounts",type:"info"},(0,o.kt)("p",{parentName:"admonition"},'Check the "How to create a multisig account" section on\n',(0,o.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181826-how-to-create-and-use-a-multisig-account"},"this support page"),".\nWe recommend trying out the tutorial on\n",(0,o.kt)("a",{parentName:"p",href:"/docs/maintain-networks#westend-test-network"},"Westend network")," - Polkadot's testnet.")),(0,o.kt)("p",null,"Multi-signature accounts have several uses:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"securing your stash: use additional signatories as a 2FA mechanism to secure your funds. One\nsigner can be on one computer, and another can be on another or in cold storage. This slows down\nyour interactions with the chain but is orders of magnitude more secure."),(0,o.kt)("li",{parentName:"ul"},"board decisions: legal entities such as businesses and foundations use multisigs to govern over\nthe entity's treasury collectively."),(0,o.kt)("li",{parentName:"ul"},"group participation in governance: a multisig account can do everything a regular account can. A\nmultisig account could be a council member in\nPolkadot's governance, where a set of\ncommunity members could vote as one entity.")),(0,o.kt)("p",null,"Multi-signature accounts ",(0,o.kt)("strong",{parentName:"p"},"cannot be modified after being created"),". Changing the set of members or\naltering the threshold is not possible and instead requires the dissolution of the current multisig\nand creation of a new one. As such, multisig account addresses are ",(0,o.kt)("strong",{parentName:"p"},"deterministic"),", i.e. you can\nalways calculate the address of a multisig by knowing the members and the threshold, without the\naccount existing yet. This means one can send tokens to an address that does not exist yet, and if\nthe entities designated as the recipients come together in a new multisig under a matching\nthreshold, they will immediately have access to these tokens."),(0,o.kt)("h2",{id:"multisig-accounts-with-the-polkadot-js-ui"},"Multisig Accounts with the Polkadot-JS UI"),(0,o.kt)("h3",{id:"multisig-transactions-with-accounts-tab"},"Multisig Transactions with Accounts Tab"),(0,o.kt)("admonition",{title:"Walkthrough Video Tutorial",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"See ",(0,o.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=-cPiKMslZqI"},"this video tutorial")," to learn how to transact with\na multisig account using the Accounts Tab in the\n",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/accounts"},"Polkadot-JS UI"),".")),(0,o.kt)("p",null,"You can create a multisig account directly on the Accounts Tab of the\n",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/accounts"},"Polkadot-JS UI"),", and use this account to send funds. See\n",(0,o.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181826-how-to-create-and-use-a-multisig-account"},"this support article"),"\nfor more information."),(0,o.kt)("h3",{id:"multisig-transactions-with-extrinsic-tab"},"Multisig Transactions with Extrinsic Tab"),(0,o.kt)("p",null,"There are three types of actions you can take with a multisig account:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Executing a call ",(0,o.kt)("inlineCode",{parentName:"li"},"asMulti"),". This is used to begin or end a multisig transaction."),(0,o.kt)("li",{parentName:"ul"},"Approving a call ",(0,o.kt)("inlineCode",{parentName:"li"},"approveAsMulti"),". This is used to approve an extrinsic and pass-on to the next\nsignatory (see ",(0,o.kt)("a",{parentName:"li",href:"#example-using-multi-signature-accounts"},"example below")," for more information)."),(0,o.kt)("li",{parentName:"ul"},"Cancelling a call ",(0,o.kt)("inlineCode",{parentName:"li"},"cancelAsMulti"),".")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Check out ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/docs/substrate/extrinsics#multisig"},"this page")," for more\ninformation about the actions you can take with a multi-signature account.")),(0,o.kt)("p",null,"In scenarios where only a single approval is needed, a convenience method ",(0,o.kt)("inlineCode",{parentName:"p"},"as_multi_threshold_1"),"\nshould be used. This function takes only the other signatories and the raw call as arguments. Note\nthat the Polkadot-JS UI does not have integration for this call because it is not possible to create\nmultisig accounts with ",(0,o.kt)("inlineCode",{parentName:"p"},"threshold=1"),". If you want to create a multisig with threshold 1, you can use\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/paritytech/txwrapper-core"},"txwrapper-core"),", which is developed and supported by\nParity Technologies. There is a detailed\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/paritytech/txwrapper-core/tree/main/packages/txwrapper-examples/multisig"},"multisig example"),"\nthat you can try out and change to see how it works."),(0,o.kt)("p",null,"However, 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. When you create a new call or approve a\ncall as a multisig, you will need to place a small deposit. The deposit stays locked in the pallet\nuntil the call is executed. The deposit is to establish an economic cost on the storage space that\nthe multisig call takes up on the chain and discourage users from creating dangling multisig\noperations that never get executed. The deposit will be reserved in the caller's accounts, so\nparticipants in multisig wallets should have spare funds available."),(0,o.kt)("p",null,"The deposit is dependent on the ",(0,o.kt)("inlineCode",{parentName:"p"},"threshold")," parameter and is calculated as follows:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"Deposit = depositBase + threshold * depositFactor\n")),(0,o.kt)("p",null,"Where ",(0,o.kt)("inlineCode",{parentName:"p"},"depositBase")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"depositFactor")," are chain constants (in\nDOT units) set in the runtime code. Currently,\nthe deposit base equals\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.multisig.depositBase",defaultValue:20088e7,filter:"humanReadable",mdxType:"RPC"}),"\n","\nand the deposit factor equals\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.multisig.depositFactor",defaultValue:32e7,filter:"humanReadable",mdxType:"RPC"}),".\n",""),(0,o.kt)("h4",{id:"example-using-multisig-accounts"},"Example using Multisig Accounts"),(0,o.kt)("admonition",{title:"Walk-through video tutorial",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"See ",(0,o.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=T0vIuJcTJeQ"},"this video tutorial")," to learn how to transact with\na multisig account using the Extrinsic Tab in the\n",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"Polkadot-JS UI"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"multisig diagram",src:a(706).Z,width:"1920",height:"800"})),(0,o.kt)("p",null,"Let'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 ",(0,o.kt)("inlineCode",{parentName:"p"},"multisig.asMulti"),"\nextrinsic with the raw call, in this case, a balance transfer (",(0,o.kt)("inlineCode",{parentName:"p"},"balances.transferKeepAlive"),"\nextrinsic) from multisig CDE to Frank's account. When doing this, Charlie will have to deposit\n",(0,o.kt)("inlineCode",{parentName:"p"},"DepositBase + (2 * DepositFactor) = 20.152 DOT")," while he waits for either Dan or Eleanor also to\napprove the balance transfer call using the ",(0,o.kt)("inlineCode",{parentName:"p"},"multisig.approveAsMulti")," or the ",(0,o.kt)("inlineCode",{parentName:"p"},"multisig.asMulti"),"\nextrinsics."),(0,o.kt)("p",null,"If Dan submits the ",(0,o.kt)("inlineCode",{parentName:"p"},"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",(0,o.kt)("inlineCode",{parentName:"p"},"multisig.asMulti")," or ",(0,o.kt)("inlineCode",{parentName:"p"},"multisig.approveAsMulti")," extrinsic to transfer funds from CDE to Frank."),(0,o.kt)("p",null,"Alternatively, Dan or Eleanor can just submit a ",(0,o.kt)("inlineCode",{parentName:"p"},"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 ",(0,o.kt)("inlineCode",{parentName:"p"},"multisig.cancelAsMulti")," extrinsic."),(0,o.kt)("p",null,"Note that multisigs are ",(0,o.kt)("strong",{parentName:"p"},"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."),(0,o.kt)("admonition",{title:"Addresses that are provided to the multisig wallet are sorted",type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Public keys of signers' wallets are compared byte-for-byte and sorted ascending before being used to\ngenerate the multisig address. For example, consider the scenario with three addresses, A, B, and C,\nstarting with ",(0,o.kt)("inlineCode",{parentName:"p"},"5FUGT"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"5HMfS"),", and ",(0,o.kt)("inlineCode",{parentName:"p"},"5GhKJ"),". If we build the ABC multisig with the accounts in that\nspecific order (i.e. first A, then B, and C), the real order of the accounts in the multisig will be\nACB. If, in the Extrinsic tab, we initiate a multisig call with C, the order of the other\nsignatories will be first A, then B. If we put first B, then A, the transaction will fail.")),(0,o.kt)("p",null,"This has some implications when using the Extrinsics tab on the\n",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/accounts"},"Polkadot-JS UI")," to perform multisig transactions. If the\norder of the ",(0,o.kt)("em",{parentName:"p"},"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-JS UI supports\nmultisig accounts, as documented on the\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-account-generation#multi-signature-accounts"},"Account Generation page"),". You can see our\nvideo tutorials for more information about creating multisig accounts and transacting with them\nusing both the ",(0,o.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=-cPiKMslZqI"},"Accounts Tab")," and the\n",(0,o.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=T0vIuJcTJeQ"},"Extrinsic Tab")," in the Polkadot-JS UI."),(0,o.kt)("h2",{id:"multisig-with-multix-tool"},"Multisig with Multix Tool"),(0,o.kt)("admonition",{title:"Walk-Through Video Tutorial",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"See ",(0,o.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=APxPsawebJw"},"this video tutorial")," and\n",(0,o.kt)("a",{parentName:"p",href:"https://blog.chainsafe.io/multix-a-simple-interface-to-manage-complex-multisigs-on-polkadot-97328be26f9d"},"this article"),"\nfor more information about using ",(0,o.kt)("a",{parentName:"p",href:"https://multix.chainsafe.io/"},"Multix")," for multisig accounts.")),(0,o.kt)("p",null,"The ",(0,o.kt)("a",{parentName:"p",href:"https://multix.chainsafe.io/"},"Multix tool")," is an easy-to-use interface to manage complex\nmultisigs. The tool is part of\n",(0,o.kt)("a",{parentName:"p",href:"https://wiki.polkadot.network/docs/build-open-source#user-interface"},"the open-source Polkadot/Kusama Tech Stack"),".\nBesides being user-friendly, Multix provides several benefits compared to the Polkadot-JS UI:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"When one person creates the multisig account, all the signatories see the multisig account on\ntheir interface."),(0,o.kt)("li",{parentName:"ul"},"There is no need to pass around the call data to confirm a transaction. Such information is\nretrieved from the chain and displayed to the users."),(0,o.kt)("li",{parentName:"ul"},"Thanks to the power of ",(0,o.kt)("a",{parentName:"li",href:"/docs/learn-proxies-pure#anonymous-proxy-pure-proxy"},"pure proxies"),",\nadding and removing signatories or adjusting the threshold is now possible without creating new\nmultisigs and Multix provides an intuitive interface to work with pure proxies.")),(0,o.kt)("p",null,"The pure proxy setup used by ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/ChainSafe/Multix"},"MultiX")," can be seen on the\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-proxies-pure#scenario-three-multisig-controlling-a-pure-proxy"},"pure proxy page"),"."),(0,o.kt)("h2",{id:"decoding-multisig-call-data"},"Decoding Multisig Call Data"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Before signing a transaction, it is important to know the exact specifics of what is being signed.\nCheck the\n",(0,o.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181826-how-to-create-and-use-a-multisig-account"},'"How to use a multisig account"'),"\nin the support docs on how to decode the multisig call data.")))}g.isMDXComponent=!0},706:(t,e,a)=>{"use strict";a.d(e,{Z:()=>n});const n=a.p+"assets/images/multisig-diagram-90327330a3e865703a0ab1a1cc1eee47.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/54338ffb.8d087578.js b/assets/js/54338ffb.8d087578.js deleted file mode 100644 index d108cfe62f72..000000000000 --- a/assets/js/54338ffb.8d087578.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[4634],{47940:(t,e,a)=>{"use strict";a.d(e,{Z:()=>d});var n=a(74165),i=a(15861),o=a(67294),s=a(87152),r=a(17145),l=a(67425);function c(t,e,a){return u.apply(this,arguments)}function u(){return(u=(0,i.Z)((0,n.Z)().mark((function t(e,a,i){var o,l,c,u,p;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:o=void 0,l=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return o="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return o="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return o="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return o="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==o){t.next=18;break}return t.abrupt("return");case 18:return c=new s.U(o),t.next=21,r.G.create({provider:c});case 21:u=t.sent,(p=a.split(".")).forEach((function(t){t in u&&(u=u[t])})),t.t1=p[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return l=u.toString(),t.abrupt("break",35);case 29:return t.next=31,u();case 31:return l=(l=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+p[0]+") in "+a);case 35:return t.abrupt("return",l);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function p(t,e,a,n){switch(e){case"humanReadable":(0,l.HumanReadable)(t,a,n);break;case"precise":(0,l.Precise)(t,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(t,n);break;case"percentage":(0,l.Percentage)(t,n);break;case"arrayLength":(0,l.ArrayLength)(t,n);break;default:return void console.log("Ignoring unknown filter type")}}const d=function(t){var e=t.network,a=t.path,s=t.defaultValue,r=t.filter,l=void 0===r?void 0:r,u=(0,o.useState)(""),d=u[0],h=u[1];return e=e.toLowerCase(),(0,o.useEffect)((function(){void 0!==l?p(s.toString(),l,e,h):h(s.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var o=function(){var t=(0,i.Z)((0,n.Z)().mark((function t(){var i;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,c(e,a,h);case 2:if(void 0!==(i=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==l?p(i,l,e,h):h(i);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{o()}catch(r){console.log(r)}}}),[]),d}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,a,n){var i=void 0;if("polkadot"===a||"statemint"===a)i=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");i=6}t=parseFloat(t),n((t=Number.isInteger(t/e[a].precision)?t/e[a].precision+" "+e[a].symbol:(t/e[a].precision).toFixed(i)+" "+e[a].symbol).toString())},Precise:function(t,a,n){n(t=(t=parseFloat(t))/e[a].precision+" "+e[a].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},97765:(t,e,a)=>{"use strict";a.r(e),a.d(e,{assets:()=>p,contentTitle:()=>c,default:()=>g,frontMatter:()=>l,metadata:()=>u,toc:()=>d});var n=a(87462),i=a(63366),o=(a(67294),a(3905)),s=a(47940),r=["components"],l={id:"learn-account-multisig",title:"Multi-Signature Accounts",sidebar_label:"Multi-Signature Accounts",description:"Multi-signature Accounts on Polkadot.",keywords:["account","multisig","polkadot account","polkadotjs","multix"],slug:"../learn-account-multisig"},c=void 0,u={unversionedId:"learn/learn-account-multisig",id:"learn/learn-account-multisig",title:"Multi-Signature Accounts",description:"Multi-signature Accounts on Polkadot.",source:"@site/../docs/learn/learn-account-multisig.md",sourceDirName:"learn",slug:"/learn-account-multisig",permalink:"/docs/learn-account-multisig",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-account-multisig.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1697439762,formattedLastUpdatedAt:"Oct 16, 2023",frontMatter:{id:"learn-account-multisig",title:"Multi-Signature Accounts",sidebar_label:"Multi-Signature Accounts",description:"Multi-signature Accounts on Polkadot.",keywords:["account","multisig","polkadot account","polkadotjs","multix"],slug:"../learn-account-multisig"},sidebar:"docs",previous:{title:"Account Identity",permalink:"/docs/learn-identity"},next:{title:"Proxy Accounts",permalink:"/docs/learn-proxies"}},p={},d=[{value:"Introduction to Multisig Accounts",id:"introduction-to-multisig-accounts",level:2},{value:"Multisig Accounts with the Polkadot-JS UI",id:"multisig-accounts-with-the-polkadot-js-ui",level:2},{value:"Multisig Transactions with Accounts Tab",id:"multisig-transactions-with-accounts-tab",level:3},{value:"Multisig Transactions with Extrinsic Tab",id:"multisig-transactions-with-extrinsic-tab",level:3},{value:"Example using Multisig Accounts",id:"example-using-multisig-accounts",level:4},{value:"Multisig with Multix Tool",id:"multisig-with-multix-tool",level:2},{value:"Decoding Multisig Call Data",id:"decoding-multisig-call-data",level:2}],h={toc:d},m="wrapper";function g(t){var e=t.components,l=(0,i.Z)(t,r);return(0,o.kt)(m,(0,n.Z)({},h,l,{components:e,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"introduction-to-multisig-accounts"},"Introduction to Multisig Accounts"),(0,o.kt)("p",null,"It is possible to create multi-signature accounts (multisig) in Substrate-based chains. A multisig\nis composed of one or more addresses and a threshold. The threshold defines how many signatories\n(participating addresses) need to agree on submitting an extrinsic for the call to be successful."),(0,o.kt)("p",null,"For example, Alice, Bob, and Charlie set up a multisig with a threshold of 2. This means Alice and\nBob can execute any call even if Charlie disagrees with it. Likewise, Charlie and Bob can execute\nany call without Alice. A threshold is typically a number smaller than the total number of members\nbut can also be equal to it, which means they all have to agree."),(0,o.kt)("admonition",{title:"Learn more about multisig accounts",type:"info"},(0,o.kt)("p",{parentName:"admonition"},'Check the "How to create a multisig account" section on\n',(0,o.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181826-how-to-create-and-use-a-multisig-account"},"this support page"),".\nWe recommend trying out the tutorial on\n",(0,o.kt)("a",{parentName:"p",href:"/docs/maintain-networks#westend-test-network"},"Westend network")," - Polkadot's testnet.")),(0,o.kt)("p",null,"Multi-signature accounts have several uses:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"securing your stash: use additional signatories as a 2FA mechanism to secure your funds. One\nsigner can be on one computer, and another can be on another or in cold storage. This slows down\nyour interactions with the chain but is orders of magnitude more secure."),(0,o.kt)("li",{parentName:"ul"},"board decisions: legal entities such as businesses and foundations use multisigs to govern over\nthe entity's treasury collectively."),(0,o.kt)("li",{parentName:"ul"},"group participation in governance: a multisig account can do everything a regular account can. A\nmultisig account could be a council member in\nPolkadot's governance, where a set of\ncommunity members could vote as one entity.")),(0,o.kt)("p",null,"Multi-signature accounts ",(0,o.kt)("strong",{parentName:"p"},"cannot be modified after being created"),". Changing the set of members or\naltering the threshold is not possible and instead requires the dissolution of the current multisig\nand creation of a new one. As such, multisig account addresses are ",(0,o.kt)("strong",{parentName:"p"},"deterministic"),", i.e. you can\nalways calculate the address of a multisig by knowing the members and the threshold, without the\naccount existing yet. This means one can send tokens to an address that does not exist yet, and if\nthe entities designated as the recipients come together in a new multisig under a matching\nthreshold, they will immediately have access to these tokens."),(0,o.kt)("h2",{id:"multisig-accounts-with-the-polkadot-js-ui"},"Multisig Accounts with the Polkadot-JS UI"),(0,o.kt)("h3",{id:"multisig-transactions-with-accounts-tab"},"Multisig Transactions with Accounts Tab"),(0,o.kt)("admonition",{title:"Walkthrough Video Tutorial",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"See ",(0,o.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=-cPiKMslZqI"},"this video tutorial")," to learn how to transact with\na multisig account using the Accounts Tab in the\n",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/accounts"},"Polkadot-JS UI"),".")),(0,o.kt)("p",null,"You can create a multisig account directly on the Accounts Tab of the\n",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/accounts"},"Polkadot-JS UI"),", and use this account to send funds. See\n",(0,o.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181826-how-to-create-and-use-a-multisig-account"},"this support article"),"\nfor more information."),(0,o.kt)("h3",{id:"multisig-transactions-with-extrinsic-tab"},"Multisig Transactions with Extrinsic Tab"),(0,o.kt)("p",null,"There are three types of actions you can take with a multisig account:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Executing a call ",(0,o.kt)("inlineCode",{parentName:"li"},"asMulti"),". This is used to begin or end a multisig transaction."),(0,o.kt)("li",{parentName:"ul"},"Approving a call ",(0,o.kt)("inlineCode",{parentName:"li"},"approveAsMulti"),". This is used to approve an extrinsic and pass-on to the next\nsignatory (see ",(0,o.kt)("a",{parentName:"li",href:"#example-using-multi-signature-accounts"},"example below")," for more information)."),(0,o.kt)("li",{parentName:"ul"},"Cancelling a call ",(0,o.kt)("inlineCode",{parentName:"li"},"cancelAsMulti"),".")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Check out ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/docs/substrate/extrinsics#multisig"},"this page")," for more\ninformation about the actions you can take with a multi-signature account.")),(0,o.kt)("p",null,"In scenarios where only a single approval is needed, a convenience method ",(0,o.kt)("inlineCode",{parentName:"p"},"as_multi_threshold_1"),"\nshould be used. This function takes only the other signatories and the raw call as arguments. Note\nthat the Polkadot-JS UI does not have integration for this call because it is not possible to create\nmultisig accounts with ",(0,o.kt)("inlineCode",{parentName:"p"},"threshold=1"),". If you want to create a multisig with threshold 1, you can use\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/paritytech/txwrapper-core"},"txwrapper-core"),", which is developed and supported by\nParity Technologies. There is a detailed\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/paritytech/txwrapper-core/tree/main/packages/txwrapper-examples/multisig"},"multisig example"),"\nthat you can try out and change to see how it works."),(0,o.kt)("p",null,"However, 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. When you create a new call or approve a\ncall as a multisig, you will need to place a small deposit. The deposit stays locked in the pallet\nuntil the call is executed. The deposit is to establish an economic cost on the storage space that\nthe multisig call takes up on the chain and discourage users from creating dangling multisig\noperations that never get executed. The deposit will be reserved in the caller's accounts, so\nparticipants in multisig wallets should have spare funds available."),(0,o.kt)("p",null,"The deposit is dependent on the ",(0,o.kt)("inlineCode",{parentName:"p"},"threshold")," parameter and is calculated as follows:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"Deposit = depositBase + threshold * depositFactor\n")),(0,o.kt)("p",null,"Where ",(0,o.kt)("inlineCode",{parentName:"p"},"depositBase")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"depositFactor")," are chain constants (in\nDOT units) set in the runtime code. Currently,\nthe deposit base equals\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.multisig.depositBase",defaultValue:20088e7,filter:"humanReadable",mdxType:"RPC"}),"\n","\nand the deposit factor equals\n",(0,o.kt)(s.Z,{network:"polkadot",path:"consts.multisig.depositFactor",defaultValue:32e7,filter:"humanReadable",mdxType:"RPC"}),".\n",""),(0,o.kt)("h4",{id:"example-using-multisig-accounts"},"Example using Multisig Accounts"),(0,o.kt)("admonition",{title:"Walk-through video tutorial",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"See ",(0,o.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=T0vIuJcTJeQ"},"this video tutorial")," to learn how to transact with\na multisig account using the Extrinsic Tab in the\n",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"Polkadot-JS UI"),".")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"multisig diagram",src:a(706).Z,width:"1920",height:"800"})),(0,o.kt)("p",null,"Let'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 ",(0,o.kt)("inlineCode",{parentName:"p"},"multisig.asMulti"),"\nextrinsic with the raw call, in this case, a balance transfer (",(0,o.kt)("inlineCode",{parentName:"p"},"balances.transferKeepAlive"),"\nextrinsic) from multisig CDE to Frank's account. When doing this, Charlie will have to deposit\n",(0,o.kt)("inlineCode",{parentName:"p"},"DepositBase + (2 * DepositFactor) = 20.152 DOT")," while he waits for either Dan or Eleanor also to\napprove the balance transfer call using the ",(0,o.kt)("inlineCode",{parentName:"p"},"multisig.approveAsMulti")," or the ",(0,o.kt)("inlineCode",{parentName:"p"},"multisig.asMulti"),"\nextrinsics."),(0,o.kt)("p",null,"If Dan submits the ",(0,o.kt)("inlineCode",{parentName:"p"},"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",(0,o.kt)("inlineCode",{parentName:"p"},"multisig.asMulti")," or ",(0,o.kt)("inlineCode",{parentName:"p"},"multisig.approveAsMulti")," extrinsic to transfer funds from CDE to Frank."),(0,o.kt)("p",null,"Alternatively, Dan or Eleanor can just submit a ",(0,o.kt)("inlineCode",{parentName:"p"},"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 ",(0,o.kt)("inlineCode",{parentName:"p"},"multisig.cancelAsMulti")," extrinsic."),(0,o.kt)("p",null,"Note that multisigs are ",(0,o.kt)("strong",{parentName:"p"},"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."),(0,o.kt)("admonition",{title:"Addresses that are provided to the multisig wallet are sorted",type:"note"},(0,o.kt)("p",{parentName:"admonition"},"Public keys of signers' wallets are compared byte-for-byte and sorted ascending before being used to\ngenerate the multisig address. For example, consider the scenario with three addresses, A, B, and C,\nstarting with ",(0,o.kt)("inlineCode",{parentName:"p"},"5FUGT"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"5HMfS"),", and ",(0,o.kt)("inlineCode",{parentName:"p"},"5GhKJ"),". If we build the ABC multisig with the accounts in that\nspecific order (i.e. first A, then B, and C), the real order of the accounts in the multisig will be\nACB. If, in the Extrinsic tab, we initiate a multisig call with C, the order of the other\nsignatories will be first A, then B. If we put first B, then A, the transaction will fail.")),(0,o.kt)("p",null,"This has some implications when using the Extrinsics tab on the\n",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/accounts"},"Polkadot-JS UI")," to perform multisig transactions. If the\norder of the ",(0,o.kt)("em",{parentName:"p"},"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-JS UI supports\nmultisig accounts, as documented on the\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-account-generation#multi-signature-accounts"},"Account Generation page"),". You can see our\nvideo tutorials for more information about creating multisig accounts and transacting with them\nusing both the ",(0,o.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=-cPiKMslZqI"},"Accounts Tab")," and the\n",(0,o.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=T0vIuJcTJeQ"},"Extrinsic Tab")," in the Polkadot-JS UI."),(0,o.kt)("h2",{id:"multisig-with-multix-tool"},"Multisig with Multix Tool"),(0,o.kt)("admonition",{title:"Walk-Through Video Tutorial",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"See ",(0,o.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=APxPsawebJw"},"this video tutorial")," and\n",(0,o.kt)("a",{parentName:"p",href:"https://blog.chainsafe.io/multix-a-simple-interface-to-manage-complex-multisigs-on-polkadot-97328be26f9d"},"this article"),"\nfor more information about using ",(0,o.kt)("a",{parentName:"p",href:"https://multix.chainsafe.io/"},"Multix")," for multisig accounts.")),(0,o.kt)("p",null,"The ",(0,o.kt)("a",{parentName:"p",href:"https://multix.chainsafe.io/"},"Multix tool")," is an easy-to-use interface to manage complex\nmultisigs. The tool is part of\n",(0,o.kt)("a",{parentName:"p",href:"https://wiki.polkadot.network/docs/build-open-source#user-interface"},"the open-source Polkadot/Kusama Tech Stack"),".\nBesides being user-friendly, Multix provides several benefits compared to the Polkadot-JS UI:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"When one person creates the multisig account, all the signatories see the multisig account on\ntheir interface."),(0,o.kt)("li",{parentName:"ul"},"There is no need to pass around the call data to confirm a transaction. Such information is\nretrieved from the chain and displayed to the users."),(0,o.kt)("li",{parentName:"ul"},"Thanks to the power of ",(0,o.kt)("a",{parentName:"li",href:"/docs/learn-proxies-pure#anonymous-proxy-pure-proxy"},"pure proxies"),",\nadding and removing signatories or adjusting the threshold is now possible without creating new\nmultisigs and Multix provides an intuitive interface to work with pure proxies.")),(0,o.kt)("p",null,"The pure proxy setup used by ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/ChainSafe/Multix"},"MultiX")," can be seen on the\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-proxies-pure#scenario-three-multisig-controlling-a-pure-proxy"},"pure proxy page"),"."),(0,o.kt)("h2",{id:"decoding-multisig-call-data"},"Decoding Multisig Call Data"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Before signing a transaction, it is important to know the exact specifics of what is being signed.\nCheck the\n",(0,o.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181826-how-to-create-and-use-a-multisig-account"},'"How to use a multisig account"'),"\nin the support docs on how to decode the multisig call data.")))}g.isMDXComponent=!0},706:(t,e,a)=>{"use strict";a.d(e,{Z:()=>n});const n=a.p+"assets/images/multisig-diagram-90327330a3e865703a0ab1a1cc1eee47.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/6151e7ce.64707690.js b/assets/js/6151e7ce.64707690.js new file mode 100644 index 000000000000..6536d0927e77 --- /dev/null +++ b/assets/js/6151e7ce.64707690.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[2194],{47940:(t,e,a)=>{"use strict";a.d(e,{Z:()=>p});var n=a(74165),r=a(15861),l=a(67294),o=a(87152),i=a(17145),s=a(67425);function m(t,e,a){return u.apply(this,arguments)}function u(){return(u=(0,r.Z)((0,n.Z)().mark((function t(e,a,r){var l,s,m,u,d;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:l=void 0,s=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return l="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return l="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return l="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return l="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==l){t.next=18;break}return t.abrupt("return");case 18:return m=new o.U(l),t.next=21,i.G.create({provider:m});case 21:u=t.sent,(d=a.split(".")).forEach((function(t){t in u&&(u=u[t])})),t.t1=d[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return s=u.toString(),t.abrupt("break",35);case 29:return t.next=31,u();case 31:return s=(s=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+d[0]+") in "+a);case 35:return t.abrupt("return",s);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function d(t,e,a,n){switch(e){case"humanReadable":(0,s.HumanReadable)(t,a,n);break;case"precise":(0,s.Precise)(t,a,n);break;case"blocksToDays":(0,s.BlocksToDays)(t,n);break;case"percentage":(0,s.Percentage)(t,n);break;case"permillToPercent":(0,s.PermillToPercent)(t,n);break;case"arrayLength":(0,s.ArrayLength)(t,n);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(t){var e=t.network,a=t.path,o=t.defaultValue,i=t.filter,s=void 0===i?void 0:i,u=(0,l.useState)(""),p=u[0],k=u[1];return e=e.toLowerCase(),(0,l.useEffect)((function(){void 0!==s?d(o.toString(),s,e,k):k(o.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var l=function(){var t=(0,r.Z)((0,n.Z)().mark((function t(){var r;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,m(e,a,k);case 2:if(void 0!==(r=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==s?d(r,s,e,k):k(r);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{l()}catch(i){console.log(i)}}}),[]),p}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,a,n){var r=void 0;if("polkadot"===a||"statemint"===a)r=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");r=6}t=parseFloat(t),n((t=Number.isInteger(t/e[a].precision)?t/e[a].precision+" "+e[a].symbol:(t/e[a].precision).toFixed(r)+" "+e[a].symbol).toString())},Precise:function(t,a,n){n(t=(t=parseFloat(t))/e[a].precision+" "+e[a].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},PermillToPercent:function(t,e){e((t/=1e4).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},8417:(t,e,a)=>{"use strict";a.r(e),a.d(e,{assets:()=>d,contentTitle:()=>m,default:()=>g,frontMatter:()=>s,metadata:()=>u,toc:()=>p});var n=a(87462),r=a(63366),l=(a(67294),a(3905)),o=a(47940),i=["components"],s={id:"kusama-parameters",title:"Kusama Parameters",sidebar_label:"Parameters",description:"Learn about common Kusama parameters",keywords:["parameters","kusama","on-chain"],slug:"../../kusama-parameters"},m=void 0,u={unversionedId:"general/kusama/kusama-parameters",id:"general/kusama/kusama-parameters",title:"Kusama Parameters",description:"Learn about common Kusama parameters",source:"@site/../docs/general/kusama/kusama-parameters.md",sourceDirName:"general/kusama",slug:"/kusama-parameters",permalink:"/docs/kusama-parameters",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/general/kusama/kusama-parameters.md",tags:[],version:"current",lastUpdatedBy:"Keith Alfaro",lastUpdatedAt:1671489830,formattedLastUpdatedAt:"Dec 19, 2022",frontMatter:{id:"kusama-parameters",title:"Kusama Parameters",sidebar_label:"Parameters",description:"Learn about common Kusama parameters",keywords:["parameters","kusama","on-chain"],slug:"../../kusama-parameters"}},d={},p=[{value:"Periods of common actions and attributes",id:"periods-of-common-actions-and-attributes",level:3},{value:"Accounts, Identity and Crowdloans",id:"accounts-identity-and-crowdloans",level:3},{value:"Governance",id:"governance",level:3},{value:"Staking, Validating, and Nominating",id:"staking-validating-and-nominating",level:3},{value:"Treasury",id:"treasury",level:3},{value:"Precision",id:"precision",level:3}],k={toc:p},c="wrapper";function g(t){var e=t.components,a=(0,r.Z)(t,i);return(0,l.kt)(c,(0,n.Z)({},k,a,{components:e,mdxType:"MDXLayout"}),(0,l.kt)("p",null,"Many of these parameter values can be updated via on-chain governance. If you require absolute\ncertainty of these parameter values, it is recommended you directly check the constants by looking\nat the ",(0,l.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate/constants"},"chain state")," and/or\n",(0,l.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate"},"storage"),"."),(0,l.kt)("h3",{id:"periods-of-common-actions-and-attributes"},"Periods of common actions and attributes"),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"NOTE: Kusama generally runs 4x as fast as Polkadot, except in the time slot duration itself. See\n",(0,l.kt)("a",{parentName:"em",href:"/docs/maintain-polkadot-parameters"},"Polkadot Parameters")," for more details on how\nKusama's parameters differ from Polkadot's.")),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Slot: 6 seconds ","*","(generally one block per slot, although see note below)"),(0,l.kt)("li",{parentName:"ul"},"Epoch: 1 hour (600 slots x 6 seconds)"),(0,l.kt)("li",{parentName:"ul"},"Session: 1 hour (6 sessions per Era)"),(0,l.kt)("li",{parentName:"ul"},"Era: 6 hours (3600 slots x 6 seconds)")),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Kusama"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots","*"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Slot"),(0,l.kt)("td",{parentName:"tr",align:null},"6 seconds"),(0,l.kt)("td",{parentName:"tr",align:null},"1")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Epoch"),(0,l.kt)("td",{parentName:"tr",align:null},"1 hour"),(0,l.kt)("td",{parentName:"tr",align:null},"600")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Session"),(0,l.kt)("td",{parentName:"tr",align:null},"1 hour"),(0,l.kt)("td",{parentName:"tr",align:null},"600")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Era"),(0,l.kt)("td",{parentName:"tr",align:null},"6 hours"),(0,l.kt)("td",{parentName:"tr",align:null},"3_600")))),(0,l.kt)("p",null,"*",(0,l.kt)("em",{parentName:"p"},"A maximum of one block per slot can be in a canonical chain. Occasionally, a slot will be without\na block in the chain. Thus, the times given are ",(0,l.kt)("em",{parentName:"em"},"estimates"),". See\n",(0,l.kt)("a",{parentName:"em",href:"/docs/learn-consensus"},"Consensus")," for more details.")),(0,l.kt)("h3",{id:"accounts-identity-and-crowdloans"},"Accounts, Identity and Crowdloans"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"The ",(0,l.kt)("a",{parentName:"li",href:"/docs/learn-accounts#existential-deposit-and-reaping"},"Existential Deposit")," is\n",(0,l.kt)(o.Z,{network:"kusama",path:"consts.balances.existentialDeposit",defaultValue:333333333,filter:"humanReadable",mdxType:"RPC"}),""),(0,l.kt)("li",{parentName:"ul"},"The deposit required to set an Identity is\n",(0,l.kt)(o.Z,{network:"kusama",path:"consts.identity.basicDeposit",defaultValue:33333e6,filter:"humanReadable",mdxType:"RPC"}),""),(0,l.kt)("li",{parentName:"ul"},"The minimum contribution required to participate in a crowdloan is\n",(0,l.kt)(o.Z,{network:"kusama",path:"consts.crowdloan.minContribution",defaultValue:1e11,filter:"humanReadable",mdxType:"RPC"}),"")),(0,l.kt)("h3",{id:"governance"},"Governance"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Democracy"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Voting period"),(0,l.kt)("td",{parentName:"tr",align:null},"7 days"),(0,l.kt)("td",{parentName:"tr",align:null},"100_800"),(0,l.kt)("td",{parentName:"tr",align:null},"How long the public can vote on a referendum.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Launch period"),(0,l.kt)("td",{parentName:"tr",align:null},"7 days"),(0,l.kt)("td",{parentName:"tr",align:null},"100_800"),(0,l.kt)("td",{parentName:"tr",align:null},"How long the public can select which proposal to hold a referendum on, i.e., every week, the highest-weighted proposal will be selected to have a referendum.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Enactment period"),(0,l.kt)("td",{parentName:"tr",align:null},"8 days"),(0,l.kt)("td",{parentName:"tr",align:null},"115_200"),(0,l.kt)("td",{parentName:"tr",align:null},"Time it takes for a successful referendum to be implemented on the network.")))),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Council"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Term duration"),(0,l.kt)("td",{parentName:"tr",align:null},"1 day"),(0,l.kt)("td",{parentName:"tr",align:null},"14_400"),(0,l.kt)("td",{parentName:"tr",align:null},"The length of a council member's term until the next election round.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Voting period"),(0,l.kt)("td",{parentName:"tr",align:null},"1 day"),(0,l.kt)("td",{parentName:"tr",align:null},"14_400"),(0,l.kt)("td",{parentName:"tr",align:null},"The council's voting period for motions.")))),(0,l.kt)("p",null,"The Kusama Council consists of up to 19 members and up to 19 runners up."),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Technical committee"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Cool-off period"),(0,l.kt)("td",{parentName:"tr",align:null},"7 days"),(0,l.kt)("td",{parentName:"tr",align:null},"604_800"),(0,l.kt)("td",{parentName:"tr",align:null},"The time a veto from the technical committee lasts before the proposal can be submitted again.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Emergency voting period"),(0,l.kt)("td",{parentName:"tr",align:null},"3 hours"),(0,l.kt)("td",{parentName:"tr",align:null},"1_800"),(0,l.kt)("td",{parentName:"tr",align:null},"The voting period after the technical committee expedites voting.")))),(0,l.kt)("h3",{id:"staking-validating-and-nominating"},"Staking, Validating, and Nominating"),(0,l.kt)("p",null,"A maximum of\n",(0,l.kt)(o.Z,{network:"kusama",path:"consts.staking.maxNominations",defaultValue:24,mdxType:"RPC"}),"\n","\nvalidators can be nominated by a nominator on Kusama."),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Kusama"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Term duration"),(0,l.kt)("td",{parentName:"tr",align:null},"6 hours"),(0,l.kt)("td",{parentName:"tr",align:null},"3_600"),(0,l.kt)("td",{parentName:"tr",align:null},"The time for which a validator is in the set after being elected. Note, this duration can be shortened in the case the a validator misbehaves.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Nomination period"),(0,l.kt)("td",{parentName:"tr",align:null},"6 hours"),(0,l.kt)("td",{parentName:"tr",align:null},"3_600"),(0,l.kt)("td",{parentName:"tr",align:null},"How often a new validator set is ",(0,l.kt)("a",{parentName:"td",href:"/docs/learn-phragmen"},"elected"),".")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Bonding duration"),(0,l.kt)("td",{parentName:"tr",align:null},"7 days"),(0,l.kt)("td",{parentName:"tr",align:null},"604_800"),(0,l.kt)("td",{parentName:"tr",align:null},"How long until your funds will be transferrable after unbonding. Note that the bonding duration is defined in eras, not directly by slots.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Slash defer duration"),(0,l.kt)("td",{parentName:"tr",align:null},"7 days"),(0,l.kt)("td",{parentName:"tr",align:null},"604_800"),(0,l.kt)("td",{parentName:"tr",align:null},'Prevents overslashing and validators "escaping" and getting their nominators slashed with no repercussions to themselves. Note that the bonding duration is defined in eras, not directly by slots.')))),(0,l.kt)("h3",{id:"treasury"},"Treasury"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Treasury"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Periods between spends"),(0,l.kt)("td",{parentName:"tr",align:null},"6 days"),(0,l.kt)("td",{parentName:"tr",align:null},"86_400"),(0,l.kt)("td",{parentName:"tr",align:null},"When the treasury can spend again after spending previously.")))),(0,l.kt)("p",null,"Burn percentage is currently ",(0,l.kt)("inlineCode",{parentName:"p"},"0.20%"),", though instead of being burned this amount is temporarily\nredirected into the ",(0,l.kt)("a",{parentName:"p",href:"/docs/maintain-guides-society-kusama"},"Society"),"'s treasury to\nfund growth."),(0,l.kt)("h3",{id:"precision"},"Precision"),(0,l.kt)("p",null,"KSM have 12 decimals of precision. In other words, 1e12 (1_000_000_000_000, or one trillion) Plancks\nmake up a single KSM."))}g.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/6151e7ce.d537580c.js b/assets/js/6151e7ce.d537580c.js deleted file mode 100644 index c738ca8333eb..000000000000 --- a/assets/js/6151e7ce.d537580c.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[2194],{47940:(t,e,a)=>{"use strict";a.d(e,{Z:()=>p});var n=a(74165),r=a(15861),l=a(67294),o=a(87152),i=a(17145),s=a(67425);function m(t,e,a){return u.apply(this,arguments)}function u(){return(u=(0,r.Z)((0,n.Z)().mark((function t(e,a,r){var l,s,m,u,d;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:l=void 0,s=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return l="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return l="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return l="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return l="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==l){t.next=18;break}return t.abrupt("return");case 18:return m=new o.U(l),t.next=21,i.G.create({provider:m});case 21:u=t.sent,(d=a.split(".")).forEach((function(t){t in u&&(u=u[t])})),t.t1=d[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return s=u.toString(),t.abrupt("break",35);case 29:return t.next=31,u();case 31:return s=(s=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+d[0]+") in "+a);case 35:return t.abrupt("return",s);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function d(t,e,a,n){switch(e){case"humanReadable":(0,s.HumanReadable)(t,a,n);break;case"precise":(0,s.Precise)(t,a,n);break;case"blocksToDays":(0,s.BlocksToDays)(t,n);break;case"percentage":(0,s.Percentage)(t,n);break;case"arrayLength":(0,s.ArrayLength)(t,n);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(t){var e=t.network,a=t.path,o=t.defaultValue,i=t.filter,s=void 0===i?void 0:i,u=(0,l.useState)(""),p=u[0],k=u[1];return e=e.toLowerCase(),(0,l.useEffect)((function(){void 0!==s?d(o.toString(),s,e,k):k(o.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var l=function(){var t=(0,r.Z)((0,n.Z)().mark((function t(){var r;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,m(e,a,k);case 2:if(void 0!==(r=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==s?d(r,s,e,k):k(r);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{l()}catch(i){console.log(i)}}}),[]),p}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,a,n){var r=void 0;if("polkadot"===a||"statemint"===a)r=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");r=6}t=parseFloat(t),n((t=Number.isInteger(t/e[a].precision)?t/e[a].precision+" "+e[a].symbol:(t/e[a].precision).toFixed(r)+" "+e[a].symbol).toString())},Precise:function(t,a,n){n(t=(t=parseFloat(t))/e[a].precision+" "+e[a].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},8417:(t,e,a)=>{"use strict";a.r(e),a.d(e,{assets:()=>d,contentTitle:()=>m,default:()=>g,frontMatter:()=>s,metadata:()=>u,toc:()=>p});var n=a(87462),r=a(63366),l=(a(67294),a(3905)),o=a(47940),i=["components"],s={id:"kusama-parameters",title:"Kusama Parameters",sidebar_label:"Parameters",description:"Learn about common Kusama parameters",keywords:["parameters","kusama","on-chain"],slug:"../../kusama-parameters"},m=void 0,u={unversionedId:"general/kusama/kusama-parameters",id:"general/kusama/kusama-parameters",title:"Kusama Parameters",description:"Learn about common Kusama parameters",source:"@site/../docs/general/kusama/kusama-parameters.md",sourceDirName:"general/kusama",slug:"/kusama-parameters",permalink:"/docs/kusama-parameters",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/general/kusama/kusama-parameters.md",tags:[],version:"current",lastUpdatedBy:"Keith Alfaro",lastUpdatedAt:1671489830,formattedLastUpdatedAt:"Dec 19, 2022",frontMatter:{id:"kusama-parameters",title:"Kusama Parameters",sidebar_label:"Parameters",description:"Learn about common Kusama parameters",keywords:["parameters","kusama","on-chain"],slug:"../../kusama-parameters"}},d={},p=[{value:"Periods of common actions and attributes",id:"periods-of-common-actions-and-attributes",level:3},{value:"Accounts, Identity and Crowdloans",id:"accounts-identity-and-crowdloans",level:3},{value:"Governance",id:"governance",level:3},{value:"Staking, Validating, and Nominating",id:"staking-validating-and-nominating",level:3},{value:"Treasury",id:"treasury",level:3},{value:"Precision",id:"precision",level:3}],k={toc:p},c="wrapper";function g(t){var e=t.components,a=(0,r.Z)(t,i);return(0,l.kt)(c,(0,n.Z)({},k,a,{components:e,mdxType:"MDXLayout"}),(0,l.kt)("p",null,"Many of these parameter values can be updated via on-chain governance. If you require absolute\ncertainty of these parameter values, it is recommended you directly check the constants by looking\nat the ",(0,l.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate/constants"},"chain state")," and/or\n",(0,l.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate"},"storage"),"."),(0,l.kt)("h3",{id:"periods-of-common-actions-and-attributes"},"Periods of common actions and attributes"),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"NOTE: Kusama generally runs 4x as fast as Polkadot, except in the time slot duration itself. See\n",(0,l.kt)("a",{parentName:"em",href:"/docs/maintain-polkadot-parameters"},"Polkadot Parameters")," for more details on how\nKusama's parameters differ from Polkadot's.")),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Slot: 6 seconds ","*","(generally one block per slot, although see note below)"),(0,l.kt)("li",{parentName:"ul"},"Epoch: 1 hour (600 slots x 6 seconds)"),(0,l.kt)("li",{parentName:"ul"},"Session: 1 hour (6 sessions per Era)"),(0,l.kt)("li",{parentName:"ul"},"Era: 6 hours (3600 slots x 6 seconds)")),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Kusama"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots","*"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Slot"),(0,l.kt)("td",{parentName:"tr",align:null},"6 seconds"),(0,l.kt)("td",{parentName:"tr",align:null},"1")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Epoch"),(0,l.kt)("td",{parentName:"tr",align:null},"1 hour"),(0,l.kt)("td",{parentName:"tr",align:null},"600")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Session"),(0,l.kt)("td",{parentName:"tr",align:null},"1 hour"),(0,l.kt)("td",{parentName:"tr",align:null},"600")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Era"),(0,l.kt)("td",{parentName:"tr",align:null},"6 hours"),(0,l.kt)("td",{parentName:"tr",align:null},"3_600")))),(0,l.kt)("p",null,"*",(0,l.kt)("em",{parentName:"p"},"A maximum of one block per slot can be in a canonical chain. Occasionally, a slot will be without\na block in the chain. Thus, the times given are ",(0,l.kt)("em",{parentName:"em"},"estimates"),". See\n",(0,l.kt)("a",{parentName:"em",href:"/docs/learn-consensus"},"Consensus")," for more details.")),(0,l.kt)("h3",{id:"accounts-identity-and-crowdloans"},"Accounts, Identity and Crowdloans"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"The ",(0,l.kt)("a",{parentName:"li",href:"/docs/learn-accounts#existential-deposit-and-reaping"},"Existential Deposit")," is\n",(0,l.kt)(o.Z,{network:"kusama",path:"consts.balances.existentialDeposit",defaultValue:333333333,filter:"humanReadable",mdxType:"RPC"}),""),(0,l.kt)("li",{parentName:"ul"},"The deposit required to set an Identity is\n",(0,l.kt)(o.Z,{network:"kusama",path:"consts.identity.basicDeposit",defaultValue:33333e6,filter:"humanReadable",mdxType:"RPC"}),""),(0,l.kt)("li",{parentName:"ul"},"The minimum contribution required to participate in a crowdloan is\n",(0,l.kt)(o.Z,{network:"kusama",path:"consts.crowdloan.minContribution",defaultValue:1e11,filter:"humanReadable",mdxType:"RPC"}),"")),(0,l.kt)("h3",{id:"governance"},"Governance"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Democracy"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Voting period"),(0,l.kt)("td",{parentName:"tr",align:null},"7 days"),(0,l.kt)("td",{parentName:"tr",align:null},"100_800"),(0,l.kt)("td",{parentName:"tr",align:null},"How long the public can vote on a referendum.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Launch period"),(0,l.kt)("td",{parentName:"tr",align:null},"7 days"),(0,l.kt)("td",{parentName:"tr",align:null},"100_800"),(0,l.kt)("td",{parentName:"tr",align:null},"How long the public can select which proposal to hold a referendum on, i.e., every week, the highest-weighted proposal will be selected to have a referendum.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Enactment period"),(0,l.kt)("td",{parentName:"tr",align:null},"8 days"),(0,l.kt)("td",{parentName:"tr",align:null},"115_200"),(0,l.kt)("td",{parentName:"tr",align:null},"Time it takes for a successful referendum to be implemented on the network.")))),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Council"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Term duration"),(0,l.kt)("td",{parentName:"tr",align:null},"1 day"),(0,l.kt)("td",{parentName:"tr",align:null},"14_400"),(0,l.kt)("td",{parentName:"tr",align:null},"The length of a council member's term until the next election round.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Voting period"),(0,l.kt)("td",{parentName:"tr",align:null},"1 day"),(0,l.kt)("td",{parentName:"tr",align:null},"14_400"),(0,l.kt)("td",{parentName:"tr",align:null},"The council's voting period for motions.")))),(0,l.kt)("p",null,"The Kusama Council consists of up to 19 members and up to 19 runners up."),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Technical committee"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Cool-off period"),(0,l.kt)("td",{parentName:"tr",align:null},"7 days"),(0,l.kt)("td",{parentName:"tr",align:null},"604_800"),(0,l.kt)("td",{parentName:"tr",align:null},"The time a veto from the technical committee lasts before the proposal can be submitted again.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Emergency voting period"),(0,l.kt)("td",{parentName:"tr",align:null},"3 hours"),(0,l.kt)("td",{parentName:"tr",align:null},"1_800"),(0,l.kt)("td",{parentName:"tr",align:null},"The voting period after the technical committee expedites voting.")))),(0,l.kt)("h3",{id:"staking-validating-and-nominating"},"Staking, Validating, and Nominating"),(0,l.kt)("p",null,"A maximum of\n",(0,l.kt)(o.Z,{network:"kusama",path:"consts.staking.maxNominations",defaultValue:24,mdxType:"RPC"}),"\n","\nvalidators can be nominated by a nominator on Kusama."),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Kusama"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Term duration"),(0,l.kt)("td",{parentName:"tr",align:null},"6 hours"),(0,l.kt)("td",{parentName:"tr",align:null},"3_600"),(0,l.kt)("td",{parentName:"tr",align:null},"The time for which a validator is in the set after being elected. Note, this duration can be shortened in the case the a validator misbehaves.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Nomination period"),(0,l.kt)("td",{parentName:"tr",align:null},"6 hours"),(0,l.kt)("td",{parentName:"tr",align:null},"3_600"),(0,l.kt)("td",{parentName:"tr",align:null},"How often a new validator set is ",(0,l.kt)("a",{parentName:"td",href:"/docs/learn-phragmen"},"elected"),".")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Bonding duration"),(0,l.kt)("td",{parentName:"tr",align:null},"7 days"),(0,l.kt)("td",{parentName:"tr",align:null},"604_800"),(0,l.kt)("td",{parentName:"tr",align:null},"How long until your funds will be transferrable after unbonding. Note that the bonding duration is defined in eras, not directly by slots.")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Slash defer duration"),(0,l.kt)("td",{parentName:"tr",align:null},"7 days"),(0,l.kt)("td",{parentName:"tr",align:null},"604_800"),(0,l.kt)("td",{parentName:"tr",align:null},'Prevents overslashing and validators "escaping" and getting their nominators slashed with no repercussions to themselves. Note that the bonding duration is defined in eras, not directly by slots.')))),(0,l.kt)("h3",{id:"treasury"},"Treasury"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Treasury"),(0,l.kt)("th",{parentName:"tr",align:null},"Time"),(0,l.kt)("th",{parentName:"tr",align:null},"Slots"),(0,l.kt)("th",{parentName:"tr",align:null},"Description"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Periods between spends"),(0,l.kt)("td",{parentName:"tr",align:null},"6 days"),(0,l.kt)("td",{parentName:"tr",align:null},"86_400"),(0,l.kt)("td",{parentName:"tr",align:null},"When the treasury can spend again after spending previously.")))),(0,l.kt)("p",null,"Burn percentage is currently ",(0,l.kt)("inlineCode",{parentName:"p"},"0.20%"),", though instead of being burned this amount is temporarily\nredirected into the ",(0,l.kt)("a",{parentName:"p",href:"/docs/maintain-guides-society-kusama"},"Society"),"'s treasury to\nfund growth."),(0,l.kt)("h3",{id:"precision"},"Precision"),(0,l.kt)("p",null,"KSM have 12 decimals of precision. In other words, 1e12 (1_000_000_000_000, or one trillion) Plancks\nmake up a single KSM."))}g.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/694672cd.774de6ed.js b/assets/js/694672cd.774de6ed.js new file mode 100644 index 000000000000..c149bd8de251 --- /dev/null +++ b/assets/js/694672cd.774de6ed.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[8138],{47940:(t,e,a)=>{"use strict";a.d(e,{Z:()=>p});var o=a(74165),n=a(15861),s=a(67294),r=a(87152),i=a(17145),l=a(67425);function c(t,e,a){return d.apply(this,arguments)}function d(){return(d=(0,n.Z)((0,o.Z)().mark((function t(e,a,n){var s,l,c,d,u;return(0,o.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:s=void 0,l=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return s="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return s="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return s="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return s="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==s){t.next=18;break}return t.abrupt("return");case 18:return c=new r.U(s),t.next=21,i.G.create({provider:c});case 21:d=t.sent,(u=a.split(".")).forEach((function(t){t in d&&(d=d[t])})),t.t1=u[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return l=d.toString(),t.abrupt("break",35);case 29:return t.next=31,d();case 31:return l=(l=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+a);case 35:return t.abrupt("return",l);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function u(t,e,a,o){switch(e){case"humanReadable":(0,l.HumanReadable)(t,a,o);break;case"precise":(0,l.Precise)(t,a,o);break;case"blocksToDays":(0,l.BlocksToDays)(t,o);break;case"percentage":(0,l.Percentage)(t,o);break;case"permillToPercent":(0,l.PermillToPercent)(t,o);break;case"arrayLength":(0,l.ArrayLength)(t,o);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(t){var e=t.network,a=t.path,r=t.defaultValue,i=t.filter,l=void 0===i?void 0:i,d=(0,s.useState)(""),p=d[0],k=d[1];return e=e.toLowerCase(),(0,s.useEffect)((function(){void 0!==l?u(r.toString(),l,e,k):k(r.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var s=function(){var t=(0,n.Z)((0,o.Z)().mark((function t(){var n;return(0,o.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,c(e,a,k);case 2:if(void 0!==(n=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==l?u(n,l,e,k):k(n);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{s()}catch(i){console.log(i)}}}),[]),p}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,a,o){var n=void 0;if("polkadot"===a||"statemint"===a)n=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");n=6}t=parseFloat(t),o((t=Number.isInteger(t/e[a].precision)?t/e[a].precision+" "+e[a].symbol:(t/e[a].precision).toFixed(n)+" "+e[a].symbol).toString())},Precise:function(t,a,o){o(t=(t=parseFloat(t))/e[a].precision+" "+e[a].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},PermillToPercent:function(t,e){e((t/=1e4).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},29576:(t,e,a)=>{"use strict";a.r(e),a.d(e,{assets:()=>u,contentTitle:()=>c,default:()=>m,frontMatter:()=>l,metadata:()=>d,toc:()=>p});var o=a(87462),n=a(63366),s=(a(67294),a(3905)),r=a(47940),i=["components"],l={id:"learn-guides-staking",title:"How-to Guides for Nominators",sidebar_label:"Staking",description:"Advanced How-to Guides for Nominators.",keyword:["nominate","stake","staking","pools","create","destroy","claim","rewards"],slug:"../learn-guides-staking"},c=void 0,d={unversionedId:"learn/learn-guides-staking",id:"learn/learn-guides-staking",title:"How-to Guides for Nominators",description:"Advanced How-to Guides for Nominators.",source:"@site/../docs/learn/learn-guides-staking.md",sourceDirName:"learn",slug:"/learn-guides-staking",permalink:"/docs/learn-guides-staking",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-guides-staking.md",tags:[],version:"current",lastUpdatedBy:"github-actions[bot]",lastUpdatedAt:1695621828,formattedLastUpdatedAt:"Sep 25, 2023",frontMatter:{id:"learn-guides-staking",title:"How-to Guides for Nominators",sidebar_label:"Staking",description:"Advanced How-to Guides for Nominators.",keyword:["nominate","stake","staking","pools","create","destroy","claim","rewards"],slug:"../learn-guides-staking"},sidebar:"docs",previous:{title:"Staking",permalink:"/docs/learn-guides-staking-index"},next:{title:"Nomination Pools",permalink:"/docs/learn-guides-staking-pools"}},u={},p=[{value:"Claiming Rewards with the Polkadot-JS UI",id:"claiming-rewards-with-the-polkadot-js-ui",level:2}],k={toc:p},g="wrapper";function m(t){var e=t.components,l=(0,n.Z)(t,i);return(0,s.kt)(g,(0,o.Z)({},k,l,{components:e,mdxType:"MDXLayout"}),(0,s.kt)("p",null,"This page focuses on the advanced staking features of the network. If you like to learn about\nstaking, check this page on the\n",(0,s.kt)("a",{parentName:"p",href:"https://wiki.polkadot.network/docs/learn-staking"},"introduction to staking.")),(0,s.kt)("h2",{id:"claiming-rewards-with-the-polkadot-js-ui"},"Claiming Rewards with the Polkadot-JS UI"),(0,s.kt)("p",null,"Anyone 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.\nPolkadot will automatically calculate that\nvalidator's reward, find the top\n",(0,s.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n","\nnominators for that era, and distribute the rewards pro rata."),(0,s.kt)("admonition",{type:"note"},(0,s.kt)("p",{parentName:"admonition"},"The Staking system only applies the highest\n",(0,s.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n","\nnominations to each validator to reduce the complexity of the staking set.")),(0,s.kt)("p",null,"These details are handled for you automatically if you use the\n",(0,s.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/payout"},"Polkadot-JS UI"),", which also allows you to submit\nbatches of eras at once."),(0,s.kt)("p",null,'To claim rewards on Polkadot-JS UI, you will need to be in the "Payouts" tab underneath "Staking",\nwhich will list all the pending payouts for your stashes.'),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"pending-payouts",src:a(26416).Z,width:"2876",height:"600"})),(0,s.kt)("p",null,'To then claim your reward, select the "Payout all" button. This will prompt you to select your stash\naccounts for payout.'),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"select-payouts",src:a(32348).Z,width:"2192",height:"624"})),(0,s.kt)("p",null,"Once you are done with payout, another screen will appear asking for you to sign and submit the\ntransaction."),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"transaction-payouts",src:a(41083).Z,width:"2878",height:"818"})))}m.isMDXComponent=!0},41083:(t,e,a)=>{"use strict";a.d(e,{Z:()=>o});const o=a.p+"assets/images/polkadotjs_payout_complete-87ad124d5d70e50c16f1434074562d70.png"},26416:(t,e,a)=>{"use strict";a.d(e,{Z:()=>o});const o=a.p+"assets/images/polkadotjs_payout_page-fc4f62399f71b542e9eaac01405ef528.png"},32348:(t,e,a)=>{"use strict";a.d(e,{Z:()=>o});const o=a.p+"assets/images/polkadotjs_payout_popup-feb847cdfae64f3fa247cdb2beea4ba6.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/694672cd.864899a6.js b/assets/js/694672cd.864899a6.js deleted file mode 100644 index a68c24d9a4bb..000000000000 --- a/assets/js/694672cd.864899a6.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[8138],{47940:(t,e,a)=>{"use strict";a.d(e,{Z:()=>p});var o=a(74165),n=a(15861),s=a(67294),r=a(87152),i=a(17145),l=a(67425);function d(t,e,a){return c.apply(this,arguments)}function c(){return(c=(0,n.Z)((0,o.Z)().mark((function t(e,a,n){var s,l,d,c,u;return(0,o.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:s=void 0,l=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return s="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return s="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return s="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return s="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==s){t.next=18;break}return t.abrupt("return");case 18:return d=new r.U(s),t.next=21,i.G.create({provider:d});case 21:c=t.sent,(u=a.split(".")).forEach((function(t){t in c&&(c=c[t])})),t.t1=u[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return l=c.toString(),t.abrupt("break",35);case 29:return t.next=31,c();case 31:return l=(l=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+a);case 35:return t.abrupt("return",l);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function u(t,e,a,o){switch(e){case"humanReadable":(0,l.HumanReadable)(t,a,o);break;case"precise":(0,l.Precise)(t,a,o);break;case"blocksToDays":(0,l.BlocksToDays)(t,o);break;case"percentage":(0,l.Percentage)(t,o);break;case"arrayLength":(0,l.ArrayLength)(t,o);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(t){var e=t.network,a=t.path,r=t.defaultValue,i=t.filter,l=void 0===i?void 0:i,c=(0,s.useState)(""),p=c[0],k=c[1];return e=e.toLowerCase(),(0,s.useEffect)((function(){void 0!==l?u(r.toString(),l,e,k):k(r.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var s=function(){var t=(0,n.Z)((0,o.Z)().mark((function t(){var n;return(0,o.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,d(e,a,k);case 2:if(void 0!==(n=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==l?u(n,l,e,k):k(n);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{s()}catch(i){console.log(i)}}}),[]),p}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,a,o){var n=void 0;if("polkadot"===a||"statemint"===a)n=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");n=6}t=parseFloat(t),o((t=Number.isInteger(t/e[a].precision)?t/e[a].precision+" "+e[a].symbol:(t/e[a].precision).toFixed(n)+" "+e[a].symbol).toString())},Precise:function(t,a,o){o(t=(t=parseFloat(t))/e[a].precision+" "+e[a].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},29576:(t,e,a)=>{"use strict";a.r(e),a.d(e,{assets:()=>u,contentTitle:()=>d,default:()=>m,frontMatter:()=>l,metadata:()=>c,toc:()=>p});var o=a(87462),n=a(63366),s=(a(67294),a(3905)),r=a(47940),i=["components"],l={id:"learn-guides-staking",title:"How-to Guides for Nominators",sidebar_label:"Staking",description:"Advanced How-to Guides for Nominators.",keyword:["nominate","stake","staking","pools","create","destroy","claim","rewards"],slug:"../learn-guides-staking"},d=void 0,c={unversionedId:"learn/learn-guides-staking",id:"learn/learn-guides-staking",title:"How-to Guides for Nominators",description:"Advanced How-to Guides for Nominators.",source:"@site/../docs/learn/learn-guides-staking.md",sourceDirName:"learn",slug:"/learn-guides-staking",permalink:"/docs/learn-guides-staking",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-guides-staking.md",tags:[],version:"current",lastUpdatedBy:"github-actions[bot]",lastUpdatedAt:1695621828,formattedLastUpdatedAt:"Sep 25, 2023",frontMatter:{id:"learn-guides-staking",title:"How-to Guides for Nominators",sidebar_label:"Staking",description:"Advanced How-to Guides for Nominators.",keyword:["nominate","stake","staking","pools","create","destroy","claim","rewards"],slug:"../learn-guides-staking"},sidebar:"docs",previous:{title:"Staking",permalink:"/docs/learn-guides-staking-index"},next:{title:"Nomination Pools",permalink:"/docs/learn-guides-staking-pools"}},u={},p=[{value:"Claiming Rewards with the Polkadot-JS UI",id:"claiming-rewards-with-the-polkadot-js-ui",level:2}],k={toc:p},g="wrapper";function m(t){var e=t.components,l=(0,n.Z)(t,i);return(0,s.kt)(g,(0,o.Z)({},k,l,{components:e,mdxType:"MDXLayout"}),(0,s.kt)("p",null,"This page focuses on the advanced staking features of the network. If you like to learn about\nstaking, check this page on the\n",(0,s.kt)("a",{parentName:"p",href:"https://wiki.polkadot.network/docs/learn-staking"},"introduction to staking.")),(0,s.kt)("h2",{id:"claiming-rewards-with-the-polkadot-js-ui"},"Claiming Rewards with the Polkadot-JS UI"),(0,s.kt)("p",null,"Anyone 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.\nPolkadot will automatically calculate that\nvalidator's reward, find the top\n",(0,s.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n","\nnominators for that era, and distribute the rewards pro rata."),(0,s.kt)("admonition",{type:"note"},(0,s.kt)("p",{parentName:"admonition"},"The Staking system only applies the highest\n",(0,s.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n","\nnominations to each validator to reduce the complexity of the staking set.")),(0,s.kt)("p",null,"These details are handled for you automatically if you use the\n",(0,s.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/payout"},"Polkadot-JS UI"),", which also allows you to submit\nbatches of eras at once."),(0,s.kt)("p",null,'To claim rewards on Polkadot-JS UI, you will need to be in the "Payouts" tab underneath "Staking",\nwhich will list all the pending payouts for your stashes.'),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"pending-payouts",src:a(26416).Z,width:"2876",height:"600"})),(0,s.kt)("p",null,'To then claim your reward, select the "Payout all" button. This will prompt you to select your stash\naccounts for payout.'),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"select-payouts",src:a(32348).Z,width:"2192",height:"624"})),(0,s.kt)("p",null,"Once you are done with payout, another screen will appear asking for you to sign and submit the\ntransaction."),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"transaction-payouts",src:a(41083).Z,width:"2878",height:"818"})))}m.isMDXComponent=!0},41083:(t,e,a)=>{"use strict";a.d(e,{Z:()=>o});const o=a.p+"assets/images/polkadotjs_payout_complete-87ad124d5d70e50c16f1434074562d70.png"},26416:(t,e,a)=>{"use strict";a.d(e,{Z:()=>o});const o=a.p+"assets/images/polkadotjs_payout_page-fc4f62399f71b542e9eaac01405ef528.png"},32348:(t,e,a)=>{"use strict";a.d(e,{Z:()=>o});const o=a.p+"assets/images/polkadotjs_payout_popup-feb847cdfae64f3fa247cdb2beea4ba6.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/6f1a81b8.8e77e8ab.js b/assets/js/6f1a81b8.8e77e8ab.js deleted file mode 100644 index ea0e83023964..000000000000 --- a/assets/js/6f1a81b8.8e77e8ab.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[7288],{47940:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var i=n(74165),a=n(15861),o=n(67294),s=n(87152),r=n(17145),l=n(67425);function c(e,t,n){return d.apply(this,arguments)}function d(){return(d=(0,a.Z)((0,i.Z)().mark((function e(t,n,a){var o,l,c,d,h;return(0,i.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:o=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return o="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return o="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return o="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return o="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==o){e.next=18;break}return e.abrupt("return");case 18:return c=new s.U(o),e.next=21,r.G.create({provider:c});case 21:d=e.sent,(h=n.split(".")).forEach((function(e){e in d&&(d=d[e])})),e.t1=h[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=d.toString(),e.abrupt("break",35);case 29:return e.next=31,d();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+h[0]+") in "+n);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function h(e,t,n,i){switch(t){case"humanReadable":(0,l.HumanReadable)(e,n,i);break;case"precise":(0,l.Precise)(e,n,i);break;case"blocksToDays":(0,l.BlocksToDays)(e,i);break;case"percentage":(0,l.Percentage)(e,i);break;case"arrayLength":(0,l.ArrayLength)(e,i);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(e){var t=e.network,n=e.path,s=e.defaultValue,r=e.filter,l=void 0===r?void 0:r,d=(0,o.useState)(""),u=d[0],p=d[1];return t=t.toLowerCase(),(0,o.useEffect)((function(){void 0!==l?h(s.toString(),l,t,p):p(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var o=function(){var e=(0,a.Z)((0,i.Z)().mark((function e(){var a;return(0,i.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c(t,n,p);case 2:if(void 0!==(a=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?h(a,l,t,p):p(a);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{o()}catch(r){console.log(r)}}}),[]),u}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,n,i){var a=void 0;if("polkadot"===n||"statemint"===n)a=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");a=6}e=parseFloat(e),i((e=Number.isInteger(e/t[n].precision)?e/t[n].precision+" "+t[n].symbol:(e/t[n].precision).toFixed(a)+" "+t[n].symbol).toString())},Precise:function(e,n,i){i(e=(e=parseFloat(e))/t[n].precision+" "+t[n].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},15418:(e,t,n)=>{"use strict";n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>c,default:()=>k,frontMatter:()=>l,metadata:()=>d,toc:()=>u});var i=n(87462),a=n(63366),o=(n(67294),n(3905)),s=n(47940),r=["components"],l={id:"maintain-guides-how-to-chill",title:"How to Chill",sidebar_label:"How to Chill",description:"Steps on chilling as a network participant.",keywords:["chill","chilling","pause"],slug:"../maintain-guides-how-to-chill"},c=void 0,d={unversionedId:"maintain/maintain-guides-how-to-chill",id:"maintain/maintain-guides-how-to-chill",title:"How to Chill",description:"Steps on chilling as a network participant.",source:"@site/../docs/maintain/maintain-guides-how-to-chill.md",sourceDirName:"maintain",slug:"/maintain-guides-how-to-chill",permalink:"/docs/maintain-guides-how-to-chill",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/maintain-guides-how-to-chill.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1689335021,formattedLastUpdatedAt:"Jul 14, 2023",frontMatter:{id:"maintain-guides-how-to-chill",title:"How to Chill",sidebar_label:"How to Chill",description:"Steps on chilling as a network participant.",keywords:["chill","chilling","pause"],slug:"../maintain-guides-how-to-chill"},sidebar:"docs",previous:{title:"Monitor your node",permalink:"/docs/maintain-guides-how-to-monitor-your-node"},next:{title:"How to Stop Validating",permalink:"/docs/maintain-guides-how-to-stop-validating"}},h={},u=[{value:"Consideration for Staking Election",id:"consideration-for-staking-election",level:2},{value:"Chilling as a Nominator",id:"chilling-as-a-nominator",level:2},{value:"Chilling as a Validator",id:"chilling-as-a-validator",level:2},{value:"Involuntary Chills",id:"involuntary-chills",level:2},{value:"Chill Other",id:"chill-other",level:2}],p={toc:u},m="wrapper";function k(e){var t=e.components,l=(0,a.Z)(e,r);return(0,o.kt)(m,(0,i.Z)({},p,l,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,'Staking bonds can be in any of the three states: validating, nominating, or chilled (neither\nvalidating nor nominating). When a staker wants to temporarily pause their active engagement in\nstaking but does not want to unbond their funds, they can choose to "chill" their involvement and\nkeep their funds bonded.'),(0,o.kt)("p",null,'An account can step back from participating in active staking by clicking "Stop" under the Network >\nStaking > Account actions page in ',(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps"},"PolkadotJS Apps")," or by calling the\n",(0,o.kt)("inlineCode",{parentName:"p"},"chill")," extrinsic in the\n",(0,o.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_staking/pallet/enum.Call.html#variant.chill"},"staking pallet"),".\nWhen an account chooses to chill, it becomes inactive in the next era. The call must be signed by\nthe ",(0,o.kt)("em",{parentName:"p"},"staking proxy")," account, not the ",(0,o.kt)("em",{parentName:"p"},"stash"),"."),(0,o.kt)("admonition",{title:"Primer on stash and staking proxy accounts",type:"note"},(0,o.kt)("p",{parentName:"admonition"},"If you need a refresher on the different responsibilities of the stash and staking proxy account\nwhen staking, take a look at the ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-staking#accounts"},"accounts")," section in the\ngeneral staking guide.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"staking",src:n(10233).Z,width:"1920",height:"800"})),(0,o.kt)("h2",{id:"consideration-for-staking-election"},"Consideration for Staking Election"),(0,o.kt)("p",null,"A bond that is actively participating in staking but chilled would continue to participate in\nstaking for the rest of the current era. If the bond was chilled in sessions 1 through 4 and\ncontinues to be chilled for the rest of the era, it would NOT be selected for election in the next\nera. If a bond was chilled for the entire session 5, it would not be considered in the next\nelection. If the bond was chilled in session 6, its participation in the next era's election would\ndepend on its state in session 5."),(0,o.kt)("h2",{id:"chilling-as-a-nominator"},"Chilling as a Nominator"),(0,o.kt)("p",null,"When you chill after being a nominator, your nominations will be reset. This means that when you\ndecide to start nominating again you will need to select validators to nominate once again. These\ncan be the same validators if you prefer, or, a completely new set. Just be aware - your nominations\nwill not persist across chills."),(0,o.kt)("p",null,"Your nominator will remain bonded when it is chilled. When you are ready to nominate again, you will\nnot need to go through the whole process of bonding again, rather, you will issue a new nominate\ncall that specifies the new validators to nominate."),(0,o.kt)("h2",{id:"chilling-as-a-validator"},"Chilling as a Validator"),(0,o.kt)("p",null,"When you voluntarily chill after being a validator, your nominators will remain. As long as your\nnominators make no action, you will still have the nominations when you choose to become an active\nvalidator once again. You bond however would not be listed as a nominable validator thus any\nnominators issuing new or revisions to existing nominations would not be able to select your bond."),(0,o.kt)("p",null,"When you become an active validator, you will also need to reset your validator preferences\n(commission, etc.). These can be configured as the same values set previously or something\ndifferent."),(0,o.kt)("h2",{id:"involuntary-chills"},"Involuntary Chills"),(0,o.kt)("p",null,"If a validator was unresponsive for an entire session, the validator bond would be chilled in a\nprocess known as ",(0,o.kt)("em",{parentName:"p"},"involuntary chilling.")," When a validator has been involuntarily chilled, it may\nrestrict the validator from being selected in the next election depending on the session in which it\nwas chilled (see considerations above). A chilled validator may re-declare the intent to validate at\nany time. However, it is recommended that the validator attempts to determine the source of the\nchill before doing so."),(0,o.kt)("p",null,"Slashing may also result in an involuntary chill. However, in that scenario, the validator would\nalso lose their nominations. By this action, even if the validator re-declares its intent to\nvalidate before session 5, there wouldn't be sufficient nominations to re-elect the node into the\nactive set."),(0,o.kt)("p",null,'Nominators have the option to renominate a slashed validator using a display row in Polkadot-JS UI.\nThis row is displayed in the "Account Actions" tab for the nominator under a heading that says\n"Renomination required".'),(0,o.kt)("h2",{id:"chill-other"},"Chill Other"),(0,o.kt)("p",null,"An unbounded and unlimited number of nominators and validators in Polkadot's NPoS is not possible\ndue to constraints in the runtime. As a result, multiple checks are incorporated to keep the size of\nstaking system manageable, like mandating minimum active bond requirements for both nominators and\nvalidators. When these requirements are modified through on-chain governance, they can be enforced\nonly on the accounts that newly call ",(0,o.kt)("inlineCode",{parentName:"p"},"nominate")," or ",(0,o.kt)("inlineCode",{parentName:"p"},"validate")," after the update. The changes to the\nbonding parameters would not automatically chill the active accounts on-chain which do not meet the\nrequirements."),(0,o.kt)("admonition",{title:"Chill Threshold",type:"note"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"ChillThreshold")," defines how close to the max nominators or validators we must reach before users\ncan start chilling one-another. This value is currently set to\n",(0,o.kt)(s.Z,{network:"polkadot",path:"query.staking.chillThreshold",defaultValue:90,mdxType:"RPC"}),"%\n","")),(0,o.kt)("p",null,"For instance, let us consider a scenario where the minimum staking requirement for nominators is\nchanged from 80 DOTs to 120 DOTs. An account that was actively nominating with 80 DOTs before this\nupdate would still keep receiving staking rewards. To handle this corner case, the ",(0,o.kt)("inlineCode",{parentName:"p"},"chillOther"),"\nextrinsic was incorporated which also helps to keep things backwards compatible and safe. The\n",(0,o.kt)("inlineCode",{parentName:"p"},"chillOther")," extrinsic is permissionless and any third party user can target it on an account where\nthe minimum active bond is not satisfied, and chill that account. The list of addresses of all the\nactive validators and their nominators can be viewed by running\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/w3f/validator-stats"},"validator stats")," script."),(0,o.kt)("admonition",{title:"Chill Other on Polkadot Network",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Through ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/referendum/90"},"Referendum 90"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"maxNominatorCount")," on\nPolkadot is set to ",(0,o.kt)("inlineCode",{parentName:"p"},"None")," eliminating the upper bound on the number of nominators on the network.\nDue to this, the ",(0,o.kt)("inlineCode",{parentName:"p"},"chillOther")," extrinsic on Polkadot network has no effect as the chill threshold\nwill never be met.")))}k.isMDXComponent=!0},10233:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});const i=n.p+"assets/images/staking-keys-stash-proxy-503c2b8b6c40b269a16576dd7fe805b8.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/6f1a81b8.f6b6ee22.js b/assets/js/6f1a81b8.f6b6ee22.js new file mode 100644 index 000000000000..cd2d076ed1d4 --- /dev/null +++ b/assets/js/6f1a81b8.f6b6ee22.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[7288],{47940:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var i=n(74165),a=n(15861),o=n(67294),r=n(87152),s=n(17145),l=n(67425);function c(e,t,n){return d.apply(this,arguments)}function d(){return(d=(0,a.Z)((0,i.Z)().mark((function e(t,n,a){var o,l,c,d,h;return(0,i.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:o=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return o="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return o="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return o="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return o="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==o){e.next=18;break}return e.abrupt("return");case 18:return c=new r.U(o),e.next=21,s.G.create({provider:c});case 21:d=e.sent,(h=n.split(".")).forEach((function(e){e in d&&(d=d[e])})),e.t1=h[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=d.toString(),e.abrupt("break",35);case 29:return e.next=31,d();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+h[0]+") in "+n);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function h(e,t,n,i){switch(t){case"humanReadable":(0,l.HumanReadable)(e,n,i);break;case"precise":(0,l.Precise)(e,n,i);break;case"blocksToDays":(0,l.BlocksToDays)(e,i);break;case"percentage":(0,l.Percentage)(e,i);break;case"permillToPercent":(0,l.PermillToPercent)(e,i);break;case"arrayLength":(0,l.ArrayLength)(e,i);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(e){var t=e.network,n=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,d=(0,o.useState)(""),u=d[0],p=d[1];return t=t.toLowerCase(),(0,o.useEffect)((function(){void 0!==l?h(r.toString(),l,t,p):p(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var o=function(){var e=(0,a.Z)((0,i.Z)().mark((function e(){var a;return(0,i.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c(t,n,p);case 2:if(void 0!==(a=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?h(a,l,t,p):p(a);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{o()}catch(s){console.log(s)}}}),[]),u}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,n,i){var a=void 0;if("polkadot"===n||"statemint"===n)a=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");a=6}e=parseFloat(e),i((e=Number.isInteger(e/t[n].precision)?e/t[n].precision+" "+t[n].symbol:(e/t[n].precision).toFixed(a)+" "+t[n].symbol).toString())},Precise:function(e,n,i){i(e=(e=parseFloat(e))/t[n].precision+" "+t[n].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},15418:(e,t,n)=>{"use strict";n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>c,default:()=>k,frontMatter:()=>l,metadata:()=>d,toc:()=>u});var i=n(87462),a=n(63366),o=(n(67294),n(3905)),r=n(47940),s=["components"],l={id:"maintain-guides-how-to-chill",title:"How to Chill",sidebar_label:"How to Chill",description:"Steps on chilling as a network participant.",keywords:["chill","chilling","pause"],slug:"../maintain-guides-how-to-chill"},c=void 0,d={unversionedId:"maintain/maintain-guides-how-to-chill",id:"maintain/maintain-guides-how-to-chill",title:"How to Chill",description:"Steps on chilling as a network participant.",source:"@site/../docs/maintain/maintain-guides-how-to-chill.md",sourceDirName:"maintain",slug:"/maintain-guides-how-to-chill",permalink:"/docs/maintain-guides-how-to-chill",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/maintain-guides-how-to-chill.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1689335021,formattedLastUpdatedAt:"Jul 14, 2023",frontMatter:{id:"maintain-guides-how-to-chill",title:"How to Chill",sidebar_label:"How to Chill",description:"Steps on chilling as a network participant.",keywords:["chill","chilling","pause"],slug:"../maintain-guides-how-to-chill"},sidebar:"docs",previous:{title:"Monitor your node",permalink:"/docs/maintain-guides-how-to-monitor-your-node"},next:{title:"How to Stop Validating",permalink:"/docs/maintain-guides-how-to-stop-validating"}},h={},u=[{value:"Consideration for Staking Election",id:"consideration-for-staking-election",level:2},{value:"Chilling as a Nominator",id:"chilling-as-a-nominator",level:2},{value:"Chilling as a Validator",id:"chilling-as-a-validator",level:2},{value:"Involuntary Chills",id:"involuntary-chills",level:2},{value:"Chill Other",id:"chill-other",level:2}],p={toc:u},m="wrapper";function k(e){var t=e.components,l=(0,a.Z)(e,s);return(0,o.kt)(m,(0,i.Z)({},p,l,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,'Staking bonds can be in any of the three states: validating, nominating, or chilled (neither\nvalidating nor nominating). When a staker wants to temporarily pause their active engagement in\nstaking but does not want to unbond their funds, they can choose to "chill" their involvement and\nkeep their funds bonded.'),(0,o.kt)("p",null,'An account can step back from participating in active staking by clicking "Stop" under the Network >\nStaking > Account actions page in ',(0,o.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps"},"PolkadotJS Apps")," or by calling the\n",(0,o.kt)("inlineCode",{parentName:"p"},"chill")," extrinsic in the\n",(0,o.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_staking/pallet/enum.Call.html#variant.chill"},"staking pallet"),".\nWhen an account chooses to chill, it becomes inactive in the next era. The call must be signed by\nthe ",(0,o.kt)("em",{parentName:"p"},"staking proxy")," account, not the ",(0,o.kt)("em",{parentName:"p"},"stash"),"."),(0,o.kt)("admonition",{title:"Primer on stash and staking proxy accounts",type:"note"},(0,o.kt)("p",{parentName:"admonition"},"If you need a refresher on the different responsibilities of the stash and staking proxy account\nwhen staking, take a look at the ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-staking#accounts"},"accounts")," section in the\ngeneral staking guide.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"staking",src:n(10233).Z,width:"1920",height:"800"})),(0,o.kt)("h2",{id:"consideration-for-staking-election"},"Consideration for Staking Election"),(0,o.kt)("p",null,"A bond that is actively participating in staking but chilled would continue to participate in\nstaking for the rest of the current era. If the bond was chilled in sessions 1 through 4 and\ncontinues to be chilled for the rest of the era, it would NOT be selected for election in the next\nera. If a bond was chilled for the entire session 5, it would not be considered in the next\nelection. If the bond was chilled in session 6, its participation in the next era's election would\ndepend on its state in session 5."),(0,o.kt)("h2",{id:"chilling-as-a-nominator"},"Chilling as a Nominator"),(0,o.kt)("p",null,"When you chill after being a nominator, your nominations will be reset. This means that when you\ndecide to start nominating again you will need to select validators to nominate once again. These\ncan be the same validators if you prefer, or, a completely new set. Just be aware - your nominations\nwill not persist across chills."),(0,o.kt)("p",null,"Your nominator will remain bonded when it is chilled. When you are ready to nominate again, you will\nnot need to go through the whole process of bonding again, rather, you will issue a new nominate\ncall that specifies the new validators to nominate."),(0,o.kt)("h2",{id:"chilling-as-a-validator"},"Chilling as a Validator"),(0,o.kt)("p",null,"When you voluntarily chill after being a validator, your nominators will remain. As long as your\nnominators make no action, you will still have the nominations when you choose to become an active\nvalidator once again. You bond however would not be listed as a nominable validator thus any\nnominators issuing new or revisions to existing nominations would not be able to select your bond."),(0,o.kt)("p",null,"When you become an active validator, you will also need to reset your validator preferences\n(commission, etc.). These can be configured as the same values set previously or something\ndifferent."),(0,o.kt)("h2",{id:"involuntary-chills"},"Involuntary Chills"),(0,o.kt)("p",null,"If a validator was unresponsive for an entire session, the validator bond would be chilled in a\nprocess known as ",(0,o.kt)("em",{parentName:"p"},"involuntary chilling.")," When a validator has been involuntarily chilled, it may\nrestrict the validator from being selected in the next election depending on the session in which it\nwas chilled (see considerations above). A chilled validator may re-declare the intent to validate at\nany time. However, it is recommended that the validator attempts to determine the source of the\nchill before doing so."),(0,o.kt)("p",null,"Slashing may also result in an involuntary chill. However, in that scenario, the validator would\nalso lose their nominations. By this action, even if the validator re-declares its intent to\nvalidate before session 5, there wouldn't be sufficient nominations to re-elect the node into the\nactive set."),(0,o.kt)("p",null,'Nominators have the option to renominate a slashed validator using a display row in Polkadot-JS UI.\nThis row is displayed in the "Account Actions" tab for the nominator under a heading that says\n"Renomination required".'),(0,o.kt)("h2",{id:"chill-other"},"Chill Other"),(0,o.kt)("p",null,"An unbounded and unlimited number of nominators and validators in Polkadot's NPoS is not possible\ndue to constraints in the runtime. As a result, multiple checks are incorporated to keep the size of\nstaking system manageable, like mandating minimum active bond requirements for both nominators and\nvalidators. When these requirements are modified through on-chain governance, they can be enforced\nonly on the accounts that newly call ",(0,o.kt)("inlineCode",{parentName:"p"},"nominate")," or ",(0,o.kt)("inlineCode",{parentName:"p"},"validate")," after the update. The changes to the\nbonding parameters would not automatically chill the active accounts on-chain which do not meet the\nrequirements."),(0,o.kt)("admonition",{title:"Chill Threshold",type:"note"},(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("inlineCode",{parentName:"p"},"ChillThreshold")," defines how close to the max nominators or validators we must reach before users\ncan start chilling one-another. This value is currently set to\n",(0,o.kt)(r.Z,{network:"polkadot",path:"query.staking.chillThreshold",defaultValue:90,mdxType:"RPC"}),"%\n","")),(0,o.kt)("p",null,"For instance, let us consider a scenario where the minimum staking requirement for nominators is\nchanged from 80 DOTs to 120 DOTs. An account that was actively nominating with 80 DOTs before this\nupdate would still keep receiving staking rewards. To handle this corner case, the ",(0,o.kt)("inlineCode",{parentName:"p"},"chillOther"),"\nextrinsic was incorporated which also helps to keep things backwards compatible and safe. The\n",(0,o.kt)("inlineCode",{parentName:"p"},"chillOther")," extrinsic is permissionless and any third party user can target it on an account where\nthe minimum active bond is not satisfied, and chill that account. The list of addresses of all the\nactive validators and their nominators can be viewed by running\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/w3f/validator-stats"},"validator stats")," script."),(0,o.kt)("admonition",{title:"Chill Other on Polkadot Network",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Through ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/referendum/90"},"Referendum 90"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"maxNominatorCount")," on\nPolkadot is set to ",(0,o.kt)("inlineCode",{parentName:"p"},"None")," eliminating the upper bound on the number of nominators on the network.\nDue to this, the ",(0,o.kt)("inlineCode",{parentName:"p"},"chillOther")," extrinsic on Polkadot network has no effect as the chill threshold\nwill never be met.")))}k.isMDXComponent=!0},10233:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});const i=n.p+"assets/images/staking-keys-stash-proxy-503c2b8b6c40b269a16576dd7fe805b8.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/77a2b809.a3a1a375.js b/assets/js/77a2b809.a3a1a375.js new file mode 100644 index 000000000000..808b3c5ae56b --- /dev/null +++ b/assets/js/77a2b809.a3a1a375.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[8080],{47940:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var a=n(74165),o=n(15861),r=n(67294),s=n(87152),i=n(17145),l=n(67425);function c(e,t,n){return p.apply(this,arguments)}function p(){return(p=(0,o.Z)((0,a.Z)().mark((function e(t,n,o){var r,l,c,p,u;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){e.next=18;break}return e.abrupt("return");case 18:return c=new s.U(r),e.next=21,i.G.create({provider:c});case 21:p=e.sent,(u=n.split(".")).forEach((function(e){e in p&&(p=p[e])})),e.t1=u[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=p.toString(),e.abrupt("break",35);case 29:return e.next=31,p();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+n);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function u(e,t,n,a){switch(t){case"humanReadable":(0,l.HumanReadable)(e,n,a);break;case"precise":(0,l.Precise)(e,n,a);break;case"blocksToDays":(0,l.BlocksToDays)(e,a);break;case"percentage":(0,l.Percentage)(e,a);break;case"permillToPercent":(0,l.PermillToPercent)(e,a);break;case"arrayLength":(0,l.ArrayLength)(e,a);break;default:return void console.log("Ignoring unknown filter type")}}const d=function(e){var t=e.network,n=e.path,s=e.defaultValue,i=e.filter,l=void 0===i?void 0:i,p=(0,r.useState)(""),d=p[0],h=p[1];return t=t.toLowerCase(),(0,r.useEffect)((function(){void 0!==l?u(s.toString(),l,t,h):h(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var e=(0,o.Z)((0,a.Z)().mark((function e(){var o;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c(t,n,h);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?u(o,l,t,h):h(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{r()}catch(i){console.log(i)}}}),[]),d}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,n,a){var o=void 0;if("polkadot"===n||"statemint"===n)o=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),a((e=Number.isInteger(e/t[n].precision)?e/t[n].precision+" "+t[n].symbol:(e/t[n].precision).toFixed(o)+" "+t[n].symbol).toString())},Precise:function(e,n,a){a(e=(e=parseFloat(e))/t[n].precision+" "+t[n].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},83583:(e,t,n)=>{"use strict";n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>f,frontMatter:()=>l,metadata:()=>p,toc:()=>d});var a=n(87462),o=n(63366),r=(n(67294),n(3905)),s=n(47940),i=["components"],l={id:"learn-balance-transfers",title:"Balance Transfers",sidebar_label:"Balances Transfers",keywords:["balance","transfers","transaction","signing"],description:"Perform Balance Transfers between Accounts.",slug:"../learn-balance-transfers"},c=void 0,p={unversionedId:"learn/learn-balance-transfers",id:"learn/learn-balance-transfers",title:"Balance Transfers",description:"Perform Balance Transfers between Accounts.",source:"@site/../docs/learn/learn-balance-transfers.md",sourceDirName:"learn",slug:"/learn-balance-transfers",permalink:"/docs/learn-balance-transfers",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-balance-transfers.md",tags:[],version:"current",lastUpdatedBy:"Radha",lastUpdatedAt:1695304296,formattedLastUpdatedAt:"Sep 21, 2023",frontMatter:{id:"learn-balance-transfers",title:"Balance Transfers",sidebar_label:"Balances Transfers",keywords:["balance","transfers","transaction","signing"],description:"Perform Balance Transfers between Accounts.",slug:"../learn-balance-transfers"},sidebar:"docs",previous:{title:"Extrinsics",permalink:"/docs/learn-extrinsics"},next:{title:"Transaction Fees",permalink:"/docs/learn-transaction-fees"}},u={},d=[{value:"Sending Funds using UI, Extension, Parity Signer & Ledger",id:"sending-funds-using-ui-extension-parity-signer--ledger",level:2},{value:"Keep-Alive Checks",id:"keep-alive-checks",level:2},{value:"Vested Transfers",id:"vested-transfers",level:2},{value:"Lazy Vesting",id:"lazy-vesting",level:3},{value:"Batch Transfers",id:"batch-transfers",level:2},{value:"Existing Reference Error",id:"existing-reference-error",level:2},{value:"Bonded Tokens",id:"bonded-tokens",level:3},{value:"Checking for Locks",id:"checking-for-locks",level:3},{value:"Purging Session Keys",id:"purging-session-keys",level:3},{value:"Existing Recovery Info",id:"existing-recovery-info",level:3},{value:"Existing Non-Native Assets",id:"existing-non-native-assets",level:3}],h={toc:d},k="wrapper";function f(e){var t=e.components,l=(0,o.Z)(e,i);return(0,r.kt)(k,(0,a.Z)({},h,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Balance transfers are used to send a balance from one account to another account. To start\ntransferring a balance, we will begin by using\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"Polkadot-JS UI"),". This guide assumes that you've already\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-generation"},"created an account")," and have some funds that are ready to be\ntransferred."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"We support only the use of the ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},(0,r.kt)("strong",{parentName:"a"},"Polkadot-JS UI")),"\ntogether with the ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/extension/"},(0,r.kt)("strong",{parentName:"a"},"browser extension")),",\n",(0,r.kt)("a",{parentName:"p",href:"https://www.ledger.com/ledger-live"},(0,r.kt)("strong",{parentName:"a"},"Ledger"))," and\n",(0,r.kt)("a",{parentName:"p",href:"https://www.parity.io/technologies/signer/"},(0,r.kt)("strong",{parentName:"a"},"Parity Signer"))," for signing transactions. We do not\nprovide support for third party applications.")),(0,r.kt)("h2",{id:"sending-funds-using-ui-extension-parity-signer--ledger"},"Sending Funds using UI, Extension, Parity Signer & Ledger"),(0,r.kt)("p",null,"See the video tutorial below to learn how to send funds using the supported tools. See the Polkadot\nSupport pages for detailed information about transferring funds using the\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000170304-how-to-send-transfer-funds-out-of-your-dot-account-on-the-polkadot-js-ui"},"Polkadot-JS UI"),"."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=gbvrHzr4EDY"},(0,r.kt)("img",{parentName:"a",src:"https://img.youtube.com/vi/gbvrHzr4EDY/0.jpg",alt:"Balance Transfer Tutorial"}))),(0,r.kt)("admonition",{title:"Signing Transactions",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See the Polkadot Support pages for detailed information about signing transactions using:"),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000181993-how-to-sign-a-transaction-directly-on-polkadot-js-ui"},"The Polkadot-JS UI")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000181989"},"The Polkadot-JS browser extension")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000181994-how-to-sign-a-transaction-on-ledger"},"Ledger devices")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000182000-how-to-sign-a-transaction-in-parity-signer"},"The Parity Signer app"),"."))),(0,r.kt)("h2",{id:"keep-alive-checks"},"Keep-Alive Checks"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"https://youtu.be/Wg0pH05CC9Y"},(0,r.kt)("strong",{parentName:"a"},"this video tutorial"))," and\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000168651-what-is-the-existential-deposit-"},(0,r.kt)("strong",{parentName:"a"},"this support page")),"\nto learn about keep-alive checks and existential deposit.")),(0,r.kt)("p",null,"In Polkadot there are two main ways to\ntransfer funds from one account to another:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"transfer keep-alive")," (default option) will not allow you to send an amount that would allow the\nsending account to be removed due to it going below the\n",(0,r.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000168651-what-is-the-existential-deposit-"},"existential deposit"),"\nof\n",(0,r.kt)(s.Z,{network:"polkadot",path:"consts.balances.existentialDeposit",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),".\n",""),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"transfer")," will allow you to send DOT\nregardless of the consequence. If the balance drops below the existential deposit your account\nwill be reaped. It may be that you do not want to keep the account alive (for example, because you\nare moving all of your funds to a different address). To switch the keep-alive check off visit\n",(0,r.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000169248"},"this support article"),".")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Attempting to send less than the existential deposit to an account with\n0 DOT will always fail, no matter if the\nkeep-alive check is on or not.")),(0,r.kt)("p",null,"For instance, attempting to transfer\n0.1 DOT to an account you just generated\n(and thus has no balance) will fail, since\n0.1 DOT is less than the existential\ndeposit of\n",(0,r.kt)(s.Z,{network:"polkadot",path:"consts.balances.existentialDeposit",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),"\n","\nand the account cannot be initialized with such a low balance."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"Even 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.")),(0,r.kt)("h2",{id:"vested-transfers"},"Vested Transfers"),(0,r.kt)("p",null,"DOT may have a lock placed on them to account for\nvesting funds. Like other types of locks, these funds cannot be transferred but can be used in other\nparts of the protocol such as voting in governance or being staked as a validator or nominator."),(0,r.kt)("p",null,"Vesting funds are on a release schedule and unlock a constant number of tokens at each block\n(",(0,r.kt)("strong",{parentName:"p"},"linear vesting"),") or can unlock the full amount after a specific block number (",(0,r.kt)("strong",{parentName:"p"},"cliff\nvesting"),"). Although the tokens are released in this manner, it does not get reflected on-chain\nautomatically since locks are ",(0,r.kt)("a",{parentName:"p",href:"#lazy-vesting"},"lazy")," and require an extrinsic to update."),(0,r.kt)("p",null,"There are two ways that vesting schedules can be created."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"One way is through an extrinsic type available in the Vesting pallet, ",(0,r.kt)("inlineCode",{parentName:"li"},"vested_transfer"),". The\nvested transfer function allows anyone to create a vesting schedule with a transfer of funds, as\nlong as the account for which the vesting schedule will be created does not already have one and\nthe transfer moves at least ",(0,r.kt)("inlineCode",{parentName:"li"},"MinVestedTransfer")," funds, which is specified as a chain constant."),(0,r.kt)("li",{parentName:"ul"},"A second way is as part of the genesis configuration of the chain. In the case of\nPolkadot, the chain specification genesis\nscript reads the state of the Claims contract that exists on the Ethereum blockchain and creates\nvesting schedules in genesis for all the allocations registered as being vested.")),(0,r.kt)("p",null,"Vesting schedules have three parameters:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"locked"),", the amount of tokens to be transferred in\n",(0,r.kt)("a",{parentName:"li",href:"../learn/learn-DOT#the-planck-unit"},"Planck units"),")"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"per block"),", the number of tokens that are released per block"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"starting block"),", the block number after which the vesting schedule starts")),(0,r.kt)("p",null,"The 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."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"You can watch ",(0,r.kt)("a",{parentName:"p",href:"https://youtu.be/JVlwTQBwNGc"},(0,r.kt)("strong",{parentName:"a"},"this video tutorial"))," to understand how to do vested\ntransfers, including linear and cliff vesting. Note the tutorial uses the Westend Testnet, but the\nsame applies to both Polkadot and Kusama.")),(0,r.kt)("h3",{id:"lazy-vesting"},"Lazy Vesting"),(0,r.kt)("p",null,"Like ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced"},"simple payouts"),", vesting is ",(0,r.kt)("em",{parentName:"p"},"lazy"),", which means that someone must\nexplicitly call an extrinsic to update the lock that is placed on an account."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("inlineCode",{parentName:"li"},"vest")," extrinsic will update the lock that is placed on the caller."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("inlineCode",{parentName:"li"},"vest_other"),' will update the lock that is placed on another "target" account\'s funds.')),(0,r.kt)("p",null,"These extrinsics are exposed from the Vesting pallet."),(0,r.kt)("p",null,"If you are using the Polkadot-JS UI, when there are\nDOT available to vest for an account, then you\nwill have the ability to unlock DOT which has\nalready vested from the ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/accounts"},"Accounts")," page."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"unbond",src:n(27152).Z,width:"241",height:"301"})),(0,r.kt)("h2",{id:"batch-transfers"},"Batch Transfers"),(0,r.kt)("p",null,"Batch transfers are balances transfers to multiple accounts executed by one account. In order to\nconstruct a batch transfer you need to:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Create a ",(0,r.kt)("inlineCode",{parentName:"li"},"utility.batch(calls)")," extrinsic using the\n",(0,r.kt)("a",{parentName:"li",href:"https://paritytech.github.io/substrate/master/pallet_utility/index.html"},"utility pallet"),", and"),(0,r.kt)("li",{parentName:"ul"},"Within the batch call you can create multiple ",(0,r.kt)("inlineCode",{parentName:"li"},"balances.transferKeepAlive")," extrinsics using the\n",(0,r.kt)("a",{parentName:"li",href:"https://paritytech.github.io/substrate/master/pallet_balances/index.html"},"balances pallet"),". You\ncan specify as many receivers as you desire.")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"You can watch ",(0,r.kt)("a",{parentName:"p",href:"https://youtu.be/uoUC2K8muvw"},(0,r.kt)("strong",{parentName:"a"},"this video tutorial"))," to learn how to do batch\ntransfers. Note the tutorial uses the Westend Testnet, but the same applies to both Polkadot and\nKusama.")),(0,r.kt)("h2",{id:"existing-reference-error"},"Existing Reference Error"),(0,r.kt)("p",null,"If you are trying to reap an account and you receive an error similar to\n",(0,r.kt)("inlineCode",{parentName:"p"},'"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:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Bonded tokens (most likely)"),(0,r.kt)("li",{parentName:"ul"},"Unpurged session keys (if you were previously a validator)"),(0,r.kt)("li",{parentName:"ul"},"Token locks"),(0,r.kt)("li",{parentName:"ul"},"Existing recovery info"),(0,r.kt)("li",{parentName:"ul"},"Existing assets")),(0,r.kt)("h3",{id:"bonded-tokens"},"Bonded Tokens"),(0,r.kt)("p",null,"If you have tokens that are bonded, you will need to unbond them before you can reap your account.\nFollow the instructions at\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-nominate-polkadot"},"Unbonding and Rebonding")," to check if you\nhave bonded tokens, stop nominating (if necessary) and unbond your tokens."),(0,r.kt)("h3",{id:"checking-for-locks"},"Checking for Locks"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"https://youtu.be/LHgY7ds_bZ0"},"this video tutorial")," and\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000169437-why-can-t-i-transfer-tokens-"},"this support page"),"\nto learn how to check for locks and remove them.")),(0,r.kt)("p",null,"You can also check for locks by querying ",(0,r.kt)("inlineCode",{parentName:"p"},"system.account(AccountId)")," in\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate"},(0,r.kt)("inlineCode",{parentName:"a"},"Chain state")," tab under the ",(0,r.kt)("inlineCode",{parentName:"a"},"Developer")," drop-down menu in the Polkadot-JS UI"),'.\nSelect your account, then click the "+" button next to the dropdowns, and check the relative ',(0,r.kt)("inlineCode",{parentName:"p"},"data"),"\nJSON object. If you see a non-zero value for anything other than ",(0,r.kt)("inlineCode",{parentName:"p"},"free"),", you have locks on your\naccount that need to get resolved."),(0,r.kt)("h3",{id:"purging-session-keys"},"Purging Session Keys"),(0,r.kt)("p",null,"If 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",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-stop-validating"},"How to Stop Validating")," page. This can also\nbe checked by checking ",(0,r.kt)("inlineCode",{parentName:"p"},"session.nextKeys")," in the chain state for an existing key."),(0,r.kt)("h3",{id:"existing-recovery-info"},"Existing Recovery Info"),(0,r.kt)("p",null,"Currently, Polkadot does not use the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/master/frame/recovery/"},"Recovery Pallet"),", so this is\nprobably not the reason for your tokens having existing references."),(0,r.kt)("p",null,"","","",""),(0,r.kt)("h3",{id:"existing-non-native-assets"},"Existing Non-Native Assets"),(0,r.kt)("p",null,"Currently, Polkadot does not use the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/tree/master/frame/assets"},"Assets Pallet"),", so this is\nprobably not the reason for your tokens having existing references."))}f.isMDXComponent=!0},27152:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/unlock-vesting-deefc0d6d9a08a91af1490a82e01069b.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/77a2b809.f937e17f.js b/assets/js/77a2b809.f937e17f.js deleted file mode 100644 index 64ab8ae54003..000000000000 --- a/assets/js/77a2b809.f937e17f.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[8080],{47940:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var a=n(74165),o=n(15861),r=n(67294),s=n(87152),i=n(17145),l=n(67425);function p(e,t,n){return c.apply(this,arguments)}function c(){return(c=(0,o.Z)((0,a.Z)().mark((function e(t,n,o){var r,l,p,c,u;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){e.next=18;break}return e.abrupt("return");case 18:return p=new s.U(r),e.next=21,i.G.create({provider:p});case 21:c=e.sent,(u=n.split(".")).forEach((function(e){e in c&&(c=c[e])})),e.t1=u[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=c.toString(),e.abrupt("break",35);case 29:return e.next=31,c();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+n);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function u(e,t,n,a){switch(t){case"humanReadable":(0,l.HumanReadable)(e,n,a);break;case"precise":(0,l.Precise)(e,n,a);break;case"blocksToDays":(0,l.BlocksToDays)(e,a);break;case"percentage":(0,l.Percentage)(e,a);break;case"arrayLength":(0,l.ArrayLength)(e,a);break;default:return void console.log("Ignoring unknown filter type")}}const d=function(e){var t=e.network,n=e.path,s=e.defaultValue,i=e.filter,l=void 0===i?void 0:i,c=(0,r.useState)(""),d=c[0],h=c[1];return t=t.toLowerCase(),(0,r.useEffect)((function(){void 0!==l?u(s.toString(),l,t,h):h(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var e=(0,o.Z)((0,a.Z)().mark((function e(){var o;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p(t,n,h);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?u(o,l,t,h):h(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{r()}catch(i){console.log(i)}}}),[]),d}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,n,a){var o=void 0;if("polkadot"===n||"statemint"===n)o=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),a((e=Number.isInteger(e/t[n].precision)?e/t[n].precision+" "+t[n].symbol:(e/t[n].precision).toFixed(o)+" "+t[n].symbol).toString())},Precise:function(e,n,a){a(e=(e=parseFloat(e))/t[n].precision+" "+t[n].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},83583:(e,t,n)=>{"use strict";n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>p,default:()=>f,frontMatter:()=>l,metadata:()=>c,toc:()=>d});var a=n(87462),o=n(63366),r=(n(67294),n(3905)),s=n(47940),i=["components"],l={id:"learn-balance-transfers",title:"Balance Transfers",sidebar_label:"Balances Transfers",keywords:["balance","transfers","transaction","signing"],description:"Perform Balance Transfers between Accounts.",slug:"../learn-balance-transfers"},p=void 0,c={unversionedId:"learn/learn-balance-transfers",id:"learn/learn-balance-transfers",title:"Balance Transfers",description:"Perform Balance Transfers between Accounts.",source:"@site/../docs/learn/learn-balance-transfers.md",sourceDirName:"learn",slug:"/learn-balance-transfers",permalink:"/docs/learn-balance-transfers",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-balance-transfers.md",tags:[],version:"current",lastUpdatedBy:"Radha",lastUpdatedAt:1695304296,formattedLastUpdatedAt:"Sep 21, 2023",frontMatter:{id:"learn-balance-transfers",title:"Balance Transfers",sidebar_label:"Balances Transfers",keywords:["balance","transfers","transaction","signing"],description:"Perform Balance Transfers between Accounts.",slug:"../learn-balance-transfers"},sidebar:"docs",previous:{title:"Extrinsics",permalink:"/docs/learn-extrinsics"},next:{title:"Transaction Fees",permalink:"/docs/learn-transaction-fees"}},u={},d=[{value:"Sending Funds using UI, Extension, Parity Signer & Ledger",id:"sending-funds-using-ui-extension-parity-signer--ledger",level:2},{value:"Keep-Alive Checks",id:"keep-alive-checks",level:2},{value:"Vested Transfers",id:"vested-transfers",level:2},{value:"Lazy Vesting",id:"lazy-vesting",level:3},{value:"Batch Transfers",id:"batch-transfers",level:2},{value:"Existing Reference Error",id:"existing-reference-error",level:2},{value:"Bonded Tokens",id:"bonded-tokens",level:3},{value:"Checking for Locks",id:"checking-for-locks",level:3},{value:"Purging Session Keys",id:"purging-session-keys",level:3},{value:"Existing Recovery Info",id:"existing-recovery-info",level:3},{value:"Existing Non-Native Assets",id:"existing-non-native-assets",level:3}],h={toc:d},k="wrapper";function f(e){var t=e.components,l=(0,o.Z)(e,i);return(0,r.kt)(k,(0,a.Z)({},h,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Balance transfers are used to send a balance from one account to another account. To start\ntransferring a balance, we will begin by using\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"Polkadot-JS UI"),". This guide assumes that you've already\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-generation"},"created an account")," and have some funds that are ready to be\ntransferred."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"We support only the use of the ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},(0,r.kt)("strong",{parentName:"a"},"Polkadot-JS UI")),"\ntogether with the ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/extension/"},(0,r.kt)("strong",{parentName:"a"},"browser extension")),",\n",(0,r.kt)("a",{parentName:"p",href:"https://www.ledger.com/ledger-live"},(0,r.kt)("strong",{parentName:"a"},"Ledger"))," and\n",(0,r.kt)("a",{parentName:"p",href:"https://www.parity.io/technologies/signer/"},(0,r.kt)("strong",{parentName:"a"},"Parity Signer"))," for signing transactions. We do not\nprovide support for third party applications.")),(0,r.kt)("h2",{id:"sending-funds-using-ui-extension-parity-signer--ledger"},"Sending Funds using UI, Extension, Parity Signer & Ledger"),(0,r.kt)("p",null,"See the video tutorial below to learn how to send funds using the supported tools. See the Polkadot\nSupport pages for detailed information about transferring funds using the\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000170304-how-to-send-transfer-funds-out-of-your-dot-account-on-the-polkadot-js-ui"},"Polkadot-JS UI"),"."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=gbvrHzr4EDY"},(0,r.kt)("img",{parentName:"a",src:"https://img.youtube.com/vi/gbvrHzr4EDY/0.jpg",alt:"Balance Transfer Tutorial"}))),(0,r.kt)("admonition",{title:"Signing Transactions",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See the Polkadot Support pages for detailed information about signing transactions using:"),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000181993-how-to-sign-a-transaction-directly-on-polkadot-js-ui"},"The Polkadot-JS UI")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000181989"},"The Polkadot-JS browser extension")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000181994-how-to-sign-a-transaction-on-ledger"},"Ledger devices")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000182000-how-to-sign-a-transaction-in-parity-signer"},"The Parity Signer app"),"."))),(0,r.kt)("h2",{id:"keep-alive-checks"},"Keep-Alive Checks"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"https://youtu.be/Wg0pH05CC9Y"},(0,r.kt)("strong",{parentName:"a"},"this video tutorial"))," and\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000168651-what-is-the-existential-deposit-"},(0,r.kt)("strong",{parentName:"a"},"this support page")),"\nto learn about keep-alive checks and existential deposit.")),(0,r.kt)("p",null,"In Polkadot there are two main ways to\ntransfer funds from one account to another:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"transfer keep-alive")," (default option) will not allow you to send an amount that would allow the\nsending account to be removed due to it going below the\n",(0,r.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000168651-what-is-the-existential-deposit-"},"existential deposit"),"\nof\n",(0,r.kt)(s.Z,{network:"polkadot",path:"consts.balances.existentialDeposit",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),".\n",""),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"transfer")," will allow you to send DOT\nregardless of the consequence. If the balance drops below the existential deposit your account\nwill be reaped. It may be that you do not want to keep the account alive (for example, because you\nare moving all of your funds to a different address). To switch the keep-alive check off visit\n",(0,r.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000169248"},"this support article"),".")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Attempting to send less than the existential deposit to an account with\n0 DOT will always fail, no matter if the\nkeep-alive check is on or not.")),(0,r.kt)("p",null,"For instance, attempting to transfer\n0.1 DOT to an account you just generated\n(and thus has no balance) will fail, since\n0.1 DOT is less than the existential\ndeposit of\n",(0,r.kt)(s.Z,{network:"polkadot",path:"consts.balances.existentialDeposit",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),"\n","\nand the account cannot be initialized with such a low balance."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"Even 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.")),(0,r.kt)("h2",{id:"vested-transfers"},"Vested Transfers"),(0,r.kt)("p",null,"DOT may have a lock placed on them to account for\nvesting funds. Like other types of locks, these funds cannot be transferred but can be used in other\nparts of the protocol such as voting in governance or being staked as a validator or nominator."),(0,r.kt)("p",null,"Vesting funds are on a release schedule and unlock a constant number of tokens at each block\n(",(0,r.kt)("strong",{parentName:"p"},"linear vesting"),") or can unlock the full amount after a specific block number (",(0,r.kt)("strong",{parentName:"p"},"cliff\nvesting"),"). Although the tokens are released in this manner, it does not get reflected on-chain\nautomatically since locks are ",(0,r.kt)("a",{parentName:"p",href:"#lazy-vesting"},"lazy")," and require an extrinsic to update."),(0,r.kt)("p",null,"There are two ways that vesting schedules can be created."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"One way is through an extrinsic type available in the Vesting pallet, ",(0,r.kt)("inlineCode",{parentName:"li"},"vested_transfer"),". The\nvested transfer function allows anyone to create a vesting schedule with a transfer of funds, as\nlong as the account for which the vesting schedule will be created does not already have one and\nthe transfer moves at least ",(0,r.kt)("inlineCode",{parentName:"li"},"MinVestedTransfer")," funds, which is specified as a chain constant."),(0,r.kt)("li",{parentName:"ul"},"A second way is as part of the genesis configuration of the chain. In the case of\nPolkadot, the chain specification genesis\nscript reads the state of the Claims contract that exists on the Ethereum blockchain and creates\nvesting schedules in genesis for all the allocations registered as being vested.")),(0,r.kt)("p",null,"Vesting schedules have three parameters:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"locked"),", the amount of tokens to be transferred in\n",(0,r.kt)("a",{parentName:"li",href:"../learn/learn-DOT#the-planck-unit"},"Planck units"),")"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"per block"),", the number of tokens that are released per block"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"starting block"),", the block number after which the vesting schedule starts")),(0,r.kt)("p",null,"The 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."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"You can watch ",(0,r.kt)("a",{parentName:"p",href:"https://youtu.be/JVlwTQBwNGc"},(0,r.kt)("strong",{parentName:"a"},"this video tutorial"))," to understand how to do vested\ntransfers, including linear and cliff vesting. Note the tutorial uses the Westend Testnet, but the\nsame applies to both Polkadot and Kusama.")),(0,r.kt)("h3",{id:"lazy-vesting"},"Lazy Vesting"),(0,r.kt)("p",null,"Like ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced"},"simple payouts"),", vesting is ",(0,r.kt)("em",{parentName:"p"},"lazy"),", which means that someone must\nexplicitly call an extrinsic to update the lock that is placed on an account."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("inlineCode",{parentName:"li"},"vest")," extrinsic will update the lock that is placed on the caller."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("inlineCode",{parentName:"li"},"vest_other"),' will update the lock that is placed on another "target" account\'s funds.')),(0,r.kt)("p",null,"These extrinsics are exposed from the Vesting pallet."),(0,r.kt)("p",null,"If you are using the Polkadot-JS UI, when there are\nDOT available to vest for an account, then you\nwill have the ability to unlock DOT which has\nalready vested from the ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/accounts"},"Accounts")," page."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"unbond",src:n(27152).Z,width:"241",height:"301"})),(0,r.kt)("h2",{id:"batch-transfers"},"Batch Transfers"),(0,r.kt)("p",null,"Batch transfers are balances transfers to multiple accounts executed by one account. In order to\nconstruct a batch transfer you need to:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Create a ",(0,r.kt)("inlineCode",{parentName:"li"},"utility.batch(calls)")," extrinsic using the\n",(0,r.kt)("a",{parentName:"li",href:"https://paritytech.github.io/substrate/master/pallet_utility/index.html"},"utility pallet"),", and"),(0,r.kt)("li",{parentName:"ul"},"Within the batch call you can create multiple ",(0,r.kt)("inlineCode",{parentName:"li"},"balances.transferKeepAlive")," extrinsics using the\n",(0,r.kt)("a",{parentName:"li",href:"https://paritytech.github.io/substrate/master/pallet_balances/index.html"},"balances pallet"),". You\ncan specify as many receivers as you desire.")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"You can watch ",(0,r.kt)("a",{parentName:"p",href:"https://youtu.be/uoUC2K8muvw"},(0,r.kt)("strong",{parentName:"a"},"this video tutorial"))," to learn how to do batch\ntransfers. Note the tutorial uses the Westend Testnet, but the same applies to both Polkadot and\nKusama.")),(0,r.kt)("h2",{id:"existing-reference-error"},"Existing Reference Error"),(0,r.kt)("p",null,"If you are trying to reap an account and you receive an error similar to\n",(0,r.kt)("inlineCode",{parentName:"p"},'"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:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Bonded tokens (most likely)"),(0,r.kt)("li",{parentName:"ul"},"Unpurged session keys (if you were previously a validator)"),(0,r.kt)("li",{parentName:"ul"},"Token locks"),(0,r.kt)("li",{parentName:"ul"},"Existing recovery info"),(0,r.kt)("li",{parentName:"ul"},"Existing assets")),(0,r.kt)("h3",{id:"bonded-tokens"},"Bonded Tokens"),(0,r.kt)("p",null,"If you have tokens that are bonded, you will need to unbond them before you can reap your account.\nFollow the instructions at\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-nominate-polkadot"},"Unbonding and Rebonding")," to check if you\nhave bonded tokens, stop nominating (if necessary) and unbond your tokens."),(0,r.kt)("h3",{id:"checking-for-locks"},"Checking for Locks"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"https://youtu.be/LHgY7ds_bZ0"},"this video tutorial")," and\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000169437-why-can-t-i-transfer-tokens-"},"this support page"),"\nto learn how to check for locks and remove them.")),(0,r.kt)("p",null,"You can also check for locks by querying ",(0,r.kt)("inlineCode",{parentName:"p"},"system.account(AccountId)")," in\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate"},(0,r.kt)("inlineCode",{parentName:"a"},"Chain state")," tab under the ",(0,r.kt)("inlineCode",{parentName:"a"},"Developer")," drop-down menu in the Polkadot-JS UI"),'.\nSelect your account, then click the "+" button next to the dropdowns, and check the relative ',(0,r.kt)("inlineCode",{parentName:"p"},"data"),"\nJSON object. If you see a non-zero value for anything other than ",(0,r.kt)("inlineCode",{parentName:"p"},"free"),", you have locks on your\naccount that need to get resolved."),(0,r.kt)("h3",{id:"purging-session-keys"},"Purging Session Keys"),(0,r.kt)("p",null,"If 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",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-stop-validating"},"How to Stop Validating")," page. This can also\nbe checked by checking ",(0,r.kt)("inlineCode",{parentName:"p"},"session.nextKeys")," in the chain state for an existing key."),(0,r.kt)("h3",{id:"existing-recovery-info"},"Existing Recovery Info"),(0,r.kt)("p",null,"Currently, Polkadot does not use the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/master/frame/recovery/"},"Recovery Pallet"),", so this is\nprobably not the reason for your tokens having existing references."),(0,r.kt)("p",null,"","","",""),(0,r.kt)("h3",{id:"existing-non-native-assets"},"Existing Non-Native Assets"),(0,r.kt)("p",null,"Currently, Polkadot does not use the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/tree/master/frame/assets"},"Assets Pallet"),", so this is\nprobably not the reason for your tokens having existing references."))}f.isMDXComponent=!0},27152:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/unlock-vesting-deefc0d6d9a08a91af1490a82e01069b.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/7d54ab5a.5f30dbee.js b/assets/js/7d54ab5a.5f30dbee.js new file mode 100644 index 000000000000..7c2e5b87db98 --- /dev/null +++ b/assets/js/7d54ab5a.5f30dbee.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[2791],{47940:(t,e,a)=>{"use strict";a.d(e,{Z:()=>c});var n=a(74165),o=a(15861),i=a(67294),s=a(87152),r=a(17145),l=a(67425);function u(t,e,a){return p.apply(this,arguments)}function p(){return(p=(0,o.Z)((0,n.Z)().mark((function t(e,a,o){var i,l,u,p,d;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:i=void 0,l=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){t.next=18;break}return t.abrupt("return");case 18:return u=new s.U(i),t.next=21,r.G.create({provider:u});case 21:p=t.sent,(d=a.split(".")).forEach((function(t){t in p&&(p=p[t])})),t.t1=d[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return l=p.toString(),t.abrupt("break",35);case 29:return t.next=31,p();case 31:return l=(l=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+d[0]+") in "+a);case 35:return t.abrupt("return",l);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function d(t,e,a,n){switch(e){case"humanReadable":(0,l.HumanReadable)(t,a,n);break;case"precise":(0,l.Precise)(t,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(t,n);break;case"percentage":(0,l.Percentage)(t,n);break;case"permillToPercent":(0,l.PermillToPercent)(t,n);break;case"arrayLength":(0,l.ArrayLength)(t,n);break;default:return void console.log("Ignoring unknown filter type")}}const c=function(t){var e=t.network,a=t.path,s=t.defaultValue,r=t.filter,l=void 0===r?void 0:r,p=(0,i.useState)(""),c=p[0],m=p[1];return e=e.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?d(s.toString(),l,e,m):m(s.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var t=(0,o.Z)((0,n.Z)().mark((function t(){var o;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,u(e,a,m);case 2:if(void 0!==(o=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==l?d(o,l,e,m):m(o);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{i()}catch(r){console.log(r)}}}),[]),c}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}t=parseFloat(t),n((t=Number.isInteger(t/e[a].precision)?t/e[a].precision+" "+e[a].symbol:(t/e[a].precision).toFixed(o)+" "+e[a].symbol).toString())},Precise:function(t,a,n){n(t=(t=parseFloat(t))/e[a].precision+" "+e[a].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},PermillToPercent:function(t,e){e((t/=1e4).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},77611:(t,e,a)=>{"use strict";a.r(e),a.d(e,{assets:()=>d,contentTitle:()=>u,default:()=>h,frontMatter:()=>l,metadata:()=>p,toc:()=>c});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),s=a(47940),r=["components"],l={id:"maintain-guides-how-to-nominate-kusama",title:"Become a Nominator on Kusama",sidebar_label:"How to Nominate on Kusama",description:"Steps on how to nominate on Kusama.",keywords:["nominate","nominator","kusama","stake","staking"],slug:"../../maintain-guides-how-to-nominate-kusama"},u=void 0,p={unversionedId:"maintain/kusama/maintain-guides-how-to-nominate-kusama",id:"maintain/kusama/maintain-guides-how-to-nominate-kusama",title:"Become a Nominator on Kusama",description:"Steps on how to nominate on Kusama.",source:"@site/../docs/maintain/kusama/maintain-guides-how-to-nominate-kusama.md",sourceDirName:"maintain/kusama",slug:"/maintain-guides-how-to-nominate-kusama",permalink:"/docs/maintain-guides-how-to-nominate-kusama",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/kusama/maintain-guides-how-to-nominate-kusama.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1691393601,formattedLastUpdatedAt:"Aug 7, 2023",frontMatter:{id:"maintain-guides-how-to-nominate-kusama",title:"Become a Nominator on Kusama",sidebar_label:"How to Nominate on Kusama",description:"Steps on how to nominate on Kusama.",keywords:["nominate","nominator","kusama","stake","staking"],slug:"../../maintain-guides-how-to-nominate-kusama"}},d={},c=[{value:"Setting up Stash and Staking Proxy Keys",id:"setting-up-stash-and-staking-proxy-keys",level:2},{value:"Using Polkadot-JS UI",id:"using-polkadot-js-ui",level:2},{value:"Step 1: Bond your tokens",id:"step-1-bond-your-tokens",level:3},{value:"Step 2: Nominate a validator",id:"step-2-nominate-a-validator",level:3},{value:"Step 3: Stop nominating",id:"step-3-stop-nominating",level:3},{value:"Using Command-Line Interface (CLI)",id:"using-command-line-interface-cli",level:2},{value:"Step 1: Install @polkadot/api-cli",id:"step-1-install-polkadotapi-cli",level:3},{value:"Step 2. Bond your KSM",id:"step-2-bond-your-ksm",level:3},{value:"Step 3. Nominate a validator",id:"step-3-nominate-a-validator",level:3}],m={toc:c},k="wrapper";function h(t){var e=t.components,l=(0,o.Z)(t,r);return(0,i.kt)(k,(0,n.Z)({},m,l,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The following information applies to the Kusama network. If you want to nominate on Polkadot, check\nout the ",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-nominate-polkadot"},"Polkadot guide")," instead.")),(0,i.kt)("p",null,"Nominators are one type of participant in the staking subsystem of Kusama. They are responsible for\nappointing their stake to the validators who are the second type of participant. By appointing their\nstake, they are able to elect the active set of validators and share in the rewards that are paid\nout."),(0,i.kt)("p",null,"While the ",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-validate-kusama"},"validators")," are active participants in the\nnetwork that engage in the block production and finality mechanisms, nominators take a slightly more\npassive role. Being a nominator does not require running a node of your own or worrying about online\nuptime. However, a good nominator performs due diligence on the validators that they elect. When\nlooking for validators to nominate, a nominator should pay attention to their own reward percentage\nfor nominating a specific validator - as well as the risk that they bear of being slashed if the\nvalidator gets slashed."),(0,i.kt)("admonition",{title:"Explainer videos on staking",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If you prefer a video format for the tutorials, the following videos related to staking on Kusama\nare available:"),(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://youtu.be/FCXC0CDhyS4"},"How to Stake on Polkadot (and Kusama)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=7VlTncHCGPc&t=305s"},"Staking with Kusama App on Ledger and PolkadotJS Apps UI")))),(0,i.kt)("h2",{id:"setting-up-stash-and-staking-proxy-keys"},"Setting up Stash and Staking Proxy Keys"),(0,i.kt)("p",null,"Nominators are recommended to set up two separate stash and staking proxy accounts. Explanation and\nreasoning for generating distinct accounts for this purpose is elaborated in the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"keys")," section."),(0,i.kt)("p",null,"You can generate your stash and staking proxy account via any of the recommended methods that are\ndetailed on the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-account-generation"},"account generation")," page."),(0,i.kt)("p",null,"Starting with runtime version v2023 natively included in client version\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/releases/tag/v0.8.23"},"0.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 it is extremely unsafe to set an exchange address as the\nrecipient of the staking rewards."),(0,i.kt)("h2",{id:"using-polkadot-js-ui"},"Using Polkadot-JS UI"),(0,i.kt)("h3",{id:"step-1-bond-your-tokens"},"Step 1: Bond your tokens"),(0,i.kt)("p",null,"On the ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps"},"Polkadot-JS UI"),' navigate to the "Staking" tab (within the\n"Network" menu).'),(0,i.kt)("p",null,'The "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.'),(0,i.kt)("p",null,'The "Account actions" subsection (',(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/actions"},"link"),") allows you\nto stake and nominate."),(0,i.kt)("p",null,'The "Payouts" subsection (',(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/payouts"},"link"),") allows you to\nclaim rewards from staking."),(0,i.kt)("p",null,'The "Targets" subsection (',(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/targets"},"link"),") will help you\nestimate your earnings and this is where it's good to start picking favorites."),(0,i.kt)("p",null,'The "Waiting" subsection (',(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/waiting"},"link"),") 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",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"Phragm\xe9n election mechanism"),"). It is possible validator can remain\nin the queue for a very long time if they never get enough backing."),(0,i.kt)("p",null,'The "Validator Stats" subsection (',(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/query"},"link"),") allows you\nto query a validator's stash address and see historical charts on era points, elected stake,\nrewards, and slashes."),(0,i.kt)("p",null,'Pick "Account actions" underneath "Network" > "Staking", then click the "+ Nominator" button.'),(0,i.kt)("p",null,"You will see a modal window that looks like the below:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"nominator-update-1",src:a(86367).Z,width:"2194",height:"1170"})),(0,i.kt)("p",null,'Select a "value bonded" that is ',(0,i.kt)("strong",{parentName:"p"},"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."),(0,i.kt)("p",null,"Also 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."),(0,i.kt)("p",null,"Choose 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."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Payout account selection dropdown with the custom account option highlighted",src:a(42394).Z,width:"742",height:"245"})),(0,i.kt)("admonition",{title:"Explainer video on using the Polkadot-JS UI",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"These concepts have been further explained in Polkadot's\n",(0,i.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=mNStMPZjiHM&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8"},"UI Walkthrough Video"))),(0,i.kt)("h3",{id:"step-2-nominate-a-validator"},"Step 2: Nominate a validator"),(0,i.kt)("p",null,"You are now bonded. Being bonded means your tokens are locked and could be\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking#slashing"},"slashed")," if the validators you nominate misbehave. All\nbonded funds can now be distributed to up to\n",(0,i.kt)(s.Z,{network:"kusama",path:"consts.staking.maxNominations",defaultValue:24,mdxType:"RPC"}),"\n","\nvalidators. Be careful about the validators you choose since you will be slashed if your validator\ncommits an offence."),(0,i.kt)("p",null,'Click on "Nominate" on an account you\'ve bonded and you will be presented with another popup asking\nyou to select some validators.'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Nominating validators",src:a(47043).Z,width:"2208",height:"982"})),(0,i.kt)("p",null,"Select 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 ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking"},"Staking page"),"."),(0,i.kt)("p",null,"Assuming 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 ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking#claiming-rewards"},"Claiming Rewards")," section of the Staking wiki\npage for more details."),(0,i.kt)("h3",{id:"step-3-stop-nominating"},"Step 3: Stop nominating"),(0,i.kt)("p",null,"At 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. Detailed instructions\nare available ",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-nominate-polkadot"},"here"),"."),(0,i.kt)("h2",{id:"using-command-line-interface-cli"},"Using Command-Line Interface (CLI)"),(0,i.kt)("p",null,"Apart from using the Polkadot-JS UI to participate in the staking, you can do all these things in\nCLI instead. The CLI approach allows you to interact with the Kusama network without going to the\nPolkadotJS dashboard."),(0,i.kt)("h3",{id:"step-1-install-polkadotapi-cli"},"Step 1: Install @polkadot/api-cli"),(0,i.kt)("p",null,"We assume you have installed ",(0,i.kt)("a",{parentName:"p",href:"https://nodejs.org"},"NodeJS with npm"),". Run the following command to\ninstall the ",(0,i.kt)("inlineCode",{parentName:"p"},"@polkadot/api-cli")," globally:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"npm install -g @polkadot/api-cli\n")),(0,i.kt)("h3",{id:"step-2-bond-your-ksm"},"Step 2. Bond your KSM"),(0,i.kt)("admonition",{title:"Controller accounts are deprecated",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Controller accounts are deprecated. For more information, see\n",(0,i.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/t/staking-controller-deprecation-plan-staking-ui-leads-comms/2748"},"this discussion"),".")),(0,i.kt)("p",null,"Executing the following command:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'polkadot-js-api --seed "MNEMONIC_PHRASE" tx.staking.bond CONTROLLER_ADDRESS NUMBER_OF_TOKENS REWARD_DESTINATION --ws WEBSOCKET_ENDPOINT\n')),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"CONTROLLER_ADDRESS"),": An address you would like to bond to the stash account. (Controller accounts\nare now deprecated. Refer to\n",(0,i.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/t/staking-controller-deprecation-plan-staking-ui-leads-comms/2748"},"this discussion"),"\nfor additional context)"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"NUMBER_OF_TOKENS"),": The number of KSM / DOT you would like to stake to the network. ",(0,i.kt)("strong",{parentName:"p"},"Note"),": KSM\nhas twelve decimal places and is always represented as an integer with zeroes at the end. So 1 KSM =\n1_000_000_000_000 Plancks."),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"REWARD_DESTINATION"),":"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Staked")," - Pay into the stash account, increasing the amount at stake accordingly."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Stash")," - Pay into the stash account, not increasing the amount at stake."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Account")," - Pay into a custom account, like so:\n",(0,i.kt)("inlineCode",{parentName:"li"},"Account DMTHrNcmA8QbqRS4rBq8LXn8ipyczFoNMb1X4cY2WD9tdBX"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Controller")," - Pay into the controller account.")),(0,i.kt)("p",null,"Example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'polkadot-js-api --seed "xxxx xxxxx xxxx xxxxx" tx.staking.bond DMTHrNcmA8QbqRS4rBq8LXn8ipyczFoNMb1X4cY2WD9tdBX 1000000000000 Staked --ws wss://kusama-rpc.polkadot.io/\n')),(0,i.kt)("p",null,"Result:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'...\n...\n "status": {\n "InBlock": "0x0ed1ec0ba69564e8f98958d69f826adef895b5617366a32a3aa384290e98514e"\n }\n')),(0,i.kt)("p",null,"You can check the transaction status by using the value of the ",(0,i.kt)("inlineCode",{parentName:"p"},"InBlock")," in\n",(0,i.kt)("a",{parentName:"p",href:"https://polkascan.io/pre/kusama"},"Polkascan"),". Also, you can verify the bonding state under the\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/actions"},"Staking")," page on the Polkadot-JS Apps Dashboard."),(0,i.kt)("h3",{id:"step-3-nominate-a-validator"},"Step 3. Nominate a validator"),(0,i.kt)("p",null,"To nominate a validator, you can execute the following command:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'polkadot-js-api --seed "MNEMONIC_PHRASE" tx.staking.nominate \'["VALIDATOR_ADDRESS"]\' --ws WS_ENDPOINT\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'polkadot-js-api --seed "xxxx xxxxx xxxx xxxxx" tx.staking.nominate \'["CmD9vaMYoiKe7HiFnfkftwvhKbxN9bhyjcDrfFRGbifJEG8","E457XaKbj2yTB2URy8N4UuzmyuFRkcdxYs67UvSgVr7HyFb"]\' --ws wss://kusama-rpc.polkadot.io/\n')),(0,i.kt)("p",null,"After 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-JS UI as well."))}h.isMDXComponent=!0},86367:(t,e,a)=>{"use strict";a.d(e,{Z:()=>n});const n=a.p+"assets/images/kusama_nominator_popup-633f75e8b404699f33b7d78f5ad7fd34.png"},47043:(t,e,a)=>{"use strict";a.d(e,{Z:()=>n});const n=a.p+"assets/images/kusama_nominator_selection-8e7c4058648339294ebce2e1ce0c58e8.png"},42394:(t,e,a)=>{"use strict";a.d(e,{Z:()=>n});const n=a.p+"assets/images/01-cc60f0cb7494041501c0ed80e5dca352.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/7d54ab5a.8a7e3352.js b/assets/js/7d54ab5a.8a7e3352.js deleted file mode 100644 index 9dd09c4dc9f2..000000000000 --- a/assets/js/7d54ab5a.8a7e3352.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[2791],{47940:(t,e,a)=>{"use strict";a.d(e,{Z:()=>c});var n=a(74165),o=a(15861),i=a(67294),s=a(87152),r=a(17145),l=a(67425);function u(t,e,a){return p.apply(this,arguments)}function p(){return(p=(0,o.Z)((0,n.Z)().mark((function t(e,a,o){var i,l,u,p,d;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:i=void 0,l=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){t.next=18;break}return t.abrupt("return");case 18:return u=new s.U(i),t.next=21,r.G.create({provider:u});case 21:p=t.sent,(d=a.split(".")).forEach((function(t){t in p&&(p=p[t])})),t.t1=d[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return l=p.toString(),t.abrupt("break",35);case 29:return t.next=31,p();case 31:return l=(l=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+d[0]+") in "+a);case 35:return t.abrupt("return",l);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function d(t,e,a,n){switch(e){case"humanReadable":(0,l.HumanReadable)(t,a,n);break;case"precise":(0,l.Precise)(t,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(t,n);break;case"percentage":(0,l.Percentage)(t,n);break;case"arrayLength":(0,l.ArrayLength)(t,n);break;default:return void console.log("Ignoring unknown filter type")}}const c=function(t){var e=t.network,a=t.path,s=t.defaultValue,r=t.filter,l=void 0===r?void 0:r,p=(0,i.useState)(""),c=p[0],m=p[1];return e=e.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?d(s.toString(),l,e,m):m(s.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var t=(0,o.Z)((0,n.Z)().mark((function t(){var o;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,u(e,a,m);case 2:if(void 0!==(o=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==l?d(o,l,e,m):m(o);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{i()}catch(r){console.log(r)}}}),[]),c}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}t=parseFloat(t),n((t=Number.isInteger(t/e[a].precision)?t/e[a].precision+" "+e[a].symbol:(t/e[a].precision).toFixed(o)+" "+e[a].symbol).toString())},Precise:function(t,a,n){n(t=(t=parseFloat(t))/e[a].precision+" "+e[a].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},77611:(t,e,a)=>{"use strict";a.r(e),a.d(e,{assets:()=>d,contentTitle:()=>u,default:()=>k,frontMatter:()=>l,metadata:()=>p,toc:()=>c});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),s=a(47940),r=["components"],l={id:"maintain-guides-how-to-nominate-kusama",title:"Become a Nominator on Kusama",sidebar_label:"How to Nominate on Kusama",description:"Steps on how to nominate on Kusama.",keywords:["nominate","nominator","kusama","stake","staking"],slug:"../../maintain-guides-how-to-nominate-kusama"},u=void 0,p={unversionedId:"maintain/kusama/maintain-guides-how-to-nominate-kusama",id:"maintain/kusama/maintain-guides-how-to-nominate-kusama",title:"Become a Nominator on Kusama",description:"Steps on how to nominate on Kusama.",source:"@site/../docs/maintain/kusama/maintain-guides-how-to-nominate-kusama.md",sourceDirName:"maintain/kusama",slug:"/maintain-guides-how-to-nominate-kusama",permalink:"/docs/maintain-guides-how-to-nominate-kusama",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/kusama/maintain-guides-how-to-nominate-kusama.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1691393601,formattedLastUpdatedAt:"Aug 7, 2023",frontMatter:{id:"maintain-guides-how-to-nominate-kusama",title:"Become a Nominator on Kusama",sidebar_label:"How to Nominate on Kusama",description:"Steps on how to nominate on Kusama.",keywords:["nominate","nominator","kusama","stake","staking"],slug:"../../maintain-guides-how-to-nominate-kusama"}},d={},c=[{value:"Setting up Stash and Staking Proxy Keys",id:"setting-up-stash-and-staking-proxy-keys",level:2},{value:"Using Polkadot-JS UI",id:"using-polkadot-js-ui",level:2},{value:"Step 1: Bond your tokens",id:"step-1-bond-your-tokens",level:3},{value:"Step 2: Nominate a validator",id:"step-2-nominate-a-validator",level:3},{value:"Step 3: Stop nominating",id:"step-3-stop-nominating",level:3},{value:"Using Command-Line Interface (CLI)",id:"using-command-line-interface-cli",level:2},{value:"Step 1: Install @polkadot/api-cli",id:"step-1-install-polkadotapi-cli",level:3},{value:"Step 2. Bond your KSM",id:"step-2-bond-your-ksm",level:3},{value:"Step 3. Nominate a validator",id:"step-3-nominate-a-validator",level:3}],m={toc:c},h="wrapper";function k(t){var e=t.components,l=(0,o.Z)(t,r);return(0,i.kt)(h,(0,n.Z)({},m,l,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The following information applies to the Kusama network. If you want to nominate on Polkadot, check\nout the ",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-nominate-polkadot"},"Polkadot guide")," instead.")),(0,i.kt)("p",null,"Nominators are one type of participant in the staking subsystem of Kusama. They are responsible for\nappointing their stake to the validators who are the second type of participant. By appointing their\nstake, they are able to elect the active set of validators and share in the rewards that are paid\nout."),(0,i.kt)("p",null,"While the ",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-validate-kusama"},"validators")," are active participants in the\nnetwork that engage in the block production and finality mechanisms, nominators take a slightly more\npassive role. Being a nominator does not require running a node of your own or worrying about online\nuptime. However, a good nominator performs due diligence on the validators that they elect. When\nlooking for validators to nominate, a nominator should pay attention to their own reward percentage\nfor nominating a specific validator - as well as the risk that they bear of being slashed if the\nvalidator gets slashed."),(0,i.kt)("admonition",{title:"Explainer videos on staking",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If you prefer a video format for the tutorials, the following videos related to staking on Kusama\nare available:"),(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://youtu.be/FCXC0CDhyS4"},"How to Stake on Polkadot (and Kusama)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=7VlTncHCGPc&t=305s"},"Staking with Kusama App on Ledger and PolkadotJS Apps UI")))),(0,i.kt)("h2",{id:"setting-up-stash-and-staking-proxy-keys"},"Setting up Stash and Staking Proxy Keys"),(0,i.kt)("p",null,"Nominators are recommended to set up two separate stash and staking proxy accounts. Explanation and\nreasoning for generating distinct accounts for this purpose is elaborated in the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"keys")," section."),(0,i.kt)("p",null,"You can generate your stash and staking proxy account via any of the recommended methods that are\ndetailed on the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-account-generation"},"account generation")," page."),(0,i.kt)("p",null,"Starting with runtime version v2023 natively included in client version\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/releases/tag/v0.8.23"},"0.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 it is extremely unsafe to set an exchange address as the\nrecipient of the staking rewards."),(0,i.kt)("h2",{id:"using-polkadot-js-ui"},"Using Polkadot-JS UI"),(0,i.kt)("h3",{id:"step-1-bond-your-tokens"},"Step 1: Bond your tokens"),(0,i.kt)("p",null,"On the ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps"},"Polkadot-JS UI"),' navigate to the "Staking" tab (within the\n"Network" menu).'),(0,i.kt)("p",null,'The "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.'),(0,i.kt)("p",null,'The "Account actions" subsection (',(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/actions"},"link"),") allows you\nto stake and nominate."),(0,i.kt)("p",null,'The "Payouts" subsection (',(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/payouts"},"link"),") allows you to\nclaim rewards from staking."),(0,i.kt)("p",null,'The "Targets" subsection (',(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/targets"},"link"),") will help you\nestimate your earnings and this is where it's good to start picking favorites."),(0,i.kt)("p",null,'The "Waiting" subsection (',(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/waiting"},"link"),") 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",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"Phragm\xe9n election mechanism"),"). It is possible validator can remain\nin the queue for a very long time if they never get enough backing."),(0,i.kt)("p",null,'The "Validator Stats" subsection (',(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/query"},"link"),") allows you\nto query a validator's stash address and see historical charts on era points, elected stake,\nrewards, and slashes."),(0,i.kt)("p",null,'Pick "Account actions" underneath "Network" > "Staking", then click the "+ Nominator" button.'),(0,i.kt)("p",null,"You will see a modal window that looks like the below:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"nominator-update-1",src:a(86367).Z,width:"2194",height:"1170"})),(0,i.kt)("p",null,'Select a "value bonded" that is ',(0,i.kt)("strong",{parentName:"p"},"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."),(0,i.kt)("p",null,"Also 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."),(0,i.kt)("p",null,"Choose 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."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Payout account selection dropdown with the custom account option highlighted",src:a(42394).Z,width:"742",height:"245"})),(0,i.kt)("admonition",{title:"Explainer video on using the Polkadot-JS UI",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"These concepts have been further explained in Polkadot's\n",(0,i.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=mNStMPZjiHM&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8"},"UI Walkthrough Video"))),(0,i.kt)("h3",{id:"step-2-nominate-a-validator"},"Step 2: Nominate a validator"),(0,i.kt)("p",null,"You are now bonded. Being bonded means your tokens are locked and could be\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking#slashing"},"slashed")," if the validators you nominate misbehave. All\nbonded funds can now be distributed to up to\n",(0,i.kt)(s.Z,{network:"kusama",path:"consts.staking.maxNominations",defaultValue:24,mdxType:"RPC"}),"\n","\nvalidators. Be careful about the validators you choose since you will be slashed if your validator\ncommits an offence."),(0,i.kt)("p",null,'Click on "Nominate" on an account you\'ve bonded and you will be presented with another popup asking\nyou to select some validators.'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Nominating validators",src:a(47043).Z,width:"2208",height:"982"})),(0,i.kt)("p",null,"Select 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 ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking"},"Staking page"),"."),(0,i.kt)("p",null,"Assuming 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 ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking#claiming-rewards"},"Claiming Rewards")," section of the Staking wiki\npage for more details."),(0,i.kt)("h3",{id:"step-3-stop-nominating"},"Step 3: Stop nominating"),(0,i.kt)("p",null,"At 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. Detailed instructions\nare available ",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-nominate-polkadot"},"here"),"."),(0,i.kt)("h2",{id:"using-command-line-interface-cli"},"Using Command-Line Interface (CLI)"),(0,i.kt)("p",null,"Apart from using the Polkadot-JS UI to participate in the staking, you can do all these things in\nCLI instead. The CLI approach allows you to interact with the Kusama network without going to the\nPolkadotJS dashboard."),(0,i.kt)("h3",{id:"step-1-install-polkadotapi-cli"},"Step 1: Install @polkadot/api-cli"),(0,i.kt)("p",null,"We assume you have installed ",(0,i.kt)("a",{parentName:"p",href:"https://nodejs.org"},"NodeJS with npm"),". Run the following command to\ninstall the ",(0,i.kt)("inlineCode",{parentName:"p"},"@polkadot/api-cli")," globally:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"npm install -g @polkadot/api-cli\n")),(0,i.kt)("h3",{id:"step-2-bond-your-ksm"},"Step 2. Bond your KSM"),(0,i.kt)("admonition",{title:"Controller accounts are deprecated",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Controller accounts are deprecated. For more information, see\n",(0,i.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/t/staking-controller-deprecation-plan-staking-ui-leads-comms/2748"},"this discussion"),".")),(0,i.kt)("p",null,"Executing the following command:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'polkadot-js-api --seed "MNEMONIC_PHRASE" tx.staking.bond CONTROLLER_ADDRESS NUMBER_OF_TOKENS REWARD_DESTINATION --ws WEBSOCKET_ENDPOINT\n')),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"CONTROLLER_ADDRESS"),": An address you would like to bond to the stash account. (Controller accounts\nare now deprecated. Refer to\n",(0,i.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/t/staking-controller-deprecation-plan-staking-ui-leads-comms/2748"},"this discussion"),"\nfor additional context)"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"NUMBER_OF_TOKENS"),": The number of KSM / DOT you would like to stake to the network. ",(0,i.kt)("strong",{parentName:"p"},"Note"),": KSM\nhas twelve decimal places and is always represented as an integer with zeroes at the end. So 1 KSM =\n1_000_000_000_000 Plancks."),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"REWARD_DESTINATION"),":"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Staked")," - Pay into the stash account, increasing the amount at stake accordingly."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Stash")," - Pay into the stash account, not increasing the amount at stake."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Account")," - Pay into a custom account, like so:\n",(0,i.kt)("inlineCode",{parentName:"li"},"Account DMTHrNcmA8QbqRS4rBq8LXn8ipyczFoNMb1X4cY2WD9tdBX"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Controller")," - Pay into the controller account.")),(0,i.kt)("p",null,"Example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'polkadot-js-api --seed "xxxx xxxxx xxxx xxxxx" tx.staking.bond DMTHrNcmA8QbqRS4rBq8LXn8ipyczFoNMb1X4cY2WD9tdBX 1000000000000 Staked --ws wss://kusama-rpc.polkadot.io/\n')),(0,i.kt)("p",null,"Result:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'...\n...\n "status": {\n "InBlock": "0x0ed1ec0ba69564e8f98958d69f826adef895b5617366a32a3aa384290e98514e"\n }\n')),(0,i.kt)("p",null,"You can check the transaction status by using the value of the ",(0,i.kt)("inlineCode",{parentName:"p"},"InBlock")," in\n",(0,i.kt)("a",{parentName:"p",href:"https://polkascan.io/pre/kusama"},"Polkascan"),". Also, you can verify the bonding state under the\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/actions"},"Staking")," page on the Polkadot-JS Apps Dashboard."),(0,i.kt)("h3",{id:"step-3-nominate-a-validator"},"Step 3. Nominate a validator"),(0,i.kt)("p",null,"To nominate a validator, you can execute the following command:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'polkadot-js-api --seed "MNEMONIC_PHRASE" tx.staking.nominate \'["VALIDATOR_ADDRESS"]\' --ws WS_ENDPOINT\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'polkadot-js-api --seed "xxxx xxxxx xxxx xxxxx" tx.staking.nominate \'["CmD9vaMYoiKe7HiFnfkftwvhKbxN9bhyjcDrfFRGbifJEG8","E457XaKbj2yTB2URy8N4UuzmyuFRkcdxYs67UvSgVr7HyFb"]\' --ws wss://kusama-rpc.polkadot.io/\n')),(0,i.kt)("p",null,"After 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-JS UI as well."))}k.isMDXComponent=!0},86367:(t,e,a)=>{"use strict";a.d(e,{Z:()=>n});const n=a.p+"assets/images/kusama_nominator_popup-633f75e8b404699f33b7d78f5ad7fd34.png"},47043:(t,e,a)=>{"use strict";a.d(e,{Z:()=>n});const n=a.p+"assets/images/kusama_nominator_selection-8e7c4058648339294ebce2e1ce0c58e8.png"},42394:(t,e,a)=>{"use strict";a.d(e,{Z:()=>n});const n=a.p+"assets/images/01-cc60f0cb7494041501c0ed80e5dca352.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/8d3a1bf8.2413033b.js b/assets/js/8d3a1bf8.2413033b.js deleted file mode 100644 index 8096bb9590aa..000000000000 --- a/assets/js/8d3a1bf8.2413033b.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[2399],{47940:(e,t,n)=>{"use strict";n.d(t,{Z:()=>k});var a=n(74165),o=n(15861),i=n(67294),r=n(87152),s=n(17145),l=n(67425);function d(e,t,n){return p.apply(this,arguments)}function p(){return(p=(0,o.Z)((0,a.Z)().mark((function e(t,n,o){var i,l,d,p,c;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return d=new r.U(i),e.next=21,s.G.create({provider:d});case 21:p=e.sent,(c=n.split(".")).forEach((function(e){e in p&&(p=p[e])})),e.t1=c[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=p.toString(),e.abrupt("break",35);case 29:return e.next=31,p();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+n);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function c(e,t,n,a){switch(t){case"humanReadable":(0,l.HumanReadable)(e,n,a);break;case"precise":(0,l.Precise)(e,n,a);break;case"blocksToDays":(0,l.BlocksToDays)(e,a);break;case"percentage":(0,l.Percentage)(e,a);break;case"arrayLength":(0,l.ArrayLength)(e,a);break;default:return void console.log("Ignoring unknown filter type")}}const k=function(e){var t=e.network,n=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,p=(0,i.useState)(""),k=p[0],u=p[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?c(r.toString(),l,t,u):u(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,a.Z)().mark((function e(){var o;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t,n,u);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?c(o,l,t,u):u(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),k}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,n,a){var o=void 0;if("polkadot"===n||"statemint"===n)o=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),a((e=Number.isInteger(e/t[n].precision)?e/t[n].precision+" "+t[n].symbol:(e/t[n].precision).toFixed(o)+" "+t[n].symbol).toString())},Precise:function(e,n,a){a(e=(e=parseFloat(e))/t[n].precision+" "+t[n].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},10209:(e,t,n)=>{"use strict";n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>d,default:()=>f,frontMatter:()=>l,metadata:()=>p,toc:()=>k});var a=n(87462),o=n(63366),i=(n(67294),n(3905)),r=n(47940),s=["components"],l={id:"learn-inflation",title:"Token Inflation",sidebar_label:"Token Inflation",description:"Explanation of Token's Inflation in the Polkadot Ecosystem.",keywords:["token","DOT","KSM","inflation"],slug:"../learn-inflation"},d=void 0,p={unversionedId:"learn/learn-inflation",id:"learn/learn-inflation",title:"Token Inflation",description:"Explanation of Token's Inflation in the Polkadot Ecosystem.",source:"@site/../docs/learn/learn-inflation.md",sourceDirName:"learn",slug:"/learn-inflation",permalink:"/docs/learn-inflation",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-inflation.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696928140,formattedLastUpdatedAt:"Oct 10, 2023",frontMatter:{id:"learn-inflation",title:"Token Inflation",sidebar_label:"Token Inflation",description:"Explanation of Token's Inflation in the Polkadot Ecosystem.",keywords:["token","DOT","KSM","inflation"],slug:"../learn-inflation"},sidebar:"docs",previous:{title:"DOT",permalink:"/docs/learn-DOT"},next:{title:"Teleporting Assets",permalink:"/docs/learn-teleport"}},c={},k=[{value:"Inflation Model",id:"inflation-model",level:2},{value:"Ideal Staking Rate",id:"ideal-staking-rate",level:2}],u={toc:k},h="wrapper";function f(e){var t=e.components,l=(0,o.Z)(e,s);return(0,i.kt)(h,(0,a.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"DOT is an inflationary token. On the\nPolkadot network, inflation is\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/blob/756ccc35e93d1a78e3c71a0e67ae4da5f1d09f69/runtime/polkadot/src/lib.rs#L576"},"set to be 10% annually"),",\n","\nwhich is distributed as staking rewards based on the amount staked vs. ideal staking rate, and the\nremainder goes to the treasury."),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"DOT went through ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-redenomination"},"redenomination")," in 2020 that saw the DOT token supply\nincrease by 100 times."),(0,i.kt)("p",{parentName:"admonition"},"The current token supply on Polkadot is\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.balances.totalIssuance",defaultValue:0xa9bc0e330b775000,filter:"humanReadable",mdxType:"RPC"})," (Over 1.2 Billion DOT).\n","")),(0,i.kt)("p",null,"It is essential to understand that the primary objective of\nDOT inflation is to incentivize network\nparticipants through\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus#nominated-proof-of-stake"},"Nominated Proof of Stake (NPoS)")," and to grow the\nnetwork through funding the on-chain treasury. There is an opportunity cost of keeping the\nDOT tokens idle with the current inflation model\nas the tokens get diluted over time. Economics and game theory suggest that setting an ideal\ninflation rate is essential for incentivizing the network participants as well as the growth of the\nnetwork, and any deviation from it can have negative effects. Reducing the inflation rate could\nlimit growth while increasing the inflation rate could break the incentive model of the token.\nHence, ",(0,i.kt)("strong",{parentName:"p"},"token inflation rate is not a forever fixed value, and inflation can be updated in the\nfuture through ",(0,i.kt)("a",{parentName:"strong",href:"/docs/learn-polkadot-opengov"},"on-chain governance"))," based on thorough tokenomics\nresearch."),(0,i.kt)("h2",{id:"inflation-model"},"Inflation Model"),(0,i.kt)("p",null,"The 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."),(0,i.kt)("p",null,"There is a ",(0,i.kt)("a",{parentName:"p",href:"#ideal-staking-rate"},"dynamic ",(0,i.kt)("em",{parentName:"a"},"ideal staking rate"))," (in the figure set to 0.5 or 50%)\nthat the network tries to maintain. The goal is to have the ",(0,i.kt)("em",{parentName:"p"},"system staking rate")," meet the ",(0,i.kt)("em",{parentName:"p"},"ideal\nstaking rate"),". The system staking rate would be the total amount staked over the total token supply,\nwhere the total amount staked is the stake of all validators and nominators on the network. The\nideal staking rate accounts for having sufficient backing of DOT\nto prevent the possible compromise of security while keeping the native\ntoken liquid."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"staking",src:n(69605).Z,width:"800",height:"800"})),(0,i.kt)("p",{style:{textAlign:"center"}},"Source: ",(0,i.kt)("a",{href:"https://research.web3.foundation/Polkadot/overview/token-economics"},"Research - Web3 Foundation")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"x-axis"),": Proportion of DOT staked"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"y-axis"),": Inflation, annualized percentage"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Blue line"),": Annual inflation rate of NPoS, i.e. total amount of tokens minted to pay validators\nand nominators."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Green line"),": Annual rewards rate for stakers. For instance, 0.2 corresponds to 20% of annual\nreturns on the staked tokens. You can determine the current annual staking rewards rate by looking\nat the top bar of the staking overview on\n",(0,i.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/staking"},"Polkadot-JS UI"),".")),(0,i.kt)("p",null,"Assuming that the ideal staking rate is 50%, all of the inflation would go to the validators and\nnominators if 50% of all DOT are staked. Any\ndeviation from the 50% - positive or negative - sends the proportional remainder to the treasury.\nDeviation from the ideal staking rate are referred to as ",(0,i.kt)("em",{parentName:"p"},"staking inefficiencies"),". Thus, the\ntreasury does not currently receive a substantial inflow of funds at the ideal staking rate. See\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov-treasury"},"this page")," for more information about treasury inflow\nsources."),(0,i.kt)("p",null,"For those who are interested in knowing more about the design of the inflation model for the\nnetwork, please see ",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/overview/token-economics"},"here"),"."),(0,i.kt)("h2",{id:"ideal-staking-rate"},"Ideal Staking Rate"),(0,i.kt)("p",null,"The ideal staking rate can vary between 45% to 75% based on the number of parachains that acquired a\nlease through an auction (this excludes the System parachains), based on the implementation\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/blob/cd901764a52edc04a6d22bea3a526def593ab2a7/polkadot/runtime/common/src/impls.rs#L80"},"here"),"."),(0,i.kt)("p",null,"Briefly, the ideal staking rate can be calculated as follows:"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"0.75 - auction_proportion")),(0,i.kt)("p",null,"where ",(0,i.kt)("inlineCode",{parentName:"p"},"auction_proportion")," is obtained by computing ",(0,i.kt)("inlineCode",{parentName:"p"},"min(auctioned_slots, 60) / 200"),". The\n",(0,i.kt)("inlineCode",{parentName:"p"},"auctioned_slots")," are all the auctioned slots without the slots for system parachains."),(0,i.kt)("p",null,"Assuming there are 48 filled slots, of which three are dedicated to system parachains (Asset Hub,\nBridge Hub and Collectives), there are 45 auctioned slots. The ",(0,i.kt)("inlineCode",{parentName:"p"},"auction_proportion")," is thus\n",(0,i.kt)("inlineCode",{parentName:"p"},"45 / 200 = 0.225"),". The ideal staking rate is ",(0,i.kt)("inlineCode",{parentName:"p"},"0.75 - 0.225 = 0.525"),"."),(0,i.kt)("p",null,"If the amount of tokens staked goes below 52.5%, 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."))}f.isMDXComponent=!0},69605:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/staking-rate-with-parachains-0e10db7192160d6b8e16848b2ed12bc6.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/8d3a1bf8.4547d71d.js b/assets/js/8d3a1bf8.4547d71d.js new file mode 100644 index 000000000000..a1f58a21a511 --- /dev/null +++ b/assets/js/8d3a1bf8.4547d71d.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[2399],{47940:(e,t,n)=>{"use strict";n.d(t,{Z:()=>k});var a=n(74165),o=n(15861),i=n(67294),r=n(87152),s=n(17145),l=n(67425);function d(e,t,n){return c.apply(this,arguments)}function c(){return(c=(0,o.Z)((0,a.Z)().mark((function e(t,n,o){var i,l,d,c,p;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return d=new r.U(i),e.next=21,s.G.create({provider:d});case 21:c=e.sent,(p=n.split(".")).forEach((function(e){e in c&&(c=c[e])})),e.t1=p[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=c.toString(),e.abrupt("break",35);case 29:return e.next=31,c();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+p[0]+") in "+n);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function p(e,t,n,a){switch(t){case"humanReadable":(0,l.HumanReadable)(e,n,a);break;case"precise":(0,l.Precise)(e,n,a);break;case"blocksToDays":(0,l.BlocksToDays)(e,a);break;case"percentage":(0,l.Percentage)(e,a);break;case"permillToPercent":(0,l.PermillToPercent)(e,a);break;case"arrayLength":(0,l.ArrayLength)(e,a);break;default:return void console.log("Ignoring unknown filter type")}}const k=function(e){var t=e.network,n=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,c=(0,i.useState)(""),k=c[0],u=c[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?p(r.toString(),l,t,u):u(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,a.Z)().mark((function e(){var o;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t,n,u);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?p(o,l,t,u):u(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),k}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,n,a){var o=void 0;if("polkadot"===n||"statemint"===n)o=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),a((e=Number.isInteger(e/t[n].precision)?e/t[n].precision+" "+t[n].symbol:(e/t[n].precision).toFixed(o)+" "+t[n].symbol).toString())},Precise:function(e,n,a){a(e=(e=parseFloat(e))/t[n].precision+" "+t[n].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},10209:(e,t,n)=>{"use strict";n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>d,default:()=>f,frontMatter:()=>l,metadata:()=>c,toc:()=>k});var a=n(87462),o=n(63366),i=(n(67294),n(3905)),r=n(47940),s=["components"],l={id:"learn-inflation",title:"Token Inflation",sidebar_label:"Token Inflation",description:"Explanation of Token's Inflation in the Polkadot Ecosystem.",keywords:["token","DOT","KSM","inflation"],slug:"../learn-inflation"},d=void 0,c={unversionedId:"learn/learn-inflation",id:"learn/learn-inflation",title:"Token Inflation",description:"Explanation of Token's Inflation in the Polkadot Ecosystem.",source:"@site/../docs/learn/learn-inflation.md",sourceDirName:"learn",slug:"/learn-inflation",permalink:"/docs/learn-inflation",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-inflation.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696928140,formattedLastUpdatedAt:"Oct 10, 2023",frontMatter:{id:"learn-inflation",title:"Token Inflation",sidebar_label:"Token Inflation",description:"Explanation of Token's Inflation in the Polkadot Ecosystem.",keywords:["token","DOT","KSM","inflation"],slug:"../learn-inflation"},sidebar:"docs",previous:{title:"DOT",permalink:"/docs/learn-DOT"},next:{title:"Teleporting Assets",permalink:"/docs/learn-teleport"}},p={},k=[{value:"Inflation Model",id:"inflation-model",level:2},{value:"Ideal Staking Rate",id:"ideal-staking-rate",level:2}],u={toc:k},h="wrapper";function f(e){var t=e.components,l=(0,o.Z)(e,s);return(0,i.kt)(h,(0,a.Z)({},u,l,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"DOT is an inflationary token. On the\nPolkadot network, inflation is\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/blob/756ccc35e93d1a78e3c71a0e67ae4da5f1d09f69/runtime/polkadot/src/lib.rs#L576"},"set to be 10% annually"),",\n","\nwhich is distributed as staking rewards based on the amount staked vs. ideal staking rate, and the\nremainder goes to the treasury."),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"DOT went through ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-redenomination"},"redenomination")," in 2020 that saw the DOT token supply\nincrease by 100 times."),(0,i.kt)("p",{parentName:"admonition"},"The current token supply on Polkadot is\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.balances.totalIssuance",defaultValue:0xa9bc0e330b775000,filter:"humanReadable",mdxType:"RPC"})," (Over 1.2 Billion DOT).\n","")),(0,i.kt)("p",null,"It is essential to understand that the primary objective of\nDOT inflation is to incentivize network\nparticipants through\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus#nominated-proof-of-stake"},"Nominated Proof of Stake (NPoS)")," and to grow the\nnetwork through funding the on-chain treasury. There is an opportunity cost of keeping the\nDOT tokens idle with the current inflation model\nas the tokens get diluted over time. Economics and game theory suggest that setting an ideal\ninflation rate is essential for incentivizing the network participants as well as the growth of the\nnetwork, and any deviation from it can have negative effects. Reducing the inflation rate could\nlimit growth while increasing the inflation rate could break the incentive model of the token.\nHence, ",(0,i.kt)("strong",{parentName:"p"},"token inflation rate is not a forever fixed value, and inflation can be updated in the\nfuture through ",(0,i.kt)("a",{parentName:"strong",href:"/docs/learn-polkadot-opengov"},"on-chain governance"))," based on thorough tokenomics\nresearch."),(0,i.kt)("h2",{id:"inflation-model"},"Inflation Model"),(0,i.kt)("p",null,"The 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."),(0,i.kt)("p",null,"There is a ",(0,i.kt)("a",{parentName:"p",href:"#ideal-staking-rate"},"dynamic ",(0,i.kt)("em",{parentName:"a"},"ideal staking rate"))," (in the figure set to 0.5 or 50%)\nthat the network tries to maintain. The goal is to have the ",(0,i.kt)("em",{parentName:"p"},"system staking rate")," meet the ",(0,i.kt)("em",{parentName:"p"},"ideal\nstaking rate"),". The system staking rate would be the total amount staked over the total token supply,\nwhere the total amount staked is the stake of all validators and nominators on the network. The\nideal staking rate accounts for having sufficient backing of DOT\nto prevent the possible compromise of security while keeping the native\ntoken liquid."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"staking",src:n(69605).Z,width:"800",height:"800"})),(0,i.kt)("p",{style:{textAlign:"center"}},"Source: ",(0,i.kt)("a",{href:"https://research.web3.foundation/Polkadot/overview/token-economics"},"Research - Web3 Foundation")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"x-axis"),": Proportion of DOT staked"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"y-axis"),": Inflation, annualized percentage"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Blue line"),": Annual inflation rate of NPoS, i.e. total amount of tokens minted to pay validators\nand nominators."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Green line"),": Annual rewards rate for stakers. For instance, 0.2 corresponds to 20% of annual\nreturns on the staked tokens. You can determine the current annual staking rewards rate by looking\nat the top bar of the staking overview on\n",(0,i.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/staking"},"Polkadot-JS UI"),".")),(0,i.kt)("p",null,"Assuming that the ideal staking rate is 50%, all of the inflation would go to the validators and\nnominators if 50% of all DOT are staked. Any\ndeviation from the 50% - positive or negative - sends the proportional remainder to the treasury.\nDeviation from the ideal staking rate are referred to as ",(0,i.kt)("em",{parentName:"p"},"staking inefficiencies"),". Thus, the\ntreasury does not currently receive a substantial inflow of funds at the ideal staking rate. See\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov-treasury"},"this page")," for more information about treasury inflow\nsources."),(0,i.kt)("p",null,"For those who are interested in knowing more about the design of the inflation model for the\nnetwork, please see ",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/overview/token-economics"},"here"),"."),(0,i.kt)("h2",{id:"ideal-staking-rate"},"Ideal Staking Rate"),(0,i.kt)("p",null,"The ideal staking rate can vary between 45% to 75% based on the number of parachains that acquired a\nlease through an auction (this excludes the System parachains), based on the implementation\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/blob/cd901764a52edc04a6d22bea3a526def593ab2a7/polkadot/runtime/common/src/impls.rs#L80"},"here"),"."),(0,i.kt)("p",null,"Briefly, the ideal staking rate can be calculated as follows:"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"0.75 - auction_proportion")),(0,i.kt)("p",null,"where ",(0,i.kt)("inlineCode",{parentName:"p"},"auction_proportion")," is obtained by computing ",(0,i.kt)("inlineCode",{parentName:"p"},"min(auctioned_slots, 60) / 200"),". The\n",(0,i.kt)("inlineCode",{parentName:"p"},"auctioned_slots")," are all the auctioned slots without the slots for system parachains."),(0,i.kt)("p",null,"Assuming there are 48 filled slots, of which three are dedicated to system parachains (Asset Hub,\nBridge Hub and Collectives), there are 45 auctioned slots. The ",(0,i.kt)("inlineCode",{parentName:"p"},"auction_proportion")," is thus\n",(0,i.kt)("inlineCode",{parentName:"p"},"45 / 200 = 0.225"),". The ideal staking rate is ",(0,i.kt)("inlineCode",{parentName:"p"},"0.75 - 0.225 = 0.525"),"."),(0,i.kt)("p",null,"If the amount of tokens staked goes below 52.5%, 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."))}f.isMDXComponent=!0},69605:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/staking-rate-with-parachains-0e10db7192160d6b8e16848b2ed12bc6.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/918b38b6.1d6ccc15.js b/assets/js/918b38b6.1d6ccc15.js deleted file mode 100644 index bf77eea5522e..000000000000 --- a/assets/js/918b38b6.1d6ccc15.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[2508],{47940:(e,a,n)=>{"use strict";n.d(a,{Z:()=>h});var t=n(74165),o=n(15861),i=n(67294),r=n(87152),s=n(17145),c=n(67425);function l(e,a,n){return d.apply(this,arguments)}function d(){return(d=(0,o.Z)((0,t.Z)().mark((function e(a,n,o){var i,c,l,d,p;return(0,t.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,c=void 0,e.t0=a,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return l=new r.U(i),e.next=21,s.G.create({provider:l});case 21:d=e.sent,(p=n.split(".")).forEach((function(e){e in d&&(d=d[e])})),e.t1=p[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return c=d.toString(),e.abrupt("break",35);case 29:return e.next=31,d();case 31:return c=(c=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+p[0]+") in "+n);case 35:return e.abrupt("return",c);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function p(e,a,n,t){switch(a){case"humanReadable":(0,c.HumanReadable)(e,n,t);break;case"precise":(0,c.Precise)(e,n,t);break;case"blocksToDays":(0,c.BlocksToDays)(e,t);break;case"percentage":(0,c.Percentage)(e,t);break;case"arrayLength":(0,c.ArrayLength)(e,t);break;default:return void console.log("Ignoring unknown filter type")}}const h=function(e){var a=e.network,n=e.path,r=e.defaultValue,s=e.filter,c=void 0===s?void 0:s,d=(0,i.useState)(""),h=d[0],k=d[1];return a=a.toLowerCase(),(0,i.useEffect)((function(){void 0!==c?p(r.toString(),c,a,k):k(r.toString());var e=void 0;switch(a){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+a)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,t.Z)().mark((function e(){var o;return(0,t.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,l(a,n,k);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==c?p(o,c,a,k):k(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),h}},67425:e=>{var a={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,n,t){var o=void 0;if("polkadot"===n||"statemint"===n)o=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),t((e=Number.isInteger(e/a[n].precision)?e/a[n].precision+" "+a[n].symbol:(e/a[n].precision).toFixed(o)+" "+a[n].symbol).toString())},Precise:function(e,n,t){t(e=(e=parseFloat(e))/a[n].precision+" "+a[n].symbol)},BlocksToDays:function(e,a){a((e=6*e/86400).toString())},Percentage:function(e,a){a((e/=1e7).toString())},ArrayLength:function(e,a){a((e=e.split(",").length).toString())}}},90594:(e,a,n)=>{"use strict";n.r(a),n.d(a,{assets:()=>d,contentTitle:()=>c,default:()=>u,frontMatter:()=>s,metadata:()=>l,toc:()=>p});var t=n(87462),o=n(63366),i=(n(67294),n(3905)),r=(n(47940),["components"]),s={id:"learn-async-backing",title:"Asynchronous Backing",sidebar_label:"Asynchronous Backing",description:"A brief overview of asynchronous backing, and how it affects Polkadot's scalability.",keywords:["parachains","backing","parablock","perspective parachains","unincluded segments"],slug:"../learn-async-backing"},c=void 0,l={unversionedId:"learn/learn-async-backing",id:"learn/learn-async-backing",title:"Asynchronous Backing",description:"A brief overview of asynchronous backing, and how it affects Polkadot's scalability.",source:"@site/../docs/learn/learn-async-backing.md",sourceDirName:"learn",slug:"/learn-async-backing",permalink:"/docs/learn-async-backing",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-async-backing.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696596726,formattedLastUpdatedAt:"Oct 6, 2023",frontMatter:{id:"learn-async-backing",title:"Asynchronous Backing",sidebar_label:"Asynchronous Backing",description:"A brief overview of asynchronous backing, and how it affects Polkadot's scalability.",keywords:["parachains","backing","parablock","perspective parachains","unincluded segments"],slug:"../learn-async-backing"},sidebar:"docs",previous:{title:"Parathreads",permalink:"/docs/learn-parathreads"},next:{title:"SASSAFRAS",permalink:"/docs/learn-sassafras"}},d={},p=[{value:"Synchronous Backing",id:"synchronous-backing",level:2},{value:"Asynchronous Backing",id:"asynchronous-backing",level:2},{value:"Synchronous vs. Asynchronous Backing",id:"synchronous-vs-asynchronous-backing",level:3},{value:"Sync Backing as a special case of Async Backing",id:"sync-backing-as-a-special-case-of-async-backing",level:3},{value:"Async Backing Diagram",id:"async-backing-diagram",level:3},{value:"Terminology",id:"terminology",level:2},{value:"Candidate Receipt",id:"candidate-receipt",level:3},{value:"Pipelining",id:"pipelining",level:3},{value:"Unincluded Segments",id:"unincluded-segments",level:3},{value:"Prospective Parachains",id:"prospective-parachains",level:3},{value:"Learn More",id:"learn-more",level:2}],h={toc:p},k="wrapper";function u(e){var a=e.components,s=(0,o.Z)(e,r);return(0,i.kt)(k,(0,t.Z)({},h,s,{components:a,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{title:"Learn about Parachain Consensus",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"To fully follow the material on this page, it is recommended to be familiar with the primary stages\nof the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol"},"Parachain Protocol"),".")),(0,i.kt)("p",null,"In Polkadot, parablocks are generated by ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-collator"},"collators")," on the parachain side and\nsent to ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-validator"},"validators")," on the relay chain side for backing."),(0,i.kt)("admonition",{title:"What is backing?",type:"info"},(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("strong",{parentName:"p"},"Backing")," refers to the process in which parablocks are verified by a subset of validators or\nbacking groups. It is an important step in the validation process for parablocks, as it is the first\nline of defense in ensuring censorship resistance. Parablocks only need to be backed by one\nvalidator, and as a consequence, backing does not ensure parablock validity.")),(0,i.kt)("p",null,"Backed parablocks are sent to other validators for inclusion into the relay chain. Parablocks are\nincluded when validators have attested to having received\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol#erasure-codes"},"erasure coded chunks")," of the parablock data. Note\n",(0,i.kt)("a",{parentName:"p",href:"#candidate-receipt"},"candidate receipts")," and not the parablocks themselves are included in relay\nblocks (but for simplicity, we refer to parablocks as being included). When generated, parablocks\nmust be anchored to a relay chain block called ",(0,i.kt)("strong",{parentName:"p"},"relay parent"),". The relay parent is an input to\nparablock candidate generation. It provides the necessary context to build the next parablock. Note\nthat the relay parent of a parablock and the relay block including that parablock are always\ndifferent."),(0,i.kt)("h2",{id:"synchronous-backing"},"Synchronous Backing"),(0,i.kt)("p",null,"Before 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:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"A new parablock can be produced after including the previous one (i.e., every 12 seconds)."),(0,i.kt)("li",{parentName:"ol"},"Context to build the next parablock is drawn from the latest included parablock ancestor"),(0,i.kt)("li",{parentName:"ol"},"The relay parent must be the latest relay chain block.")),(0,i.kt)("p",null,"Because of (1) parablocks can be generated every other relay chain block (i.e., every 12 seconds).\nBecause of (2) generation of parablock ",(0,i.kt)("inlineCode",{parentName:"p"},"P")," can only start when ",(0,i.kt)("inlineCode",{parentName:"p"},"P - 1")," is included (there is no\n",(0,i.kt)("a",{parentName:"p",href:"#pipelining"},"pipelining"),"). Because of (3) execution time can take maximum 0.5 seconds as parablock\n",(0,i.kt)("inlineCode",{parentName:"p"},"P")," is rushing to be backed in the next 5.5 seconds (2 seconds needed for backing and the rest for\ngossiping). Every parablock is backed in 6 seconds (one relay chain block) and included in the next\n6 seconds (next relay chain block). The time from generation to inclusion is 12 seconds. This limits\nthe amount of data a collator can add to each parablock."),(0,i.kt)("p",null,"Parablock 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 ",(0,i.kt)("inlineCode",{parentName:"p"},"R")," is the relay parent of parablock ",(0,i.kt)("inlineCode",{parentName:"p"},"P"),", then ",(0,i.kt)("inlineCode",{parentName:"p"},"P")," could be backed in ",(0,i.kt)("inlineCode",{parentName:"p"},"R + 1")," and\nincluded in ",(0,i.kt)("inlineCode",{parentName:"p"},"R + 2"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"sync-backing",src:n(54804).Z,width:"1920",height:"800"})),(0,i.kt)("p",null,"From left to right, parablock P1 is anchored to the relay parent R0 (showed with an ",(0,i.kt)("inlineCode",{parentName:"p"},"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."),(0,i.kt)("admonition",{title:"Every collator also runs an attached relay chain full node",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The attached relay node receives relay blocks via gossip. Then, the relay node talks to the\nparachain node through the ",(0,i.kt)("inlineCode",{parentName:"p"},"CollationGeneration")," subsystem. R2 is gossiped to the relay full node\nattached to the collator producing P2. Then, ",(0,i.kt)("inlineCode",{parentName:"p"},"CollationGeneration")," passes information about R2 to\nthe collator node. Finally, relay parent information from R2 informs the generation of candidate P2.")),(0,i.kt)("p",null,"Because P2 is rushing to be backed in 6 seconds into R3, collators have only 0.5 seconds to generate\nit and present it to backing groups on the relay chain that will take approximately 2 seconds to\nback it and some extra time for gossiping it (the whole process from collation to backing lasts 6\nseconds). P2 is included in R4, which could be used as a relay parent for P3 (not shown). After 24\nseconds P1 and P2 are included in the relay chain. Note how collators can start new parablocks every\n12 seconds but only have 0.5 seconds to generate them."),(0,i.kt)("h2",{id:"asynchronous-backing"},"Asynchronous Backing"),(0,i.kt)("admonition",{title:"Disclaimer: Performance Measurements",type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"Due to asynchronous backing not being fully implemented in a running production network, each\nperformance metric is not thoroughly tested nor guaranteed until proper benchmarking has occurred.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"sync-vs-async-backing",src:n(4919).Z,width:"1920",height:"800"})),(0,i.kt)("p",null,"In 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)."),(0,i.kt)("h3",{id:"synchronous-vs-asynchronous-backing"},"Synchronous vs. Asynchronous Backing"),(0,i.kt)("p",null,"Below is a table showing the main differences between synchronous and asynchronous backing."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:"left"}),(0,i.kt)("th",{parentName:"tr",align:"center"},"Sync Backing"),(0,i.kt)("th",{parentName:"tr",align:"center"},"Async Backing"),(0,i.kt)("th",{parentName:"tr",align:"center"},"Async Backing Advantage"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"left"},(0,i.kt)("strong",{parentName:"td"},"Parablocks included every")),(0,i.kt)("td",{parentName:"tr",align:"center"},"12 seconds"),(0,i.kt)("td",{parentName:"tr",align:"center"},"6 seconds"),(0,i.kt)("td",{parentName:"tr",align:"center"},"2x more throughput or 2x less latency")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"left"},(0,i.kt)("strong",{parentName:"td"},"Parablock's maximum generation time")),(0,i.kt)("td",{parentName:"tr",align:"center"},"0.5 seconds"),(0,i.kt)("td",{parentName:"tr",align:"center"},"2 seconds"),(0,i.kt)("td",{parentName:"tr",align:"center"},"4x more data in a parablock")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"left"},(0,i.kt)("strong",{parentName:"td"},"Relay parent")),(0,i.kt)("td",{parentName:"tr",align:"center"},"Is the latest relay chain block"),(0,i.kt)("td",{parentName:"tr",align:"center"},"Is not necessarily the latest relay chain block"),(0,i.kt)("td",{parentName:"tr",align:"center"},"Collators can submit parablocks to backing groups in advance")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"left"},(0,i.kt)("strong",{parentName:"td"},"Collators can build on")),(0,i.kt)("td",{parentName:"tr",align:"center"},"The most recent ancestor included in the latest relay chain block"),(0,i.kt)("td",{parentName:"tr",align:"center"},"An ancestor included in a relay chain block (not necessarily the latest), with augmented information from the latest ancestor in the ",(0,i.kt)("a",{parentName:"td",href:"#unincluded-segments"},"unincluded segment")),(0,i.kt)("td",{parentName:"tr",align:"center"},"Collators can start building parablocks in advance")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"left"},(0,i.kt)("strong",{parentName:"td"},"Number of unincluded parablocks")),(0,i.kt)("td",{parentName:"tr",align:"center"},"Only one"),(0,i.kt)("td",{parentName:"tr",align:"center"},"One, or more than one (depends on configuration parameters)"),(0,i.kt)("td",{parentName:"tr",align:"center"},"More efficiency and scalability")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"left"},(0,i.kt)("strong",{parentName:"td"},"Unincluded parablocks")),(0,i.kt)("td",{parentName:"tr",align:"center"},"Cannot be re-proposed"),(0,i.kt)("td",{parentName:"tr",align:"center"},"Can be re-proposed if not successfully included in the first attempt"),(0,i.kt)("td",{parentName:"tr",align:"center"},"Decrease wastage of unused blockspace")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"left"},(0,i.kt)("strong",{parentName:"td"},"Parablock's Backing-to-inclusion time")),(0,i.kt)("td",{parentName:"tr",align:"center"},"12 seconds"),(0,i.kt)("td",{parentName:"tr",align:"center"},"12 seconds"),(0,i.kt)("td",{parentName:"tr",align:"center"},"No change")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"left"},(0,i.kt)("strong",{parentName:"td"},"Parablock's Inclusion-to-finality time")),(0,i.kt)("td",{parentName:"tr",align:"center"},"30 seconds"),(0,i.kt)("td",{parentName:"tr",align:"center"},"30 seconds"),(0,i.kt)("td",{parentName:"tr",align:"center"},"No change")))),(0,i.kt)("p",null,"In synchronous backing, collators generate parablocks using context entirely pulled from the relay\nchain. While in asynchronous backing, collators use additional context from the\n",(0,i.kt)("a",{parentName:"p",href:"#unincluded-segments"},"unincluded segment"),". Parablocks are included every 6 seconds because backing\nof parablock ",(0,i.kt)("inlineCode",{parentName:"p"},"N + 1")," and inclusion of parablock ",(0,i.kt)("inlineCode",{parentName:"p"},"N")," can happen on the same relay chain bock\n(",(0,i.kt)("a",{parentName:"p",href:"#pipelining"},"pipelining"),"). However, as for synchronous backing, a parablock takes 12 seconds to\nget backed and included, and from inclusion to finality there is an additional 30-second time\nwindow."),(0,i.kt)("p",null,"Because the throughput is increased by 2x and parachains have 4x more time to generate blocks,\nasynchronous backing is expected to deliver 8x more blockspace to parachains."),(0,i.kt)("h3",{id:"sync-backing-as-a-special-case-of-async-backing"},"Sync Backing as a special case of Async Backing"),(0,i.kt)("p",null,"Two parameters of asynchronous backing can be controlled by\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov"},"Governance"),":"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/blob/f204e3264f945c33b4cea18a49f7232c180b07c5/polkadot/primitives/src/vstaging/mod.rs#L49"},(0,i.kt)("inlineCode",{parentName:"a"},"max_candidate_depth")),":\nthe number of parachain blocks a collator can produce that are not yet included in the relay\nchain.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/blob/f204e3264f945c33b4cea18a49f7232c180b07c5/polkadot/primitives/src/vstaging/mod.rs#L54"},(0,i.kt)("inlineCode",{parentName:"a"},"allowed_ancestry_len")),":\nthe oldest relay chain parent a parachain block can be built on top of."))),(0,i.kt)("p",null,"Values of zero for both correspond to synchronous backing: ",(0,i.kt)("inlineCode",{parentName:"p"},"max_candidate_depth = 0")," means there can\nbe only one unincluded parablock at all times, and ",(0,i.kt)("inlineCode",{parentName:"p"},"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)."),(0,i.kt)("h3",{id:"async-backing-diagram"},"Async Backing Diagram"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"async-backing",src:n(16588).Z,width:"1920",height:"800"})),(0,i.kt)("p",null,"The diagram assumes:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"max_candidate_depth = 2"),", meaning that there can be a maximum of three unincluded parablocks at\nall times"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"allowed_ancestry_len = 1"),", meaning parablocks can be anchored to the last or second-last relay\nparent (i.e., collators can start preparing parablocks 6 seconds in advance)")),(0,i.kt)("p",null,"From 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 ",(0,i.kt)("inlineCode",{parentName:"p"},"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\nto generate parablocks. And so on, P3 can be generated while backing groups check P2, and P4 can be\nbuilt while P3 undergoing backing. In 24 seconds, P1 to P3 are included in the relay chain."),(0,i.kt)("p",null,"Note how there are always three unincluded parablocks at all times, i.e. compared to synchronous\nbacking there can be multiple unincluded parablocks (i.e. ",(0,i.kt)("a",{parentName:"p",href:"#pipelining"},"pipelining"),"). For example,\nwhen P1 is undergoing inclusion, P2 and P3 are undergoing backing. Collators were able to generate\nmultiple unincluded parablocks because on their end they have the\n",(0,i.kt)("a",{parentName:"p",href:"#unincluded-segments"},"unincluded segment"),", a local storage of not-included parablock ancestors that\nthey can use to fetch information to build new parablocks. On the relay chain side,\n",(0,i.kt)("a",{parentName:"p",href:"#prospective-parachains"},"perspective parachains")," repeats the work each unincluded segment does in\ntracking candidates (as validators cannot trust the record kept on parachains)."),(0,i.kt)("p",null,"The 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."),(0,i.kt)("p",null,"The 2-second block generation time is thus a limiter, not a system limitation. If block 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",(0,i.kt)("a",{parentName:"p",href:"/docs/polkadot-direction#agile-core-usage"},"agile core usage")," and\n",(0,i.kt)("a",{parentName:"p",href:"/docs/polkadot-direction#agile-coretime-allocation"},"coretime allocation"),")."),(0,i.kt)("h2",{id:"terminology"},"Terminology"),(0,i.kt)("h3",{id:"candidate-receipt"},"Candidate Receipt"),(0,i.kt)("p",null,"Saying that a parablock has been included in a relay chain parent does not mean the entire parablock\nis in the relay chain block. Instead, ",(0,i.kt)("strong",{parentName:"p"},"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."),(0,i.kt)("h3",{id:"pipelining"},"Pipelining"),(0,i.kt)("p",null,"Asynchronous backing is a feature that introduces\n",(0,i.kt)("a",{parentName:"p",href:"https://www.techtarget.com/whatis/definition/pipelining"},"pipelining")," to the parachain block\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol"},"generation, backing and inclusion"),'. It is analogous to the logical\npipelining of processor instruction in "traditional" architectures, where some instructions may be\nexecuted before others are complete. Instructions may also be executed in parallel, enabling\nmultiple processor parts to work on potentially different instructions simultaneously.'),(0,i.kt)("p",null,"Bundles of state transitions represented as blocks may be processed similarly. In the context of\nPolkadot, pipelining aims to increase the\nthroughput of the entire network by completing the backing and inclusion steps for different blocks\nat the same time. Asynchronous backing does not just allow for pipelining within a single pipe (or\ncore). It lays the foundation for a large number of pipes (or cores) to run for the same parachain\nat the same time. In that way, we have two distinct new forms of parallel computation."),(0,i.kt)("h3",{id:"unincluded-segments"},"Unincluded Segments"),(0,i.kt)("p",null,"Unincluded 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."),(0,i.kt)("p",null,"The 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."),(0,i.kt)("p",null,"The purpose of each unincluded segment is twofold:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Make each parachain aware of when and at what depth it can build blocks that won't be rejected by\nthe relay chain"),(0,i.kt)("li",{parentName:"ul"},"Provide critical context necessary to build parablocks with parent blocks that have yet to be\nincluded. The unincluded segment is all about building parablocks.")),(0,i.kt)("h3",{id:"prospective-parachains"},"Prospective Parachains"),(0,i.kt)("p",null,"The purpose of\n",(0,i.kt)("a",{parentName:"p",href:"https://paritytech.github.io/polkadot/book/node/backing/prospective-parachains.html"},"prospective parachains"),"\nis twofold:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Keep track of parablocks that have been submitted to backers but have yet to be included. This\nincludes tracking the full unincluded ancestry of each parablock, without which it wouldn't be\npossible to verify their legitimacy.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Look up and provide candidates which are children of the most recently included parablock for each\nparachain. These are taken as inputs to the availability process. Prospective parachains is all\nabout tracking, storing, and providing candidates to the availability/inclusion step."))),(0,i.kt)("p",null,"Prospective parachains essentially repeats the work each ",(0,i.kt)("a",{parentName:"p",href:"#unincluded-segments"},"unincluded segment"),"\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."),(0,i.kt)("p",null,"The 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",(0,i.kt)("a",{parentName:"p",href:"https://paritytech.github.io/polkadot/book/node/backing/prospective-parachains.html#fragment-trees"},(0,i.kt)("strong",{parentName:"a"},"fragment tree")),"."),(0,i.kt)("p",null,"A 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."),(0,i.kt)("p",null,"A 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."),(0,i.kt)("h2",{id:"learn-more"},"Learn More"),(0,i.kt)("p",null,"The information provided here is subject to change; keep up to date using the following resources:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://polkadot.network/blog/polkadot-roadmap-roundup"},"Polkadot Roadmap Roundup")," - Article by\nRob Habermeier, Polkadot founder, details the plans for Polkadot for 2023."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/paritytech/polkadot/issues/3779"},"Asynchronous Backing Spec & Tracking Issue")," -\nThe implementation tracking issue for asynchronous backing"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://paritytech.github.io/polkadot/book/node/backing/prospective-parachains.html"},"Prospective Parachains Subsystem - The Polkadot Parachain Host Implementers' Guide")),(0,i.kt)("li",{parentName:"ul"},"Chapter 6.11. from Polkadot Blockchain Academy (PBA) lecture material:\n",(0,i.kt)("a",{parentName:"li",href:"https://polkadot-blockchain-academy.github.io/pba-book/polkadot/async-backing-shallow/page.html"},"Asynchronous Backing (Shallow)")),(0,i.kt)("li",{parentName:"ul"},"Chapter 6.15. from PBA lecture material:\n",(0,i.kt)("a",{parentName:"li",href:"https://polkadot-blockchain-academy.github.io/pba-book/polkadot/async-backing-deep/page.html"},"Asynchronous Backing (Deep)")),(0,i.kt)("li",{parentName:"ul"},"Polkadot Blog Post -\n",(0,i.kt)("a",{parentName:"li",href:"https://www.polkadot.network/blog/elevating-polkadots-performance-and-scale-with-asynchronous-backing"},"Asynchronous Backing: Elevating Polkadot's Performance and Scale"))))}u.isMDXComponent=!0},16588:(e,a,n)=>{"use strict";n.d(a,{Z:()=>t});const t=n.p+"assets/images/async-backing-30d83e1ed114a3fb5e4ac44e58e2d6dc.png"},54804:(e,a,n)=>{"use strict";n.d(a,{Z:()=>t});const t=n.p+"assets/images/sync-backing-e5c74751cd62df36651f23fab421f7cf.png"},4919:(e,a,n)=>{"use strict";n.d(a,{Z:()=>t});const t=n.p+"assets/images/sync-vs-async-backing-3548388f98c44fc684a6176a6ccb8ed2.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/918b38b6.d2ec6c30.js b/assets/js/918b38b6.d2ec6c30.js new file mode 100644 index 000000000000..9f169f1a5821 --- /dev/null +++ b/assets/js/918b38b6.d2ec6c30.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[2508],{47940:(e,a,n)=>{"use strict";n.d(a,{Z:()=>h});var t=n(74165),o=n(15861),r=n(67294),i=n(87152),s=n(17145),c=n(67425);function l(e,a,n){return d.apply(this,arguments)}function d(){return(d=(0,o.Z)((0,t.Z)().mark((function e(a,n,o){var r,c,l,d,p;return(0,t.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=void 0,c=void 0,e.t0=a,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){e.next=18;break}return e.abrupt("return");case 18:return l=new i.U(r),e.next=21,s.G.create({provider:l});case 21:d=e.sent,(p=n.split(".")).forEach((function(e){e in d&&(d=d[e])})),e.t1=p[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return c=d.toString(),e.abrupt("break",35);case 29:return e.next=31,d();case 31:return c=(c=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+p[0]+") in "+n);case 35:return e.abrupt("return",c);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function p(e,a,n,t){switch(a){case"humanReadable":(0,c.HumanReadable)(e,n,t);break;case"precise":(0,c.Precise)(e,n,t);break;case"blocksToDays":(0,c.BlocksToDays)(e,t);break;case"percentage":(0,c.Percentage)(e,t);break;case"permillToPercent":(0,c.PermillToPercent)(e,t);break;case"arrayLength":(0,c.ArrayLength)(e,t);break;default:return void console.log("Ignoring unknown filter type")}}const h=function(e){var a=e.network,n=e.path,i=e.defaultValue,s=e.filter,c=void 0===s?void 0:s,d=(0,r.useState)(""),h=d[0],k=d[1];return a=a.toLowerCase(),(0,r.useEffect)((function(){void 0!==c?p(i.toString(),c,a,k):k(i.toString());var e=void 0;switch(a){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+a)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var e=(0,o.Z)((0,t.Z)().mark((function e(){var o;return(0,t.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,l(a,n,k);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==c?p(o,c,a,k):k(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{r()}catch(s){console.log(s)}}}),[]),h}},67425:e=>{var a={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,n,t){var o=void 0;if("polkadot"===n||"statemint"===n)o=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),t((e=Number.isInteger(e/a[n].precision)?e/a[n].precision+" "+a[n].symbol:(e/a[n].precision).toFixed(o)+" "+a[n].symbol).toString())},Precise:function(e,n,t){t(e=(e=parseFloat(e))/a[n].precision+" "+a[n].symbol)},BlocksToDays:function(e,a){a((e=6*e/86400).toString())},Percentage:function(e,a){a((e/=1e7).toString())},PermillToPercent:function(e,a){a((e/=1e4).toString())},ArrayLength:function(e,a){a((e=e.split(",").length).toString())}}},90594:(e,a,n)=>{"use strict";n.r(a),n.d(a,{assets:()=>d,contentTitle:()=>c,default:()=>u,frontMatter:()=>s,metadata:()=>l,toc:()=>p});var t=n(87462),o=n(63366),r=(n(67294),n(3905)),i=(n(47940),["components"]),s={id:"learn-async-backing",title:"Asynchronous Backing",sidebar_label:"Asynchronous Backing",description:"A brief overview of asynchronous backing, and how it affects Polkadot's scalability.",keywords:["parachains","backing","parablock","perspective parachains","unincluded segments"],slug:"../learn-async-backing"},c=void 0,l={unversionedId:"learn/learn-async-backing",id:"learn/learn-async-backing",title:"Asynchronous Backing",description:"A brief overview of asynchronous backing, and how it affects Polkadot's scalability.",source:"@site/../docs/learn/learn-async-backing.md",sourceDirName:"learn",slug:"/learn-async-backing",permalink:"/docs/learn-async-backing",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-async-backing.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696596726,formattedLastUpdatedAt:"Oct 6, 2023",frontMatter:{id:"learn-async-backing",title:"Asynchronous Backing",sidebar_label:"Asynchronous Backing",description:"A brief overview of asynchronous backing, and how it affects Polkadot's scalability.",keywords:["parachains","backing","parablock","perspective parachains","unincluded segments"],slug:"../learn-async-backing"},sidebar:"docs",previous:{title:"Parathreads",permalink:"/docs/learn-parathreads"},next:{title:"SASSAFRAS",permalink:"/docs/learn-sassafras"}},d={},p=[{value:"Synchronous Backing",id:"synchronous-backing",level:2},{value:"Asynchronous Backing",id:"asynchronous-backing",level:2},{value:"Synchronous vs. Asynchronous Backing",id:"synchronous-vs-asynchronous-backing",level:3},{value:"Sync Backing as a special case of Async Backing",id:"sync-backing-as-a-special-case-of-async-backing",level:3},{value:"Async Backing Diagram",id:"async-backing-diagram",level:3},{value:"Terminology",id:"terminology",level:2},{value:"Candidate Receipt",id:"candidate-receipt",level:3},{value:"Pipelining",id:"pipelining",level:3},{value:"Unincluded Segments",id:"unincluded-segments",level:3},{value:"Prospective Parachains",id:"prospective-parachains",level:3},{value:"Learn More",id:"learn-more",level:2}],h={toc:p},k="wrapper";function u(e){var a=e.components,s=(0,o.Z)(e,i);return(0,r.kt)(k,(0,t.Z)({},h,s,{components:a,mdxType:"MDXLayout"}),(0,r.kt)("admonition",{title:"Learn about Parachain Consensus",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"To fully follow the material on this page, it is recommended to be familiar with the primary stages\nof the ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol"},"Parachain Protocol"),".")),(0,r.kt)("p",null,"In Polkadot, parablocks are generated by ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-collator"},"collators")," on the parachain side and\nsent to ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-validator"},"validators")," on the relay chain side for backing."),(0,r.kt)("admonition",{title:"What is backing?",type:"info"},(0,r.kt)("p",{parentName:"admonition"},(0,r.kt)("strong",{parentName:"p"},"Backing")," refers to the process in which parablocks are verified by a subset of validators or\nbacking groups. It is an important step in the validation process for parablocks, as it is the first\nline of defense in ensuring censorship resistance. Parablocks only need to be backed by one\nvalidator, and as a consequence, backing does not ensure parablock validity.")),(0,r.kt)("p",null,"Backed parablocks are sent to other validators for inclusion into the relay chain. Parablocks are\nincluded when validators have attested to having received\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol#erasure-codes"},"erasure coded chunks")," of the parablock data. Note\n",(0,r.kt)("a",{parentName:"p",href:"#candidate-receipt"},"candidate receipts")," and not the parablocks themselves are included in relay\nblocks (but for simplicity, we refer to parablocks as being included). When generated, parablocks\nmust be anchored to a relay chain block called ",(0,r.kt)("strong",{parentName:"p"},"relay parent"),". The relay parent is an input to\nparablock candidate generation. It provides the necessary context to build the next parablock. Note\nthat the relay parent of a parablock and the relay block including that parablock are always\ndifferent."),(0,r.kt)("h2",{id:"synchronous-backing"},"Synchronous Backing"),(0,r.kt)("p",null,"Before 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:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"A new parablock can be produced after including the previous one (i.e., every 12 seconds)."),(0,r.kt)("li",{parentName:"ol"},"Context to build the next parablock is drawn from the latest included parablock ancestor"),(0,r.kt)("li",{parentName:"ol"},"The relay parent must be the latest relay chain block.")),(0,r.kt)("p",null,"Because of (1) parablocks can be generated every other relay chain block (i.e., every 12 seconds).\nBecause of (2) generation of parablock ",(0,r.kt)("inlineCode",{parentName:"p"},"P")," can only start when ",(0,r.kt)("inlineCode",{parentName:"p"},"P - 1")," is included (there is no\n",(0,r.kt)("a",{parentName:"p",href:"#pipelining"},"pipelining"),"). Because of (3) execution time can take maximum 0.5 seconds as parablock\n",(0,r.kt)("inlineCode",{parentName:"p"},"P")," is rushing to be backed in the next 5.5 seconds (2 seconds needed for backing and the rest for\ngossiping). Every parablock is backed in 6 seconds (one relay chain block) and included in the next\n6 seconds (next relay chain block). The time from generation to inclusion is 12 seconds. This limits\nthe amount of data a collator can add to each parablock."),(0,r.kt)("p",null,"Parablock 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 ",(0,r.kt)("inlineCode",{parentName:"p"},"R")," is the relay parent of parablock ",(0,r.kt)("inlineCode",{parentName:"p"},"P"),", then ",(0,r.kt)("inlineCode",{parentName:"p"},"P")," could be backed in ",(0,r.kt)("inlineCode",{parentName:"p"},"R + 1")," and\nincluded in ",(0,r.kt)("inlineCode",{parentName:"p"},"R + 2"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"sync-backing",src:n(54804).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"From left to right, parablock P1 is anchored to the relay parent R0 (showed with an ",(0,r.kt)("inlineCode",{parentName:"p"},"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."),(0,r.kt)("admonition",{title:"Every collator also runs an attached relay chain full node",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The attached relay node receives relay blocks via gossip. Then, the relay node talks to the\nparachain node through the ",(0,r.kt)("inlineCode",{parentName:"p"},"CollationGeneration")," subsystem. R2 is gossiped to the relay full node\nattached to the collator producing P2. Then, ",(0,r.kt)("inlineCode",{parentName:"p"},"CollationGeneration")," passes information about R2 to\nthe collator node. Finally, relay parent information from R2 informs the generation of candidate P2.")),(0,r.kt)("p",null,"Because P2 is rushing to be backed in 6 seconds into R3, collators have only 0.5 seconds to generate\nit and present it to backing groups on the relay chain that will take approximately 2 seconds to\nback it and some extra time for gossiping it (the whole process from collation to backing lasts 6\nseconds). P2 is included in R4, which could be used as a relay parent for P3 (not shown). After 24\nseconds P1 and P2 are included in the relay chain. Note how collators can start new parablocks every\n12 seconds but only have 0.5 seconds to generate them."),(0,r.kt)("h2",{id:"asynchronous-backing"},"Asynchronous Backing"),(0,r.kt)("admonition",{title:"Disclaimer: Performance Measurements",type:"warning"},(0,r.kt)("p",{parentName:"admonition"},"Due to asynchronous backing not being fully implemented in a running production network, each\nperformance metric is not thoroughly tested nor guaranteed until proper benchmarking has occurred.")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"sync-vs-async-backing",src:n(4919).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"In 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)."),(0,r.kt)("h3",{id:"synchronous-vs-asynchronous-backing"},"Synchronous vs. Asynchronous Backing"),(0,r.kt)("p",null,"Below is a table showing the main differences between synchronous and asynchronous backing."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"left"}),(0,r.kt)("th",{parentName:"tr",align:"center"},"Sync Backing"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Async Backing"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Async Backing Advantage"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("strong",{parentName:"td"},"Parablocks included every")),(0,r.kt)("td",{parentName:"tr",align:"center"},"12 seconds"),(0,r.kt)("td",{parentName:"tr",align:"center"},"6 seconds"),(0,r.kt)("td",{parentName:"tr",align:"center"},"2x more throughput or 2x less latency")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("strong",{parentName:"td"},"Parablock's maximum generation time")),(0,r.kt)("td",{parentName:"tr",align:"center"},"0.5 seconds"),(0,r.kt)("td",{parentName:"tr",align:"center"},"2 seconds"),(0,r.kt)("td",{parentName:"tr",align:"center"},"4x more data in a parablock")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("strong",{parentName:"td"},"Relay parent")),(0,r.kt)("td",{parentName:"tr",align:"center"},"Is the latest relay chain block"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Is not necessarily the latest relay chain block"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Collators can submit parablocks to backing groups in advance")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("strong",{parentName:"td"},"Collators can build on")),(0,r.kt)("td",{parentName:"tr",align:"center"},"The most recent ancestor included in the latest relay chain block"),(0,r.kt)("td",{parentName:"tr",align:"center"},"An ancestor included in a relay chain block (not necessarily the latest), with augmented information from the latest ancestor in the ",(0,r.kt)("a",{parentName:"td",href:"#unincluded-segments"},"unincluded segment")),(0,r.kt)("td",{parentName:"tr",align:"center"},"Collators can start building parablocks in advance")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("strong",{parentName:"td"},"Number of unincluded parablocks")),(0,r.kt)("td",{parentName:"tr",align:"center"},"Only one"),(0,r.kt)("td",{parentName:"tr",align:"center"},"One, or more than one (depends on configuration parameters)"),(0,r.kt)("td",{parentName:"tr",align:"center"},"More efficiency and scalability")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("strong",{parentName:"td"},"Unincluded parablocks")),(0,r.kt)("td",{parentName:"tr",align:"center"},"Cannot be re-proposed"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Can be re-proposed if not successfully included in the first attempt"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Decrease wastage of unused blockspace")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("strong",{parentName:"td"},"Parablock's Backing-to-inclusion time")),(0,r.kt)("td",{parentName:"tr",align:"center"},"12 seconds"),(0,r.kt)("td",{parentName:"tr",align:"center"},"12 seconds"),(0,r.kt)("td",{parentName:"tr",align:"center"},"No change")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("strong",{parentName:"td"},"Parablock's Inclusion-to-finality time")),(0,r.kt)("td",{parentName:"tr",align:"center"},"30 seconds"),(0,r.kt)("td",{parentName:"tr",align:"center"},"30 seconds"),(0,r.kt)("td",{parentName:"tr",align:"center"},"No change")))),(0,r.kt)("p",null,"In synchronous backing, collators generate parablocks using context entirely pulled from the relay\nchain. While in asynchronous backing, collators use additional context from the\n",(0,r.kt)("a",{parentName:"p",href:"#unincluded-segments"},"unincluded segment"),". Parablocks are included every 6 seconds because backing\nof parablock ",(0,r.kt)("inlineCode",{parentName:"p"},"N + 1")," and inclusion of parablock ",(0,r.kt)("inlineCode",{parentName:"p"},"N")," can happen on the same relay chain bock\n(",(0,r.kt)("a",{parentName:"p",href:"#pipelining"},"pipelining"),"). However, as for synchronous backing, a parablock takes 12 seconds to\nget backed and included, and from inclusion to finality there is an additional 30-second time\nwindow."),(0,r.kt)("p",null,"Because the throughput is increased by 2x and parachains have 4x more time to generate blocks,\nasynchronous backing is expected to deliver 8x more blockspace to parachains."),(0,r.kt)("h3",{id:"sync-backing-as-a-special-case-of-async-backing"},"Sync Backing as a special case of Async Backing"),(0,r.kt)("p",null,"Two parameters of asynchronous backing can be controlled by\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov"},"Governance"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/blob/f204e3264f945c33b4cea18a49f7232c180b07c5/polkadot/primitives/src/vstaging/mod.rs#L49"},(0,r.kt)("inlineCode",{parentName:"a"},"max_candidate_depth")),":\nthe number of parachain blocks a collator can produce that are not yet included in the relay\nchain.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/blob/f204e3264f945c33b4cea18a49f7232c180b07c5/polkadot/primitives/src/vstaging/mod.rs#L54"},(0,r.kt)("inlineCode",{parentName:"a"},"allowed_ancestry_len")),":\nthe oldest relay chain parent a parachain block can be built on top of."))),(0,r.kt)("p",null,"Values of zero for both correspond to synchronous backing: ",(0,r.kt)("inlineCode",{parentName:"p"},"max_candidate_depth = 0")," means there can\nbe only one unincluded parablock at all times, and ",(0,r.kt)("inlineCode",{parentName:"p"},"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)."),(0,r.kt)("h3",{id:"async-backing-diagram"},"Async Backing Diagram"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"async-backing",src:n(16588).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"The diagram assumes:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"max_candidate_depth = 2"),", meaning that there can be a maximum of three unincluded parablocks at\nall times"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"allowed_ancestry_len = 1"),", meaning parablocks can be anchored to the last or second-last relay\nparent (i.e., collators can start preparing parablocks 6 seconds in advance)")),(0,r.kt)("p",null,"From 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 ",(0,r.kt)("inlineCode",{parentName:"p"},"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\nto generate parablocks. And so on, P3 can be generated while backing groups check P2, and P4 can be\nbuilt while P3 undergoing backing. In 24 seconds, P1 to P3 are included in the relay chain."),(0,r.kt)("p",null,"Note how there are always three unincluded parablocks at all times, i.e. compared to synchronous\nbacking there can be multiple unincluded parablocks (i.e. ",(0,r.kt)("a",{parentName:"p",href:"#pipelining"},"pipelining"),"). For example,\nwhen P1 is undergoing inclusion, P2 and P3 are undergoing backing. Collators were able to generate\nmultiple unincluded parablocks because on their end they have the\n",(0,r.kt)("a",{parentName:"p",href:"#unincluded-segments"},"unincluded segment"),", a local storage of not-included parablock ancestors that\nthey can use to fetch information to build new parablocks. On the relay chain side,\n",(0,r.kt)("a",{parentName:"p",href:"#prospective-parachains"},"perspective parachains")," repeats the work each unincluded segment does in\ntracking candidates (as validators cannot trust the record kept on parachains)."),(0,r.kt)("p",null,"The 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."),(0,r.kt)("p",null,"The 2-second block generation time is thus a limiter, not a system limitation. If block 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",(0,r.kt)("a",{parentName:"p",href:"/docs/polkadot-direction#agile-core-usage"},"agile core usage")," and\n",(0,r.kt)("a",{parentName:"p",href:"/docs/polkadot-direction#agile-coretime-allocation"},"coretime allocation"),")."),(0,r.kt)("h2",{id:"terminology"},"Terminology"),(0,r.kt)("h3",{id:"candidate-receipt"},"Candidate Receipt"),(0,r.kt)("p",null,"Saying that a parablock has been included in a relay chain parent does not mean the entire parablock\nis in the relay chain block. Instead, ",(0,r.kt)("strong",{parentName:"p"},"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."),(0,r.kt)("h3",{id:"pipelining"},"Pipelining"),(0,r.kt)("p",null,"Asynchronous backing is a feature that introduces\n",(0,r.kt)("a",{parentName:"p",href:"https://www.techtarget.com/whatis/definition/pipelining"},"pipelining")," to the parachain block\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol"},"generation, backing and inclusion"),'. It is analogous to the logical\npipelining of processor instruction in "traditional" architectures, where some instructions may be\nexecuted before others are complete. Instructions may also be executed in parallel, enabling\nmultiple processor parts to work on potentially different instructions simultaneously.'),(0,r.kt)("p",null,"Bundles of state transitions represented as blocks may be processed similarly. In the context of\nPolkadot, pipelining aims to increase the\nthroughput of the entire network by completing the backing and inclusion steps for different blocks\nat the same time. Asynchronous backing does not just allow for pipelining within a single pipe (or\ncore). It lays the foundation for a large number of pipes (or cores) to run for the same parachain\nat the same time. In that way, we have two distinct new forms of parallel computation."),(0,r.kt)("h3",{id:"unincluded-segments"},"Unincluded Segments"),(0,r.kt)("p",null,"Unincluded 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."),(0,r.kt)("p",null,"The 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."),(0,r.kt)("p",null,"The purpose of each unincluded segment is twofold:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Make each parachain aware of when and at what depth it can build blocks that won't be rejected by\nthe relay chain"),(0,r.kt)("li",{parentName:"ul"},"Provide critical context necessary to build parablocks with parent blocks that have yet to be\nincluded. The unincluded segment is all about building parablocks.")),(0,r.kt)("h3",{id:"prospective-parachains"},"Prospective Parachains"),(0,r.kt)("p",null,"The purpose of\n",(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/polkadot/book/node/backing/prospective-parachains.html"},"prospective parachains"),"\nis twofold:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Keep track of parablocks that have been submitted to backers but have yet to be included. This\nincludes tracking the full unincluded ancestry of each parablock, without which it wouldn't be\npossible to verify their legitimacy.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Look up and provide candidates which are children of the most recently included parablock for each\nparachain. These are taken as inputs to the availability process. Prospective parachains is all\nabout tracking, storing, and providing candidates to the availability/inclusion step."))),(0,r.kt)("p",null,"Prospective parachains essentially repeats the work each ",(0,r.kt)("a",{parentName:"p",href:"#unincluded-segments"},"unincluded segment"),"\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."),(0,r.kt)("p",null,"The 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",(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/polkadot/book/node/backing/prospective-parachains.html#fragment-trees"},(0,r.kt)("strong",{parentName:"a"},"fragment tree")),"."),(0,r.kt)("p",null,"A 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."),(0,r.kt)("p",null,"A 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."),(0,r.kt)("h2",{id:"learn-more"},"Learn More"),(0,r.kt)("p",null,"The information provided here is subject to change; keep up to date using the following resources:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot.network/blog/polkadot-roadmap-roundup"},"Polkadot Roadmap Roundup")," - Article by\nRob Habermeier, Polkadot founder, details the plans for Polkadot for 2023."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/paritytech/polkadot/issues/3779"},"Asynchronous Backing Spec & Tracking Issue")," -\nThe implementation tracking issue for asynchronous backing"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://paritytech.github.io/polkadot/book/node/backing/prospective-parachains.html"},"Prospective Parachains Subsystem - The Polkadot Parachain Host Implementers' Guide")),(0,r.kt)("li",{parentName:"ul"},"Chapter 6.11. from Polkadot Blockchain Academy (PBA) lecture material:\n",(0,r.kt)("a",{parentName:"li",href:"https://polkadot-blockchain-academy.github.io/pba-book/polkadot/async-backing-shallow/page.html"},"Asynchronous Backing (Shallow)")),(0,r.kt)("li",{parentName:"ul"},"Chapter 6.15. from PBA lecture material:\n",(0,r.kt)("a",{parentName:"li",href:"https://polkadot-blockchain-academy.github.io/pba-book/polkadot/async-backing-deep/page.html"},"Asynchronous Backing (Deep)")),(0,r.kt)("li",{parentName:"ul"},"Polkadot Blog Post -\n",(0,r.kt)("a",{parentName:"li",href:"https://www.polkadot.network/blog/elevating-polkadots-performance-and-scale-with-asynchronous-backing"},"Asynchronous Backing: Elevating Polkadot's Performance and Scale"))))}u.isMDXComponent=!0},16588:(e,a,n)=>{"use strict";n.d(a,{Z:()=>t});const t=n.p+"assets/images/async-backing-30d83e1ed114a3fb5e4ac44e58e2d6dc.png"},54804:(e,a,n)=>{"use strict";n.d(a,{Z:()=>t});const t=n.p+"assets/images/sync-backing-e5c74751cd62df36651f23fab421f7cf.png"},4919:(e,a,n)=>{"use strict";n.d(a,{Z:()=>t});const t=n.p+"assets/images/sync-vs-async-backing-3548388f98c44fc684a6176a6ccb8ed2.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.6b45b4f9.js b/assets/js/935f2afb.6b45b4f9.js new file mode 100644 index 000000000000..91ea332bc33e --- /dev/null +++ b/assets/js/935f2afb.6b45b4f9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[53],{22624:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"category","label":"Learn","items":[{"type":"category","label":"General","description":"General Information to get started with Polkadot and Web3.","items":[{"type":"link","label":"Getting Started","href":"/docs/getting-started","docId":"general/getting-started"},{"type":"link","label":"Web3 and Polkadot","href":"/docs/web3-and-polkadot","docId":"general/web3-and-polkadot"},{"type":"category","label":"Polkadot Vision","description":"Polkadot\'s Vision revealed by Gavin Wood at Decoded 2023.","items":[{"type":"link","label":"Polkadot 1.0","href":"/docs/polkadot-v1","docId":"general/polkadot-v1"},{"type":"link","label":"Polkadot Direction","href":"/docs/polkadot-direction","docId":"general/polkadot-direction"}],"collapsed":true,"collapsible":true,"href":"/docs/polkadot-vision-index"},{"type":"category","label":"Stay Safe","description":"Good-practices to Stay Safe while Surfing in Web3.","items":[{"type":"link","label":"Scam Protection","href":"/docs/learn-scams","docId":"general/scams"},{"type":"link","label":"Do Your Own Research","href":"/docs/how-to-dyor","docId":"general/how-to-dyor"}],"collapsed":true,"collapsible":true,"href":"/docs/stay-safe-index"},{"type":"category","label":"Wallets","description":"Wallet Options in the Polkadot Ecosystem.","items":[{"type":"link","label":"Wallets and Extensions","href":"/docs/wallets-and-extensions","docId":"general/wallets-and-extensions"},{"type":"link","label":"Ledger","href":"/docs/ledger","docId":"general/ledger"},{"type":"link","label":"Polkadot Vault","href":"/docs/polkadot-vault","docId":"general/polkadot-vault"},{"type":"link","label":"Polkadot-JS UI","href":"/docs/polkadotjs-ui","docId":"general/polkadotjs-ui"}],"collapsed":true,"collapsible":true,"href":"/docs/wallets-index"},{"type":"category","label":"Dashboards","description":"Dashboards in the Polkadot Ecosystem.","items":[{"type":"link","label":"Staking Dashboard","href":"/docs/staking-dashboard","docId":"general/staking-dashboard"}],"collapsed":true,"collapsible":true,"href":"/docs/dashboards-index"},{"type":"link","label":"Polkadot-JS","href":"/docs/polkadotjs","docId":"general/polkadotjs"},{"type":"category","label":"Community & Contributors","description":"Polkadot Community and Wiki Contributors.","items":[{"type":"link","label":"Community","href":"/docs/community","docId":"general/community"},{"type":"link","label":"Contributing to the Wiki","href":"/docs/contributing","docId":"general/contributing"},{"type":"link","label":"Contributors","href":"/docs/contributors","docId":"general/contributors"}],"collapsed":true,"collapsible":true,"href":"/docs/community-index"},{"type":"category","label":"Programmes","description":"Programmes and Initiatives within the Polkadot Ecosystem.","items":[{"type":"link","label":"Grants","href":"/docs/grants","docId":"general/grants"},{"type":"link","label":"Bug Bounty","href":"/docs/bug-bounty","docId":"general/bug-bounty"},{"type":"link","label":"Polkadot Ambassadors","href":"/docs/ambassadors","docId":"general/ambassadors"},{"type":"link","label":"Substrate Builders","href":"/docs/builders-program","docId":"general/builders-program"},{"type":"link","label":"Thousand Validators","href":"/docs/thousand-validators","docId":"general/doc-thousand-validators"},{"type":"link","label":"Thousand Contributors","href":"/docs/thousand-contributors","docId":"general/doc-thousand-contributors"},{"type":"link","label":"Developer Heroes","href":"/docs/dev-heroes","docId":"general/dev-heroes"}],"collapsed":true,"collapsible":true,"href":"/docs/programmes-index"},{"type":"link","label":"Build on Polkadot","href":"/docs/start-building","docId":"general/start-building"},{"type":"link","label":"Research Pages","href":"/docs/research","docId":"general/research"},{"type":"link","label":"Metadata Explorer","href":"/docs/metadata","docId":"general/metadata"},{"type":"link","label":"FAQ","href":"/docs/faq","docId":"general/faq"},{"type":"link","label":"Glossary","href":"/docs/glossary","docId":"general/glossary"}],"collapsed":true,"collapsible":true,"href":"/docs/general-index"},{"type":"category","label":"Basics","description":"Staking, Accounts, Transactions, Tokens and NFTs, and Governance.","items":[{"type":"category","label":"Accounts","description":"Basic Accounts, Identity, Multi-signature, and Proxies.","items":[{"type":"link","label":"Polkadot Accounts","href":"/docs/learn-accounts","docId":"learn/learn-accounts"},{"type":"link","label":"Account Generation","href":"/docs/learn-account-generation","docId":"learn/learn-account-generation"},{"type":"link","label":"Account Abstraction","href":"/docs/learn-account-abstraction","docId":"learn/learn-account-abstraction"},{"type":"link","label":"Account Identity","href":"/docs/learn-identity","docId":"learn/learn-identity"},{"type":"link","label":"Multi-Signature Accounts","href":"/docs/learn-account-multisig","docId":"learn/learn-account-multisig"},{"type":"link","label":"Proxy Accounts","href":"/docs/learn-proxies","docId":"learn/learn-proxies"},{"type":"link","label":"Pure Proxy Accounts","href":"/docs/learn-proxies-pure","docId":"learn/learn-proxies-pure"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-accounts-index"},{"type":"category","label":"Transactions","description":"Extrinsics, Balance Transfers, and Fees.","items":[{"type":"link","label":"Extrinsics","href":"/docs/learn-extrinsics","docId":"learn/learn-extrinsics"},{"type":"link","label":"Balances Transfers","href":"/docs/learn-balance-transfers","docId":"learn/learn-balance-transfers"},{"type":"link","label":"Transaction Fees","href":"/docs/learn-transaction-fees","docId":"learn/learn-transaction-fees"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-transactions-index"},{"type":"category","label":"Staking","description":"Mechanics of Staking.","items":[{"type":"link","label":"Introduction to Staking","href":"/docs/learn-staking","docId":"learn/learn-staking"},{"type":"link","label":"Nomination Pools","href":"/docs/learn-nomination-pools","docId":"learn/learn-nomination-pools"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-staking-index"},{"type":"link","label":"Polkadot OpenGov","href":"/docs/learn-polkadot-opengov","docId":"learn/learn-polkadot-opengov"},{"type":"link","label":"Treasury","href":"/docs/learn-polkadot-opengov-treasury","docId":"learn/learn-polkadot-opengov-treasury"},{"type":"category","label":"Tokens and Assets","description":"DOT Token, Asset Hub, and Teleports.","items":[{"type":"link","label":"Asset Hub","href":"/docs/learn-assets","docId":"learn/learn-assets"},{"type":"link","label":"DOT","href":"/docs/learn-DOT","docId":"learn/learn-DOT"},{"type":"link","label":"Token Inflation","href":"/docs/learn-inflation","docId":"learn/learn-inflation"},{"type":"link","label":"Teleporting Assets","href":"/docs/learn-teleport","docId":"learn/learn-teleport"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-assets-index"},{"type":"category","label":"NFTs","description":"Intro to NFTs and NFT Projects.","items":[{"type":"link","label":"Introduction to NFTs","href":"/docs/learn-nft","docId":"learn/learn-nft"},{"type":"link","label":"NFT Projects","href":"/docs/learn-nft-projects","docId":"learn/learn-nft-projects"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-nft-index"},{"type":"category","label":"Components","description":"OpenGov, Treasury, WASM, Runtime Upgrades, and more.","items":[{"type":"link","label":"Polkadot Host","href":"/docs/learn-polkadot-host","docId":"learn/learn-polkadot-host"},{"type":"link","label":"WebAssembly (Wasm)","href":"/docs/learn-wasm","docId":"learn/learn-wasm"},{"type":"link","label":"Runtime Upgrades","href":"/docs/learn-runtime-upgrades","docId":"learn/learn-runtime-upgrades"},{"type":"link","label":"Consensus","href":"/docs/learn-consensus","docId":"learn/learn-consensus"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-components-index"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-basics-index"},{"type":"category","label":"Advanced","description":"Advanced Concepts & Guides about Accounts, Staking, and NFTs.","items":[{"type":"link","label":"Accounts","href":"/docs/learn-account-advanced","docId":"learn/learn-account-advanced"},{"type":"link","label":"Advanced Staking Concepts","href":"/docs/learn-staking-advanced","docId":"learn/learn-staking-advanced"},{"type":"link","label":"NFT Pallets","href":"/docs/learn-nft-pallets","docId":"learn/learn-nft-pallets"},{"type":"link","label":"Cryptography","href":"/docs/learn-cryptography","docId":"learn/learn-cryptography"},{"type":"link","label":"NPoS Election Algorithms","href":"/docs/learn-phragmen","docId":"learn/learn-phragmen"},{"type":"category","label":"How-to Guides","description":"Advanced Guides about Staking, Asset Hub, Vault App, and more.","items":[{"type":"category","label":"Staking","description":"Advanced How-to Guides about Staking.","items":[{"type":"link","label":"Staking","href":"/docs/learn-guides-staking","docId":"learn/learn-guides-staking"},{"type":"link","label":"Nomination Pools","href":"/docs/learn-guides-staking-pools","docId":"learn/learn-guides-staking-pools"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-guides-staking-index"},{"type":"link","label":"OpenGov","href":"/docs/learn-guides-polkadot-opengov","docId":"learn/learn-guides-polkadot-opengov"},{"type":"link","label":"Treasury","href":"/docs/learn-guides-treasury","docId":"learn/learn-guides-treasury"},{"type":"link","label":"Identity","href":"/docs/learn-guides-identity","docId":"learn/learn-guides-identity"},{"type":"category","label":"Asset Hub","description":"Advanced How-to Guides about the Asset Hub.","items":[{"type":"link","label":"Creating Assets","href":"/docs/learn-guides-assets-create","docId":"learn/learn-guides-assets-create"},{"type":"link","label":"Asset Hub Ledger App","href":"/docs/learn-guides-assets-ledger","docId":"learn/learn-guides-assets-ledger"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-guides-assets-index"},{"type":"link","label":"Polkadot Vault","href":"/docs/learn-guides-vault","docId":"learn/learn-guides-vault"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-guides-index"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-advanced-index"},{"type":"category","label":"Architecture","description":"Nominators, Validators, Collators, Parachains, and more.","items":[{"type":"link","label":"Architecture","href":"/docs/learn-architecture","docId":"learn/learn-architecture"},{"type":"category","label":"Network Participants","description":"Participants in the Polkadot Ecosystem.","items":[{"type":"link","label":"Collator","href":"/docs/learn-collator","docId":"learn/learn-collator"},{"type":"link","label":"Nominator","href":"/docs/learn-nominator","docId":"learn/learn-nominator"},{"type":"link","label":"Validator","href":"/docs/learn-validator","docId":"learn/learn-validator"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-participants-index"},{"type":"category","label":"Parachains","description":"Parachains\' Protocol, Auctions, Crowdloans, and more.","items":[{"type":"link","label":"Introduction to Parachains","href":"/docs/learn-parachains","docId":"learn/learn-parachains"},{"type":"link","label":"Protocol Overview","href":"/docs/learn-parachains-protocol","docId":"learn/learn-parachains-protocol"},{"type":"link","label":"System Parachains","href":"/docs/learn-system-chains","docId":"learn/learn-system-chains"},{"type":"link","label":"Parachain Slot Auctions","href":"/docs/learn-auction","docId":"learn/learn-auction"},{"type":"link","label":"Parachain Crowdloans","href":"/docs/learn-crowdloans","docId":"learn/learn-crowdloans"},{"type":"link","label":"Parachains FAQ","href":"/docs/learn-parachains-faq","docId":"learn/learn-parachains-faq"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-parachains-index"},{"type":"link","label":"Bridges","href":"/docs/learn-bridges","docId":"learn/learn-bridges"},{"type":"category","label":"Cross Consensus Messaging (XCM)","description":"Polkadot\'s Cross-Consensus Messaging Format (XCM).","items":[{"type":"link","label":"Cross-Consensus Message Format (XCM)","href":"/docs/learn-xcm","docId":"learn/learn-xcm"},{"type":"link","label":"XCM Pallet","href":"/docs/learn-xcm-pallet","docId":"learn/learn-xcm-pallet"},{"type":"link","label":"XCM Use-cases","href":"/docs/learn-xcm-usecases","docId":"learn/learn-xcm-usecases"},{"type":"link","label":"XCM Transport","href":"/docs/learn-xcm-transport","docId":"learn/learn-xcm-transport"},{"type":"link","label":"XCM Virtual Machine (XCVM)","href":"/docs/learn-xcvm","docId":"learn/learn-xcvm"},{"type":"link","label":"XCM Instructions","href":"/docs/learn-xcm-instructions","docId":"learn/learn-xcm-instructions"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-xcm-index"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-architecture-index"},{"type":"category","label":"XCM Docs","description":"In-depth documentation about the Polkadot\'s Cross-Chain Messaging (XCM).","items":[{"type":"link","label":"XCM: Cross-Consensus Messaging","href":"/docs/learn/xcm/introduction","docId":"learn/xcm/learn-xcm-docs-intro"},{"type":"category","label":"Overview","description":"Overview of the XCM Documentation.","items":[{"type":"link","label":"Summary","href":"/docs/learn/xcm/overview-summary","docId":"learn/xcm/overview/learn-xcm-docs-overview-summary"},{"type":"link","label":"Introduction","href":"/docs/learn/xcm/overview-intro","docId":"learn/xcm/overview/learn-xcm-docs-overview-intro"},{"type":"link","label":"A Format, not a Protocol","href":"/docs/learn/xcm/overview-format","docId":"learn/xcm/overview/learn-xcm-docs-overview-format"},{"type":"link","label":"The XCVM","href":"/docs/learn/xcm/overview-xcvm","docId":"learn/xcm/overview/learn-xcm-docs-overview-xcvm"},{"type":"link","label":"Architecture","href":"/docs/learn/xcm/overview-architecture","docId":"learn/xcm/overview/learn-xcm-docs-overview-architecture"}],"collapsed":true,"collapsible":true,"href":"/docs/learn/xcm/overview"},{"type":"category","label":"Quickstart","description":"Start Diving into XCM.","items":[{"type":"link","label":"Summary","href":"/docs/learn/xcm/quickstart-summary","docId":"learn/xcm/quickstart/learn-xcm-docs-quickstart-summary"},{"type":"link","label":"XCM Simulator","href":"/docs/learn/xcm/quickstart-simulator","docId":"learn/xcm/quickstart/learn-xcm-docs-quickstart-simulator"},{"type":"link","label":"First Look at an XCM","href":"/docs/learn/xcm/quickstart-first-look","docId":"learn/xcm/quickstart/learn-xcm-docs-quickstart-first-look"}],"collapsed":true,"collapsible":true,"href":"/docs/learn/xcm/quickstart"},{"type":"category","label":"Fundamentals","description":"Fundamental Concepts about XCM.","items":[{"type":"link","label":"Summary","href":"/docs/learn/xcm/fundamentals-summary","docId":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-summary"},{"type":"category","label":"MultiLocation","description":"The MultiLocation Type.","items":[{"type":"link","label":"Summary","href":"/docs/learn/xcm/fundamentals/multilocation-summary","docId":"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-summary"},{"type":"link","label":"Junction(s)","href":"/docs/learn/xcm/fundamentals/multilocation-junctions","docId":"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-junctions"},{"type":"link","label":"Example","href":"/docs/learn/xcm/fundamentals/multilocation-example","docId":"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-example"}],"collapsed":true,"collapsible":true,"href":"/docs/learn/xcm/fundamentals/multilocation"},{"type":"link","label":"MultiAsset","href":"/docs/learn/xcm/fundamentals-multiasset","docId":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-multiasset"},{"type":"link","label":"XCVM","href":"/docs/learn/xcm/fundamentals-xcvm","docId":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-xcvm"},{"type":"link","label":"Weight and Fees","href":"/docs/learn/xcm/fundamentals-fees","docId":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-fees"}],"collapsed":true,"collapsible":true,"href":"/docs/learn/xcm/fundamentals"},{"type":"category","label":"A Journey through XCM","description":"A Practical Introduction to the XCM Features","items":[{"type":"link","label":"Summary","href":"/docs/learn/xcm/journey-summary","docId":"learn/xcm/journey/learn-xcm-docs-journey-summary"},{"type":"category","label":"Transfers","description":"Transferring Assets between Consensus Systems with XCM.","items":[{"type":"link","label":"Summary","href":"/docs/learn/xcm/journey/transfers-summary","docId":"learn/xcm/journey/transfers/learn-xcm-docs-transfers-summary"},{"type":"link","label":"Asset Teleportation","href":"/docs/learn/xcm/journey/transfers-teleport","docId":"learn/xcm/journey/transfers/learn-xcm-docs-transfers-teleport"},{"type":"link","label":"Reserve-backed Transfers","href":"/docs/learn/xcm/journey/transfers-reserve","docId":"learn/xcm/journey/transfers/learn-xcm-docs-transfers-reserve"}],"collapsed":true,"collapsible":true,"href":"/docs/learn/xcm/journey/transfers"},{"type":"link","label":"Fee Handling","href":"/docs/learn/xcm/journey-fees","docId":"learn/xcm/journey/learn-xcm-docs-journey-fees"},{"type":"link","label":"Transact: A General Solution","href":"/docs/learn/xcm/journey-transact","docId":"learn/xcm/journey/learn-xcm-docs-journey-transact"},{"type":"link","label":"Origin Manipulation","href":"/docs/learn/xcm/journey-origin","docId":"learn/xcm/journey/learn-xcm-docs-journey-origin"},{"type":"link","label":"More Register Modifiers","href":"/docs/learn/xcm/journey-register","docId":"learn/xcm/journey/learn-xcm-docs-journey-register"},{"type":"link","label":"More Holding Modifiers","href":"/docs/learn/xcm/journey-holding","docId":"learn/xcm/journey/learn-xcm-docs-journey-holding"},{"type":"link","label":"Trap and Claim Assets","href":"/docs/learn/xcm/journey-assets","docId":"learn/xcm/journey/learn-xcm-docs-journey-assets"},{"type":"link","label":"Expectations","href":"/docs/learn/xcm/journey-expectations","docId":"learn/xcm/journey/learn-xcm-docs-journey-expectations"},{"type":"link","label":"Queries","href":"/docs/learn/xcm/journey-queries","docId":"learn/xcm/journey/learn-xcm-docs-journey-queries"},{"type":"link","label":"Version Subscription","href":"/docs/learn/xcm/journey-version","docId":"learn/xcm/journey/learn-xcm-docs-journey-version"},{"type":"link","label":"Locks","href":"/docs/learn/xcm/journey-locks","docId":"learn/xcm/journey/locks/learn-xcm-docs-journey-locks"},{"type":"link","label":"Channels and Bridges","href":"/docs/learn/xcm/journey-channels","docId":"learn/xcm/journey/learn-xcm-docs-journey-channels"}],"collapsed":true,"collapsible":true,"href":"/docs/learn/xcm/journey"},{"type":"link","label":"Executor Configuration","href":"/docs/learn/xcm/config-deep-dive","docId":"learn/xcm/executor_config/learn-xcm-docs-config-deep-dive"},{"type":"link","label":"Testing","href":"/docs/learn/xcm/testing","docId":"learn/xcm/learn-xcm-docs-testing"},{"type":"category","label":"References","description":"XCVM Registers and Glossary","items":[{"type":"link","label":"All XCVM Registers","href":"/docs/learn/xcm/reference-xcvm-registers","docId":"learn/xcm/reference/learn-xcm-docs-reference-xcvm-registers"},{"type":"link","label":"Glossary","href":"/docs/learn/xcm/reference-glossary","docId":"learn/xcm/reference/learn-xcm-docs-reference-glossary"}],"collapsed":true,"collapsible":true,"href":"/docs/learn/xcm/references"}],"collapsed":true,"collapsible":true,"href":"/docs/learn/xcm"},{"type":"category","label":"Polkadot Comparisons","description":"Comparison between Polkadot and other Networks. ","items":[{"type":"link","label":"Kusama","href":"/docs/learn-comparisons-kusama","docId":"learn/learn-comparisons-kusama"},{"type":"link","label":"Ethereum","href":"/docs/learn-comparisons-ethereum-2","docId":"learn/learn-comparisons-ethereum-2"},{"type":"link","label":"Cosmos","href":"/docs/learn-comparisons-cosmos","docId":"learn/learn-comparisons-cosmos"},{"type":"link","label":"Avalanche","href":"/docs/learn-comparisons-avalanche","docId":"learn/learn-comparisons-avalanche"},{"type":"link","label":"Other Comparisons","href":"/docs/learn-comparisons","docId":"learn/learn-comparisons"},{"type":"link","label":"Layer Two and Rollups","href":"/docs/learn-comparisons-rollups","docId":"learn/learn-comparisons-rollups"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-comparisons-index"},{"type":"link","label":"Videos","href":"/docs/learn-video-tutorials","docId":"learn/learn-video-tutorials"},{"type":"category","label":"Future Implementations","description":"Implementations that will be deployed on Polkadot.","items":[{"type":"link","label":"SPREE","href":"/docs/learn-spree","docId":"learn/learn-spree"},{"type":"link","label":"Parathreads","href":"/docs/learn-parathreads","docId":"learn/learn-parathreads"},{"type":"link","label":"Asynchronous Backing","href":"/docs/learn-async-backing","docId":"learn/learn-async-backing"},{"type":"link","label":"SASSAFRAS","href":"/docs/learn-sassafras","docId":"learn/learn-sassafras"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-future-implementations-index"},{"type":"category","label":"Archive","description":"Implementations no longer live on Polkadot.","items":[{"type":"link","label":"Governance V1","href":"/docs/learn-governance","docId":"learn/learn-governance"},{"type":"link","label":"Gov1 Treasury","href":"/docs/learn-treasury","docId":"learn/learn-treasury"},{"type":"link","label":"Polkadot Launch Phases","href":"/docs/learn-launch","docId":"learn/learn-launch"},{"type":"link","label":"Redenomination of DOT","href":"/docs/learn-redenomination","docId":"learn/learn-redenomination"},{"type":"link","label":"Controller Accounts","href":"/docs/learn-controller","docId":"learn/learn-controller"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-archive-index"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-index"},{"type":"category","label":"Build","items":[{"type":"link","label":"Builder\'s Guides","href":"/docs/build-index","docId":"build/build-index"},{"type":"category","label":"Development Guide","items":[{"type":"link","label":"Builders Starter\'s Guide","href":"/docs/build-guide","docId":"build/build-guide"},{"type":"link","label":"Parachain Development","href":"/docs/build-pdk","docId":"build/build-parachains"},{"type":"link","label":"Decentralized Storage","href":"/docs/build-storage","docId":"build/build-storage"},{"type":"link","label":"Smart Contracts","href":"/docs/build-smart-contracts","docId":"build/build-smart-contracts"},{"type":"link","label":"Oracles","href":"/docs/build-oracle","docId":"build/build-oracle"},{"type":"link","label":"Data","href":"/docs/build-data","docId":"build/build-data"},{"type":"link","label":"Substrate Connect","href":"/docs/build-substrate","docId":"build/build-substrate"},{"type":"link","label":"SS58 Registry","href":"/docs/build-ss58-registry","docId":"build/build-ss58-registry"},{"type":"link","label":"Opening HRMP Channels","href":"/docs/build-hrmp-channels","docId":"build/build-hrmp-channels"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Integration Guide","items":[{"type":"link","label":"Integration Initiation","href":"/docs/build-integration","docId":"build/build-integration"},{"type":"link","label":"Polkadot Protocol","href":"/docs/build-protocol-info","docId":"build/build-protocol-info"},{"type":"link","label":"Integrating Assets","href":"/docs/build-integrate-assets","docId":"build/build-integrate-assets"},{"type":"link","label":"Node Management","href":"/docs/build-node-management","docId":"build/build-node-management"},{"type":"link","label":"Node Interaction","href":"/docs/build-node-interaction","docId":"build/build-node-interaction"},{"type":"link","label":"Transaction Construction","href":"/docs/build-transaction-construction","docId":"build/build-transaction-construction"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Tools","items":[{"type":"link","label":"Tool Index","href":"/docs/build-tools-index","docId":"build/build-tools-index"},{"type":"link","label":"Open Source Stack","href":"/docs/build-open-source","docId":"build/build-open-source"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Resources","items":[{"type":"link","label":"Hackathons","href":"/docs/build-hackathon","docId":"build/build-hackathon"}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Maintain","items":[{"type":"link","label":"Network Maintainers","href":"/docs/maintain-index","docId":"maintain/maintain-index"},{"type":"link","label":"Parameters","href":"/docs/maintain-polkadot-parameters","docId":"maintain/maintain-polkadot-parameters"},{"type":"link","label":"Node Endpoints","href":"/docs/maintain-endpoints","docId":"maintain/maintain-endpoints"},{"type":"category","label":"Nodes and Dapps","items":[{"type":"link","label":"Set up a Full Node","href":"/docs/maintain-sync","docId":"maintain/maintain-sync"},{"type":"link","label":"Set up a Boot Node","href":"/docs/maintain-bootnode","docId":"maintain/maintain-bootnode"},{"type":"link","label":"Set up a RPC node","href":"/docs/maintain-rpc","docId":"maintain/maintain-rpc"},{"type":"link","label":"Secure the WebSocket","href":"/docs/maintain-wss","docId":"maintain/maintain-wss"},{"type":"link","label":"Networks","href":"/docs/maintain-networks","docId":"maintain/maintain-networks"},{"type":"link","label":"Resolving Errors","href":"/docs/maintain-errors","docId":"maintain/maintain-errors"}],"collapsed":true,"collapsible":true},{"type":"link","label":"Nominator Guides","href":"/docs/maintain-guides-how-to-nominate-polkadot","docId":"maintain/maintain-guides-how-to-nominate-polkadot"},{"type":"category","label":"Validator Guides","items":[{"type":"link","label":"How to run a Validator on Polkadot","href":"/docs/maintain-guides-how-to-validate-polkadot","docId":"maintain/maintain-guides-how-to-validate-polkadot"},{"type":"link","label":"Validator Payout Overview","href":"/docs/maintain-guides-validator-payout","docId":"maintain/maintain-guides-validator-payout"},{"type":"link","label":"Using systemd for a Validator Node","href":"/docs/maintain-guides-how-to-systemd","docId":"maintain/maintain-guides-how-to-systemd"},{"type":"link","label":"Secure Validator","href":"/docs/maintain-guides-secure-validator","docId":"maintain/maintain-guides-secure-validator"},{"type":"link","label":"How to Upgrade Your Validator","href":"/docs/maintain-guides-how-to-upgrade","docId":"maintain/maintain-guides-how-to-upgrade"},{"type":"link","label":"Monitor your node","href":"/docs/maintain-guides-how-to-monitor-your-node","docId":"maintain/maintain-guides-how-to-monitor-your-node"},{"type":"link","label":"How to Chill","href":"/docs/maintain-guides-how-to-chill","docId":"maintain/maintain-guides-how-to-chill"},{"type":"link","label":"How to Stop Validating","href":"/docs/maintain-guides-how-to-stop-validating","docId":"maintain/maintain-guides-how-to-stop-validating"},{"type":"link","label":"Validator Community Overview","href":"/docs/maintain-guides-validator-community","docId":"maintain/doc-maintain-guides-validator-community"},{"type":"link","label":"Validator Best Practices","href":"/docs/maintain-guides-avoid-slashing","docId":"maintain/maintain-guides-avoid-slashing"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Governance Guides","items":[{"type":"link","label":"Participate in Democracy","href":"/docs/maintain-guides-democracy","docId":"maintain/maintain-guides-democracy"},{"type":"link","label":"Participate in Polkadot OpenGov","href":"/docs/maintain-guides-polkadot-opengov","docId":"maintain/maintain-guides-polkadot-opengov"},{"type":"link","label":"Join the Council","href":"/docs/maintain-guides-how-to-join-council","docId":"maintain/maintain-guides-how-to-join-council"},{"type":"link","label":"Voting for Councillors","href":"/docs/maintain-guides-how-to-vote-councillor","docId":"maintain/maintain-guides-how-to-vote-councillor"}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true}]},"docs":{"build/build-data":{"id":"build/build-data","title":"Data Analytics","description":"An overview about building with data analytics","sidebar":"docs"},"build/build-guide":{"id":"build/build-guide","title":"Builders Starter\'s Guide","description":"Start building with Polkadot/Kusama.","sidebar":"docs"},"build/build-hackathon":{"id":"build/build-hackathon","title":"Hackathons","description":"Join or host a Hackathon.","sidebar":"docs"},"build/build-hrmp-channels":{"id":"build/build-hrmp-channels","title":"Opening HRMP Channels","description":"Steps on how to open HRMP channels between parachains.","sidebar":"docs"},"build/build-index":{"id":"build/build-index","title":"Builder\'s Guides","description":"Reference point for the Polkadot builder guides.","sidebar":"docs"},"build/build-integrate-assets":{"id":"build/build-integrate-assets","title":"Assets on Polkadot","description":"Tools that you can use to integrating assets.","sidebar":"docs"},"build/build-integration":{"id":"build/build-integration","title":"Polkadot Integration Guide","description":"Reference point for the Polkadot integration guides.","sidebar":"docs"},"build/build-node-interaction":{"id":"build/build-node-interaction","title":"Node Interaction","description":"Tools for node interaction.","sidebar":"docs"},"build/build-node-management":{"id":"build/build-node-management","title":"Node Management","description":"Steps on how to manage your Polkadot node.","sidebar":"docs"},"build/build-open-source":{"id":"build/build-open-source","title":"Open Source Stack","description":"Overview of the open source Polkadot/Kusama Tech Stack","sidebar":"docs"},"build/build-oracle":{"id":"build/build-oracle","title":"Oracles","description":"Information about building with oracles.","sidebar":"docs"},"build/build-parachains":{"id":"build/build-parachains","title":"Parachain Development","description":"A guide on what it means to become a Parachain and the steps to do so.","sidebar":"docs"},"build/build-protocol-info":{"id":"build/build-protocol-info","title":"Polkadot Protocol Information","description":"Characteristics about the Polkadot protocol, and what you need to consider when building.","sidebar":"docs"},"build/build-smart-contracts":{"id":"build/build-smart-contracts","title":"Smart Contracts","description":"How smart contracts play their role in the Polkadot ecosystem.","sidebar":"docs"},"build/build-ss58-registry":{"id":"build/build-ss58-registry","title":"SS58 Registry","description":"Information about SS58 encoding.","sidebar":"docs"},"build/build-storage":{"id":"build/build-storage","title":"Decentralized Storage","description":"Information about building with decentralized storage.","sidebar":"docs"},"build/build-substrate":{"id":"build/build-substrate","title":"Substrate Connect","description":"Information about Substrate Connect.","sidebar":"docs"},"build/build-tools-index":{"id":"build/build-tools-index","title":"Tool Index","description":"Reference point for a list of tools to support your development.","sidebar":"docs"},"build/build-transaction-construction":{"id":"build/build-transaction-construction","title":"Transaction Construction and Signing","description":"Information about how transactions are constructed on Polkadot.","sidebar":"docs"},"general/ambassadors":{"id":"general/ambassadors","title":"Polkadot Ambassador Programme","description":"The Polkadot\'s Ambassador Program and How you can Participate in It.","sidebar":"docs"},"general/bug-bounty":{"id":"general/bug-bounty","title":"Bug Bounty Programme","description":"An Overview of How you can Help Catch Bugs.","sidebar":"docs"},"general/builders-program":{"id":"general/builders-program","title":"Substrate Builders Programme","description":"The Substrate Builders Program and How it can Support your Substrate Development.","sidebar":"docs"},"general/community":{"id":"general/community","title":"Community","description":"Connect and stay updated with the Polkadot Community.","sidebar":"docs"},"general/contributing":{"id":"general/contributing","title":"Contributing to the Polkadot Wiki","description":"Contribute to the Polkadot Wiki.","sidebar":"docs"},"general/contributors":{"id":"general/contributors","title":"Contributors","description":"Get to know your Wiki-slayers.","sidebar":"docs"},"general/dev-heroes":{"id":"general/dev-heroes","title":"Developer Heroes Programme","description":"More Power to Polkadot\'s Developers.","sidebar":"docs"},"general/doc-thousand-contributors":{"id":"general/doc-thousand-contributors","title":"Thousand Contributors Programme","description":"The Thousand Contributors Program and How it can Support your Contributions.","sidebar":"docs"},"general/doc-thousand-validators":{"id":"general/doc-thousand-validators","title":"Thousand Validators Programme","description":"The Thousand Validators Program and How it can Support your Validator Endeavors.","sidebar":"docs"},"general/faq":{"id":"general/faq","title":"Frequently Asked Questions (FAQs)","description":"FAQs to Help you Navigate on Polkadot.","sidebar":"docs"},"general/getting-started":{"id":"general/getting-started","title":"Getting Started","description":"Get started with Polkadot and Web3.","sidebar":"docs"},"general/glossary":{"id":"general/glossary","title":"Glossary","description":"Common Terms and Concepts in the Polkadot Ecosystem.","sidebar":"docs"},"general/grants":{"id":"general/grants","title":"Grants","description":"The Grant Programs in the Polkadot Ecosystem.","sidebar":"docs"},"general/how-to-dyor":{"id":"general/how-to-dyor","title":"How to Do Your Own Research (DYOR)","description":"Importance of Doing Your Own Research (DYOR).","sidebar":"docs"},"general/kusama/kusama-adversarial-cheatsheet":{"id":"general/kusama/kusama-adversarial-cheatsheet","title":"Adversarial Cheatsheet","description":"A cheatsheet to help you create chaos."},"general/kusama/kusama-bug-bounty":{"id":"general/kusama/kusama-bug-bounty","title":"Bug Bounty","description":"An overview of how you can help catch bugs."},"general/kusama/kusama-claims":{"id":"general/kusama/kusama-claims","title":"Kusama Claims","description":"Step-by-step guide on how to claim your KSM tokens."},"general/kusama/kusama-coc":{"id":"general/kusama/kusama-coc","title":"Kusama Code of Conduct","description":"Kusama\'s Code of Conduct to sustain chaos."},"general/kusama/kusama-community":{"id":"general/kusama/kusama-community","title":"Kusama Community","description":"Stay in-touch and keep up-to-date by interacting and engaging in the Kusama community."},"general/kusama/kusama-getting-started":{"id":"general/kusama/kusama-getting-started","title":"Interact with Kusama","description":"Reference point for Kusama content."},"general/kusama/kusama-index":{"id":"general/kusama/kusama-index","title":"Kusama","description":"Legacy link to Kusama Wiki document"},"general/kusama/kusama-parameters":{"id":"general/kusama/kusama-parameters","title":"Kusama Parameters","description":"Learn about common Kusama parameters"},"general/kusama/kusama-social-recovery":{"id":"general/kusama/kusama-social-recovery","title":"Social Recovery","description":"Steps on how to perform account recovery on Kusama."},"general/kusama/kusama-timeline":{"id":"general/kusama/kusama-timeline","title":"Kusama Timeline","description":"Stay up-to-date with the latest action on Kusama."},"general/ledger":{"id":"general/ledger","title":"Using the Polkadot & Kusama Ledger Applications","description":"Use the Polkadot Ledger Application.","sidebar":"docs"},"general/metadata":{"id":"general/metadata","title":"Metadata Explorer","description":"Visualize Metadata and related Documentation.","sidebar":"docs"},"general/polkadot-direction":{"id":"general/polkadot-direction","title":"Polkadot Direction","description":"Polkadot as a Decentralized and Secure Ubiquitous Computer.","sidebar":"docs"},"general/polkadot-v1":{"id":"general/polkadot-v1","title":"Polkadot 1.0","description":"Polkadot\'s 1.0, Blockspace, Decentralization and Resilience.","sidebar":"docs"},"general/polkadot-vault":{"id":"general/polkadot-vault","title":"Polkadot Vault (formerly Parity Signer)","description":"Your old Smartphone as an Air-gapped Wallet.","sidebar":"docs"},"general/polkadotjs":{"id":"general/polkadotjs","title":"Polkadot-JS","description":"The Polkadot-JS Tool Collection.","sidebar":"docs"},"general/polkadotjs-ui":{"id":"general/polkadotjs-ui","title":"Polkadot-JS UI (Wallet)","description":"A Wallet for Power-users and Developers.","sidebar":"docs"},"general/research":{"id":"general/research","title":"Research Pages","description":"Latest Research Developments on Polkadot.","sidebar":"docs"},"general/scams":{"id":"general/scams","title":"How to Protect Yourself from Scams","description":"How to Protect yourself against Scams.","sidebar":"docs"},"general/staking-dashboard":{"id":"general/staking-dashboard","title":"Polkadot Staking Dashboard","description":"Everything about the Polkadot Staking Dashboard.","sidebar":"docs"},"general/start-building":{"id":"general/start-building","title":"Build on Polkadot","description":"Start Building with the Polkadot SDK.","sidebar":"docs"},"general/wallets-and-extensions":{"id":"general/wallets-and-extensions","title":"Wallets and Extensions","description":"An Overview of Wallets and Browser Extensions in the Polkadot Ecosystem.","sidebar":"docs"},"general/web3-and-polkadot":{"id":"general/web3-and-polkadot","title":"Web3 and Polkadot","description":"Introduction to Web3 and Polkadot\'s Role in shaping the Web3 Vision.","sidebar":"docs"},"learn/learn-account-abstraction":{"id":"learn/learn-account-abstraction","title":"Polkadot\'s Account Abstraction","description":"Polkadot\'s Native Account Abstraction.","sidebar":"docs"},"learn/learn-account-advanced":{"id":"learn/learn-account-advanced","title":"Polkadot Accounts In-Depth","description":"Advanced Concepts about Polkadot\'s Accounts.","sidebar":"docs"},"learn/learn-account-generation":{"id":"learn/learn-account-generation","title":"Account Generation","description":"Generate a Polkadot Basic Account.","sidebar":"docs"},"learn/learn-account-multisig":{"id":"learn/learn-account-multisig","title":"Multi-Signature Accounts","description":"Multi-signature Accounts on Polkadot.","sidebar":"docs"},"learn/learn-accounts":{"id":"learn/learn-accounts","title":"Polkadot Accounts","description":"Polkadot Accounts, Account Identity, and Account Reaping.","sidebar":"docs"},"learn/learn-architecture":{"id":"learn/learn-architecture","title":"Architecture","description":"Key Components to Polkadot\'s Architecture.","sidebar":"docs"},"learn/learn-assets":{"id":"learn/learn-assets","title":"Asset Hub","description":"Fungible Tokens and NFTs on Polkadot.","sidebar":"docs"},"learn/learn-async-backing":{"id":"learn/learn-async-backing","title":"Asynchronous Backing","description":"A brief overview of asynchronous backing, and how it affects Polkadot\'s scalability.","sidebar":"docs"},"learn/learn-auction":{"id":"learn/learn-auction","title":"Parachain Slot Auctions","description":"Polkadot\'s Parachain Slot Auction Mechanism.","sidebar":"docs"},"learn/learn-balance-transfers":{"id":"learn/learn-balance-transfers","title":"Balance Transfers","description":"Perform Balance Transfers between Accounts.","sidebar":"docs"},"learn/learn-bridges":{"id":"learn/learn-bridges","title":"Bridges","description":"Bridges and Examples of Common Bridges.","sidebar":"docs"},"learn/learn-collator":{"id":"learn/learn-collator","title":"Collator","description":"Role of Collators within the Polkadot Ecosystem.","sidebar":"docs"},"learn/learn-comparisons":{"id":"learn/learn-comparisons","title":"Polkadot Comparisons","description":"Comparison between Polkadot and ETH 1.0 and BSC.","sidebar":"docs"},"learn/learn-comparisons-avalanche":{"id":"learn/learn-comparisons-avalanche","title":"Polkadot vs. Avalanche","description":"Comparison between Polkadot and Avalanche.","sidebar":"docs"},"learn/learn-comparisons-cosmos":{"id":"learn/learn-comparisons-cosmos","title":"Polkadot vs. Cosmos","description":"Comparison between Polkadot and Cosmos.","sidebar":"docs"},"learn/learn-comparisons-ethereum-2":{"id":"learn/learn-comparisons-ethereum-2","title":"Polkadot vs. Ethereum","description":"Comparison between Polkadot and Ethereum.","sidebar":"docs"},"learn/learn-comparisons-kusama":{"id":"learn/learn-comparisons-kusama","title":"Polkadot vs. Kusama","description":"Comparing the cousins.","sidebar":"docs"},"learn/learn-comparisons-rollups":{"id":"learn/learn-comparisons-rollups","title":"Layer Two and Rollups","description":"Comparison between various Rollup and L2 Protocols.","sidebar":"docs"},"learn/learn-consensus":{"id":"learn/learn-consensus","title":"Polkadot Consensus","description":"The Consensus Mechanism of Polkadot.","sidebar":"docs"},"learn/learn-controller":{"id":"learn/learn-controller","title":"Controller Accounts","description":"Controller Accounts used in Staking.","sidebar":"docs"},"learn/learn-crowdloans":{"id":"learn/learn-crowdloans","title":"Parachain Crowdloans","description":"Polkadot\'s Crowdloans and How to Participate.","sidebar":"docs"},"learn/learn-cryptography":{"id":"learn/learn-cryptography","title":"Cryptography on Polkadot","description":"Cryptographic Functions used in Polkadot.","sidebar":"docs"},"learn/learn-DOT":{"id":"learn/learn-DOT","title":"DOT","description":"Tokenomics of Polkadot\'s Native Token DOT.","sidebar":"docs"},"learn/learn-extrinsics":{"id":"learn/learn-extrinsics","title":"Extrinsics (a.k.a. Types of Transactions)","description":"Types of Transactions on Polkadot.","sidebar":"docs"},"learn/learn-governance":{"id":"learn/learn-governance","title":"Governance V1","description":"Polkadot\'s First Governance Model.","sidebar":"docs"},"learn/learn-guides-assets-create":{"id":"learn/learn-guides-assets-create","title":"Creating Assets with the Asset Hub","description":"Advanced How-to Guides about Creating Assets.","sidebar":"docs"},"learn/learn-guides-assets-ledger":{"id":"learn/learn-guides-assets-ledger","title":"Using the Asset Hub Ledger App","description":"Advanced How-to Guides about Ledger and the Asset Hub.","sidebar":"docs"},"learn/learn-guides-identity":{"id":"learn/learn-guides-identity","title":"Identity How-to Guides","description":"Advanced How-to Guides about Identity - Registrars and Sub-Identity.","sidebar":"docs"},"learn/learn-guides-polkadot-opengov":{"id":"learn/learn-guides-polkadot-opengov","title":"Polkadot OpenGov How-to Guides","description":"Advanced How-to Guides about Polkadot OpenGov.","sidebar":"docs"},"learn/learn-guides-staking":{"id":"learn/learn-guides-staking","title":"How-to Guides for Nominators","description":"Advanced How-to Guides for Nominators.","sidebar":"docs"},"learn/learn-guides-staking-pools":{"id":"learn/learn-guides-staking-pools","title":"Nomination Pools How-to Guides","description":"Advanced How-to Guides about Nomination Pools.","sidebar":"docs"},"learn/learn-guides-treasury":{"id":"learn/learn-guides-treasury","title":"Polkadot Treasury How-to Guides","description":"Advanced How-to Guides about requesting funds from the Polkadot Treasury.","sidebar":"docs"},"learn/learn-guides-vault":{"id":"learn/learn-guides-vault","title":"Vault How-to Guides","description":"Advanced How-to Guides about Polkadot Vault.","sidebar":"docs"},"learn/learn-identity":{"id":"learn/learn-identity","title":"Account Identity","description":"On-chain Identity, Judgements and Registrars.","sidebar":"docs"},"learn/learn-implementations":{"id":"learn/learn-implementations","title":"Polkadot Implementations","description":"Learn about the different Polkadot implementations."},"learn/learn-inflation":{"id":"learn/learn-inflation","title":"Token Inflation","description":"Explanation of Token\'s Inflation in the Polkadot Ecosystem.","sidebar":"docs"},"learn/learn-launch":{"id":"learn/learn-launch","title":"Polkadot Launch Phases","description":"Polkadot\'s Launch Process and its Individual Phases.","sidebar":"docs"},"learn/learn-nft":{"id":"learn/learn-nft","title":"NFTs","description":"The NFT Landscape of the Polkadot Ecosystem.","sidebar":"docs"},"learn/learn-nft-pallets":{"id":"learn/learn-nft-pallets","title":"NFT Pallets","description":"Functionalities of the NFT Pallets in the Polkadot Ecosystem.","sidebar":"docs"},"learn/learn-nft-projects":{"id":"learn/learn-nft-projects","title":"NFT projects on Polkadot and Kusama","description":"NFT Projects in the Polkadot Ecosystem.","sidebar":"docs"},"learn/learn-nomination-pools":{"id":"learn/learn-nomination-pools","title":"Nomination Pools","description":"Staking through Polkadot\'s Nomination Pools.","sidebar":"docs"},"learn/learn-nominator":{"id":"learn/learn-nominator","title":"Nominator","description":"Role of Nominators in the Polkadot Ecosystem.","sidebar":"docs"},"learn/learn-parachains":{"id":"learn/learn-parachains","title":"Parachains","description":"An Introduction to Polkadot\'s Parachains.","sidebar":"docs"},"learn/learn-parachains-faq":{"id":"learn/learn-parachains-faq","title":"Parachains FAQ","description":"Parachains FAQ.","sidebar":"docs"},"learn/learn-parachains-protocol":{"id":"learn/learn-parachains-protocol","title":"Parachains\' Protocol Overview","description":"Actors and Protocols involved in Polkadot and its Parachains\' Block Finality.","sidebar":"docs"},"learn/learn-parathreads":{"id":"learn/learn-parathreads","title":"Parathreads","description":"An Introductory Guide to Parathreads.","sidebar":"docs"},"learn/learn-phragmen":{"id":"learn/learn-phragmen","title":"NPoS Election Algorithms","description":"The Election Methods used in Polkadot\'s NPoS Mechanism.","sidebar":"docs"},"learn/learn-polkadot-host":{"id":"learn/learn-polkadot-host","title":"Polkadot Host (PH)","description":"The Polkadot Host and its Components.","sidebar":"docs"},"learn/learn-polkadot-opengov":{"id":"learn/learn-polkadot-opengov","title":"Polkadot OpenGov","description":"Polkadot\u2019s Latest Model for Decentralized Governance.","sidebar":"docs"},"learn/learn-polkadot-opengov-treasury":{"id":"learn/learn-polkadot-opengov-treasury","title":"Treasury","description":"Polkadot\'s On-chain Treasury.","sidebar":"docs"},"learn/learn-proxies":{"id":"learn/learn-proxies","title":"Proxy Accounts","description":"Proxy Accounts on Polkadot.","sidebar":"docs"},"learn/learn-proxies-pure":{"id":"learn/learn-proxies-pure","title":"Pure Proxy Accounts","description":"Pure Proxy Accounts on Polkadot.","sidebar":"docs"},"learn/learn-redenomination":{"id":"learn/learn-redenomination","title":"Redenomination of DOT","description":"Everything about the DOT Token Redenomination.","sidebar":"docs"},"learn/learn-runtime-upgrades":{"id":"learn/learn-runtime-upgrades","title":"Runtime Upgrades","description":"Forkless Runtime Upgrades on Polkadot.","sidebar":"docs"},"learn/learn-sassafras":{"id":"learn/learn-sassafras","title":"Polkadot Block Production: SASSAFRAS","description":"The Consensus Mechanism of Polkadot.","sidebar":"docs"},"learn/learn-spree":{"id":"learn/learn-spree","title":"SPREE","description":"Fundamentals of SPREE.","sidebar":"docs"},"learn/learn-staking":{"id":"learn/learn-staking","title":"Introduction to Staking","description":"Overview of Staking and NPoS on Polkadot.","sidebar":"docs"},"learn/learn-staking-advanced":{"id":"learn/learn-staking-advanced","title":"Advanced Staking Concepts","description":"Advanced Concepts about Staking on Polkadot.","sidebar":"docs"},"learn/learn-system-chains":{"id":"learn/learn-system-chains","title":"System Parachains","description":"System Parachains currently deployed on Polkadot.","sidebar":"docs"},"learn/learn-teleport":{"id":"learn/learn-teleport","title":"Teleporting Assets","description":"Teleport Assets between Parachains and Relay Chain.","sidebar":"docs"},"learn/learn-transaction-fees":{"id":"learn/learn-transaction-fees","title":"Transaction Fees","description":"How Transaction Fees are Calculated and Handled.","sidebar":"docs"},"learn/learn-treasury":{"id":"learn/learn-treasury","title":"Governance v1 Treasury","description":"The Polkadot\'s On-chain Treasury during Gov1.","sidebar":"docs"},"learn/learn-validator":{"id":"learn/learn-validator","title":"Validator","description":"Role of Validators within the Polkadot Ecosystem.","sidebar":"docs"},"learn/learn-video-tutorials":{"id":"learn/learn-video-tutorials","title":"Videos about Polkadot","description":"Videos about Polkadot and Related Topics.","sidebar":"docs"},"learn/learn-wasm":{"id":"learn/learn-wasm","title":"WebAssembly (Wasm)","description":"WASM and its Role in Polkadot\'s Runtime.","sidebar":"docs"},"learn/learn-xcm":{"id":"learn/learn-xcm","title":"Introduction to Cross-Consensus Message Format (XCM)","description":"XCM, The Messaging Format at the Forefront of Interoperability.","sidebar":"docs"},"learn/learn-xcm-instructions":{"id":"learn/learn-xcm-instructions","title":"XCM Instructions & Register Specification","description":"Specification for Instructions and Registers for the XCM Format.","sidebar":"docs"},"learn/learn-xcm-pallet":{"id":"learn/learn-xcm-pallet","title":"XCM FRAME Pallet Overview","description":"Mechanics of the XCM Pallet and its role in Polkadot\'s Ecosystem.","sidebar":"docs"},"learn/learn-xcm-transport":{"id":"learn/learn-xcm-transport","title":"XCM Transport Methods (XCMP, HRMP, VMP)","description":"Methods to send XCM Messages across Networks.","sidebar":"docs"},"learn/learn-xcm-usecases":{"id":"learn/learn-xcm-usecases","title":"XCM Use-cases & Examples","description":"Cross-consensus Interactions and the XCM Format.","sidebar":"docs"},"learn/learn-xcvm":{"id":"learn/learn-xcvm","title":"XCM Virtual Machine (XCVM) & XCM Executor","description":"Design of the XCM Executor and Mechanics of the XCM Virtual Machine.","sidebar":"docs"},"learn/xcm/executor_config/learn-xcm-docs-config-deep-dive":{"id":"learn/xcm/executor_config/learn-xcm-docs-config-deep-dive","title":"Executor Configuration","description":"Deep Dive into the Configuration of the XCM-Executor.","sidebar":"docs"},"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-fees":{"id":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-fees","title":"Weight and Fees","description":"Weight and Fees in XCM.","sidebar":"docs"},"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-multiasset":{"id":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-multiasset","title":"MultiAsset","description":"The MultiAsset Datatype.","sidebar":"docs"},"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-summary":{"id":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-summary","title":"Fundamentals","description":"Summary of the Chapter.","sidebar":"docs"},"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-xcvm":{"id":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-xcvm","title":"XCVM","description":"Deep Dive into XCVM.","sidebar":"docs"},"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-example":{"id":"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-example","title":"Example","description":"A MultiLocation Example.","sidebar":"docs"},"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-junctions":{"id":"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-junctions","title":"Junction(s)","description":"The Junction Type in a MultiLocation Struct.","sidebar":"docs"},"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-summary":{"id":"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-summary","title":"MultiLocation","description":"Learn about XCM fundamentals.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-assets":{"id":"learn/xcm/journey/learn-xcm-docs-journey-assets","title":"Trap and Claim Assets","description":"Instructions to Trap and Claim Assets.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-channels":{"id":"learn/xcm/journey/learn-xcm-docs-journey-channels","title":"Channels and Bridges","description":"Establishment of HRMP Channels between Parachains.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-expectations":{"id":"learn/xcm/journey/learn-xcm-docs-journey-expectations","title":"Expectations","description":"Expect Instructions to Check if a Condition is Valid.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-fees":{"id":"learn/xcm/journey/learn-xcm-docs-journey-fees","title":"Fee Handling","description":"How Fees for XCM Transfers are Handled.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-holding":{"id":"learn/xcm/journey/learn-xcm-docs-journey-holding","title":"More Holding Modifiers","description":"More Instructions to Alter the Holding Register.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-origin":{"id":"learn/xcm/journey/learn-xcm-docs-journey-origin","title":"Origin Manipulation","description":"Manipulating the Origin of XCM.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-queries":{"id":"learn/xcm/journey/learn-xcm-docs-journey-queries","title":"Queries","description":"Query Information from another Consensus System.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-register":{"id":"learn/xcm/journey/learn-xcm-docs-journey-register","title":"Register Modifiers","description":"More Instructions to Change the XCVM Registers.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-summary":{"id":"learn/xcm/journey/learn-xcm-docs-journey-summary","title":"A Journey through XCM","description":"Summary of the Chapter.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-transact":{"id":"learn/xcm/journey/learn-xcm-docs-journey-transact","title":"Transact","description":"The Transact Instruction to Execute XCM Calls.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-version":{"id":"learn/xcm/journey/learn-xcm-docs-journey-version","title":"Version Subscription","description":"Get Notified about XCM Version Updates.","sidebar":"docs"},"learn/xcm/journey/locks/learn-xcm-docs-journey-locks":{"id":"learn/xcm/journey/locks/learn-xcm-docs-journey-locks","title":"Locks","description":"Restrict Transfer or Withdrawal of Assets.","sidebar":"docs"},"learn/xcm/journey/transfers/learn-xcm-docs-transfers-reserve":{"id":"learn/xcm/journey/transfers/learn-xcm-docs-transfers-reserve","title":"Reserve-backed Transfers","description":"Reserve-backed Transfers: Third-party Reserve to store Assets.","sidebar":"docs"},"learn/xcm/journey/transfers/learn-xcm-docs-transfers-summary":{"id":"learn/xcm/journey/transfers/learn-xcm-docs-transfers-summary","title":"Transfers","description":"Summary about XCM Transfers.","sidebar":"docs"},"learn/xcm/journey/transfers/learn-xcm-docs-transfers-teleport":{"id":"learn/xcm/journey/transfers/learn-xcm-docs-transfers-teleport","title":"Asset Teleportation","description":"Teleportation: Sending Assets Across Chains.","sidebar":"docs"},"learn/xcm/learn-xcm-docs-intro":{"id":"learn/xcm/learn-xcm-docs-intro","title":"XCM: Cross-Consensus Messaging","description":"Introduction to the XCM Documentation.","sidebar":"docs"},"learn/xcm/learn-xcm-docs-testing":{"id":"learn/xcm/learn-xcm-docs-testing","title":"Testing","description":"Testing XCM-powered Solutions.","sidebar":"docs"},"learn/xcm/overview/learn-xcm-docs-overview-architecture":{"id":"learn/xcm/overview/learn-xcm-docs-overview-architecture","title":"The XCM Architecture","description":"The XCM Architecture.","sidebar":"docs"},"learn/xcm/overview/learn-xcm-docs-overview-format":{"id":"learn/xcm/overview/learn-xcm-docs-overview-format","title":"XCM is a Format, not a Protocol","description":"XCM is a Format, not a Protocol.","sidebar":"docs"},"learn/xcm/overview/learn-xcm-docs-overview-intro":{"id":"learn/xcm/overview/learn-xcm-docs-overview-intro","title":"Introduction","description":"An Introduction to XCM.","sidebar":"docs"},"learn/xcm/overview/learn-xcm-docs-overview-summary":{"id":"learn/xcm/overview/learn-xcm-docs-overview-summary","title":"XCM: Cross-Consensus Messaging","description":"Summary of the Chapter.","sidebar":"docs"},"learn/xcm/overview/learn-xcm-docs-overview-xcvm":{"id":"learn/xcm/overview/learn-xcm-docs-overview-xcvm","title":"The XCVM","description":"The Cross-Consensus Virtual Machine.","sidebar":"docs"},"learn/xcm/quickstart/learn-xcm-docs-quickstart-first-look":{"id":"learn/xcm/quickstart/learn-xcm-docs-quickstart-first-look","title":"First Look at an XCM","description":"First Look at an XCM.","sidebar":"docs"},"learn/xcm/quickstart/learn-xcm-docs-quickstart-simulator":{"id":"learn/xcm/quickstart/learn-xcm-docs-quickstart-simulator","title":"XCM Simulator","description":"Test XCM using a Simulated Environment.","sidebar":"docs"},"learn/xcm/quickstart/learn-xcm-docs-quickstart-summary":{"id":"learn/xcm/quickstart/learn-xcm-docs-quickstart-summary","title":"Quickstart","description":"Summary of the Chapter.","sidebar":"docs"},"learn/xcm/reference/learn-xcm-docs-reference-glossary":{"id":"learn/xcm/reference/learn-xcm-docs-reference-glossary","title":"Glossary","description":"Glossary.","sidebar":"docs"},"learn/xcm/reference/learn-xcm-docs-reference-xcvm-registers":{"id":"learn/xcm/reference/learn-xcm-docs-reference-xcvm-registers","title":"All XCVM Registers","description":"All XCVM Registers.","sidebar":"docs"},"maintain/doc-maintain-guides-validator-community":{"id":"maintain/doc-maintain-guides-validator-community","title":"Validator Community Overview","description":"An extensive guide to help you start and build a validator community.","sidebar":"docs"},"maintain/kusama/maintain-guides-how-to-nominate-kusama":{"id":"maintain/kusama/maintain-guides-how-to-nominate-kusama","title":"Become a Nominator on Kusama","description":"Steps on how to nominate on Kusama."},"maintain/kusama/maintain-guides-how-to-validate-kusama":{"id":"maintain/kusama/maintain-guides-how-to-validate-kusama","title":"Run a Validator (Kusama)","description":"The fundamentals for running a Kusama validator."},"maintain/kusama/maintain-guides-society-kusama":{"id":"maintain/kusama/maintain-guides-society-kusama","title":"Kappa Sigma Mu","description":"Learn about the Kappa Sigma Mu society and join as a member."},"maintain/maintain-bootnode":{"id":"maintain/maintain-bootnode","title":"Set up a Boot Node","description":"Steps on setting up a boot node.","sidebar":"docs"},"maintain/maintain-endpoints":{"id":"maintain/maintain-endpoints","title":"Node Endpoints","description":"List of node endpoints and examples of use.","sidebar":"docs"},"maintain/maintain-errors":{"id":"maintain/maintain-errors","title":"Errors and How to Resolve Them","description":"Common errors you might encounter and how they can be resolved.","sidebar":"docs"},"maintain/maintain-guides-avoid-slashing":{"id":"maintain/maintain-guides-avoid-slashing","title":"Validator Best Practices","description":"Best practices to avoid slashing.","sidebar":"docs"},"maintain/maintain-guides-democracy":{"id":"maintain/maintain-guides-democracy","title":"Participate in Democracy","description":"Steps on how to participate in democracy.","sidebar":"docs"},"maintain/maintain-guides-how-to-chill":{"id":"maintain/maintain-guides-how-to-chill","title":"How to Chill","description":"Steps on chilling as a network participant.","sidebar":"docs"},"maintain/maintain-guides-how-to-join-council":{"id":"maintain/maintain-guides-how-to-join-council","title":"Join the Council","description":"Steps on how to join the official on-chain council.","sidebar":"docs"},"maintain/maintain-guides-how-to-monitor-your-node":{"id":"maintain/maintain-guides-how-to-monitor-your-node","title":"Monitor your node","description":"This guide will walk you through how to set up Prometheus with","sidebar":"docs"},"maintain/maintain-guides-how-to-nominate-polkadot":{"id":"maintain/maintain-guides-how-to-nominate-polkadot","title":"Become a Nominator on Polkadot","description":"Steps on how to nominate on Polkadot.","sidebar":"docs"},"maintain/maintain-guides-how-to-stop-validating":{"id":"maintain/maintain-guides-how-to-stop-validating","title":"How to Stop Validating","description":"Steps on how to stop validating.","sidebar":"docs"},"maintain/maintain-guides-how-to-systemd":{"id":"maintain/maintain-guides-how-to-systemd","title":"Using systemd for a Validator Node","description":"Using a service manager for your validator node.","sidebar":"docs"},"maintain/maintain-guides-how-to-upgrade":{"id":"maintain/maintain-guides-how-to-upgrade","title":"How to Upgrade Your Validator","description":"Validators perform critical functions for the network, and as such, have strict uptime requirements.","sidebar":"docs"},"maintain/maintain-guides-how-to-validate-polkadot":{"id":"maintain/maintain-guides-how-to-validate-polkadot","title":"Run a Validator (Polkadot)","description":"The fundamentals for running a Polkadot validator.","sidebar":"docs"},"maintain/maintain-guides-how-to-vote-councillor":{"id":"maintain/maintain-guides-how-to-vote-councillor","title":"Voting for Councillors","description":"Steps on how to vote for councillors.","sidebar":"docs"},"maintain/maintain-guides-polkadot-opengov":{"id":"maintain/maintain-guides-polkadot-opengov","title":"Participate in Polkadot OpenGov","description":"Steps on how to participate in OpenGov.","sidebar":"docs"},"maintain/maintain-guides-secure-validator":{"id":"maintain/maintain-guides-secure-validator","title":"Secure Validator","description":"Tips for running a secure validator.","sidebar":"docs"},"maintain/maintain-guides-validator-payout":{"id":"maintain/maintain-guides-validator-payout","title":"Validator Payout Overview","description":"How validator payout works on the network and what you should expect.","sidebar":"docs"},"maintain/maintain-index":{"id":"maintain/maintain-index","title":"Network Maintainers","description":"Reference point for network maintenance guides.","sidebar":"docs"},"maintain/maintain-networks":{"id":"maintain/maintain-networks","title":"Networks","description":"Information about the different networks of the Polkadot ecosystem.","sidebar":"docs"},"maintain/maintain-polkadot-parameters":{"id":"maintain/maintain-polkadot-parameters","title":"Polkadot Parameters","description":"A description about fundamental Polkadot parameters.","sidebar":"docs"},"maintain/maintain-rpc":{"id":"maintain/maintain-rpc","title":"Set up a RPC node","description":"Steps on setting up a RPC node.","sidebar":"docs"},"maintain/maintain-sync":{"id":"maintain/maintain-sync","title":"Set up a Full Node","description":"Steps on how to set up a full node.","sidebar":"docs"},"maintain/maintain-wss":{"id":"maintain/maintain-wss","title":"Secure the WebSocket","description":"Steps on setting up a secure socket for remote connections.","sidebar":"docs"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.989b826e.js b/assets/js/935f2afb.989b826e.js deleted file mode 100644 index a5b546f15974..000000000000 --- a/assets/js/935f2afb.989b826e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[53],{22624:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"category","label":"Learn","items":[{"type":"category","label":"General","description":"General Information to get started with Polkadot and Web3.","items":[{"type":"link","label":"Getting Started","href":"/docs/getting-started","docId":"general/getting-started"},{"type":"link","label":"Web3 and Polkadot","href":"/docs/web3-and-polkadot","docId":"general/web3-and-polkadot"},{"type":"category","label":"Polkadot Vision","description":"Polkadot\'s Vision revealed by Gavin Wood at Decoded 2023.","items":[{"type":"link","label":"Polkadot 1.0","href":"/docs/polkadot-v1","docId":"general/polkadot-v1"},{"type":"link","label":"Polkadot Direction","href":"/docs/polkadot-direction","docId":"general/polkadot-direction"}],"collapsed":true,"collapsible":true,"href":"/docs/polkadot-vision-index"},{"type":"category","label":"Stay Safe","description":"Good-practices to Stay Safe while Surfing in Web3.","items":[{"type":"link","label":"Scam Protection","href":"/docs/learn-scams","docId":"general/scams"},{"type":"link","label":"Do Your Own Research","href":"/docs/how-to-dyor","docId":"general/how-to-dyor"}],"collapsed":true,"collapsible":true,"href":"/docs/stay-safe-index"},{"type":"category","label":"Wallets","description":"Wallet Options in the Polkadot Ecosystem.","items":[{"type":"link","label":"Wallets and Extensions","href":"/docs/wallets-and-extensions","docId":"general/wallets-and-extensions"},{"type":"link","label":"Ledger","href":"/docs/ledger","docId":"general/ledger"},{"type":"link","label":"Polkadot Vault","href":"/docs/polkadot-vault","docId":"general/polkadot-vault"},{"type":"link","label":"Polkadot-JS UI","href":"/docs/polkadotjs-ui","docId":"general/polkadotjs-ui"}],"collapsed":true,"collapsible":true,"href":"/docs/wallets-index"},{"type":"category","label":"Dashboards","description":"Dashboards in the Polkadot Ecosystem.","items":[{"type":"link","label":"Staking Dashboard","href":"/docs/staking-dashboard","docId":"general/staking-dashboard"}],"collapsed":true,"collapsible":true,"href":"/docs/dashboards-index"},{"type":"link","label":"Polkadot-JS","href":"/docs/polkadotjs","docId":"general/polkadotjs"},{"type":"category","label":"Community & Contributors","description":"Polkadot Community and Wiki Contributors.","items":[{"type":"link","label":"Community","href":"/docs/community","docId":"general/community"},{"type":"link","label":"Contributing to the Wiki","href":"/docs/contributing","docId":"general/contributing"},{"type":"link","label":"Contributors","href":"/docs/contributors","docId":"general/contributors"}],"collapsed":true,"collapsible":true,"href":"/docs/community-index"},{"type":"category","label":"Programmes","description":"Programmes and Initiatives within the Polkadot Ecosystem.","items":[{"type":"link","label":"Grants","href":"/docs/grants","docId":"general/grants"},{"type":"link","label":"Bug Bounty","href":"/docs/bug-bounty","docId":"general/bug-bounty"},{"type":"link","label":"Polkadot Ambassadors","href":"/docs/ambassadors","docId":"general/ambassadors"},{"type":"link","label":"Substrate Builders","href":"/docs/builders-program","docId":"general/builders-program"},{"type":"link","label":"Thousand Validators","href":"/docs/thousand-validators","docId":"general/doc-thousand-validators"},{"type":"link","label":"Thousand Contributors","href":"/docs/thousand-contributors","docId":"general/doc-thousand-contributors"},{"type":"link","label":"Developer Heroes","href":"/docs/dev-heroes","docId":"general/dev-heroes"}],"collapsed":true,"collapsible":true,"href":"/docs/programmes-index"},{"type":"link","label":"Build on Polkadot","href":"/docs/start-building","docId":"general/start-building"},{"type":"link","label":"Research Pages","href":"/docs/research","docId":"general/research"},{"type":"link","label":"Metadata Explorer","href":"/docs/metadata","docId":"general/metadata"},{"type":"link","label":"FAQ","href":"/docs/faq","docId":"general/faq"},{"type":"link","label":"Glossary","href":"/docs/glossary","docId":"general/glossary"}],"collapsed":true,"collapsible":true,"href":"/docs/general-index"},{"type":"category","label":"Basics","description":"Staking, Accounts, Transactions, Tokens and NFTs, and Governance.","items":[{"type":"category","label":"Accounts","description":"Basic Accounts, Identity, Multi-signature, and Proxies.","items":[{"type":"link","label":"Polkadot Accounts","href":"/docs/learn-accounts","docId":"learn/learn-accounts"},{"type":"link","label":"Account Generation","href":"/docs/learn-account-generation","docId":"learn/learn-account-generation"},{"type":"link","label":"Account Abstraction","href":"/docs/learn-account-abstraction","docId":"learn/learn-account-abstraction"},{"type":"link","label":"Account Identity","href":"/docs/learn-identity","docId":"learn/learn-identity"},{"type":"link","label":"Multi-Signature Accounts","href":"/docs/learn-account-multisig","docId":"learn/learn-account-multisig"},{"type":"link","label":"Proxy Accounts","href":"/docs/learn-proxies","docId":"learn/learn-proxies"},{"type":"link","label":"Pure Proxy Accounts","href":"/docs/learn-proxies-pure","docId":"learn/learn-proxies-pure"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-accounts-index"},{"type":"category","label":"Transactions","description":"Extrinsics, Balance Transfers, and Fees.","items":[{"type":"link","label":"Extrinsics","href":"/docs/learn-extrinsics","docId":"learn/learn-extrinsics"},{"type":"link","label":"Balances Transfers","href":"/docs/learn-balance-transfers","docId":"learn/learn-balance-transfers"},{"type":"link","label":"Transaction Fees","href":"/docs/learn-transaction-fees","docId":"learn/learn-transaction-fees"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-transactions-index"},{"type":"category","label":"Tokens and Assets","description":"DOT Token, Asset Hub, and Teleports.","items":[{"type":"link","label":"Asset Hub","href":"/docs/learn-assets","docId":"learn/learn-assets"},{"type":"link","label":"DOT","href":"/docs/learn-DOT","docId":"learn/learn-DOT"},{"type":"link","label":"Token Inflation","href":"/docs/learn-inflation","docId":"learn/learn-inflation"},{"type":"link","label":"Teleporting Assets","href":"/docs/learn-teleport","docId":"learn/learn-teleport"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-assets-index"},{"type":"category","label":"NFTs","description":"Intro to NFTs and NFT Projects.","items":[{"type":"link","label":"Introduction to NFTs","href":"/docs/learn-nft","docId":"learn/learn-nft"},{"type":"link","label":"NFT Projects","href":"/docs/learn-nft-projects","docId":"learn/learn-nft-projects"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-nft-index"},{"type":"category","label":"Components","description":"OpenGov, Treasury, WASM, Runtime Upgrades, and more.","items":[{"type":"link","label":"Polkadot Host","href":"/docs/learn-polkadot-host","docId":"learn/learn-polkadot-host"},{"type":"link","label":"WebAssembly (Wasm)","href":"/docs/learn-wasm","docId":"learn/learn-wasm"},{"type":"link","label":"Runtime Upgrades","href":"/docs/learn-runtime-upgrades","docId":"learn/learn-runtime-upgrades"},{"type":"link","label":"Polkadot OpenGov","href":"/docs/learn-polkadot-opengov","docId":"learn/learn-polkadot-opengov"},{"type":"link","label":"Treasury","href":"/docs/learn-polkadot-opengov-treasury","docId":"learn/learn-polkadot-opengov-treasury"},{"type":"link","label":"Consensus","href":"/docs/learn-consensus","docId":"learn/learn-consensus"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-components-index"},{"type":"category","label":"Staking","description":"Staking Philosophy and Mechanics.","items":[{"type":"link","label":"Introduction to Staking","href":"/docs/learn-staking","docId":"learn/learn-staking"},{"type":"link","label":"Nomination Pools","href":"/docs/learn-nomination-pools","docId":"learn/learn-nomination-pools"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-staking-index"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-basics-index"},{"type":"category","label":"Advanced","description":"Advanced Concepts & Guides about Accounts, Staking, and NFTs.","items":[{"type":"link","label":"Accounts","href":"/docs/learn-account-advanced","docId":"learn/learn-account-advanced"},{"type":"link","label":"Advanced Staking Concepts","href":"/docs/learn-staking-advanced","docId":"learn/learn-staking-advanced"},{"type":"link","label":"NFT Pallets","href":"/docs/learn-nft-pallets","docId":"learn/learn-nft-pallets"},{"type":"link","label":"Cryptography","href":"/docs/learn-cryptography","docId":"learn/learn-cryptography"},{"type":"link","label":"NPoS Election Algorithms","href":"/docs/learn-phragmen","docId":"learn/learn-phragmen"},{"type":"category","label":"How-to Guides","description":"Advanced Guides about Staking, Asset Hub, Vault App, and more.","items":[{"type":"category","label":"Staking","description":"Advanced How-to Guides about Staking.","items":[{"type":"link","label":"Staking","href":"/docs/learn-guides-staking","docId":"learn/learn-guides-staking"},{"type":"link","label":"Nomination Pools","href":"/docs/learn-guides-staking-pools","docId":"learn/learn-guides-staking-pools"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-guides-staking-index"},{"type":"link","label":"OpenGov","href":"/docs/learn-guides-polkadot-opengov","docId":"learn/learn-guides-polkadot-opengov"},{"type":"link","label":"Treasury","href":"/docs/learn-guides-treasury","docId":"learn/learn-guides-treasury"},{"type":"link","label":"Identity","href":"/docs/learn-guides-identity","docId":"learn/learn-guides-identity"},{"type":"category","label":"Asset Hub","description":"Advanced How-to Guides about the Asset Hub.","items":[{"type":"link","label":"Creating Assets","href":"/docs/learn-guides-assets-create","docId":"learn/learn-guides-assets-create"},{"type":"link","label":"Asset Hub Ledger App","href":"/docs/learn-guides-assets-ledger","docId":"learn/learn-guides-assets-ledger"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-guides-assets-index"},{"type":"link","label":"Polkadot Vault","href":"/docs/learn-guides-vault","docId":"learn/learn-guides-vault"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-guides-index"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-advanced-index"},{"type":"category","label":"Architecture","description":"Nominators, Validators, Collators, Parachains, and more.","items":[{"type":"link","label":"Architecture","href":"/docs/learn-architecture","docId":"learn/learn-architecture"},{"type":"category","label":"Network Participants","description":"Participants in the Polkadot Ecosystem.","items":[{"type":"link","label":"Collator","href":"/docs/learn-collator","docId":"learn/learn-collator"},{"type":"link","label":"Nominator","href":"/docs/learn-nominator","docId":"learn/learn-nominator"},{"type":"link","label":"Validator","href":"/docs/learn-validator","docId":"learn/learn-validator"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-participants-index"},{"type":"category","label":"Parachains","description":"Parachains\' Protocol, Auctions, Crowdloans, and more.","items":[{"type":"link","label":"Introduction to Parachains","href":"/docs/learn-parachains","docId":"learn/learn-parachains"},{"type":"link","label":"Protocol Overview","href":"/docs/learn-parachains-protocol","docId":"learn/learn-parachains-protocol"},{"type":"link","label":"System Parachains","href":"/docs/learn-system-chains","docId":"learn/learn-system-chains"},{"type":"link","label":"Parachain Slot Auctions","href":"/docs/learn-auction","docId":"learn/learn-auction"},{"type":"link","label":"Parachain Crowdloans","href":"/docs/learn-crowdloans","docId":"learn/learn-crowdloans"},{"type":"link","label":"Parachains FAQ","href":"/docs/learn-parachains-faq","docId":"learn/learn-parachains-faq"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-parachains-index"},{"type":"link","label":"Bridges","href":"/docs/learn-bridges","docId":"learn/learn-bridges"},{"type":"category","label":"Cross Consensus Messaging (XCM)","description":"Polkadot\'s Cross-Consensus Messaging Format (XCM).","items":[{"type":"link","label":"Cross-Consensus Message Format (XCM)","href":"/docs/learn-xcm","docId":"learn/learn-xcm"},{"type":"link","label":"XCM Pallet","href":"/docs/learn-xcm-pallet","docId":"learn/learn-xcm-pallet"},{"type":"link","label":"XCM Use-cases","href":"/docs/learn-xcm-usecases","docId":"learn/learn-xcm-usecases"},{"type":"link","label":"XCM Transport","href":"/docs/learn-xcm-transport","docId":"learn/learn-xcm-transport"},{"type":"link","label":"XCM Virtual Machine (XCVM)","href":"/docs/learn-xcvm","docId":"learn/learn-xcvm"},{"type":"link","label":"XCM Instructions","href":"/docs/learn-xcm-instructions","docId":"learn/learn-xcm-instructions"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-xcm-index"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-architecture-index"},{"type":"category","label":"XCM Docs","description":"In-depth documentation about the Polkadot\'s Cross-Chain Messaging (XCM).","items":[{"type":"link","label":"XCM: Cross-Consensus Messaging","href":"/docs/learn/xcm/introduction","docId":"learn/xcm/learn-xcm-docs-intro"},{"type":"category","label":"Overview","description":"Overview of the XCM Documentation.","items":[{"type":"link","label":"Summary","href":"/docs/learn/xcm/overview-summary","docId":"learn/xcm/overview/learn-xcm-docs-overview-summary"},{"type":"link","label":"Introduction","href":"/docs/learn/xcm/overview-intro","docId":"learn/xcm/overview/learn-xcm-docs-overview-intro"},{"type":"link","label":"A Format, not a Protocol","href":"/docs/learn/xcm/overview-format","docId":"learn/xcm/overview/learn-xcm-docs-overview-format"},{"type":"link","label":"The XCVM","href":"/docs/learn/xcm/overview-xcvm","docId":"learn/xcm/overview/learn-xcm-docs-overview-xcvm"},{"type":"link","label":"Architecture","href":"/docs/learn/xcm/overview-architecture","docId":"learn/xcm/overview/learn-xcm-docs-overview-architecture"}],"collapsed":true,"collapsible":true,"href":"/docs/learn/xcm/overview"},{"type":"category","label":"Quickstart","description":"Start Diving into XCM.","items":[{"type":"link","label":"Summary","href":"/docs/learn/xcm/quickstart-summary","docId":"learn/xcm/quickstart/learn-xcm-docs-quickstart-summary"},{"type":"link","label":"XCM Simulator","href":"/docs/learn/xcm/quickstart-simulator","docId":"learn/xcm/quickstart/learn-xcm-docs-quickstart-simulator"},{"type":"link","label":"First Look at an XCM","href":"/docs/learn/xcm/quickstart-first-look","docId":"learn/xcm/quickstart/learn-xcm-docs-quickstart-first-look"}],"collapsed":true,"collapsible":true,"href":"/docs/learn/xcm/quickstart"},{"type":"category","label":"Fundamentals","description":"Fundamental Concepts about XCM.","items":[{"type":"link","label":"Summary","href":"/docs/learn/xcm/fundamentals-summary","docId":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-summary"},{"type":"category","label":"MultiLocation","description":"The MultiLocation Type.","items":[{"type":"link","label":"Summary","href":"/docs/learn/xcm/fundamentals/multilocation-summary","docId":"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-summary"},{"type":"link","label":"Junction(s)","href":"/docs/learn/xcm/fundamentals/multilocation-junctions","docId":"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-junctions"},{"type":"link","label":"Example","href":"/docs/learn/xcm/fundamentals/multilocation-example","docId":"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-example"}],"collapsed":true,"collapsible":true,"href":"/docs/learn/xcm/fundamentals/multilocation"},{"type":"link","label":"MultiAsset","href":"/docs/learn/xcm/fundamentals-multiasset","docId":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-multiasset"},{"type":"link","label":"XCVM","href":"/docs/learn/xcm/fundamentals-xcvm","docId":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-xcvm"},{"type":"link","label":"Weight and Fees","href":"/docs/learn/xcm/fundamentals-fees","docId":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-fees"}],"collapsed":true,"collapsible":true,"href":"/docs/learn/xcm/fundamentals"},{"type":"category","label":"A Journey through XCM","description":"A Practical Introduction to the XCM Features","items":[{"type":"link","label":"Summary","href":"/docs/learn/xcm/journey-summary","docId":"learn/xcm/journey/learn-xcm-docs-journey-summary"},{"type":"category","label":"Transfers","description":"Transferring Assets between Consensus Systems with XCM.","items":[{"type":"link","label":"Summary","href":"/docs/learn/xcm/journey/transfers-summary","docId":"learn/xcm/journey/transfers/learn-xcm-docs-transfers-summary"},{"type":"link","label":"Asset Teleportation","href":"/docs/learn/xcm/journey/transfers-teleport","docId":"learn/xcm/journey/transfers/learn-xcm-docs-transfers-teleport"},{"type":"link","label":"Reserve-backed Transfers","href":"/docs/learn/xcm/journey/transfers-reserve","docId":"learn/xcm/journey/transfers/learn-xcm-docs-transfers-reserve"}],"collapsed":true,"collapsible":true,"href":"/docs/learn/xcm/journey/transfers"},{"type":"link","label":"Fee Handling","href":"/docs/learn/xcm/journey-fees","docId":"learn/xcm/journey/learn-xcm-docs-journey-fees"},{"type":"link","label":"Transact: A General Solution","href":"/docs/learn/xcm/journey-transact","docId":"learn/xcm/journey/learn-xcm-docs-journey-transact"},{"type":"link","label":"Origin Manipulation","href":"/docs/learn/xcm/journey-origin","docId":"learn/xcm/journey/learn-xcm-docs-journey-origin"},{"type":"link","label":"More Register Modifiers","href":"/docs/learn/xcm/journey-register","docId":"learn/xcm/journey/learn-xcm-docs-journey-register"},{"type":"link","label":"More Holding Modifiers","href":"/docs/learn/xcm/journey-holding","docId":"learn/xcm/journey/learn-xcm-docs-journey-holding"},{"type":"link","label":"Trap and Claim Assets","href":"/docs/learn/xcm/journey-assets","docId":"learn/xcm/journey/learn-xcm-docs-journey-assets"},{"type":"link","label":"Expectations","href":"/docs/learn/xcm/journey-expectations","docId":"learn/xcm/journey/learn-xcm-docs-journey-expectations"},{"type":"link","label":"Queries","href":"/docs/learn/xcm/journey-queries","docId":"learn/xcm/journey/learn-xcm-docs-journey-queries"},{"type":"link","label":"Version Subscription","href":"/docs/learn/xcm/journey-version","docId":"learn/xcm/journey/learn-xcm-docs-journey-version"},{"type":"link","label":"Locks","href":"/docs/learn/xcm/journey-locks","docId":"learn/xcm/journey/locks/learn-xcm-docs-journey-locks"},{"type":"link","label":"Channels and Bridges","href":"/docs/learn/xcm/journey-channels","docId":"learn/xcm/journey/learn-xcm-docs-journey-channels"}],"collapsed":true,"collapsible":true,"href":"/docs/learn/xcm/journey"},{"type":"link","label":"Executor Configuration","href":"/docs/learn/xcm/config-deep-dive","docId":"learn/xcm/executor_config/learn-xcm-docs-config-deep-dive"},{"type":"link","label":"Testing","href":"/docs/learn/xcm/testing","docId":"learn/xcm/learn-xcm-docs-testing"},{"type":"category","label":"References","description":"XCVM Registers and Glossary","items":[{"type":"link","label":"All XCVM Registers","href":"/docs/learn/xcm/reference-xcvm-registers","docId":"learn/xcm/reference/learn-xcm-docs-reference-xcvm-registers"},{"type":"link","label":"Glossary","href":"/docs/learn/xcm/reference-glossary","docId":"learn/xcm/reference/learn-xcm-docs-reference-glossary"}],"collapsed":true,"collapsible":true,"href":"/docs/learn/xcm/references"}],"collapsed":true,"collapsible":true,"href":"/docs/learn/xcm"},{"type":"category","label":"Polkadot Comparisons","description":"Comparison between Polkadot and other Networks. ","items":[{"type":"link","label":"Kusama","href":"/docs/learn-comparisons-kusama","docId":"learn/learn-comparisons-kusama"},{"type":"link","label":"Ethereum","href":"/docs/learn-comparisons-ethereum-2","docId":"learn/learn-comparisons-ethereum-2"},{"type":"link","label":"Cosmos","href":"/docs/learn-comparisons-cosmos","docId":"learn/learn-comparisons-cosmos"},{"type":"link","label":"Avalanche","href":"/docs/learn-comparisons-avalanche","docId":"learn/learn-comparisons-avalanche"},{"type":"link","label":"Other Comparisons","href":"/docs/learn-comparisons","docId":"learn/learn-comparisons"},{"type":"link","label":"Layer Two and Rollups","href":"/docs/learn-comparisons-rollups","docId":"learn/learn-comparisons-rollups"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-comparisons-index"},{"type":"link","label":"Videos","href":"/docs/learn-video-tutorials","docId":"learn/learn-video-tutorials"},{"type":"category","label":"Future Implementations","description":"Implementations that will be deployed on Polkadot.","items":[{"type":"link","label":"SPREE","href":"/docs/learn-spree","docId":"learn/learn-spree"},{"type":"link","label":"Parathreads","href":"/docs/learn-parathreads","docId":"learn/learn-parathreads"},{"type":"link","label":"Asynchronous Backing","href":"/docs/learn-async-backing","docId":"learn/learn-async-backing"},{"type":"link","label":"SASSAFRAS","href":"/docs/learn-sassafras","docId":"learn/learn-sassafras"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-future-implementations-index"},{"type":"category","label":"Archive","description":"Implementations no longer live on Polkadot.","items":[{"type":"link","label":"Governance V1","href":"/docs/learn-governance","docId":"learn/learn-governance"},{"type":"link","label":"Gov1 Treasury","href":"/docs/learn-treasury","docId":"learn/learn-treasury"},{"type":"link","label":"Polkadot Launch Phases","href":"/docs/learn-launch","docId":"learn/learn-launch"},{"type":"link","label":"Redenomination of DOT","href":"/docs/learn-redenomination","docId":"learn/learn-redenomination"},{"type":"link","label":"Controller Accounts","href":"/docs/learn-controller","docId":"learn/learn-controller"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-archive-index"}],"collapsed":true,"collapsible":true,"href":"/docs/learn-index"},{"type":"category","label":"Build","items":[{"type":"link","label":"Builder\'s Guides","href":"/docs/build-index","docId":"build/build-index"},{"type":"category","label":"Development Guide","items":[{"type":"link","label":"Builders Starter\'s Guide","href":"/docs/build-guide","docId":"build/build-guide"},{"type":"link","label":"Parachain Development","href":"/docs/build-pdk","docId":"build/build-parachains"},{"type":"link","label":"Decentralized Storage","href":"/docs/build-storage","docId":"build/build-storage"},{"type":"link","label":"Smart Contracts","href":"/docs/build-smart-contracts","docId":"build/build-smart-contracts"},{"type":"link","label":"Oracles","href":"/docs/build-oracle","docId":"build/build-oracle"},{"type":"link","label":"Data","href":"/docs/build-data","docId":"build/build-data"},{"type":"link","label":"Substrate Connect","href":"/docs/build-substrate","docId":"build/build-substrate"},{"type":"link","label":"SS58 Registry","href":"/docs/build-ss58-registry","docId":"build/build-ss58-registry"},{"type":"link","label":"Opening HRMP Channels","href":"/docs/build-hrmp-channels","docId":"build/build-hrmp-channels"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Integration Guide","items":[{"type":"link","label":"Integration Initiation","href":"/docs/build-integration","docId":"build/build-integration"},{"type":"link","label":"Polkadot Protocol","href":"/docs/build-protocol-info","docId":"build/build-protocol-info"},{"type":"link","label":"Integrating Assets","href":"/docs/build-integrate-assets","docId":"build/build-integrate-assets"},{"type":"link","label":"Node Management","href":"/docs/build-node-management","docId":"build/build-node-management"},{"type":"link","label":"Node Interaction","href":"/docs/build-node-interaction","docId":"build/build-node-interaction"},{"type":"link","label":"Transaction Construction","href":"/docs/build-transaction-construction","docId":"build/build-transaction-construction"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Tools","items":[{"type":"link","label":"Tool Index","href":"/docs/build-tools-index","docId":"build/build-tools-index"},{"type":"link","label":"Open Source Stack","href":"/docs/build-open-source","docId":"build/build-open-source"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Resources","items":[{"type":"link","label":"Hackathons","href":"/docs/build-hackathon","docId":"build/build-hackathon"}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Maintain","items":[{"type":"link","label":"Network Maintainers","href":"/docs/maintain-index","docId":"maintain/maintain-index"},{"type":"link","label":"Parameters","href":"/docs/maintain-polkadot-parameters","docId":"maintain/maintain-polkadot-parameters"},{"type":"link","label":"Node Endpoints","href":"/docs/maintain-endpoints","docId":"maintain/maintain-endpoints"},{"type":"category","label":"Nodes and Dapps","items":[{"type":"link","label":"Set up a Full Node","href":"/docs/maintain-sync","docId":"maintain/maintain-sync"},{"type":"link","label":"Set up a Boot Node","href":"/docs/maintain-bootnode","docId":"maintain/maintain-bootnode"},{"type":"link","label":"Set up a RPC node","href":"/docs/maintain-rpc","docId":"maintain/maintain-rpc"},{"type":"link","label":"Secure the WebSocket","href":"/docs/maintain-wss","docId":"maintain/maintain-wss"},{"type":"link","label":"Networks","href":"/docs/maintain-networks","docId":"maintain/maintain-networks"},{"type":"link","label":"Resolving Errors","href":"/docs/maintain-errors","docId":"maintain/maintain-errors"}],"collapsed":true,"collapsible":true},{"type":"link","label":"Nominator Guides","href":"/docs/maintain-guides-how-to-nominate-polkadot","docId":"maintain/maintain-guides-how-to-nominate-polkadot"},{"type":"category","label":"Validator Guides","items":[{"type":"link","label":"How to run a Validator on Polkadot","href":"/docs/maintain-guides-how-to-validate-polkadot","docId":"maintain/maintain-guides-how-to-validate-polkadot"},{"type":"link","label":"Validator Payout Overview","href":"/docs/maintain-guides-validator-payout","docId":"maintain/maintain-guides-validator-payout"},{"type":"link","label":"Using systemd for a Validator Node","href":"/docs/maintain-guides-how-to-systemd","docId":"maintain/maintain-guides-how-to-systemd"},{"type":"link","label":"Secure Validator","href":"/docs/maintain-guides-secure-validator","docId":"maintain/maintain-guides-secure-validator"},{"type":"link","label":"How to Upgrade Your Validator","href":"/docs/maintain-guides-how-to-upgrade","docId":"maintain/maintain-guides-how-to-upgrade"},{"type":"link","label":"Monitor your node","href":"/docs/maintain-guides-how-to-monitor-your-node","docId":"maintain/maintain-guides-how-to-monitor-your-node"},{"type":"link","label":"How to Chill","href":"/docs/maintain-guides-how-to-chill","docId":"maintain/maintain-guides-how-to-chill"},{"type":"link","label":"How to Stop Validating","href":"/docs/maintain-guides-how-to-stop-validating","docId":"maintain/maintain-guides-how-to-stop-validating"},{"type":"link","label":"Validator Community Overview","href":"/docs/maintain-guides-validator-community","docId":"maintain/doc-maintain-guides-validator-community"},{"type":"link","label":"Validator Best Practices","href":"/docs/maintain-guides-avoid-slashing","docId":"maintain/maintain-guides-avoid-slashing"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Governance Guides","items":[{"type":"link","label":"Participate in Democracy","href":"/docs/maintain-guides-democracy","docId":"maintain/maintain-guides-democracy"},{"type":"link","label":"Participate in Polkadot OpenGov","href":"/docs/maintain-guides-polkadot-opengov","docId":"maintain/maintain-guides-polkadot-opengov"},{"type":"link","label":"Join the Council","href":"/docs/maintain-guides-how-to-join-council","docId":"maintain/maintain-guides-how-to-join-council"},{"type":"link","label":"Voting for Councillors","href":"/docs/maintain-guides-how-to-vote-councillor","docId":"maintain/maintain-guides-how-to-vote-councillor"}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true}]},"docs":{"build/build-data":{"id":"build/build-data","title":"Data Analytics","description":"An overview about building with data analytics","sidebar":"docs"},"build/build-guide":{"id":"build/build-guide","title":"Builders Starter\'s Guide","description":"Start building with Polkadot/Kusama.","sidebar":"docs"},"build/build-hackathon":{"id":"build/build-hackathon","title":"Hackathons","description":"Join or host a Hackathon.","sidebar":"docs"},"build/build-hrmp-channels":{"id":"build/build-hrmp-channels","title":"Opening HRMP Channels","description":"Steps on how to open HRMP channels between parachains.","sidebar":"docs"},"build/build-index":{"id":"build/build-index","title":"Builder\'s Guides","description":"Reference point for the Polkadot builder guides.","sidebar":"docs"},"build/build-integrate-assets":{"id":"build/build-integrate-assets","title":"Assets on Polkadot","description":"Tools that you can use to integrating assets.","sidebar":"docs"},"build/build-integration":{"id":"build/build-integration","title":"Polkadot Integration Guide","description":"Reference point for the Polkadot integration guides.","sidebar":"docs"},"build/build-node-interaction":{"id":"build/build-node-interaction","title":"Node Interaction","description":"Tools for node interaction.","sidebar":"docs"},"build/build-node-management":{"id":"build/build-node-management","title":"Node Management","description":"Steps on how to manage your Polkadot node.","sidebar":"docs"},"build/build-open-source":{"id":"build/build-open-source","title":"Open Source Stack","description":"Overview of the open source Polkadot/Kusama Tech Stack","sidebar":"docs"},"build/build-oracle":{"id":"build/build-oracle","title":"Oracles","description":"Information about building with oracles.","sidebar":"docs"},"build/build-parachains":{"id":"build/build-parachains","title":"Parachain Development","description":"A guide on what it means to become a Parachain and the steps to do so.","sidebar":"docs"},"build/build-protocol-info":{"id":"build/build-protocol-info","title":"Polkadot Protocol Information","description":"Characteristics about the Polkadot protocol, and what you need to consider when building.","sidebar":"docs"},"build/build-smart-contracts":{"id":"build/build-smart-contracts","title":"Smart Contracts","description":"How smart contracts play their role in the Polkadot ecosystem.","sidebar":"docs"},"build/build-ss58-registry":{"id":"build/build-ss58-registry","title":"SS58 Registry","description":"Information about SS58 encoding.","sidebar":"docs"},"build/build-storage":{"id":"build/build-storage","title":"Decentralized Storage","description":"Information about building with decentralized storage.","sidebar":"docs"},"build/build-substrate":{"id":"build/build-substrate","title":"Substrate Connect","description":"Information about Substrate Connect.","sidebar":"docs"},"build/build-tools-index":{"id":"build/build-tools-index","title":"Tool Index","description":"Reference point for a list of tools to support your development.","sidebar":"docs"},"build/build-transaction-construction":{"id":"build/build-transaction-construction","title":"Transaction Construction and Signing","description":"Information about how transactions are constructed on Polkadot.","sidebar":"docs"},"general/ambassadors":{"id":"general/ambassadors","title":"Polkadot Ambassador Programme","description":"The Polkadot\'s Ambassador Program and How you can Participate in It.","sidebar":"docs"},"general/bug-bounty":{"id":"general/bug-bounty","title":"Bug Bounty Programme","description":"An Overview of How you can Help Catch Bugs.","sidebar":"docs"},"general/builders-program":{"id":"general/builders-program","title":"Substrate Builders Programme","description":"The Substrate Builders Program and How it can Support your Substrate Development.","sidebar":"docs"},"general/community":{"id":"general/community","title":"Community","description":"Connect and stay updated with the Polkadot Community.","sidebar":"docs"},"general/contributing":{"id":"general/contributing","title":"Contributing to the Polkadot Wiki","description":"Contribute to the Polkadot Wiki.","sidebar":"docs"},"general/contributors":{"id":"general/contributors","title":"Contributors","description":"Get to know your Wiki-slayers.","sidebar":"docs"},"general/dev-heroes":{"id":"general/dev-heroes","title":"Developer Heroes Programme","description":"More Power to Polkadot\'s Developers.","sidebar":"docs"},"general/doc-thousand-contributors":{"id":"general/doc-thousand-contributors","title":"Thousand Contributors Programme","description":"The Thousand Contributors Program and How it can Support your Contributions.","sidebar":"docs"},"general/doc-thousand-validators":{"id":"general/doc-thousand-validators","title":"Thousand Validators Programme","description":"The Thousand Validators Program and How it can Support your Validator Endeavors.","sidebar":"docs"},"general/faq":{"id":"general/faq","title":"Frequently Asked Questions (FAQs)","description":"FAQs to Help you Navigate on Polkadot.","sidebar":"docs"},"general/getting-started":{"id":"general/getting-started","title":"Getting Started","description":"Get started with Polkadot and Web3.","sidebar":"docs"},"general/glossary":{"id":"general/glossary","title":"Glossary","description":"Common Terms and Concepts in the Polkadot Ecosystem.","sidebar":"docs"},"general/grants":{"id":"general/grants","title":"Grants","description":"The Grant Programs in the Polkadot Ecosystem.","sidebar":"docs"},"general/how-to-dyor":{"id":"general/how-to-dyor","title":"How to Do Your Own Research (DYOR)","description":"Importance of Doing Your Own Research (DYOR).","sidebar":"docs"},"general/kusama/kusama-adversarial-cheatsheet":{"id":"general/kusama/kusama-adversarial-cheatsheet","title":"Adversarial Cheatsheet","description":"A cheatsheet to help you create chaos."},"general/kusama/kusama-bug-bounty":{"id":"general/kusama/kusama-bug-bounty","title":"Bug Bounty","description":"An overview of how you can help catch bugs."},"general/kusama/kusama-claims":{"id":"general/kusama/kusama-claims","title":"Kusama Claims","description":"Step-by-step guide on how to claim your KSM tokens."},"general/kusama/kusama-coc":{"id":"general/kusama/kusama-coc","title":"Kusama Code of Conduct","description":"Kusama\'s Code of Conduct to sustain chaos."},"general/kusama/kusama-community":{"id":"general/kusama/kusama-community","title":"Kusama Community","description":"Stay in-touch and keep up-to-date by interacting and engaging in the Kusama community."},"general/kusama/kusama-getting-started":{"id":"general/kusama/kusama-getting-started","title":"Interact with Kusama","description":"Reference point for Kusama content."},"general/kusama/kusama-index":{"id":"general/kusama/kusama-index","title":"Kusama","description":"Legacy link to Kusama Wiki document"},"general/kusama/kusama-parameters":{"id":"general/kusama/kusama-parameters","title":"Kusama Parameters","description":"Learn about common Kusama parameters"},"general/kusama/kusama-social-recovery":{"id":"general/kusama/kusama-social-recovery","title":"Social Recovery","description":"Steps on how to perform account recovery on Kusama."},"general/kusama/kusama-timeline":{"id":"general/kusama/kusama-timeline","title":"Kusama Timeline","description":"Stay up-to-date with the latest action on Kusama."},"general/ledger":{"id":"general/ledger","title":"Using the Polkadot & Kusama Ledger Applications","description":"Use the Polkadot Ledger Application.","sidebar":"docs"},"general/metadata":{"id":"general/metadata","title":"Metadata Explorer","description":"Visualize Metadata and related Documentation.","sidebar":"docs"},"general/polkadot-direction":{"id":"general/polkadot-direction","title":"Polkadot Direction","description":"Polkadot as a Decentralized and Secure Ubiquitous Computer.","sidebar":"docs"},"general/polkadot-v1":{"id":"general/polkadot-v1","title":"Polkadot 1.0","description":"Polkadot\'s 1.0, Blockspace, Decentralization and Resilience.","sidebar":"docs"},"general/polkadot-vault":{"id":"general/polkadot-vault","title":"Polkadot Vault (formerly Parity Signer)","description":"Your old Smartphone as an Air-gapped Wallet.","sidebar":"docs"},"general/polkadotjs":{"id":"general/polkadotjs","title":"Polkadot-JS","description":"The Polkadot-JS Tool Collection.","sidebar":"docs"},"general/polkadotjs-ui":{"id":"general/polkadotjs-ui","title":"Polkadot-JS UI (Wallet)","description":"A Wallet for Power-users and Developers.","sidebar":"docs"},"general/research":{"id":"general/research","title":"Research Pages","description":"Latest Research Developments on Polkadot.","sidebar":"docs"},"general/scams":{"id":"general/scams","title":"How to Protect Yourself from Scams","description":"How to Protect yourself against Scams.","sidebar":"docs"},"general/staking-dashboard":{"id":"general/staking-dashboard","title":"Polkadot Staking Dashboard","description":"Everything about the Polkadot Staking Dashboard.","sidebar":"docs"},"general/start-building":{"id":"general/start-building","title":"Build on Polkadot","description":"Start Building with the Polkadot SDK.","sidebar":"docs"},"general/wallets-and-extensions":{"id":"general/wallets-and-extensions","title":"Wallets and Extensions","description":"An Overview of Wallets and Browser Extensions in the Polkadot Ecosystem.","sidebar":"docs"},"general/web3-and-polkadot":{"id":"general/web3-and-polkadot","title":"Web3 and Polkadot","description":"Introduction to Web3 and Polkadot\'s Role in shaping the Web3 Vision.","sidebar":"docs"},"learn/learn-account-abstraction":{"id":"learn/learn-account-abstraction","title":"Polkadot\'s Account Abstraction","description":"Polkadot\'s Native Account Abstraction.","sidebar":"docs"},"learn/learn-account-advanced":{"id":"learn/learn-account-advanced","title":"Polkadot Accounts In-Depth","description":"Advanced Concepts about Polkadot\'s Accounts.","sidebar":"docs"},"learn/learn-account-generation":{"id":"learn/learn-account-generation","title":"Account Generation","description":"Generate a Polkadot Basic Account.","sidebar":"docs"},"learn/learn-account-multisig":{"id":"learn/learn-account-multisig","title":"Multi-Signature Accounts","description":"Multi-signature Accounts on Polkadot.","sidebar":"docs"},"learn/learn-accounts":{"id":"learn/learn-accounts","title":"Polkadot Accounts","description":"Polkadot Accounts, Account Identity, and Account Reaping.","sidebar":"docs"},"learn/learn-architecture":{"id":"learn/learn-architecture","title":"Architecture","description":"Key Components to Polkadot\'s Architecture.","sidebar":"docs"},"learn/learn-assets":{"id":"learn/learn-assets","title":"Asset Hub","description":"Fungible Tokens and NFTs on Polkadot.","sidebar":"docs"},"learn/learn-async-backing":{"id":"learn/learn-async-backing","title":"Asynchronous Backing","description":"A brief overview of asynchronous backing, and how it affects Polkadot\'s scalability.","sidebar":"docs"},"learn/learn-auction":{"id":"learn/learn-auction","title":"Parachain Slot Auctions","description":"Polkadot\'s Parachain Slot Auction Mechanism.","sidebar":"docs"},"learn/learn-balance-transfers":{"id":"learn/learn-balance-transfers","title":"Balance Transfers","description":"Perform Balance Transfers between Accounts.","sidebar":"docs"},"learn/learn-bridges":{"id":"learn/learn-bridges","title":"Bridges","description":"Bridges and Examples of Common Bridges.","sidebar":"docs"},"learn/learn-collator":{"id":"learn/learn-collator","title":"Collator","description":"Role of Collators within the Polkadot Ecosystem.","sidebar":"docs"},"learn/learn-comparisons":{"id":"learn/learn-comparisons","title":"Polkadot Comparisons","description":"Comparison between Polkadot and ETH 1.0 and BSC.","sidebar":"docs"},"learn/learn-comparisons-avalanche":{"id":"learn/learn-comparisons-avalanche","title":"Polkadot vs. Avalanche","description":"Comparison between Polkadot and Avalanche.","sidebar":"docs"},"learn/learn-comparisons-cosmos":{"id":"learn/learn-comparisons-cosmos","title":"Polkadot vs. Cosmos","description":"Comparison between Polkadot and Cosmos.","sidebar":"docs"},"learn/learn-comparisons-ethereum-2":{"id":"learn/learn-comparisons-ethereum-2","title":"Polkadot vs. Ethereum","description":"Comparison between Polkadot and Ethereum.","sidebar":"docs"},"learn/learn-comparisons-kusama":{"id":"learn/learn-comparisons-kusama","title":"Polkadot vs. Kusama","description":"Comparing the cousins.","sidebar":"docs"},"learn/learn-comparisons-rollups":{"id":"learn/learn-comparisons-rollups","title":"Layer Two and Rollups","description":"Comparison between various Rollup and L2 Protocols.","sidebar":"docs"},"learn/learn-consensus":{"id":"learn/learn-consensus","title":"Polkadot Consensus","description":"The Consensus Mechanism of Polkadot.","sidebar":"docs"},"learn/learn-controller":{"id":"learn/learn-controller","title":"Controller Accounts","description":"Controller Accounts used in Staking.","sidebar":"docs"},"learn/learn-crowdloans":{"id":"learn/learn-crowdloans","title":"Parachain Crowdloans","description":"Polkadot\'s Crowdloans and How to Participate.","sidebar":"docs"},"learn/learn-cryptography":{"id":"learn/learn-cryptography","title":"Cryptography on Polkadot","description":"Cryptographic Functions used in Polkadot.","sidebar":"docs"},"learn/learn-DOT":{"id":"learn/learn-DOT","title":"DOT","description":"Tokenomics of Polkadot\'s Native Token DOT.","sidebar":"docs"},"learn/learn-extrinsics":{"id":"learn/learn-extrinsics","title":"Extrinsics (a.k.a. Types of Transactions)","description":"Types of Transactions on Polkadot.","sidebar":"docs"},"learn/learn-governance":{"id":"learn/learn-governance","title":"Governance V1","description":"Polkadot\'s First Governance Model.","sidebar":"docs"},"learn/learn-guides-assets-create":{"id":"learn/learn-guides-assets-create","title":"Creating Assets with the Asset Hub","description":"Advanced How-to Guides about Creating Assets.","sidebar":"docs"},"learn/learn-guides-assets-ledger":{"id":"learn/learn-guides-assets-ledger","title":"Using the Asset Hub Ledger App","description":"Advanced How-to Guides about Ledger and the Asset Hub.","sidebar":"docs"},"learn/learn-guides-identity":{"id":"learn/learn-guides-identity","title":"Identity How-to Guides","description":"Advanced How-to Guides about Identity - Registrars and Sub-Identity.","sidebar":"docs"},"learn/learn-guides-polkadot-opengov":{"id":"learn/learn-guides-polkadot-opengov","title":"Polkadot OpenGov How-to Guides","description":"Advanced How-to Guides about Polkadot OpenGov.","sidebar":"docs"},"learn/learn-guides-staking":{"id":"learn/learn-guides-staking","title":"How-to Guides for Nominators","description":"Advanced How-to Guides for Nominators.","sidebar":"docs"},"learn/learn-guides-staking-pools":{"id":"learn/learn-guides-staking-pools","title":"Nomination Pools How-to Guides","description":"Advanced How-to Guides about Nomination Pools.","sidebar":"docs"},"learn/learn-guides-treasury":{"id":"learn/learn-guides-treasury","title":"Polkadot Treasury How-to Guides","description":"Advanced How-to Guides about requesting funds from the Polkadot Treasury.","sidebar":"docs"},"learn/learn-guides-vault":{"id":"learn/learn-guides-vault","title":"Vault How-to Guides","description":"Advanced How-to Guides about Polkadot Vault.","sidebar":"docs"},"learn/learn-identity":{"id":"learn/learn-identity","title":"Account Identity","description":"On-chain Identity, Judgements and Registrars.","sidebar":"docs"},"learn/learn-implementations":{"id":"learn/learn-implementations","title":"Polkadot Implementations","description":"Learn about the different Polkadot implementations."},"learn/learn-inflation":{"id":"learn/learn-inflation","title":"Token Inflation","description":"Explanation of Token\'s Inflation in the Polkadot Ecosystem.","sidebar":"docs"},"learn/learn-launch":{"id":"learn/learn-launch","title":"Polkadot Launch Phases","description":"Polkadot\'s Launch Process and its Individual Phases.","sidebar":"docs"},"learn/learn-nft":{"id":"learn/learn-nft","title":"NFTs","description":"The NFT Landscape of the Polkadot Ecosystem.","sidebar":"docs"},"learn/learn-nft-pallets":{"id":"learn/learn-nft-pallets","title":"NFT Pallets","description":"Functionalities of the NFT Pallets in the Polkadot Ecosystem.","sidebar":"docs"},"learn/learn-nft-projects":{"id":"learn/learn-nft-projects","title":"NFT projects on Polkadot and Kusama","description":"NFT Projects in the Polkadot Ecosystem.","sidebar":"docs"},"learn/learn-nomination-pools":{"id":"learn/learn-nomination-pools","title":"Nomination Pools","description":"Staking through Polkadot\'s Nomination Pools.","sidebar":"docs"},"learn/learn-nominator":{"id":"learn/learn-nominator","title":"Nominator","description":"Role of Nominators in the Polkadot Ecosystem.","sidebar":"docs"},"learn/learn-parachains":{"id":"learn/learn-parachains","title":"Parachains","description":"An Introduction to Polkadot\'s Parachains.","sidebar":"docs"},"learn/learn-parachains-faq":{"id":"learn/learn-parachains-faq","title":"Parachains FAQ","description":"Parachains FAQ.","sidebar":"docs"},"learn/learn-parachains-protocol":{"id":"learn/learn-parachains-protocol","title":"Parachains\' Protocol Overview","description":"Actors and Protocols involved in Polkadot and its Parachains\' Block Finality.","sidebar":"docs"},"learn/learn-parathreads":{"id":"learn/learn-parathreads","title":"Parathreads","description":"An Introductory Guide to Parathreads.","sidebar":"docs"},"learn/learn-phragmen":{"id":"learn/learn-phragmen","title":"NPoS Election Algorithms","description":"The Election Methods used in Polkadot\'s NPoS Mechanism.","sidebar":"docs"},"learn/learn-polkadot-host":{"id":"learn/learn-polkadot-host","title":"Polkadot Host (PH)","description":"The Polkadot Host and its Components.","sidebar":"docs"},"learn/learn-polkadot-opengov":{"id":"learn/learn-polkadot-opengov","title":"Polkadot OpenGov","description":"Polkadot\u2019s Latest Model for Decentralized Governance.","sidebar":"docs"},"learn/learn-polkadot-opengov-treasury":{"id":"learn/learn-polkadot-opengov-treasury","title":"Treasury","description":"Polkadot\'s On-chain Treasury.","sidebar":"docs"},"learn/learn-proxies":{"id":"learn/learn-proxies","title":"Proxy Accounts","description":"Proxy Accounts on Polkadot.","sidebar":"docs"},"learn/learn-proxies-pure":{"id":"learn/learn-proxies-pure","title":"Pure Proxy Accounts","description":"Pure Proxy Accounts on Polkadot.","sidebar":"docs"},"learn/learn-redenomination":{"id":"learn/learn-redenomination","title":"Redenomination of DOT","description":"Everything about the DOT Token Redenomination.","sidebar":"docs"},"learn/learn-runtime-upgrades":{"id":"learn/learn-runtime-upgrades","title":"Runtime Upgrades","description":"Forkless Runtime Upgrades on Polkadot.","sidebar":"docs"},"learn/learn-sassafras":{"id":"learn/learn-sassafras","title":"Polkadot Block Production: SASSAFRAS","description":"The Consensus Mechanism of Polkadot.","sidebar":"docs"},"learn/learn-spree":{"id":"learn/learn-spree","title":"SPREE","description":"Fundamentals of SPREE.","sidebar":"docs"},"learn/learn-staking":{"id":"learn/learn-staking","title":"Introduction to Staking","description":"Overview of Staking and NPoS on Polkadot.","sidebar":"docs"},"learn/learn-staking-advanced":{"id":"learn/learn-staking-advanced","title":"Advanced Staking Concepts","description":"Advanced Concepts about Staking on Polkadot.","sidebar":"docs"},"learn/learn-system-chains":{"id":"learn/learn-system-chains","title":"System Parachains","description":"System Parachains currently deployed on Polkadot.","sidebar":"docs"},"learn/learn-teleport":{"id":"learn/learn-teleport","title":"Teleporting Assets","description":"Teleport Assets between Parachains and Relay Chain.","sidebar":"docs"},"learn/learn-transaction-fees":{"id":"learn/learn-transaction-fees","title":"Transaction Fees","description":"How Transaction Fees are Calculated and Handled.","sidebar":"docs"},"learn/learn-treasury":{"id":"learn/learn-treasury","title":"Governance v1 Treasury","description":"The Polkadot\'s On-chain Treasury during Gov1.","sidebar":"docs"},"learn/learn-validator":{"id":"learn/learn-validator","title":"Validator","description":"Role of Validators within the Polkadot Ecosystem.","sidebar":"docs"},"learn/learn-video-tutorials":{"id":"learn/learn-video-tutorials","title":"Videos about Polkadot","description":"Videos about Polkadot and Related Topics.","sidebar":"docs"},"learn/learn-wasm":{"id":"learn/learn-wasm","title":"WebAssembly (Wasm)","description":"WASM and its Role in Polkadot\'s Runtime.","sidebar":"docs"},"learn/learn-xcm":{"id":"learn/learn-xcm","title":"Introduction to Cross-Consensus Message Format (XCM)","description":"XCM, The Messaging Format at the Forefront of Interoperability.","sidebar":"docs"},"learn/learn-xcm-instructions":{"id":"learn/learn-xcm-instructions","title":"XCM Instructions & Register Specification","description":"Specification for Instructions and Registers for the XCM Format.","sidebar":"docs"},"learn/learn-xcm-pallet":{"id":"learn/learn-xcm-pallet","title":"XCM FRAME Pallet Overview","description":"Mechanics of the XCM Pallet and its role in Polkadot\'s Ecosystem.","sidebar":"docs"},"learn/learn-xcm-transport":{"id":"learn/learn-xcm-transport","title":"XCM Transport Methods (XCMP, HRMP, VMP)","description":"Methods to send XCM Messages across Networks.","sidebar":"docs"},"learn/learn-xcm-usecases":{"id":"learn/learn-xcm-usecases","title":"XCM Use-cases & Examples","description":"Cross-consensus Interactions and the XCM Format.","sidebar":"docs"},"learn/learn-xcvm":{"id":"learn/learn-xcvm","title":"XCM Virtual Machine (XCVM) & XCM Executor","description":"Design of the XCM Executor and Mechanics of the XCM Virtual Machine.","sidebar":"docs"},"learn/xcm/executor_config/learn-xcm-docs-config-deep-dive":{"id":"learn/xcm/executor_config/learn-xcm-docs-config-deep-dive","title":"Executor Configuration","description":"Deep Dive into the Configuration of the XCM-Executor.","sidebar":"docs"},"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-fees":{"id":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-fees","title":"Weight and Fees","description":"Weight and Fees in XCM.","sidebar":"docs"},"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-multiasset":{"id":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-multiasset","title":"MultiAsset","description":"The MultiAsset Datatype.","sidebar":"docs"},"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-summary":{"id":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-summary","title":"Fundamentals","description":"Summary of the Chapter.","sidebar":"docs"},"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-xcvm":{"id":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-xcvm","title":"XCVM","description":"Deep Dive into XCVM.","sidebar":"docs"},"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-example":{"id":"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-example","title":"Example","description":"A MultiLocation Example.","sidebar":"docs"},"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-junctions":{"id":"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-junctions","title":"Junction(s)","description":"The Junction Type in a MultiLocation Struct.","sidebar":"docs"},"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-summary":{"id":"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-summary","title":"MultiLocation","description":"Learn about XCM fundamentals.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-assets":{"id":"learn/xcm/journey/learn-xcm-docs-journey-assets","title":"Trap and Claim Assets","description":"Instructions to Trap and Claim Assets.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-channels":{"id":"learn/xcm/journey/learn-xcm-docs-journey-channels","title":"Channels and Bridges","description":"Establishment of HRMP Channels between Parachains.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-expectations":{"id":"learn/xcm/journey/learn-xcm-docs-journey-expectations","title":"Expectations","description":"Expect Instructions to Check if a Condition is Valid.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-fees":{"id":"learn/xcm/journey/learn-xcm-docs-journey-fees","title":"Fee Handling","description":"How Fees for XCM Transfers are Handled.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-holding":{"id":"learn/xcm/journey/learn-xcm-docs-journey-holding","title":"More Holding Modifiers","description":"More Instructions to Alter the Holding Register.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-origin":{"id":"learn/xcm/journey/learn-xcm-docs-journey-origin","title":"Origin Manipulation","description":"Manipulating the Origin of XCM.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-queries":{"id":"learn/xcm/journey/learn-xcm-docs-journey-queries","title":"Queries","description":"Query Information from another Consensus System.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-register":{"id":"learn/xcm/journey/learn-xcm-docs-journey-register","title":"Register Modifiers","description":"More Instructions to Change the XCVM Registers.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-summary":{"id":"learn/xcm/journey/learn-xcm-docs-journey-summary","title":"A Journey through XCM","description":"Summary of the Chapter.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-transact":{"id":"learn/xcm/journey/learn-xcm-docs-journey-transact","title":"Transact","description":"The Transact Instruction to Execute XCM Calls.","sidebar":"docs"},"learn/xcm/journey/learn-xcm-docs-journey-version":{"id":"learn/xcm/journey/learn-xcm-docs-journey-version","title":"Version Subscription","description":"Get Notified about XCM Version Updates.","sidebar":"docs"},"learn/xcm/journey/locks/learn-xcm-docs-journey-locks":{"id":"learn/xcm/journey/locks/learn-xcm-docs-journey-locks","title":"Locks","description":"Restrict Transfer or Withdrawal of Assets.","sidebar":"docs"},"learn/xcm/journey/transfers/learn-xcm-docs-transfers-reserve":{"id":"learn/xcm/journey/transfers/learn-xcm-docs-transfers-reserve","title":"Reserve-backed Transfers","description":"Reserve-backed Transfers: Third-party Reserve to store Assets.","sidebar":"docs"},"learn/xcm/journey/transfers/learn-xcm-docs-transfers-summary":{"id":"learn/xcm/journey/transfers/learn-xcm-docs-transfers-summary","title":"Transfers","description":"Summary about XCM Transfers.","sidebar":"docs"},"learn/xcm/journey/transfers/learn-xcm-docs-transfers-teleport":{"id":"learn/xcm/journey/transfers/learn-xcm-docs-transfers-teleport","title":"Asset Teleportation","description":"Teleportation: Sending Assets Across Chains.","sidebar":"docs"},"learn/xcm/learn-xcm-docs-intro":{"id":"learn/xcm/learn-xcm-docs-intro","title":"XCM: Cross-Consensus Messaging","description":"Introduction to the XCM Documentation.","sidebar":"docs"},"learn/xcm/learn-xcm-docs-testing":{"id":"learn/xcm/learn-xcm-docs-testing","title":"Testing","description":"Testing XCM-powered Solutions.","sidebar":"docs"},"learn/xcm/overview/learn-xcm-docs-overview-architecture":{"id":"learn/xcm/overview/learn-xcm-docs-overview-architecture","title":"The XCM Architecture","description":"The XCM Architecture.","sidebar":"docs"},"learn/xcm/overview/learn-xcm-docs-overview-format":{"id":"learn/xcm/overview/learn-xcm-docs-overview-format","title":"XCM is a Format, not a Protocol","description":"XCM is a Format, not a Protocol.","sidebar":"docs"},"learn/xcm/overview/learn-xcm-docs-overview-intro":{"id":"learn/xcm/overview/learn-xcm-docs-overview-intro","title":"Introduction","description":"An Introduction to XCM.","sidebar":"docs"},"learn/xcm/overview/learn-xcm-docs-overview-summary":{"id":"learn/xcm/overview/learn-xcm-docs-overview-summary","title":"XCM: Cross-Consensus Messaging","description":"Summary of the Chapter.","sidebar":"docs"},"learn/xcm/overview/learn-xcm-docs-overview-xcvm":{"id":"learn/xcm/overview/learn-xcm-docs-overview-xcvm","title":"The XCVM","description":"The Cross-Consensus Virtual Machine.","sidebar":"docs"},"learn/xcm/quickstart/learn-xcm-docs-quickstart-first-look":{"id":"learn/xcm/quickstart/learn-xcm-docs-quickstart-first-look","title":"First Look at an XCM","description":"First Look at an XCM.","sidebar":"docs"},"learn/xcm/quickstart/learn-xcm-docs-quickstart-simulator":{"id":"learn/xcm/quickstart/learn-xcm-docs-quickstart-simulator","title":"XCM Simulator","description":"Test XCM using a Simulated Environment.","sidebar":"docs"},"learn/xcm/quickstart/learn-xcm-docs-quickstart-summary":{"id":"learn/xcm/quickstart/learn-xcm-docs-quickstart-summary","title":"Quickstart","description":"Summary of the Chapter.","sidebar":"docs"},"learn/xcm/reference/learn-xcm-docs-reference-glossary":{"id":"learn/xcm/reference/learn-xcm-docs-reference-glossary","title":"Glossary","description":"Glossary.","sidebar":"docs"},"learn/xcm/reference/learn-xcm-docs-reference-xcvm-registers":{"id":"learn/xcm/reference/learn-xcm-docs-reference-xcvm-registers","title":"All XCVM Registers","description":"All XCVM Registers.","sidebar":"docs"},"maintain/doc-maintain-guides-validator-community":{"id":"maintain/doc-maintain-guides-validator-community","title":"Validator Community Overview","description":"An extensive guide to help you start and build a validator community.","sidebar":"docs"},"maintain/kusama/maintain-guides-how-to-nominate-kusama":{"id":"maintain/kusama/maintain-guides-how-to-nominate-kusama","title":"Become a Nominator on Kusama","description":"Steps on how to nominate on Kusama."},"maintain/kusama/maintain-guides-how-to-validate-kusama":{"id":"maintain/kusama/maintain-guides-how-to-validate-kusama","title":"Run a Validator (Kusama)","description":"The fundamentals for running a Kusama validator."},"maintain/kusama/maintain-guides-society-kusama":{"id":"maintain/kusama/maintain-guides-society-kusama","title":"Kappa Sigma Mu","description":"Learn about the Kappa Sigma Mu society and join as a member."},"maintain/maintain-bootnode":{"id":"maintain/maintain-bootnode","title":"Set up a Boot Node","description":"Steps on setting up a boot node.","sidebar":"docs"},"maintain/maintain-endpoints":{"id":"maintain/maintain-endpoints","title":"Node Endpoints","description":"List of node endpoints and examples of use.","sidebar":"docs"},"maintain/maintain-errors":{"id":"maintain/maintain-errors","title":"Errors and How to Resolve Them","description":"Common errors you might encounter and how they can be resolved.","sidebar":"docs"},"maintain/maintain-guides-avoid-slashing":{"id":"maintain/maintain-guides-avoid-slashing","title":"Validator Best Practices","description":"Best practices to avoid slashing.","sidebar":"docs"},"maintain/maintain-guides-democracy":{"id":"maintain/maintain-guides-democracy","title":"Participate in Democracy","description":"Steps on how to participate in democracy.","sidebar":"docs"},"maintain/maintain-guides-how-to-chill":{"id":"maintain/maintain-guides-how-to-chill","title":"How to Chill","description":"Steps on chilling as a network participant.","sidebar":"docs"},"maintain/maintain-guides-how-to-join-council":{"id":"maintain/maintain-guides-how-to-join-council","title":"Join the Council","description":"Steps on how to join the official on-chain council.","sidebar":"docs"},"maintain/maintain-guides-how-to-monitor-your-node":{"id":"maintain/maintain-guides-how-to-monitor-your-node","title":"Monitor your node","description":"This guide will walk you through how to set up Prometheus with","sidebar":"docs"},"maintain/maintain-guides-how-to-nominate-polkadot":{"id":"maintain/maintain-guides-how-to-nominate-polkadot","title":"Become a Nominator on Polkadot","description":"Steps on how to nominate on Polkadot.","sidebar":"docs"},"maintain/maintain-guides-how-to-stop-validating":{"id":"maintain/maintain-guides-how-to-stop-validating","title":"How to Stop Validating","description":"Steps on how to stop validating.","sidebar":"docs"},"maintain/maintain-guides-how-to-systemd":{"id":"maintain/maintain-guides-how-to-systemd","title":"Using systemd for a Validator Node","description":"Using a service manager for your validator node.","sidebar":"docs"},"maintain/maintain-guides-how-to-upgrade":{"id":"maintain/maintain-guides-how-to-upgrade","title":"How to Upgrade Your Validator","description":"Validators perform critical functions for the network, and as such, have strict uptime requirements.","sidebar":"docs"},"maintain/maintain-guides-how-to-validate-polkadot":{"id":"maintain/maintain-guides-how-to-validate-polkadot","title":"Run a Validator (Polkadot)","description":"The fundamentals for running a Polkadot validator.","sidebar":"docs"},"maintain/maintain-guides-how-to-vote-councillor":{"id":"maintain/maintain-guides-how-to-vote-councillor","title":"Voting for Councillors","description":"Steps on how to vote for councillors.","sidebar":"docs"},"maintain/maintain-guides-polkadot-opengov":{"id":"maintain/maintain-guides-polkadot-opengov","title":"Participate in Polkadot OpenGov","description":"Steps on how to participate in OpenGov.","sidebar":"docs"},"maintain/maintain-guides-secure-validator":{"id":"maintain/maintain-guides-secure-validator","title":"Secure Validator","description":"Tips for running a secure validator.","sidebar":"docs"},"maintain/maintain-guides-validator-payout":{"id":"maintain/maintain-guides-validator-payout","title":"Validator Payout Overview","description":"How validator payout works on the network and what you should expect.","sidebar":"docs"},"maintain/maintain-index":{"id":"maintain/maintain-index","title":"Network Maintainers","description":"Reference point for network maintenance guides.","sidebar":"docs"},"maintain/maintain-networks":{"id":"maintain/maintain-networks","title":"Networks","description":"Information about the different networks of the Polkadot ecosystem.","sidebar":"docs"},"maintain/maintain-polkadot-parameters":{"id":"maintain/maintain-polkadot-parameters","title":"Polkadot Parameters","description":"A description about fundamental Polkadot parameters.","sidebar":"docs"},"maintain/maintain-rpc":{"id":"maintain/maintain-rpc","title":"Set up a RPC node","description":"Steps on setting up a RPC node.","sidebar":"docs"},"maintain/maintain-sync":{"id":"maintain/maintain-sync","title":"Set up a Full Node","description":"Steps on how to set up a full node.","sidebar":"docs"},"maintain/maintain-wss":{"id":"maintain/maintain-wss","title":"Secure the WebSocket","description":"Steps on setting up a secure socket for remote connections.","sidebar":"docs"}}}')}}]); \ No newline at end of file diff --git a/assets/js/991ceaa9.e270d9d6.js b/assets/js/991ceaa9.e270d9d6.js deleted file mode 100644 index d73acca0991e..000000000000 --- a/assets/js/991ceaa9.e270d9d6.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[4428],{47940:(t,e,a)=>{"use strict";a.d(e,{Z:()=>u});var n=a(74165),o=a(15861),i=a(67294),r=a(87152),s=a(17145),l=a(67425);function p(t,e,a){return d.apply(this,arguments)}function d(){return(d=(0,o.Z)((0,n.Z)().mark((function t(e,a,o){var i,l,p,d,k;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:i=void 0,l=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){t.next=18;break}return t.abrupt("return");case 18:return p=new r.U(i),t.next=21,s.G.create({provider:p});case 21:d=t.sent,(k=a.split(".")).forEach((function(t){t in d&&(d=d[t])})),t.t1=k[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return l=d.toString(),t.abrupt("break",35);case 29:return t.next=31,d();case 31:return l=(l=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+k[0]+") in "+a);case 35:return t.abrupt("return",l);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function k(t,e,a,n){switch(e){case"humanReadable":(0,l.HumanReadable)(t,a,n);break;case"precise":(0,l.Precise)(t,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(t,n);break;case"percentage":(0,l.Percentage)(t,n);break;case"arrayLength":(0,l.ArrayLength)(t,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(t){var e=t.network,a=t.path,r=t.defaultValue,s=t.filter,l=void 0===s?void 0:s,d=(0,i.useState)(""),u=d[0],c=d[1];return e=e.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?k(r.toString(),l,e,c):c(r.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var t=(0,o.Z)((0,n.Z)().mark((function t(){var o;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,p(e,a,c);case 2:if(void 0!==(o=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==l?k(o,l,e,c):c(o);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),u}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}t=parseFloat(t),n((t=Number.isInteger(t/e[a].precision)?t/e[a].precision+" "+e[a].symbol:(t/e[a].precision).toFixed(o)+" "+e[a].symbol).toString())},Precise:function(t,a,n){n(t=(t=parseFloat(t))/e[a].precision+" "+e[a].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},35265:(t,e,a)=>{"use strict";a.r(e),a.d(e,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>p,toc:()=>k});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),r=(a(47940),["components"]),s={id:"maintain-guides-how-to-nominate-polkadot",title:"Become a Nominator on Polkadot",sidebar_label:"Nominator Guides",description:"Steps on how to nominate on Polkadot.",keywords:["nominate","how to nominate","nominator","stake"],slug:"../maintain-guides-how-to-nominate-polkadot"},l=void 0,p={unversionedId:"maintain/maintain-guides-how-to-nominate-polkadot",id:"maintain/maintain-guides-how-to-nominate-polkadot",title:"Become a Nominator on Polkadot",description:"Steps on how to nominate on Polkadot.",source:"@site/../docs/maintain/maintain-guides-how-to-nominate-polkadot.md",sourceDirName:"maintain",slug:"/maintain-guides-how-to-nominate-polkadot",permalink:"/docs/maintain-guides-how-to-nominate-polkadot",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/maintain-guides-how-to-nominate-polkadot.md",tags:[],version:"current",lastUpdatedBy:"Radha",lastUpdatedAt:1695304296,formattedLastUpdatedAt:"Sep 21, 2023",frontMatter:{id:"maintain-guides-how-to-nominate-polkadot",title:"Become a Nominator on Polkadot",sidebar_label:"Nominator Guides",description:"Steps on how to nominate on Polkadot.",keywords:["nominate","how to nominate","nominator","stake"],slug:"../maintain-guides-how-to-nominate-polkadot"},sidebar:"docs",previous:{title:"Resolving Errors",permalink:"/docs/maintain-errors"},next:{title:"How to run a Validator on Polkadot",permalink:"/docs/maintain-guides-how-to-validate-polkadot"}},d={},k=[{value:"Setting up Stash and Staking Proxy Accounts",id:"setting-up-stash-and-staking-proxy-accounts",level:2},{value:"Using the Polkadot Staking Dashboard",id:"using-the-polkadot-staking-dashboard",level:2},{value:"Why am I not receiving Staking Rewards?",id:"why-am-i-not-receiving-staking-rewards",level:2},{value:"Using Polkadot-JS UI",id:"using-polkadot-js-ui",level:2},{value:"Using Command-Line Interface (CLI)",id:"using-command-line-interface-cli",level:2},{value:"Step 1: Install @polkadot/api-cli",id:"step-1-install-polkadotapi-cli",level:3},{value:"Step 2. Bond your DOT",id:"step-2-bond-your-dot",level:3},{value:"Step 3. Nominate a validator",id:"step-3-nominate-a-validator",level:3}],u={toc:k},c="wrapper";function m(t){var e=t.components,a=(0,o.Z)(t,r);return(0,i.kt)(c,(0,n.Z)({},u,a,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{title:"New to Staking?",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"Start your staking journey or explore more information about staking on\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/staking/"},"Polkadot's Home Page"),". You can learn how staking works by\nreading ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking"},"this dedicated page"),"."),(0,i.kt)("p",{parentName:"admonition"},"Discover the new ",(0,i.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/#/overview"},(0,i.kt)("strong",{parentName:"a"},"Staking Dashboard"))," that makes\nstaking much easier and check this\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182104"},"extensive article list")," to\nhelp you get started.\n")),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The following information applies to the Polkadot network. If you want to nominate on Kusama, check\nout the ",(0,i.kt)("a",{parentName:"p",href:"https://guide.kusama.network/docs/maintain-guides-how-to-nominate-kusama/"},"Kusama guide"),"\ninstead.")),(0,i.kt)("p",null,"Nominators are one type of participant in the staking subsystem of Polkadot. They appoint their\nstake to the validators, the second type of participant. By appointing their stake, they can elect\nthe active set of validators and share in the rewards that are paid out."),(0,i.kt)("p",null,"While the ",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-validate-polkadot"},"validators")," are active participants in the\nnetwork that engage in the block production and finality mechanisms, nominators take a slightly more\npassive role. Being a nominator does not require running a node of your own or worrying about online\nuptime. However, a good nominator performs due diligence on the validators that they elect. When\nlooking for validators to nominate, a nominator should pay attention to their own reward percentage\nfor nominating a specific validator - as well as the risk that they bear of being slashed if the\nvalidator gets slashed."),(0,i.kt)("p",null,"If you are a beginner, please watch the video below for detailed instructions."),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=F59N3YKYCRs"},(0,i.kt)("img",{parentName:"a",src:"https://img.youtube.com/vi/F59N3YKYCRs/0.jpg",alt:"Staking Tutorial"}))),(0,i.kt)("h2",{id:"setting-up-stash-and-staking-proxy-accounts"},"Setting up Stash and Staking Proxy Accounts"),(0,i.kt)("p",null,"Nominators 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",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography#keys"},"keys")," section of the Wiki."),(0,i.kt)("p",null,"You can generate your stash and staking proxy account via any of the recommended methods, which are\ndetailed on the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-account-generation"},"account generation")," page."),(0,i.kt)("p",null,"Starting with runtime version v23 natively included in the client version\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/releases/tag/v0.8.23"},"0.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."),(0,i.kt)("h2",{id:"using-the-polkadot-staking-dashboard"},"Using the Polkadot Staking Dashboard"),(0,i.kt)("admonition",{title:"Walk-through Video Tutorials",type:"info"},(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://youtu.be/F59N3YKYCRs"},(0,i.kt)("strong",{parentName:"a"},"Nominating")),": Stake your tokens, choose your best validators,\nand start your staking journey on Polkadot."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://youtu.be/dDIG7QAApig"},(0,i.kt)("strong",{parentName:"a"},"Becoming a Pool Member")),": Start becoming a part of the Polkadot\nmovement, keep Polkadot secure by staking minimum 1 DOT and receiving staking rewards."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://youtu.be/hvXLc4H7rA4"},(0,i.kt)("strong",{parentName:"a"},"Dashboard Walkthrough")),": Become a Pro using the Staking\nDashboard."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://youtu.be/58pIe8tt2o4"},(0,i.kt)("strong",{parentName:"a"},"After Staking")),": Nominating on Polkadot is not a set-and-forget\naction, learn what you can do with the dashboard after you started staking."))),(0,i.kt)("h2",{id:"why-am-i-not-receiving-staking-rewards"},"Why am I not receiving Staking Rewards?"),(0,i.kt)("admonition",{title:"Bags List & Minimum Active Bond",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"See ",(0,i.kt)("a",{parentName:"p",href:"https://youtu.be/hIIZRJLrBZA"},(0,i.kt)("strong",{parentName:"a"},"this video tutorial"))," and read\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181018-i-have-more-than-the-minimum-bonded-but-i-m-not-getting-rewards"},(0,i.kt)("strong",{parentName:"a"},"this support article")),"\nto understand why in some cases you might not receive staking rewards and how to avoid those\nsituations.")),(0,i.kt)("h2",{id:"using-polkadot-js-ui"},"Using Polkadot-JS UI"),(0,i.kt)("admonition",{title:"Using Polkadot-JS UI as a Nominator",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Here is the list of basic nominator actions that can be performed using the Polkadot-JS UI."),(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000168057-polkadot-js-ui-how-do-i-stake-nominate-on-polkadot-"},"How to Bond Tokens and Nominate")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000150130-how-do-i-know-which-validators-to-choose-"},"How to Select Validators")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000167902-how-can-i-unstake-my-tokens-again-"},"How to Stop Nominating & Unbond Tokens")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000170241-polkadot-js-ui-how-to-rebond-tokens-during-the-unbonding-period"},"How to Rebond Tokens")))),(0,i.kt)("admonition",{title:"Video Tutorials",type:"info"},(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://youtu.be/FCXC0CDhyS4?t=219"},"How to Nominate/Stake")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://youtu.be/7VlTncHCGPc"},"Staking with a Ledger and PolkadotJS Apps")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=jL-N_IWiYVA"},"Staking with a Ledger and Ledger Live")))),(0,i.kt)("h2",{id:"using-command-line-interface-cli"},"Using Command-Line Interface (CLI)"),(0,i.kt)("p",null,"Apart from using Polkadot-JS Apps to participate in staking, you can do all these things in CLI\ninstead. The CLI approach allows you to interact with the Polkadot network without going to the\nPolkadot-JS Apps dashboard."),(0,i.kt)("h3",{id:"step-1-install-polkadotapi-cli"},"Step 1: Install @polkadot/api-cli"),(0,i.kt)("p",null,"We assume you have installed ",(0,i.kt)("a",{parentName:"p",href:"https://nodejs.org"},"NodeJS with npm"),". Run the following command to\ninstall the ",(0,i.kt)("inlineCode",{parentName:"p"},"@polkadot/api-cli")," globally:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"npm install -g @polkadot/api-cli\n")),(0,i.kt)("h3",{id:"step-2-bond-your-dot"},"Step 2. Bond your DOT"),(0,i.kt)("admonition",{title:"Controller accounts are deprecated",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Controller accounts are deprecated. For more information, see\n",(0,i.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/t/staking-controller-deprecation-plan-staking-ui-leads-comms/2748"},"this discussion"),".")),(0,i.kt)("p",null,"Executing the following command:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'polkadot-js-api --seed "MNEMONIC_PHRASE" tx.staking.bond CONTROLLER_ADDRESS NUMBER_OF_TOKENS REWARD_DESTINATION --ws WEBSOCKET_ENDPOINT\n')),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"CONTROLLER_ADDRESS"),": An address you would like to bond to the stash account. (Controller accounts\nare now deprecated. Refer to\n",(0,i.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/t/staking-controller-deprecation-plan-staking-ui-leads-comms/2748"},"this discussion"),"\nfor additional context)"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"NUMBER_OF_TOKENS"),": The number of DOT you would like to stake to the network."),(0,i.kt)("admonition",{title:"Decimal places",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"DOT has ten decimal places and is always represented as an integer with zeros at the end. So 1 DOT =\n10_000_000_000 Plancks.")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"REWARD_DESTINATION"),":"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Staked")," - Pay into the stash account, increasing the amount at stake accordingly."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Stash")," - Pay into the stash account, not increasing the amount at stake."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Account")," - Pay into a custom account, like so:\n",(0,i.kt)("inlineCode",{parentName:"li"},"Account DMTHrNcmA8QbqRS4rBq8LXn8ipyczFoNMb1X4cY2WD9tdBX"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Controller")," - Pay into the controller account.")),(0,i.kt)("p",null,"Example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'polkadot-js-api --seed "xxxx xxxxx xxxx xxxxx" tx.staking.bond DMTHrNcmA8QbqRS4rBq8LXn8ipyczFoNMb1X4cY2WD9tdBX 1000000000000 Staked --ws wss://rpc.polkadot.io\n')),(0,i.kt)("p",null,"Result:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'...\n...\n "status": {\n "InBlock": "0x0ed1ec0ba69564e8f98958d69f826adef895b5617366a32a3aa384290e98514e"\n }\n')),(0,i.kt)("p",null,"You can check the transaction status by using the value of the ",(0,i.kt)("inlineCode",{parentName:"p"},"InBlock")," in\n",(0,i.kt)("a",{parentName:"p",href:"https://polkascan.io/polkadot-cc1"},"Polkascan"),". Also, you can verify the bonding state under the\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/actions"},"Staking")," page on the Polkadot-JS Apps Dashboard."),(0,i.kt)("h3",{id:"step-3-nominate-a-validator"},"Step 3. Nominate a validator"),(0,i.kt)("p",null,"To nominate a validator, you can execute the following command:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'polkadot-js-api --seed "MNEMONIC_PHRASE" tx.staking.nominate \'["VALIDATOR_ADDRESS"]\' --ws WS_ENDPOINT\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'polkadot-js-api --seed "xxxx xxxxx xxxx xxxxx" tx.staking.nominate \'["CmD9vaMYoiKe7HiFnfkftwvhKbxN9bhyjcDrfFRGbifJEG8","E457XaKbj2yTB2URy8N4UuzmyuFRkcdxYs67UvSgVr7HyFb"]\' --ws wss://rpc.polkadot.io\n')),(0,i.kt)("p",null,"After 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-JS UI as well."))}m.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/991ceaa9.fb46e5d9.js b/assets/js/991ceaa9.fb46e5d9.js new file mode 100644 index 000000000000..d1409bd882d0 --- /dev/null +++ b/assets/js/991ceaa9.fb46e5d9.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[4428],{47940:(t,e,a)=>{"use strict";a.d(e,{Z:()=>u});var n=a(74165),o=a(15861),i=a(67294),r=a(87152),s=a(17145),l=a(67425);function p(t,e,a){return d.apply(this,arguments)}function d(){return(d=(0,o.Z)((0,n.Z)().mark((function t(e,a,o){var i,l,p,d,k;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:i=void 0,l=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){t.next=18;break}return t.abrupt("return");case 18:return p=new r.U(i),t.next=21,s.G.create({provider:p});case 21:d=t.sent,(k=a.split(".")).forEach((function(t){t in d&&(d=d[t])})),t.t1=k[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return l=d.toString(),t.abrupt("break",35);case 29:return t.next=31,d();case 31:return l=(l=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+k[0]+") in "+a);case 35:return t.abrupt("return",l);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function k(t,e,a,n){switch(e){case"humanReadable":(0,l.HumanReadable)(t,a,n);break;case"precise":(0,l.Precise)(t,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(t,n);break;case"percentage":(0,l.Percentage)(t,n);break;case"permillToPercent":(0,l.PermillToPercent)(t,n);break;case"arrayLength":(0,l.ArrayLength)(t,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(t){var e=t.network,a=t.path,r=t.defaultValue,s=t.filter,l=void 0===s?void 0:s,d=(0,i.useState)(""),u=d[0],c=d[1];return e=e.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?k(r.toString(),l,e,c):c(r.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var t=(0,o.Z)((0,n.Z)().mark((function t(){var o;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,p(e,a,c);case 2:if(void 0!==(o=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==l?k(o,l,e,c):c(o);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),u}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}t=parseFloat(t),n((t=Number.isInteger(t/e[a].precision)?t/e[a].precision+" "+e[a].symbol:(t/e[a].precision).toFixed(o)+" "+e[a].symbol).toString())},Precise:function(t,a,n){n(t=(t=parseFloat(t))/e[a].precision+" "+e[a].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},PermillToPercent:function(t,e){e((t/=1e4).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},35265:(t,e,a)=>{"use strict";a.r(e),a.d(e,{assets:()=>d,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>p,toc:()=>k});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),r=(a(47940),["components"]),s={id:"maintain-guides-how-to-nominate-polkadot",title:"Become a Nominator on Polkadot",sidebar_label:"Nominator Guides",description:"Steps on how to nominate on Polkadot.",keywords:["nominate","how to nominate","nominator","stake"],slug:"../maintain-guides-how-to-nominate-polkadot"},l=void 0,p={unversionedId:"maintain/maintain-guides-how-to-nominate-polkadot",id:"maintain/maintain-guides-how-to-nominate-polkadot",title:"Become a Nominator on Polkadot",description:"Steps on how to nominate on Polkadot.",source:"@site/../docs/maintain/maintain-guides-how-to-nominate-polkadot.md",sourceDirName:"maintain",slug:"/maintain-guides-how-to-nominate-polkadot",permalink:"/docs/maintain-guides-how-to-nominate-polkadot",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/maintain-guides-how-to-nominate-polkadot.md",tags:[],version:"current",lastUpdatedBy:"Radha",lastUpdatedAt:1695304296,formattedLastUpdatedAt:"Sep 21, 2023",frontMatter:{id:"maintain-guides-how-to-nominate-polkadot",title:"Become a Nominator on Polkadot",sidebar_label:"Nominator Guides",description:"Steps on how to nominate on Polkadot.",keywords:["nominate","how to nominate","nominator","stake"],slug:"../maintain-guides-how-to-nominate-polkadot"},sidebar:"docs",previous:{title:"Resolving Errors",permalink:"/docs/maintain-errors"},next:{title:"How to run a Validator on Polkadot",permalink:"/docs/maintain-guides-how-to-validate-polkadot"}},d={},k=[{value:"Setting up Stash and Staking Proxy Accounts",id:"setting-up-stash-and-staking-proxy-accounts",level:2},{value:"Using the Polkadot Staking Dashboard",id:"using-the-polkadot-staking-dashboard",level:2},{value:"Why am I not receiving Staking Rewards?",id:"why-am-i-not-receiving-staking-rewards",level:2},{value:"Using Polkadot-JS UI",id:"using-polkadot-js-ui",level:2},{value:"Using Command-Line Interface (CLI)",id:"using-command-line-interface-cli",level:2},{value:"Step 1: Install @polkadot/api-cli",id:"step-1-install-polkadotapi-cli",level:3},{value:"Step 2. Bond your DOT",id:"step-2-bond-your-dot",level:3},{value:"Step 3. Nominate a validator",id:"step-3-nominate-a-validator",level:3}],u={toc:k},c="wrapper";function m(t){var e=t.components,a=(0,o.Z)(t,r);return(0,i.kt)(c,(0,n.Z)({},u,a,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{title:"New to Staking?",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"Start your staking journey or explore more information about staking on\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/staking/"},"Polkadot's Home Page"),". You can learn how staking works by\nreading ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking"},"this dedicated page"),"."),(0,i.kt)("p",{parentName:"admonition"},"Discover the new ",(0,i.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/#/overview"},(0,i.kt)("strong",{parentName:"a"},"Staking Dashboard"))," that makes\nstaking much easier and check this\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182104"},"extensive article list")," to\nhelp you get started.\n")),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The following information applies to the Polkadot network. If you want to nominate on Kusama, check\nout the ",(0,i.kt)("a",{parentName:"p",href:"https://guide.kusama.network/docs/maintain-guides-how-to-nominate-kusama/"},"Kusama guide"),"\ninstead.")),(0,i.kt)("p",null,"Nominators are one type of participant in the staking subsystem of Polkadot. They appoint their\nstake to the validators, the second type of participant. By appointing their stake, they can elect\nthe active set of validators and share in the rewards that are paid out."),(0,i.kt)("p",null,"While the ",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-validate-polkadot"},"validators")," are active participants in the\nnetwork that engage in the block production and finality mechanisms, nominators take a slightly more\npassive role. Being a nominator does not require running a node of your own or worrying about online\nuptime. However, a good nominator performs due diligence on the validators that they elect. When\nlooking for validators to nominate, a nominator should pay attention to their own reward percentage\nfor nominating a specific validator - as well as the risk that they bear of being slashed if the\nvalidator gets slashed."),(0,i.kt)("p",null,"If you are a beginner, please watch the video below for detailed instructions."),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=F59N3YKYCRs"},(0,i.kt)("img",{parentName:"a",src:"https://img.youtube.com/vi/F59N3YKYCRs/0.jpg",alt:"Staking Tutorial"}))),(0,i.kt)("h2",{id:"setting-up-stash-and-staking-proxy-accounts"},"Setting up Stash and Staking Proxy Accounts"),(0,i.kt)("p",null,"Nominators 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",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography#keys"},"keys")," section of the Wiki."),(0,i.kt)("p",null,"You can generate your stash and staking proxy account via any of the recommended methods, which are\ndetailed on the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-account-generation"},"account generation")," page."),(0,i.kt)("p",null,"Starting with runtime version v23 natively included in the client version\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/releases/tag/v0.8.23"},"0.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."),(0,i.kt)("h2",{id:"using-the-polkadot-staking-dashboard"},"Using the Polkadot Staking Dashboard"),(0,i.kt)("admonition",{title:"Walk-through Video Tutorials",type:"info"},(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://youtu.be/F59N3YKYCRs"},(0,i.kt)("strong",{parentName:"a"},"Nominating")),": Stake your tokens, choose your best validators,\nand start your staking journey on Polkadot."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://youtu.be/dDIG7QAApig"},(0,i.kt)("strong",{parentName:"a"},"Becoming a Pool Member")),": Start becoming a part of the Polkadot\nmovement, keep Polkadot secure by staking minimum 1 DOT and receiving staking rewards."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://youtu.be/hvXLc4H7rA4"},(0,i.kt)("strong",{parentName:"a"},"Dashboard Walkthrough")),": Become a Pro using the Staking\nDashboard."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://youtu.be/58pIe8tt2o4"},(0,i.kt)("strong",{parentName:"a"},"After Staking")),": Nominating on Polkadot is not a set-and-forget\naction, learn what you can do with the dashboard after you started staking."))),(0,i.kt)("h2",{id:"why-am-i-not-receiving-staking-rewards"},"Why am I not receiving Staking Rewards?"),(0,i.kt)("admonition",{title:"Bags List & Minimum Active Bond",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"See ",(0,i.kt)("a",{parentName:"p",href:"https://youtu.be/hIIZRJLrBZA"},(0,i.kt)("strong",{parentName:"a"},"this video tutorial"))," and read\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181018-i-have-more-than-the-minimum-bonded-but-i-m-not-getting-rewards"},(0,i.kt)("strong",{parentName:"a"},"this support article")),"\nto understand why in some cases you might not receive staking rewards and how to avoid those\nsituations.")),(0,i.kt)("h2",{id:"using-polkadot-js-ui"},"Using Polkadot-JS UI"),(0,i.kt)("admonition",{title:"Using Polkadot-JS UI as a Nominator",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Here is the list of basic nominator actions that can be performed using the Polkadot-JS UI."),(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000168057-polkadot-js-ui-how-do-i-stake-nominate-on-polkadot-"},"How to Bond Tokens and Nominate")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000150130-how-do-i-know-which-validators-to-choose-"},"How to Select Validators")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000167902-how-can-i-unstake-my-tokens-again-"},"How to Stop Nominating & Unbond Tokens")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000170241-polkadot-js-ui-how-to-rebond-tokens-during-the-unbonding-period"},"How to Rebond Tokens")))),(0,i.kt)("admonition",{title:"Video Tutorials",type:"info"},(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://youtu.be/FCXC0CDhyS4?t=219"},"How to Nominate/Stake")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://youtu.be/7VlTncHCGPc"},"Staking with a Ledger and PolkadotJS Apps")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=jL-N_IWiYVA"},"Staking with a Ledger and Ledger Live")))),(0,i.kt)("h2",{id:"using-command-line-interface-cli"},"Using Command-Line Interface (CLI)"),(0,i.kt)("p",null,"Apart from using Polkadot-JS Apps to participate in staking, you can do all these things in CLI\ninstead. The CLI approach allows you to interact with the Polkadot network without going to the\nPolkadot-JS Apps dashboard."),(0,i.kt)("h3",{id:"step-1-install-polkadotapi-cli"},"Step 1: Install @polkadot/api-cli"),(0,i.kt)("p",null,"We assume you have installed ",(0,i.kt)("a",{parentName:"p",href:"https://nodejs.org"},"NodeJS with npm"),". Run the following command to\ninstall the ",(0,i.kt)("inlineCode",{parentName:"p"},"@polkadot/api-cli")," globally:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"npm install -g @polkadot/api-cli\n")),(0,i.kt)("h3",{id:"step-2-bond-your-dot"},"Step 2. Bond your DOT"),(0,i.kt)("admonition",{title:"Controller accounts are deprecated",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Controller accounts are deprecated. For more information, see\n",(0,i.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/t/staking-controller-deprecation-plan-staking-ui-leads-comms/2748"},"this discussion"),".")),(0,i.kt)("p",null,"Executing the following command:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'polkadot-js-api --seed "MNEMONIC_PHRASE" tx.staking.bond CONTROLLER_ADDRESS NUMBER_OF_TOKENS REWARD_DESTINATION --ws WEBSOCKET_ENDPOINT\n')),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"CONTROLLER_ADDRESS"),": An address you would like to bond to the stash account. (Controller accounts\nare now deprecated. Refer to\n",(0,i.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/t/staking-controller-deprecation-plan-staking-ui-leads-comms/2748"},"this discussion"),"\nfor additional context)"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"NUMBER_OF_TOKENS"),": The number of DOT you would like to stake to the network."),(0,i.kt)("admonition",{title:"Decimal places",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"DOT has ten decimal places and is always represented as an integer with zeros at the end. So 1 DOT =\n10_000_000_000 Plancks.")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"REWARD_DESTINATION"),":"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Staked")," - Pay into the stash account, increasing the amount at stake accordingly."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Stash")," - Pay into the stash account, not increasing the amount at stake."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Account")," - Pay into a custom account, like so:\n",(0,i.kt)("inlineCode",{parentName:"li"},"Account DMTHrNcmA8QbqRS4rBq8LXn8ipyczFoNMb1X4cY2WD9tdBX"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Controller")," - Pay into the controller account.")),(0,i.kt)("p",null,"Example:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'polkadot-js-api --seed "xxxx xxxxx xxxx xxxxx" tx.staking.bond DMTHrNcmA8QbqRS4rBq8LXn8ipyczFoNMb1X4cY2WD9tdBX 1000000000000 Staked --ws wss://rpc.polkadot.io\n')),(0,i.kt)("p",null,"Result:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'...\n...\n "status": {\n "InBlock": "0x0ed1ec0ba69564e8f98958d69f826adef895b5617366a32a3aa384290e98514e"\n }\n')),(0,i.kt)("p",null,"You can check the transaction status by using the value of the ",(0,i.kt)("inlineCode",{parentName:"p"},"InBlock")," in\n",(0,i.kt)("a",{parentName:"p",href:"https://polkascan.io/polkadot-cc1"},"Polkascan"),". Also, you can verify the bonding state under the\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/actions"},"Staking")," page on the Polkadot-JS Apps Dashboard."),(0,i.kt)("h3",{id:"step-3-nominate-a-validator"},"Step 3. Nominate a validator"),(0,i.kt)("p",null,"To nominate a validator, you can execute the following command:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'polkadot-js-api --seed "MNEMONIC_PHRASE" tx.staking.nominate \'["VALIDATOR_ADDRESS"]\' --ws WS_ENDPOINT\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},'polkadot-js-api --seed "xxxx xxxxx xxxx xxxxx" tx.staking.nominate \'["CmD9vaMYoiKe7HiFnfkftwvhKbxN9bhyjcDrfFRGbifJEG8","E457XaKbj2yTB2URy8N4UuzmyuFRkcdxYs67UvSgVr7HyFb"]\' --ws wss://rpc.polkadot.io\n')),(0,i.kt)("p",null,"After 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-JS UI as well."))}m.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/a74a59a0.d5047536.js b/assets/js/a74a59a0.d5047536.js deleted file mode 100644 index 016252929924..000000000000 --- a/assets/js/a74a59a0.d5047536.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[8702],{12418:(e,t,a)=>{"use strict";a.d(t,{Z:()=>u});var n=a(74165),o=a(15861),i=a(67294),r=a(87152),s=a(17145),l=a(67425);function d(e,t,a){return p.apply(this,arguments)}function p(){return(p=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var i,d,p,u,c,h,m,k;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return i=new r.U(a),e.next=3,s.G.create({provider:i});case 3:return d=e.sent,e.next=6,Promise.all([d.query.session.validators(),d.query.staking.currentEra()]);case 6:return p=e.sent,u=p[0],c=p[1],e.next=11,d.query.staking.erasStakers(c.toString(),u[0]);case 11:return h=e.sent,m=parseInt(h.total),e.next=15,d.query.staking.erasStakers.entries(c.toString());case 15:e.sent.forEach((function(e){e[0];var t=e[1],a=parseInt(t.total);a{"use strict";a.d(t,{Z:()=>c});var n=a(74165),o=a(15861),i=a(67294),r=a(87152),s=a(17145),l=a(67425);function d(e,t,a){return p.apply(this,arguments)}function p(){return(p=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var i,l,d,p,u;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return d=new r.U(i),e.next=21,s.G.create({provider:d});case 21:p=e.sent,(u=a.split(".")).forEach((function(e){e in p&&(p=p[e])})),e.t1=u[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=p.toString(),e.abrupt("break",35);case 29:return e.next=31,p();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function u(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const c=function(e){var t=e.network,a=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,p=(0,i.useState)(""),c=p[0],h=p[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?u(r.toString(),l,t,h):h(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t,a,h);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?u(o,l,t,h):h(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),c}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},11300:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>p,default:()=>g,frontMatter:()=>d,metadata:()=>u,toc:()=>h});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),r=a(47940),s=a(12418),l=["components"],d={id:"maintain-guides-how-to-validate-polkadot",title:"Run a Validator (Polkadot)",sidebar_label:"How to run a Validator on Polkadot",description:"The fundamentals for running a Polkadot validator.",keywords:["validator setup","validator","validate","binary","runtime"],slug:"../maintain-guides-how-to-validate-polkadot"},p=void 0,u={unversionedId:"maintain/maintain-guides-how-to-validate-polkadot",id:"maintain/maintain-guides-how-to-validate-polkadot",title:"Run a Validator (Polkadot)",description:"The fundamentals for running a Polkadot validator.",source:"@site/../docs/maintain/maintain-guides-how-to-validate-polkadot.md",sourceDirName:"maintain",slug:"/maintain-guides-how-to-validate-polkadot",permalink:"/docs/maintain-guides-how-to-validate-polkadot",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/maintain-guides-how-to-validate-polkadot.md",tags:[],version:"current",lastUpdatedBy:"github-actions[bot]",lastUpdatedAt:1697437685,formattedLastUpdatedAt:"Oct 16, 2023",frontMatter:{id:"maintain-guides-how-to-validate-polkadot",title:"Run a Validator (Polkadot)",sidebar_label:"How to run a Validator on Polkadot",description:"The fundamentals for running a Polkadot validator.",keywords:["validator setup","validator","validate","binary","runtime"],slug:"../maintain-guides-how-to-validate-polkadot"},sidebar:"docs",previous:{title:"Nominator Guides",permalink:"/docs/maintain-guides-how-to-nominate-polkadot"},next:{title:"Validator Payout Overview",permalink:"/docs/maintain-guides-validator-payout"}},c={},h=[{value:"Preliminaries",id:"preliminaries",level:2},{value:"How many DOT do I need to become an active Validator?",id:"how-many-dot-do-i-need-to-become-an-active-validator",level:3},{value:"Initial Set-up",id:"initial-set-up",level:2},{value:"Requirements",id:"requirements",level:3},{value:"Reference Hardware",id:"standard-hardware",level:4},{value:"Install & Configure Network Time Protocol (NTP) Client",id:"install--configure-network-time-protocol-ntp-client",level:3},{value:"Make Sure Landlock is Enabled",id:"make-sure-landlock-is-enabled",level:3},{value:"Installing the Polkadot binaries",id:"installing-the-polkadot-binaries",level:3},{value:"Installation from official releases",id:"installation-from-official-releases",level:4},{value:"Optional: Installation with Package Managers",id:"optional-installation-with-package-managers",level:4},{value:"Debian-based (Debian, Ubuntu)",id:"debian-based-debian-ubuntu",level:4},{value:"RPM-based (Fedora, CentOS)",id:"rpm-based-fedora-centos",level:4},{value:"Optional: Installation with Ansible",id:"optional-installation-with-ansible",level:4},{value:"Optional: Installation with Docker",id:"optional-installation-with-docker",level:4},{value:"Optional: Building the Polkadot binaries from sources",id:"optional-building-the-polkadot-binaries-from-sources",level:3},{value:"Prerequisites: Install Rust and Dependencies",id:"prerequisites-install-rust-and-dependencies",level:4},{value:"Building the binaries",id:"building-the-binaries",level:4},{value:"Verify the installation",id:"verify-the-installation",level:3},{value:"Synchronize Chain Data",id:"synchronize-chain-data",level:3},{value:"Database Snapshot Services",id:"database-snapshot-services",level:4},{value:"Bond DOT",id:"bond-dot",level:2},{value:"Set Session Keys",id:"set-session-keys",level:2},{value:"Generating the Session Keys",id:"generating-the-session-keys",level:3},{value:"Option 1: PolkadotJS-APPS",id:"option-1-polkadotjs-apps",level:4},{value:"Option 2: CLI",id:"option-2-cli",level:4},{value:"Submitting the setKeys Transaction",id:"submitting-the-setkeys-transaction",level:3},{value:"Validate",id:"validate",level:2},{value:"Setup via Validator Tab",id:"setup-via-validator-tab",level:3},{value:"Thousand Validators Programme",id:"thousand-validators-programme",level:2},{value:"Running a validator on a testnet",id:"running-a-validator-on-a-testnet",level:2},{value:"FAQ",id:"faq",level:2},{value:"Why am I unable to synchronize the chain with 0 peers?",id:"why-am-i-unable-to-synchronize-the-chain-with-0-peers",level:3},{value:"How do I clear all my chain data?",id:"how-do-i-clear-all-my-chain-data",level:3},{value:"Note about VPS",id:"note-about-vps",level:2},{value:"Disable SMT",id:"disable-smt",level:3},{value:"Disable automatic NUMA balancing",id:"disable-automatic-numa-balancing",level:3},{value:"Configure Spectre/Meltdown Mitigations",id:"configure-spectremeltdown-mitigations",level:3},{value:"For Linux >= 5.16",id:"for-linux--516",level:4},{value:"For Linux < 5.16",id:"for-linux--516-1",level:4},{value:"VPS List",id:"vps-list",level:3}],m={toc:h},k="wrapper";function g(e){var t=e.components,d=(0,o.Z)(e,l);return(0,i.kt)(k,(0,n.Z)({},m,d,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"If you are a beginner, it is recommended that you start your validator journey on Kusama network.\nCheck the ",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-validate-kusama"},"Kusama guide")," for details on how to get\nstarted.")),(0,i.kt)("h2",{id:"preliminaries"},"Preliminaries"),(0,i.kt)("p",null,"Running a validator on a live network is a lot of responsibility! You will be accountable for not\nonly your own stake, but also the stake of your current nominators. If you make a mistake and get\nslashed, your tokens and your reputation will be at risk. However, running a validator can also be\nvery rewarding, knowing that you contribute to the security of a decentralized network while growing\nyour stash."),(0,i.kt)("admonition",{type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"It is highly recommended that you have significant system administration experience before\nattempting to run your own validator."),(0,i.kt)("p",{parentName:"admonition"},"You must be able to handle technical issues and anomalies with your node which you must be able to\ntackle yourself. Being a validator involves more than just executing the Polkadot binary.")),(0,i.kt)("p",null,"Since security is so important to running a successful validator, you should take a look at the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-secure-validator"},"secure validator")," information to make sure you understand the\nfactors to consider when constructing your infrastructure. As you progress in your journey as a\nvalidator, you will likely want to use this repository as a ",(0,i.kt)("em",{parentName:"p"},"starting point")," for your own\nmodifications and customizations."),(0,i.kt)("p",null,"If you need help, please reach out on the\n",(0,i.kt)("a",{parentName:"p",href:"https://matrix.to/#/#polkadotvalidatorlounge:web3.foundation"},"Polkadot Validator Lounge")," on\nElement. The team and other validators are there to help answer questions and provide tips from\nexperience."),(0,i.kt)("h3",{id:"how-many-dot-do-i-need-to-become-an-active-validator"},"How many DOT do I need to become an active Validator?"),(0,i.kt)("p",null,"You can have a rough estimate on that by using the methods listed\n",(0,i.kt)("a",{parentName:"p",href:"/docs/faq/#what-is-the-minimum-stake-necessary-to-be-elected-as-an-active-validator"},"here"),".\nTo be elected into the set, you need a minimum stake behind your validator. This stake can come from\nyourself or from ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nominator"},"nominators"),". This means that as a minimum, you will\nneed enough DOT to set up stash and staking proxy ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"accounts")," with\nthe existential deposit, plus a little extra for transaction fees. The rest can come from\nnominators. To understand how validators are elected, check the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"NPoS Election algorithms")," page."),(0,i.kt)("admonition",{title:"On-Chain Data for Reference",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"On Polkadot, the minimum stake backing a validator in the active set is\n",(0,i.kt)(s.Z,{network:"polkadot",defaultValue:0x3d83c4f4e51b08,mdxType:"MinimumStake"}),"\n"," in the era\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.currentEra",defaultValue:"998",mdxType:"RPC"}),".\n",""),(0,i.kt)("p",{parentName:"admonition"},"On Kusama, the minimum stake backing a validator in the active set is\n","\n",(0,i.kt)(s.Z,{network:"kusama",defaultValue:5288388652143741,mdxType:"MinimumStake"})," in the\nera\n","\n",(0,i.kt)(r.Z,{network:"kusama",path:"query.staking.currentEra",defaultValue:"4838",mdxType:"RPC"}),".")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Warning:")," Any DOT that you stake for your validator is liable to be slashed, meaning that an\ninsecure or improper setup may result in loss of DOT tokens! If you are not confident in your\nability to run a validator node, it is recommended to nominate your DOT to a trusted validator node\ninstead."),(0,i.kt)("h2",{id:"initial-set-up"},"Initial Set-up"),(0,i.kt)("h3",{id:"requirements"},"Requirements"),(0,i.kt)("p",null,"The most common way for a beginner to run a validator is on a cloud server running Linux. You may\nchoose whatever ",(0,i.kt)("a",{parentName:"p",href:"#note-about-vps"},"VPS")," provider that you prefer. As OS it is best to use a recent\nDebian Linux. For this guide we will be using ",(0,i.kt)("strong",{parentName:"p"},"Ubuntu 22.04"),", but the instructions should be\nsimilar for other platforms."),(0,i.kt)("h4",{id:"standard-hardware"},"Reference Hardware"),(0,i.kt)("p",null,"The transaction weights in Polkadot are benchmarked on reference hardware. We ran the benchmark on\nVM instances of two major cloud providers: Google Cloud Platform (GCP) and Amazon Web Services\n(AWS). To be specific, we used ",(0,i.kt)("inlineCode",{parentName:"p"},"n2-standard-8")," VM instance on GCP and ",(0,i.kt)("inlineCode",{parentName:"p"},"c6i.4xlarge")," on AWS. It is\nrecommended that the hardware used to run the validators at least matches the specs of the reference\nhardware in order to ensure they are able to process all blocks in time. If you use subpar hardware\nyou will possibly run into performance issues, get less era points, and potentially even get\nslashed."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"CPU"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"x86-64 compatible;"),(0,i.kt)("li",{parentName:"ul"},"Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);"),(0,i.kt)("li",{parentName:"ul"},"4 physical cores @ 3.4GHz;"),(0,i.kt)("li",{parentName:"ul"},"Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);"),(0,i.kt)("li",{parentName:"ul"},"Prefer single-threaded performance over higher cores count. A comparison of single-threaded\nperformance can be found ",(0,i.kt)("a",{parentName:"li",href:"https://www.cpubenchmark.net/singleThread.html"},"here"),"."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Storage"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"An NVMe SSD of 1 TB (As it should be reasonably sized to deal with blockchain growth). An\nestimation of current chain snapshot sizes can be found ",(0,i.kt)("a",{parentName:"li",href:"https://paranodes.io/DBSize"},"here"),". In\ngeneral, the latency is more important than the throughput."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Memory"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"32 GB DDR4 ECC."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"System"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Linux Kernel 5.16 or newer."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Network"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"The minimum symmetric networking speed is set to 500 Mbit/s (= 62.5 MB/s). This is required to\nsupport a large number of parachains and allow for proper congestion control in busy network\nsituations.")))),(0,i.kt)("p",null,"The specs posted above are not a ",(0,i.kt)("em",{parentName:"p"},"hard")," requirement to run a validator, but are considered best\npractice. Running a validator is a responsible task; using professional hardware is a must in any\nway."),(0,i.kt)("h3",{id:"install--configure-network-time-protocol-ntp-client"},"Install & Configure Network Time Protocol (NTP) Client"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Network_Time_Protocol"},"NTP")," is a networking protocol designed to\nsynchronize the clocks of computers over a network. NTP allows you to synchronize the clocks of all\nthe systems within the network. Currently it is required that validators' local clocks stay\nreasonably in sync, so you should be running NTP or a similar service. You can check whether you\nhave the NTP client by running:"),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"If you are using Ubuntu 18.04 or a newer version, NTP Client should be installed by default.")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"timedatectl\n")),(0,i.kt)("p",null,"If NTP is installed and running, you should see ",(0,i.kt)("inlineCode",{parentName:"p"},"System clock synchronized: yes")," (or a similar\nmessage). If you do not see it, you can install it by executing:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt-get install ntp\n")),(0,i.kt)("p",null,"ntpd will be started automatically after install. You can query ntpd for status information to\nverify that everything is working:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"sudo ntpq -p\n")),(0,i.kt)("admonition",{type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"Skipping this can result in the validator node missing block authorship opportunities. If the clock\nis out of sync (even by a small amount), the blocks the validator produces may not get accepted by\nthe network. This will result in ",(0,i.kt)("inlineCode",{parentName:"p"},"ImOnline")," heartbeats making it on chain, but zero allocated blocks\nmaking it on chain.")),(0,i.kt)("h3",{id:"make-sure-landlock-is-enabled"},"Make Sure Landlock is Enabled"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://docs.kernel.org/userspace-api/landlock.html"},"Landlock")," is a Linux security feature used in\nPolkadot:"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Landlock empowers any process, including unprivileged ones, to securely restrict themselves.")),(0,i.kt)("p",null,"To make use of landlock, make sure you are on the reference kernel version or newer. Most Linux\ndistributions should already have landlock enabled, but you can check by running the following as\nroot:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"dmesg | grep landlock || journalctl -kg landlock\n")),(0,i.kt)("p",null,"If it is not enabled, please see the\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.kernel.org/userspace-api/landlock.html#kernel-support"},'official docs ("Kernel support")'),"\nif you would like to build Linux with landlock enabled."),(0,i.kt)("h3",{id:"installing-the-polkadot-binaries"},"Installing the Polkadot binaries"),(0,i.kt)("admonition",{title:"Multiple Validator Binaries",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"In addition to the ",(0,i.kt)("inlineCode",{parentName:"p"},"polkadot")," binary, recent changes have separated out functionality into two\nadditional needed binaries, ",(0,i.kt)("inlineCode",{parentName:"p"},"polkadot-prepare-worker"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"polkadot-execute-worker"),". All three\nbinaries are needed to properly run a validator node. More context on these changes can be found\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/pull/7337"},"here"))),(0,i.kt)("h4",{id:"installation-from-official-releases"},"Installation from official releases"),(0,i.kt)("p",null,"The official binaries can be downloaded from the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/releases"},"Github Releases"),". You should download the\nlatest available version. You can also download the binaries by using the following direct links\n(replace X.Y.Z by the appropriate version):"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-vX.Y.Z/polkadot\nhttps://github.com/paritytech/polkadot-sdk/releases/download/polkadot-vX.Y.Z/polkadot-execute-worker\nhttps://github.com/paritytech/polkadot-sdk/releases/download/polkadot-vX.Y.Z/polkadot-prepare-worker\n")),(0,i.kt)("h4",{id:"optional-installation-with-package-managers"},"Optional: Installation with Package Managers"),(0,i.kt)("p",null,"The Polkadot Binary in included in ",(0,i.kt)("inlineCode",{parentName:"p"},"Debian")," derivatives (i.e. ",(0,i.kt)("strong",{parentName:"p"},"Debian"),", ",(0,i.kt)("strong",{parentName:"p"},"Ubuntu"),") and\n",(0,i.kt)("inlineCode",{parentName:"p"},"RPM-based")," distros (i.e. ",(0,i.kt)("strong",{parentName:"p"},"Fedora"),", ",(0,i.kt)("strong",{parentName:"p"},"CentOS"),")."),(0,i.kt)("h4",{id:"debian-based-debian-ubuntu"},"Debian-based (Debian, Ubuntu)"),(0,i.kt)("p",null,"Run the following commands as the root user:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ssh"},"# Import the security@parity.io GPG key\ngpg --recv-keys --keyserver hkps://keys.mailvelope.com 9D4B2B6EB8F97156D19669A9FF0812D491B96798\ngpg --export 9D4B2B6EB8F97156D19669A9FF0812D491B96798 > /usr/share/keyrings/parity.gpg\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# Install the `parity-keyring` package - This will ensure the GPG key\n# used by APT remains up-to-date\napt install parity-keyring\n# Install polkadot\napt install polkadot\n")),(0,i.kt)("h4",{id:"rpm-based-fedora-centos"},"RPM-based (Fedora, CentOS)"),(0,i.kt)("p",null,"Run the following commands as the root user:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"# Install dnf-plugins-core (This might already be installed)\ndnf install dnf-plugins-core\n# Add the repository and enable it\ndnf config-manager --add-repo https://releases.parity.io/rpm/polkadot.repo\ndnf config-manager --set-enabled polkadot\n# Install polkadot (You may have to confirm the import of the GPG key, which\n# should have the following fingerprint: 9D4B2B6EB8F97156D19669A9FF0812D491B96798)\ndnf install polkadot\n")),(0,i.kt)("p",null,'Make sure you verify the installation (see the "Verify the installation" section).'),(0,i.kt)("admonition",{title:"By default, the Polkadot systemd service is disabled",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"To start the service, run:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo systemctl start polkadot.service\n"))),(0,i.kt)("h4",{id:"optional-installation-with-ansible"},"Optional: Installation with Ansible"),(0,i.kt)("p",null,"To manage Polkadot installation with Ansible, you can use the ",(0,i.kt)("strong",{parentName:"p"},"Substrate node role")," distributed on\nthe ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/ansible-galaxy/"},"Parity chain operations Ansible collection")),(0,i.kt)("h4",{id:"optional-installation-with-docker"},"Optional: Installation with Docker"),(0,i.kt)("p",null,"To run Polkadot on a Docker or an OCI compatible container runtime, you can use the official\n",(0,i.kt)("a",{parentName:"p",href:"https://hub.docker.com/r/parity/polkadot/tags"},"parity/polkadot docker image"),", available on Docker\nHub (replace X.Y.Z by the appropriate version):"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"docker.io/parity/polkadot:vX.Y.Z\n")),(0,i.kt)("h3",{id:"optional-building-the-polkadot-binaries-from-sources"},"Optional: Building the Polkadot binaries from sources"),(0,i.kt)("h4",{id:"prerequisites-install-rust-and-dependencies"},"Prerequisites: Install Rust and Dependencies"),(0,i.kt)("p",null,"If you have never installed Rust, you should do this first."),(0,i.kt)("p",null,"If you have already installed Rust, run the following command to make sure you are using the latest\nversion."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"rustup update\n")),(0,i.kt)("p",null,"If not, this command will fetch the latest version of Rust and install it."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"curl https://sh.rustup.rs -sSf | sh -s -- -y\n")),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},'If you do not have "curl" installed, run:'),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo apt install curl\n")),(0,i.kt)("p",{parentName:"admonition"},'It will also be valuable to have "websocat" (Netcat, curl and socat for WebSockets) installed for\nRPC interactions. Installation instructions for various operating systems can be found\n',(0,i.kt)("a",{parentName:"p",href:"https://github.com/vi/websocat#installation"},"here"),".")),(0,i.kt)("p",null,"To configure your shell, run the following command."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"source $HOME/.cargo/env\n")),(0,i.kt)("p",null,"Verify your installation."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"rustc --version\n")),(0,i.kt)("p",null,"Finally, run this command to install the necessary dependencies for compiling and running the\nPolkadot node software."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt install make clang pkg-config libssl-dev build-essential\n")),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If you are using OSX and you have ",(0,i.kt)("a",{parentName:"p",href:"https://brew.sh"},"Homebrew")," installed, you can issue the following\nequivalent command INSTEAD of the previous one:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"brew install cmake pkg-config openssl git llvm\n"))),(0,i.kt)("h4",{id:"building-the-binaries"},"Building the binaries"),(0,i.kt)("p",null,"You can build the Polkadot binaries from the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk"},"paritytech/polkadot-sdk")," repository on GitHub."),(0,i.kt)("p",null,"You should generally use the latest ",(0,i.kt)("strong",{parentName:"p"},"X.Y.Z"),' tag. You should either review the output from the "git\ntag" command or view the ',(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/tags"},"Polkadot SDK Github tags"),"\nto see a list of all the available release versions. You should replace ",(0,i.kt)("inlineCode",{parentName:"p"},"VERSION")," below with the\nlatest build (i.e., the highest number)."),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If you prefer to use SSH rather than HTTPS, you can replace the first line of the below with"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git clone git@github.com:paritytech/polkadot-sdk.git\n"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git clone https://github.com/paritytech/polkadot-sdk.git\ncd polkadot-sdk/polkadot\n")),(0,i.kt)("p",null,"Run the following command to find the latest version."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git tag -l | sort -V | grep -v -- '-rc'\n")),(0,i.kt)("p",null,'Find the latest version; replace "VERSION" in the commmand below and run to change your branch.'),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git checkout VERSION\n./scripts/init.sh\n")),(0,i.kt)("p",null,"Build native code with the production profile. The following will make sure that the binaries are\nall in your ",(0,i.kt)("inlineCode",{parentName:"p"},"$PATH"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"cargo install --force --path . --profile production\n")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("em",{parentName:"strong"},"This step will take a while (generally 10 - 40 minutes, depending on your hardware)."))),(0,i.kt)("admonition",{title:"Compilation Errors",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If you run into compile errors, you may have to pin the version of Rust compiler to the one that was\nused to build the release. Check out ",(0,i.kt)("inlineCode",{parentName:"p"},"Rust compiler versions")," section in the release notes. This can\nbe done by running:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"rustup install nightly-2022-05-18\nrustup target add wasm32-unknown-unknown --toolchain nightly-2022-05-18\ncargo +nightly-2022-05-18 build --release\n")),(0,i.kt)("p",{parentName:"admonition"},"You may also need to run the build more than once."),(0,i.kt)("p",{parentName:"admonition"},"If you would like to execute the tests, run the following command:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"cargo test --all\n"))),(0,i.kt)("p",null,"If you are interested in generating keys locally, you can also install ",(0,i.kt)("inlineCode",{parentName:"p"},"subkey")," from the same\ndirectory. You may then take the generated ",(0,i.kt)("inlineCode",{parentName:"p"},"subkey")," executable and transfer it to an air-gapped\nmachine for extra security."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"cargo install --force --git https://github.com/paritytech/polkadot-sdk subkey\n")),(0,i.kt)("h3",{id:"verify-the-installation"},"Verify the installation"),(0,i.kt)("p",null,"After installing Polkadot, you can verify the installation by running"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"polkadot --version\npolkadot-execute-worker --version\npolkadot-prepare-worker --version\n")),(0,i.kt)("p",null,"It should return something like this (the exact versions don't matter, but they must all be the\nsame):"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"0.9.43-36264cb36db\n0.9.43-36264cb36db\n0.9.43-36264cb36db\n")),(0,i.kt)("p",null,"If not, make sure that you installed all the binaries, all the binaries are somewhere in your\n",(0,i.kt)("inlineCode",{parentName:"p"},"$PATH")," and they are all in the same folder."),(0,i.kt)("h3",{id:"synchronize-chain-data"},"Synchronize Chain Data"),(0,i.kt)("p",null,"You can begin syncing your node by running the following command if you do not want to start in\nvalidator mode right away:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"polkadot\n")),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"If you want to run a validator on Kusama, you have an option to specify the chain. With no\nspecification, this would default to Polkadot."),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"polkadot --chain=kusama\n"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"2021-06-17 03:07:07 Parity Polkadot\n2021-06-17 03:07:07 \u270c\ufe0f version 0.9.5-95f6aa201-x86_64-linux-gnu\n2021-06-17 03:07:07 \u2764\ufe0f by Parity Technologies , 2017-2021\n2021-06-17 03:07:07 \ud83d\udccb Chain specification: Polkadot\n2021-06-17 03:07:07 \ud83c\udff7 Node name: boiling-pet-7554\n2021-06-17 03:07:07 \ud83d\udc64 Role: FULL\n2021-06-17 03:07:07 \ud83d\udcbe Database: RocksDb at /root/.local/share/polkadot/chains/polkadot/db\n2021-06-17 03:07:07 \u26d3 Native runtime: polkadot-9050 (parity-polkadot-0.tx7.au0)\n2021-06-17 03:07:10 \ud83c\udff7 Local node identity is: 12D3KooWLtXFWf1oGrnxMGmPKPW54xWCHAXHbFh4Eap6KXmxoi9u\n2021-06-17 03:07:10 \ud83d\udce6 Highest known block at #17914\n2021-06-17 03:07:10 \u303d\ufe0f Prometheus server started at 127.0.0.1:9615\n2021-06-17 03:07:10 Listening for new connections on 127.0.0.1:9944.\n")),(0,i.kt)("admonition",{title:"Example of node sync",type:"info"},(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre"},"2021-06-17 03:07:39 \ud83d\udd0d Discovered new external address for our node: /ip4/10.26.16.1/tcp/30333/ws/p2p/12D3KooWLtXFWf1oGrnxMGmPKPW54xWCHAXHbFh4Eap6KXmxoi9u\n2021-06-17 03:07:40 \u2699\ufe0f Syncing 218.8 bps, target=#5553764 (17 peers), best: #24034 (0x08af\u2026dcf5), finalized #23552 (0xd4f0\u20262642), \u2b07 173.5kiB/s \u2b06 12.7kiB/s\n2021-06-17 03:07:45 \u2699\ufe0f Syncing 214.8 bps, target=#5553765 (20 peers), best: #25108 (0xb272\u2026e800), finalized #25088 (0x94e6\u20268a9f), \u2b07 134.3kiB/s \u2b06 7.4kiB/s\n2021-06-17 03:07:50 \u2699\ufe0f Syncing 214.8 bps, target=#5553766 (21 peers), best: #26182 (0xe7a5\u202601a2), finalized #26112 (0xcc29\u2026b1a9), \u2b07 5.0kiB/s \u2b06 1.1kiB/s\n2021-06-17 03:07:55 \u2699\ufe0f Syncing 138.4 bps, target=#5553767 (21 peers), best: #26874 (0xcf4b\u20266553), finalized #26624 (0x9dd9\u202627f8), \u2b07 18.9kiB/s \u2b06 2.0kiB/s\n2021-06-17 03:08:00 \u2699\ufe0f Syncing 37.0 bps, target=#5553768 (22 peers), best: #27059 (0x5b73\u20266fc9), finalized #26624 (0x9dd9\u202627f8), \u2b07 14.3kiB/s \u2b06 4.4kiB/s\n"))),(0,i.kt)("admonition",{title:"Use Warp sync for faster syncing",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"By default, the node performs ",(0,i.kt)("inlineCode",{parentName:"p"},"full")," sync, which downloads and validates the full blockchain\nhistory. Full sync works by listening to announced blocks and requesting the blocks from the\nannouncing peers, or just the block headers in case of light clients."),(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("inlineCode",{parentName:"p"},"Fast")," sync is another option that works by downloading the block header history and validating the\nauthority set changes in order to arrive at a specific (usually the most recent) header. After the\ndesired header has been reached and verified, the state can be downloaded and imported. Once this\nprocess has been completed, the node can proceed with a full sync."),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"polkadot --sync warp\n")),(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("inlineCode",{parentName:"p"},"Warp sync")," initially downloads and validates the finality proofs from\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus#finality-gadget-grandpa"},"GRANDPA")," and then downloads the state of the\nlatest finalized block. After the warp sync, the node is ready to import the latest blocks from the\nnetwork and can be used as a Validator. The blocks from genesis will be downloaded in the\nbackground. Check\n",(0,i.kt)("a",{parentName:"p",href:"https://substrate.stackexchange.com/questions/334/what-kinds-of-sync-mechanisms-does-substrate-implement/"},"this discussion"),"\nfor more information about the different sync options available.")),(0,i.kt)("admonition",{title:"Validators should sync using the RocksDb backend",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"This is implicit by default, but can be explicit by passing the ",(0,i.kt)("inlineCode",{parentName:"p"},"--database RocksDb")," flag."),(0,i.kt)("p",{parentName:"admonition"},"In the future, it is recommended to switch to the faster and more efficient ParityDB option. Note\nthat ",(0,i.kt)("strong",{parentName:"p"},"ParityDB is still experimental and should not be used in production.")," If you want to test\nout ParityDB, you can add the flag ",(0,i.kt)("inlineCode",{parentName:"p"},"--database paritydb"),". Switching between database backends will\nrequire a resync.")),(0,i.kt)("p",null,"Depending on the size of the chain when you do this, this step may take anywhere from a few minutes\nto a few hours."),(0,i.kt)("p",null,"If you are interested in determining how much longer you have to go, your server logs (printed to\nSTDOUT from the ",(0,i.kt)("inlineCode",{parentName:"p"},"polkadot")," process) will tell you the latest block your node has processed and\nverified. You can then compare that to the current highest block via\n",(0,i.kt)("a",{parentName:"p",href:"https://telemetry.polkadot.io/#list/Polkadot%20CC1"},"Telemetry")," or the\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS Block Explorer"),"."),(0,i.kt)("h4",{id:"database-snapshot-services"},"Database Snapshot Services"),(0,i.kt)("p",null,"If you start a node for the first time, it will start building from the genesis block. This process\ncan take a while depending on the database size. To make this process faster, snapshots can be used.\nSnapshots are compressed backups of the database directory of Polkadot/Kusama nodes, containing the\nwhole chain (or a pruned version of it, with states only from the latest 1000 or 256 blocks). Listed\nbelow are a few public snapshot providers for Polkadot and Kusama."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://stakeworld.io/snapshot"},"Stakeworld")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://polkachu.com/snapshots"},"Polkachu")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://polkashots.io/"},"Polkashots"))),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"For the security of the network, it is recommended that you sync from scratch, even if you are\nrunning your node in pruning mode for validation. The reason is that if these snapshots get\ncorrupted and a majority of nodes run based on these snapshots, the network could end up running on\na non-canonical chain.")),(0,i.kt)("h2",{id:"bond-dot"},"Bond DOT"),(0,i.kt)("p",null,"To start a validator instance on Polkadot, the minimum bond required is\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.minValidatorBond",defaultValue:"0",filter:"humanReadable",mdxType:"RPC"}),".\n","\nBut to enter the active validator set and be eligible to earn rewards, your validator node should be\nnominated by a minimum number of DOT tokens. On Polkadot, the minimum stake backing a validator in\nthe active set is\n",(0,i.kt)(s.Z,{network:"polkadot",defaultValue:0x3d83c4f4e51b08,mdxType:"MinimumStake"}),"\n"," in the era\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.currentEra",defaultValue:"998",mdxType:"RPC"}),".\n","\nOn Kusama, the minimum stake backing a validator in the active set is\n",(0,i.kt)(s.Z,{network:"kusama",defaultValue:5288388652143741,mdxType:"MinimumStake"}),"\n",(0,i.kt)(s.Z,{network:"kusama",defaultValue:5288388652143741,mdxType:"MinimumStake"})," in the\nera\n","\n",(0,i.kt)(r.Z,{network:"kusama",path:"query.staking.currentEra",defaultValue:"4838",mdxType:"RPC"}),"."),(0,i.kt)("p",null,"If you are validator who intends to get DOT/KSM nominations from the community, you will need to\nshow some skin in the game. For that, you need to bond some DOT/KSM as own stake. Make sure not to\nbond all your DOT balance since you will be unable to pay transaction fees from your bonded balance."),(0,i.kt)("admonition",{title:"Controller accounts are deprecated. Use Staking Proxy.",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Controller accounts are deprecated. For more information, see\n",(0,i.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/t/staking-controller-deprecation-plan-staking-ui-leads-comms/2748"},"this discussion"),".\nIt is highly recommended that you setup an account with a staking proxy, which can be used for\nissuing start and stop validating calls. Read more about ",(0,i.kt)("a",{parentName:"p",href:"../learn/learn-proxies"},"proxy accounts"),"\nhere.")),(0,i.kt)("p",null,"First, go to the ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/actions"},"Staking"),' section. Click on\n"Account Actions", and then the "+ Stash" button.'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"bonding-JS-UI",src:a(90412).Z,width:"2143",height:"847"})),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Stash account")," - Select your Stash account (which is the acocunt with the DOT/KSM balance)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Value bonded")," - How much DOT from the Stash account you want to bond/stake. Note that you do\nnot need to bond all of the DOT in that account. Also note that you can always bond ",(0,i.kt)("em",{parentName:"li"},"more")," DOT\nlater. However, ",(0,i.kt)("em",{parentName:"li"},"withdrawing")," any bonded amount requires the duration of the unbonding period. On\nKusama, the unbonding period is 7 days. On Polkadot, the planned unbonding period is 28 days."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Payment destination")," - The account where the rewards from validating are sent. More info\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking/#reward-distribution"},"here"),". Starting with runtime version v23 natively\nincluded in client version ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/paritytech/polkadot/releases/tag/v0.9.3"},"0.9.3"),",\npayouts can go to any custom address. If you'd like to redirect payments to an account that is not\nthe stash account, you can do it by entering the address here. Note that it is extremely unsafe to\nset an exchange address as the recipient of the staking rewards.")),(0,i.kt)("p",null,"Once everything is filled in properly, click ",(0,i.kt)("inlineCode",{parentName:"p"},"Bond")," and sign the transaction with your Stash\naccount."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"sign transaction",src:a(93002).Z,width:"2141",height:"780"})),(0,i.kt)("p",null,"After a few seconds, you should see an ",(0,i.kt)("inlineCode",{parentName:"p"},"ExtrinsicSuccess")," message."),(0,i.kt)("p",null,"Your bonded account will available under ",(0,i.kt)("inlineCode",{parentName:"p"},"Stashes"),". You should now see a new card with all your\naccounts (note: you may need to refresh the screen). The bonded amount on the right corresponds to\nthe funds bonded by the Stash account."),(0,i.kt)("h2",{id:"set-session-keys"},"Set Session Keys"),(0,i.kt)("admonition",{title:"Session keys are consensus critical",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"If you are not sure if your node has the current session keys that you made the ",(0,i.kt)("inlineCode",{parentName:"p"},"setKeys"),"\ntransaction then you can use one of the two available RPC methods to query your node:\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/docs/substrate/rpc/#haskeypublickey-bytes-keytype-text-bool"},"hasKey")," to\ncheck for a specific key or\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/docs/substrate/rpc/#hassessionkeyssessionkeys-bytes-bool"},"hasSessionKeys"),"\nto check the full session key public key string.")),(0,i.kt)("p",null,"Once your node is fully synced, stop the process by pressing Ctrl-C. At your terminal prompt, you\nwill now start running the node."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},'polkadot --validator --name "name on telemetry"\n')),(0,i.kt)("p",null,"Similarly:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"2021-06-17 03:12:08 Parity Polkadot\n2021-06-17 03:12:08 \u270c\ufe0f version 0.9.5-95f6aa201-x86_64-linux-gnu\n2021-06-17 03:12:08 \u2764\ufe0f by Parity Technologies , 2017-2021\n2021-06-17 03:12:08 \ud83d\udccb Chain specification: Polkadot\n2021-06-17 03:12:08 \ud83c\udff7 Node name: nateched-test\n2021-06-17 03:12:08 \ud83d\udc64 Role: AUTHORITY\n2021-06-17 03:12:08 \ud83d\udcbe Database: RocksDb at /root/.local/share/polkadot/chains/polkadot/db\n2021-06-17 03:12:08 \u26d3 Native runtime: polkadot-9050 (parity-polkadot-0.tx7.au0)\n2021-06-17 03:12:12 \ud83c\udff7 Local node identity is: 12D3KooWLtXFWf1oGrnxMGmPKPW54xWCHAXHbFh4Eap6KXmxoi9u\n2021-06-17 03:12:12 \ud83d\udce6 Highest known block at #64673\n2021-06-17 03:12:12 \u303d\ufe0f Prometheus server started at 127.0.0.1:9615\n2021-06-17 03:12:12 Listening for new connections on 127.0.0.1:9944.\n2021-06-17 03:12:12 \ud83d\udc76 Starting BABE Authorship worker\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"2021-06-17 03:12:16 \ud83d\udd0d Discovered new external address for our node: /ip4/10.26.11.1/tcp/30333/p2p/12D3KooWLtXFWf1oGrnxMGmPKPW54xWCHAXHbFh4Eap6KXmxoi9u\n2021-06-17 03:12:17 \u2699\ufe0f Syncing, target=#5553810 (14 peers), best: #65068 (0x6da5\u20260662), finalized #65024 (0x4e84\u2026d170), \u2b07 352.2kiB/s \u2b06 75.6kiB/s\n")),(0,i.kt)("p",null,"You can give your validator any name that you like, but note that others will be able to see it, and\nit will be included in the list of all servers using the same telemetry server. Since numerous\npeople are using telemetry, it is recommended that you choose something likely to be unique."),(0,i.kt)("h3",{id:"generating-the-session-keys"},"Generating the Session Keys"),(0,i.kt)("p",null,"You need to tell the chain your Session keys by signing and submitting an extrinsic. This is what\nassociates your validator node with your stash account on Polkadot."),(0,i.kt)("h4",{id:"option-1-polkadotjs-apps"},"Option 1: PolkadotJS-APPS"),(0,i.kt)("p",null,"You can generate your ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"Session keys")," in the client via the apps RPC.\nIf you are doing this, make sure that you have the PolkadotJS-Apps explorer attached to your\nvalidator node. You can configure the apps dashboard to connect to the endpoint of your validator in\nthe Settings tab. If you are connected to a default endpoint hosted by Parity of Web3 Foundation,\nyou will not be able to use this method since making RPC requests to this node would effect the\nlocal keystore hosted on a ",(0,i.kt)("em",{parentName:"p"},"public node")," and you want to make sure you are interacting with the\nkeystore for ",(0,i.kt)("em",{parentName:"p"},"your node"),"."),(0,i.kt)("p",null,"Once ensuring that you have connected to your node, the easiest way to set session keys for your\nnode is by calling the ",(0,i.kt)("inlineCode",{parentName:"p"},"author_rotateKeys")," RPC request to create new keys in your validator's\nkeystore. Navigate to Toolbox tab and select RPC Calls then select the author > rotateKeys() option\nand remember to save the output that you get back for a later step."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Explorer RPC call",src:a(54061).Z,width:"1700",height:"582"})),(0,i.kt)("h4",{id:"option-2-cli"},"Option 2: CLI"),(0,i.kt)("p",null,"If you are on a remote server, it is easier to run this command on the same machine (while the node\nis running with the default WS RPC port configured):"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},'echo \'{"id":1,"jsonrpc":"2.0","method":"author_rotateKeys","params":[]}\' | websocat -n1 -B 99999999 ws://127.0.0.1:9944\n')),(0,i.kt)("p",null,'The output will have a hex-encoded "result" field. The result is the concatenation of the four\npublic keys. Save this result for a later step.'),(0,i.kt)("p",null,"You can restart your node at this point."),(0,i.kt)("h3",{id:"submitting-the-setkeys-transaction"},"Submitting the ",(0,i.kt)("inlineCode",{parentName:"h3"},"setKeys")," Transaction"),(0,i.kt)("p",null,"You need to tell the chain your Session keys by signing and submitting an extrinsic. This is what\nassociates your validator with your staking proxy."),(0,i.kt)("p",null,"Go to ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/actions"},"Staking > Account Actions"),', and click "Set\nSession Key" on the bonding account you generated earlier. Enter the output from ',(0,i.kt)("inlineCode",{parentName:"p"},"author_rotateKeys"),'\nin the field and click "Set Session Key".'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"staking-change-session",src:a(72316).Z,width:"2792",height:"182"}),"\n",(0,i.kt)("img",{alt:"staking-session-result",src:a(12883).Z,width:"2146",height:"680"})),(0,i.kt)("p",null,"Submit this extrinsic and you are now ready to start validating."),(0,i.kt)("h2",{id:"validate"},"Validate"),(0,i.kt)("p",null,"To verify that your node is live and synchronized, head to\n",(0,i.kt)("a",{parentName:"p",href:"https://telemetry.polkadot.io/#list/Polkadot%20CC1"},"Telemetry")," and find your node. Note that this\nwill show all nodes on the Polkadot network, which is why it is important to select a unique name!"),(0,i.kt)("p",null,"In this example, we used the name ",(0,i.kt)("inlineCode",{parentName:"p"},"techedtest")," and have successfully located it upon searching:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"polkadot-dashboard-telemetry",src:a(67929).Z,width:"2862",height:"472"})),(0,i.kt)("h3",{id:"setup-via-validator-tab"},"Setup via Validator Tab"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"polkadot-dashboard-validate-1",src:a(63670).Z,width:"2128",height:"1022"})),(0,i.kt)("p",null,"Here you will need to input the Keys from ",(0,i.kt)("inlineCode",{parentName:"p"},"rotateKeys"),", which is the Hex output from\n",(0,i.kt)("inlineCode",{parentName:"p"},"author_rotateKeys"),". The keys will show as pending until applied at the start of a new session."),(0,i.kt)("p",null,'The "reward commission percentage" is the commission percentage that you can declare against your\nvalidator\'s rewards. This is the rate that your validator will be commissioned with.'),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Payment preferences")," - You can specify the percentage of the rewards that will get paid to you.\nThe remaining will be split among your nominators.")),(0,i.kt)("admonition",{title:"Setting a commission rate of 100% suggests that you do not want your validator to receive",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"nominations")),(0,i.kt)("p",null,'You can also determine if you would like to receive nominations with the "allows new nominations"\noption.'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"dashboard validate",src:a(44281).Z,width:"2126",height:"694"})),(0,i.kt)("p",null,'Click "Bond & Validate".'),(0,i.kt)("p",null,'If you go to the "Staking" tab, you will see a list of active validators currently running on the\nnetwork. At the top of the page, it shows the number of validator slots that are available as well\nas the number of nodes that have signaled their intention to be a validator. You can go to the\n"Waiting" tab to double check to see whether your node is listed there.'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"staking queue",src:a(46513).Z,width:"2838",height:"1440"})),(0,i.kt)("p",null,"The validator set is refreshed every era. In the next era, if there is a slot available and your\nnode is selected to join the validator set, your node will become an active validator. Until then,\nit will remain in the ",(0,i.kt)("em",{parentName:"p"},"waiting")," queue. If your validator is not selected to become part of the\nvalidator set, it will remain in the ",(0,i.kt)("em",{parentName:"p"},"waiting")," queue until it is. There is no need to re-start if\nyou are not selected for the validator set in a particular era. However, it may be necessary to\nincrease the number of DOT staked or seek out nominators for your validator in order to join the\nvalidator set."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Congratulations!")," If you have followed all of these steps, and been selected to be a part of the\nvalidator set, you are now running a Polkadot validator! If you need help, reach out on the\n",(0,i.kt)("a",{parentName:"p",href:"https://matrix.to/#/!NZrbtteFeqYKCUGQtr:matrix.parity.io?via=matrix.parity.io&via=matrix.org&via=web3.foundation"},"Polkadot Validator chat"),"."),(0,i.kt)("h2",{id:"thousand-validators-programme"},"Thousand Validators Programme"),(0,i.kt)("p",null,"The Thousand Validators Programme is a joint initiative by Web3 Foundation and Parity Technologies\nto provide support for community validators. If you are interested in applying for the programme,\nyou can find more information ",(0,i.kt)("a",{parentName:"p",href:"/docs/thousand-validators"},"on the wiki page"),"."),(0,i.kt)("h2",{id:"running-a-validator-on-a-testnet"},"Running a validator on a testnet"),(0,i.kt)("p",null,"To verify your validator set up, it is possible to run it against a PoS test network such as Westend\nor Wococo. However, validator slots are intentionally limited on Westend to ensure the stability and\navailability of the testnet for the Polkadot release process. As such it is advised for node\noperators wishing to run testnet validators to join the Wococo network. You can obtain WOOK tokens\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-DOT#getting-tokens-on-the-wococo-testnet"},"here"),"."),(0,i.kt)("p",null,"Here is a small comparison of each network characteristics as relevant to validators:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Network"),(0,i.kt)("th",{parentName:"tr",align:null},"Polkadot"),(0,i.kt)("th",{parentName:"tr",align:null},"Westend"),(0,i.kt)("th",{parentName:"tr",align:null},"Wococo"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"epoch"),(0,i.kt)("td",{parentName:"tr",align:null},"4h"),(0,i.kt)("td",{parentName:"tr",align:null},"1h"),(0,i.kt)("td",{parentName:"tr",align:null},"10m")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"era"),(0,i.kt)("td",{parentName:"tr",align:null},"1d"),(0,i.kt)("td",{parentName:"tr",align:null},"6h"),(0,i.kt)("td",{parentName:"tr",align:null},"1h")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"token"),(0,i.kt)("td",{parentName:"tr",align:null},"DOT"),(0,i.kt)("td",{parentName:"tr",align:null},"WND (test)"),(0,i.kt)("td",{parentName:"tr",align:null},"WOOK (test)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"active validators"),(0,i.kt)("td",{parentName:"tr",align:null},"~300"),(0,i.kt)("td",{parentName:"tr",align:null},"~20"),(0,i.kt)("td",{parentName:"tr",align:null},"10 /sys/devices/system/cpu/cpu$cpunum/online\ndone\n")),(0,i.kt)("p",null,"It will disable every other (vCPU) core."),(0,i.kt)("p",null,"To save changes permanently add ",(0,i.kt)("inlineCode",{parentName:"p"},"nosmt=force")," as kernel parameter. Edit ",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/default/grub")," and add\n",(0,i.kt)("inlineCode",{parentName:"p"},"nosmt=force")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"GRUB_CMDLINE_LINUX_DEFAULT")," variable and run ",(0,i.kt)("inlineCode",{parentName:"p"},"sudo update-grub"),". After the reboot\nyou should see half of the cores are offline. Run ",(0,i.kt)("inlineCode",{parentName:"p"},"lscpu --extended")," to confirm."),(0,i.kt)("h3",{id:"disable-automatic-numa-balancing"},"Disable automatic NUMA balancing"),(0,i.kt)("p",null,"If you have multiple physical CPUs (CPU0 and CPU1) in the system each with its own memory bank (MB0\nand MB1), then it is usually slower for a CPU0 to access MB1 due to the slower interconnection. To\nprevent the OS from automatically moving the running Substrate process from one CPU to another and\nthus causing an increased latency, it is recommended to disable automatic NUMA balancing."),(0,i.kt)("p",null,"With automatic NUMA balancing disabled, an OS will always run a process on the same NUMA node where\nit was initially scheduled."),(0,i.kt)("p",null,"To disable NUMA balancing in runtime:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sysctl kernel.numa_balancing=0\n")),(0,i.kt)("p",null,"To save changes permanently, update startup options and reconfigure GRUB. Edit ",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/default/grub"),"\nand add ",(0,i.kt)("inlineCode",{parentName:"p"},"numa_balancing=disable")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"GRUB_CMDLINE_LINUX_DEFAULT")," variable and run\n",(0,i.kt)("inlineCode",{parentName:"p"},"sudo update-grub"),". After reboot you can confirm the change by running\n",(0,i.kt)("inlineCode",{parentName:"p"},"sysctl -a | grep 'kernel.numa_balancing'")," and checking if the parameter is set to 0"),(0,i.kt)("h3",{id:"configure-spectremeltdown-mitigations"},"Configure Spectre/Meltdown Mitigations"),(0,i.kt)("p",null,"Spectre and Meltdown are vulnerabilities discovered in modern CPUs a few years ago. Mitigations were\nmade to the Linux kernel to cope with the multiple variations of these attacks. Check out\n",(0,i.kt)("a",{parentName:"p",href:"https://meltdownattack.com/"},"https://meltdownattack.com/")," for more info."),(0,i.kt)("p",null,"Initially those mitigations added ~20% penalty to the performance of the workloads. As CPU\nmanufacturers started to roll-out mitigations implemented in hardware, the performance gap\n",(0,i.kt)("a",{parentName:"p",href:"https://www.phoronix.com/scan.php?page=article&item=3-years-specmelt&num=1"},"narrowed down"),". As the\nbenchmark demonstrates, the performance penalty got reduced to ~7% on Intel 10th Gen CPUs. This is\ntrue for the workloads running on both bare-metal and VMs. But the penalty remains high for the\ncontainerized workloads in some cases."),(0,i.kt)("p",null,"As demonstrated in\n",(0,i.kt)("a",{parentName:"p",href:"http://mamememo.blogspot.com/2020/05/cpu-intensive-rubypython-code-runs.html"},"Yusuke Endoh's article"),",\na performance penalty for containerized workloads can be as high as 100%. This is due to SECCOMP\nprofile being overprotective about applying Spectre/Meltdown mitigations without providing real\nsecurity. A longer explanation is a available in the\n",(0,i.kt)("a",{parentName:"p",href:"https://lkml.org/lkml/2020/11/4/1135"},"kernel patch discussion"),"."),(0,i.kt)("p",null,"Linux 5.16\n",(0,i.kt)("a",{parentName:"p",href:"https://www.phoronix.com/scan.php?page=news_item&px=Linux-Spectre-SECCOMP-Default"},"loosened the protections"),"\napplied to SECCOMP threads by default. Containers running on kernel 5.16 and later now don't suffer\nfrom the performance penalty implied by using a SECCOMP profile in container runtimes."),(0,i.kt)("h4",{id:"for-linux--516"},"For Linux >= 5.16"),(0,i.kt)("p",null,"You are all set. The performance of containerized workloads is on par with non-containerized ones.\nYou don't have to do anything."),(0,i.kt)("h4",{id:"for-linux--516-1"},"For Linux < 5.16"),(0,i.kt)("p",null,"You'll need to disable mitigations for Spectre V2 for user-space tasks as well as Speculative Store\nBypass Disable (SSBD) for Spectre V4.\n",(0,i.kt)("a",{parentName:"p",href:"https://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git/commit/?h=for-next/seccomp&id=2f46993d83ff4abb310ef7b4beced56ba96f0d9d"},"This patch message"),"\ndescribes the reasoning for this default change in more detail:"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Ultimately setting SSBD and STIBP by default for all seccomp jails is a bad sweet spot and bad\ndefault with more cons than pros that end up reducing security in the public cloud (by giving an\nhuge incentive to not expose SPEC_CTRL which would be needed to get full security with IBPB after\nsetting nosmt in the guest) and by excessively hurting performance to more secure apps using\nseccomp that end up having to opt out with SECCOMP_FILTER_FLAG_SPEC_ALLOW.")),(0,i.kt)("p",null,"To disable the mitigations edit ",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/default/grub")," and add\n",(0,i.kt)("inlineCode",{parentName:"p"},"spec_store_bypass_disable=prctl spectre_v2_user=prctl")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"GRUB_CMDLINE_LINUX_DEFAULT")," variable,\nrun ",(0,i.kt)("inlineCode",{parentName:"p"},"sudo update-grub"),", then reboot."),(0,i.kt)("p",null,"Note that mitigations are not disabled completely. You can fully disable all the available kernel\nmitigations by setting ",(0,i.kt)("inlineCode",{parentName:"p"},"mitigations=off"),". But we don't recommend doing this unless you run a fully\ntrusted code on the host."),(0,i.kt)("h3",{id:"vps-list"},"VPS List"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://cloud.google.com/"},"Google Cloud")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://aws.amazon.com/"},"Amazon AWS")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.ovh.com.au/"},"OVH")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.digitalocean.com/"},"Digital Ocean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.vultr.com/"},"Vultr")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.linode.com/"},"Linode")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.scaleway.com/"},"Scaleway")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://onfinality.io/"},"OnFinality"))),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("mdxAdmonitionTitle",{parentName:"admonition"},"Beware of the ",(0,i.kt)("strong",{parentName:"mdxAdmonitionTitle"},"Terms and Conditions")," and ",(0,i.kt)("strong",{parentName:"mdxAdmonitionTitle"},"Acceptable Use Policies")," for each VPS"),(0,i.kt)("p",{parentName:"admonition"},"provider"),(0,i.kt)("p",{parentName:"admonition"},'You may be locked out of your account and your server shut down if you come in violation. For\ninstance, Digital Ocean lists "Mining of Cryptocurrencies" under the Network Abuse section of their\n',(0,i.kt)("a",{parentName:"p",href:"https://www.digitalocean.com/legal/acceptable-use-policy/"},"Acceptable Use Policy")," and requires\nexplicit permission to do so. This may extend to other cryptocurrency activity.")))}g.isMDXComponent=!0},90412:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/JS-UI-bond-7bdecad8831f3c1b20d96e426e7e47c1.png"},93002:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/JS-UI-sign-transaction-75b2e29fcaecc44c5eb1c4f5e3e364ae.png"},46513:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-dashboard-staking-4005504ef30291ebe1a243298c351a34.png"},67929:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-dashboard-telemetry-8930bdd60309c864ed682a1bdd4b1e31.png"},63670:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-dashboard-validate-1-4bf6a6488b4e128d12cab2617025d796.png"},44281:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-dashboard-validate-2-18a8869804f89ffebafa1b920e31ccd6.png"},54061:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-explorer-rotatekeys-rpc-6d5ba5d9ffb20fd9683432e9a6ccd0f9.jpg"},29009:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-zero-peer-2642d52b7e07893a66a0ddfd492cce38.jpg"},72316:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/set-session-key-1-b0cdb38a299d6ef6bcc24c6ab2bce66d.png"},12883:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/set-session-key-2-408efe22daa8d6533715987a1099828a.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/a74a59a0.eb0fa773.js b/assets/js/a74a59a0.eb0fa773.js new file mode 100644 index 000000000000..a31d4f8fef46 --- /dev/null +++ b/assets/js/a74a59a0.eb0fa773.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[8702],{12418:(e,t,a)=>{"use strict";a.d(t,{Z:()=>u});var n=a(74165),o=a(15861),i=a(67294),r=a(87152),s=a(17145),l=a(67425);function d(e,t,a){return p.apply(this,arguments)}function p(){return(p=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var i,d,p,u,c,h,m,k;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return i=new r.U(a),e.next=3,s.G.create({provider:i});case 3:return d=e.sent,e.next=6,Promise.all([d.query.session.validators(),d.query.staking.currentEra()]);case 6:return p=e.sent,u=p[0],c=p[1],e.next=11,d.query.staking.erasStakers(c.toString(),u[0]);case 11:return h=e.sent,m=parseInt(h.total),e.next=15,d.query.staking.erasStakers.entries(c.toString());case 15:e.sent.forEach((function(e){e[0];var t=e[1],a=parseInt(t.total);a{"use strict";a.d(t,{Z:()=>c});var n=a(74165),o=a(15861),i=a(67294),r=a(87152),s=a(17145),l=a(67425);function d(e,t,a){return p.apply(this,arguments)}function p(){return(p=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var i,l,d,p,u;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return d=new r.U(i),e.next=21,s.G.create({provider:d});case 21:p=e.sent,(u=a.split(".")).forEach((function(e){e in p&&(p=p[e])})),e.t1=u[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=p.toString(),e.abrupt("break",35);case 29:return e.next=31,p();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function u(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"permillToPercent":(0,l.PermillToPercent)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const c=function(e){var t=e.network,a=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,p=(0,i.useState)(""),c=p[0],h=p[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?u(r.toString(),l,t,h):h(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t,a,h);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?u(o,l,t,h):h(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),c}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},11300:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>p,default:()=>g,frontMatter:()=>d,metadata:()=>u,toc:()=>h});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),r=a(47940),s=a(12418),l=["components"],d={id:"maintain-guides-how-to-validate-polkadot",title:"Run a Validator (Polkadot)",sidebar_label:"How to run a Validator on Polkadot",description:"The fundamentals for running a Polkadot validator.",keywords:["validator setup","validator","validate","binary","runtime"],slug:"../maintain-guides-how-to-validate-polkadot"},p=void 0,u={unversionedId:"maintain/maintain-guides-how-to-validate-polkadot",id:"maintain/maintain-guides-how-to-validate-polkadot",title:"Run a Validator (Polkadot)",description:"The fundamentals for running a Polkadot validator.",source:"@site/../docs/maintain/maintain-guides-how-to-validate-polkadot.md",sourceDirName:"maintain",slug:"/maintain-guides-how-to-validate-polkadot",permalink:"/docs/maintain-guides-how-to-validate-polkadot",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/maintain-guides-how-to-validate-polkadot.md",tags:[],version:"current",lastUpdatedBy:"github-actions[bot]",lastUpdatedAt:1697437685,formattedLastUpdatedAt:"Oct 16, 2023",frontMatter:{id:"maintain-guides-how-to-validate-polkadot",title:"Run a Validator (Polkadot)",sidebar_label:"How to run a Validator on Polkadot",description:"The fundamentals for running a Polkadot validator.",keywords:["validator setup","validator","validate","binary","runtime"],slug:"../maintain-guides-how-to-validate-polkadot"},sidebar:"docs",previous:{title:"Nominator Guides",permalink:"/docs/maintain-guides-how-to-nominate-polkadot"},next:{title:"Validator Payout Overview",permalink:"/docs/maintain-guides-validator-payout"}},c={},h=[{value:"Preliminaries",id:"preliminaries",level:2},{value:"How many DOT do I need to become an active Validator?",id:"how-many-dot-do-i-need-to-become-an-active-validator",level:3},{value:"Initial Set-up",id:"initial-set-up",level:2},{value:"Requirements",id:"requirements",level:3},{value:"Reference Hardware",id:"standard-hardware",level:4},{value:"Install & Configure Network Time Protocol (NTP) Client",id:"install--configure-network-time-protocol-ntp-client",level:3},{value:"Make Sure Landlock is Enabled",id:"make-sure-landlock-is-enabled",level:3},{value:"Installing the Polkadot binaries",id:"installing-the-polkadot-binaries",level:3},{value:"Installation from official releases",id:"installation-from-official-releases",level:4},{value:"Optional: Installation with Package Managers",id:"optional-installation-with-package-managers",level:4},{value:"Debian-based (Debian, Ubuntu)",id:"debian-based-debian-ubuntu",level:4},{value:"RPM-based (Fedora, CentOS)",id:"rpm-based-fedora-centos",level:4},{value:"Optional: Installation with Ansible",id:"optional-installation-with-ansible",level:4},{value:"Optional: Installation with Docker",id:"optional-installation-with-docker",level:4},{value:"Optional: Building the Polkadot binaries from sources",id:"optional-building-the-polkadot-binaries-from-sources",level:3},{value:"Prerequisites: Install Rust and Dependencies",id:"prerequisites-install-rust-and-dependencies",level:4},{value:"Building the binaries",id:"building-the-binaries",level:4},{value:"Verify the installation",id:"verify-the-installation",level:3},{value:"Synchronize Chain Data",id:"synchronize-chain-data",level:3},{value:"Database Snapshot Services",id:"database-snapshot-services",level:4},{value:"Bond DOT",id:"bond-dot",level:2},{value:"Set Session Keys",id:"set-session-keys",level:2},{value:"Generating the Session Keys",id:"generating-the-session-keys",level:3},{value:"Option 1: PolkadotJS-APPS",id:"option-1-polkadotjs-apps",level:4},{value:"Option 2: CLI",id:"option-2-cli",level:4},{value:"Submitting the setKeys Transaction",id:"submitting-the-setkeys-transaction",level:3},{value:"Validate",id:"validate",level:2},{value:"Setup via Validator Tab",id:"setup-via-validator-tab",level:3},{value:"Thousand Validators Programme",id:"thousand-validators-programme",level:2},{value:"Running a validator on a testnet",id:"running-a-validator-on-a-testnet",level:2},{value:"FAQ",id:"faq",level:2},{value:"Why am I unable to synchronize the chain with 0 peers?",id:"why-am-i-unable-to-synchronize-the-chain-with-0-peers",level:3},{value:"How do I clear all my chain data?",id:"how-do-i-clear-all-my-chain-data",level:3},{value:"Note about VPS",id:"note-about-vps",level:2},{value:"Disable SMT",id:"disable-smt",level:3},{value:"Disable automatic NUMA balancing",id:"disable-automatic-numa-balancing",level:3},{value:"Configure Spectre/Meltdown Mitigations",id:"configure-spectremeltdown-mitigations",level:3},{value:"For Linux >= 5.16",id:"for-linux--516",level:4},{value:"For Linux < 5.16",id:"for-linux--516-1",level:4},{value:"VPS List",id:"vps-list",level:3}],m={toc:h},k="wrapper";function g(e){var t=e.components,d=(0,o.Z)(e,l);return(0,i.kt)(k,(0,n.Z)({},m,d,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"If you are a beginner, it is recommended that you start your validator journey on Kusama network.\nCheck the ",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-validate-kusama"},"Kusama guide")," for details on how to get\nstarted.")),(0,i.kt)("h2",{id:"preliminaries"},"Preliminaries"),(0,i.kt)("p",null,"Running a validator on a live network is a lot of responsibility! You will be accountable for not\nonly your own stake, but also the stake of your current nominators. If you make a mistake and get\nslashed, your tokens and your reputation will be at risk. However, running a validator can also be\nvery rewarding, knowing that you contribute to the security of a decentralized network while growing\nyour stash."),(0,i.kt)("admonition",{type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"It is highly recommended that you have significant system administration experience before\nattempting to run your own validator."),(0,i.kt)("p",{parentName:"admonition"},"You must be able to handle technical issues and anomalies with your node which you must be able to\ntackle yourself. Being a validator involves more than just executing the Polkadot binary.")),(0,i.kt)("p",null,"Since security is so important to running a successful validator, you should take a look at the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-secure-validator"},"secure validator")," information to make sure you understand the\nfactors to consider when constructing your infrastructure. As you progress in your journey as a\nvalidator, you will likely want to use this repository as a ",(0,i.kt)("em",{parentName:"p"},"starting point")," for your own\nmodifications and customizations."),(0,i.kt)("p",null,"If you need help, please reach out on the\n",(0,i.kt)("a",{parentName:"p",href:"https://matrix.to/#/#polkadotvalidatorlounge:web3.foundation"},"Polkadot Validator Lounge")," on\nElement. The team and other validators are there to help answer questions and provide tips from\nexperience."),(0,i.kt)("h3",{id:"how-many-dot-do-i-need-to-become-an-active-validator"},"How many DOT do I need to become an active Validator?"),(0,i.kt)("p",null,"You can have a rough estimate on that by using the methods listed\n",(0,i.kt)("a",{parentName:"p",href:"/docs/faq/#what-is-the-minimum-stake-necessary-to-be-elected-as-an-active-validator"},"here"),".\nTo be elected into the set, you need a minimum stake behind your validator. This stake can come from\nyourself or from ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nominator"},"nominators"),". This means that as a minimum, you will\nneed enough DOT to set up stash and staking proxy ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"accounts")," with\nthe existential deposit, plus a little extra for transaction fees. The rest can come from\nnominators. To understand how validators are elected, check the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"NPoS Election algorithms")," page."),(0,i.kt)("admonition",{title:"On-Chain Data for Reference",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"On Polkadot, the minimum stake backing a validator in the active set is\n",(0,i.kt)(s.Z,{network:"polkadot",defaultValue:0x3d83c4f4e51b08,mdxType:"MinimumStake"}),"\n"," in the era\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.currentEra",defaultValue:"998",mdxType:"RPC"}),".\n",""),(0,i.kt)("p",{parentName:"admonition"},"On Kusama, the minimum stake backing a validator in the active set is\n","\n",(0,i.kt)(s.Z,{network:"kusama",defaultValue:5288388652143741,mdxType:"MinimumStake"})," in the\nera\n","\n",(0,i.kt)(r.Z,{network:"kusama",path:"query.staking.currentEra",defaultValue:"4838",mdxType:"RPC"}),".")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Warning:")," Any DOT that you stake for your validator is liable to be slashed, meaning that an\ninsecure or improper setup may result in loss of DOT tokens! If you are not confident in your\nability to run a validator node, it is recommended to nominate your DOT to a trusted validator node\ninstead."),(0,i.kt)("h2",{id:"initial-set-up"},"Initial Set-up"),(0,i.kt)("h3",{id:"requirements"},"Requirements"),(0,i.kt)("p",null,"The most common way for a beginner to run a validator is on a cloud server running Linux. You may\nchoose whatever ",(0,i.kt)("a",{parentName:"p",href:"#note-about-vps"},"VPS")," provider that you prefer. As OS it is best to use a recent\nDebian Linux. For this guide we will be using ",(0,i.kt)("strong",{parentName:"p"},"Ubuntu 22.04"),", but the instructions should be\nsimilar for other platforms."),(0,i.kt)("h4",{id:"standard-hardware"},"Reference Hardware"),(0,i.kt)("p",null,"The transaction weights in Polkadot are benchmarked on reference hardware. We ran the benchmark on\nVM instances of two major cloud providers: Google Cloud Platform (GCP) and Amazon Web Services\n(AWS). To be specific, we used ",(0,i.kt)("inlineCode",{parentName:"p"},"n2-standard-8")," VM instance on GCP and ",(0,i.kt)("inlineCode",{parentName:"p"},"c6i.4xlarge")," on AWS. It is\nrecommended that the hardware used to run the validators at least matches the specs of the reference\nhardware in order to ensure they are able to process all blocks in time. If you use subpar hardware\nyou will possibly run into performance issues, get less era points, and potentially even get\nslashed."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"CPU"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"x86-64 compatible;"),(0,i.kt)("li",{parentName:"ul"},"Intel Ice Lake, or newer (Xeon or Core series); AMD Zen3, or newer (EPYC or Ryzen);"),(0,i.kt)("li",{parentName:"ul"},"4 physical cores @ 3.4GHz;"),(0,i.kt)("li",{parentName:"ul"},"Simultaneous multithreading disabled (Hyper-Threading on Intel, SMT on AMD);"),(0,i.kt)("li",{parentName:"ul"},"Prefer single-threaded performance over higher cores count. A comparison of single-threaded\nperformance can be found ",(0,i.kt)("a",{parentName:"li",href:"https://www.cpubenchmark.net/singleThread.html"},"here"),"."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Storage"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"An NVMe SSD of 1 TB (As it should be reasonably sized to deal with blockchain growth). An\nestimation of current chain snapshot sizes can be found ",(0,i.kt)("a",{parentName:"li",href:"https://paranodes.io/DBSize"},"here"),". In\ngeneral, the latency is more important than the throughput."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Memory"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"32 GB DDR4 ECC."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"System"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Linux Kernel 5.16 or newer."))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Network"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"The minimum symmetric networking speed is set to 500 Mbit/s (= 62.5 MB/s). This is required to\nsupport a large number of parachains and allow for proper congestion control in busy network\nsituations.")))),(0,i.kt)("p",null,"The specs posted above are not a ",(0,i.kt)("em",{parentName:"p"},"hard")," requirement to run a validator, but are considered best\npractice. Running a validator is a responsible task; using professional hardware is a must in any\nway."),(0,i.kt)("h3",{id:"install--configure-network-time-protocol-ntp-client"},"Install & Configure Network Time Protocol (NTP) Client"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Network_Time_Protocol"},"NTP")," is a networking protocol designed to\nsynchronize the clocks of computers over a network. NTP allows you to synchronize the clocks of all\nthe systems within the network. Currently it is required that validators' local clocks stay\nreasonably in sync, so you should be running NTP or a similar service. You can check whether you\nhave the NTP client by running:"),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"If you are using Ubuntu 18.04 or a newer version, NTP Client should be installed by default.")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"timedatectl\n")),(0,i.kt)("p",null,"If NTP is installed and running, you should see ",(0,i.kt)("inlineCode",{parentName:"p"},"System clock synchronized: yes")," (or a similar\nmessage). If you do not see it, you can install it by executing:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt-get install ntp\n")),(0,i.kt)("p",null,"ntpd will be started automatically after install. You can query ntpd for status information to\nverify that everything is working:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"sudo ntpq -p\n")),(0,i.kt)("admonition",{type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"Skipping this can result in the validator node missing block authorship opportunities. If the clock\nis out of sync (even by a small amount), the blocks the validator produces may not get accepted by\nthe network. This will result in ",(0,i.kt)("inlineCode",{parentName:"p"},"ImOnline")," heartbeats making it on chain, but zero allocated blocks\nmaking it on chain.")),(0,i.kt)("h3",{id:"make-sure-landlock-is-enabled"},"Make Sure Landlock is Enabled"),(0,i.kt)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://docs.kernel.org/userspace-api/landlock.html"},"Landlock")," is a Linux security feature used in\nPolkadot:"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Landlock empowers any process, including unprivileged ones, to securely restrict themselves.")),(0,i.kt)("p",null,"To make use of landlock, make sure you are on the reference kernel version or newer. Most Linux\ndistributions should already have landlock enabled, but you can check by running the following as\nroot:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"dmesg | grep landlock || journalctl -kg landlock\n")),(0,i.kt)("p",null,"If it is not enabled, please see the\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.kernel.org/userspace-api/landlock.html#kernel-support"},'official docs ("Kernel support")'),"\nif you would like to build Linux with landlock enabled."),(0,i.kt)("h3",{id:"installing-the-polkadot-binaries"},"Installing the Polkadot binaries"),(0,i.kt)("admonition",{title:"Multiple Validator Binaries",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"In addition to the ",(0,i.kt)("inlineCode",{parentName:"p"},"polkadot")," binary, recent changes have separated out functionality into two\nadditional needed binaries, ",(0,i.kt)("inlineCode",{parentName:"p"},"polkadot-prepare-worker"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"polkadot-execute-worker"),". All three\nbinaries are needed to properly run a validator node. More context on these changes can be found\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/pull/7337"},"here"))),(0,i.kt)("h4",{id:"installation-from-official-releases"},"Installation from official releases"),(0,i.kt)("p",null,"The official binaries can be downloaded from the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/releases"},"Github Releases"),". You should download the\nlatest available version. You can also download the binaries by using the following direct links\n(replace X.Y.Z by the appropriate version):"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"https://github.com/paritytech/polkadot-sdk/releases/download/polkadot-vX.Y.Z/polkadot\nhttps://github.com/paritytech/polkadot-sdk/releases/download/polkadot-vX.Y.Z/polkadot-execute-worker\nhttps://github.com/paritytech/polkadot-sdk/releases/download/polkadot-vX.Y.Z/polkadot-prepare-worker\n")),(0,i.kt)("h4",{id:"optional-installation-with-package-managers"},"Optional: Installation with Package Managers"),(0,i.kt)("p",null,"The Polkadot Binary in included in ",(0,i.kt)("inlineCode",{parentName:"p"},"Debian")," derivatives (i.e. ",(0,i.kt)("strong",{parentName:"p"},"Debian"),", ",(0,i.kt)("strong",{parentName:"p"},"Ubuntu"),") and\n",(0,i.kt)("inlineCode",{parentName:"p"},"RPM-based")," distros (i.e. ",(0,i.kt)("strong",{parentName:"p"},"Fedora"),", ",(0,i.kt)("strong",{parentName:"p"},"CentOS"),")."),(0,i.kt)("h4",{id:"debian-based-debian-ubuntu"},"Debian-based (Debian, Ubuntu)"),(0,i.kt)("p",null,"Run the following commands as the root user:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-ssh"},"# Import the security@parity.io GPG key\ngpg --recv-keys --keyserver hkps://keys.mailvelope.com 9D4B2B6EB8F97156D19669A9FF0812D491B96798\ngpg --export 9D4B2B6EB8F97156D19669A9FF0812D491B96798 > /usr/share/keyrings/parity.gpg\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# Install the `parity-keyring` package - This will ensure the GPG key\n# used by APT remains up-to-date\napt install parity-keyring\n# Install polkadot\napt install polkadot\n")),(0,i.kt)("h4",{id:"rpm-based-fedora-centos"},"RPM-based (Fedora, CentOS)"),(0,i.kt)("p",null,"Run the following commands as the root user:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"# Install dnf-plugins-core (This might already be installed)\ndnf install dnf-plugins-core\n# Add the repository and enable it\ndnf config-manager --add-repo https://releases.parity.io/rpm/polkadot.repo\ndnf config-manager --set-enabled polkadot\n# Install polkadot (You may have to confirm the import of the GPG key, which\n# should have the following fingerprint: 9D4B2B6EB8F97156D19669A9FF0812D491B96798)\ndnf install polkadot\n")),(0,i.kt)("p",null,'Make sure you verify the installation (see the "Verify the installation" section).'),(0,i.kt)("admonition",{title:"By default, the Polkadot systemd service is disabled",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"To start the service, run:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo systemctl start polkadot.service\n"))),(0,i.kt)("h4",{id:"optional-installation-with-ansible"},"Optional: Installation with Ansible"),(0,i.kt)("p",null,"To manage Polkadot installation with Ansible, you can use the ",(0,i.kt)("strong",{parentName:"p"},"Substrate node role")," distributed on\nthe ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/ansible-galaxy/"},"Parity chain operations Ansible collection")),(0,i.kt)("h4",{id:"optional-installation-with-docker"},"Optional: Installation with Docker"),(0,i.kt)("p",null,"To run Polkadot on a Docker or an OCI compatible container runtime, you can use the official\n",(0,i.kt)("a",{parentName:"p",href:"https://hub.docker.com/r/parity/polkadot/tags"},"parity/polkadot docker image"),", available on Docker\nHub (replace X.Y.Z by the appropriate version):"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"docker.io/parity/polkadot:vX.Y.Z\n")),(0,i.kt)("h3",{id:"optional-building-the-polkadot-binaries-from-sources"},"Optional: Building the Polkadot binaries from sources"),(0,i.kt)("h4",{id:"prerequisites-install-rust-and-dependencies"},"Prerequisites: Install Rust and Dependencies"),(0,i.kt)("p",null,"If you have never installed Rust, you should do this first."),(0,i.kt)("p",null,"If you have already installed Rust, run the following command to make sure you are using the latest\nversion."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"rustup update\n")),(0,i.kt)("p",null,"If not, this command will fetch the latest version of Rust and install it."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"curl https://sh.rustup.rs -sSf | sh -s -- -y\n")),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},'If you do not have "curl" installed, run:'),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sudo apt install curl\n")),(0,i.kt)("p",{parentName:"admonition"},'It will also be valuable to have "websocat" (Netcat, curl and socat for WebSockets) installed for\nRPC interactions. Installation instructions for various operating systems can be found\n',(0,i.kt)("a",{parentName:"p",href:"https://github.com/vi/websocat#installation"},"here"),".")),(0,i.kt)("p",null,"To configure your shell, run the following command."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"source $HOME/.cargo/env\n")),(0,i.kt)("p",null,"Verify your installation."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"rustc --version\n")),(0,i.kt)("p",null,"Finally, run this command to install the necessary dependencies for compiling and running the\nPolkadot node software."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"sudo apt install make clang pkg-config libssl-dev build-essential\n")),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If you are using OSX and you have ",(0,i.kt)("a",{parentName:"p",href:"https://brew.sh"},"Homebrew")," installed, you can issue the following\nequivalent command INSTEAD of the previous one:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"brew install cmake pkg-config openssl git llvm\n"))),(0,i.kt)("h4",{id:"building-the-binaries"},"Building the binaries"),(0,i.kt)("p",null,"You can build the Polkadot binaries from the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk"},"paritytech/polkadot-sdk")," repository on GitHub."),(0,i.kt)("p",null,"You should generally use the latest ",(0,i.kt)("strong",{parentName:"p"},"X.Y.Z"),' tag. You should either review the output from the "git\ntag" command or view the ',(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/tags"},"Polkadot SDK Github tags"),"\nto see a list of all the available release versions. You should replace ",(0,i.kt)("inlineCode",{parentName:"p"},"VERSION")," below with the\nlatest build (i.e., the highest number)."),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If you prefer to use SSH rather than HTTPS, you can replace the first line of the below with"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git clone git@github.com:paritytech/polkadot-sdk.git\n"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git clone https://github.com/paritytech/polkadot-sdk.git\ncd polkadot-sdk/polkadot\n")),(0,i.kt)("p",null,"Run the following command to find the latest version."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git tag -l | sort -V | grep -v -- '-rc'\n")),(0,i.kt)("p",null,'Find the latest version; replace "VERSION" in the commmand below and run to change your branch.'),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"git checkout VERSION\n./scripts/init.sh\n")),(0,i.kt)("p",null,"Build native code with the production profile. The following will make sure that the binaries are\nall in your ",(0,i.kt)("inlineCode",{parentName:"p"},"$PATH"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"cargo install --force --path . --profile production\n")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},(0,i.kt)("em",{parentName:"strong"},"This step will take a while (generally 10 - 40 minutes, depending on your hardware)."))),(0,i.kt)("admonition",{title:"Compilation Errors",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"If you run into compile errors, you may have to pin the version of Rust compiler to the one that was\nused to build the release. Check out ",(0,i.kt)("inlineCode",{parentName:"p"},"Rust compiler versions")," section in the release notes. This can\nbe done by running:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"rustup install nightly-2022-05-18\nrustup target add wasm32-unknown-unknown --toolchain nightly-2022-05-18\ncargo +nightly-2022-05-18 build --release\n")),(0,i.kt)("p",{parentName:"admonition"},"You may also need to run the build more than once."),(0,i.kt)("p",{parentName:"admonition"},"If you would like to execute the tests, run the following command:"),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"cargo test --all\n"))),(0,i.kt)("p",null,"If you are interested in generating keys locally, you can also install ",(0,i.kt)("inlineCode",{parentName:"p"},"subkey")," from the same\ndirectory. You may then take the generated ",(0,i.kt)("inlineCode",{parentName:"p"},"subkey")," executable and transfer it to an air-gapped\nmachine for extra security."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"cargo install --force --git https://github.com/paritytech/polkadot-sdk subkey\n")),(0,i.kt)("h3",{id:"verify-the-installation"},"Verify the installation"),(0,i.kt)("p",null,"After installing Polkadot, you can verify the installation by running"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"polkadot --version\npolkadot-execute-worker --version\npolkadot-prepare-worker --version\n")),(0,i.kt)("p",null,"It should return something like this (the exact versions don't matter, but they must all be the\nsame):"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"0.9.43-36264cb36db\n0.9.43-36264cb36db\n0.9.43-36264cb36db\n")),(0,i.kt)("p",null,"If not, make sure that you installed all the binaries, all the binaries are somewhere in your\n",(0,i.kt)("inlineCode",{parentName:"p"},"$PATH")," and they are all in the same folder."),(0,i.kt)("h3",{id:"synchronize-chain-data"},"Synchronize Chain Data"),(0,i.kt)("p",null,"You can begin syncing your node by running the following command if you do not want to start in\nvalidator mode right away:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"polkadot\n")),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"If you want to run a validator on Kusama, you have an option to specify the chain. With no\nspecification, this would default to Polkadot."),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"polkadot --chain=kusama\n"))),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"2021-06-17 03:07:07 Parity Polkadot\n2021-06-17 03:07:07 \u270c\ufe0f version 0.9.5-95f6aa201-x86_64-linux-gnu\n2021-06-17 03:07:07 \u2764\ufe0f by Parity Technologies , 2017-2021\n2021-06-17 03:07:07 \ud83d\udccb Chain specification: Polkadot\n2021-06-17 03:07:07 \ud83c\udff7 Node name: boiling-pet-7554\n2021-06-17 03:07:07 \ud83d\udc64 Role: FULL\n2021-06-17 03:07:07 \ud83d\udcbe Database: RocksDb at /root/.local/share/polkadot/chains/polkadot/db\n2021-06-17 03:07:07 \u26d3 Native runtime: polkadot-9050 (parity-polkadot-0.tx7.au0)\n2021-06-17 03:07:10 \ud83c\udff7 Local node identity is: 12D3KooWLtXFWf1oGrnxMGmPKPW54xWCHAXHbFh4Eap6KXmxoi9u\n2021-06-17 03:07:10 \ud83d\udce6 Highest known block at #17914\n2021-06-17 03:07:10 \u303d\ufe0f Prometheus server started at 127.0.0.1:9615\n2021-06-17 03:07:10 Listening for new connections on 127.0.0.1:9944.\n")),(0,i.kt)("admonition",{title:"Example of node sync",type:"info"},(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre"},"2021-06-17 03:07:39 \ud83d\udd0d Discovered new external address for our node: /ip4/10.26.16.1/tcp/30333/ws/p2p/12D3KooWLtXFWf1oGrnxMGmPKPW54xWCHAXHbFh4Eap6KXmxoi9u\n2021-06-17 03:07:40 \u2699\ufe0f Syncing 218.8 bps, target=#5553764 (17 peers), best: #24034 (0x08af\u2026dcf5), finalized #23552 (0xd4f0\u20262642), \u2b07 173.5kiB/s \u2b06 12.7kiB/s\n2021-06-17 03:07:45 \u2699\ufe0f Syncing 214.8 bps, target=#5553765 (20 peers), best: #25108 (0xb272\u2026e800), finalized #25088 (0x94e6\u20268a9f), \u2b07 134.3kiB/s \u2b06 7.4kiB/s\n2021-06-17 03:07:50 \u2699\ufe0f Syncing 214.8 bps, target=#5553766 (21 peers), best: #26182 (0xe7a5\u202601a2), finalized #26112 (0xcc29\u2026b1a9), \u2b07 5.0kiB/s \u2b06 1.1kiB/s\n2021-06-17 03:07:55 \u2699\ufe0f Syncing 138.4 bps, target=#5553767 (21 peers), best: #26874 (0xcf4b\u20266553), finalized #26624 (0x9dd9\u202627f8), \u2b07 18.9kiB/s \u2b06 2.0kiB/s\n2021-06-17 03:08:00 \u2699\ufe0f Syncing 37.0 bps, target=#5553768 (22 peers), best: #27059 (0x5b73\u20266fc9), finalized #26624 (0x9dd9\u202627f8), \u2b07 14.3kiB/s \u2b06 4.4kiB/s\n"))),(0,i.kt)("admonition",{title:"Use Warp sync for faster syncing",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"By default, the node performs ",(0,i.kt)("inlineCode",{parentName:"p"},"full")," sync, which downloads and validates the full blockchain\nhistory. Full sync works by listening to announced blocks and requesting the blocks from the\nannouncing peers, or just the block headers in case of light clients."),(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("inlineCode",{parentName:"p"},"Fast")," sync is another option that works by downloading the block header history and validating the\nauthority set changes in order to arrive at a specific (usually the most recent) header. After the\ndesired header has been reached and verified, the state can be downloaded and imported. Once this\nprocess has been completed, the node can proceed with a full sync."),(0,i.kt)("pre",{parentName:"admonition"},(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"polkadot --sync warp\n")),(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("inlineCode",{parentName:"p"},"Warp sync")," initially downloads and validates the finality proofs from\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus#finality-gadget-grandpa"},"GRANDPA")," and then downloads the state of the\nlatest finalized block. After the warp sync, the node is ready to import the latest blocks from the\nnetwork and can be used as a Validator. The blocks from genesis will be downloaded in the\nbackground. Check\n",(0,i.kt)("a",{parentName:"p",href:"https://substrate.stackexchange.com/questions/334/what-kinds-of-sync-mechanisms-does-substrate-implement/"},"this discussion"),"\nfor more information about the different sync options available.")),(0,i.kt)("admonition",{title:"Validators should sync using the RocksDb backend",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"This is implicit by default, but can be explicit by passing the ",(0,i.kt)("inlineCode",{parentName:"p"},"--database RocksDb")," flag."),(0,i.kt)("p",{parentName:"admonition"},"In the future, it is recommended to switch to the faster and more efficient ParityDB option. Note\nthat ",(0,i.kt)("strong",{parentName:"p"},"ParityDB is still experimental and should not be used in production.")," If you want to test\nout ParityDB, you can add the flag ",(0,i.kt)("inlineCode",{parentName:"p"},"--database paritydb"),". Switching between database backends will\nrequire a resync.")),(0,i.kt)("p",null,"Depending on the size of the chain when you do this, this step may take anywhere from a few minutes\nto a few hours."),(0,i.kt)("p",null,"If you are interested in determining how much longer you have to go, your server logs (printed to\nSTDOUT from the ",(0,i.kt)("inlineCode",{parentName:"p"},"polkadot")," process) will tell you the latest block your node has processed and\nverified. You can then compare that to the current highest block via\n",(0,i.kt)("a",{parentName:"p",href:"https://telemetry.polkadot.io/#list/Polkadot%20CC1"},"Telemetry")," or the\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/explorer"},"PolkadotJS Block Explorer"),"."),(0,i.kt)("h4",{id:"database-snapshot-services"},"Database Snapshot Services"),(0,i.kt)("p",null,"If you start a node for the first time, it will start building from the genesis block. This process\ncan take a while depending on the database size. To make this process faster, snapshots can be used.\nSnapshots are compressed backups of the database directory of Polkadot/Kusama nodes, containing the\nwhole chain (or a pruned version of it, with states only from the latest 1000 or 256 blocks). Listed\nbelow are a few public snapshot providers for Polkadot and Kusama."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://stakeworld.io/snapshot"},"Stakeworld")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://polkachu.com/snapshots"},"Polkachu")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://polkashots.io/"},"Polkashots"))),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"For the security of the network, it is recommended that you sync from scratch, even if you are\nrunning your node in pruning mode for validation. The reason is that if these snapshots get\ncorrupted and a majority of nodes run based on these snapshots, the network could end up running on\na non-canonical chain.")),(0,i.kt)("h2",{id:"bond-dot"},"Bond DOT"),(0,i.kt)("p",null,"To start a validator instance on Polkadot, the minimum bond required is\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.minValidatorBond",defaultValue:"0",filter:"humanReadable",mdxType:"RPC"}),".\n","\nBut to enter the active validator set and be eligible to earn rewards, your validator node should be\nnominated by a minimum number of DOT tokens. On Polkadot, the minimum stake backing a validator in\nthe active set is\n",(0,i.kt)(s.Z,{network:"polkadot",defaultValue:0x3d83c4f4e51b08,mdxType:"MinimumStake"}),"\n"," in the era\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.currentEra",defaultValue:"998",mdxType:"RPC"}),".\n","\nOn Kusama, the minimum stake backing a validator in the active set is\n",(0,i.kt)(s.Z,{network:"kusama",defaultValue:5288388652143741,mdxType:"MinimumStake"}),"\n",(0,i.kt)(s.Z,{network:"kusama",defaultValue:5288388652143741,mdxType:"MinimumStake"})," in the\nera\n","\n",(0,i.kt)(r.Z,{network:"kusama",path:"query.staking.currentEra",defaultValue:"4838",mdxType:"RPC"}),"."),(0,i.kt)("p",null,"If you are validator who intends to get DOT/KSM nominations from the community, you will need to\nshow some skin in the game. For that, you need to bond some DOT/KSM as own stake. Make sure not to\nbond all your DOT balance since you will be unable to pay transaction fees from your bonded balance."),(0,i.kt)("admonition",{title:"Controller accounts are deprecated. Use Staking Proxy.",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Controller accounts are deprecated. For more information, see\n",(0,i.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/t/staking-controller-deprecation-plan-staking-ui-leads-comms/2748"},"this discussion"),".\nIt is highly recommended that you setup an account with a staking proxy, which can be used for\nissuing start and stop validating calls. Read more about ",(0,i.kt)("a",{parentName:"p",href:"../learn/learn-proxies"},"proxy accounts"),"\nhere.")),(0,i.kt)("p",null,"First, go to the ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/actions"},"Staking"),' section. Click on\n"Account Actions", and then the "+ Stash" button.'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"bonding-JS-UI",src:a(90412).Z,width:"2143",height:"847"})),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Stash account")," - Select your Stash account (which is the acocunt with the DOT/KSM balance)"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Value bonded")," - How much DOT from the Stash account you want to bond/stake. Note that you do\nnot need to bond all of the DOT in that account. Also note that you can always bond ",(0,i.kt)("em",{parentName:"li"},"more")," DOT\nlater. However, ",(0,i.kt)("em",{parentName:"li"},"withdrawing")," any bonded amount requires the duration of the unbonding period. On\nKusama, the unbonding period is 7 days. On Polkadot, the planned unbonding period is 28 days."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Payment destination")," - The account where the rewards from validating are sent. More info\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking/#reward-distribution"},"here"),". Starting with runtime version v23 natively\nincluded in client version ",(0,i.kt)("a",{parentName:"li",href:"https://github.com/paritytech/polkadot/releases/tag/v0.9.3"},"0.9.3"),",\npayouts can go to any custom address. If you'd like to redirect payments to an account that is not\nthe stash account, you can do it by entering the address here. Note that it is extremely unsafe to\nset an exchange address as the recipient of the staking rewards.")),(0,i.kt)("p",null,"Once everything is filled in properly, click ",(0,i.kt)("inlineCode",{parentName:"p"},"Bond")," and sign the transaction with your Stash\naccount."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"sign transaction",src:a(93002).Z,width:"2141",height:"780"})),(0,i.kt)("p",null,"After a few seconds, you should see an ",(0,i.kt)("inlineCode",{parentName:"p"},"ExtrinsicSuccess")," message."),(0,i.kt)("p",null,"Your bonded account will available under ",(0,i.kt)("inlineCode",{parentName:"p"},"Stashes"),". You should now see a new card with all your\naccounts (note: you may need to refresh the screen). The bonded amount on the right corresponds to\nthe funds bonded by the Stash account."),(0,i.kt)("h2",{id:"set-session-keys"},"Set Session Keys"),(0,i.kt)("admonition",{title:"Session keys are consensus critical",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"If you are not sure if your node has the current session keys that you made the ",(0,i.kt)("inlineCode",{parentName:"p"},"setKeys"),"\ntransaction then you can use one of the two available RPC methods to query your node:\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/docs/substrate/rpc/#haskeypublickey-bytes-keytype-text-bool"},"hasKey")," to\ncheck for a specific key or\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/docs/substrate/rpc/#hassessionkeyssessionkeys-bytes-bool"},"hasSessionKeys"),"\nto check the full session key public key string.")),(0,i.kt)("p",null,"Once your node is fully synced, stop the process by pressing Ctrl-C. At your terminal prompt, you\nwill now start running the node."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},'polkadot --validator --name "name on telemetry"\n')),(0,i.kt)("p",null,"Similarly:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"2021-06-17 03:12:08 Parity Polkadot\n2021-06-17 03:12:08 \u270c\ufe0f version 0.9.5-95f6aa201-x86_64-linux-gnu\n2021-06-17 03:12:08 \u2764\ufe0f by Parity Technologies , 2017-2021\n2021-06-17 03:12:08 \ud83d\udccb Chain specification: Polkadot\n2021-06-17 03:12:08 \ud83c\udff7 Node name: nateched-test\n2021-06-17 03:12:08 \ud83d\udc64 Role: AUTHORITY\n2021-06-17 03:12:08 \ud83d\udcbe Database: RocksDb at /root/.local/share/polkadot/chains/polkadot/db\n2021-06-17 03:12:08 \u26d3 Native runtime: polkadot-9050 (parity-polkadot-0.tx7.au0)\n2021-06-17 03:12:12 \ud83c\udff7 Local node identity is: 12D3KooWLtXFWf1oGrnxMGmPKPW54xWCHAXHbFh4Eap6KXmxoi9u\n2021-06-17 03:12:12 \ud83d\udce6 Highest known block at #64673\n2021-06-17 03:12:12 \u303d\ufe0f Prometheus server started at 127.0.0.1:9615\n2021-06-17 03:12:12 Listening for new connections on 127.0.0.1:9944.\n2021-06-17 03:12:12 \ud83d\udc76 Starting BABE Authorship worker\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"2021-06-17 03:12:16 \ud83d\udd0d Discovered new external address for our node: /ip4/10.26.11.1/tcp/30333/p2p/12D3KooWLtXFWf1oGrnxMGmPKPW54xWCHAXHbFh4Eap6KXmxoi9u\n2021-06-17 03:12:17 \u2699\ufe0f Syncing, target=#5553810 (14 peers), best: #65068 (0x6da5\u20260662), finalized #65024 (0x4e84\u2026d170), \u2b07 352.2kiB/s \u2b06 75.6kiB/s\n")),(0,i.kt)("p",null,"You can give your validator any name that you like, but note that others will be able to see it, and\nit will be included in the list of all servers using the same telemetry server. Since numerous\npeople are using telemetry, it is recommended that you choose something likely to be unique."),(0,i.kt)("h3",{id:"generating-the-session-keys"},"Generating the Session Keys"),(0,i.kt)("p",null,"You need to tell the chain your Session keys by signing and submitting an extrinsic. This is what\nassociates your validator node with your stash account on Polkadot."),(0,i.kt)("h4",{id:"option-1-polkadotjs-apps"},"Option 1: PolkadotJS-APPS"),(0,i.kt)("p",null,"You can generate your ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"Session keys")," in the client via the apps RPC.\nIf you are doing this, make sure that you have the PolkadotJS-Apps explorer attached to your\nvalidator node. You can configure the apps dashboard to connect to the endpoint of your validator in\nthe Settings tab. If you are connected to a default endpoint hosted by Parity of Web3 Foundation,\nyou will not be able to use this method since making RPC requests to this node would effect the\nlocal keystore hosted on a ",(0,i.kt)("em",{parentName:"p"},"public node")," and you want to make sure you are interacting with the\nkeystore for ",(0,i.kt)("em",{parentName:"p"},"your node"),"."),(0,i.kt)("p",null,"Once ensuring that you have connected to your node, the easiest way to set session keys for your\nnode is by calling the ",(0,i.kt)("inlineCode",{parentName:"p"},"author_rotateKeys")," RPC request to create new keys in your validator's\nkeystore. Navigate to Toolbox tab and select RPC Calls then select the author > rotateKeys() option\nand remember to save the output that you get back for a later step."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Explorer RPC call",src:a(54061).Z,width:"1700",height:"582"})),(0,i.kt)("h4",{id:"option-2-cli"},"Option 2: CLI"),(0,i.kt)("p",null,"If you are on a remote server, it is easier to run this command on the same machine (while the node\nis running with the default WS RPC port configured):"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},'echo \'{"id":1,"jsonrpc":"2.0","method":"author_rotateKeys","params":[]}\' | websocat -n1 -B 99999999 ws://127.0.0.1:9944\n')),(0,i.kt)("p",null,'The output will have a hex-encoded "result" field. The result is the concatenation of the four\npublic keys. Save this result for a later step.'),(0,i.kt)("p",null,"You can restart your node at this point."),(0,i.kt)("h3",{id:"submitting-the-setkeys-transaction"},"Submitting the ",(0,i.kt)("inlineCode",{parentName:"h3"},"setKeys")," Transaction"),(0,i.kt)("p",null,"You need to tell the chain your Session keys by signing and submitting an extrinsic. This is what\nassociates your validator with your staking proxy."),(0,i.kt)("p",null,"Go to ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/actions"},"Staking > Account Actions"),', and click "Set\nSession Key" on the bonding account you generated earlier. Enter the output from ',(0,i.kt)("inlineCode",{parentName:"p"},"author_rotateKeys"),'\nin the field and click "Set Session Key".'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"staking-change-session",src:a(72316).Z,width:"2792",height:"182"}),"\n",(0,i.kt)("img",{alt:"staking-session-result",src:a(12883).Z,width:"2146",height:"680"})),(0,i.kt)("p",null,"Submit this extrinsic and you are now ready to start validating."),(0,i.kt)("h2",{id:"validate"},"Validate"),(0,i.kt)("p",null,"To verify that your node is live and synchronized, head to\n",(0,i.kt)("a",{parentName:"p",href:"https://telemetry.polkadot.io/#list/Polkadot%20CC1"},"Telemetry")," and find your node. Note that this\nwill show all nodes on the Polkadot network, which is why it is important to select a unique name!"),(0,i.kt)("p",null,"In this example, we used the name ",(0,i.kt)("inlineCode",{parentName:"p"},"techedtest")," and have successfully located it upon searching:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"polkadot-dashboard-telemetry",src:a(67929).Z,width:"2862",height:"472"})),(0,i.kt)("h3",{id:"setup-via-validator-tab"},"Setup via Validator Tab"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"polkadot-dashboard-validate-1",src:a(63670).Z,width:"2128",height:"1022"})),(0,i.kt)("p",null,"Here you will need to input the Keys from ",(0,i.kt)("inlineCode",{parentName:"p"},"rotateKeys"),", which is the Hex output from\n",(0,i.kt)("inlineCode",{parentName:"p"},"author_rotateKeys"),". The keys will show as pending until applied at the start of a new session."),(0,i.kt)("p",null,'The "reward commission percentage" is the commission percentage that you can declare against your\nvalidator\'s rewards. This is the rate that your validator will be commissioned with.'),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Payment preferences")," - You can specify the percentage of the rewards that will get paid to you.\nThe remaining will be split among your nominators.")),(0,i.kt)("admonition",{title:"Setting a commission rate of 100% suggests that you do not want your validator to receive",type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"nominations")),(0,i.kt)("p",null,'You can also determine if you would like to receive nominations with the "allows new nominations"\noption.'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"dashboard validate",src:a(44281).Z,width:"2126",height:"694"})),(0,i.kt)("p",null,'Click "Bond & Validate".'),(0,i.kt)("p",null,'If you go to the "Staking" tab, you will see a list of active validators currently running on the\nnetwork. At the top of the page, it shows the number of validator slots that are available as well\nas the number of nodes that have signaled their intention to be a validator. You can go to the\n"Waiting" tab to double check to see whether your node is listed there.'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"staking queue",src:a(46513).Z,width:"2838",height:"1440"})),(0,i.kt)("p",null,"The validator set is refreshed every era. In the next era, if there is a slot available and your\nnode is selected to join the validator set, your node will become an active validator. Until then,\nit will remain in the ",(0,i.kt)("em",{parentName:"p"},"waiting")," queue. If your validator is not selected to become part of the\nvalidator set, it will remain in the ",(0,i.kt)("em",{parentName:"p"},"waiting")," queue until it is. There is no need to re-start if\nyou are not selected for the validator set in a particular era. However, it may be necessary to\nincrease the number of DOT staked or seek out nominators for your validator in order to join the\nvalidator set."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Congratulations!")," If you have followed all of these steps, and been selected to be a part of the\nvalidator set, you are now running a Polkadot validator! If you need help, reach out on the\n",(0,i.kt)("a",{parentName:"p",href:"https://matrix.to/#/!NZrbtteFeqYKCUGQtr:matrix.parity.io?via=matrix.parity.io&via=matrix.org&via=web3.foundation"},"Polkadot Validator chat"),"."),(0,i.kt)("h2",{id:"thousand-validators-programme"},"Thousand Validators Programme"),(0,i.kt)("p",null,"The Thousand Validators Programme is a joint initiative by Web3 Foundation and Parity Technologies\nto provide support for community validators. If you are interested in applying for the programme,\nyou can find more information ",(0,i.kt)("a",{parentName:"p",href:"/docs/thousand-validators"},"on the wiki page"),"."),(0,i.kt)("h2",{id:"running-a-validator-on-a-testnet"},"Running a validator on a testnet"),(0,i.kt)("p",null,"To verify your validator set up, it is possible to run it against a PoS test network such as Westend\nor Wococo. However, validator slots are intentionally limited on Westend to ensure the stability and\navailability of the testnet for the Polkadot release process. As such it is advised for node\noperators wishing to run testnet validators to join the Wococo network. You can obtain WOOK tokens\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-DOT#getting-tokens-on-the-wococo-testnet"},"here"),"."),(0,i.kt)("p",null,"Here is a small comparison of each network characteristics as relevant to validators:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Network"),(0,i.kt)("th",{parentName:"tr",align:null},"Polkadot"),(0,i.kt)("th",{parentName:"tr",align:null},"Westend"),(0,i.kt)("th",{parentName:"tr",align:null},"Wococo"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"epoch"),(0,i.kt)("td",{parentName:"tr",align:null},"4h"),(0,i.kt)("td",{parentName:"tr",align:null},"1h"),(0,i.kt)("td",{parentName:"tr",align:null},"10m")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"era"),(0,i.kt)("td",{parentName:"tr",align:null},"1d"),(0,i.kt)("td",{parentName:"tr",align:null},"6h"),(0,i.kt)("td",{parentName:"tr",align:null},"1h")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"token"),(0,i.kt)("td",{parentName:"tr",align:null},"DOT"),(0,i.kt)("td",{parentName:"tr",align:null},"WND (test)"),(0,i.kt)("td",{parentName:"tr",align:null},"WOOK (test)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"active validators"),(0,i.kt)("td",{parentName:"tr",align:null},"~300"),(0,i.kt)("td",{parentName:"tr",align:null},"~20"),(0,i.kt)("td",{parentName:"tr",align:null},"10 /sys/devices/system/cpu/cpu$cpunum/online\ndone\n")),(0,i.kt)("p",null,"It will disable every other (vCPU) core."),(0,i.kt)("p",null,"To save changes permanently add ",(0,i.kt)("inlineCode",{parentName:"p"},"nosmt=force")," as kernel parameter. Edit ",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/default/grub")," and add\n",(0,i.kt)("inlineCode",{parentName:"p"},"nosmt=force")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"GRUB_CMDLINE_LINUX_DEFAULT")," variable and run ",(0,i.kt)("inlineCode",{parentName:"p"},"sudo update-grub"),". After the reboot\nyou should see half of the cores are offline. Run ",(0,i.kt)("inlineCode",{parentName:"p"},"lscpu --extended")," to confirm."),(0,i.kt)("h3",{id:"disable-automatic-numa-balancing"},"Disable automatic NUMA balancing"),(0,i.kt)("p",null,"If you have multiple physical CPUs (CPU0 and CPU1) in the system each with its own memory bank (MB0\nand MB1), then it is usually slower for a CPU0 to access MB1 due to the slower interconnection. To\nprevent the OS from automatically moving the running Substrate process from one CPU to another and\nthus causing an increased latency, it is recommended to disable automatic NUMA balancing."),(0,i.kt)("p",null,"With automatic NUMA balancing disabled, an OS will always run a process on the same NUMA node where\nit was initially scheduled."),(0,i.kt)("p",null,"To disable NUMA balancing in runtime:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sysctl kernel.numa_balancing=0\n")),(0,i.kt)("p",null,"To save changes permanently, update startup options and reconfigure GRUB. Edit ",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/default/grub"),"\nand add ",(0,i.kt)("inlineCode",{parentName:"p"},"numa_balancing=disable")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"GRUB_CMDLINE_LINUX_DEFAULT")," variable and run\n",(0,i.kt)("inlineCode",{parentName:"p"},"sudo update-grub"),". After reboot you can confirm the change by running\n",(0,i.kt)("inlineCode",{parentName:"p"},"sysctl -a | grep 'kernel.numa_balancing'")," and checking if the parameter is set to 0"),(0,i.kt)("h3",{id:"configure-spectremeltdown-mitigations"},"Configure Spectre/Meltdown Mitigations"),(0,i.kt)("p",null,"Spectre and Meltdown are vulnerabilities discovered in modern CPUs a few years ago. Mitigations were\nmade to the Linux kernel to cope with the multiple variations of these attacks. Check out\n",(0,i.kt)("a",{parentName:"p",href:"https://meltdownattack.com/"},"https://meltdownattack.com/")," for more info."),(0,i.kt)("p",null,"Initially those mitigations added ~20% penalty to the performance of the workloads. As CPU\nmanufacturers started to roll-out mitigations implemented in hardware, the performance gap\n",(0,i.kt)("a",{parentName:"p",href:"https://www.phoronix.com/scan.php?page=article&item=3-years-specmelt&num=1"},"narrowed down"),". As the\nbenchmark demonstrates, the performance penalty got reduced to ~7% on Intel 10th Gen CPUs. This is\ntrue for the workloads running on both bare-metal and VMs. But the penalty remains high for the\ncontainerized workloads in some cases."),(0,i.kt)("p",null,"As demonstrated in\n",(0,i.kt)("a",{parentName:"p",href:"http://mamememo.blogspot.com/2020/05/cpu-intensive-rubypython-code-runs.html"},"Yusuke Endoh's article"),",\na performance penalty for containerized workloads can be as high as 100%. This is due to SECCOMP\nprofile being overprotective about applying Spectre/Meltdown mitigations without providing real\nsecurity. A longer explanation is a available in the\n",(0,i.kt)("a",{parentName:"p",href:"https://lkml.org/lkml/2020/11/4/1135"},"kernel patch discussion"),"."),(0,i.kt)("p",null,"Linux 5.16\n",(0,i.kt)("a",{parentName:"p",href:"https://www.phoronix.com/scan.php?page=news_item&px=Linux-Spectre-SECCOMP-Default"},"loosened the protections"),"\napplied to SECCOMP threads by default. Containers running on kernel 5.16 and later now don't suffer\nfrom the performance penalty implied by using a SECCOMP profile in container runtimes."),(0,i.kt)("h4",{id:"for-linux--516"},"For Linux >= 5.16"),(0,i.kt)("p",null,"You are all set. The performance of containerized workloads is on par with non-containerized ones.\nYou don't have to do anything."),(0,i.kt)("h4",{id:"for-linux--516-1"},"For Linux < 5.16"),(0,i.kt)("p",null,"You'll need to disable mitigations for Spectre V2 for user-space tasks as well as Speculative Store\nBypass Disable (SSBD) for Spectre V4.\n",(0,i.kt)("a",{parentName:"p",href:"https://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git/commit/?h=for-next/seccomp&id=2f46993d83ff4abb310ef7b4beced56ba96f0d9d"},"This patch message"),"\ndescribes the reasoning for this default change in more detail:"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Ultimately setting SSBD and STIBP by default for all seccomp jails is a bad sweet spot and bad\ndefault with more cons than pros that end up reducing security in the public cloud (by giving an\nhuge incentive to not expose SPEC_CTRL which would be needed to get full security with IBPB after\nsetting nosmt in the guest) and by excessively hurting performance to more secure apps using\nseccomp that end up having to opt out with SECCOMP_FILTER_FLAG_SPEC_ALLOW.")),(0,i.kt)("p",null,"To disable the mitigations edit ",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/default/grub")," and add\n",(0,i.kt)("inlineCode",{parentName:"p"},"spec_store_bypass_disable=prctl spectre_v2_user=prctl")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"GRUB_CMDLINE_LINUX_DEFAULT")," variable,\nrun ",(0,i.kt)("inlineCode",{parentName:"p"},"sudo update-grub"),", then reboot."),(0,i.kt)("p",null,"Note that mitigations are not disabled completely. You can fully disable all the available kernel\nmitigations by setting ",(0,i.kt)("inlineCode",{parentName:"p"},"mitigations=off"),". But we don't recommend doing this unless you run a fully\ntrusted code on the host."),(0,i.kt)("h3",{id:"vps-list"},"VPS List"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://cloud.google.com/"},"Google Cloud")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://aws.amazon.com/"},"Amazon AWS")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.ovh.com.au/"},"OVH")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.digitalocean.com/"},"Digital Ocean")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.vultr.com/"},"Vultr")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.linode.com/"},"Linode")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.scaleway.com/"},"Scaleway")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://onfinality.io/"},"OnFinality"))),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("mdxAdmonitionTitle",{parentName:"admonition"},"Beware of the ",(0,i.kt)("strong",{parentName:"mdxAdmonitionTitle"},"Terms and Conditions")," and ",(0,i.kt)("strong",{parentName:"mdxAdmonitionTitle"},"Acceptable Use Policies")," for each VPS"),(0,i.kt)("p",{parentName:"admonition"},"provider"),(0,i.kt)("p",{parentName:"admonition"},'You may be locked out of your account and your server shut down if you come in violation. For\ninstance, Digital Ocean lists "Mining of Cryptocurrencies" under the Network Abuse section of their\n',(0,i.kt)("a",{parentName:"p",href:"https://www.digitalocean.com/legal/acceptable-use-policy/"},"Acceptable Use Policy")," and requires\nexplicit permission to do so. This may extend to other cryptocurrency activity.")))}g.isMDXComponent=!0},90412:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/JS-UI-bond-7bdecad8831f3c1b20d96e426e7e47c1.png"},93002:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/JS-UI-sign-transaction-75b2e29fcaecc44c5eb1c4f5e3e364ae.png"},46513:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-dashboard-staking-4005504ef30291ebe1a243298c351a34.png"},67929:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-dashboard-telemetry-8930bdd60309c864ed682a1bdd4b1e31.png"},63670:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-dashboard-validate-1-4bf6a6488b4e128d12cab2617025d796.png"},44281:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-dashboard-validate-2-18a8869804f89ffebafa1b920e31ccd6.png"},54061:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-explorer-rotatekeys-rpc-6d5ba5d9ffb20fd9683432e9a6ccd0f9.jpg"},29009:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/polkadot-zero-peer-2642d52b7e07893a66a0ddfd492cce38.jpg"},72316:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/set-session-key-1-b0cdb38a299d6ef6bcc24c6ab2bce66d.png"},12883:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/set-session-key-2-408efe22daa8d6533715987a1099828a.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/a7c27f4d.7937bcb2.js b/assets/js/a7c27f4d.7937bcb2.js new file mode 100644 index 000000000000..31be4d0fad5a --- /dev/null +++ b/assets/js/a7c27f4d.7937bcb2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[4174],{39220:s=>{s.exports=JSON.parse('{"title":"Basic concepts about Polkadot","description":"Everything about staking, accounts, OpenGov, treasury, transactions, tokens and NFTs.","slug":"/learn-basics-index","permalink":"/docs/learn-basics-index","navigation":{"previous":{"title":"Glossary","permalink":"/docs/glossary"},"next":{"title":"Accounts","permalink":"/docs/learn-accounts-index"}}}')}}]); \ No newline at end of file diff --git a/assets/js/a7c27f4d.93985089.js b/assets/js/a7c27f4d.93985089.js deleted file mode 100644 index c15b1c558f08..000000000000 --- a/assets/js/a7c27f4d.93985089.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[4174],{39220:s=>{s.exports=JSON.parse('{"title":"Basic concepts about Polkadot","description":"Everything about staking, accounts, transactions, tokens and NFTs.","slug":"/learn-basics-index","permalink":"/docs/learn-basics-index","navigation":{"previous":{"title":"Glossary","permalink":"/docs/glossary"},"next":{"title":"Accounts","permalink":"/docs/learn-accounts-index"}}}')}}]); \ No newline at end of file diff --git a/assets/js/ab138bf8.02d24230.js b/assets/js/ab138bf8.02d24230.js deleted file mode 100644 index 3688c2eda796..000000000000 --- a/assets/js/ab138bf8.02d24230.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[8791],{47940:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var a=n(74165),o=n(15861),r=n(67294),i=n(87152),s=n(17145),p=n(67425);function l(e,t,n){return c.apply(this,arguments)}function c(){return(c=(0,o.Z)((0,a.Z)().mark((function e(t,n,o){var r,p,l,c,u;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=void 0,p=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){e.next=18;break}return e.abrupt("return");case 18:return l=new i.U(r),e.next=21,s.G.create({provider:l});case 21:c=e.sent,(u=n.split(".")).forEach((function(e){e in c&&(c=c[e])})),e.t1=u[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return p=c.toString(),e.abrupt("break",35);case 29:return e.next=31,c();case 31:return p=(p=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+n);case 35:return e.abrupt("return",p);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function u(e,t,n,a){switch(t){case"humanReadable":(0,p.HumanReadable)(e,n,a);break;case"precise":(0,p.Precise)(e,n,a);break;case"blocksToDays":(0,p.BlocksToDays)(e,a);break;case"percentage":(0,p.Percentage)(e,a);break;case"arrayLength":(0,p.ArrayLength)(e,a);break;default:return void console.log("Ignoring unknown filter type")}}const d=function(e){var t=e.network,n=e.path,i=e.defaultValue,s=e.filter,p=void 0===s?void 0:s,c=(0,r.useState)(""),d=c[0],h=c[1];return t=t.toLowerCase(),(0,r.useEffect)((function(){void 0!==p?u(i.toString(),p,t,h):h(i.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var e=(0,o.Z)((0,a.Z)().mark((function e(){var o;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,l(t,n,h);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==p?u(o,p,t,h):h(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{r()}catch(s){console.log(s)}}}),[]),d}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,n,a){var o=void 0;if("polkadot"===n||"statemint"===n)o=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),a((e=Number.isInteger(e/t[n].precision)?e/t[n].precision+" "+t[n].symbol:(e/t[n].precision).toFixed(o)+" "+t[n].symbol).toString())},Precise:function(e,n,a){a(e=(e=parseFloat(e))/t[n].precision+" "+t[n].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},83433:(e,t,n)=>{"use strict";n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>p,metadata:()=>c,toc:()=>d});var a=n(87462),o=n(63366),r=(n(67294),n(3905)),i=n(47940),s=["components"],p={id:"learn-proxies",title:"Proxy Accounts",sidebar_label:"Proxy Accounts",description:"Proxy Accounts on Polkadot.",keywords:["proxy","proxies","proxy accounts","proxy types","staking proxy"],slug:"../learn-proxies"},l=void 0,c={unversionedId:"learn/learn-proxies",id:"learn/learn-proxies",title:"Proxy Accounts",description:"Proxy Accounts on Polkadot.",source:"@site/../docs/learn/learn-proxies.md",sourceDirName:"learn",slug:"/learn-proxies",permalink:"/docs/learn-proxies",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-proxies.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696928140,formattedLastUpdatedAt:"Oct 10, 2023",frontMatter:{id:"learn-proxies",title:"Proxy Accounts",sidebar_label:"Proxy Accounts",description:"Proxy Accounts on Polkadot.",keywords:["proxy","proxies","proxy accounts","proxy types","staking proxy"],slug:"../learn-proxies"},sidebar:"docs",previous:{title:"Multi-Signature Accounts",permalink:"/docs/learn-account-multisig"},next:{title:"Pure Proxy Accounts",permalink:"/docs/learn-proxies-pure"}},u={},d=[{value:"Why use a Proxy?",id:"why-use-a-proxy",level:2},{value:"Creating Proxy",id:"creating-proxy",level:2},{value:"Proxy Types",id:"proxy-types",level:2},{value:"Any Proxy",id:"any-proxy",level:3},{value:"Non-transfer Proxy",id:"non-transfer-proxy",level:3},{value:"Governance Proxy",id:"governance-proxy",level:3},{value:"Staking Proxy",id:"staking-proxy",level:3},{value:"Identity Judgement Proxy",id:"identity-judgement-proxy",level:3},{value:"Cancel Proxy",id:"cancel-proxy",level:3},{value:"Auction Proxy",id:"auction-proxy",level:3},{value:"Nomination Pools Proxy",id:"nomination-pools-proxy",level:3},{value:"Removing Proxy",id:"removing-proxy",level:2},{value:"How to view your Proxy",id:"how-to-view-your-proxy",level:2},{value:"Proxy Deposits",id:"proxy-deposits",level:2},{value:"Time-delayed Proxy",id:"time-delayed-proxy",level:2}],h={toc:d},y="wrapper";function m(e){var t=e.components,p=(0,o.Z)(e,s);return(0,r.kt)(y,(0,a.Z)({},h,p,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Proxies allow users to use an account (it can be in cold storage or a hot wallet) less frequently\nbut actively participate in the network with the weight of the tokens in that account. Proxies are\nallowed to perform a limited amount of actions related to specific\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/frame-pallets/"},"substrate pallets")," on behalf of another\naccount. The video below contains more information about using proxies."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=1tcygkq52tU"},(0,r.kt)("img",{parentName:"a",src:"https://img.youtube.com/vi/1tcygkq52tU/0.jpg",alt:"Proxy Accounts"}))),(0,r.kt)("h2",{id:"why-use-a-proxy"},"Why use a Proxy?"),(0,r.kt)("p",null,"Proxies are helpful because they let you delegate efficiently and add a layer of security. Rather\nthan using funds in a single account, smaller accounts with unique roles can complete tasks on\nbehalf of the main stash account. Proxies can be ",(0,r.kt)("em",{parentName:"p"},"hotter")," than the initial account, which can be\nkept cold, but the ",(0,r.kt)("em",{parentName:"p"},"weight")," of the tokens in the colder account can be used by the hotter accounts.\nThis increases the security of your accounts by minimizing the number of transactions the cold\naccount has to make. This also drives attention away from the stash account, although it is possible\nto determine the relationship between the proxy and the proxied account."),(0,r.kt)("p",null,"From the security perspective, we can imagine proxies as bodyguards of a VIP, loyal and ready to\nrisk their lives to ensure the VIP's protection. But proxies are also useful in other contexts such\nas efficient account management at the corporate level. They also provide an elegant solution to\nchange signatories within multi-signature accounts, and they can be used within proxy calls and\nnested proxy calls. In this page we will explore all these interesting use cases of proxies within\nthe Polkadot ecosystem."),(0,r.kt)("p",null,"Shown below is an example of how you might use these accounts. Imagine you have one stash account as\nyour primary token-holding account and don't want to access it very often, but you want to\nparticipate in staking to earn staking rewards. You could set one of your existing accounts as a\nstaking proxy for that stash account, and use your staking proxy to sign all staking-related\ntransactions."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"proxies",src:n(56789).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"Having a staking proxy will make the stash account isolated within the staking context. In other\nwords, the account assigned as a staking proxy can participate in staking on behalf of that stash.\nWithout the proxy you will need to sign all the staking-related transactions with the stash. If the\nproxy is compromised, it doesn't have access to transfer-related transactions, so the stash account\ncould just set a new proxy to replace it. You can also monitor proxies by\n",(0,r.kt)("a",{parentName:"p",href:"#time-delayed-proxy"},"setting a time-delay"),"."),(0,r.kt)("p",null,"Creating multiple proxy accounts that act for a single account, lets you come up with more granular\nsecurity practices around how you protect private keys while still being able to actively\nparticipate in the network."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The ",(0,r.kt)("strong",{parentName:"p"},"maximum number of proxies")," allowed for a single account is\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.proxy.maxProxies",defaultValue:32,mdxType:"RPC"}),".\n",""),(0,r.kt)("p",{parentName:"admonition"},"You can have the same proxy for multiple accounts.")),(0,r.kt)("h2",{id:"creating-proxy"},"Creating Proxy"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"To create a ",(0,r.kt)("strong",{parentName:"p"},"proxy account")," read\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182179-how-to-create-a-proxy-account"},"this support article"),".")),(0,r.kt)("h2",{id:"proxy-types"},"Proxy Types"),(0,r.kt)("p",null,"You can set up a proxy account via the proxy pallet. When you set a proxy, you must choose a type of\nproxy for the relationship. Polkadot offers:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#any-proxy"},"Any")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#non-transfer-proxy"},"Non-transfer")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#governance-proxy"},"Governance")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#staking-proxy"},"Staking")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#identity-judgement-proxy"},"Identity Judgement")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#cancel-proxy"},"Cancel")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#auction-proxy"},"Auction")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#nomination-pools-proxy"},"Nomination pool"))),(0,r.kt)("p",null,"When a proxy account makes a transaction,\nPolkadot filters the desired transaction to\nensure that the proxy account has the appropriate permission to make that transaction on behalf of\nthe cold account. For example, staking proxies have permission to do only staking-related\ntransactions."),(0,r.kt)("admonition",{title:"Know how to check the calls and pallets accessible by proxies",type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"For the latest information on the calls and pallets that can be fully accessed by proxies, check the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/blob/153543b0c8c582e73f520e5c08cbe33bddfb5f69/runtime/polkadot/src/lib.rs#L1158"},"source code in the runtime folder"),"\non the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk"},"Polkadot repository"))),(0,r.kt)("h3",{id:"any-proxy"},"Any Proxy"),(0,r.kt)("p",null,"As implied by the name, a proxy type of ",(0,r.kt)("strong",{parentName:"p"},"Any")," allows the proxy account to make any transaction,\nincluding balance transfers. In most cases, this should be avoided as the proxy account is used more\nfrequently than the cold account and is therefore less secure."),(0,r.kt)("h3",{id:"non-transfer-proxy"},"Non-transfer Proxy"),(0,r.kt)("p",null,"Proxies that are of the type ",(0,r.kt)("strong",{parentName:"p"},"Non-transfer")," are accounts that allow any type of transaction except\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-balance-transfers"},"balance transfers")," (including ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-DOT/#vesting"},"vested"),"\ntransfers). Hence, this proxy does not have permission to access calls in the Balances and XCM\npallet."),(0,r.kt)("h3",{id:"governance-proxy"},"Governance Proxy"),(0,r.kt)("p",null,"The ",(0,r.kt)("strong",{parentName:"p"},"Governance")," type will allow proxies to make transactions related to governance (i.e., from\nthe ",(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_democracy"},"Democracy"),",\n",(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_elections_phragmen/"},"Phragmen Election"),",\n",(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_treasury/"},"Treasury"),",\n",(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_bounties/"},"Bounties"),",\n",(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_tips/"},"Tips"),",\n",(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_utility/"},"Utility")," and\n",(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_child_bounties/"},"Child Bounties")," pallets)."),(0,r.kt)("admonition",{title:"Explainers on governance proxies",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-democracy#governance-proxies"},"Governance")," for more information\non governance proxies or watch our\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=q5qLFhG4SDw&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&index=27&ab_channel=Polkadot"},"technical explainer video that explores this concept"),".")),(0,r.kt)("h3",{id:"staking-proxy"},"Staking Proxy"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Visit the ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced/#staking-proxies"},"Advanced Staking Concepts page")," for more\ndetailed information about staking proxies.")),(0,r.kt)("p",null,"The ",(0,r.kt)("strong",{parentName:"p"},"Staking")," type allows all staking-related transactions. The stash account is meant to stay in\ncold storage, while the staking proxy account makes day-to-day transactions like setting session\nkeys or deciding which validators to nominate."),(0,r.kt)("p",null,"The staking proxy can fully access Staking, Session, Utility and Fast Unstake pallets."),(0,r.kt)("admonition",{title:"Do not use Staking proxy for participating in Nomination Pools",type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"Use a ",(0,r.kt)("a",{parentName:"p",href:"#non-transfer-proxy"},"non-transfer")," instead of a staking proxy to participate in nomination\npools. The staking proxy is not enabled to make successful calls to the nomination pools pallet.")),(0,r.kt)("h3",{id:"identity-judgement-proxy"},"Identity Judgement Proxy"),(0,r.kt)("p",null,"The ",(0,r.kt)("strong",{parentName:"p"},"Identity Judgement")," proxies are in charge of allowing registrars to make judgments on an\naccount's identity. If you are unfamiliar with judgment and identities on chain, please refer to\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-identity#judgements"},"this page"),". This proxy can only access ",(0,r.kt)("inlineCode",{parentName:"p"},"provide_judgement")," call from\nthe Identity pallet along with the calls from the Utility pallet."),(0,r.kt)("h3",{id:"cancel-proxy"},"Cancel Proxy"),(0,r.kt)("p",null,"Proxies that are of the type ",(0,r.kt)("strong",{parentName:"p"},"Cancel")," allow accounts to reject and remove any time-delay proxy\nannouncements. This proxy can only access ",(0,r.kt)("inlineCode",{parentName:"p"},"reject_announcement")," call from the Proxy pallet."),(0,r.kt)("h3",{id:"auction-proxy"},"Auction Proxy"),(0,r.kt)("p",null,"Proxies that are of the type ",(0,r.kt)("strong",{parentName:"p"},"Auction")," are accounts that allow transactions pertaining to\nparachain auctions and crowdloans. The Auction proxy account can sign those transactions on behalf\nof an account in cold storage. If you already set up a Non-transfer proxy account, it can do\neverything an Auction proxy can do. Before participating in a crowdloan using an Auction proxy, it\nis recommended that you check with the respective parachain team for any possible issues pertaining\nto the crowdloan rewards distribution. Auction proxy can access Auctions, Crowdloan, Registrar and\nSlots pallets."),(0,r.kt)("h3",{id:"nomination-pools-proxy"},"Nomination Pools Proxy"),(0,r.kt)("p",null,"Proxies that are of the type ",(0,r.kt)("strong",{parentName:"p"},"Nomination Pools")," are accounts that allow transactions pertaining to\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"Nomination Pools"),"."),(0,r.kt)("h2",{id:"removing-proxy"},"Removing Proxy"),(0,r.kt)("admonition",{title:"Removing proxies",type:"info"},(0,r.kt)("p",{parentName:"admonition"},'Read the section "Removing Proxies" on\n',(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182179-how-to-create-a-proxy-account"},"this support page"),"\nto learn how to remove proxies.")),(0,r.kt)("h2",{id:"how-to-view-your-proxy"},"How to view your Proxy"),(0,r.kt)("p",null,"To view your proxy, just go on the ",(0,r.kt)("em",{parentName:"p"},"Accounts")," menu in the Polkadot-JS UI, next to the proxied\naccount you will notice a blue icon. Hover on it, and you will see ",(0,r.kt)("em",{parentName:"p"},"Proxy overview"),". Click on it and\nyou will be presented with a list of all proxies for that account."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"polkadot_view_proxies",src:n(42273).Z,width:"1842",height:"120"})),(0,r.kt)("p",null,"Additionally, you can head over to the ",(0,r.kt)("em",{parentName:"p"},"Chain State")," tab (underneath the ",(0,r.kt)("em",{parentName:"p"},"Developer")," menu) on\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/chainstate"},"Polkadot-JS Apps"),". If\nyou've created your proxy on a Polkadot\naccount, it is required to change your network accordingly using the top left navigation button. On\nthis page, the proxy pallet should be selected, returning the announcements and proxies functions.\nThe proxies function will allow you to see your created proxies for either one account or for all\naccounts (using the toggle will enable this). Proxy announcements are what time lock proxies do to\nannounce they are going to conduct an action."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"polkadot_view_proxies_dev",src:n(28902).Z,width:"1871",height:"820"})),(0,r.kt)("h2",{id:"proxy-deposits"},"Proxy Deposits"),(0,r.kt)("p",null,"Proxies require deposits in the native currency (i.e. DOT or KSM) to be created. The deposit is\nrequired because adding a proxy requires some storage space on-chain, which must be replicated\nacross every peer in the network. Due to the costly nature of this, these functions could open up\nthe network to a Denial-of-Service attack. To defend against this attack, proxies require a deposit\nto be reserved while the storage space is consumed over the lifetime of the proxy. When the proxy is\nremoved, so is the storage space, and therefore the deposit is returned."),(0,r.kt)("p",null,"The required deposit amount for ",(0,r.kt)("inlineCode",{parentName:"p"},"n")," proxies is equal to:"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"ProxyDepositBase")," + ",(0,r.kt)("inlineCode",{parentName:"p"},"ProxyDepositFactor")," ","*"," ",(0,r.kt)("inlineCode",{parentName:"p"},"n")),(0,r.kt)("p",null,"where the ",(0,r.kt)("inlineCode",{parentName:"p"},"ProxyDepositBase")," is the required amount to be reserved for an account to have a proxy\nlist (creates one new item in storage). For every proxy the account has, an additional amount\ndefined by the ",(0,r.kt)("inlineCode",{parentName:"p"},"ProxyDepositFactor")," is reserved as well (appends 33 bytes to storage location). The\n",(0,r.kt)("inlineCode",{parentName:"p"},"ProxyDepositBase")," is\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.proxy.proxyDepositBase",defaultValue:20008e7,filter:"humanReadable",mdxType:"RPC"}),"\n","\nand the ",(0,r.kt)("inlineCode",{parentName:"p"},"ProxyDepositFactor")," is\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.proxy.proxyDepositFactor",defaultValue:33e7,filter:"humanReadable",mdxType:"RPC"}),".\n",""),(0,r.kt)("h2",{id:"time-delayed-proxy"},"Time-delayed Proxy"),(0,r.kt)("p",null,"We 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\nseconds of block time. A delay value of 10 will mean ten blocks, which equals about one minute\ndelay. The proxy will announce its intended action using the ",(0,r.kt)("inlineCode",{parentName:"p"},"proxy.announce")," extrinsic and will\nwait for the number of blocks defined in the delay time before executing it. The proxy will include\nthe hash of the intended function call in the announcement. Within this time window, the intended\naction may be canceled by accounts that control the proxy. This can be done by the proxy itself\nusing the ",(0,r.kt)("inlineCode",{parentName:"p"},"proxy.removeAnnouncement")," extrinsic or by the proxied account using the the\n",(0,r.kt)("inlineCode",{parentName:"p"},"proxy.rejectAnnouncement")," extrinsic. Now we can use proxies knowing that any malicious actions can\nbe noticed and reverted within a delay period. After the time-delay, the proxy can use the\n",(0,r.kt)("inlineCode",{parentName:"p"},"proxy.proxyAnnounced")," extrinsic to execute the announced call."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"https://youtu.be/3L7Vu2SX0PE"},"this video tutorial")," to learn how you can setup and use\ntime-delayed proxies. The video goes through the example below.")),(0,r.kt)("p",null,"Announcing ",(0,r.kt)("inlineCode",{parentName:"p"},"n")," calls using a time-delayed proxy also requires a deposit of the form:"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"announcementDepositBase")," + ",(0,r.kt)("inlineCode",{parentName:"p"},"announcementDepositFactor")," ","*"," ",(0,r.kt)("inlineCode",{parentName:"p"},"n")),(0,r.kt)("p",null,"where the ",(0,r.kt)("inlineCode",{parentName:"p"},"announcementDepositBase")," is the required amount to be reserved for an account to announce\na proxy call. For every proxy call the account has, an additional amount defined by the\n",(0,r.kt)("inlineCode",{parentName:"p"},"announcementDepositFactor")," is reserved as well. The ",(0,r.kt)("inlineCode",{parentName:"p"},"announcementDepositBase")," is\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.proxy.announcementDepositBase",defaultValue:20008e7,filter:"humanReadable",mdxType:"RPC"}),"\n","\nand the ",(0,r.kt)("inlineCode",{parentName:"p"},"announcementDepositFactor")," is\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.proxy.announcementDepositFactor",defaultValue:66e7,filter:"humanReadable",mdxType:"RPC"}),".\n",""),(0,r.kt)("p",null,"Let'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-JS UI, 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."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"time-delayed proxies",src:n(54481).Z,width:"1920",height:"800"})),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"If you try to use ",(0,r.kt)("inlineCode",{parentName:"p"},"proxy.proxyAnnounced"),' to execute the call within the time-delay window you will\nget an error "Proxy unannounced" since the announcement will be done after the time delay. Also note\nthat regular ',(0,r.kt)("inlineCode",{parentName:"p"},"proxy.proxy")," calls do not work with time-delayed proxies, you need to announce the\ncall first and then execute the announced call on a separate transaction.")))}m.isMDXComponent=!0},42273:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/polkadot_view_proxies-5c65a3f24dc6902f1734de8887dd5696.png"},28902:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/polkadot_view_proxies_dev-c7f33e592f2c37cade0cc3d37e356aef.png"},56789:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/stash-vs-stash-and-staking-proxy-2104e1a23d5c29821cec15fb9b67eba5.png"},54481:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/time-delayed-proxies-8b85523c3caac25b32d1d884af71c048.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/ab138bf8.db9dfbdf.js b/assets/js/ab138bf8.db9dfbdf.js new file mode 100644 index 000000000000..b9833da0ead0 --- /dev/null +++ b/assets/js/ab138bf8.db9dfbdf.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[8791],{47940:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var a=n(74165),o=n(15861),r=n(67294),i=n(87152),s=n(17145),l=n(67425);function p(e,t,n){return c.apply(this,arguments)}function c(){return(c=(0,o.Z)((0,a.Z)().mark((function e(t,n,o){var r,l,p,c,u;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){e.next=18;break}return e.abrupt("return");case 18:return p=new i.U(r),e.next=21,s.G.create({provider:p});case 21:c=e.sent,(u=n.split(".")).forEach((function(e){e in c&&(c=c[e])})),e.t1=u[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=c.toString(),e.abrupt("break",35);case 29:return e.next=31,c();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+n);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function u(e,t,n,a){switch(t){case"humanReadable":(0,l.HumanReadable)(e,n,a);break;case"precise":(0,l.Precise)(e,n,a);break;case"blocksToDays":(0,l.BlocksToDays)(e,a);break;case"percentage":(0,l.Percentage)(e,a);break;case"permillToPercent":(0,l.PermillToPercent)(e,a);break;case"arrayLength":(0,l.ArrayLength)(e,a);break;default:return void console.log("Ignoring unknown filter type")}}const d=function(e){var t=e.network,n=e.path,i=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,c=(0,r.useState)(""),d=c[0],h=c[1];return t=t.toLowerCase(),(0,r.useEffect)((function(){void 0!==l?u(i.toString(),l,t,h):h(i.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var e=(0,o.Z)((0,a.Z)().mark((function e(){var o;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p(t,n,h);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?u(o,l,t,h):h(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{r()}catch(s){console.log(s)}}}),[]),d}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,n,a){var o=void 0;if("polkadot"===n||"statemint"===n)o=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),a((e=Number.isInteger(e/t[n].precision)?e/t[n].precision+" "+t[n].symbol:(e/t[n].precision).toFixed(o)+" "+t[n].symbol).toString())},Precise:function(e,n,a){a(e=(e=parseFloat(e))/t[n].precision+" "+t[n].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},83433:(e,t,n)=>{"use strict";n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>p,default:()=>m,frontMatter:()=>l,metadata:()=>c,toc:()=>d});var a=n(87462),o=n(63366),r=(n(67294),n(3905)),i=n(47940),s=["components"],l={id:"learn-proxies",title:"Proxy Accounts",sidebar_label:"Proxy Accounts",description:"Proxy Accounts on Polkadot.",keywords:["proxy","proxies","proxy accounts","proxy types","staking proxy"],slug:"../learn-proxies"},p=void 0,c={unversionedId:"learn/learn-proxies",id:"learn/learn-proxies",title:"Proxy Accounts",description:"Proxy Accounts on Polkadot.",source:"@site/../docs/learn/learn-proxies.md",sourceDirName:"learn",slug:"/learn-proxies",permalink:"/docs/learn-proxies",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-proxies.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696928140,formattedLastUpdatedAt:"Oct 10, 2023",frontMatter:{id:"learn-proxies",title:"Proxy Accounts",sidebar_label:"Proxy Accounts",description:"Proxy Accounts on Polkadot.",keywords:["proxy","proxies","proxy accounts","proxy types","staking proxy"],slug:"../learn-proxies"},sidebar:"docs",previous:{title:"Multi-Signature Accounts",permalink:"/docs/learn-account-multisig"},next:{title:"Pure Proxy Accounts",permalink:"/docs/learn-proxies-pure"}},u={},d=[{value:"Why use a Proxy?",id:"why-use-a-proxy",level:2},{value:"Creating Proxy",id:"creating-proxy",level:2},{value:"Proxy Types",id:"proxy-types",level:2},{value:"Any Proxy",id:"any-proxy",level:3},{value:"Non-transfer Proxy",id:"non-transfer-proxy",level:3},{value:"Governance Proxy",id:"governance-proxy",level:3},{value:"Staking Proxy",id:"staking-proxy",level:3},{value:"Identity Judgement Proxy",id:"identity-judgement-proxy",level:3},{value:"Cancel Proxy",id:"cancel-proxy",level:3},{value:"Auction Proxy",id:"auction-proxy",level:3},{value:"Nomination Pools Proxy",id:"nomination-pools-proxy",level:3},{value:"Removing Proxy",id:"removing-proxy",level:2},{value:"How to view your Proxy",id:"how-to-view-your-proxy",level:2},{value:"Proxy Deposits",id:"proxy-deposits",level:2},{value:"Time-delayed Proxy",id:"time-delayed-proxy",level:2}],h={toc:d},y="wrapper";function m(e){var t=e.components,l=(0,o.Z)(e,s);return(0,r.kt)(y,(0,a.Z)({},h,l,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Proxies allow users to use an account (it can be in cold storage or a hot wallet) less frequently\nbut actively participate in the network with the weight of the tokens in that account. Proxies are\nallowed to perform a limited amount of actions related to specific\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/frame-pallets/"},"substrate pallets")," on behalf of another\naccount. The video below contains more information about using proxies."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=1tcygkq52tU"},(0,r.kt)("img",{parentName:"a",src:"https://img.youtube.com/vi/1tcygkq52tU/0.jpg",alt:"Proxy Accounts"}))),(0,r.kt)("h2",{id:"why-use-a-proxy"},"Why use a Proxy?"),(0,r.kt)("p",null,"Proxies are helpful because they let you delegate efficiently and add a layer of security. Rather\nthan using funds in a single account, smaller accounts with unique roles can complete tasks on\nbehalf of the main stash account. Proxies can be ",(0,r.kt)("em",{parentName:"p"},"hotter")," than the initial account, which can be\nkept cold, but the ",(0,r.kt)("em",{parentName:"p"},"weight")," of the tokens in the colder account can be used by the hotter accounts.\nThis increases the security of your accounts by minimizing the number of transactions the cold\naccount has to make. This also drives attention away from the stash account, although it is possible\nto determine the relationship between the proxy and the proxied account."),(0,r.kt)("p",null,"From the security perspective, we can imagine proxies as bodyguards of a VIP, loyal and ready to\nrisk their lives to ensure the VIP's protection. But proxies are also useful in other contexts such\nas efficient account management at the corporate level. They also provide an elegant solution to\nchange signatories within multi-signature accounts, and they can be used within proxy calls and\nnested proxy calls. In this page we will explore all these interesting use cases of proxies within\nthe Polkadot ecosystem."),(0,r.kt)("p",null,"Shown below is an example of how you might use these accounts. Imagine you have one stash account as\nyour primary token-holding account and don't want to access it very often, but you want to\nparticipate in staking to earn staking rewards. You could set one of your existing accounts as a\nstaking proxy for that stash account, and use your staking proxy to sign all staking-related\ntransactions."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"proxies",src:n(56789).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"Having a staking proxy will make the stash account isolated within the staking context. In other\nwords, the account assigned as a staking proxy can participate in staking on behalf of that stash.\nWithout the proxy you will need to sign all the staking-related transactions with the stash. If the\nproxy is compromised, it doesn't have access to transfer-related transactions, so the stash account\ncould just set a new proxy to replace it. You can also monitor proxies by\n",(0,r.kt)("a",{parentName:"p",href:"#time-delayed-proxy"},"setting a time-delay"),"."),(0,r.kt)("p",null,"Creating multiple proxy accounts that act for a single account, lets you come up with more granular\nsecurity practices around how you protect private keys while still being able to actively\nparticipate in the network."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The ",(0,r.kt)("strong",{parentName:"p"},"maximum number of proxies")," allowed for a single account is\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.proxy.maxProxies",defaultValue:32,mdxType:"RPC"}),".\n",""),(0,r.kt)("p",{parentName:"admonition"},"You can have the same proxy for multiple accounts.")),(0,r.kt)("h2",{id:"creating-proxy"},"Creating Proxy"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"To create a ",(0,r.kt)("strong",{parentName:"p"},"proxy account")," read\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182179-how-to-create-a-proxy-account"},"this support article"),".")),(0,r.kt)("h2",{id:"proxy-types"},"Proxy Types"),(0,r.kt)("p",null,"You can set up a proxy account via the proxy pallet. When you set a proxy, you must choose a type of\nproxy for the relationship. Polkadot offers:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#any-proxy"},"Any")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#non-transfer-proxy"},"Non-transfer")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#governance-proxy"},"Governance")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#staking-proxy"},"Staking")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#identity-judgement-proxy"},"Identity Judgement")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#cancel-proxy"},"Cancel")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#auction-proxy"},"Auction")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#nomination-pools-proxy"},"Nomination pool"))),(0,r.kt)("p",null,"When a proxy account makes a transaction,\nPolkadot filters the desired transaction to\nensure that the proxy account has the appropriate permission to make that transaction on behalf of\nthe cold account. For example, staking proxies have permission to do only staking-related\ntransactions."),(0,r.kt)("admonition",{title:"Know how to check the calls and pallets accessible by proxies",type:"tip"},(0,r.kt)("p",{parentName:"admonition"},"For the latest information on the calls and pallets that can be fully accessed by proxies, check the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/blob/153543b0c8c582e73f520e5c08cbe33bddfb5f69/runtime/polkadot/src/lib.rs#L1158"},"source code in the runtime folder"),"\non the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk"},"Polkadot repository"))),(0,r.kt)("h3",{id:"any-proxy"},"Any Proxy"),(0,r.kt)("p",null,"As implied by the name, a proxy type of ",(0,r.kt)("strong",{parentName:"p"},"Any")," allows the proxy account to make any transaction,\nincluding balance transfers. In most cases, this should be avoided as the proxy account is used more\nfrequently than the cold account and is therefore less secure."),(0,r.kt)("h3",{id:"non-transfer-proxy"},"Non-transfer Proxy"),(0,r.kt)("p",null,"Proxies that are of the type ",(0,r.kt)("strong",{parentName:"p"},"Non-transfer")," are accounts that allow any type of transaction except\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-balance-transfers"},"balance transfers")," (including ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-DOT/#vesting"},"vested"),"\ntransfers). Hence, this proxy does not have permission to access calls in the Balances and XCM\npallet."),(0,r.kt)("h3",{id:"governance-proxy"},"Governance Proxy"),(0,r.kt)("p",null,"The ",(0,r.kt)("strong",{parentName:"p"},"Governance")," type will allow proxies to make transactions related to governance (i.e., from\nthe ",(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_democracy"},"Democracy"),",\n",(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_elections_phragmen/"},"Phragmen Election"),",\n",(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_treasury/"},"Treasury"),",\n",(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_bounties/"},"Bounties"),",\n",(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_tips/"},"Tips"),",\n",(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_utility/"},"Utility")," and\n",(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_child_bounties/"},"Child Bounties")," pallets)."),(0,r.kt)("admonition",{title:"Explainers on governance proxies",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-democracy#governance-proxies"},"Governance")," for more information\non governance proxies or watch our\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=q5qLFhG4SDw&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&index=27&ab_channel=Polkadot"},"technical explainer video that explores this concept"),".")),(0,r.kt)("h3",{id:"staking-proxy"},"Staking Proxy"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Visit the ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced/#staking-proxies"},"Advanced Staking Concepts page")," for more\ndetailed information about staking proxies.")),(0,r.kt)("p",null,"The ",(0,r.kt)("strong",{parentName:"p"},"Staking")," type allows all staking-related transactions. The stash account is meant to stay in\ncold storage, while the staking proxy account makes day-to-day transactions like setting session\nkeys or deciding which validators to nominate."),(0,r.kt)("p",null,"The staking proxy can fully access Staking, Session, Utility and Fast Unstake pallets."),(0,r.kt)("admonition",{title:"Do not use Staking proxy for participating in Nomination Pools",type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"Use a ",(0,r.kt)("a",{parentName:"p",href:"#non-transfer-proxy"},"non-transfer")," instead of a staking proxy to participate in nomination\npools. The staking proxy is not enabled to make successful calls to the nomination pools pallet.")),(0,r.kt)("h3",{id:"identity-judgement-proxy"},"Identity Judgement Proxy"),(0,r.kt)("p",null,"The ",(0,r.kt)("strong",{parentName:"p"},"Identity Judgement")," proxies are in charge of allowing registrars to make judgments on an\naccount's identity. If you are unfamiliar with judgment and identities on chain, please refer to\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-identity#judgements"},"this page"),". This proxy can only access ",(0,r.kt)("inlineCode",{parentName:"p"},"provide_judgement")," call from\nthe Identity pallet along with the calls from the Utility pallet."),(0,r.kt)("h3",{id:"cancel-proxy"},"Cancel Proxy"),(0,r.kt)("p",null,"Proxies that are of the type ",(0,r.kt)("strong",{parentName:"p"},"Cancel")," allow accounts to reject and remove any time-delay proxy\nannouncements. This proxy can only access ",(0,r.kt)("inlineCode",{parentName:"p"},"reject_announcement")," call from the Proxy pallet."),(0,r.kt)("h3",{id:"auction-proxy"},"Auction Proxy"),(0,r.kt)("p",null,"Proxies that are of the type ",(0,r.kt)("strong",{parentName:"p"},"Auction")," are accounts that allow transactions pertaining to\nparachain auctions and crowdloans. The Auction proxy account can sign those transactions on behalf\nof an account in cold storage. If you already set up a Non-transfer proxy account, it can do\neverything an Auction proxy can do. Before participating in a crowdloan using an Auction proxy, it\nis recommended that you check with the respective parachain team for any possible issues pertaining\nto the crowdloan rewards distribution. Auction proxy can access Auctions, Crowdloan, Registrar and\nSlots pallets."),(0,r.kt)("h3",{id:"nomination-pools-proxy"},"Nomination Pools Proxy"),(0,r.kt)("p",null,"Proxies that are of the type ",(0,r.kt)("strong",{parentName:"p"},"Nomination Pools")," are accounts that allow transactions pertaining to\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"Nomination Pools"),"."),(0,r.kt)("h2",{id:"removing-proxy"},"Removing Proxy"),(0,r.kt)("admonition",{title:"Removing proxies",type:"info"},(0,r.kt)("p",{parentName:"admonition"},'Read the section "Removing Proxies" on\n',(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182179-how-to-create-a-proxy-account"},"this support page"),"\nto learn how to remove proxies.")),(0,r.kt)("h2",{id:"how-to-view-your-proxy"},"How to view your Proxy"),(0,r.kt)("p",null,"To view your proxy, just go on the ",(0,r.kt)("em",{parentName:"p"},"Accounts")," menu in the Polkadot-JS UI, next to the proxied\naccount you will notice a blue icon. Hover on it, and you will see ",(0,r.kt)("em",{parentName:"p"},"Proxy overview"),". Click on it and\nyou will be presented with a list of all proxies for that account."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"polkadot_view_proxies",src:n(42273).Z,width:"1842",height:"120"})),(0,r.kt)("p",null,"Additionally, you can head over to the ",(0,r.kt)("em",{parentName:"p"},"Chain State")," tab (underneath the ",(0,r.kt)("em",{parentName:"p"},"Developer")," menu) on\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/chainstate"},"Polkadot-JS Apps"),". If\nyou've created your proxy on a Polkadot\naccount, it is required to change your network accordingly using the top left navigation button. On\nthis page, the proxy pallet should be selected, returning the announcements and proxies functions.\nThe proxies function will allow you to see your created proxies for either one account or for all\naccounts (using the toggle will enable this). Proxy announcements are what time lock proxies do to\nannounce they are going to conduct an action."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"polkadot_view_proxies_dev",src:n(28902).Z,width:"1871",height:"820"})),(0,r.kt)("h2",{id:"proxy-deposits"},"Proxy Deposits"),(0,r.kt)("p",null,"Proxies require deposits in the native currency (i.e. DOT or KSM) to be created. The deposit is\nrequired because adding a proxy requires some storage space on-chain, which must be replicated\nacross every peer in the network. Due to the costly nature of this, these functions could open up\nthe network to a Denial-of-Service attack. To defend against this attack, proxies require a deposit\nto be reserved while the storage space is consumed over the lifetime of the proxy. When the proxy is\nremoved, so is the storage space, and therefore the deposit is returned."),(0,r.kt)("p",null,"The required deposit amount for ",(0,r.kt)("inlineCode",{parentName:"p"},"n")," proxies is equal to:"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"ProxyDepositBase")," + ",(0,r.kt)("inlineCode",{parentName:"p"},"ProxyDepositFactor")," ","*"," ",(0,r.kt)("inlineCode",{parentName:"p"},"n")),(0,r.kt)("p",null,"where the ",(0,r.kt)("inlineCode",{parentName:"p"},"ProxyDepositBase")," is the required amount to be reserved for an account to have a proxy\nlist (creates one new item in storage). For every proxy the account has, an additional amount\ndefined by the ",(0,r.kt)("inlineCode",{parentName:"p"},"ProxyDepositFactor")," is reserved as well (appends 33 bytes to storage location). The\n",(0,r.kt)("inlineCode",{parentName:"p"},"ProxyDepositBase")," is\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.proxy.proxyDepositBase",defaultValue:20008e7,filter:"humanReadable",mdxType:"RPC"}),"\n","\nand the ",(0,r.kt)("inlineCode",{parentName:"p"},"ProxyDepositFactor")," is\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.proxy.proxyDepositFactor",defaultValue:33e7,filter:"humanReadable",mdxType:"RPC"}),".\n",""),(0,r.kt)("h2",{id:"time-delayed-proxy"},"Time-delayed Proxy"),(0,r.kt)("p",null,"We 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\nseconds of block time. A delay value of 10 will mean ten blocks, which equals about one minute\ndelay. The proxy will announce its intended action using the ",(0,r.kt)("inlineCode",{parentName:"p"},"proxy.announce")," extrinsic and will\nwait for the number of blocks defined in the delay time before executing it. The proxy will include\nthe hash of the intended function call in the announcement. Within this time window, the intended\naction may be canceled by accounts that control the proxy. This can be done by the proxy itself\nusing the ",(0,r.kt)("inlineCode",{parentName:"p"},"proxy.removeAnnouncement")," extrinsic or by the proxied account using the the\n",(0,r.kt)("inlineCode",{parentName:"p"},"proxy.rejectAnnouncement")," extrinsic. Now we can use proxies knowing that any malicious actions can\nbe noticed and reverted within a delay period. After the time-delay, the proxy can use the\n",(0,r.kt)("inlineCode",{parentName:"p"},"proxy.proxyAnnounced")," extrinsic to execute the announced call."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"https://youtu.be/3L7Vu2SX0PE"},"this video tutorial")," to learn how you can setup and use\ntime-delayed proxies. The video goes through the example below.")),(0,r.kt)("p",null,"Announcing ",(0,r.kt)("inlineCode",{parentName:"p"},"n")," calls using a time-delayed proxy also requires a deposit of the form:"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"announcementDepositBase")," + ",(0,r.kt)("inlineCode",{parentName:"p"},"announcementDepositFactor")," ","*"," ",(0,r.kt)("inlineCode",{parentName:"p"},"n")),(0,r.kt)("p",null,"where the ",(0,r.kt)("inlineCode",{parentName:"p"},"announcementDepositBase")," is the required amount to be reserved for an account to announce\na proxy call. For every proxy call the account has, an additional amount defined by the\n",(0,r.kt)("inlineCode",{parentName:"p"},"announcementDepositFactor")," is reserved as well. The ",(0,r.kt)("inlineCode",{parentName:"p"},"announcementDepositBase")," is\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.proxy.announcementDepositBase",defaultValue:20008e7,filter:"humanReadable",mdxType:"RPC"}),"\n","\nand the ",(0,r.kt)("inlineCode",{parentName:"p"},"announcementDepositFactor")," is\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.proxy.announcementDepositFactor",defaultValue:66e7,filter:"humanReadable",mdxType:"RPC"}),".\n",""),(0,r.kt)("p",null,"Let'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-JS UI, 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."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"time-delayed proxies",src:n(54481).Z,width:"1920",height:"800"})),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"If you try to use ",(0,r.kt)("inlineCode",{parentName:"p"},"proxy.proxyAnnounced"),' to execute the call within the time-delay window you will\nget an error "Proxy unannounced" since the announcement will be done after the time delay. Also note\nthat regular ',(0,r.kt)("inlineCode",{parentName:"p"},"proxy.proxy")," calls do not work with time-delayed proxies, you need to announce the\ncall first and then execute the announced call on a separate transaction.")))}m.isMDXComponent=!0},42273:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/polkadot_view_proxies-5c65a3f24dc6902f1734de8887dd5696.png"},28902:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/polkadot_view_proxies_dev-c7f33e592f2c37cade0cc3d37e356aef.png"},56789:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/stash-vs-stash-and-staking-proxy-2104e1a23d5c29821cec15fb9b67eba5.png"},54481:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/time-delayed-proxies-8b85523c3caac25b32d1d884af71c048.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/ad762f86.5e00db32.js b/assets/js/ad762f86.5e00db32.js new file mode 100644 index 000000000000..63854ae5bb06 --- /dev/null +++ b/assets/js/ad762f86.5e00db32.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[7940],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>u});var n=a(74165),o=a(15861),r=a(67294),s=a(87152),i=a(17145),d=a(67425);function l(e,t,a){return c.apply(this,arguments)}function c(){return(c=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var r,d,l,c,p;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=void 0,d=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){e.next=18;break}return e.abrupt("return");case 18:return l=new s.U(r),e.next=21,i.G.create({provider:l});case 21:c=e.sent,(p=a.split(".")).forEach((function(e){e in c&&(c=c[e])})),e.t1=p[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return d=c.toString(),e.abrupt("break",35);case 29:return e.next=31,c();case 31:return d=(d=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+p[0]+") in "+a);case 35:return e.abrupt("return",d);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function p(e,t,a,n){switch(t){case"humanReadable":(0,d.HumanReadable)(e,a,n);break;case"precise":(0,d.Precise)(e,a,n);break;case"blocksToDays":(0,d.BlocksToDays)(e,n);break;case"percentage":(0,d.Percentage)(e,n);break;case"permillToPercent":(0,d.PermillToPercent)(e,n);break;case"arrayLength":(0,d.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(e){var t=e.network,a=e.path,s=e.defaultValue,i=e.filter,d=void 0===i?void 0:i,c=(0,r.useState)(""),u=c[0],m=c[1];return t=t.toLowerCase(),(0,r.useEffect)((function(){void 0!==d?p(s.toString(),d,t,m):m(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,l(t,a,m);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==d?p(o,d,t,m):m(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{r()}catch(i){console.log(i)}}}),[]),u}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},79569:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>k,frontMatter:()=>d,metadata:()=>c,toc:()=>u});var n=a(87462),o=a(63366),r=(a(67294),a(3905)),s=a(47940),i=["components"],d={id:"learn-account-advanced",title:"Polkadot Accounts In-Depth",sidebar_label:"Accounts",description:"Advanced Concepts about Polkadot's Accounts.",keywords:["account","polkadot account","polkadotjs","indices","identity","reaping","ENS","domain","ETH"],slug:"../learn-account-advanced"},l=void 0,c={unversionedId:"learn/learn-account-advanced",id:"learn/learn-account-advanced",title:"Polkadot Accounts In-Depth",description:"Advanced Concepts about Polkadot's Accounts.",source:"@site/../docs/learn/learn-account-advanced.md",sourceDirName:"learn",slug:"/learn-account-advanced",permalink:"/docs/learn-account-advanced",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-account-advanced.md",tags:[],version:"current",lastUpdatedBy:"omahs",lastUpdatedAt:1695203423,formattedLastUpdatedAt:"Sep 20, 2023",frontMatter:{id:"learn-account-advanced",title:"Polkadot Accounts In-Depth",sidebar_label:"Accounts",description:"Advanced Concepts about Polkadot's Accounts.",keywords:["account","polkadot account","polkadotjs","indices","identity","reaping","ENS","domain","ETH"],slug:"../learn-account-advanced"},sidebar:"docs",previous:{title:"Advanced",permalink:"/docs/learn-advanced-index"},next:{title:"Advanced Staking Concepts",permalink:"/docs/learn-staking-advanced"}},p={},u=[{value:"Address Format",id:"address-format",level:2},{value:"Derivation Paths",id:"derivation-paths",level:2},{value:"Soft vs. Hard Derivation",id:"soft-vs-hard-derivation",level:3},{value:"For the Curious: How Prefixes Work",id:"for-the-curious-how-prefixes-work",level:2},{value:"System Accounts",id:"system-accounts",level:2},{value:"Portability",id:"portability",level:2},{value:"Address Conversion Tools",id:"address-conversion-tools",level:2},{value:"How to Verify a Public Key's Associated Address",id:"how-to-verify-a-public-keys-associated-address",level:3},{value:"Using Subkey to Retrieve Public Key from SS58 Address",id:"using-subkey-to-retrieve-public-key-from-ss58-address",level:4},{value:"Address Verification",id:"address-verification",level:4},{value:"Consider the following example:",id:"consider-the-following-example",level:5},{value:"Indices",id:"indices",level:2},{value:"Using ENS with DOT/KSM accounts",id:"using-ens-with-dotksm-accounts",level:2},{value:"Adding via the UI",id:"adding-via-the-ui",level:3},{value:"Wallet Support",id:"wallet-support",level:3},{value:"Relevant links",id:"relevant-links",level:3},{value:"Transferring Polkadot-JS Apps Accounts/Addresses From One Computer to Another",id:"transferring-polkadot-js-apps-accountsaddresses-from-one-computer-to-another",level:2}],m={toc:u},h="wrapper";function k(e){var t=e.components,d=(0,o.Z)(e,i);return(0,r.kt)(h,(0,n.Z)({},m,d,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"address-format"},"Address Format"),(0,r.kt)("p",null,"The 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 ",(0,r.kt)("em",{parentName:"p"},"address type")," prefix that\nidentifies an address belonging to a specific network."),(0,r.kt)("p",null,"For example:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Polkadot addresses ",(0,r.kt)("strong",{parentName:"li"},"always start with")," the number ",(0,r.kt)("strong",{parentName:"li"},"1"),"."),(0,r.kt)("li",{parentName:"ul"},"Kusama addresses always start with a capital letter, such as ",(0,r.kt)("strong",{parentName:"li"},"C, D, F, G, H, J"),"."),(0,r.kt)("li",{parentName:"ul"},"Generic Substrate addresses ",(0,r.kt)("strong",{parentName:"li"},"always start with")," the number ",(0,r.kt)("strong",{parentName:"li"},"5"),".")),(0,r.kt)("p",null,"These prefixes, including how to validate addresses, are embedded in the Substrate SS58 format.\nNever use regular expressions for address validation."),(0,r.kt)("p",null,"It's important to understand that different network formats are ",(0,r.kt)("strong",{parentName:"p"},"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."),(0,r.kt)("p",null,"As of Runtime 28, the default ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-accounts##address-format"},"address format")," is the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/master/primitives/runtime/src/multiaddress.rs"},(0,r.kt)("inlineCode",{parentName:"a"},"MultiAddress")),"\ntype."),(0,r.kt)("p",null,"This ",(0,r.kt)("inlineCode",{parentName:"p"},"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 ",(0,r.kt)("strong",{parentName:"p"},"20\nbyte"),", ",(0,r.kt)("strong",{parentName:"p"},"32 byte"),", and ",(0,r.kt)("strong",{parentName:"p"},"arbitrary raw byte")," variants. It also enhances the original\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-accounts#indices"},(0,r.kt)("inlineCode",{parentName:"a"},"indices"))," lookup."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Many wallets allow you to convert between formats. Stand-alone tools exist as well; you can find\nthem in the ",(0,r.kt)("a",{parentName:"p",href:"#address-conversion-tools"},"address conversion tools")," section.")),(0,r.kt)("h2",{id:"derivation-paths"},"Derivation Paths"),(0,r.kt)("p",null,"If 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. Many\nPolkadot key generation tools support hard and\nsoft derivation. For instance, if you intend to create an account to be used on the\nPolkadot chain, you can derive a ",(0,r.kt)("strong",{parentName:"p"},"hard key"),"\nchild account using ",(0,r.kt)("strong",{parentName:"p"},"//")," after the mnemonic phrase."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"'caution juice atom organ advance problem want pledge someone senior holiday very//0'\n")),(0,r.kt)("p",null,"and a ",(0,r.kt)("strong",{parentName:"p"},"soft key")," child account using ",(0,r.kt)("strong",{parentName:"p"},"/")," after the mnemonic phrase"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"'caution juice atom organ advance problem want pledge someone senior holiday very/0'\n")),(0,r.kt)("p",null,"If 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, ",(0,r.kt)("inlineCode",{parentName:"p"},"/1"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"/2"),", and ",(0,r.kt)("inlineCode",{parentName:"p"},"/3")," will create different\nderived accounts."),(0,r.kt)("p",null,"You 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, ",(0,r.kt)("inlineCode",{parentName:"p"},"//bill//account//1")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"//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."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"It is only possible to generate a derived account by knowing the derivation path.")),(0,r.kt)("p",null,"There is an additional type of derivation called password derivation. On Polkadot you can derive a\n",(0,r.kt)("strong",{parentName:"p"},"password key")," account using ",(0,r.kt)("strong",{parentName:"p"},"///")," after the mnemonic phrase"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"'caution juice atom organ advance problem want pledge someone senior holiday very///0'\n")),(0,r.kt)("p",null,"In 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 ",(0,r.kt)("inlineCode",{parentName:"p"},"written derivation path")," and a ",(0,r.kt)("inlineCode",{parentName:"p"},"password"),", we can calculate the ",(0,r.kt)("inlineCode",{parentName:"p"},"real derivation path")," as\n",(0,r.kt)("inlineCode",{parentName:"p"},"f(written derivation path, password)"),", where ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," is a function. We can then calculate the\n",(0,r.kt)("inlineCode",{parentName:"p"},"account key pair")," using ",(0,r.kt)("inlineCode",{parentName:"p"},"f(seed, real derivation path)"),". Unlike hard and soft derivations that can\nbe mixed, only a single password should be specified per derivation."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Password-derived account are as secure as the chosen password.")),(0,r.kt)("h3",{id:"soft-vs-hard-derivation"},"Soft vs. Hard Derivation"),(0,r.kt)("p",null,"A soft derivation allows someone to potentially \"go backward\u201d 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."),(0,r.kt)("p",null,"See the ",(0,r.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/command-line-tools/subkey/"},"Subkey documentation")," 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."),(0,r.kt)("p",null,"Some 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. ",(0,r.kt)("inlineCode",{parentName:"p"},"//polkadot")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"//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."),(0,r.kt)("p",null,"Polkadot and Kusama both have paths registered in the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/satoshilabs/slips/blob/master/slip-0044.md"},"BIP44 registry"),"."),(0,r.kt)("admonition",{type:"warning"},(0,r.kt)("p",{parentName:"admonition"},"You must have the ",(0,r.kt)("em",{parentName:"p"},"parent")," private key and the derivation path to arrive at the key for an address.\nOnly use custom derivation paths if you are comfortable with your knowledge of this topic.")),(0,r.kt)("h2",{id:"for-the-curious-how-prefixes-work"},"For the Curious: How Prefixes Work"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/ss58-registry/blob/main/ss58-registry.json"},"SS58 registry")," states\nthat:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Polkadot has an address type of ",(0,r.kt)("inlineCode",{parentName:"li"},"00000000b")," (",(0,r.kt)("inlineCode",{parentName:"li"},"0")," in decimal)."),(0,r.kt)("li",{parentName:"ul"},"Kusama (Polkadot Canary) has an address type of ",(0,r.kt)("inlineCode",{parentName:"li"},"00000010b")," (",(0,r.kt)("inlineCode",{parentName:"li"},"2")," in decimal)."),(0,r.kt)("li",{parentName:"ul"},"Generic Substrate has ",(0,r.kt)("inlineCode",{parentName:"li"},"00101010b")," as the address type (",(0,r.kt)("inlineCode",{parentName:"li"},"42")," in decimal).")),(0,r.kt)("p",null,"Because the ",(0,r.kt)("inlineCode",{parentName:"p"},"Base58-check")," alphabet has no number 0, the lowest value is indeed 1. So ",(0,r.kt)("inlineCode",{parentName:"p"},"00000000b")," is\n1 in Base58-check. If we try to\n",(0,r.kt)("a",{parentName:"p",href:"https://www.better-converter.com/Encoders-Decoders/Base58Check-to-Hexadecimal-Decoder"},"decode")," a\nPolkadot address like ",(0,r.kt)("inlineCode",{parentName:"p"},"1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg"),", the result is\n",(0,r.kt)("inlineCode",{parentName:"p"},"000aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b29d7"),". The first byte is ",(0,r.kt)("inlineCode",{parentName:"p"},"00"),",\nwhich is indeed ",(0,r.kt)("inlineCode",{parentName:"p"},"00000000")," in binary and ",(0,r.kt)("inlineCode",{parentName:"p"},"0")," in decimal and thus matches the address type of\nPolkadot."),(0,r.kt)("p",null,"Let's take a look at Substrate addresses. If we decode\n",(0,r.kt)("inlineCode",{parentName:"p"},"5CK8D1sKNwF473wbuBP6NuhQfPaWUetNsWUNAAzVwTfxqjfr"),", we get\n",(0,r.kt)("inlineCode",{parentName:"p"},"2a0aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b77e5"),". The first byte is ",(0,r.kt)("inlineCode",{parentName:"p"},"2a"),"\nwhich when\n",(0,r.kt)("a",{parentName:"p",href:"https://www.rapidtables.com/convert/number/hex-to-decimal.html"},"converted from hex to decimal"),"\nis 42. 42 is ",(0,r.kt)("inlineCode",{parentName:"p"},"00101010")," in binary, just as the SS58 document states."),(0,r.kt)("p",null,"Finally, let's look at Kusama addresses. Decoding ",(0,r.kt)("inlineCode",{parentName:"p"},"CpjsLDC1JFyrhm3ftC9Gs4QoyrkHKhZKtK7YqGTRFtTafgp"),"\ngives us ",(0,r.kt)("inlineCode",{parentName:"p"},"020aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b0985")," with the first\nbyte being ",(0,r.kt)("inlineCode",{parentName:"p"},"02"),", just as specified. If we try a Kusama address that starts with a completely\ndifferent letter, like ",(0,r.kt)("inlineCode",{parentName:"p"},"J4iggBtsWsb61RemU2TDWDXTNHqHNfBSAkGvVZBtn1AJV1a"),", we still get ",(0,r.kt)("inlineCode",{parentName:"p"},"02")," as the\nfirst byte: ",(0,r.kt)("inlineCode",{parentName:"p"},"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."),(0,r.kt)("h2",{id:"system-accounts"},"System Accounts"),(0,r.kt)("p",null,"As 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",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-extrinsics"},"extrinsic")," since they do not have a private key."),(0,r.kt)("admonition",{title:"Explore System Accounts",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Treasury account address -\n",(0,r.kt)("inlineCode",{parentName:"p"},"13UVJyLnbVp9RBZYFwFGyDvVd1y27Tt8tkntv6Q7JVPhFsTB"),"",""),(0,r.kt)("p",{parentName:"admonition"},"You can view the existing system accounts on\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.subscan.io/account_list?role=module"},"Subscan"),".")),(0,r.kt)("p",null,'Let 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',(0,r.kt)("inlineCode",{parentName:"p"},"AccountID"),". For more information, check the post on Substrate StackExchange on\n",(0,r.kt)("a",{parentName:"p",href:"https://substrate.stackexchange.com/questions/536/how-do-treasury-accounts-compare-to-end-user-accounts-in-frame"},"Treasury accounts"),'.\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 ',(0,r.kt)("inlineCode",{parentName:"p"},"AccountID"),". Similar logic applies to\nnomination pool and parachain accounts as well."),(0,r.kt)("h2",{id:"portability"},"Portability"),(0,r.kt)("p",null,"The above information brings us to portability: the ability to use a mnemonic phrase or seed across\nmultiple wallets. Portability depends on several factors:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Derivation path"),(0,r.kt)("li",{parentName:"ul"},"Mnemonic format"),(0,r.kt)("li",{parentName:"ul"},"Seed derivation"),(0,r.kt)("li",{parentName:"ul"},"Signature scheme")),(0,r.kt)("p",null,"To 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."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"left"}),(0,r.kt)("th",{parentName:"tr",align:"center"},"Mnemonic Format"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Derivation Path"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Seed Derivation"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Signature Support"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Polkadot{.js} Extension"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Standard"),(0,r.kt)("td",{parentName:"tr",align:"center"},"User-Defined"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP32"),(0,r.kt)("td",{parentName:"tr",align:"center"},"sr25519")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Polkadot-JS Apps"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Standard","*"),(0,r.kt)("td",{parentName:"tr",align:"center"},"User-Defined"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP32"),(0,r.kt)("td",{parentName:"tr",align:"center"},"sr25519, ed25519, secp256k")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Ledger"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP39"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP44","\u2020"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP32","\u2021"),(0,r.kt)("td",{parentName:"tr",align:"center"},"ed25519","\xa7")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Subkey"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Standard","*"),(0,r.kt)("td",{parentName:"tr",align:"center"},"User-Defined"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP32"),(0,r.kt)("td",{parentName:"tr",align:"center"},"sr25519, ed25519, secp256k1")))),(0,r.kt)("p",null,"*"," Ed25519 keys have ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate-bip39"},"limited compatibility")," with\nBIP39."),(0,r.kt)("p",null,"\u2020"," ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/satoshilabs/slips/blob/master/slip-0044.md"},"BIP44 Registry")),(0,r.kt)("p",null,"\u2021"," Ed25519 and BIP32 based on\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/LedgerHQ/orakolo/blob/master/papers/Ed25519_BIP%20Final.pdf"},"Khovratovich")),(0,r.kt)("p",null,"\xa7"," Sr25519 planned"),(0,r.kt)("h2",{id:"address-conversion-tools"},"Address Conversion Tools"),(0,r.kt)("p",null,"You can use the tools below to convert any SS58 address for any network for use on different\nnetworks"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot.subscan.io/tools/ss58_transform"},"handy subscan tool")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot-address-convertor.netlify.app/"},"simple address converter"))),(0,r.kt)("h3",{id:"how-to-verify-a-public-keys-associated-address"},"How to Verify a Public Key's Associated Address"),(0,r.kt)("p",null,"You can verify your public key's associated address through a series of inspection steps, where the\nkey is a base-16 (hexadecimal) address."),(0,r.kt)("h4",{id:"using-subkey-to-retrieve-public-key-from-ss58-address"},"Using Subkey to Retrieve Public Key from SS58 Address"),(0,r.kt)("p",null,"This is to showcase that the ",(0,r.kt)("strong",{parentName:"p"},'SS58 address is based on the public key (aka "Account ID")')),(0,r.kt)("p",null,"The Subkey Tool's The\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/command-line-tools/subkey/#inspecting-keys"},"Inspecting Keys"),"\nsection explains how to use the ",(0,r.kt)("inlineCode",{parentName:"p"},"inspect")," command to recalculate your key pair's public key and\naddress."),(0,r.kt)("p",null,"Start by inspecting your account's Polkadot address by running the inspect command against your\naccount's address:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ 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")),(0,r.kt)("p",null,'Take note of the hexadecimal string for "Public key (hex)". This is your account\'s public key.'),(0,r.kt)("p",null,"Running the ",(0,r.kt)("inlineCode",{parentName:"p"},"inspect")," command on your public key along with the ",(0,r.kt)("inlineCode",{parentName:"p"},"--public")," parameter the SS58\naddress for the default network (substrate) is returned."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ 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")),(0,r.kt)("p",null,"Using the ",(0,r.kt)("inlineCode",{parentName:"p"},"--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 ",(0,r.kt)("inlineCode",{parentName:"p"},"inspect")," command with\n",(0,r.kt)("inlineCode",{parentName:"p"},"--network polkadot")," return your original Polkadot address, thus verifying the public key."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ 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")),(0,r.kt)("p",null,"You 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",(0,r.kt)("strong",{parentName:"p"},'"0x"'),"). ",(0,r.kt)("strong",{parentName:"p"},"For both SS58 addresses, the same public key is returned.")),(0,r.kt)("h4",{id:"address-verification"},"Address Verification"),(0,r.kt)("h5",{id:"consider-the-following-example"},"Consider the following example:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"19",src:a(2080).Z,width:"739",height:"543"})),(0,r.kt)("p",null,"If you are comfortable enough to distinguish between each account parameter, you can prefix the\npublic-key string with ",(0,r.kt)("strong",{parentName:"p"},'"0x"')," on your own:"),(0,r.kt)("p",null,"From:\n",(0,r.kt)("inlineCode",{parentName:"p"},"Pay DOTs to the Polkadot account:192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce"),',\nwe prefix the address by "0x" ->\n',(0,r.kt)("inlineCode",{parentName:"p"},"0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce"),"."),(0,r.kt)("p",null,"Using the ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.subscan.io/tools/ss58_transform"},"handy subscan tool"),', 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.'),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"20",src:a(81779).Z,width:"1505",height:"759"})),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"You may have to scroll down to the bottom of the menu to find the Substrate address based on the\nmenu listings. You will notice that many networks that also use the same Substrate address.")),(0,r.kt)("p",null,"You 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 ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-accounts#address-format"},"Addresses")," for more details."),(0,r.kt)("p",null,"Furthermore, the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/w3f/utility-scripts"},"Utility Scripts")," can be referenced for how\nthe verification is performed:\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/w3f/utility-scripts/blob/master/src/misc/pubkeyToAddress.js"},"pubkeyToAddress.js"),"\ndemonstrates how a single public key interprets a Polkadot, Substrate, or Kusama address."),(0,r.kt)("h2",{id:"indices"},"Indices"),(0,r.kt)("p",null,"Polkadot addresses can have indices. An index\nis like a short and easy-to-remember version of an address. Claiming an index requires a deposit of\n",(0,r.kt)(s.Z,{network:"polkadot",path:"consts.indices.deposit",defaultValue:1e11,filter:"humanReadable",mdxType:"RPC"}),"","\nthat is released when the index is cleared. Any index can be claimed if it is not taken by someone\nelse."),(0,r.kt)("p",null,"But 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 ",(0,r.kt)("em",{parentName:"p"},"freeze"),"\nan index and permanently assign it to an address. ",(0,r.kt)("strong",{parentName:"p"},"This action consumes a deposit, and the index\nwill be permanently bound to the address with no option to release it.")),(0,r.kt)("admonition",{title:"Lookup Account Index on-chain",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"When someone shares their account index, their actual account address on-chain can be looked up\nthrough Polkadot-JS Apps UI > Developer > Chain state > Storage and selecting state query on indices\npallet for the account corresponding to the index.")),(0,r.kt)("p",null,"Here is an example snapshot that shows how to lookup the corresponding account address of the\naccount index 1988 on\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-networks#westend-test-network"},"Westend network (Polkadot Test Network)"),",\nusing Polkadot-JS Apps UI. The output shows the account address, deposit amount, and a boolean flag\nindicating whether this is claimed permanently."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"query account index",src:a(65610).Z,width:"2012",height:"998"})),(0,r.kt)("p",null,"Submit a ",(0,r.kt)("inlineCode",{parentName:"p"},"claim")," extrinsic to the ",(0,r.kt)("inlineCode",{parentName:"p"},"indices")," pallet to register an index. The easiest way to do this\nis via Polkadot-JS UI through the ",(0,r.kt)("em",{parentName:"p"},"Developer -> Extrinsics")," menu:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Indices extrinsics",src:a(38872).Z,width:"786",height:"386"})),(0,r.kt)("p",null,"To find available indices to claim on Polkadot or Kusama,\n",(0,r.kt)("a",{parentName:"p",href:"https://www.shawntabrizi.com/substrate-js-utilities/indices/"},"this helper tool may come in handy"),"."),(0,r.kt)("p",null,"For keeping the index permanently, you can follow up with a ",(0,r.kt)("inlineCode",{parentName:"p"},"freeze")," extrinsic as mentioned above."),(0,r.kt)("h2",{id:"using-ens-with-dotksm-accounts"},"Using ENS with DOT/KSM accounts"),(0,r.kt)("p",null,"ENS (Ethereum Name Service) is a distributed and open system of smart contracts on the Ethereum\nblockchain which allows users to claim domain names like ",(0,r.kt)("inlineCode",{parentName:"p"},"bruno.eth"),"."),(0,r.kt)("p",null,"The 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."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"You will need an ENS name and an Ethereum account with some ether to follow along with this guide.\nTo register an ENS name, visit the ",(0,r.kt)("a",{parentName:"p",href:"https://app.ens.domains"},"ENS App")," or any number of subdomain\nregistrars like ",(0,r.kt)("a",{parentName:"p",href:"https://nameth.io"},"Nameth"),". Note that if you're using an older ENS name, you should\nmake sure you're using the\n",(0,r.kt)("a",{parentName:"p",href:"https://medium.com/the-ethereum-name-service/ens-registry-migration-is-over-now-what-a-few-things-to-know-fb05f921872a"},"new resolver"),".\nVisiting the ENS App will warn you about this. You will also need some way to use your Ethereum\naddress - following this guide on a personal computer is recommended. Wallets like\n",(0,r.kt)("a",{parentName:"p",href:"https://frame.sh/"},"Frame")," and ",(0,r.kt)("a",{parentName:"p",href:"https://metamask.io"},"Metamask")," are safe and will make interacting\nwith the Ethereum blockchain through your browser very easy.")),(0,r.kt)("p",null,"Despite 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."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"DOT can currently only be added using the Resolver method. KSM can be added through both methods are\ndescribed below.")),(0,r.kt)("p",null,"This guide is also available in video format ",(0,r.kt)("a",{parentName:"p",href:"https://youtu.be/XKjZk-5_mQc"},"on YouTube"),"."),(0,r.kt)("h3",{id:"adding-via-the-ui"},"Adding via the UI"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://app.ens.domains"},"ENS App")," allows an ENS domain owner to inspect all records bound to\nthe domain, and to add new ones."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"bruno.eth domain name in the ENS application",src:a(51804).Z,width:"977",height:"842"})),(0,r.kt)("p",null,"In the example above, the domain ",(0,r.kt)("inlineCode",{parentName:"p"},"bruno.eth")," has an Ethereum and a Bitcoin address attached. Let's\nattach a KSM account. First, click the ",(0,r.kt)("inlineCode",{parentName:"p"},"[+]")," icon in the Records tab."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"The plus icon in the records tab",src:a(27038).Z,width:"951",height:"190"})),(0,r.kt)("p",null,'Then, pick "Other Addresses", "KSM", and input the Kusama address:'),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Inputs needed to register a KSM address",src:a(95860).Z,width:"914",height:"224"})),(0,r.kt)("p",null,"After clicking Save, your Ethereum wallet will ask you to confirm a transaction. Once processed, the\nrecord will show up on the domain's page:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"KSM address now visible in bruno.eth records",src:a(91581).Z,width:"936",height:"367"})),(0,r.kt)("p",null,"The exact process applies to adding your DOT address."),(0,r.kt)("p",null,"Once the transaction is confirmed, your address will be bound to your ENS domain."),(0,r.kt)("h3",{id:"wallet-support"},"Wallet Support"),(0,r.kt)("p",null,"There is no wallet support for ENS names for either KSM or DOT at this time, but the crypto\naccounting and portfolio application ",(0,r.kt)("a",{parentName:"p",href:"https://rotki.com/"},"Rotki")," does support KSM ENS resolution."),(0,r.kt)("h3",{id:"relevant-links"},"Relevant links"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.ens.domains/"},"ENS docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://medium.com/the-ethereum-name-service/ens-launches-multi-coin-support-15-wallets-to-integrate-92518ab20599"},"ENS Multi-chain announcement")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/ensdomains/address-encoder"},"Address encoder")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://swolfeyes.github.io/ethereum-namehash-calculator/"},"Namehash calculator")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.shawntabrizi.com/substrate-js-utilities/"},"Address to pubkey converter"))),(0,r.kt)("h2",{id:"transferring-polkadot-js-apps-accountsaddresses-from-one-computer-to-another"},"Transferring Polkadot-JS Apps Accounts/Addresses From One Computer to Another"),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"This will overwrite existing accounts with the same pubkey on your new computer. This generally\nshould not make a difference (since it can still access the same account), but it might if you have\ne.g. an account that was stored externally in the extension on the old computer but was created\ndirectly in the browser on the new one.")),(0,r.kt)("p",null,"This has been tested on Brave and Chrome, but not other browsers."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Go to Polkadot-JS Apps"),(0,r.kt)("li",{parentName:"ol"},"Go to JavaScript console on the browser (Available in Developer Tools)"),(0,r.kt)("li",{parentName:"ol"},"Type in the command:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"JSON.stringify(localStorage)\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"Copy and paste the returned string to a text editor and save the file."),(0,r.kt)("li",{parentName:"ol"},"Check that the string you pasted begins and ends with a tick mark ('). If not, add one to the\nbeginning and end."),(0,r.kt)("li",{parentName:"ol"},"Save and send that file with the copied string to the new computer."),(0,r.kt)("li",{parentName:"ol"},"On the new computer, go to Polkadot-JS Apps"),(0,r.kt)("li",{parentName:"ol"},"Open the Javascript console on the browser (Available in Developer Tools)"),(0,r.kt)("li",{parentName:"ol"},"Set a variable raw equal to the string from the text file")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"raw = ... copy-pasted json from original computer ...\n")),(0,r.kt)("ol",{start:10},(0,r.kt)("li",{parentName:"ol"},"Run the following code on the console:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"accounts = 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")),(0,r.kt)("ol",{start:11},(0,r.kt)("li",{parentName:"ol"},"Refresh Polkadot-JS App browser and check the Accounts and Addresses pages. All of your accounts\nand addresses should now be available.")))}k.isMDXComponent=!0},38872:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/index-a2000a16d514f2136b303dd1d29a17f4.png"},2080:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/pubkey-1-6dc18c2b04022519cc6dd0fb3af36f94.png"},81779:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/pubkey-2-16f0cbc7db6ab6eb8248a05df94adc35.png"},65610:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/query-index-6db697cbe5e058388b830fee34bc4415.png"},51804:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/01-min-dd1b37ae350384f3941bf8f446ec0994.png"},27038:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA7cAAAC+CAMAAADZXQhkAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJSUExURfD2+u70+OYbG/3+/tPT01KE/+/2+v///1OE/u3t7fTx/+/2/9Gm/627zbeU/+j//3m6/1Kl/7Xm/06Osvz8/NTh/6iwEOq6///4/3mF///n/wAAAPb29nCG//X////9/1KT/9L////x/2SF///O/8We/6DV/1iQ/1iE//Ly8pHK/1eL/9L1/nC1/pvP/5uE/8T0/12J/1WX//r6+vfG/6+R/9r//1KM/4GG/3Gc/7rZ/p6M/8aCAIceRWKq/4+F/+///+O0/1eH/1OQqf/e/6y/1v/V/9G2/6OtGv/8x2CW/9mt/wAFgaXi/4yKjeH0/+ioWN67/wEEJoXC/+/k3vTS/83q/1Og//To/wAAUGWd/+PR/8b//4mN/5i1/7Gd/4IFAPTg/6CX/9/p/7TN/5/J/+uPkbmk///k/4Oo/+yUllGGqqjB/9/G/8Dr/+g2NpOP/73J1//jpuzH/1yq/7O8zu/X2c7+/3Sp/7HL4enx/5C6/8Op/9/S0ePr7sLd/unc/4Wz/8zX4u7KzbnV7RsAAKza//P03+laXF0JAOlNTn6+/djy/gVQoMvHz///6gYgTACCxtvh5+69wFGj47y8zW1RLQAzimyKjP//9/vBe4WxyYg1AEIAALq0//rR/xRKbS4bAGGOs1OE/QZvuIhtT6FUCTGNzr/CzpPE7tCPOtLs9YyKfERkeFYwEK9jAKvW9Wd3fj1EQr13GLeIYRs7XsHIWtTZle3p0N+4kFPB/2GVxidYhppddzmFzBiFzLC4KYyUvnOizr11ALVxGBgAGEKYpuAAACAcSURBVHja7Z2JW1RHusZh2vZgp20W6dAszdFusRFZFWTLVUDAIIkoBNcRRHGUERTBGDWJ27iM0WhitlGTGDOTZJJMksmdbLPeWe79v259X9VZaVS2BvR9n0cpTp9zquqc+tW3VAFJGgRB80fJyQsXJicl4UFAELiFIAjcQhAEbiEI3EIQBG4hCAK3EARuIQgCtxAEgVsImh4FBwdqK1JmTBW1A4NBcAtB0wltzwwia4O3JwhuIWiaqB1gqn47s9DK2w8EwS0ETYN6UlK8KQmSqKgH3ELQVLW/NiXBqt0PbiFoKvIEKxKNbcpvK4LgFoKmEtom0Ee2+cpBcAtBk3eSE29tZWJ5P7iFoMmqNvHWVlrcWnALQZNUT8psqakH3ELQZIPb2VPwCePW4/FkZq5Zc6bl7sdLlnx8t+VMXt4aocxMDwmDEXpkDcwmtwNPHLcC2yt3l5i6+xOTK8Gd+v1DT83jhxPBxDURc+udPWy9EzC4jwe3mZmZPz4reN3AEoVnf8wjcqcH3K3RFc4DeqR/zj4Lfeta+7c5+1Y3TOaJ+ubuy57JpvWkzKp6nixuhbVtIVw3PMui0oYWN7ijNd6ml/PjXe5PU0O80FtbzAe8LHlYL9jVYZyZFfauyqCv6XZQxMEDsrjRLGqRgxXeTdsk99lmzVtrvN6BMSDJ+ujGASrUyssiveYdHDIa4aBV1CzryMleZjveHT4QxwKbTbNX1zcsui97GtqYnf6gy7jPTUVUWk53WDXmuZZ5zS5pQzVm0+TRZa6aLcU/Knud/oCmTZsqZpfbiieN21PsHm949mkh4lbolATX4Dar6cDp3TUl8UZEIQPaHD7f0de7isCN+IS6w8USqnXmoAytL/KdC7q49Vf3+7ZGeRD7Y3W+jdEuHuT1u4I7equLueYVvqHwOjrazo1Y5/YAAteoQjoaKPH5+g6uIpMZoju80nRkjNNuNMKuAlHz1miam9tD2Rlx+LOaZqvuUPb5jnP11VRsLWzakx7/soNN5bK6s6JLacxtuc83tKfLZRP5Cbbzk+MHv2cdN+0yHWZ7aavZ/iDiHiXdi3KLXE2rnbCderApn66s1K4jG2c4M/VYcLvmzJKx3C65ZQdXjHZ67dExGIgBywNQq2L0Cgyy9apSabE2pVpOp4GBjdvmMB0bpbEW6aW7ty8le1qwWlymf0jXFlwW/1WSlYnUcLGw3NWE+svmwJVNoaormaHAmJkmJw6LrRV0y8bqVCe3uuyTm3Grabbqhs4Tm+upmBN0TExKjUu5M8epabFU7nk5cUvVLV/q9iE89GB54qvvYt5ecrbcVrOd27hHedIIc4tcTUvpGSRNG7iDk2EtXXQzNOQ49Lw2SW4Hnyx7e5eIXbLk8H+xDov4VtB7d6WNW0mBViUGUWTYjrDgMyDt1EuabQTqo9ulma1a4XT+0iW3wlGM1fFwXi3O00PrzdMat3uIUP5e142jlcSUHsm3wCO3XLqdkZryOAM3S3IiuTWrszXC7oD7pM+6jO5+drhQHa20xbZU3ckGzdk0Nyeh9ZfdE5NZc1WXZswmftmoQKmT29BGEQWYLrNeICeNMvrSHC0fn9u+fabfbjuaczBq9JlCGX+6NmbO1JR9SqmdJnAHJvGDe95ibUewwQGqd5Lc/vbRM8qPBbdnlri5Zat7ywZuu3zb/Pa7K4o1vT5NjYh1noDNv5TjUIy6egli66YPxcA9Kyf97vBl6eVleTedFR5xqQWWYRf1bh6cy70vOY36sGVDeAxrOetP7lducGtM1GEN3IifDKKwfV2Z+miUh3qj8MU3yqLVCK091u+THqgxN6ylfki/lL3ulwlWBikiqjtXT46rvWm26vikAiMmMOEwa47UZJjWXiUE6Gp6Xnr3Hu5d48BZ0Z4i0weQ7m5jbJsWqaL2uLlVNYeGB8WTiKW62tPbExQ1yxkta3XqA7kdrJsecCfzc0De1Mj6lPTBsLK8voNkbkWvyib1c0GT53ZLLun7z0XxGS7ufF7T2z65n/vR5/z5n9+91PnVH/nMndTA2396jl/Hls4i64K2vVToPHw9Idy2HD5M6agNGyS3oiC+PXy4xcatwOte9Jo0YrpgtVENVnKDmVtlMdsVt9IVpO85yix3+clsC9lzFK6oCGA1NaxEhmlXg3mCGUF7vZvM3JYeIIOstR833HK90isQVgEnWVOVB2umNE6pZprI3U85G5FTc8ScBaQvWWJ+zN57pIYR5hmlnUxvTtDVNHt1nDa67ILDqpnqCcSKtbJS8jEauP40lZfy2pJflQZWZsRBWTfuvsxLZYytmd3pjHhHpc0+lF2uPZDbgcHaiW0TnMa0lOhQKLiPi8X6uW2eSE3KtW3auf6aGU1MxeG289vNmz+5LyjUntn5m81C5drNTzu/EofIU9oiqBXkdpncandy6Q3d/Oa5n1sXtO39aPPmP7x76XcNieD27warMr5lhoXt/ftKE1xic7SwRA3ayHBPWA6fyHCG4Z01Vtdpoa1RNaoLlDkOWFHdmPiWkRHjuN1bZAyrCGWgPG5uQ8IMGUYtdLBahn0rpCERBi6nnw18iUrMnOuNFfNgZYNMpy2vXhsnvq1czcaxTHnokX1chfIbyKttLWQXNXzE9HI1N7dWdaIFvr5eryuAt2oWhlWv95Yzt8J4n9YO7SssVXmpreFrMgFe6I31qtuH1mdYeTvZfZmX8oypeUjwPMAOif1o9x6RWt6XZqQaHsStNJPTMJAmF5QWiYlmhyD3L/nnenqOaK9MIb5NmQK3TOPIB/8juBUosu588Lbmafv755o+8sF7YrC2vf9cuXFmZtve34kB1LbXukAX373JpnhnRiK4NXxjS9JntnFLs3/EHLSVhWm2MEtyq7UXioHSKwnVy5TlCXTJ4Zsah1t2HSn1E7ENK5l2cnLLFEq8coZj1+0rJdZ57YShbEoB+b6B4/mGTXfczWqEvIM0yXpfzS7VxmUcXKaZ0HFyqqw0LrdWdSrYP+6Ewzq5OfqSFspUNzokmGoatPJSnKLSRcJZIKyuWK4cltbCDHbTi+LFt1SzPiq8gnO9haXO9rRGRXr/IL8nP82ED+KWFJw9blNStl/25AhuZT5u46Tj22ngtm3v66lObjWdZsovyA5rOttYZW9v/4dOu/N/XTbQJbfC5+5KGLcymay0wcWtx2+LbwUNXrkWU1loH/shX6aRX6JRauZezKjXxS1/q6C38r46jWzOnzpUlSbXU8+rCLKsyGcuiliIyLstp6K0o4fIMRiH26UdfIdM/iZaZHy8zIw95WV8T4tbe9Ns1Tk5HcutkU1TtUd80ltWT4YsYmtsre1mjcYdpFfgPx6PWz5ZTo2BUudR/zpjab056rWvp881bo8Hd6ekLE2NlAl7u6Ou7mzdvrljb9ve7zzMuZmbn77Hb33k6psmtxzZinPLx3CbKHsrV4A2WPscNzzLq0E2biulxZRjpDlct16RSqoqkWNfMyI3AbQxXv1dtixzPD+5naNVnSjL4Sy+hxCx5ZcjvOIiuT2UbeJT5V7g4SklPrfj+MleMw2td0czNAe35BfnZK8107OWn2xrmq06fes2yWnDOH6yVi/3WZiLqxG+j+KWqJPXLHcFGpJbnjfH4bYsIx63gSKDW/mSCrb7nppxbicR33qXrtV8wQ6tT8a3wac2cj65L1g2O/HtG8+rvBS/8LZPL3Feis2wYY4NbtuufibIJmfZvEDFt7n/yE8Etx+rfLIlzid/bOM2xKDKWE8XDFWuKnaNITaHUfcCrcxPqRxLvLyUXL+tpOHcWkF3v8drqQU8AWw8S+mbFealVk0inDaJGOWkTU2ReQLnrAJscLLoNLnuO7TN2YjQepNFvb7IibVsVVWR4cOK6YUD6XxH08ZWZ7gNVl7KrLnRHulTeo1dFsltDq1kSXvrV9wGioy08hHOI3TF41bW3GXOaLajbG8j9WmOaW2muZ3U75VK3+bR9HM1tnxyyl8atJyUWcknf0QZY04z1cnFvivffd35dlxu9ZvfvL525IMS+wUqn/zXhKSlPHeZ28OHD0toRYG5vWvjVm3bkRkoSpIUWLuWTJpGzY3IVrgaoF1CDLnHvg4UM9aBOO8yFC7loFLsWpLbiMQyD+Wh+bp27wFarslnCkzPNlIfC+7YyIs0gVj/aXkCJ2bUik9zmPJSHPZp7dW0EWuFsxGiSy+f3r0vg33fcp/aciWStgeMu92L0vYs2Z6ak2I7lMwDW02zVdcaPSm2i1Wr7WKN25ULb9Us928Z012kV4bTnJcSC0wePmF/X2+T4tZ0zAtceSnZfVvNcj9ZU6nz6L2o6NyeJhe39qbNALcD0/CLV6fwgwlTWr8lGkc++IyKpturnOXnyuP6yaKw4gtyk51+cqK8ZLEOxNyKgFZiKwrMbYudW96fXGTtcJJbg+zcRvbFjoyZ3XlXrtq269p3YWxKpp0JMoul+8VWAWN/srW7mM51bNAtNW68ifcV8OZiGffyQog8KjdmyCKdEWffBXXpfKpmrMbwGgvvuzD2QNMJqj3NdDTV1TR7dbQ/eaDDWLgxUma2mvlJKGy3RlWczjU3nW8wGjww6uaW9zLzCfbu22vmrR0B99HRbPGE/S5u/c5s3nRzO5gyyxqcGrdiUceBoXZCPHcPfSLzUsIol9i4Hbn61095xccZ33I2K3H7LmRW2cbtLQe3D5MeCU6+BfpYJ2AC/oI+hb7r+oSb6XnELjzgrHOn58SGm2nm1hOcZWy9walxq9259LYdwy+Ei0wwZwhL/LpYxxj52loH4mzV9+wmu7i9+elz5Ql5fXl343F7d5FtHWi6CYAeQ27n9c8DEY0e6Q+rbRSfCxc59/tvv6Ysk8e+76Lzv0lkeXPlninrAuLWc+fSuoS8Pv65gg1PO9aBlpC5nRC30Pzjtj9oqH9auJ3HP38rreiWzhJjn2OusLVXvruf+8a/OYqx7XM0Px65KjdGmRfIdaC29997KSHc5p1a4t53seTUogm5ydA8VO1kUrEP0mPw+y48Ewl+PLPqY67Jy2txc9uyaCW4hSaeUcbvl0octwLcU05uTwFbaFIGF7/PMaHc5t36wcL2h1sSW3ALzZsI98n7/cmZDG7eTz/+8M+nn/7nDz/+RNSulL/SEdhCE4yZ8fcKEsVt5ppMwe1KqUWLFLZ50/ebWKEnRvj7QAkT/9bzPIvcPEUtsIUmFeLi7/ElhlsGl8m1BGyhyUifjb9/m/JE/v1b9XdGbOSuwd8ZgSZNLv7efMK4Nci1pKgFttDE1ZNAX9k7mV8j+/hw6yTXoBbYQpMKcgfUT9bNqOTtBybxAy2Pyd/RNMk1BGqhKZLbk5Awt6JnUj+G9rj8/VtPXGH0QVNBd3CgdgbhragdGJzsz47i71ZD0HjGYO42DdxC0PwTuIUgcAtBELiFIAjcQhC4hSAI3EIQBG4hCNxCEARuIQgCtxAEbiEIArcQBIFbCAK3EASBWwiCwC0EQeAWgsAtBEGzzW0e/YkdCIISqZV5U+I2CYKg2RG4haAnids8PDwImiXlTZrblXh4EDRLWjlpbhfh4UHQLGkRuIUgcAtBELiFIAjcQhC4hSAI3EIQBG4haP7oxFtCvzJ0QukF0qJFv3rtZ78AtxA01/TLnz1MJ8AtBM0xvfZQbt8CtxA0x3QU3ELQfFMykflr1muGjr521BC4haC5yu34H/8a3ELQnNPClS5uX13cUgxuIWhuaxa5XXjlncVCp04nvfAiFeqSkl8VhYsLk5Je+L04/mWS+kAceVV8aRFfF16hTzrw3qAnW4tm0d5eeefUmTMLFp8VeF48c+bM6aQTi0/dWrD4ovi+5cKCd1quyw9uLN6W9GrLl7duiE9W3hCfvHgR7w0Ct0dnzd5eJHiJ0zr22W+0dCQlJyctfLVlG9la9QH996polfi4WPy7Ls7Ee4PArcHtC8eOHRNuqPj/2HUbt7+aOXt7MSmZqCR3WCAr7K/03W+cSmZrzMgmv7r4CHMrzPG2pBfeWdxyAdxC4Nbk9sRiQ6bNnUlujfi2Q7rDCw1uFzK3CyW3fEayxa0A/QYdgCBwOyvccnx7o+XLJOUnJ7ETTH7yAstPvniGnGfTT05+4Uv5DQSB2wfGtzNoby8SuwtVXurMQspL3eA8lZmXqmN+zbzUot+3XLj1+xYklKEnWk+9MHvccnwrKjxruMPx1oFEfLtAmGRjHSjpyg1R+BIvDnqy9RBuX5tJbpMWjpdgchxPfqRLIAj2NjHcQhA0LfbWJXALQfPA3oJbCHos7C1+3wUEzTF7e4K4/eW4OgpuIWju6cTP8PulIAjcglsImnE9nNskcAtBc0vJbx09+osH6NdH3wK3EDTnwE2irfwPOiEZ3ELQPBa4hSBwC0EQuIUgCNxCELiFIAjcQhAEbiEI3IJbCAK3EASBWwgCt+AWgh5DbhcsWKBp+A//4b/E/zcFbjUIgmZH4BaCwC0EQeAWgiBwC0HgFoIgcAtBELiFIHALbiEI3EIQBG4hCNyCWwgCtxAEgVsIArfgFoLALQRB4BaCIHALQeAWgiBwC0EQuIUgUm2KVA+4hSYhj2/m6wg9hefsVkrPIGnegJt5bPEFcDtjyumf2Pl9e44bxUi+/Dq6bUJ30B8K/tboijn2lEL+tQmvM+J8MylB+aV2foC75tjixeOAC27H02iNt+nlfNfBgFeoVjKWs6/QW1tMJX+abaT0Vng38Ql+LyvNKnqX8SlZFXWKvt3DhfKQVpZh3qFMnssHhqxG+K2jkVfCqka9b7hQVZclL0uXxwt2dVhXbZL16VvD3lUHZHFj2LgxFdVR6rP3fL67EVxemursEtVhdDty0OgzPxRV5KNnrSeznLufk221UuhQ9rIxM45oxECDLGab3T8kOlrbYT34DvN84+mbL8zW56z0uNwO1s0LcJnbxbcSxO2W3M/46zO5ublvfHw9TjG386M/alrbXirmvi4GRNsnlzr/Jg5pt7d8nfvGXxvmwDPLajpwendNiZvbEp+v7+AqMhzN4fMdfb2rip3chup3BXe80nSEjm73kZ6yitJIdlcUm4TWxuE2Qme2r8s3GrFnnaz6Gh330NHCWI2qsTV6fn/fvmq6YYg+7tsj7+Nfp2YcqnnHxugRLlf3+7ZGi6hYEKsTRb6JXxQ3Rruo2Bjr94nq8p2NyMnOMNrOR7vDsv2RGmZZFKjPB5vKZXF/X6+XqssZPrlfPIkMF7etq7aZT4Iel9fNbTs/+HXc0aYVvqEwdz8n+6S4cfVaRl0U98VSjRdVmGa+sCGez2x9HofbgcHalNo5T+2FNQzui4nh9uY3ue+9xITu/M0f3r30xvNjips3f3L/uQzB7Uebhf7VoLW93/mV/HjLpe+//Tr3H/mz79StL2Isjri45TFSVUr/SQBKHNzqlTy0AnzUGjO2ohYZNoayZ3dmTvZYbj08NpmNesKptZAfZ/1l083eb9Soc/WyrTbbo3dvSrXX7OHDzWGqY5QmndYKgqyxOpX8A+pi+9IGOoHRW59h2kJuRKuJiKyTe09d3a7ObGR+C8j37yZDqdenGU9Ga9zucXArrvLYbuYPu7mN1FA/KwupKQVc5DPat+fTjYu4Ii5eMxopfY/mMDVrtM7Z5/jcyvTU3De2xxjcC4nhduTqV508jp557uf0HUHsLnruXHpbcPumYaE7xTse+bZOAPz6Wu3md/+efYMr+dOqugg0C2GL25xspmk5DXh/mj9qeKtyDD+A28Z1FqEei9t+4fwNmIAUSBLL6EtzlHGqKbeP9zR78ilgzButiteqFc6a+fTG1fkMOX3mswygZuKlBrk5C6lGOEnTRrfnGx/7JTtVXbYnphlTmpyJZAfZZd4oAbS7MN2bRmUb9KE9hd6TDWbEL2y89SZSzX7QjWUHVG9oFpG9b1/dEKfPWekiNojVubglBVPmPLaLGdxExbdbdi7e+5nJrWDyWpziyNU33dzquia51fQ58Nja080hoJNjK20IExLxr041BqQc+/4mdo4z2Fp1Zeqj0YxxudXrB4e93peNjJbJbdP5jnP1qxW4rRWSgcbYNi1SxT5ja+zDsBE5OiNqAxz2pRW+4tzYWaPm0FbyzKVtVr6A5iBN72ZMstIdjVWN8LSf7DWY4vavMDyS8uXMSqRGEapQC7VzN8qso3ogdlb44mxvC14WgaqKWcWHau6orO0/fa7eQlrOVTKuLVXm1BNqp6hEuR/qi3+dR3JrdcvWZxH0b6KaS+cdtzK0JXATlE+++c3ra//EjrJB6Gdxik57O3JVBb/aF7l/O5U/F56bGOT3oteU+RSDo1EixXkpTvmoab+duSXPTSvg8d5MeZdSMyWUbsspLZPjTQSRQ+EiN7dFDH2pWbtmXriJUzCVXhEu9lYXx+E2q0kNcunoUqN4Hik3czTblLESAaM1h0QMTsQ5uwjASo7b9fp0ZyMKvAdOn9tjBMyVhtcszLBeVq4YC8SKtbJSI63Gnau6JrNlGXTjYtPhra+m7kt3PlBkt/mmt0CfKBufZXRfG42qNJmwvyExwclpggICyW1ZqcWt1Wf5/hpVID5/uFXYjpOUmgluR66+rd1hR1kS2rb3d/mOIse3l94rl3kp/kAbeTdX5qVufnd/buSlxGAYLSxR7z0y3BPOMPNS53pjxRwd1olZPUonSIrYfFHSRCCzwkxGmdkhVcySg2/VWhe3fP+C48qUKdNFmaTde3jK4LUm3UQtzb7iYwzZRkVcwAo4qea+g+wKiJHdLpAyuI3sM6x7hJI/HvI5d10X8W5TmqMRnu4gTzeqSQV2L9rfJV0Ovd5brsjxRHa8UkilyqYDHn2U41dZpUR0SJpBAj5LzAWK29ArFd5VPVH1MEIHjfkpZHS/O0pZQMr3iVeSIzJizC3nCsZya/VZuhCm9Z4v3JrYXtASxe2WnZRx+mx8bjmf/LcjmsxL/Uu5aj99d7+Tvb2bf3439/W1c8HeahFjvhZpkjR7XqqAQ9T2QrEk1HvcpKiVcsMBNr08wcf3k7M4LtPLLsfjVnnny5VNk7BErLSTiOLyXdzqBU1mMBtQJwb4SS6vNhvRSDEpBYcRsy19Nbts6aZuzgNF9glD9bJ0JMxGiCjcTJFZDSc3WZxDzWmOvqSFMu3k+LmVWcJCbvqQivKpKUR1dq1FHffIk1UHC4QjPbRH2d6c4dh1q2mHslcYqS6tQJjhSvFsQx7pgPONx3Jr9Vlyqzz5ecPtw7Gddm5vfvPGbzb/4WszAxXXT75zaR1j/KY9lh25KnH13P6i89qsPzq/I9Zr9K7z2LhdLmkO+TKlt2zjtowH/SEyz+NwK4tqmLm4NapLtzMu3HDrauXxmdwKq9lh5cDV8AyUWqF3umzPMjN7JQPBrGiRPUesq/ZEfKYr0JgeJ5POkEqsC9n3LzcDW1sqySBUrIGxt+zg1ux+vVrUFl3KyS63HkZ3+LwjVKpK09QJfIvWwmVGfFtZqG5ROia+VX2WT9ts2vzg9hGwnXZuR67yoiw5yuPnpWT6yYpvb9/KV/b5yn7las9+PjnVslzN4ToVeTq45axmg+bwkx/KbauytxkP8JMNX9TgduyNDG71wLp8WzJH3czfZaW6081q2jlm1LmF3VEDspxBaUZLzWWeLpdDrOysSi4bXffzcjKnnHl1RltOvPM6jI1QOQnY/WTNBIkXgyu95T7jgcqHcSjbaErkw9Q43MqFIn42vGTtqyrxZRpvwvaQ+G7z0k9+BGynndstO59nU/qZufhDiLqKHibY5Pb2/3Z+Trnk914a+YBO2ZJbMtuPTg8xqM3hIzyU01RqRXHbbhhANfxVXoq4CLALnUUIx+dWGkUju+POSxU5/N3WiiMcXRNJo2RWc2qKnNxmLbU5u+Z0Iu9uW4ziCUCu3zJJciHUVse9inLTx011Ot2eIXoEoyr3ZSyIKn+Z14hs67dyNcZvrBwpBit5H0oWcRvhLHe72WxjExXHu2xJzUUt0dsVZkaa3XTdT75vwXGOxa85PYHmMJ3c3JPv6PN8zEvlPQK2083tzU/Z2b39H+Eoj7PvghAWkW6Dse9ic7kguvOjT+53vq3d/iL3jW/fvfRe8ew/PblVKU0a1VSKaT0qLyXWFZSxGlV7gP1ecx2oOUx5KU7M2DZJ2ddvs1bRrqVS9rPF3qNyuQeqzGtbBzKNX4GVlwrE+k9be5kKSuSN+auZ8jJpCNAGJrmVixoxFC41slyy2FpY7jN2X9HWqSFj32SowAwtjUbkZO8KWksprkUiBk7uEePqcmp22TZJddeooDjAe7II0XvRk0H7LiplhAOr6ShxK8wpNy2T8+IHjP1bozIvlaEZW6dWp7o8+Hbzhdn6nOWNOdaB+oOG+ucst2ceAdvp5la5uB7KKI+zz1Fwq3u+EJ+rfY7CQOttn9zP/f5zim3//HVu5+Hrc+Hx0XbXIjmTZ5hrNAHbdt/IvtgRw/qJfRdqdZ836NZZiz9eV4pK5H+NnQDLvdYmYN53YWy6tZxWcW7TeXYAeUexDPwC1k7kgH1TssUt7XOQN+NGxA6Yd4tddtesU9vV/uTu8MlUzcWt6FGFuszGrcqgyS0WXF2x2X21f1sLNF22tUftu+AN1dauZcVt5KC4bDc5H3L/slpKow3Vaq23e7jQvjH8ZIc78rb2ctv6zPsujN3X1s/xkebsPsdjj4DttPvJHpl9tNJNtk0U4++noD0XnLfkq3WPrs0DRYKJctof8vQmdrMH3UfsoNQncdk47dvt0aCJ68VHwBY/DzRlnqBx5AG2k7O3xy6cWaOBWwiaXxPeIxgEcAtB80/gFoLALQRB4BaCIHALQeAWgiBwC0EQuIUgcAtuIQjcQhAEbiEI3IJbCAK3EASBWwgCt+AWgsAtBEHgFoIgcAtB4BaCIHALQRC4hSBwC24hCNxCEARuIQjcglsIegK4XbNyETSNyluDYQrNOLd5i1aK86DpUvLKRSsxTqEpcfv/RMQHx0ct4v0AAAAASUVORK5CYII="},95860:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA5IAAADgCAMAAABGral3AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAIcUExURfD2+v7+/tPT09/f3/Dw8Pv7+/b39v///1OE/u3t7f9ZWczMzL6+vv8AAOTm6OLi4v//0ebq7NH////9/+uva63m/9DQ0YsrilRVU+z//0LgaDQzNK+7zvb//4zO/u3y9f/orfX19f/NjO7m3uzw8vL0861naP//9uXv+mmu6///67u8zS2N0Nra28LY+2pprY0yNP/+41yL/0pQU9H0/t/h5Pr6+m4zM//psa2+2M/e/LOwtNCMK9z4/jMyj+v2+8XFyLjq/5aWlcj3/4fF99uiVeT7/57Y/1ZNRdXW1/Lv83267rnV7DpAWLy9vE9ag//4y22PyX9/f2Op4U99vr/1/ysrK7HK4Z25/P/WnG+y7FCLy4Km/s+OaPbEhrd5UvDt5lOE/8fs+H9ZSvHj//bNj//vv86NNVGb1fD27f/51+25fYfsoF24//D34sWHTjI1h//gqFVrsGnlhnBRi1E9NjBssN/Pz7Z3NHCd/pCw/fbarZJrUe/t8TY5cZNUamuW/s6lcDJhqNjr97uNZzNOmDA3TlOE/Yiu0phbO+ja1OXKq8DK1ExPbYE4as7c6GY5VVuBrEdumuTW/9KTTduxj4tnrV2X1PT1/5FEfsax/v7s///796elcVZZpf7jwDCBwJzK66GO/pZfjKhcg22QnF7Hd4OE/qzxvfxNO3R3ZLeP/tAqL7fvz9LP1YSEhIGQb5TtquzfxOz5yt+iR3QAABP5SURBVHja7Jv9TxPZGsenS+lJU1NlqbVYixQsFbRKUywSQItQ6AsIisJFIxgI4MJmBRUgkXAjghHVFQ1evYmubnY195e7u/fef/A+z5npG7QIQrWx34/SDp0zM8+ceT7znDNVRQAAcggFXQAAlAQAQEkAoCQAAEoC8I0oadAbAQBfFr0hk5IKAODrACUByH0lDegXAL4ShnRK6tEvAHwl9OmUNKJfAPhKGKEkAFASAAAlAYCSAAAoCQCUBABASQCgJAAASgIAJdEvAEBJAACUBABKAgCgJADfnJI/HTtE9J1VKvj90AlFeUSfdJxVlAp677uvaCs6FGWW3urpXbnOa46ilwHIipJ9RUV/kIoVhzqKioqOKo8O9T2z8u/H6p95jtU3yRVm06EhZbZ+aK+J3HSZ6p+F2VEAQBaU7FBfKrhCKuxbm6Ic5po4xBVSW8Evs/W1vLr2h0D9fXQxAOv44Y8nRMeuKPlIVkkaljZx1VR3H6DBrPxNKjkrq2QtNx3iIW39s7O4BACkKBmQk8Bdmku2yfHpUSWtknIueTahpKLsfcLTTwBAFpTsKzKxa4mBa5OikJuz6oc8cO0wB/jD2MBVqbivrQYAZGMueZ0rY/LjHVPq4x357EeJP96huSSvaUM3A5AdJeVMUR2f9mlfgijJX4KcUFxWKoqJL0Ge0AKe8ACQDSU3gjkiADmlJAAASgIAJQEAUBIAKAklAYCSAAAoCQCUBABASQCgJAAASgIAJQEAUBIAKAkAgJIAQEkoCQCUBABASQCgJAAASgIAJQEAUBIAKAkAgJIAQEkAAJQEAEpCSQCgJAAASgIAJQEAUBIAKAkAgJIAQEkAAJQEAEoCAKAkAFASSgIAJQEAUBIAKAkAyKqSp6yBPTlAwHrqU2dm9lhNOYDVY948zsNH9EaQb+iPHN4dJU8FrGaDTnx1dAazNbCplGarx+jPhUj9Ro91MykPG/V6+gvyCr7oR3ZDybBJL3IGvSmcOdELwq7cidQVLsgYKF8dl9MA8guni63cuZJhq07kEDprRicLPLkVqSeTkzRodRn8fn+hvxDkC3S1/X6DiwavO1XylCmn8pwy3ZRh7GoO51qkYXOGUSsbWagDeQZ5SU4aD+9QyYBe5BjGQHolra5ci9RlTRuoS69nI4VOgHyCrjg5qU9fJreu5Clr7p1a+ueuZk/uRZr+uate7+IaiRzNPyl1hQZX+tnk1pW0mnPvxMxpi4/HmHuRGj1pe9/o9EPIPJXS7zQad6ZkwJB7p2VIO3K1+nMvUn/am4dRT0rCyfwsk36nfodK7vnCqWPaynntSRepKRcjNaVX0lAII/PUyULDjpUUuZfoIr2SuRhpJiUxcM3bgSuUzE0lUSVRJaEklARQEkpCyTymMPydRtifJSXdL0P2p78KYbEzx4XlzPdClNPL6Tr+oFRd0dWsNe+f7qHXfTV2e+eFpqQF2bozqu2H97HbSu6ruSK8c8u1wrs0bX9OhxybbKGP19YdC0qCrN60z8UxZUdJXfDBw4Ile6t4E7lb1xp5naxkayQScQjL5FDkvyszDlXgMfvy96xHj/7xynJTYoFbVywtNMvmkYjIjpLBhf1CZ1n49fHKDYcYs0eFGK37lpV883pr7Ypn2z7d5vHQrudn8fixkkxrTnyZSIrH67+okg0fb59XudiQHSW7a3qEzj222MaFrpQ+SFKyVLaQH1i0xO+uebjarupBDaKJBdmaXyxpFElJdKPHqS44U/8dwBaUHFnlkILLl+UHdHdooqKcPSUzRbodJUfnfTx2SGbkqiPpt30HtPgtnTbfBZngd4d9C9TJ4vE83YGSmu2r8dlstktpJIjvJE71NV/ohcz88XmfOsa5tj82LAq9qKWFd/M2NbSRVVvX/tTN3Wvy4k+EQpc2lb3spBZNY6kWI/10/532ZqnSmgQpZtuDdtm07E5tIpJ409FhajEdFd5K+qW6MjkU6goewlGL0AObLSrK6mxqL1FvEdxLZRdih7H7bL8k90P1oE+22E0MHw8evO3as8flcmVLyf5O7gELjwE1Je3ayJOHojMlqo3uuRm16yeWm8aOO1QTvXPHEwty4wFKId7+ymaJ7jFZZaY7rSbP9pT8UEdXVujGV+xd9ZTVY13DreMrtuwpmSnSrSupG/15v+j+rXmTIyaUpBy2vKLz6u9qofxtEt6GgspUJQ98/6mdxJmgazBwyZFI2biSa3RHsPQ4xOidFkpaumpTdLx3Dx2pm9s5F0ZutQnLje0q6R0sFQkl5T+fGKBjUlMpYLKSalO5owsOoeNmKTcs2X0N8qZQfjx2PPfaldjui+PnR4dJlZkP8I822WI3jbx9kBDnztHyl1OSB54D2sBViTmq3a69KzfIu8tpleRmV9Rx7uvNEp0SnDNde9uOkvaeucUmXrx+b5puEWMz9xbpT/aUzBTpNqpksEcL/ue/bKHnnFv9tpBMLu+gL8S3+xQlvZSz7rFW7UIXV2dQsp9ds/SICduZwLxtupTWvLVNk87lL+afPpn3aXk+wTYFqbzw+4Rt2scL3f9s0Y7HFbKM9iSPV0y5+04tSTLz52gf7ps8IOL2VKx8LO1aqyxj1YOh9y+H+WYY9yxJyWvy8JYPw6HYE4hR3kfZyZ/U04lFEm/KvfE7j3yqK5vdlc1qcex6WyXPkSLj2JKUlIsx4/et0Pmpx9F6y3vPZpOjgAmbXQ4p3Pd8oeccZOMH24bhwOcY+R/juXPG7CnJA1ex+cB1cuhunVb3pqZZvGjagWvr9blYUd18hiZTfEOeb0HJqw4+UvH4fQqQZq1jM/+rsUctWZxLZoh060pWD7bHgqdktqgFQE0u9mW2aZ2SorGVHLgc3zyDkpzAcpRHfVLCNvDu3XOtonzyMv3tv8Wlq7F3uYWrx7oqKXWOH2/qVom3UhPHTcF6n/Da8d9apGIcCZ/CaSqo7pvUfoo2nuK9lz+IynDYs/bUKvl2UsZvoZTq/0UWOPfNVmnToHpDTVRJrSn3hnrrGnnV/4qTkoojH889VxrvyqQqeTOaNC5OjAK03iqM0EleVaukLOHc7VOrrCQvqEPnnRj5ozh/8eL57Ckpgp3q4500SvLjHfV5T3BB7bu1xfuRyNpim3yqM7yoPd7hBd54qi6qVdmIQ7yRP0L+rHtowkm+Ic+39HhHBCdb3GudDx8N0jRybKYkuNyUTSUzRLoNJWNOSZu6D7Qkkuv0nRNUB9crSS9Jg9D1Stb09vbKJA1GyQwHf0rX5WUzvdOey3tE+UwJJW1sNDkhjVinpHp0GUAzjW/eO3jPFrlfC80buSK5qXjFFJOyBas0G/heEOTbc/l7Bw2s22hyOK9O1xoptN4zHONVdajLBc77uzzhgfdyAF3XczOaomSsqSyP2rsseAMcY3mVPP/y3t6qJCXrensXuF5TxL3qZGq9kt6l6c6/5E1JVTIxQ+VzUl+2x7/+nWzkR6Fr+PPPBl3WlNS90b4ESaNk4luR8RV5g++u4T6dWm1P9yVIKT94adHmoqVipLNdDMif/RueYzq/M5nCzs944qrrrrkhqu9Nyy9lSMnRv4msKpk+0s+pkpzdWs6oyaUbX3oaFZ9XJcXoSYc0Q/2kWH2n/aYqKZNRZKqSNDq0v1jqEWqVlJl6d76Ln5MO3IhVPa1KypXdfAzLFbU5nwPbW7Zaqu4wUSVbxuVIlk9Hjb9bPaGyk22jWomKVUmtKZ+PGrFO7RvZFeWxKmmpSqmS6vEyV8m1Hp4EJ5RMdH1jacqGW+VHLowJIy8K596Cgr3O7FXJ7f/vBZ22SXzDTfego4wxbfy+NVy43S9B4oeSUwt13q7b5dn71iL9nLnk/9s7G9e4yTCA16WadGpiKCurUI9hauvQU2831YxSp5sVZCp+ccI5W626Tor4iT0FOjYYKkOliGNFBxuyD+f/6Ptxn2uT3uXetMnd7wd3u92lSXrNL8/7PG/yvluipGrQvXaXkmfbc8kYJWce+08d5413tig580c5QslmLqmqsdff1dtrbEnq8+lzMuK994TKJcdlLnmy3sYVZ96nPlFGNH4HuSl12mmvuKpFmkrqZquOsvWo2Kq46rW1vhL9ohEl9df32SMdSurtRSqpnvVJyVCU1I3VRqv12Fu2J7tAvPSU3JXuVRP9ktnZ0x6UlCVDeUw8JNsXHbnk1RdEy/LxTiVnzsklZAX0zevllpKn69XTtibt6dtqXZFK2idl8VLFiuYhKw5teQZTn/yp9mRGlVdkhVemn+O/iPPBheOtCuo9n3z1yhe3z9gqlzysWp0zF26fsDuV1K62Kzkj66hNJevWqUXrUVHvSXPRNsH0emUu+cyHj+uv73kdWlu5pGqytyn51KQ+STeipEirz3032ZZLvjNp/6BySfEiQS6pVVyp55FCSeuYwELJfCppX/3xyBEVC/+qV1wbB5fsOPxdNf1lZ+MZ1dN2qtkveWlB1mZlT9trMjsSP1vu6Op4U5aLZE1R9zluVfLwB6fU6psVV+HGtwflcTxz7lVdkRT7pnO793/Tb3z6o66r2s1g8vmrB1UVoVFxFecCWZs//KFYqeof1eWWE51K2l/+PddU8qGnZQ+i2EsVuXRaqfekuegWJZsVV/t58eLAlvLOiXYln/n+1Bsvtyl59qcjl16S22pVXL89+I+uuH6cpOKqw+PD9WAplBybEIyhZE6V3KbjsNlKi0wMtkkG7mqhn73ebQYdvU+Hj83tsIj84P23O95SFdFdQTZc1a9tIjlRnSwJKjvNbLJhpFByeswVjE2j5MAoefLt/vfz9BkDv2yCY111Ve6ikqY4LRu7iZWsO6mKPMfeej3lC+pQMk0lH9xv79ePX+v/2rcevFPe33o/4ePOQv/rSPK49c3ebLe/R/07/1n/P6mTykh7onXZ+YRJJRnoo5897SFK5vEAHvRHIm5+fVO/eDadm7MYDqsfoobD4uasYcWAkgwa2Q8Rg0aiJEoytPLesP3QygyHNcRK9j8cVgYnIBjN+wQEREmiJNP07M2eRkzTw9DKw2ukgaGVmcwu+Z5GTWbHBATD3HDtewICpnxN3GqNnPKVaXqGN0gamKaHidGTnQvjJkYPmMxuOIU0M5ldo+764gMZ4MWJWCF13XXi/gww8aQbs5NM+Tqsc74amfIVzMPE6EyMjpLZYnR0bHT60H0wVBw6NC3+7qMjKJnJODkmrYThQv7RgxGUzG7jFYaN0aAwgpIAeQAlAVASAFASACUBACUBUBIAUBIAJQEAJQFQEiUBUBIAUBIAJQEAJQFQEgBQEgAlAQAlAVASAFASACVREgAlAQAlAVASAFASACUBACUBUBIAUBIAJQEAJQFQEiUBUBIAUBIAJQEAJQFQEgBQEgAlAQAlYegJfNfzrP7xPNcPet98sVJdLzm9U1qvVoooCYNGwTVhY5uXbqGXzYe1JDa2eVkLURIGSkhpkR8UzKwt8KXf3UsZVpVXFxP6qH+uGqIkDAq+9LFgVnJppd/dshXHWXL6RayhgpIwGCGye3l6Fr0Lz8M1xxRrIUrCAFR1vK7MSea6t2Odp1gyZqRzsVRESci9kZblprZy17J2cLJootHa1ngtoiTkvtXqp7h6f4cIHBqMkTpOhigJucZLMUbqOOnFfbxmMEbqOLmGkpBn/HhjjDgfE4UrjnkqKAk5brZaVmEPNxE6aRCiJOQWN9VEshGII5vG1VSUrKIk5DdIeruwFS8qTIaGE8lGOhmiJBAkk4TJmpMONZSEnOKlnknGxuJSSkqWUBLySWCu3Trtz8aZv+31AkUnLYooCbnEj2u3LnqWdXS221U9as32vJ24HpDVV2z78hWj/SAoCTlIJaOvdlu0LNfr2sn5WCWD7ZPJavTdWKW58eVwavzfhPdqVVESBi2VnPakjWMyuo3KcOmrSCheufPq03oEHW28iFUyIplcjwmSU5slZ7Uik80DU7a9fM1xjtsiaJbHr6kIOi7fiWYdJSGnSkZ+tNIKbIue6yrvHrWOuvpaHPFKRND5kRVPhlJpaaySI9srGVfdKdub9fuay5fDWXtDiCieVieXpZHjG2V7uef6DkpC5rGsmHZrW1szKCjj5JN6f8UTOgbzcik/CLyjszsque2GYqVamBfB8YaMeGu1NWmiM7d5Y0FGSuFmrabCZTQoCYOm5IoMgs2sUlDXTkXPZgjVH1kpKOk4S2vHZShcnbPtcRUTD9hXyps35L+S+DwTJWHQlNS55KI/L1/5vteppIySYwUVS33BvHElT5y/ohJKx1mwN4rFKamkaLVObTgqShYFN1AShimXbFVcp1W+2KFkZy65c3mn51xyaXXSXg7nZQr5iC1zyWWdX6rQKHPJ8/deIZeEQVQy+uKdgmyUKtsWPSlgh5KpV1yXVHt1Q0hb+kjklCqXFHZulup9llRcYSBxrWBXttN7v2SbnEv0S8LQ4O/KVeeJrt5J4S5mlITME+zKvVlc4wpgIpk0B3eCAHSdTHK/JECGYFQBlIThC5OMvQPQQ5hkhDqALME4rgDZgtHOAbLVdB2sOUEc5gSBvMPMWQAZc3Jw5pd0mF8SBqTtyizMAFlCyuObjZQFv3vRKyYar0vRtVaUhPwFSteyhJWBGS0LgfTRcrteW33kq4sJbdQ/Vw1HUBIGSUrPMonn9qR3WOsvpSzVwp02gZKQuzqP73omvPQ8109wb3SxUl1P4mVpvVopdrF+lATIFCgJgJIAgJIAKAkAKAmAkgCAkgAoCQAoCYCSKAmAkgCAkgAoCQAoCYCSAICSACgJACgJgJIAsGdK7tu3z7Z54omn3X/aXkkbAPYGlATIrpL/A2Tjp6eND0hIAAAAAElFTkSuQmCC"},91581:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/04-min-7eb9f3330355312efa81e47ffc75123b.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/ad762f86.d89c36da.js b/assets/js/ad762f86.d89c36da.js deleted file mode 100644 index d7d707f0aea3..000000000000 --- a/assets/js/ad762f86.d89c36da.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[7940],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>u});var n=a(74165),o=a(15861),r=a(67294),s=a(87152),i=a(17145),d=a(67425);function l(e,t,a){return c.apply(this,arguments)}function c(){return(c=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var r,d,l,c,p;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=void 0,d=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){e.next=18;break}return e.abrupt("return");case 18:return l=new s.U(r),e.next=21,i.G.create({provider:l});case 21:c=e.sent,(p=a.split(".")).forEach((function(e){e in c&&(c=c[e])})),e.t1=p[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return d=c.toString(),e.abrupt("break",35);case 29:return e.next=31,c();case 31:return d=(d=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+p[0]+") in "+a);case 35:return e.abrupt("return",d);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function p(e,t,a,n){switch(t){case"humanReadable":(0,d.HumanReadable)(e,a,n);break;case"precise":(0,d.Precise)(e,a,n);break;case"blocksToDays":(0,d.BlocksToDays)(e,n);break;case"percentage":(0,d.Percentage)(e,n);break;case"arrayLength":(0,d.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(e){var t=e.network,a=e.path,s=e.defaultValue,i=e.filter,d=void 0===i?void 0:i,c=(0,r.useState)(""),u=c[0],m=c[1];return t=t.toLowerCase(),(0,r.useEffect)((function(){void 0!==d?p(s.toString(),d,t,m):m(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,l(t,a,m);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==d?p(o,d,t,m):m(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{r()}catch(i){console.log(i)}}}),[]),u}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},79569:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>k,frontMatter:()=>d,metadata:()=>c,toc:()=>u});var n=a(87462),o=a(63366),r=(a(67294),a(3905)),s=a(47940),i=["components"],d={id:"learn-account-advanced",title:"Polkadot Accounts In-Depth",sidebar_label:"Accounts",description:"Advanced Concepts about Polkadot's Accounts.",keywords:["account","polkadot account","polkadotjs","indices","identity","reaping","ENS","domain","ETH"],slug:"../learn-account-advanced"},l=void 0,c={unversionedId:"learn/learn-account-advanced",id:"learn/learn-account-advanced",title:"Polkadot Accounts In-Depth",description:"Advanced Concepts about Polkadot's Accounts.",source:"@site/../docs/learn/learn-account-advanced.md",sourceDirName:"learn",slug:"/learn-account-advanced",permalink:"/docs/learn-account-advanced",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-account-advanced.md",tags:[],version:"current",lastUpdatedBy:"omahs",lastUpdatedAt:1695203423,formattedLastUpdatedAt:"Sep 20, 2023",frontMatter:{id:"learn-account-advanced",title:"Polkadot Accounts In-Depth",sidebar_label:"Accounts",description:"Advanced Concepts about Polkadot's Accounts.",keywords:["account","polkadot account","polkadotjs","indices","identity","reaping","ENS","domain","ETH"],slug:"../learn-account-advanced"},sidebar:"docs",previous:{title:"Advanced",permalink:"/docs/learn-advanced-index"},next:{title:"Advanced Staking Concepts",permalink:"/docs/learn-staking-advanced"}},p={},u=[{value:"Address Format",id:"address-format",level:2},{value:"Derivation Paths",id:"derivation-paths",level:2},{value:"Soft vs. Hard Derivation",id:"soft-vs-hard-derivation",level:3},{value:"For the Curious: How Prefixes Work",id:"for-the-curious-how-prefixes-work",level:2},{value:"System Accounts",id:"system-accounts",level:2},{value:"Portability",id:"portability",level:2},{value:"Address Conversion Tools",id:"address-conversion-tools",level:2},{value:"How to Verify a Public Key's Associated Address",id:"how-to-verify-a-public-keys-associated-address",level:3},{value:"Using Subkey to Retrieve Public Key from SS58 Address",id:"using-subkey-to-retrieve-public-key-from-ss58-address",level:4},{value:"Address Verification",id:"address-verification",level:4},{value:"Consider the following example:",id:"consider-the-following-example",level:5},{value:"Indices",id:"indices",level:2},{value:"Using ENS with DOT/KSM accounts",id:"using-ens-with-dotksm-accounts",level:2},{value:"Adding via the UI",id:"adding-via-the-ui",level:3},{value:"Wallet Support",id:"wallet-support",level:3},{value:"Relevant links",id:"relevant-links",level:3},{value:"Transferring Polkadot-JS Apps Accounts/Addresses From One Computer to Another",id:"transferring-polkadot-js-apps-accountsaddresses-from-one-computer-to-another",level:2}],m={toc:u},h="wrapper";function k(e){var t=e.components,d=(0,o.Z)(e,i);return(0,r.kt)(h,(0,n.Z)({},m,d,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"address-format"},"Address Format"),(0,r.kt)("p",null,"The 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 ",(0,r.kt)("em",{parentName:"p"},"address type")," prefix that\nidentifies an address belonging to a specific network."),(0,r.kt)("p",null,"For example:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Polkadot addresses ",(0,r.kt)("strong",{parentName:"li"},"always start with")," the number ",(0,r.kt)("strong",{parentName:"li"},"1"),"."),(0,r.kt)("li",{parentName:"ul"},"Kusama addresses always start with a capital letter, such as ",(0,r.kt)("strong",{parentName:"li"},"C, D, F, G, H, J"),"."),(0,r.kt)("li",{parentName:"ul"},"Generic Substrate addresses ",(0,r.kt)("strong",{parentName:"li"},"always start with")," the number ",(0,r.kt)("strong",{parentName:"li"},"5"),".")),(0,r.kt)("p",null,"These prefixes, including how to validate addresses, are embedded in the Substrate SS58 format.\nNever use regular expressions for address validation."),(0,r.kt)("p",null,"It's important to understand that different network formats are ",(0,r.kt)("strong",{parentName:"p"},"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."),(0,r.kt)("p",null,"As of Runtime 28, the default ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-accounts##address-format"},"address format")," is the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/master/primitives/runtime/src/multiaddress.rs"},(0,r.kt)("inlineCode",{parentName:"a"},"MultiAddress")),"\ntype."),(0,r.kt)("p",null,"This ",(0,r.kt)("inlineCode",{parentName:"p"},"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 ",(0,r.kt)("strong",{parentName:"p"},"20\nbyte"),", ",(0,r.kt)("strong",{parentName:"p"},"32 byte"),", and ",(0,r.kt)("strong",{parentName:"p"},"arbitrary raw byte")," variants. It also enhances the original\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-accounts#indices"},(0,r.kt)("inlineCode",{parentName:"a"},"indices"))," lookup."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Many wallets allow you to convert between formats. Stand-alone tools exist as well; you can find\nthem in the ",(0,r.kt)("a",{parentName:"p",href:"#address-conversion-tools"},"address conversion tools")," section.")),(0,r.kt)("h2",{id:"derivation-paths"},"Derivation Paths"),(0,r.kt)("p",null,"If 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. Many\nPolkadot key generation tools support hard and\nsoft derivation. For instance, if you intend to create an account to be used on the\nPolkadot chain, you can derive a ",(0,r.kt)("strong",{parentName:"p"},"hard key"),"\nchild account using ",(0,r.kt)("strong",{parentName:"p"},"//")," after the mnemonic phrase."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"'caution juice atom organ advance problem want pledge someone senior holiday very//0'\n")),(0,r.kt)("p",null,"and a ",(0,r.kt)("strong",{parentName:"p"},"soft key")," child account using ",(0,r.kt)("strong",{parentName:"p"},"/")," after the mnemonic phrase"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"'caution juice atom organ advance problem want pledge someone senior holiday very/0'\n")),(0,r.kt)("p",null,"If 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, ",(0,r.kt)("inlineCode",{parentName:"p"},"/1"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"/2"),", and ",(0,r.kt)("inlineCode",{parentName:"p"},"/3")," will create different\nderived accounts."),(0,r.kt)("p",null,"You 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, ",(0,r.kt)("inlineCode",{parentName:"p"},"//bill//account//1")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"//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."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"It is only possible to generate a derived account by knowing the derivation path.")),(0,r.kt)("p",null,"There is an additional type of derivation called password derivation. On Polkadot you can derive a\n",(0,r.kt)("strong",{parentName:"p"},"password key")," account using ",(0,r.kt)("strong",{parentName:"p"},"///")," after the mnemonic phrase"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"'caution juice atom organ advance problem want pledge someone senior holiday very///0'\n")),(0,r.kt)("p",null,"In 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 ",(0,r.kt)("inlineCode",{parentName:"p"},"written derivation path")," and a ",(0,r.kt)("inlineCode",{parentName:"p"},"password"),", we can calculate the ",(0,r.kt)("inlineCode",{parentName:"p"},"real derivation path")," as\n",(0,r.kt)("inlineCode",{parentName:"p"},"f(written derivation path, password)"),", where ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," is a function. We can then calculate the\n",(0,r.kt)("inlineCode",{parentName:"p"},"account key pair")," using ",(0,r.kt)("inlineCode",{parentName:"p"},"f(seed, real derivation path)"),". Unlike hard and soft derivations that can\nbe mixed, only a single password should be specified per derivation."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Password-derived account are as secure as the chosen password.")),(0,r.kt)("h3",{id:"soft-vs-hard-derivation"},"Soft vs. Hard Derivation"),(0,r.kt)("p",null,"A soft derivation allows someone to potentially \"go backward\u201d 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."),(0,r.kt)("p",null,"See the ",(0,r.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/command-line-tools/subkey/"},"Subkey documentation")," 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."),(0,r.kt)("p",null,"Some 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. ",(0,r.kt)("inlineCode",{parentName:"p"},"//polkadot")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"//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."),(0,r.kt)("p",null,"Polkadot and Kusama both have paths registered in the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/satoshilabs/slips/blob/master/slip-0044.md"},"BIP44 registry"),"."),(0,r.kt)("admonition",{type:"warning"},(0,r.kt)("p",{parentName:"admonition"},"You must have the ",(0,r.kt)("em",{parentName:"p"},"parent")," private key and the derivation path to arrive at the key for an address.\nOnly use custom derivation paths if you are comfortable with your knowledge of this topic.")),(0,r.kt)("h2",{id:"for-the-curious-how-prefixes-work"},"For the Curious: How Prefixes Work"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/ss58-registry/blob/main/ss58-registry.json"},"SS58 registry")," states\nthat:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Polkadot has an address type of ",(0,r.kt)("inlineCode",{parentName:"li"},"00000000b")," (",(0,r.kt)("inlineCode",{parentName:"li"},"0")," in decimal)."),(0,r.kt)("li",{parentName:"ul"},"Kusama (Polkadot Canary) has an address type of ",(0,r.kt)("inlineCode",{parentName:"li"},"00000010b")," (",(0,r.kt)("inlineCode",{parentName:"li"},"2")," in decimal)."),(0,r.kt)("li",{parentName:"ul"},"Generic Substrate has ",(0,r.kt)("inlineCode",{parentName:"li"},"00101010b")," as the address type (",(0,r.kt)("inlineCode",{parentName:"li"},"42")," in decimal).")),(0,r.kt)("p",null,"Because the ",(0,r.kt)("inlineCode",{parentName:"p"},"Base58-check")," alphabet has no number 0, the lowest value is indeed 1. So ",(0,r.kt)("inlineCode",{parentName:"p"},"00000000b")," is\n1 in Base58-check. If we try to\n",(0,r.kt)("a",{parentName:"p",href:"https://www.better-converter.com/Encoders-Decoders/Base58Check-to-Hexadecimal-Decoder"},"decode")," a\nPolkadot address like ",(0,r.kt)("inlineCode",{parentName:"p"},"1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg"),", the result is\n",(0,r.kt)("inlineCode",{parentName:"p"},"000aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b29d7"),". The first byte is ",(0,r.kt)("inlineCode",{parentName:"p"},"00"),",\nwhich is indeed ",(0,r.kt)("inlineCode",{parentName:"p"},"00000000")," in binary and ",(0,r.kt)("inlineCode",{parentName:"p"},"0")," in decimal and thus matches the address type of\nPolkadot."),(0,r.kt)("p",null,"Let's take a look at Substrate addresses. If we decode\n",(0,r.kt)("inlineCode",{parentName:"p"},"5CK8D1sKNwF473wbuBP6NuhQfPaWUetNsWUNAAzVwTfxqjfr"),", we get\n",(0,r.kt)("inlineCode",{parentName:"p"},"2a0aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b77e5"),". The first byte is ",(0,r.kt)("inlineCode",{parentName:"p"},"2a"),"\nwhich when\n",(0,r.kt)("a",{parentName:"p",href:"https://www.rapidtables.com/convert/number/hex-to-decimal.html"},"converted from hex to decimal"),"\nis 42. 42 is ",(0,r.kt)("inlineCode",{parentName:"p"},"00101010")," in binary, just as the SS58 document states."),(0,r.kt)("p",null,"Finally, let's look at Kusama addresses. Decoding ",(0,r.kt)("inlineCode",{parentName:"p"},"CpjsLDC1JFyrhm3ftC9Gs4QoyrkHKhZKtK7YqGTRFtTafgp"),"\ngives us ",(0,r.kt)("inlineCode",{parentName:"p"},"020aff6865635ae11013a83835c019d44ec3f865145943f487ae82a8e7bed3a66b0985")," with the first\nbyte being ",(0,r.kt)("inlineCode",{parentName:"p"},"02"),", just as specified. If we try a Kusama address that starts with a completely\ndifferent letter, like ",(0,r.kt)("inlineCode",{parentName:"p"},"J4iggBtsWsb61RemU2TDWDXTNHqHNfBSAkGvVZBtn1AJV1a"),", we still get ",(0,r.kt)("inlineCode",{parentName:"p"},"02")," as the\nfirst byte: ",(0,r.kt)("inlineCode",{parentName:"p"},"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."),(0,r.kt)("h2",{id:"system-accounts"},"System Accounts"),(0,r.kt)("p",null,"As 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",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-extrinsics"},"extrinsic")," since they do not have a private key."),(0,r.kt)("admonition",{title:"Explore System Accounts",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Treasury account address -\n",(0,r.kt)("inlineCode",{parentName:"p"},"13UVJyLnbVp9RBZYFwFGyDvVd1y27Tt8tkntv6Q7JVPhFsTB"),"",""),(0,r.kt)("p",{parentName:"admonition"},"You can view the existing system accounts on\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.subscan.io/account_list?role=module"},"Subscan"),".")),(0,r.kt)("p",null,'Let 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',(0,r.kt)("inlineCode",{parentName:"p"},"AccountID"),". For more information, check the post on Substrate StackExchange on\n",(0,r.kt)("a",{parentName:"p",href:"https://substrate.stackexchange.com/questions/536/how-do-treasury-accounts-compare-to-end-user-accounts-in-frame"},"Treasury accounts"),'.\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 ',(0,r.kt)("inlineCode",{parentName:"p"},"AccountID"),". Similar logic applies to\nnomination pool and parachain accounts as well."),(0,r.kt)("h2",{id:"portability"},"Portability"),(0,r.kt)("p",null,"The above information brings us to portability: the ability to use a mnemonic phrase or seed across\nmultiple wallets. Portability depends on several factors:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Derivation path"),(0,r.kt)("li",{parentName:"ul"},"Mnemonic format"),(0,r.kt)("li",{parentName:"ul"},"Seed derivation"),(0,r.kt)("li",{parentName:"ul"},"Signature scheme")),(0,r.kt)("p",null,"To 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."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"left"}),(0,r.kt)("th",{parentName:"tr",align:"center"},"Mnemonic Format"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Derivation Path"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Seed Derivation"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Signature Support"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Polkadot{.js} Extension"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Standard"),(0,r.kt)("td",{parentName:"tr",align:"center"},"User-Defined"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP32"),(0,r.kt)("td",{parentName:"tr",align:"center"},"sr25519")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Polkadot-JS Apps"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Standard","*"),(0,r.kt)("td",{parentName:"tr",align:"center"},"User-Defined"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP32"),(0,r.kt)("td",{parentName:"tr",align:"center"},"sr25519, ed25519, secp256k")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Ledger"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP39"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP44","\u2020"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP32","\u2021"),(0,r.kt)("td",{parentName:"tr",align:"center"},"ed25519","\xa7")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Subkey"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Standard","*"),(0,r.kt)("td",{parentName:"tr",align:"center"},"User-Defined"),(0,r.kt)("td",{parentName:"tr",align:"center"},"BIP32"),(0,r.kt)("td",{parentName:"tr",align:"center"},"sr25519, ed25519, secp256k1")))),(0,r.kt)("p",null,"*"," Ed25519 keys have ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate-bip39"},"limited compatibility")," with\nBIP39."),(0,r.kt)("p",null,"\u2020"," ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/satoshilabs/slips/blob/master/slip-0044.md"},"BIP44 Registry")),(0,r.kt)("p",null,"\u2021"," Ed25519 and BIP32 based on\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/LedgerHQ/orakolo/blob/master/papers/Ed25519_BIP%20Final.pdf"},"Khovratovich")),(0,r.kt)("p",null,"\xa7"," Sr25519 planned"),(0,r.kt)("h2",{id:"address-conversion-tools"},"Address Conversion Tools"),(0,r.kt)("p",null,"You can use the tools below to convert any SS58 address for any network for use on different\nnetworks"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot.subscan.io/tools/ss58_transform"},"handy subscan tool")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot-address-convertor.netlify.app/"},"simple address converter"))),(0,r.kt)("h3",{id:"how-to-verify-a-public-keys-associated-address"},"How to Verify a Public Key's Associated Address"),(0,r.kt)("p",null,"You can verify your public key's associated address through a series of inspection steps, where the\nkey is a base-16 (hexadecimal) address."),(0,r.kt)("h4",{id:"using-subkey-to-retrieve-public-key-from-ss58-address"},"Using Subkey to Retrieve Public Key from SS58 Address"),(0,r.kt)("p",null,"This is to showcase that the ",(0,r.kt)("strong",{parentName:"p"},'SS58 address is based on the public key (aka "Account ID")')),(0,r.kt)("p",null,"The Subkey Tool's The\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/command-line-tools/subkey/#inspecting-keys"},"Inspecting Keys"),"\nsection explains how to use the ",(0,r.kt)("inlineCode",{parentName:"p"},"inspect")," command to recalculate your key pair's public key and\naddress."),(0,r.kt)("p",null,"Start by inspecting your account's Polkadot address by running the inspect command against your\naccount's address:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ 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")),(0,r.kt)("p",null,'Take note of the hexadecimal string for "Public key (hex)". This is your account\'s public key.'),(0,r.kt)("p",null,"Running the ",(0,r.kt)("inlineCode",{parentName:"p"},"inspect")," command on your public key along with the ",(0,r.kt)("inlineCode",{parentName:"p"},"--public")," parameter the SS58\naddress for the default network (substrate) is returned."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ 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")),(0,r.kt)("p",null,"Using the ",(0,r.kt)("inlineCode",{parentName:"p"},"--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 ",(0,r.kt)("inlineCode",{parentName:"p"},"inspect")," command with\n",(0,r.kt)("inlineCode",{parentName:"p"},"--network polkadot")," return your original Polkadot address, thus verifying the public key."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ 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")),(0,r.kt)("p",null,"You 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",(0,r.kt)("strong",{parentName:"p"},'"0x"'),"). ",(0,r.kt)("strong",{parentName:"p"},"For both SS58 addresses, the same public key is returned.")),(0,r.kt)("h4",{id:"address-verification"},"Address Verification"),(0,r.kt)("h5",{id:"consider-the-following-example"},"Consider the following example:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"19",src:a(2080).Z,width:"739",height:"543"})),(0,r.kt)("p",null,"If you are comfortable enough to distinguish between each account parameter, you can prefix the\npublic-key string with ",(0,r.kt)("strong",{parentName:"p"},'"0x"')," on your own:"),(0,r.kt)("p",null,"From:\n",(0,r.kt)("inlineCode",{parentName:"p"},"Pay DOTs to the Polkadot account:192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce"),',\nwe prefix the address by "0x" ->\n',(0,r.kt)("inlineCode",{parentName:"p"},"0x192c3c7e5789b461fbf1c7f614ba5eed0b22efc507cda60a5e7fda8e046bcdce"),"."),(0,r.kt)("p",null,"Using the ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.subscan.io/tools/ss58_transform"},"handy subscan tool"),', 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.'),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"20",src:a(81779).Z,width:"1505",height:"759"})),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"You may have to scroll down to the bottom of the menu to find the Substrate address based on the\nmenu listings. You will notice that many networks that also use the same Substrate address.")),(0,r.kt)("p",null,"You 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 ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-accounts#address-format"},"Addresses")," for more details."),(0,r.kt)("p",null,"Furthermore, the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/w3f/utility-scripts"},"Utility Scripts")," can be referenced for how\nthe verification is performed:\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/w3f/utility-scripts/blob/master/src/misc/pubkeyToAddress.js"},"pubkeyToAddress.js"),"\ndemonstrates how a single public key interprets a Polkadot, Substrate, or Kusama address."),(0,r.kt)("h2",{id:"indices"},"Indices"),(0,r.kt)("p",null,"Polkadot addresses can have indices. An index\nis like a short and easy-to-remember version of an address. Claiming an index requires a deposit of\n",(0,r.kt)(s.Z,{network:"polkadot",path:"consts.indices.deposit",defaultValue:1e11,filter:"humanReadable",mdxType:"RPC"}),"","\nthat is released when the index is cleared. Any index can be claimed if it is not taken by someone\nelse."),(0,r.kt)("p",null,"But 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 ",(0,r.kt)("em",{parentName:"p"},"freeze"),"\nan index and permanently assign it to an address. ",(0,r.kt)("strong",{parentName:"p"},"This action consumes a deposit, and the index\nwill be permanently bound to the address with no option to release it.")),(0,r.kt)("admonition",{title:"Lookup Account Index on-chain",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"When someone shares their account index, their actual account address on-chain can be looked up\nthrough Polkadot-JS Apps UI > Developer > Chain state > Storage and selecting state query on indices\npallet for the account corresponding to the index.")),(0,r.kt)("p",null,"Here is an example snapshot that shows how to lookup the corresponding account address of the\naccount index 1988 on\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-networks#westend-test-network"},"Westend network (Polkadot Test Network)"),",\nusing Polkadot-JS Apps UI. The output shows the account address, deposit amount, and a boolean flag\nindicating whether this is claimed permanently."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"query account index",src:a(65610).Z,width:"2012",height:"998"})),(0,r.kt)("p",null,"Submit a ",(0,r.kt)("inlineCode",{parentName:"p"},"claim")," extrinsic to the ",(0,r.kt)("inlineCode",{parentName:"p"},"indices")," pallet to register an index. The easiest way to do this\nis via Polkadot-JS UI through the ",(0,r.kt)("em",{parentName:"p"},"Developer -> Extrinsics")," menu:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Indices extrinsics",src:a(38872).Z,width:"786",height:"386"})),(0,r.kt)("p",null,"To find available indices to claim on Polkadot or Kusama,\n",(0,r.kt)("a",{parentName:"p",href:"https://www.shawntabrizi.com/substrate-js-utilities/indices/"},"this helper tool may come in handy"),"."),(0,r.kt)("p",null,"For keeping the index permanently, you can follow up with a ",(0,r.kt)("inlineCode",{parentName:"p"},"freeze")," extrinsic as mentioned above."),(0,r.kt)("h2",{id:"using-ens-with-dotksm-accounts"},"Using ENS with DOT/KSM accounts"),(0,r.kt)("p",null,"ENS (Ethereum Name Service) is a distributed and open system of smart contracts on the Ethereum\nblockchain which allows users to claim domain names like ",(0,r.kt)("inlineCode",{parentName:"p"},"bruno.eth"),"."),(0,r.kt)("p",null,"The 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."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"You will need an ENS name and an Ethereum account with some ether to follow along with this guide.\nTo register an ENS name, visit the ",(0,r.kt)("a",{parentName:"p",href:"https://app.ens.domains"},"ENS App")," or any number of subdomain\nregistrars like ",(0,r.kt)("a",{parentName:"p",href:"https://nameth.io"},"Nameth"),". Note that if you're using an older ENS name, you should\nmake sure you're using the\n",(0,r.kt)("a",{parentName:"p",href:"https://medium.com/the-ethereum-name-service/ens-registry-migration-is-over-now-what-a-few-things-to-know-fb05f921872a"},"new resolver"),".\nVisiting the ENS App will warn you about this. You will also need some way to use your Ethereum\naddress - following this guide on a personal computer is recommended. Wallets like\n",(0,r.kt)("a",{parentName:"p",href:"https://frame.sh/"},"Frame")," and ",(0,r.kt)("a",{parentName:"p",href:"https://metamask.io"},"Metamask")," are safe and will make interacting\nwith the Ethereum blockchain through your browser very easy.")),(0,r.kt)("p",null,"Despite 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."),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"DOT can currently only be added using the Resolver method. KSM can be added through both methods are\ndescribed below.")),(0,r.kt)("p",null,"This guide is also available in video format ",(0,r.kt)("a",{parentName:"p",href:"https://youtu.be/XKjZk-5_mQc"},"on YouTube"),"."),(0,r.kt)("h3",{id:"adding-via-the-ui"},"Adding via the UI"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://app.ens.domains"},"ENS App")," allows an ENS domain owner to inspect all records bound to\nthe domain, and to add new ones."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"bruno.eth domain name in the ENS application",src:a(51804).Z,width:"977",height:"842"})),(0,r.kt)("p",null,"In the example above, the domain ",(0,r.kt)("inlineCode",{parentName:"p"},"bruno.eth")," has an Ethereum and a Bitcoin address attached. Let's\nattach a KSM account. First, click the ",(0,r.kt)("inlineCode",{parentName:"p"},"[+]")," icon in the Records tab."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"The plus icon in the records tab",src:a(27038).Z,width:"951",height:"190"})),(0,r.kt)("p",null,'Then, pick "Other Addresses", "KSM", and input the Kusama address:'),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Inputs needed to register a KSM address",src:a(95860).Z,width:"914",height:"224"})),(0,r.kt)("p",null,"After clicking Save, your Ethereum wallet will ask you to confirm a transaction. Once processed, the\nrecord will show up on the domain's page:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"KSM address now visible in bruno.eth records",src:a(91581).Z,width:"936",height:"367"})),(0,r.kt)("p",null,"The exact process applies to adding your DOT address."),(0,r.kt)("p",null,"Once the transaction is confirmed, your address will be bound to your ENS domain."),(0,r.kt)("h3",{id:"wallet-support"},"Wallet Support"),(0,r.kt)("p",null,"There is no wallet support for ENS names for either KSM or DOT at this time, but the crypto\naccounting and portfolio application ",(0,r.kt)("a",{parentName:"p",href:"https://rotki.com/"},"Rotki")," does support KSM ENS resolution."),(0,r.kt)("h3",{id:"relevant-links"},"Relevant links"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.ens.domains/"},"ENS docs")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://medium.com/the-ethereum-name-service/ens-launches-multi-coin-support-15-wallets-to-integrate-92518ab20599"},"ENS Multi-chain announcement")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/ensdomains/address-encoder"},"Address encoder")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://swolfeyes.github.io/ethereum-namehash-calculator/"},"Namehash calculator")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.shawntabrizi.com/substrate-js-utilities/"},"Address to pubkey converter"))),(0,r.kt)("h2",{id:"transferring-polkadot-js-apps-accountsaddresses-from-one-computer-to-another"},"Transferring Polkadot-JS Apps Accounts/Addresses From One Computer to Another"),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"This will overwrite existing accounts with the same pubkey on your new computer. This generally\nshould not make a difference (since it can still access the same account), but it might if you have\ne.g. an account that was stored externally in the extension on the old computer but was created\ndirectly in the browser on the new one.")),(0,r.kt)("p",null,"This has been tested on Brave and Chrome, but not other browsers."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Go to Polkadot-JS Apps"),(0,r.kt)("li",{parentName:"ol"},"Go to JavaScript console on the browser (Available in Developer Tools)"),(0,r.kt)("li",{parentName:"ol"},"Type in the command:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"JSON.stringify(localStorage)\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"Copy and paste the returned string to a text editor and save the file."),(0,r.kt)("li",{parentName:"ol"},"Check that the string you pasted begins and ends with a tick mark ('). If not, add one to the\nbeginning and end."),(0,r.kt)("li",{parentName:"ol"},"Save and send that file with the copied string to the new computer."),(0,r.kt)("li",{parentName:"ol"},"On the new computer, go to Polkadot-JS Apps"),(0,r.kt)("li",{parentName:"ol"},"Open the Javascript console on the browser (Available in Developer Tools)"),(0,r.kt)("li",{parentName:"ol"},"Set a variable raw equal to the string from the text file")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"raw = ... copy-pasted json from original computer ...\n")),(0,r.kt)("ol",{start:10},(0,r.kt)("li",{parentName:"ol"},"Run the following code on the console:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"accounts = 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")),(0,r.kt)("ol",{start:11},(0,r.kt)("li",{parentName:"ol"},"Refresh Polkadot-JS App browser and check the Accounts and Addresses pages. All of your accounts\nand addresses should now be available.")))}k.isMDXComponent=!0},38872:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/index-a2000a16d514f2136b303dd1d29a17f4.png"},2080:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/pubkey-1-6dc18c2b04022519cc6dd0fb3af36f94.png"},81779:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/pubkey-2-16f0cbc7db6ab6eb8248a05df94adc35.png"},65610:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/query-index-6db697cbe5e058388b830fee34bc4415.png"},51804:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/01-min-dd1b37ae350384f3941bf8f446ec0994.png"},27038:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA7cAAAC+CAMAAADZXQhkAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAJSUExURfD2+u70+OYbG/3+/tPT01KE/+/2+v///1OE/u3t7fTx/+/2/9Gm/627zbeU/+j//3m6/1Kl/7Xm/06Osvz8/NTh/6iwEOq6///4/3mF///n/wAAAPb29nCG//X////9/1KT/9L////x/2SF///O/8We/6DV/1iQ/1iE//Ly8pHK/1eL/9L1/nC1/pvP/5uE/8T0/12J/1WX//r6+vfG/6+R/9r//1KM/4GG/3Gc/7rZ/p6M/8aCAIceRWKq/4+F/+///+O0/1eH/1OQqf/e/6y/1v/V/9G2/6OtGv/8x2CW/9mt/wAFgaXi/4yKjeH0/+ioWN67/wEEJoXC/+/k3vTS/83q/1Og//To/wAAUGWd/+PR/8b//4mN/5i1/7Gd/4IFAPTg/6CX/9/p/7TN/5/J/+uPkbmk///k/4Oo/+yUllGGqqjB/9/G/8Dr/+g2NpOP/73J1//jpuzH/1yq/7O8zu/X2c7+/3Sp/7HL4enx/5C6/8Op/9/S0ePr7sLd/unc/4Wz/8zX4u7KzbnV7RsAAKza//P03+laXF0JAOlNTn6+/djy/gVQoMvHz///6gYgTACCxtvh5+69wFGj47y8zW1RLQAzimyKjP//9/vBe4WxyYg1AEIAALq0//rR/xRKbS4bAGGOs1OE/QZvuIhtT6FUCTGNzr/CzpPE7tCPOtLs9YyKfERkeFYwEK9jAKvW9Wd3fj1EQr13GLeIYRs7XsHIWtTZle3p0N+4kFPB/2GVxidYhppddzmFzBiFzLC4KYyUvnOizr11ALVxGBgAGEKYpuAAACAcSURBVHja7Z2JW1RHusZh2vZgp20W6dAszdFusRFZFWTLVUDAIIkoBNcRRHGUERTBGDWJ27iM0WhitlGTGDOTZJJMksmdbLPeWe79v259X9VZaVS2BvR9n0cpTp9zquqc+tW3VAFJGgRB80fJyQsXJicl4UFAELiFIAjcQhAEbiEI3EIQBG4hCAK3EARuIQgCtxAEgVsImh4FBwdqK1JmTBW1A4NBcAtB0wltzwwia4O3JwhuIWiaqB1gqn47s9DK2w8EwS0ETYN6UlK8KQmSqKgH3ELQVLW/NiXBqt0PbiFoKvIEKxKNbcpvK4LgFoKmEtom0Ee2+cpBcAtBk3eSE29tZWJ5P7iFoMmqNvHWVlrcWnALQZNUT8psqakH3ELQZIPb2VPwCePW4/FkZq5Zc6bl7sdLlnx8t+VMXt4aocxMDwmDEXpkDcwmtwNPHLcC2yt3l5i6+xOTK8Gd+v1DT83jhxPBxDURc+udPWy9EzC4jwe3mZmZPz4reN3AEoVnf8wjcqcH3K3RFc4DeqR/zj4Lfeta+7c5+1Y3TOaJ+ubuy57JpvWkzKp6nixuhbVtIVw3PMui0oYWN7ijNd6ml/PjXe5PU0O80FtbzAe8LHlYL9jVYZyZFfauyqCv6XZQxMEDsrjRLGqRgxXeTdsk99lmzVtrvN6BMSDJ+ujGASrUyssiveYdHDIa4aBV1CzryMleZjveHT4QxwKbTbNX1zcsui97GtqYnf6gy7jPTUVUWk53WDXmuZZ5zS5pQzVm0+TRZa6aLcU/Knud/oCmTZsqZpfbiieN21PsHm949mkh4lbolATX4Dar6cDp3TUl8UZEIQPaHD7f0de7isCN+IS6w8USqnXmoAytL/KdC7q49Vf3+7ZGeRD7Y3W+jdEuHuT1u4I7equLueYVvqHwOjrazo1Y5/YAAteoQjoaKPH5+g6uIpMZoju80nRkjNNuNMKuAlHz1miam9tD2Rlx+LOaZqvuUPb5jnP11VRsLWzakx7/soNN5bK6s6JLacxtuc83tKfLZRP5Cbbzk+MHv2cdN+0yHWZ7aavZ/iDiHiXdi3KLXE2rnbCderApn66s1K4jG2c4M/VYcLvmzJKx3C65ZQdXjHZ67dExGIgBywNQq2L0Cgyy9apSabE2pVpOp4GBjdvmMB0bpbEW6aW7ty8le1qwWlymf0jXFlwW/1WSlYnUcLGw3NWE+svmwJVNoaormaHAmJkmJw6LrRV0y8bqVCe3uuyTm3Grabbqhs4Tm+upmBN0TExKjUu5M8epabFU7nk5cUvVLV/q9iE89GB54qvvYt5ecrbcVrOd27hHedIIc4tcTUvpGSRNG7iDk2EtXXQzNOQ49Lw2SW4Hnyx7e5eIXbLk8H+xDov4VtB7d6WNW0mBViUGUWTYjrDgMyDt1EuabQTqo9ulma1a4XT+0iW3wlGM1fFwXi3O00PrzdMat3uIUP5e142jlcSUHsm3wCO3XLqdkZryOAM3S3IiuTWrszXC7oD7pM+6jO5+drhQHa20xbZU3ckGzdk0Nyeh9ZfdE5NZc1WXZswmftmoQKmT29BGEQWYLrNeICeNMvrSHC0fn9u+fabfbjuaczBq9JlCGX+6NmbO1JR9SqmdJnAHJvGDe95ibUewwQGqd5Lc/vbRM8qPBbdnlri5Zat7ywZuu3zb/Pa7K4o1vT5NjYh1noDNv5TjUIy6egli66YPxcA9Kyf97vBl6eVleTedFR5xqQWWYRf1bh6cy70vOY36sGVDeAxrOetP7lducGtM1GEN3IifDKKwfV2Z+miUh3qj8MU3yqLVCK091u+THqgxN6ylfki/lL3ulwlWBikiqjtXT46rvWm26vikAiMmMOEwa47UZJjWXiUE6Gp6Xnr3Hu5d48BZ0Z4i0weQ7m5jbJsWqaL2uLlVNYeGB8WTiKW62tPbExQ1yxkta3XqA7kdrJsecCfzc0De1Mj6lPTBsLK8voNkbkWvyib1c0GT53ZLLun7z0XxGS7ufF7T2z65n/vR5/z5n9+91PnVH/nMndTA2396jl/Hls4i64K2vVToPHw9Idy2HD5M6agNGyS3oiC+PXy4xcatwOte9Jo0YrpgtVENVnKDmVtlMdsVt9IVpO85yix3+clsC9lzFK6oCGA1NaxEhmlXg3mCGUF7vZvM3JYeIIOstR833HK90isQVgEnWVOVB2umNE6pZprI3U85G5FTc8ScBaQvWWJ+zN57pIYR5hmlnUxvTtDVNHt1nDa67ILDqpnqCcSKtbJS8jEauP40lZfy2pJflQZWZsRBWTfuvsxLZYytmd3pjHhHpc0+lF2uPZDbgcHaiW0TnMa0lOhQKLiPi8X6uW2eSE3KtW3auf6aGU1MxeG289vNmz+5LyjUntn5m81C5drNTzu/EofIU9oiqBXkdpncandy6Q3d/Oa5n1sXtO39aPPmP7x76XcNieD27warMr5lhoXt/ftKE1xic7SwRA3ayHBPWA6fyHCG4Z01Vtdpoa1RNaoLlDkOWFHdmPiWkRHjuN1bZAyrCGWgPG5uQ8IMGUYtdLBahn0rpCERBi6nnw18iUrMnOuNFfNgZYNMpy2vXhsnvq1czcaxTHnokX1chfIbyKttLWQXNXzE9HI1N7dWdaIFvr5eryuAt2oWhlWv95Yzt8J4n9YO7SssVXmpreFrMgFe6I31qtuH1mdYeTvZfZmX8oypeUjwPMAOif1o9x6RWt6XZqQaHsStNJPTMJAmF5QWiYlmhyD3L/nnenqOaK9MIb5NmQK3TOPIB/8juBUosu588Lbmafv755o+8sF7YrC2vf9cuXFmZtve34kB1LbXukAX373JpnhnRiK4NXxjS9JntnFLs3/EHLSVhWm2MEtyq7UXioHSKwnVy5TlCXTJ4Zsah1t2HSn1E7ENK5l2cnLLFEq8coZj1+0rJdZ57YShbEoB+b6B4/mGTXfczWqEvIM0yXpfzS7VxmUcXKaZ0HFyqqw0LrdWdSrYP+6Ewzq5OfqSFspUNzokmGoatPJSnKLSRcJZIKyuWK4cltbCDHbTi+LFt1SzPiq8gnO9haXO9rRGRXr/IL8nP82ED+KWFJw9blNStl/25AhuZT5u46Tj22ngtm3v66lObjWdZsovyA5rOttYZW9v/4dOu/N/XTbQJbfC5+5KGLcymay0wcWtx2+LbwUNXrkWU1loH/shX6aRX6JRauZezKjXxS1/q6C38r46jWzOnzpUlSbXU8+rCLKsyGcuiliIyLstp6K0o4fIMRiH26UdfIdM/iZaZHy8zIw95WV8T4tbe9Ns1Tk5HcutkU1TtUd80ltWT4YsYmtsre1mjcYdpFfgPx6PWz5ZTo2BUudR/zpjab056rWvp881bo8Hd6ekLE2NlAl7u6Ou7mzdvrljb9ve7zzMuZmbn77Hb33k6psmtxzZinPLx3CbKHsrV4A2WPscNzzLq0E2biulxZRjpDlct16RSqoqkWNfMyI3AbQxXv1dtixzPD+5naNVnSjL4Sy+hxCx5ZcjvOIiuT2UbeJT5V7g4SklPrfj+MleMw2td0czNAe35BfnZK8107OWn2xrmq06fes2yWnDOH6yVi/3WZiLqxG+j+KWqJPXLHcFGpJbnjfH4bYsIx63gSKDW/mSCrb7nppxbicR33qXrtV8wQ6tT8a3wac2cj65L1g2O/HtG8+rvBS/8LZPL3Feis2wYY4NbtuufibIJmfZvEDFt7n/yE8Etx+rfLIlzid/bOM2xKDKWE8XDFWuKnaNITaHUfcCrcxPqRxLvLyUXL+tpOHcWkF3v8drqQU8AWw8S+mbFealVk0inDaJGOWkTU2ReQLnrAJscLLoNLnuO7TN2YjQepNFvb7IibVsVVWR4cOK6YUD6XxH08ZWZ7gNVl7KrLnRHulTeo1dFsltDq1kSXvrV9wGioy08hHOI3TF41bW3GXOaLajbG8j9WmOaW2muZ3U75VK3+bR9HM1tnxyyl8atJyUWcknf0QZY04z1cnFvivffd35dlxu9ZvfvL525IMS+wUqn/zXhKSlPHeZ28OHD0toRYG5vWvjVm3bkRkoSpIUWLuWTJpGzY3IVrgaoF1CDLnHvg4UM9aBOO8yFC7loFLsWpLbiMQyD+Wh+bp27wFarslnCkzPNlIfC+7YyIs0gVj/aXkCJ2bUik9zmPJSHPZp7dW0EWuFsxGiSy+f3r0vg33fcp/aciWStgeMu92L0vYs2Z6ak2I7lMwDW02zVdcaPSm2i1Wr7WKN25ULb9Us928Z012kV4bTnJcSC0wePmF/X2+T4tZ0zAtceSnZfVvNcj9ZU6nz6L2o6NyeJhe39qbNALcD0/CLV6fwgwlTWr8lGkc++IyKpturnOXnyuP6yaKw4gtyk51+cqK8ZLEOxNyKgFZiKwrMbYudW96fXGTtcJJbg+zcRvbFjoyZ3XlXrtq269p3YWxKpp0JMoul+8VWAWN/srW7mM51bNAtNW68ifcV8OZiGffyQog8KjdmyCKdEWffBXXpfKpmrMbwGgvvuzD2QNMJqj3NdDTV1TR7dbQ/eaDDWLgxUma2mvlJKGy3RlWczjU3nW8wGjww6uaW9zLzCfbu22vmrR0B99HRbPGE/S5u/c5s3nRzO5gyyxqcGrdiUceBoXZCPHcPfSLzUsIol9i4Hbn61095xccZ33I2K3H7LmRW2cbtLQe3D5MeCU6+BfpYJ2AC/oI+hb7r+oSb6XnELjzgrHOn58SGm2nm1hOcZWy9walxq9259LYdwy+Ei0wwZwhL/LpYxxj52loH4mzV9+wmu7i9+elz5Ql5fXl343F7d5FtHWi6CYAeQ27n9c8DEY0e6Q+rbRSfCxc59/tvv6Ysk8e+76Lzv0lkeXPlninrAuLWc+fSuoS8Pv65gg1PO9aBlpC5nRC30Pzjtj9oqH9auJ3HP38rreiWzhJjn2OusLVXvruf+8a/OYqx7XM0Px65KjdGmRfIdaC29997KSHc5p1a4t53seTUogm5ydA8VO1kUrEP0mPw+y48Ewl+PLPqY67Jy2txc9uyaCW4hSaeUcbvl0octwLcU05uTwFbaFIGF7/PMaHc5t36wcL2h1sSW3ALzZsI98n7/cmZDG7eTz/+8M+nn/7nDz/+RNSulL/SEdhCE4yZ8fcKEsVt5ppMwe1KqUWLFLZ50/ebWKEnRvj7QAkT/9bzPIvcPEUtsIUmFeLi7/ElhlsGl8m1BGyhyUifjb9/m/JE/v1b9XdGbOSuwd8ZgSZNLv7efMK4Nci1pKgFttDE1ZNAX9k7mV8j+/hw6yTXoBbYQpMKcgfUT9bNqOTtBybxAy2Pyd/RNMk1BGqhKZLbk5Awt6JnUj+G9rj8/VtPXGH0QVNBd3CgdgbhragdGJzsz47i71ZD0HjGYO42DdxC0PwTuIUgcAtBELiFIAjcQhC4hSAI3EIQBG4hCNxCEARuIQgCtxAEbiEIArcQBIFbCAK3EASBWwiCwC0EQeAWgsAtBEGzzW0e/YkdCIISqZV5U+I2CYKg2RG4haAnids8PDwImiXlTZrblXh4EDRLWjlpbhfh4UHQLGkRuIUgcAtBELiFIAjcQhC4hSAI3EIQBG4haP7oxFtCvzJ0QukF0qJFv3rtZ78AtxA01/TLnz1MJ8AtBM0xvfZQbt8CtxA0x3QU3ELQfFMykflr1muGjr521BC4haC5yu34H/8a3ELQnNPClS5uX13cUgxuIWhuaxa5XXjlncVCp04nvfAiFeqSkl8VhYsLk5Je+L04/mWS+kAceVV8aRFfF16hTzrw3qAnW4tm0d5eeefUmTMLFp8VeF48c+bM6aQTi0/dWrD4ovi+5cKCd1quyw9uLN6W9GrLl7duiE9W3hCfvHgR7w0Ct0dnzd5eJHiJ0zr22W+0dCQlJyctfLVlG9la9QH996polfi4WPy7Ls7Ee4PArcHtC8eOHRNuqPj/2HUbt7+aOXt7MSmZqCR3WCAr7K/03W+cSmZrzMgmv7r4CHMrzPG2pBfeWdxyAdxC4Nbk9sRiQ6bNnUlujfi2Q7rDCw1uFzK3CyW3fEayxa0A/QYdgCBwOyvccnx7o+XLJOUnJ7ETTH7yAstPvniGnGfTT05+4Uv5DQSB2wfGtzNoby8SuwtVXurMQspL3eA8lZmXqmN+zbzUot+3XLj1+xYklKEnWk+9MHvccnwrKjxruMPx1oFEfLtAmGRjHSjpyg1R+BIvDnqy9RBuX5tJbpMWjpdgchxPfqRLIAj2NjHcQhA0LfbWJXALQfPA3oJbCHos7C1+3wUEzTF7e4K4/eW4OgpuIWju6cTP8PulIAjcglsImnE9nNskcAtBc0vJbx09+osH6NdH3wK3EDTnwE2irfwPOiEZ3ELQPBa4hSBwC0EQuIUgCNxCELiFIAjcQhAEbiEI3IJbCAK3EASBWwgCt+AWgh5DbhcsWKBp+A//4b/E/zcFbjUIgmZH4BaCwC0EQeAWgiBwC0HgFoIgcAtBELiFIHALbiEI3EIQBG4hCNyCWwgCtxAEgVsIArfgFoLALQRB4BaCIHALQeAWgiBwC0EQuIUgUm2KVA+4hSYhj2/m6wg9hefsVkrPIGnegJt5bPEFcDtjyumf2Pl9e44bxUi+/Dq6bUJ30B8K/tboijn2lEL+tQmvM+J8MylB+aV2foC75tjixeOAC27H02iNt+nlfNfBgFeoVjKWs6/QW1tMJX+abaT0Vng38Ql+LyvNKnqX8SlZFXWKvt3DhfKQVpZh3qFMnssHhqxG+K2jkVfCqka9b7hQVZclL0uXxwt2dVhXbZL16VvD3lUHZHFj2LgxFdVR6rP3fL67EVxemursEtVhdDty0OgzPxRV5KNnrSeznLufk221UuhQ9rIxM45oxECDLGab3T8kOlrbYT34DvN84+mbL8zW56z0uNwO1s0LcJnbxbcSxO2W3M/46zO5ublvfHw9TjG386M/alrbXirmvi4GRNsnlzr/Jg5pt7d8nfvGXxvmwDPLajpwendNiZvbEp+v7+AqMhzN4fMdfb2rip3chup3BXe80nSEjm73kZ6yitJIdlcUm4TWxuE2Qme2r8s3GrFnnaz6Gh330NHCWI2qsTV6fn/fvmq6YYg+7tsj7+Nfp2YcqnnHxugRLlf3+7ZGi6hYEKsTRb6JXxQ3Rruo2Bjr94nq8p2NyMnOMNrOR7vDsv2RGmZZFKjPB5vKZXF/X6+XqssZPrlfPIkMF7etq7aZT4Iel9fNbTs/+HXc0aYVvqEwdz8n+6S4cfVaRl0U98VSjRdVmGa+sCGez2x9HofbgcHalNo5T+2FNQzui4nh9uY3ue+9xITu/M0f3r30xvNjips3f3L/uQzB7Uebhf7VoLW93/mV/HjLpe+//Tr3H/mz79StL2Isjri45TFSVUr/SQBKHNzqlTy0AnzUGjO2ohYZNoayZ3dmTvZYbj08NpmNesKptZAfZ/1l083eb9Soc/WyrTbbo3dvSrXX7OHDzWGqY5QmndYKgqyxOpX8A+pi+9IGOoHRW59h2kJuRKuJiKyTe09d3a7ObGR+C8j37yZDqdenGU9Ga9zucXArrvLYbuYPu7mN1FA/KwupKQVc5DPat+fTjYu4Ii5eMxopfY/mMDVrtM7Z5/jcyvTU3De2xxjcC4nhduTqV508jp557uf0HUHsLnruXHpbcPumYaE7xTse+bZOAPz6Wu3md/+efYMr+dOqugg0C2GL25xspmk5DXh/mj9qeKtyDD+A28Z1FqEei9t+4fwNmIAUSBLL6EtzlHGqKbeP9zR78ilgzButiteqFc6a+fTG1fkMOX3mswygZuKlBrk5C6lGOEnTRrfnGx/7JTtVXbYnphlTmpyJZAfZZd4oAbS7MN2bRmUb9KE9hd6TDWbEL2y89SZSzX7QjWUHVG9oFpG9b1/dEKfPWekiNojVubglBVPmPLaLGdxExbdbdi7e+5nJrWDyWpziyNU33dzquia51fQ58Nja080hoJNjK20IExLxr041BqQc+/4mdo4z2Fp1Zeqj0YxxudXrB4e93peNjJbJbdP5jnP1qxW4rRWSgcbYNi1SxT5ja+zDsBE5OiNqAxz2pRW+4tzYWaPm0FbyzKVtVr6A5iBN72ZMstIdjVWN8LSf7DWY4vavMDyS8uXMSqRGEapQC7VzN8qso3ogdlb44mxvC14WgaqKWcWHau6orO0/fa7eQlrOVTKuLVXm1BNqp6hEuR/qi3+dR3JrdcvWZxH0b6KaS+cdtzK0JXATlE+++c3ra//EjrJB6Gdxik57O3JVBb/aF7l/O5U/F56bGOT3oteU+RSDo1EixXkpTvmoab+duSXPTSvg8d5MeZdSMyWUbsspLZPjTQSRQ+EiN7dFDH2pWbtmXriJUzCVXhEu9lYXx+E2q0kNcunoUqN4Hik3czTblLESAaM1h0QMTsQ5uwjASo7b9fp0ZyMKvAdOn9tjBMyVhtcszLBeVq4YC8SKtbJSI63Gnau6JrNlGXTjYtPhra+m7kt3PlBkt/mmt0CfKBufZXRfG42qNJmwvyExwclpggICyW1ZqcWt1Wf5/hpVID5/uFXYjpOUmgluR66+rd1hR1kS2rb3d/mOIse3l94rl3kp/kAbeTdX5qVufnd/buSlxGAYLSxR7z0y3BPOMPNS53pjxRwd1olZPUonSIrYfFHSRCCzwkxGmdkhVcySg2/VWhe3fP+C48qUKdNFmaTde3jK4LUm3UQtzb7iYwzZRkVcwAo4qea+g+wKiJHdLpAyuI3sM6x7hJI/HvI5d10X8W5TmqMRnu4gTzeqSQV2L9rfJV0Ovd5brsjxRHa8UkilyqYDHn2U41dZpUR0SJpBAj5LzAWK29ArFd5VPVH1MEIHjfkpZHS/O0pZQMr3iVeSIzJizC3nCsZya/VZuhCm9Z4v3JrYXtASxe2WnZRx+mx8bjmf/LcjmsxL/Uu5aj99d7+Tvb2bf3439/W1c8HeahFjvhZpkjR7XqqAQ9T2QrEk1HvcpKiVcsMBNr08wcf3k7M4LtPLLsfjVnnny5VNk7BErLSTiOLyXdzqBU1mMBtQJwb4SS6vNhvRSDEpBYcRsy19Nbts6aZuzgNF9glD9bJ0JMxGiCjcTJFZDSc3WZxDzWmOvqSFMu3k+LmVWcJCbvqQivKpKUR1dq1FHffIk1UHC4QjPbRH2d6c4dh1q2mHslcYqS6tQJjhSvFsQx7pgPONx3Jr9Vlyqzz5ecPtw7Gddm5vfvPGbzb/4WszAxXXT75zaR1j/KY9lh25KnH13P6i89qsPzq/I9Zr9K7z2LhdLmkO+TKlt2zjtowH/SEyz+NwK4tqmLm4NapLtzMu3HDrauXxmdwKq9lh5cDV8AyUWqF3umzPMjN7JQPBrGiRPUesq/ZEfKYr0JgeJ5POkEqsC9n3LzcDW1sqySBUrIGxt+zg1ux+vVrUFl3KyS63HkZ3+LwjVKpK09QJfIvWwmVGfFtZqG5ROia+VX2WT9ts2vzg9hGwnXZuR67yoiw5yuPnpWT6yYpvb9/KV/b5yn7las9+PjnVslzN4ToVeTq45axmg+bwkx/KbauytxkP8JMNX9TgduyNDG71wLp8WzJH3czfZaW6081q2jlm1LmF3VEDspxBaUZLzWWeLpdDrOysSi4bXffzcjKnnHl1RltOvPM6jI1QOQnY/WTNBIkXgyu95T7jgcqHcSjbaErkw9Q43MqFIn42vGTtqyrxZRpvwvaQ+G7z0k9+BGynndstO59nU/qZufhDiLqKHibY5Pb2/3Z+Trnk914a+YBO2ZJbMtuPTg8xqM3hIzyU01RqRXHbbhhANfxVXoq4CLALnUUIx+dWGkUju+POSxU5/N3WiiMcXRNJo2RWc2qKnNxmLbU5u+Z0Iu9uW4ziCUCu3zJJciHUVse9inLTx011Ot2eIXoEoyr3ZSyIKn+Z14hs67dyNcZvrBwpBit5H0oWcRvhLHe72WxjExXHu2xJzUUt0dsVZkaa3XTdT75vwXGOxa85PYHmMJ3c3JPv6PN8zEvlPQK2083tzU/Z2b39H+Eoj7PvghAWkW6Dse9ic7kguvOjT+53vq3d/iL3jW/fvfRe8ew/PblVKU0a1VSKaT0qLyXWFZSxGlV7gP1ecx2oOUx5KU7M2DZJ2ddvs1bRrqVS9rPF3qNyuQeqzGtbBzKNX4GVlwrE+k9be5kKSuSN+auZ8jJpCNAGJrmVixoxFC41slyy2FpY7jN2X9HWqSFj32SowAwtjUbkZO8KWksprkUiBk7uEePqcmp22TZJddeooDjAe7II0XvRk0H7LiplhAOr6ShxK8wpNy2T8+IHjP1bozIvlaEZW6dWp7o8+Hbzhdn6nOWNOdaB+oOG+ucst2ceAdvp5la5uB7KKI+zz1Fwq3u+EJ+rfY7CQOttn9zP/f5zim3//HVu5+Hrc+Hx0XbXIjmTZ5hrNAHbdt/IvtgRw/qJfRdqdZ836NZZiz9eV4pK5H+NnQDLvdYmYN53YWy6tZxWcW7TeXYAeUexDPwC1k7kgH1TssUt7XOQN+NGxA6Yd4tddtesU9vV/uTu8MlUzcWt6FGFuszGrcqgyS0WXF2x2X21f1sLNF22tUftu+AN1dauZcVt5KC4bDc5H3L/slpKow3Vaq23e7jQvjH8ZIc78rb2ctv6zPsujN3X1s/xkebsPsdjj4DttPvJHpl9tNJNtk0U4++noD0XnLfkq3WPrs0DRYKJctof8vQmdrMH3UfsoNQncdk47dvt0aCJ68VHwBY/DzRlnqBx5AG2k7O3xy6cWaOBWwiaXxPeIxgEcAtB80/gFoLALQRB4BaCIHALQeAWgiBwC0EQuIUgcAtuIQjcQhAEbiEI3IJbCAK3EASBWwgCt+AWgsAtBEHgFoIgcAtB4BaCIHALQRC4hSBwC24hCNxCEARuIQjcglsIegK4XbNyETSNyluDYQrNOLd5i1aK86DpUvLKRSsxTqEpcfv/RMQHx0ct4v0AAAAASUVORK5CYII="},95860:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA5IAAADgCAMAAABGral3AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAIcUExURfD2+v7+/tPT09/f3/Dw8Pv7+/b39v///1OE/u3t7f9ZWczMzL6+vv8AAOTm6OLi4v//0ebq7NH////9/+uva63m/9DQ0YsrilRVU+z//0LgaDQzNK+7zvb//4zO/u3y9f/orfX19f/NjO7m3uzw8vL0861naP//9uXv+mmu6///67u8zS2N0Nra28LY+2pprY0yNP/+41yL/0pQU9H0/t/h5Pr6+m4zM//psa2+2M/e/LOwtNCMK9z4/jMyj+v2+8XFyLjq/5aWlcj3/4fF99uiVeT7/57Y/1ZNRdXW1/Lv83267rnV7DpAWLy9vE9ag//4y22PyX9/f2Op4U99vr/1/ysrK7HK4Z25/P/WnG+y7FCLy4Km/s+OaPbEhrd5UvDt5lOE/8fs+H9ZSvHj//bNj//vv86NNVGb1fD27f/51+25fYfsoF24//D34sWHTjI1h//gqFVrsGnlhnBRi1E9NjBssN/Pz7Z3NHCd/pCw/fbarZJrUe/t8TY5cZNUamuW/s6lcDJhqNjr97uNZzNOmDA3TlOE/Yiu0phbO+ja1OXKq8DK1ExPbYE4as7c6GY5VVuBrEdumuTW/9KTTduxj4tnrV2X1PT1/5FEfsax/v7s///796elcVZZpf7jwDCBwJzK66GO/pZfjKhcg22QnF7Hd4OE/qzxvfxNO3R3ZLeP/tAqL7fvz9LP1YSEhIGQb5TtquzfxOz5yt+iR3QAABP5SURBVHja7Jv9TxPZGsenS+lJU1NlqbVYixQsFbRKUywSQItQ6AsIisJFIxgI4MJmBRUgkXAjghHVFQ1evYmubnY195e7u/fef/A+z5npG7QIQrWx34/SDp0zM8+ceT7znDNVRQAAcggFXQAAlAQAQEkAoCQAAEoC8I0oadAbAQBfFr0hk5IKAODrACUByH0lDegXAL4ShnRK6tEvAHwl9OmUNKJfAPhKGKEkAFASAAAlAYCSAAAoCQCUBABASQCgJAAASgIAJdEvAEBJAACUBABKAgCgJADfnJI/HTtE9J1VKvj90AlFeUSfdJxVlAp677uvaCs6FGWW3urpXbnOa46ilwHIipJ9RUV/kIoVhzqKioqOKo8O9T2z8u/H6p95jtU3yRVm06EhZbZ+aK+J3HSZ6p+F2VEAQBaU7FBfKrhCKuxbm6Ic5po4xBVSW8Evs/W1vLr2h0D9fXQxAOv44Y8nRMeuKPlIVkkaljZx1VR3H6DBrPxNKjkrq2QtNx3iIW39s7O4BACkKBmQk8Bdmku2yfHpUSWtknIueTahpKLsfcLTTwBAFpTsKzKxa4mBa5OikJuz6oc8cO0wB/jD2MBVqbivrQYAZGMueZ0rY/LjHVPq4x357EeJP96huSSvaUM3A5AdJeVMUR2f9mlfgijJX4KcUFxWKoqJL0Ge0AKe8ACQDSU3gjkiADmlJAAASgIAJQEAUBIAKAklAYCSAAAoCQCUBABASQCgJAAASgIAJQEAUBIAKAkAgJIAQEkoCQCUBABASQCgJAAASgIAJQEAUBIAKAkAgJIAQEkAAJQEAEpCSQCgJAAASgIAJQEAUBIAKAkAgJIAQEkAAJQEAEoCAKAkAFASSgIAJQEAUBIAKAkAyKqSp6yBPTlAwHrqU2dm9lhNOYDVY948zsNH9EaQb+iPHN4dJU8FrGaDTnx1dAazNbCplGarx+jPhUj9Ro91MykPG/V6+gvyCr7oR3ZDybBJL3IGvSmcOdELwq7cidQVLsgYKF8dl9MA8guni63cuZJhq07kEDprRicLPLkVqSeTkzRodRn8fn+hvxDkC3S1/X6DiwavO1XylCmn8pwy3ZRh7GoO51qkYXOGUSsbWagDeQZ5SU4aD+9QyYBe5BjGQHolra5ci9RlTRuoS69nI4VOgHyCrjg5qU9fJreu5Clr7p1a+ueuZk/uRZr+uate7+IaiRzNPyl1hQZX+tnk1pW0mnPvxMxpi4/HmHuRGj1pe9/o9EPIPJXS7zQad6ZkwJB7p2VIO3K1+nMvUn/am4dRT0rCyfwsk36nfodK7vnCqWPaynntSRepKRcjNaVX0lAII/PUyULDjpUUuZfoIr2SuRhpJiUxcM3bgSuUzE0lUSVRJaEklARQEkpCyTymMPydRtifJSXdL0P2p78KYbEzx4XlzPdClNPL6Tr+oFRd0dWsNe+f7qHXfTV2e+eFpqQF2bozqu2H97HbSu6ruSK8c8u1wrs0bX9OhxybbKGP19YdC0qCrN60z8UxZUdJXfDBw4Ile6t4E7lb1xp5naxkayQScQjL5FDkvyszDlXgMfvy96xHj/7xynJTYoFbVywtNMvmkYjIjpLBhf1CZ1n49fHKDYcYs0eFGK37lpV883pr7Ypn2z7d5vHQrudn8fixkkxrTnyZSIrH67+okg0fb59XudiQHSW7a3qEzj222MaFrpQ+SFKyVLaQH1i0xO+uebjarupBDaKJBdmaXyxpFElJdKPHqS44U/8dwBaUHFnlkILLl+UHdHdooqKcPSUzRbodJUfnfTx2SGbkqiPpt30HtPgtnTbfBZngd4d9C9TJ4vE83YGSmu2r8dlstktpJIjvJE71NV/ohcz88XmfOsa5tj82LAq9qKWFd/M2NbSRVVvX/tTN3Wvy4k+EQpc2lb3spBZNY6kWI/10/532ZqnSmgQpZtuDdtm07E5tIpJ409FhajEdFd5K+qW6MjkU6goewlGL0AObLSrK6mxqL1FvEdxLZRdih7H7bL8k90P1oE+22E0MHw8evO3as8flcmVLyf5O7gELjwE1Je3ayJOHojMlqo3uuRm16yeWm8aOO1QTvXPHEwty4wFKId7+ymaJ7jFZZaY7rSbP9pT8UEdXVujGV+xd9ZTVY13DreMrtuwpmSnSrSupG/15v+j+rXmTIyaUpBy2vKLz6u9qofxtEt6GgspUJQ98/6mdxJmgazBwyZFI2biSa3RHsPQ4xOidFkpaumpTdLx3Dx2pm9s5F0ZutQnLje0q6R0sFQkl5T+fGKBjUlMpYLKSalO5owsOoeNmKTcs2X0N8qZQfjx2PPfaldjui+PnR4dJlZkP8I822WI3jbx9kBDnztHyl1OSB54D2sBViTmq3a69KzfIu8tpleRmV9Rx7uvNEp0SnDNde9uOkvaeucUmXrx+b5puEWMz9xbpT/aUzBTpNqpksEcL/ue/bKHnnFv9tpBMLu+gL8S3+xQlvZSz7rFW7UIXV2dQsp9ds/SICduZwLxtupTWvLVNk87lL+afPpn3aXk+wTYFqbzw+4Rt2scL3f9s0Y7HFbKM9iSPV0y5+04tSTLz52gf7ps8IOL2VKx8LO1aqyxj1YOh9y+H+WYY9yxJyWvy8JYPw6HYE4hR3kfZyZ/U04lFEm/KvfE7j3yqK5vdlc1qcex6WyXPkSLj2JKUlIsx4/et0Pmpx9F6y3vPZpOjgAmbXQ4p3Pd8oeccZOMH24bhwOcY+R/juXPG7CnJA1ex+cB1cuhunVb3pqZZvGjagWvr9blYUd18hiZTfEOeb0HJqw4+UvH4fQqQZq1jM/+rsUctWZxLZoh060pWD7bHgqdktqgFQE0u9mW2aZ2SorGVHLgc3zyDkpzAcpRHfVLCNvDu3XOtonzyMv3tv8Wlq7F3uYWrx7oqKXWOH2/qVom3UhPHTcF6n/Da8d9apGIcCZ/CaSqo7pvUfoo2nuK9lz+IynDYs/bUKvl2UsZvoZTq/0UWOPfNVmnToHpDTVRJrSn3hnrrGnnV/4qTkoojH889VxrvyqQqeTOaNC5OjAK03iqM0EleVaukLOHc7VOrrCQvqEPnnRj5ozh/8eL57Ckpgp3q4500SvLjHfV5T3BB7bu1xfuRyNpim3yqM7yoPd7hBd54qi6qVdmIQ7yRP0L+rHtowkm+Ic+39HhHBCdb3GudDx8N0jRybKYkuNyUTSUzRLoNJWNOSZu6D7Qkkuv0nRNUB9crSS9Jg9D1Stb09vbKJA1GyQwHf0rX5WUzvdOey3tE+UwJJW1sNDkhjVinpHp0GUAzjW/eO3jPFrlfC80buSK5qXjFFJOyBas0G/heEOTbc/l7Bw2s22hyOK9O1xoptN4zHONVdajLBc77uzzhgfdyAF3XczOaomSsqSyP2rsseAMcY3mVPP/y3t6qJCXrensXuF5TxL3qZGq9kt6l6c6/5E1JVTIxQ+VzUl+2x7/+nWzkR6Fr+PPPBl3WlNS90b4ESaNk4luR8RV5g++u4T6dWm1P9yVIKT94adHmoqVipLNdDMif/RueYzq/M5nCzs944qrrrrkhqu9Nyy9lSMnRv4msKpk+0s+pkpzdWs6oyaUbX3oaFZ9XJcXoSYc0Q/2kWH2n/aYqKZNRZKqSNDq0v1jqEWqVlJl6d76Ln5MO3IhVPa1KypXdfAzLFbU5nwPbW7Zaqu4wUSVbxuVIlk9Hjb9bPaGyk22jWomKVUmtKZ+PGrFO7RvZFeWxKmmpSqmS6vEyV8m1Hp4EJ5RMdH1jacqGW+VHLowJIy8K596Cgr3O7FXJ7f/vBZ22SXzDTfego4wxbfy+NVy43S9B4oeSUwt13q7b5dn71iL9nLnk/9s7G9e4yTCA16WadGpiKCurUI9hauvQU2831YxSp5sVZCp+ccI5W626Tor4iT0FOjYYKkOliGNFBxuyD+f/6Ptxn2uT3uXetMnd7wd3u92lSXrNL8/7PG/yvluipGrQvXaXkmfbc8kYJWce+08d5413tig580c5QslmLqmqsdff1dtrbEnq8+lzMuK994TKJcdlLnmy3sYVZ96nPlFGNH4HuSl12mmvuKpFmkrqZquOsvWo2Kq46rW1vhL9ohEl9df32SMdSurtRSqpnvVJyVCU1I3VRqv12Fu2J7tAvPSU3JXuVRP9ktnZ0x6UlCVDeUw8JNsXHbnk1RdEy/LxTiVnzsklZAX0zevllpKn69XTtibt6dtqXZFK2idl8VLFiuYhKw5teQZTn/yp9mRGlVdkhVemn+O/iPPBheOtCuo9n3z1yhe3z9gqlzysWp0zF26fsDuV1K62Kzkj66hNJevWqUXrUVHvSXPRNsH0emUu+cyHj+uv73kdWlu5pGqytyn51KQ+STeipEirz3032ZZLvjNp/6BySfEiQS6pVVyp55FCSeuYwELJfCppX/3xyBEVC/+qV1wbB5fsOPxdNf1lZ+MZ1dN2qtkveWlB1mZlT9trMjsSP1vu6Op4U5aLZE1R9zluVfLwB6fU6psVV+HGtwflcTxz7lVdkRT7pnO793/Tb3z6o66r2s1g8vmrB1UVoVFxFecCWZs//KFYqeof1eWWE51K2l/+PddU8qGnZQ+i2EsVuXRaqfekuegWJZsVV/t58eLAlvLOiXYln/n+1Bsvtyl59qcjl16S22pVXL89+I+uuH6cpOKqw+PD9WAplBybEIyhZE6V3KbjsNlKi0wMtkkG7mqhn73ebQYdvU+Hj83tsIj84P23O95SFdFdQTZc1a9tIjlRnSwJKjvNbLJhpFByeswVjE2j5MAoefLt/vfz9BkDv2yCY111Ve6ikqY4LRu7iZWsO6mKPMfeej3lC+pQMk0lH9xv79ePX+v/2rcevFPe33o/4ePOQv/rSPK49c3ebLe/R/07/1n/P6mTykh7onXZ+YRJJRnoo5897SFK5vEAHvRHIm5+fVO/eDadm7MYDqsfoobD4uasYcWAkgwa2Q8Rg0aiJEoytPLesP3QygyHNcRK9j8cVgYnIBjN+wQEREmiJNP07M2eRkzTw9DKw2ukgaGVmcwu+Z5GTWbHBATD3HDtewICpnxN3GqNnPKVaXqGN0gamKaHidGTnQvjJkYPmMxuOIU0M5ldo+764gMZ4MWJWCF13XXi/gww8aQbs5NM+Tqsc74amfIVzMPE6EyMjpLZYnR0bHT60H0wVBw6NC3+7qMjKJnJODkmrYThQv7RgxGUzG7jFYaN0aAwgpIAeQAlAVASAFASACUBACUBUBIAUBIAJQEAJQFQEiUBUBIAUBIAJQEAJQFQEgBQEgAlAQAlAVASAFASACVREgAlAQAlAVASAFASACUBACUBUBIAUBIAJQEAJQFQEiUBUBIAUBIAJQEAJQFQEgBQEgAlAQAlYegJfNfzrP7xPNcPet98sVJdLzm9U1qvVoooCYNGwTVhY5uXbqGXzYe1JDa2eVkLURIGSkhpkR8UzKwt8KXf3UsZVpVXFxP6qH+uGqIkDAq+9LFgVnJppd/dshXHWXL6RayhgpIwGCGye3l6Fr0Lz8M1xxRrIUrCAFR1vK7MSea6t2Odp1gyZqRzsVRESci9kZblprZy17J2cLJootHa1ngtoiTkvtXqp7h6f4cIHBqMkTpOhigJucZLMUbqOOnFfbxmMEbqOLmGkpBn/HhjjDgfE4UrjnkqKAk5brZaVmEPNxE6aRCiJOQWN9VEshGII5vG1VSUrKIk5DdIeruwFS8qTIaGE8lGOhmiJBAkk4TJmpMONZSEnOKlnknGxuJSSkqWUBLySWCu3Trtz8aZv+31AkUnLYooCbnEj2u3LnqWdXS221U9as32vJ24HpDVV2z78hWj/SAoCTlIJaOvdlu0LNfr2sn5WCWD7ZPJavTdWKW58eVwavzfhPdqVVESBi2VnPakjWMyuo3KcOmrSCheufPq03oEHW28iFUyIplcjwmSU5slZ7Uik80DU7a9fM1xjtsiaJbHr6kIOi7fiWYdJSGnSkZ+tNIKbIue6yrvHrWOuvpaHPFKRND5kRVPhlJpaaySI9srGVfdKdub9fuay5fDWXtDiCieVieXpZHjG2V7uef6DkpC5rGsmHZrW1szKCjj5JN6f8UTOgbzcik/CLyjszsque2GYqVamBfB8YaMeGu1NWmiM7d5Y0FGSuFmrabCZTQoCYOm5IoMgs2sUlDXTkXPZgjVH1kpKOk4S2vHZShcnbPtcRUTD9hXyps35L+S+DwTJWHQlNS55KI/L1/5vteppIySYwUVS33BvHElT5y/ohJKx1mwN4rFKamkaLVObTgqShYFN1AShimXbFVcp1W+2KFkZy65c3mn51xyaXXSXg7nZQr5iC1zyWWdX6rQKHPJ8/deIZeEQVQy+uKdgmyUKtsWPSlgh5KpV1yXVHt1Q0hb+kjklCqXFHZulup9llRcYSBxrWBXttN7v2SbnEv0S8LQ4O/KVeeJrt5J4S5mlITME+zKvVlc4wpgIpk0B3eCAHSdTHK/JECGYFQBlIThC5OMvQPQQ5hkhDqALME4rgDZgtHOAbLVdB2sOUEc5gSBvMPMWQAZc3Jw5pd0mF8SBqTtyizMAFlCyuObjZQFv3vRKyYar0vRtVaUhPwFSteyhJWBGS0LgfTRcrteW33kq4sJbdQ/Vw1HUBIGSUrPMonn9qR3WOsvpSzVwp02gZKQuzqP73omvPQ8109wb3SxUl1P4mVpvVopdrF+lATIFCgJgJIAgJIAKAkAKAmAkgCAkgAoCQAoCYCSKAmAkgCAkgAoCQAoCYCSAICSACgJACgJgJIAsGdK7tu3z7Z54omn3X/aXkkbAPYGlATIrpL/A2Tjp6eND0hIAAAAAElFTkSuQmCC"},91581:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/04-min-7eb9f3330355312efa81e47ffc75123b.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/b0cbc1d4.d81e2929.js b/assets/js/b0cbc1d4.d81e2929.js deleted file mode 100644 index dab2f5a84e9b..000000000000 --- a/assets/js/b0cbc1d4.d81e2929.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[3667],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>u});var o=a(74165),n=a(15861),i=a(67294),s=a(87152),r=a(17145),l=a(67425);function d(e,t,a){return p.apply(this,arguments)}function p(){return(p=(0,n.Z)((0,o.Z)().mark((function e(t,a,n){var i,l,d,p,h;return(0,o.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return d=new s.U(i),e.next=21,r.G.create({provider:d});case 21:p=e.sent,(h=a.split(".")).forEach((function(e){e in p&&(p=p[e])})),e.t1=h[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=p.toString(),e.abrupt("break",35);case 29:return e.next=31,p();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+h[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function h(e,t,a,o){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,o);break;case"precise":(0,l.Precise)(e,a,o);break;case"blocksToDays":(0,l.BlocksToDays)(e,o);break;case"percentage":(0,l.Percentage)(e,o);break;case"arrayLength":(0,l.ArrayLength)(e,o);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(e){var t=e.network,a=e.path,s=e.defaultValue,r=e.filter,l=void 0===r?void 0:r,p=(0,i.useState)(""),u=p[0],c=p[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?h(s.toString(),l,t,c):c(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,n.Z)((0,o.Z)().mark((function e(){var n;return(0,o.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t,a,c);case 2:if(void 0!==(n=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?h(n,l,t,c):c(n);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(r){console.log(r)}}}),[]),u}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,o){var n=void 0;if("polkadot"===a||"statemint"===a)n=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");n=6}e=parseFloat(e),o((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(n)+" "+t[a].symbol).toString())},Precise:function(e,a,o){o(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},14374:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>d,default:()=>k,frontMatter:()=>l,metadata:()=>p,toc:()=>u});var o=a(87462),n=a(63366),i=(a(67294),a(3905)),s=a(47940),r=["components"],l={id:"staking-dashboard",title:"Polkadot Staking Dashboard",sidebar_label:"Staking Dashboard",description:"Everything about the Polkadot Staking Dashboard.",keywords:["ledger","staking","polkadot","dashboard"],slug:"../staking-dashboard"},d=void 0,p={unversionedId:"general/staking-dashboard",id:"general/staking-dashboard",title:"Polkadot Staking Dashboard",description:"Everything about the Polkadot Staking Dashboard.",source:"@site/../docs/general/staking-dashboard.md",sourceDirName:"general",slug:"/staking-dashboard",permalink:"/docs/staking-dashboard",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/general/staking-dashboard.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696484972,formattedLastUpdatedAt:"Oct 5, 2023",frontMatter:{id:"staking-dashboard",title:"Polkadot Staking Dashboard",sidebar_label:"Staking Dashboard",description:"Everything about the Polkadot Staking Dashboard.",keywords:["ledger","staking","polkadot","dashboard"],slug:"../staking-dashboard"},sidebar:"docs",previous:{title:"Dashboards",permalink:"/docs/dashboards-index"},next:{title:"Polkadot-JS",permalink:"/docs/polkadotjs"}},h={},u=[{value:"Overview",id:"overview",level:2},{value:"Stake",id:"stake",level:2},{value:"Pools",id:"pools",level:3},{value:"Nominate",id:"nominate",level:3},{value:"Payouts",id:"payouts",level:3},{value:"After Staking",id:"after-staking",level:3},{value:"Validators",id:"validators",level:2},{value:"Support",id:"support",level:2},{value:"Network",id:"network",level:2}],c={toc:u},m="wrapper";function k(e){var t=e.components,l=(0,n.Z)(e,r);return(0,i.kt)(m,(0,o.Z)({},c,l,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{title:"Preliminary Notes",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The ",(0,i.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/#/overview"},"Polkadot Staking Dashboard")," supports\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-proxies"},(0,i.kt)("strong",{parentName:"a"},"proxy accounts"))," and you can import your\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced#staking-proxies"},"staking proxy")," (for nominators) or\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-proxies#non-transfer-proxy"},"non-transfer proxy")," (for nomination pool admins and\nmembers)."),(0,i.kt)("p",{parentName:"admonition"},"The dashboard also has ",(0,i.kt)("strong",{parentName:"p"},"native ",(0,i.kt)("a",{parentName:"strong",href:"/docs/ledger"},"Ledger")," support"),", meaning that you do not need an\nextension or a wallet to use it; you just need your Ledger device.\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-extrinsics#metadata-updates"},"Metadata updates")," are thus not necessary, as you\nonly need to keep your Ledger apps up-to-date."),(0,i.kt)("p",{parentName:"admonition"},"Before using the dashboard, make sure you have a\nPolkadot account in a Ledger device with the\nPolkadot Ledger app installed, or a browser\nextension such as the ",(0,i.kt)("a",{parentName:"p",href:"/docs/polkadotjs#polkadot-js-extension"},"Polkadot-JS Extension")," or\n",(0,i.kt)("a",{parentName:"p",href:"/docs/wallets-and-extensions#browser-extensions"},"other third-party extensions")," with a funded\nPolkadot account."),(0,i.kt)("p",{parentName:"admonition"},"On top of the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-accounts#existential-deposit-and-reaping"},"existential deposit"),", you\nneed some free balance to pay for ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-transaction-fees"},"transaction fees")," and the\nminimum amount to place your nominations (only for nominators, currently\n",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)(s.Z,{network:"polkadot",path:"query.staking.minNominatorBond",defaultValue:25e11,filter:"humanReadable",mdxType:"RPC"})),"",")\nor join a nomination pool (only for pool members, currently\n",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)(s.Z,{network:"polkadot",path:"query.nominationPools.minJoinBond",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"})),"",").\nFor more information about staking on Polkadot\nvisit the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking"},"staking page")," and the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced"},"advanced staking page"),".")),(0,i.kt)("p",null,"The ",(0,i.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/#/overview"},"Polkadot Staking Dashboard")," is a tool only\ndedicated to ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking"},"staking")," on Polkadot,\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-comparisons-kusama"},"Kusama")," (Polkadot's canary network) and\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-networks#westend-test-network"},"Westend")," (Polkadot's test network)."),(0,i.kt)("p",null,"The dashboard is not a wallet, meaning that you cannot transfer funds between accounts. To fund\naccounts, you can use ",(0,i.kt)("a",{parentName:"p",href:"./wallets"},"supported wallets")," or the ",(0,i.kt)("a",{parentName:"p",href:"/docs/polkadotjs-ui"},"Polkadot-JS UI"),".\nYou can participate in staking by being a ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nominator"},"nominator")," or a member of a\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pool"),". 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\ninteract with Polkadot's native staking."),(0,i.kt)("admonition",{title:"The dashboard is a Web3 dApp",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The dashboard is a decentralized application (dApp), and to login you do not need to sign up with an\nemail and password but just need an account created on the supported non-custodial wallets. Any\ntransaction to be submitted needs to be signed by you. Also, if you use light clients, which are\nresistant to censorship, you interact trustlessly with the network without intermediaries. Welcome\nto the world of ",(0,i.kt)("a",{parentName:"p",href:"/docs/web3-and-polkadot"},"true Web3"),"!")),(0,i.kt)("p",null,"Note the pictures on this page refer to Kusama, but the same applies to Polkadot and Westend.\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",(0,i.kt)("a",{parentName:"p",href:"https://youtu.be/hvXLc4H7rA4"},"Walkthrough Tutorial"),"."),(0,i.kt)("h2",{id:"overview"},"Overview"),(0,i.kt)("admonition",{title:"Staking Dashboard Walk-through video tutorial",type:"info"},(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("a",{parentName:"p",href:"https://youtu.be/hvXLc4H7rA4"},"This video tutorial")," shows you everything you can do with the Staking\nDashboard.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"dashboard overview",src:a(49083).Z,width:"1920",height:"1080"})),(0,i.kt)("p",null,"This page of the dashboard has six main panels:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Section A: The Sidebar")," shows which page you are on (in this case, the Overview). It will also\nshow the role you currently have in staking (in this case, active in both ",(0,i.kt)("a",{parentName:"p",href:"#pools"},"Pools")," and\n",(0,i.kt)("a",{parentName:"p",href:"#nominate"},"Nominate"),"). You can also change the ",(0,i.kt)("a",{parentName:"p",href:"#network"},"network")," (currently on Kusama).")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Section B: The Accounts Panel")," allows you to connect one account to the dashboard. Once\nconnected, the account will appear next to the ",(0,i.kt)("inlineCode",{parentName:"p"},"Accounts")," button. You can see it here if you are\nactive as a nominator and/or a pool member. In this case, the account KSM Stash is a nominator and\na member of the pool Insight Finance. Proxy accounts are also shown here if applicable. Note that\nthe dashboard will automatically fetch the stash and the proxy."))),(0,i.kt)("p",null,"Note that Sections A and B will always be visible while you use the dashboard."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Section C: The Stats Panel")," shows the general view of current staking metrics, including the\nhistorical reward rate (including after\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced#inflation"},"inflation"),"), the supply staked and time remaining\nin the current era.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Section D: The Summary Panel")," shows your current situation and gives you general tips about\nstaking. In this case, the KSM Stash account is a nominator and a pool member, and by clicking on\n",(0,i.kt)("inlineCode",{parentName:"p"},"Manage >")," you can go directly to the ",(0,i.kt)("a",{parentName:"p",href:"#nominate"},"Nominate")," and ",(0,i.kt)("a",{parentName:"p",href:"#pools"},"Pools")," pages,\nrespectively. You can take actions such as changing staking preferences, bonding more funds, etc.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Section E: The Balance Panel"),' shows the bonded amount distinguishing between "Nominating", "In\na Pool", and "Not Staking". The amount that is not staking is further divided into "Free" (a\nbalance that can be transferred) and "Reserve" (a balance that is needed the keep the account\non-chain, see ',(0,i.kt)("a",{parentName:"p",href:"/docs/learn-accounts#existential-deposit-and-reaping"},"existential deposit"),").\nIn this case, 0.301 KSM are bonded for nominating, 0.3 KSM are bonded in a pool, and 0.145 KSM are\nnot used for staking. Of the non-staking balance, 0.144 KSM are free while\n",(0,i.kt)(s.Z,{network:"kusama",path:"consts.balances.existentialDeposit",defaultValue:333e6,filter:"humanReadable",mdxType:"RPC"}),"","\nare reserved for the existential deposit.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Section F: The Recent Payouts Panel")," shows a bar chart with the rewards paid out to you in the\npast 15 days either as a nominator or a pool member (manually claimed). Note how the 4th of April\nbar has the tip that is not filled with color. This is to show a pending payout (for nominators\nonly). Below the bar chart is a line chart showing the 10-day moving average."))),(0,i.kt)("p",null,"Additional statistics can be found at the bottom of the overview page."),(0,i.kt)("admonition",{title:"Pool funds are in system accounts",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Remember that funds bonded in a pool are transferred to the pool's system account, which can only be\naccessed by the protocol, and not by any individual user. Some wallets might not display the balance\nbonded in pools, but the dashboard will always show it.")),(0,i.kt)("h2",{id:"stake"},"Stake"),(0,i.kt)("p",null,"In 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."),(0,i.kt)("h3",{id:"pools"},"Pools"),(0,i.kt)("admonition",{title:"Joining a Nomination Pool - Walk-through video tutorial",type:"info"},(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("a",{parentName:"p",href:"https://youtu.be/dDIG7QAApig"},"This video tutorial")," shows you how to join a\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pool")," with the Staking Dashboard. You can also read\nthe\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182376-staking-dashboard-how-to-join-a-nomination-pool"},"dedicated support article"),"\nabout joining a pool.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"dashboard pools",src:a(86214).Z,width:"1920",height:"1080"})),(0,i.kt)("p",null,"This page of the dashboard has four main panels (Sidebar and Accounts Panels excluded):"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Section A: The Stats Panel")," shows the number of active pools and the minimum number of tokens\nneeded to join a pool and/or create one."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Section B: The Balance Panel")," shows the number of tokens bonded in pools and those that are\nfree. In this case, we have 0.3 KSM bonded and 0.144 KSM free. In this panel, you can bond more\nfunds (",(0,i.kt)("inlineCode",{parentName:"li"},"+")," button) or unbond some funds (",(0,i.kt)("inlineCode",{parentName:"li"},"-")," button). Unbonding will withdraw unclaimed rewards\nand funds will be locked for 28 eras\n(28 days). Once the 28 eras have passed, you\ncan unlock the locked funds (button with a lock icon) that will be available as a free balance.")),(0,i.kt)("admonition",{title:"No fast unstake and pool swap for pool members",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Note that the option to fast unstake is only available to nominators. Also, to change pool, you\ncannot simply swap memberships. You will need to unbond and go through the whole unbonding period.")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Section C: The Pool Panel")," shows the pool id where you have membership (in this case, Pool 82),\nthe pool name, and next to it, a ",(0,i.kt)("inlineCode",{parentName:"p"},"Manage")," button that will allow to choose between different\noptions:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Update Claim Permissions: you can allow other pool members to compound your rewards, withdraw\nyour rewards as a free balance, or both. More details about nomination pools and updating claim\npermissions can be found on the\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-nomination-pools#claim-permissions"},"dedicated wiki page"),".")),(0,i.kt)("p",{parentName:"li"},(0,i.kt)("img",{alt:"dashboard-permissionlessPoolClaims",src:a(70359).Z,width:"651",height:"272"})),(0,i.kt)("admonition",{parentName:"li",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"For more information about how-to update your claim permissions with the staking dashboard see\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182399-staking-dashboard-how-to-claim-nomination-pool-rewards#Permissionless-claiming"},"this support article"),".")),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Leave the pool and unbond all the funds in the pool.")),(0,i.kt)("p",{parentName:"li"},"If you are a pool admin you will be able to see the additional options:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Claim Commission: you can claim pool commissions to an account specified under Manage Commission\n(below)."),(0,i.kt)("li",{parentName:"ul"},"Manage Commission: you can manage the pool commission rate, maximum commission, maximum change\nrate, and minimum time delay between commission updates. More details about nomination pools and\nmanaging pool commissions can be found on the\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-nomination-pools#pool-commissions"},"dedicated wiki page"),".")),(0,i.kt)("p",{parentName:"li"},(0,i.kt)("img",{alt:"dashboard-manage-commission",src:a(42069).Z,width:"650",height:"645"})),(0,i.kt)("admonition",{parentName:"li",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"For more information about how-to manage commission of your nomination pool with the staking\ndashboard see\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182388-staking-dashboard-how-to-create-a-nomination-pool#Pool-management-options"},"this support article"),".")),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Rename Pool: you can change the pool's name."),(0,i.kt)("li",{parentName:"ul"},"Lock Pool: you can lock the pool so that new members are not allowed."),(0,i.kt)("li",{parentName:"ul"},"Destroy Pool: you can destroy the pool. See\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-guides-staking-pools#pool-destruction"},"this wiki page")," and\n",(0,i.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000182388-staking-dashboard-how-to-create-a-nomination-pool#How-to-destroy-a-pool"},"this support article"),"\nfor more information.")),(0,i.kt)("p",{parentName:"li"},"You can see any unclaimed rewards in the middle of the panel. You can claim and bond the rewards\n(",(0,i.kt)("inlineCode",{parentName:"p"},"+ Compound")," button) or withdraw them as a free balance (",(0,i.kt)("inlineCode",{parentName:"p"},"Withdraw"),' button). In this case, there\nare approximately 0.0012 KSM that can be claimed. You can see the Pool Status at the bottom of the\npanel, currently set to "Nominating and Earning Rewards".'))),(0,i.kt)("p",null,"Note that if it is the first time you log in to the dashboard, you will see two\nbuttons\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"Create"),"\xa0and\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"Join"),", instead of ",(0,i.kt)("inlineCode",{parentName:"p"},"Manage"),". For more information about how to create a\nnomination pool, see\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182388-staking-dashboard-how-to-create-a-nomination-pool#How-to-create-a-pool"},"this support article"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Section D: The Pool Nominations Panel")," shows the nominations of the pool you are currently in,\nhighlighting the validator that is active and will pay rewards to the pool at the end of the era\n(in this case ",(0,i.kt)("inlineCode",{parentName:"li"},"ParaNodes.io/11"),").")),(0,i.kt)("p",null,"If you scroll down the page, there are two additional panels:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Roles")," showing the accounts of the pool's Depositor, Root, Nominator, and Bouncer. The same\naccount can cover all the roles."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Pool Stats")," showing the Pool State (either Active, Closed, or Destroying), Pool Members (number\nof members in the pool), and Total Bonded (total number of bonded tokens).")),(0,i.kt)("p",null,"The 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)."),(0,i.kt)("h3",{id:"nominate"},"Nominate"),(0,i.kt)("admonition",{title:"Walk-through video tutorial of How to Nominate",type:"info"},(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("a",{parentName:"p",href:"https://youtu.be/F59N3YKYCRs"},"This video tutorial")," shows you how to become a nominator with the\nStaking Dashboard.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"dashboard nominate",src:a(99289).Z,width:"1920",height:"1080"})),(0,i.kt)("p",null,"This page of the dashboard has four main panels (Sidebar and Accounts Panels excluded):"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Section A: The Stats Panel")," shows the number of active nominators, the minimum number of tokens\nto nominate (currently\n",(0,i.kt)(s.Z,{network:"kusama",path:"query.staking.minNominatorBond",defaultValue:1e11,filter:"humanReadable",mdxType:"RPC"}),"",")\nand the minimum active bond (currently\n",(0,i.kt)(s.Z,{network:"kusama",path:"query.staking.minimumActiveStake",defaultValue:2937e9,filter:"humanReadable",mdxType:"RPC"}),"",").\nThe system keeps 12500 nomination intents and puts them into the\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking-advanced#bags-list"},"bags list"),". The fact that active nominators are not\n12500 is because there are nominators that have no active validator."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Section B: The Balance Panel")," shows the number of tokens bonded in nominations and those that\nare free. In this case, we have 0.301 KSM bonded and 0.144 KSM free. In this panel, you can bond\nmore funds (",(0,i.kt)("inlineCode",{parentName:"li"},"+")," button) or unbond some funds (",(0,i.kt)("inlineCode",{parentName:"li"},"-")," button). Unbonding will withdraw unclaimed\nrewards and funds will be locked for 28 eras\n(28 days). Once the 28 eras have passed, you\ncan unlock the locked funds (button with a lock icon) that will be available as a free balance.")),(0,i.kt)("admonition",{title:"Fast unstake",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"If your account did not receive rewards in the past 28 eras, you will be eligible for fast unstake.\nThe dashboard will automatically check this for you and prompt a banner.")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"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 ',(0,i.kt)("inlineCode",{parentName:"li"},"Unstake"),' button allows you to unstake the\nwhole bonded amount and stop nominating. In the middle of the panel, the payout destination is\ncurrently set to "Compounding" (i.e. rewards are added to the bonded funds). The ',(0,i.kt)("inlineCode",{parentName:"li"},"Update"),' button\nwill allow you to change the destination to "To Your Account" (to the stash account as a free\nbalance), "To Another Account" (an account that is not the stash), or "None" (no payout\ndestination).'),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Section D: The Nominations panel")," shows your nominations and allows you to stop all nomination\nwith the ",(0,i.kt)("inlineCode",{parentName:"li"},"Stop")," button or to select specific validators (",(0,i.kt)("inlineCode",{parentName:"li"},"Select")," button) and stop nominating only\nthose.")),(0,i.kt)("h3",{id:"payouts"},"Payouts"),(0,i.kt)("p",null,"This page is an expanded version of Panel F on the ",(0,i.kt)("a",{parentName:"p",href:"#overview"},"Overview")," page. It also shows all\nvalidators and/or nomination pools that paid out rewards to your accounts in the past few months."),(0,i.kt)("h3",{id:"after-staking"},"After Staking"),(0,i.kt)("admonition",{title:"Walk-through video tutorial - What to do after Staking",type:"info"},(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("a",{parentName:"p",href:"https://youtu.be/F59N3YKYCRs"},"This video tutorial")," shows you how to what you can do after staking\nwith the Staking Dashboard.")),(0,i.kt)("h2",{id:"validators"},"Validators"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"dashboard nominate",src:a(72258).Z,width:"1920",height:"1080"})),(0,i.kt)("p",null,"This page of the dashboard has two main panels (Sidebar and Accounts Panels excluded):"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Panel A: The Stats Panel")," shows the total number of active validators, all validators currently\nregistered (active and inactive), and average commission across all validators."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Panel B: The Validators Panel")," shows all validators. You can order them by low/high commission\nor apply the following filters:",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Include only active validators"),(0,i.kt)("li",{parentName:"ul"},"Exclude validators that are oversubscribed, have 100% commission, blocked nominations, and have\nmissing identity.")))),(0,i.kt)("h2",{id:"support"},"Support"),(0,i.kt)("p",null,"The Support pages are:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"The Resources page provides a glossary with main definitions and links to support pages."),(0,i.kt)("li",{parentName:"ul"},"The Feedback page can be used to send feedback through\n",(0,i.kt)("a",{parentName:"li",href:"https://polkadot-staking-dashboard.canny.io/feedback"},"Canny.io"),". This can be a bug report or a\nfeature request. We take your feedback seriously, do not hesitate to contact us.")),(0,i.kt)("h2",{id:"network"},"Network"),(0,i.kt)("p",null,"Under 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\n",(0,i.kt)("a",{parentName:"p",href:"/docs/build-substrate#replacing-rpc-node-reliance-with-light-clients"},"this page"),"."))}k.isMDXComponent=!0},42069:(e,t,a)=>{"use strict";a.d(t,{Z:()=>o});const o=a.p+"assets/images/dashboard-managePoolCommission-46842e2d0927915c031faf72cb3e266a.png"},99289:(e,t,a)=>{"use strict";a.d(t,{Z:()=>o});const o=a.p+"assets/images/dashboard-nominate-7b882e41a42abeb928b78a6d6db4a6f0.png"},49083:(e,t,a)=>{"use strict";a.d(t,{Z:()=>o});const o=a.p+"assets/images/dashboard-overview-755861fe5937455f21a9360334fc26ea.png"},70359:(e,t,a)=>{"use strict";a.d(t,{Z:()=>o});const o=a.p+"assets/images/dashboard-permissionlessPoolClaims-20c461799ea9447fff83f2d2bd41b4f9.png"},86214:(e,t,a)=>{"use strict";a.d(t,{Z:()=>o});const o=a.p+"assets/images/dashboard-pools-b7327a1bbe115970fe683b0350c7bb6e.png"},72258:(e,t,a)=>{"use strict";a.d(t,{Z:()=>o});const o=a.p+"assets/images/dashboard-validators-a90166e01dcd1072c9a3be81a439afbb.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/b0cbc1d4.fd0622fd.js b/assets/js/b0cbc1d4.fd0622fd.js new file mode 100644 index 000000000000..98c6d9a3a678 --- /dev/null +++ b/assets/js/b0cbc1d4.fd0622fd.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[3667],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>u});var o=a(74165),n=a(15861),i=a(67294),s=a(87152),r=a(17145),l=a(67425);function d(e,t,a){return p.apply(this,arguments)}function p(){return(p=(0,n.Z)((0,o.Z)().mark((function e(t,a,n){var i,l,d,p,h;return(0,o.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return d=new s.U(i),e.next=21,r.G.create({provider:d});case 21:p=e.sent,(h=a.split(".")).forEach((function(e){e in p&&(p=p[e])})),e.t1=h[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=p.toString(),e.abrupt("break",35);case 29:return e.next=31,p();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+h[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function h(e,t,a,o){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,o);break;case"precise":(0,l.Precise)(e,a,o);break;case"blocksToDays":(0,l.BlocksToDays)(e,o);break;case"percentage":(0,l.Percentage)(e,o);break;case"permillToPercent":(0,l.PermillToPercent)(e,o);break;case"arrayLength":(0,l.ArrayLength)(e,o);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(e){var t=e.network,a=e.path,s=e.defaultValue,r=e.filter,l=void 0===r?void 0:r,p=(0,i.useState)(""),u=p[0],c=p[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?h(s.toString(),l,t,c):c(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,n.Z)((0,o.Z)().mark((function e(){var n;return(0,o.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t,a,c);case 2:if(void 0!==(n=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?h(n,l,t,c):c(n);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(r){console.log(r)}}}),[]),u}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,o){var n=void 0;if("polkadot"===a||"statemint"===a)n=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");n=6}e=parseFloat(e),o((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(n)+" "+t[a].symbol).toString())},Precise:function(e,a,o){o(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},14374:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>h,contentTitle:()=>d,default:()=>k,frontMatter:()=>l,metadata:()=>p,toc:()=>u});var o=a(87462),n=a(63366),i=(a(67294),a(3905)),s=a(47940),r=["components"],l={id:"staking-dashboard",title:"Polkadot Staking Dashboard",sidebar_label:"Staking Dashboard",description:"Everything about the Polkadot Staking Dashboard.",keywords:["ledger","staking","polkadot","dashboard"],slug:"../staking-dashboard"},d=void 0,p={unversionedId:"general/staking-dashboard",id:"general/staking-dashboard",title:"Polkadot Staking Dashboard",description:"Everything about the Polkadot Staking Dashboard.",source:"@site/../docs/general/staking-dashboard.md",sourceDirName:"general",slug:"/staking-dashboard",permalink:"/docs/staking-dashboard",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/general/staking-dashboard.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696484972,formattedLastUpdatedAt:"Oct 5, 2023",frontMatter:{id:"staking-dashboard",title:"Polkadot Staking Dashboard",sidebar_label:"Staking Dashboard",description:"Everything about the Polkadot Staking Dashboard.",keywords:["ledger","staking","polkadot","dashboard"],slug:"../staking-dashboard"},sidebar:"docs",previous:{title:"Dashboards",permalink:"/docs/dashboards-index"},next:{title:"Polkadot-JS",permalink:"/docs/polkadotjs"}},h={},u=[{value:"Overview",id:"overview",level:2},{value:"Stake",id:"stake",level:2},{value:"Pools",id:"pools",level:3},{value:"Nominate",id:"nominate",level:3},{value:"Payouts",id:"payouts",level:3},{value:"After Staking",id:"after-staking",level:3},{value:"Validators",id:"validators",level:2},{value:"Support",id:"support",level:2},{value:"Network",id:"network",level:2}],c={toc:u},m="wrapper";function k(e){var t=e.components,l=(0,n.Z)(e,r);return(0,i.kt)(m,(0,o.Z)({},c,l,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{title:"Preliminary Notes",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The ",(0,i.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/#/overview"},"Polkadot Staking Dashboard")," supports\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-proxies"},(0,i.kt)("strong",{parentName:"a"},"proxy accounts"))," and you can import your\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced#staking-proxies"},"staking proxy")," (for nominators) or\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-proxies#non-transfer-proxy"},"non-transfer proxy")," (for nomination pool admins and\nmembers)."),(0,i.kt)("p",{parentName:"admonition"},"The dashboard also has ",(0,i.kt)("strong",{parentName:"p"},"native ",(0,i.kt)("a",{parentName:"strong",href:"/docs/ledger"},"Ledger")," support"),", meaning that you do not need an\nextension or a wallet to use it; you just need your Ledger device.\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-extrinsics#metadata-updates"},"Metadata updates")," are thus not necessary, as you\nonly need to keep your Ledger apps up-to-date."),(0,i.kt)("p",{parentName:"admonition"},"Before using the dashboard, make sure you have a\nPolkadot account in a Ledger device with the\nPolkadot Ledger app installed, or a browser\nextension such as the ",(0,i.kt)("a",{parentName:"p",href:"/docs/polkadotjs#polkadot-js-extension"},"Polkadot-JS Extension")," or\n",(0,i.kt)("a",{parentName:"p",href:"/docs/wallets-and-extensions#browser-extensions"},"other third-party extensions")," with a funded\nPolkadot account."),(0,i.kt)("p",{parentName:"admonition"},"On top of the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-accounts#existential-deposit-and-reaping"},"existential deposit"),", you\nneed some free balance to pay for ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-transaction-fees"},"transaction fees")," and the\nminimum amount to place your nominations (only for nominators, currently\n",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)(s.Z,{network:"polkadot",path:"query.staking.minNominatorBond",defaultValue:25e11,filter:"humanReadable",mdxType:"RPC"})),"",")\nor join a nomination pool (only for pool members, currently\n",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)(s.Z,{network:"polkadot",path:"query.nominationPools.minJoinBond",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"})),"",").\nFor more information about staking on Polkadot\nvisit the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking"},"staking page")," and the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced"},"advanced staking page"),".")),(0,i.kt)("p",null,"The ",(0,i.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/#/overview"},"Polkadot Staking Dashboard")," is a tool only\ndedicated to ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking"},"staking")," on Polkadot,\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-comparisons-kusama"},"Kusama")," (Polkadot's canary network) and\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-networks#westend-test-network"},"Westend")," (Polkadot's test network)."),(0,i.kt)("p",null,"The dashboard is not a wallet, meaning that you cannot transfer funds between accounts. To fund\naccounts, you can use ",(0,i.kt)("a",{parentName:"p",href:"./wallets"},"supported wallets")," or the ",(0,i.kt)("a",{parentName:"p",href:"/docs/polkadotjs-ui"},"Polkadot-JS UI"),".\nYou can participate in staking by being a ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nominator"},"nominator")," or a member of a\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pool"),". 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\ninteract with Polkadot's native staking."),(0,i.kt)("admonition",{title:"The dashboard is a Web3 dApp",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The dashboard is a decentralized application (dApp), and to login you do not need to sign up with an\nemail and password but just need an account created on the supported non-custodial wallets. Any\ntransaction to be submitted needs to be signed by you. Also, if you use light clients, which are\nresistant to censorship, you interact trustlessly with the network without intermediaries. Welcome\nto the world of ",(0,i.kt)("a",{parentName:"p",href:"/docs/web3-and-polkadot"},"true Web3"),"!")),(0,i.kt)("p",null,"Note the pictures on this page refer to Kusama, but the same applies to Polkadot and Westend.\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",(0,i.kt)("a",{parentName:"p",href:"https://youtu.be/hvXLc4H7rA4"},"Walkthrough Tutorial"),"."),(0,i.kt)("h2",{id:"overview"},"Overview"),(0,i.kt)("admonition",{title:"Staking Dashboard Walk-through video tutorial",type:"info"},(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("a",{parentName:"p",href:"https://youtu.be/hvXLc4H7rA4"},"This video tutorial")," shows you everything you can do with the Staking\nDashboard.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"dashboard overview",src:a(49083).Z,width:"1920",height:"1080"})),(0,i.kt)("p",null,"This page of the dashboard has six main panels:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Section A: The Sidebar")," shows which page you are on (in this case, the Overview). It will also\nshow the role you currently have in staking (in this case, active in both ",(0,i.kt)("a",{parentName:"p",href:"#pools"},"Pools")," and\n",(0,i.kt)("a",{parentName:"p",href:"#nominate"},"Nominate"),"). You can also change the ",(0,i.kt)("a",{parentName:"p",href:"#network"},"network")," (currently on Kusama).")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Section B: The Accounts Panel")," allows you to connect one account to the dashboard. Once\nconnected, the account will appear next to the ",(0,i.kt)("inlineCode",{parentName:"p"},"Accounts")," button. You can see it here if you are\nactive as a nominator and/or a pool member. In this case, the account KSM Stash is a nominator and\na member of the pool Insight Finance. Proxy accounts are also shown here if applicable. Note that\nthe dashboard will automatically fetch the stash and the proxy."))),(0,i.kt)("p",null,"Note that Sections A and B will always be visible while you use the dashboard."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Section C: The Stats Panel")," shows the general view of current staking metrics, including the\nhistorical reward rate (including after\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced#inflation"},"inflation"),"), the supply staked and time remaining\nin the current era.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Section D: The Summary Panel")," shows your current situation and gives you general tips about\nstaking. In this case, the KSM Stash account is a nominator and a pool member, and by clicking on\n",(0,i.kt)("inlineCode",{parentName:"p"},"Manage >")," you can go directly to the ",(0,i.kt)("a",{parentName:"p",href:"#nominate"},"Nominate")," and ",(0,i.kt)("a",{parentName:"p",href:"#pools"},"Pools")," pages,\nrespectively. You can take actions such as changing staking preferences, bonding more funds, etc.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Section E: The Balance Panel"),' shows the bonded amount distinguishing between "Nominating", "In\na Pool", and "Not Staking". The amount that is not staking is further divided into "Free" (a\nbalance that can be transferred) and "Reserve" (a balance that is needed the keep the account\non-chain, see ',(0,i.kt)("a",{parentName:"p",href:"/docs/learn-accounts#existential-deposit-and-reaping"},"existential deposit"),").\nIn this case, 0.301 KSM are bonded for nominating, 0.3 KSM are bonded in a pool, and 0.145 KSM are\nnot used for staking. Of the non-staking balance, 0.144 KSM are free while\n",(0,i.kt)(s.Z,{network:"kusama",path:"consts.balances.existentialDeposit",defaultValue:333e6,filter:"humanReadable",mdxType:"RPC"}),"","\nare reserved for the existential deposit.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Section F: The Recent Payouts Panel")," shows a bar chart with the rewards paid out to you in the\npast 15 days either as a nominator or a pool member (manually claimed). Note how the 4th of April\nbar has the tip that is not filled with color. This is to show a pending payout (for nominators\nonly). Below the bar chart is a line chart showing the 10-day moving average."))),(0,i.kt)("p",null,"Additional statistics can be found at the bottom of the overview page."),(0,i.kt)("admonition",{title:"Pool funds are in system accounts",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Remember that funds bonded in a pool are transferred to the pool's system account, which can only be\naccessed by the protocol, and not by any individual user. Some wallets might not display the balance\nbonded in pools, but the dashboard will always show it.")),(0,i.kt)("h2",{id:"stake"},"Stake"),(0,i.kt)("p",null,"In 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."),(0,i.kt)("h3",{id:"pools"},"Pools"),(0,i.kt)("admonition",{title:"Joining a Nomination Pool - Walk-through video tutorial",type:"info"},(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("a",{parentName:"p",href:"https://youtu.be/dDIG7QAApig"},"This video tutorial")," shows you how to join a\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pool")," with the Staking Dashboard. You can also read\nthe\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182376-staking-dashboard-how-to-join-a-nomination-pool"},"dedicated support article"),"\nabout joining a pool.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"dashboard pools",src:a(86214).Z,width:"1920",height:"1080"})),(0,i.kt)("p",null,"This page of the dashboard has four main panels (Sidebar and Accounts Panels excluded):"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Section A: The Stats Panel")," shows the number of active pools and the minimum number of tokens\nneeded to join a pool and/or create one."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Section B: The Balance Panel")," shows the number of tokens bonded in pools and those that are\nfree. In this case, we have 0.3 KSM bonded and 0.144 KSM free. In this panel, you can bond more\nfunds (",(0,i.kt)("inlineCode",{parentName:"li"},"+")," button) or unbond some funds (",(0,i.kt)("inlineCode",{parentName:"li"},"-")," button). Unbonding will withdraw unclaimed rewards\nand funds will be locked for 28 eras\n(28 days). Once the 28 eras have passed, you\ncan unlock the locked funds (button with a lock icon) that will be available as a free balance.")),(0,i.kt)("admonition",{title:"No fast unstake and pool swap for pool members",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Note that the option to fast unstake is only available to nominators. Also, to change pool, you\ncannot simply swap memberships. You will need to unbond and go through the whole unbonding period.")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Section C: The Pool Panel")," shows the pool id where you have membership (in this case, Pool 82),\nthe pool name, and next to it, a ",(0,i.kt)("inlineCode",{parentName:"p"},"Manage")," button that will allow to choose between different\noptions:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Update Claim Permissions: you can allow other pool members to compound your rewards, withdraw\nyour rewards as a free balance, or both. More details about nomination pools and updating claim\npermissions can be found on the\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-nomination-pools#claim-permissions"},"dedicated wiki page"),".")),(0,i.kt)("p",{parentName:"li"},(0,i.kt)("img",{alt:"dashboard-permissionlessPoolClaims",src:a(70359).Z,width:"651",height:"272"})),(0,i.kt)("admonition",{parentName:"li",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"For more information about how-to update your claim permissions with the staking dashboard see\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182399-staking-dashboard-how-to-claim-nomination-pool-rewards#Permissionless-claiming"},"this support article"),".")),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Leave the pool and unbond all the funds in the pool.")),(0,i.kt)("p",{parentName:"li"},"If you are a pool admin you will be able to see the additional options:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Claim Commission: you can claim pool commissions to an account specified under Manage Commission\n(below)."),(0,i.kt)("li",{parentName:"ul"},"Manage Commission: you can manage the pool commission rate, maximum commission, maximum change\nrate, and minimum time delay between commission updates. More details about nomination pools and\nmanaging pool commissions can be found on the\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-nomination-pools#pool-commissions"},"dedicated wiki page"),".")),(0,i.kt)("p",{parentName:"li"},(0,i.kt)("img",{alt:"dashboard-manage-commission",src:a(42069).Z,width:"650",height:"645"})),(0,i.kt)("admonition",{parentName:"li",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"For more information about how-to manage commission of your nomination pool with the staking\ndashboard see\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182388-staking-dashboard-how-to-create-a-nomination-pool#Pool-management-options"},"this support article"),".")),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Rename Pool: you can change the pool's name."),(0,i.kt)("li",{parentName:"ul"},"Lock Pool: you can lock the pool so that new members are not allowed."),(0,i.kt)("li",{parentName:"ul"},"Destroy Pool: you can destroy the pool. See\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-guides-staking-pools#pool-destruction"},"this wiki page")," and\n",(0,i.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000182388-staking-dashboard-how-to-create-a-nomination-pool#How-to-destroy-a-pool"},"this support article"),"\nfor more information.")),(0,i.kt)("p",{parentName:"li"},"You can see any unclaimed rewards in the middle of the panel. You can claim and bond the rewards\n(",(0,i.kt)("inlineCode",{parentName:"p"},"+ Compound")," button) or withdraw them as a free balance (",(0,i.kt)("inlineCode",{parentName:"p"},"Withdraw"),' button). In this case, there\nare approximately 0.0012 KSM that can be claimed. You can see the Pool Status at the bottom of the\npanel, currently set to "Nominating and Earning Rewards".'))),(0,i.kt)("p",null,"Note that if it is the first time you log in to the dashboard, you will see two\nbuttons\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"Create"),"\xa0and\xa0",(0,i.kt)("inlineCode",{parentName:"p"},"Join"),", instead of ",(0,i.kt)("inlineCode",{parentName:"p"},"Manage"),". For more information about how to create a\nnomination pool, see\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182388-staking-dashboard-how-to-create-a-nomination-pool#How-to-create-a-pool"},"this support article"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Section D: The Pool Nominations Panel")," shows the nominations of the pool you are currently in,\nhighlighting the validator that is active and will pay rewards to the pool at the end of the era\n(in this case ",(0,i.kt)("inlineCode",{parentName:"li"},"ParaNodes.io/11"),").")),(0,i.kt)("p",null,"If you scroll down the page, there are two additional panels:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Roles")," showing the accounts of the pool's Depositor, Root, Nominator, and Bouncer. The same\naccount can cover all the roles."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Pool Stats")," showing the Pool State (either Active, Closed, or Destroying), Pool Members (number\nof members in the pool), and Total Bonded (total number of bonded tokens).")),(0,i.kt)("p",null,"The 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)."),(0,i.kt)("h3",{id:"nominate"},"Nominate"),(0,i.kt)("admonition",{title:"Walk-through video tutorial of How to Nominate",type:"info"},(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("a",{parentName:"p",href:"https://youtu.be/F59N3YKYCRs"},"This video tutorial")," shows you how to become a nominator with the\nStaking Dashboard.")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"dashboard nominate",src:a(99289).Z,width:"1920",height:"1080"})),(0,i.kt)("p",null,"This page of the dashboard has four main panels (Sidebar and Accounts Panels excluded):"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Section A: The Stats Panel")," shows the number of active nominators, the minimum number of tokens\nto nominate (currently\n",(0,i.kt)(s.Z,{network:"kusama",path:"query.staking.minNominatorBond",defaultValue:1e11,filter:"humanReadable",mdxType:"RPC"}),"",")\nand the minimum active bond (currently\n",(0,i.kt)(s.Z,{network:"kusama",path:"query.staking.minimumActiveStake",defaultValue:2937e9,filter:"humanReadable",mdxType:"RPC"}),"",").\nThe system keeps 12500 nomination intents and puts them into the\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking-advanced#bags-list"},"bags list"),". The fact that active nominators are not\n12500 is because there are nominators that have no active validator."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Section B: The Balance Panel")," shows the number of tokens bonded in nominations and those that\nare free. In this case, we have 0.301 KSM bonded and 0.144 KSM free. In this panel, you can bond\nmore funds (",(0,i.kt)("inlineCode",{parentName:"li"},"+")," button) or unbond some funds (",(0,i.kt)("inlineCode",{parentName:"li"},"-")," button). Unbonding will withdraw unclaimed\nrewards and funds will be locked for 28 eras\n(28 days). Once the 28 eras have passed, you\ncan unlock the locked funds (button with a lock icon) that will be available as a free balance.")),(0,i.kt)("admonition",{title:"Fast unstake",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"If your account did not receive rewards in the past 28 eras, you will be eligible for fast unstake.\nThe dashboard will automatically check this for you and prompt a banner.")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"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 ',(0,i.kt)("inlineCode",{parentName:"li"},"Unstake"),' button allows you to unstake the\nwhole bonded amount and stop nominating. In the middle of the panel, the payout destination is\ncurrently set to "Compounding" (i.e. rewards are added to the bonded funds). The ',(0,i.kt)("inlineCode",{parentName:"li"},"Update"),' button\nwill allow you to change the destination to "To Your Account" (to the stash account as a free\nbalance), "To Another Account" (an account that is not the stash), or "None" (no payout\ndestination).'),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Section D: The Nominations panel")," shows your nominations and allows you to stop all nomination\nwith the ",(0,i.kt)("inlineCode",{parentName:"li"},"Stop")," button or to select specific validators (",(0,i.kt)("inlineCode",{parentName:"li"},"Select")," button) and stop nominating only\nthose.")),(0,i.kt)("h3",{id:"payouts"},"Payouts"),(0,i.kt)("p",null,"This page is an expanded version of Panel F on the ",(0,i.kt)("a",{parentName:"p",href:"#overview"},"Overview")," page. It also shows all\nvalidators and/or nomination pools that paid out rewards to your accounts in the past few months."),(0,i.kt)("h3",{id:"after-staking"},"After Staking"),(0,i.kt)("admonition",{title:"Walk-through video tutorial - What to do after Staking",type:"info"},(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("a",{parentName:"p",href:"https://youtu.be/F59N3YKYCRs"},"This video tutorial")," shows you how to what you can do after staking\nwith the Staking Dashboard.")),(0,i.kt)("h2",{id:"validators"},"Validators"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"dashboard nominate",src:a(72258).Z,width:"1920",height:"1080"})),(0,i.kt)("p",null,"This page of the dashboard has two main panels (Sidebar and Accounts Panels excluded):"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Panel A: The Stats Panel")," shows the total number of active validators, all validators currently\nregistered (active and inactive), and average commission across all validators."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Panel B: The Validators Panel")," shows all validators. You can order them by low/high commission\nor apply the following filters:",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Include only active validators"),(0,i.kt)("li",{parentName:"ul"},"Exclude validators that are oversubscribed, have 100% commission, blocked nominations, and have\nmissing identity.")))),(0,i.kt)("h2",{id:"support"},"Support"),(0,i.kt)("p",null,"The Support pages are:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"The Resources page provides a glossary with main definitions and links to support pages."),(0,i.kt)("li",{parentName:"ul"},"The Feedback page can be used to send feedback through\n",(0,i.kt)("a",{parentName:"li",href:"https://polkadot-staking-dashboard.canny.io/feedback"},"Canny.io"),". This can be a bug report or a\nfeature request. We take your feedback seriously, do not hesitate to contact us.")),(0,i.kt)("h2",{id:"network"},"Network"),(0,i.kt)("p",null,"Under 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\n",(0,i.kt)("a",{parentName:"p",href:"/docs/build-substrate#replacing-rpc-node-reliance-with-light-clients"},"this page"),"."))}k.isMDXComponent=!0},42069:(e,t,a)=>{"use strict";a.d(t,{Z:()=>o});const o=a.p+"assets/images/dashboard-managePoolCommission-46842e2d0927915c031faf72cb3e266a.png"},99289:(e,t,a)=>{"use strict";a.d(t,{Z:()=>o});const o=a.p+"assets/images/dashboard-nominate-7b882e41a42abeb928b78a6d6db4a6f0.png"},49083:(e,t,a)=>{"use strict";a.d(t,{Z:()=>o});const o=a.p+"assets/images/dashboard-overview-755861fe5937455f21a9360334fc26ea.png"},70359:(e,t,a)=>{"use strict";a.d(t,{Z:()=>o});const o=a.p+"assets/images/dashboard-permissionlessPoolClaims-20c461799ea9447fff83f2d2bd41b4f9.png"},86214:(e,t,a)=>{"use strict";a.d(t,{Z:()=>o});const o=a.p+"assets/images/dashboard-pools-b7327a1bbe115970fe683b0350c7bb6e.png"},72258:(e,t,a)=>{"use strict";a.d(t,{Z:()=>o});const o=a.p+"assets/images/dashboard-validators-a90166e01dcd1072c9a3be81a439afbb.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/b38833d4.2701f04f.js b/assets/js/b38833d4.2701f04f.js deleted file mode 100644 index 79e27c73b9f7..000000000000 --- a/assets/js/b38833d4.2701f04f.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[9062],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>m});var n=a(74165),o=a(15861),i=a(67294),r=a(87152),l=a(17145),s=a(67425);function d(e,t,a){return h.apply(this,arguments)}function h(){return(h=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var i,s,d,h,p;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,s=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return d=new r.U(i),e.next=21,l.G.create({provider:d});case 21:h=e.sent,(p=a.split(".")).forEach((function(e){e in h&&(h=h[e])})),e.t1=p[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return s=h.toString(),e.abrupt("break",35);case 29:return e.next=31,h();case 31:return s=(s=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+p[0]+") in "+a);case 35:return e.abrupt("return",s);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function p(e,t,a,n){switch(t){case"humanReadable":(0,s.HumanReadable)(e,a,n);break;case"precise":(0,s.Precise)(e,a,n);break;case"blocksToDays":(0,s.BlocksToDays)(e,n);break;case"percentage":(0,s.Percentage)(e,n);break;case"arrayLength":(0,s.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const m=function(e){var t=e.network,a=e.path,r=e.defaultValue,l=e.filter,s=void 0===l?void 0:l,h=(0,i.useState)(""),m=h[0],c=h[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==s?p(r.toString(),s,t,c):c(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t,a,c);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==s?p(o,s,t,c):c(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(l){console.log(l)}}}),[]),m}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},2774:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>d,default:()=>k,frontMatter:()=>s,metadata:()=>h,toc:()=>m});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),r=a(47940),l=["components"],s={id:"learn-phragmen",title:"NPoS Election Algorithms",sidebar_label:"NPoS Election Algorithms",description:"The Election Methods used in Polkadot's NPoS Mechanism.",keywords:["phragmen","sequential phragm\xe9n method","elections","algorithm","phragmms"],slug:"../learn-phragmen"},d=void 0,h={unversionedId:"learn/learn-phragmen",id:"learn/learn-phragmen",title:"NPoS Election Algorithms",description:"The Election Methods used in Polkadot's NPoS Mechanism.",source:"@site/../docs/learn/learn-phragmen.md",sourceDirName:"learn",slug:"/learn-phragmen",permalink:"/docs/learn-phragmen",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-phragmen.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1688135081,formattedLastUpdatedAt:"Jun 30, 2023",frontMatter:{id:"learn-phragmen",title:"NPoS Election Algorithms",sidebar_label:"NPoS Election Algorithms",description:"The Election Methods used in Polkadot's NPoS Mechanism.",keywords:["phragmen","sequential phragm\xe9n method","elections","algorithm","phragmms"],slug:"../learn-phragmen"},sidebar:"docs",previous:{title:"Cryptography",permalink:"/docs/learn-cryptography"},next:{title:"How-to Guides",permalink:"/docs/learn-guides-index"}},p={},m=[{value:"NPoS Election Algorithms",id:"npos-election-algorithms",level:2},{value:"What is the sequential Phragm\xe9n method?",id:"what-is-the-sequential-phragm\xe9n-method",level:2},{value:"Validator Elections",id:"validator-elections",level:3},{value:"Off-Chain Phragm\xe9n",id:"off-chain-phragm\xe9n",level:4},{value:"Council Elections",id:"council-elections",level:3},{value:"What does it mean for node operators?",id:"what-does-it-mean-for-node-operators",level:2},{value:"Understanding Phragm\xe9n",id:"understanding-phragm\xe9n",level:2},{value:"Basic Phragm\xe9n",id:"basic-phragm\xe9n",level:3},{value:"Rationale",id:"rationale",level:3},{value:"Algorithm",id:"algorithm",level:3},{value:"Example",id:"example",level:3},{value:"Weighted Phragm\xe9n",id:"weighted-phragm\xe9n",level:3},{value:"Rationale",id:"rationale-1",level:3},{value:"Algorithm",id:"algorithm-1",level:3},{value:"Example",id:"example-1",level:3},{value:"Optimizations",id:"optimizations",level:2},{value:"High-Level Description",id:"high-level-description",level:3},{value:"Rationale for Minimizing the Number of Validators Per Nominator",id:"rationale-for-minimizing-the-number-of-validators-per-nominator",level:3},{value:"Rationale for Maintaining an Even Distribution of Stake",id:"rationale-for-maintaining-an-even-distribution-of-stake",level:3},{value:"Rationale for Reducing Block Computing Time",id:"rationale-for-reducing-block-computing-time",level:3},{value:"Phragmms (aka Balphragmms)",id:"phragmms-aka-balphragmms",level:3},{value:"Maximin Support Objective and PJR",id:"maximin-support-objective-and-pjr",level:4},{value:"Comparing Sequential Phragm\xe9n, MMS, and Phragmms",id:"comparing-sequential-phragm\xe9n-mms-and-phragmms",level:4},{value:"The New Election Rule: Phragmms",id:"the-new-election-rule-phragmms",level:4},{value:"Algorithm",id:"algorithm-2",level:4},{value:"External Resources",id:"external-resources",level:2}],c={toc:m},u="wrapper";function k(e){var t=e.components,a=(0,o.Z)(e,l);return(0,i.kt)(u,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"npos-election-algorithms"},"NPoS Election Algorithms"),(0,i.kt)("p",null,"Since validators are paid almost equally in\nPolkadot in each era, it is important that the\nstake behind each validator is uniformly spread out. An election algorithm for Nominated Proof of\nStaking (NPoS) on Polkadot will try to\noptimize three metrics when computing a solution graph of nominators and validators:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Maximize the total amount at stake."),(0,i.kt)("li",{parentName:"ol"},"Maximize the stake behind the minimally staked validator."),(0,i.kt)("li",{parentName:"ol"},"Minimize the variance of the stake in the set.")),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("a",{parentName:"p",href:"#understanding-phragm%C3%A9n"},"Sequential Phragm\xe9n"),", ",(0,i.kt)("a",{parentName:"p",href:"#phragmms-fka-balphragmms"},"Phragmms")," and\n",(0,i.kt)("a",{parentName:"p",href:"https://crates.parity.io/sp_npos_elections/balancing/fn.balance.html"},"Star balancing")," are a few\nnotable algorithms used for computing the NPoS solutions in Polkadot and Kusama.")),(0,i.kt)("h2",{id:"what-is-the-sequential-phragm\xe9n-method"},"What is the sequential Phragm\xe9n method?"),(0,i.kt)("p",null,"The sequential Phragm\xe9n method is a multi-winner election method introduced by Edvard Phragm\xe9n in\nthe 1890s. The quote below taken from the reference ",(0,i.kt)("a",{parentName:"p",href:"#external-resources"},"Phragm\xe9n paper")," sums up\nthe purpose of the sequential Phragm\xe9n method:"),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"The problem that Phragm\xe9n\u2019s methods try to solve is that of electing a set of a given numbers of\npersons from a larger set of candidates. Phragm\xe9n discussed this in the context of a parliamentary\nelection in a multi-member constituency; the same problem can, of course, also occur in local\nelections, but also in many other situations such as electing a board or a committee in an\norganization.")),(0,i.kt)("h3",{id:"validator-elections"},"Validator Elections"),(0,i.kt)("p",null,"The sequential Phragm\xe9n 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."),(0,i.kt)("h4",{id:"off-chain-phragm\xe9n"},"Off-Chain Phragm\xe9n"),(0,i.kt)("p",null,"Given the large set of nominators and validators, Phragm\xe9n's method is a difficult optimization\nproblem. Polkadot uses off-chain workers to\ncompute the result off-chain and submit a transaction to propose the set of winners. The reason for\nperforming this computation off-chain is to keep a constant block time of six seconds and prevent\nlong block times at the end of each era, when the validator election takes place."),(0,i.kt)("admonition",{title:"Staking Miners",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The process of computing the optimal solution for NPoS election can be delegated to\n",(0,i.kt)("a",{parentName:"p",href:"learn-staking-miner"},"Staking Miners"),".")),(0,i.kt)("h3",{id:"council-elections"},"Council Elections"),(0,i.kt)("admonition",{title:"Deprecated in Polkadot OpenGov",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Phragmen was used for Council elections in ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-governance"},"Governance v1"),".")),(0,i.kt)("p",null,"The Phragm\xe9n 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\xe9n 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."),(0,i.kt)("h2",{id:"what-does-it-mean-for-node-operators"},"What does it mean for node operators?"),(0,i.kt)("p",null,"Phragm\xe9n 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."),(0,i.kt)("p",null,"You can use\n",(0,i.kt)("a",{parentName:"p",href:"https://gist.github.com/tugytur/3531cc618bfbb42f1a6cfb44d9906197"},"this offline-phragm\xe9n")," tool for\npredicting the outcome of a validator election ahead of a new election."),(0,i.kt)("h2",{id:"understanding-phragm\xe9n"},"Understanding Phragm\xe9n"),(0,i.kt)("p",null,"This section explains the sequential Phragm\xe9n method in-depth and walks through examples."),(0,i.kt)("h3",{id:"basic-phragm\xe9n"},"Basic Phragm\xe9n"),(0,i.kt)("h3",{id:"rationale"},"Rationale"),(0,i.kt)("p",null,"In order to understand the Weighted Phragm\xe9n method, we must first understand the basic Phragm\xe9n\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."),(0,i.kt)("p",null,"The 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 have an effect on the final result, and\nso votes of this nature are meaningless."),(0,i.kt)("p",null,'Note 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 ',(0,i.kt)("inlineCode",{parentName:"p"},"5")," voting for that candidate."),(0,i.kt)("p",null,'The particular algorithm we call here the "Basic Phragm\xe9n" was first described by Brill ',(0,i.kt)("em",{parentName:"p"},"et al.")," in\ntheir paper\n",(0,i.kt)("a",{parentName:"p",href:"https://ojs.aaai.org/index.php/AAAI/article/view/10598"},'"Phragm\xe9n\u2019s Voting Methods and Justified Representation"'),"."),(0,i.kt)("h3",{id:"algorithm"},"Algorithm"),(0,i.kt)("p",null,"The Phragm\xe9n method will iterate, selecting one seat at a time, according to the following rules:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Voters submit their ballots, marking which candidates they approve. Ballots will not be modified\nafter submission."),(0,i.kt)("li",{parentName:"ol"},"An initial load of 0 is set for each ballot."),(0,i.kt)("li",{parentName:"ol"},"The candidate who wins the next available seat is the one where the ballots of their supporters\nwould have the ",(0,i.kt)("em",{parentName:"li"},"least average (mean) cost")," if that candidate wins."),(0,i.kt)("li",{parentName:"ol"},"The ",(0,i.kt)("em",{parentName:"li"},"n")," ballots that approved that winning candidate get ",(0,i.kt)("em",{parentName:"li"},"1/n")," added to their load."),(0,i.kt)("li",{parentName:"ol"},"The load of all ballots that supported the winner of this round are averaged out so that they are\nequal."),(0,i.kt)("li",{parentName:"ol"},"If there are any more seats, go back to step 3. Otherwise, the selection ends.")),(0,i.kt)("h3",{id:"example"},"Example"),(0,i.kt)("p",null,"Let's walk through an example with four candidates vying for three seats, and five voters."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Open 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")),(0,i.kt)("p",null,"In this example, we can see that voter ",(0,i.kt)("inlineCode",{parentName:"p"},"V1")," approves only of candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"B"),", voter ",(0,i.kt)("inlineCode",{parentName:"p"},"V2")," approves of\ncandidates ",(0,i.kt)("inlineCode",{parentName:"p"},"C")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"D"),", etc. Voters can approve any number of candidates between 1 and\n",(0,i.kt)("inlineCode",{parentName:"p"},"number_of_candidates - 1"),'. An initial "load" of ',(0,i.kt)("inlineCode",{parentName:"p"},"0")," is set for each ballot (",(0,i.kt)("inlineCode",{parentName:"p"},"L0")," = load after round\n",(0,i.kt)("inlineCode",{parentName:"p"},"0"),', i.e., the "round" before the first round). We shall see shortly how this load is updated and\nused to select candidates.'),(0,i.kt)("p",null,'We 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.'),(0,i.kt)("p",null,"For 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 ",(0,i.kt)("inlineCode",{parentName:"p"},"1/n")," will\nget smaller as ",(0,i.kt)("inlineCode",{parentName:"p"},"n")," increases. For this first example round, for instance, candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"A")," had only one\nballot vote for them. Thus, the average load for candidate A is ",(0,i.kt)("inlineCode",{parentName:"p"},"1/1"),", or 1. Candidate C has two\nballots approving of them, so the average load is ",(0,i.kt)("inlineCode",{parentName:"p"},"1/2"),". Candidate B has the lowest average load, at\n",(0,i.kt)("inlineCode",{parentName:"p"},"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."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Filled 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")),(0,i.kt)("p",null,"We are now down to candidates ",(0,i.kt)("inlineCode",{parentName:"p"},"A"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"C"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"D")," for two open seats. There is only one voter (",(0,i.kt)("inlineCode",{parentName:"p"},"V4"),")\nfor ",(0,i.kt)("inlineCode",{parentName:"p"},"A"),", with load ",(0,i.kt)("inlineCode",{parentName:"p"},"1/4"),". ",(0,i.kt)("inlineCode",{parentName:"p"},"C")," has two voters, ",(0,i.kt)("inlineCode",{parentName:"p"},"V2")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"V5"),", with loads of ",(0,i.kt)("inlineCode",{parentName:"p"},"0")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"1/4"),". ",(0,i.kt)("inlineCode",{parentName:"p"},"D")," has\nthree voters approving of them, ",(0,i.kt)("inlineCode",{parentName:"p"},"V2"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"V3"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"V5"),", with loads of ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"1/4"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"1/4"),",\nrespectively."),(0,i.kt)("p",null,"If Candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"A")," wins, the average load would be ",(0,i.kt)("inlineCode",{parentName:"p"},"(1/4 + 1/1) / 1"),", or ",(0,i.kt)("inlineCode",{parentName:"p"},"5/4"),". If candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"C")," wins,\nthe average load would be ",(0,i.kt)("inlineCode",{parentName:"p"},"((0 + 1/2) + (1/4 + 1/2)) / 2"),", or ",(0,i.kt)("inlineCode",{parentName:"p"},"5/8"),". If candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"D")," wins, the\naverage load would be ",(0,i.kt)("inlineCode",{parentName:"p"},"((0 + 1/3) + (1/4 + 1/3) + (1/4 + 1/3)) / 3"),", or ",(0,i.kt)("inlineCode",{parentName:"p"},"1/2"),". Since ",(0,i.kt)("inlineCode",{parentName:"p"},"1/2")," is the\nlowest average load, candidate D wins the second round."),(0,i.kt)("p",null,"Now everybody who voted for Candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"D")," has their load set to the average, ",(0,i.kt)("inlineCode",{parentName:"p"},"1/2")," of all the loads."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Filled 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")),(0,i.kt)("p",null,"There is now one seat open and two candidates, ",(0,i.kt)("inlineCode",{parentName:"p"},"A")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"C"),". Voter ",(0,i.kt)("inlineCode",{parentName:"p"},"V4")," is the only one voting for\n",(0,i.kt)("inlineCode",{parentName:"p"},"A"),", so if ",(0,i.kt)("inlineCode",{parentName:"p"},"A")," wins then the average load would be ",(0,i.kt)("inlineCode",{parentName:"p"},"(1/4 + 1/1) / 1"),", or ",(0,i.kt)("inlineCode",{parentName:"p"},"5/4"),". Voters ",(0,i.kt)("inlineCode",{parentName:"p"},"V2")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"V5"),"\n(both with load ",(0,i.kt)("inlineCode",{parentName:"p"},"1/2"),") support ",(0,i.kt)("inlineCode",{parentName:"p"},"C"),", so if ",(0,i.kt)("inlineCode",{parentName:"p"},"C")," wins the average load would be\n",(0,i.kt)("inlineCode",{parentName:"p"},"((1/2 + 1/2) + (1/2 + 1/2)) / 2"),", or ",(0,i.kt)("inlineCode",{parentName:"p"},"1"),". Since the average load would be lower with ",(0,i.kt)("inlineCode",{parentName:"p"},"C"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"C")," wins\nthe final seat."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Filled 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")),(0,i.kt)("p",null,"An 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,i.kt)("inlineCode",{parentName:"p"},"0")," and there\nare no seats filled. After the first round, the total of all loads is ",(0,i.kt)("inlineCode",{parentName:"p"},"1"),", after the second round it\nis ",(0,i.kt)("inlineCode",{parentName:"p"},"2"),", etc."),(0,i.kt)("h3",{id:"weighted-phragm\xe9n"},"Weighted Phragm\xe9n"),(0,i.kt)("h3",{id:"rationale-1"},"Rationale"),(0,i.kt)("p",null,"While this method works well if all voters have equal weight, this is not the case in\nPolkadot. Elections for both validators and\ncandidates for the Polkadot Council are\nweighted by the number of tokens held by the voters. This makes elections more similar to a\ncorporate shareholder election than a traditional political election, where some members have more\npull than others. Someone with a single token will have much less voting power than someone\nwith 100. Although this may seem anti-democratic, in a pseudonymous system, it is trivial for\nsomeone with 100 tokens to create 100 different accounts and spread their wealth to all of their\npseudonyms."),(0,i.kt)("p",null,"Therefore, 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\xe9n method allows us to reach these goals."),(0,i.kt)("h3",{id:"algorithm-1"},"Algorithm"),(0,i.kt)("p",null,"Weighted Phragm\xe9n is similar to Basic Phragm\xe9n 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."),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},'NOTE: in terms of validator selection, for the following algorithm, you can think of "voters" as\n"nominators" and "candidates" as "validators".')),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},'Candidates are elected, one per round, and added to the set of successful candidates (they have\nwon a "seat"). This aspect of the algorithm is very similar to the "basic Phragm\xe9n" algorithm\ndescribed above.'),(0,i.kt)("li",{parentName:"ol"},"However, as candidates are elected, a weighted mapping is built, defining the weights of each\nselection of a validator by each nominator.")),(0,i.kt)("p",null,"In more depth, the algorithm operates like so:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Create a list of all voters, their total amount of stake, and which validators they support."),(0,i.kt)("li",{parentName:"ol"},"Generate an initial edge-weighted graph mapping from voters to candidates, where each edge weight\nis the total ",(0,i.kt)("em",{parentName:"li"},"potential")," weight (stake) given by that voter. The sum of all potential weight for\na given candidate is called their ",(0,i.kt)("em",{parentName:"li"},"approval stake"),"."),(0,i.kt)("li",{parentName:"ol"},"Now we start electing candidates. For the list of all candidates who have not been elected, get\ntheir score, which is equal to ",(0,i.kt)("inlineCode",{parentName:"li"},"1 / approval_stake"),"."),(0,i.kt)("li",{parentName:"ol"},"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",(0,i.kt)("inlineCode",{parentName:"li"},"(voter_budget * voter_load / candidate_approval_stake)"),"."),(0,i.kt)("li",{parentName:"ol"},"Determine the candidate with the lowest score and elect that candidate. Remove the elected\ncandidate from the pool of potential candidates."),(0,i.kt)("li",{parentName:"ol"},"The load for each edge connecting to the winning candidate is updated, with the edge load set to\nthe score of the candidate minus the voter's load, and the voter's load then set to the\ncandidate's score."),(0,i.kt)("li",{parentName:"ol"},"If there are more candidates to elect, go to Step 3. Otherwise, continue to step 8."),(0,i.kt)("li",{parentName:"ol"},"Now the stake is distributed amongst each nominator who backed at least one elected candidate.\nThe backing stake for each candidate is calculated by taking the budget of the voter and\nmultiplying by the edge load then dividing by the candidate load\n(",(0,i.kt)("inlineCode",{parentName:"li"},"voter_budget * edge_load / candidate_load"),").")),(0,i.kt)("h3",{id:"example-1"},"Example"),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Note: All numbers in this example are rounded off to three decimal places.")),(0,i.kt)("p",null,"In the following example, there are five voters and five candidates vying for three potential seats.\nEach voter ",(0,i.kt)("inlineCode",{parentName:"p"},"V1 - V5")," has an amount of stake equal to their number (e.g., ",(0,i.kt)("inlineCode",{parentName:"p"},"V1")," has stake of 1, ",(0,i.kt)("inlineCode",{parentName:"p"},"V2"),"\nhas stake of 2, etc.). Every voter is also going to have a ",(0,i.kt)("em",{parentName:"p"},"load,")," which initially starts at ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Filled 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")),(0,i.kt)("p",null,"Let 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."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Candidate 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")),(0,i.kt)("p",null,"The first step is easy - candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"E")," has 0 approval stake and can be ignored from here on out.\nThey will never be elected."),(0,i.kt)("p",null,"We can now calculate the initial scores of the candidates, which is ",(0,i.kt)("inlineCode",{parentName:"p"},"1 / approval_stake"),":"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Candidate 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")),(0,i.kt)("p",null,"For 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,i.kt)("inlineCode",{parentName:"p"},"0 / x"),", or 0. This\nmeans that this step can be safely ignored for the initial round."),(0,i.kt)("p",null,"Thus, the best (lowest) score for Round 0 is Candidate A, with a score of ",(0,i.kt)("inlineCode",{parentName:"p"},"0.091"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Candidates: 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")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Filled 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")),(0,i.kt)("p",null,"Candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"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."),(0,i.kt)("p",null,"We 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."),(0,i.kt)("p",null,"Any voter who had one of their choices for candidate fill the seat in this round (i.e., voters ",(0,i.kt)("inlineCode",{parentName:"p"},"V1"),",\n",(0,i.kt)("inlineCode",{parentName:"p"},"V2"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"V3"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"V5"),", who all voted for ",(0,i.kt)("inlineCode",{parentName:"p"},"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 ",(0,i.kt)("em",{parentName:"p"},"current")," voter load."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"edge_load = elected_candidate_score - voter_load\nvoter_load = elected_candidate_score\n")),(0,i.kt)("p",null,"In this instance, the score of the elected candidate is ",(0,i.kt)("inlineCode",{parentName:"p"},"0.091")," and the voter loads are all ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),". So\nfor each voter who voted for ",(0,i.kt)("inlineCode",{parentName:"p"},"A"),", we will calculate a new edge load ",(0,i.kt)("inlineCode",{parentName:"p"},"Voter")," -> ",(0,i.kt)("inlineCode",{parentName:"p"},"A")," of:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Edge load: 0.091 - 0 = 0.091\n")),(0,i.kt)("p",null,"and a new voter load of:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Voter load: 0.091\n")),(0,i.kt)("p",null,"As a reminder, here are the current scores. Loads of the voters are all ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Candidate B : 0.143\nCandidate C : 0.25\nCandidate D : 0.111\n")),(0,i.kt)("p",null,"Now, we go through the weighted graph and update the score of the candidate and the load of the\nedge, using the algorithm:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"candidate_score = candidate_score + ((voter_budget * voter_load) / candidate_approval_stake)\n")),(0,i.kt)("p",null,"Without walking through each step, this gives us the following modifications to the scores of the\ndifferent candidates."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"V1 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")),(0,i.kt)("p",null,"After scores are updated, the final scores for the candidates for this round are:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Candidate B: 0.182\nCandidate C: 0.25\nCandidate D: 0.162\n")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"D"),", with the lowest score, is elected. You will note that even though candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"B")," had more voters\nsupporting them, candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"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."),(0,i.kt)("p",null,"We then update the loads for the voters and edges as specified above for any voters who voted for\ncandidate ",(0,i.kt)("inlineCode",{parentName:"p"},"D")," (viz., ",(0,i.kt)("inlineCode",{parentName:"p"},"V4")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"V5"),") using the same formula as above."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Filled 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")),(0,i.kt)("p",null,"Following a similar process for Round 2, we start with initial candidate scores of:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Candidate B : 0.143\nCandidate C : 0.25\n")),(0,i.kt)("p",null,"We can then update the scores of the remaining two candidates according to the algorithm described\nabove."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"V1 updates B to 0.156\nV2 updates B to 0.182\nV4 updates B to 0.274\nV4 updates C to 0.412\n")),(0,i.kt)("p",null,"With the lowest score of ",(0,i.kt)("inlineCode",{parentName:"p"},"0.274"),", Candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"B")," claims the last open seat. Candidates ",(0,i.kt)("inlineCode",{parentName:"p"},"A"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"D"),", and\n",(0,i.kt)("inlineCode",{parentName:"p"},"B")," have been elected, and candidates ",(0,i.kt)("inlineCode",{parentName:"p"},"C")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"E")," are not."),(0,i.kt)("p",null,"Before moving on, we must perform a final load adjustment for the voters and the graph."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Filled 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")),(0,i.kt)("p",null,"Now 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."),(0,i.kt)("p",null,"In this example, the weighted graph ended up looking like this:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Nominator: V1\n Edge to A load= 0.091\n Edge to B load= 0.183\nNominator: V2\n Edge to A load= 0.091\n Edge to B load= 0.183\nNominator: V3\n Edge to A load= 0.091\nNominator: V4\n Edge to B load= 0.113\n Edge to D load= 0.162\nNominator: V5\n Edge to A load= 0.091\n Edge to D load= 0.071\n")),(0,i.kt)("p",null,"For instance, the budget of ",(0,i.kt)("inlineCode",{parentName:"p"},"V1")," is ",(0,i.kt)("inlineCode",{parentName:"p"},"1"),", the edge load to ",(0,i.kt)("inlineCode",{parentName:"p"},"A")," is ",(0,i.kt)("inlineCode",{parentName:"p"},"0.091"),", and the voter load is\n",(0,i.kt)("inlineCode",{parentName:"p"},"0.274"),". Using our equation:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"backing_stake (A) = voter_budget * edge_load / voter_load\n")),(0,i.kt)("p",null,"We can fill these variables in with:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"backing_stake (A) = 1 * 0.091 / 0.274 = 0.332\n")),(0,i.kt)("p",null,"For ",(0,i.kt)("inlineCode",{parentName:"p"},"V1")," backing stake of ",(0,i.kt)("inlineCode",{parentName:"p"},"B"),", you can simply replace the edge load value and re-calculate."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"backing_stake (B) = 1 * 0.183 / 0.274 = 0.668\n")),(0,i.kt)("p",null,"Note 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."),(0,i.kt)("p",null,"The final results are:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"A 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")),(0,i.kt)("p",null,"You will notice that the total amount of stake for candidates ",(0,i.kt)("inlineCode",{parentName:"p"},"A"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"D"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"B")," equals (aside from\nrounding errors) the total amount of stake of all the voters (",(0,i.kt)("inlineCode",{parentName:"p"},"1 + 2 + 3 + 4 + 5 = 15"),"). This is\nbecause each voter had at least one of their candidates fill a seat. Any voter whose had none of\ntheir candidates selected will also not have any stake in any of the elected candidates."),(0,i.kt)("h2",{id:"optimizations"},"Optimizations"),(0,i.kt)("p",null,"The results for nominating validators are further optimized for several purposes:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"To reduce the number of edges, i.e. to minimize the number of validators any nominator selects"),(0,i.kt)("li",{parentName:"ol"},"To ensure, as much as possible, an even distribution of stake among the validators"),(0,i.kt)("li",{parentName:"ol"},"Reduce the amount of block computation time")),(0,i.kt)("h3",{id:"high-level-description"},"High-Level Description"),(0,i.kt)("p",null,"After running the weighted Phragm\xe9n 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."),(0,i.kt)("p",null,"To minimize block computation time, the staking process is run as an\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/how-to-guides/offchain-workers/"},"off-chain worker"),". 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."),(0,i.kt)("p",null,"These optimizations will not be covered in-depth on this page. For more details, you can view the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/master/frame/elections-phragmen/src/lib.rs"},"Rust implementation of elections in Substrate"),",\nthe\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/master/frame/staking/src/lib.rs"},"Rust implementation of staking in Substrate"),",\nor the ",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhragm\xe9nwithpostprocessing")," method in the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/w3f/consensus/tree/master/NPoS"},"Python reference implementation"),". If you would\nlike to dive even more deeply, you can review the\n",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/protocols/NPoS/Overview#the-election-process"},"W3F Research Page on Sequential Phragm\xe9n Method"),"."),(0,i.kt)("h3",{id:"rationale-for-minimizing-the-number-of-validators-per-nominator"},"Rationale for Minimizing the Number of Validators Per Nominator"),(0,i.kt)("p",null,"Paying 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 ",(0,i.kt)("inlineCode",{parentName:"p"},"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."),(0,i.kt)("p",null,"While 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 goes\noffline or acts maliciously, then the nominator incurs a risk of a significant amount of slashing.\nNominators are thus allowed to nominate up to 16 different validators. However, after the weighted\nedge-reducing algorithm is run, the number of validators per nominator is minimized. Nominators are\nlikely to see themselves nominating a single active validator for an era."),(0,i.kt)("p",null,"At 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."),(0,i.kt)("h3",{id:"rationale-for-maintaining-an-even-distribution-of-stake"},"Rationale for Maintaining an Even Distribution of Stake"),(0,i.kt)("p",null,"Another 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: ",(0,i.kt)("inlineCode",{parentName:"p"},"{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).'),(0,i.kt)("p",null,"In contrast, imagine a different result with the same amount of total stake, but with that stake\nperfectly equally distributed: ",(0,i.kt)("inlineCode",{parentName:"p"},"{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."),(0,i.kt)("h3",{id:"rationale-for-reducing-block-computing-time"},"Rationale for Reducing Block Computing Time"),(0,i.kt)("p",null,"Running the Phragm\xe9n 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."),(0,i.kt)("p",null,"There are several restrictions put in place to limit the complexity of the election and payout. As\nalready mentioned, any given nominator can only select up to\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominations",defaultValue:16,mdxType:"RPC"}),"\n","\nvalidators to nominate. Conversely, a single validator can have only\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.maxNominatorsCount",defaultValue:5e4,mdxType:"RPC"}),"\n",'\nnominators. A drawback to this is that it is possible, if the number of nominators is very high or\nthe number of validators is very low, that all available validators may be "oversubscribed" and\nunable to accept more nominations. In this case, one may need a larger amount of stake to\nparticipate in staking, since nominations are priority-ranked in terms of amount of stake.'),(0,i.kt)("h3",{id:"phragmms-aka-balphragmms"},"Phragmms (aka Balphragmms)"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"Phragmms"),", formerly known as ",(0,i.kt)("inlineCode",{parentName:"p"},"Balphragmms"),", is a new election rule inspired by Phragm\xe9n and\ndeveloped in-house for Polkadot. In general,\nelection rules on blockchains is an active topic of research. This is due to the conflicting\nrequirements for election rules and blockchains: elections are computationally expensive, but\nblockchains are computationally limited. Thus, this work constitutes state of the art in terms of\noptimization."),(0,i.kt)("p",null,"Proportional 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 ",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhragmen"),", this new 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."),(0,i.kt)("p",null,"The security of a distributed and decentralized system such as\nPolkadot is directly related to the goal of\navoiding ",(0,i.kt)("em",{parentName:"p"},"overrepresentation")," of any minority. This is a stark contrast to traditional approaches to\nproportional representation axioms, which typically only seek to avoid underrepresentation."),(0,i.kt)("h4",{id:"maximin-support-objective-and-pjr"},"Maximin Support Objective and PJR"),(0,i.kt)("p",null,"This new election rule aims to achieve a constant-factor approximation guarantee for the ",(0,i.kt)("em",{parentName:"p"},"maximin\nsupport objective")," and the closely related ",(0,i.kt)("em",{parentName:"p"},"proportional justified representation")," (PJR) property."),(0,i.kt)("p",null,"The 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\u2019s validator nodes to be elected. The ",(0,i.kt)("inlineCode",{parentName:"p"},"Phragmms"),"\nrule, and the guarantees it provides in terms of security and proportionality, have been formalized\nin a ",(0,i.kt)("a",{parentName:"p",href:"https://arxiv.org/pdf/2004.12990.pdf"},"peer-reviewed paper"),")."),(0,i.kt)("p",null,"The PJR property considers the proportionality of the voter\u2019s 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\u2019s vote strength."),(0,i.kt)("h4",{id:"comparing-sequential-phragm\xe9n-mms-and-phragmms"},"Comparing Sequential Phragm\xe9n, MMS, and Phragmms"),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Sequential Phragm\xe9n")," (",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhragmen"),") and ",(0,i.kt)("inlineCode",{parentName:"p"},"MMS")," are two efficient election rules that both achieve\nPJR."),(0,i.kt)("p",null,"Currently, Polkadot employs the ",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhragmen"),"\nmethod for validator and council elections. Although ",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhramen")," has a very fast runtime, it does\nnot provide constant-factor approximation for the maximin support problem. This is due to\n",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhramen")," only performing an ",(0,i.kt)("em",{parentName:"p"},"approximate")," rebalancing of the distribution of stake."),(0,i.kt)("p",null,"In contrast, ",(0,i.kt)("inlineCode",{parentName:"p"},"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, ",(0,i.kt)("inlineCode",{parentName:"p"},"MMS")," computes a balanced\nedge weight vector for each possible augmented committee when a new candidate is added, which is\ncomputationally expensive."),(0,i.kt)("p",null,"We introduce a new heuristic inspired by ",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhragmen"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"PhragMMS"),", which maintains a comparable\nruntime to ",(0,i.kt)("inlineCode",{parentName:"p"},"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."),(0,i.kt)("h4",{id:"the-new-election-rule-phragmms"},"The New Election Rule: Phragmms"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"Phragmms")," is an iterative greedy algorithm that starts with an empty committee and alternates\nbetween the ",(0,i.kt)("inlineCode",{parentName:"p"},"Phragmms")," heuristic for inserting a new candidate and ",(0,i.kt)("em",{parentName:"p"},"rebalancing")," by replacing the\nweight vector with a balanced one. The main differentiator between ",(0,i.kt)("inlineCode",{parentName:"p"},"Phragmms")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhragmen")," is\nthat the latter only perform an approximate rebalancing. Details can be found in\n",(0,i.kt)("a",{parentName:"p",href:"#rationale-for-maintaining-an-even-distribution-of-stake"},"Balanced Stake Distribution"),"."),(0,i.kt)("p",null,"The 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 ",(0,i.kt)("em",{parentName:"p"},"A"),",\nthe score of an unelected candidate ",(0,i.kt)("em",{parentName:"p"},"c")," is an easy-to-compute rough estimate of what would be the\nsize of the least stake backing if we added ",(0,i.kt)("em",{parentName:"p"},"c")," to committee ",(0,i.kt)("em",{parentName:"p"},"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:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Feasibility,"),(0,i.kt)("li",{parentName:"ol"},"Balance and"),(0,i.kt)("li",{parentName:"ol"},"Local Optimality - The least stake backing of ",(0,i.kt)("em",{parentName:"li"},"A")," is higher than the highest score among\nunelected candidates")),(0,i.kt)("p",null,"If 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."),(0,i.kt)("p",null,"A 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 ",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhragmen")," also has\na notion of score for unelected candidates, ",(0,i.kt)("inlineCode",{parentName:"p"},"Phragmms")," can be seen as a natural complication of the\n",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhragmen")," algorithm, where ",(0,i.kt)("inlineCode",{parentName:"p"},"Phragmms")," always grants higher score values to candidates and thus\ninserts them with higher support values."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"To summarize, the main differences between the two rules are:")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"In ",(0,i.kt)("inlineCode",{parentName:"li"},"seqPhragmen"),", lower scores are better, whereas in ",(0,i.kt)("inlineCode",{parentName:"li"},"Phragmms"),", higher scores are better."),(0,i.kt)("li",{parentName:"ul"},"Inspired by ",(0,i.kt)("inlineCode",{parentName:"li"},"seqPhragmen"),", the scoring system of ",(0,i.kt)("inlineCode",{parentName:"li"},"Phragmms")," can be considered to be more intuitive\nand does a better job at estimating the value of adding a candidate to the current solution, and\nhence leads to a better candidate-selection heuristic."),(0,i.kt)("li",{parentName:"ul"},"Unlike ",(0,i.kt)("inlineCode",{parentName:"li"},"seqPhragmen"),", in ",(0,i.kt)("inlineCode",{parentName:"li"},"Phragmms"),", the edge weight vector ",(0,i.kt)("em",{parentName:"li"},"w")," is completely rebalanced after\neach iteration of the algorithm.")),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"Phragmms")," election rule is currently being implemented on\nPolkadot. Once completed, it will become one\nof the most sophisticated election rules implemented on a blockchain. For the first time, this\nelection rule will provide both fair representation (PJR) and security (constant-factor\napproximation for the maximin support objection) to a blockchain network."),(0,i.kt)("h4",{id:"algorithm-2"},"Algorithm"),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"Phragmms")," algorithm iterates through the available seats, starting with an empty committee of\nsize ",(0,i.kt)("em",{parentName:"p"},"k"),":"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Initialize an empty committee ",(0,i.kt)("em",{parentName:"p"},"A")," and zero edge weight vector ",(0,i.kt)("em",{parentName:"p"},"w = 0"),".")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Repeat ",(0,i.kt)("em",{parentName:"p"},"k")," times:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Find the unelected candidate with highest score and add it to committee ",(0,i.kt)("em",{parentName:"li"},"A"),"."),(0,i.kt)("li",{parentName:"ul"},"Re-balance the weight vector ",(0,i.kt)("em",{parentName:"li"},"w")," for the new committee ",(0,i.kt)("em",{parentName:"li"},"A"),"."))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Return ",(0,i.kt)("em",{parentName:"p"},"A")," and ",(0,i.kt)("em",{parentName:"p"},"w"),"."))),(0,i.kt)("h2",{id:"external-resources"},"External Resources"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://arxiv.org/pdf/2004.12990.pdf"},"Phragmms")," - W3F research paper that expands on the\nsequential Phragm\xe9n method."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://research.web3.foundation/Polkadot/protocols/NPoS/Overview"},"W3F Research Page on NPoS")," -\nAn overview of Nominated Proof of Stake as its applied to Polkadot."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/w3f/consensus/tree/master/NPoS"},"Python Reference Implementations")," - Python\nimplementations of Simple and Complicated Phragm\xe9n methods."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/paritytech/substrate/blob/master/frame/staking/src/lib.rs"},"Substrate Implementation")," -\nRust implementation used in Substrate."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://arxiv.org/pdf/1611.08826.pdf"},"Phragm\xe9n's and Thiele's Election Methods")," - 95-page paper\nexplaining Phragm\xe9n's election methods in detail."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://ojs.aaai.org/index.php/AAAI/article/view/10598"},"Phragm\xe9n\u2019s Voting Methods and Justified Representation")," -\nThis paper by Brill ",(0,i.kt)("em",{parentName:"li"},"et al.")," is the source for the simple Phragm\xe9n method, along with proofs about\nits properties."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/kianenigma/offline-phragmen"},"Offline Phragm\xe9n")," - Script to generate the\nPhragm\xe9n validator election outcome before the start of an era.")))}k.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/b38833d4.6c30a0a0.js b/assets/js/b38833d4.6c30a0a0.js new file mode 100644 index 000000000000..e273b7345904 --- /dev/null +++ b/assets/js/b38833d4.6c30a0a0.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[9062],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>m});var n=a(74165),o=a(15861),i=a(67294),r=a(87152),l=a(17145),s=a(67425);function d(e,t,a){return h.apply(this,arguments)}function h(){return(h=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var i,s,d,h,p;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,s=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return d=new r.U(i),e.next=21,l.G.create({provider:d});case 21:h=e.sent,(p=a.split(".")).forEach((function(e){e in h&&(h=h[e])})),e.t1=p[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return s=h.toString(),e.abrupt("break",35);case 29:return e.next=31,h();case 31:return s=(s=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+p[0]+") in "+a);case 35:return e.abrupt("return",s);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function p(e,t,a,n){switch(t){case"humanReadable":(0,s.HumanReadable)(e,a,n);break;case"precise":(0,s.Precise)(e,a,n);break;case"blocksToDays":(0,s.BlocksToDays)(e,n);break;case"percentage":(0,s.Percentage)(e,n);break;case"permillToPercent":(0,s.PermillToPercent)(e,n);break;case"arrayLength":(0,s.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const m=function(e){var t=e.network,a=e.path,r=e.defaultValue,l=e.filter,s=void 0===l?void 0:l,h=(0,i.useState)(""),m=h[0],c=h[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==s?p(r.toString(),s,t,c):c(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(t,a,c);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==s?p(o,s,t,c):c(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(l){console.log(l)}}}),[]),m}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},2774:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>d,default:()=>k,frontMatter:()=>s,metadata:()=>h,toc:()=>m});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),r=a(47940),l=["components"],s={id:"learn-phragmen",title:"NPoS Election Algorithms",sidebar_label:"NPoS Election Algorithms",description:"The Election Methods used in Polkadot's NPoS Mechanism.",keywords:["phragmen","sequential phragm\xe9n method","elections","algorithm","phragmms"],slug:"../learn-phragmen"},d=void 0,h={unversionedId:"learn/learn-phragmen",id:"learn/learn-phragmen",title:"NPoS Election Algorithms",description:"The Election Methods used in Polkadot's NPoS Mechanism.",source:"@site/../docs/learn/learn-phragmen.md",sourceDirName:"learn",slug:"/learn-phragmen",permalink:"/docs/learn-phragmen",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-phragmen.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1688135081,formattedLastUpdatedAt:"Jun 30, 2023",frontMatter:{id:"learn-phragmen",title:"NPoS Election Algorithms",sidebar_label:"NPoS Election Algorithms",description:"The Election Methods used in Polkadot's NPoS Mechanism.",keywords:["phragmen","sequential phragm\xe9n method","elections","algorithm","phragmms"],slug:"../learn-phragmen"},sidebar:"docs",previous:{title:"Cryptography",permalink:"/docs/learn-cryptography"},next:{title:"How-to Guides",permalink:"/docs/learn-guides-index"}},p={},m=[{value:"NPoS Election Algorithms",id:"npos-election-algorithms",level:2},{value:"What is the sequential Phragm\xe9n method?",id:"what-is-the-sequential-phragm\xe9n-method",level:2},{value:"Validator Elections",id:"validator-elections",level:3},{value:"Off-Chain Phragm\xe9n",id:"off-chain-phragm\xe9n",level:4},{value:"Council Elections",id:"council-elections",level:3},{value:"What does it mean for node operators?",id:"what-does-it-mean-for-node-operators",level:2},{value:"Understanding Phragm\xe9n",id:"understanding-phragm\xe9n",level:2},{value:"Basic Phragm\xe9n",id:"basic-phragm\xe9n",level:3},{value:"Rationale",id:"rationale",level:3},{value:"Algorithm",id:"algorithm",level:3},{value:"Example",id:"example",level:3},{value:"Weighted Phragm\xe9n",id:"weighted-phragm\xe9n",level:3},{value:"Rationale",id:"rationale-1",level:3},{value:"Algorithm",id:"algorithm-1",level:3},{value:"Example",id:"example-1",level:3},{value:"Optimizations",id:"optimizations",level:2},{value:"High-Level Description",id:"high-level-description",level:3},{value:"Rationale for Minimizing the Number of Validators Per Nominator",id:"rationale-for-minimizing-the-number-of-validators-per-nominator",level:3},{value:"Rationale for Maintaining an Even Distribution of Stake",id:"rationale-for-maintaining-an-even-distribution-of-stake",level:3},{value:"Rationale for Reducing Block Computing Time",id:"rationale-for-reducing-block-computing-time",level:3},{value:"Phragmms (aka Balphragmms)",id:"phragmms-aka-balphragmms",level:3},{value:"Maximin Support Objective and PJR",id:"maximin-support-objective-and-pjr",level:4},{value:"Comparing Sequential Phragm\xe9n, MMS, and Phragmms",id:"comparing-sequential-phragm\xe9n-mms-and-phragmms",level:4},{value:"The New Election Rule: Phragmms",id:"the-new-election-rule-phragmms",level:4},{value:"Algorithm",id:"algorithm-2",level:4},{value:"External Resources",id:"external-resources",level:2}],c={toc:m},u="wrapper";function k(e){var t=e.components,a=(0,o.Z)(e,l);return(0,i.kt)(u,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"npos-election-algorithms"},"NPoS Election Algorithms"),(0,i.kt)("p",null,"Since validators are paid almost equally in\nPolkadot in each era, it is important that the\nstake behind each validator is uniformly spread out. An election algorithm for Nominated Proof of\nStaking (NPoS) on Polkadot will try to\noptimize three metrics when computing a solution graph of nominators and validators:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Maximize the total amount at stake."),(0,i.kt)("li",{parentName:"ol"},"Maximize the stake behind the minimally staked validator."),(0,i.kt)("li",{parentName:"ol"},"Minimize the variance of the stake in the set.")),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("a",{parentName:"p",href:"#understanding-phragm%C3%A9n"},"Sequential Phragm\xe9n"),", ",(0,i.kt)("a",{parentName:"p",href:"#phragmms-fka-balphragmms"},"Phragmms")," and\n",(0,i.kt)("a",{parentName:"p",href:"https://crates.parity.io/sp_npos_elections/balancing/fn.balance.html"},"Star balancing")," are a few\nnotable algorithms used for computing the NPoS solutions in Polkadot and Kusama.")),(0,i.kt)("h2",{id:"what-is-the-sequential-phragm\xe9n-method"},"What is the sequential Phragm\xe9n method?"),(0,i.kt)("p",null,"The sequential Phragm\xe9n method is a multi-winner election method introduced by Edvard Phragm\xe9n in\nthe 1890s. The quote below taken from the reference ",(0,i.kt)("a",{parentName:"p",href:"#external-resources"},"Phragm\xe9n paper")," sums up\nthe purpose of the sequential Phragm\xe9n method:"),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"The problem that Phragm\xe9n\u2019s methods try to solve is that of electing a set of a given numbers of\npersons from a larger set of candidates. Phragm\xe9n discussed this in the context of a parliamentary\nelection in a multi-member constituency; the same problem can, of course, also occur in local\nelections, but also in many other situations such as electing a board or a committee in an\norganization.")),(0,i.kt)("h3",{id:"validator-elections"},"Validator Elections"),(0,i.kt)("p",null,"The sequential Phragm\xe9n 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."),(0,i.kt)("h4",{id:"off-chain-phragm\xe9n"},"Off-Chain Phragm\xe9n"),(0,i.kt)("p",null,"Given the large set of nominators and validators, Phragm\xe9n's method is a difficult optimization\nproblem. Polkadot uses off-chain workers to\ncompute the result off-chain and submit a transaction to propose the set of winners. The reason for\nperforming this computation off-chain is to keep a constant block time of six seconds and prevent\nlong block times at the end of each era, when the validator election takes place."),(0,i.kt)("admonition",{title:"Staking Miners",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The process of computing the optimal solution for NPoS election can be delegated to\n",(0,i.kt)("a",{parentName:"p",href:"learn-staking-miner"},"Staking Miners"),".")),(0,i.kt)("h3",{id:"council-elections"},"Council Elections"),(0,i.kt)("admonition",{title:"Deprecated in Polkadot OpenGov",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Phragmen was used for Council elections in ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-governance"},"Governance v1"),".")),(0,i.kt)("p",null,"The Phragm\xe9n 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\xe9n 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."),(0,i.kt)("h2",{id:"what-does-it-mean-for-node-operators"},"What does it mean for node operators?"),(0,i.kt)("p",null,"Phragm\xe9n 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."),(0,i.kt)("p",null,"You can use\n",(0,i.kt)("a",{parentName:"p",href:"https://gist.github.com/tugytur/3531cc618bfbb42f1a6cfb44d9906197"},"this offline-phragm\xe9n")," tool for\npredicting the outcome of a validator election ahead of a new election."),(0,i.kt)("h2",{id:"understanding-phragm\xe9n"},"Understanding Phragm\xe9n"),(0,i.kt)("p",null,"This section explains the sequential Phragm\xe9n method in-depth and walks through examples."),(0,i.kt)("h3",{id:"basic-phragm\xe9n"},"Basic Phragm\xe9n"),(0,i.kt)("h3",{id:"rationale"},"Rationale"),(0,i.kt)("p",null,"In order to understand the Weighted Phragm\xe9n method, we must first understand the basic Phragm\xe9n\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."),(0,i.kt)("p",null,"The 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 have an effect on the final result, and\nso votes of this nature are meaningless."),(0,i.kt)("p",null,'Note 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 ',(0,i.kt)("inlineCode",{parentName:"p"},"5")," voting for that candidate."),(0,i.kt)("p",null,'The particular algorithm we call here the "Basic Phragm\xe9n" was first described by Brill ',(0,i.kt)("em",{parentName:"p"},"et al.")," in\ntheir paper\n",(0,i.kt)("a",{parentName:"p",href:"https://ojs.aaai.org/index.php/AAAI/article/view/10598"},'"Phragm\xe9n\u2019s Voting Methods and Justified Representation"'),"."),(0,i.kt)("h3",{id:"algorithm"},"Algorithm"),(0,i.kt)("p",null,"The Phragm\xe9n method will iterate, selecting one seat at a time, according to the following rules:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Voters submit their ballots, marking which candidates they approve. Ballots will not be modified\nafter submission."),(0,i.kt)("li",{parentName:"ol"},"An initial load of 0 is set for each ballot."),(0,i.kt)("li",{parentName:"ol"},"The candidate who wins the next available seat is the one where the ballots of their supporters\nwould have the ",(0,i.kt)("em",{parentName:"li"},"least average (mean) cost")," if that candidate wins."),(0,i.kt)("li",{parentName:"ol"},"The ",(0,i.kt)("em",{parentName:"li"},"n")," ballots that approved that winning candidate get ",(0,i.kt)("em",{parentName:"li"},"1/n")," added to their load."),(0,i.kt)("li",{parentName:"ol"},"The load of all ballots that supported the winner of this round are averaged out so that they are\nequal."),(0,i.kt)("li",{parentName:"ol"},"If there are any more seats, go back to step 3. Otherwise, the selection ends.")),(0,i.kt)("h3",{id:"example"},"Example"),(0,i.kt)("p",null,"Let's walk through an example with four candidates vying for three seats, and five voters."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Open 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")),(0,i.kt)("p",null,"In this example, we can see that voter ",(0,i.kt)("inlineCode",{parentName:"p"},"V1")," approves only of candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"B"),", voter ",(0,i.kt)("inlineCode",{parentName:"p"},"V2")," approves of\ncandidates ",(0,i.kt)("inlineCode",{parentName:"p"},"C")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"D"),", etc. Voters can approve any number of candidates between 1 and\n",(0,i.kt)("inlineCode",{parentName:"p"},"number_of_candidates - 1"),'. An initial "load" of ',(0,i.kt)("inlineCode",{parentName:"p"},"0")," is set for each ballot (",(0,i.kt)("inlineCode",{parentName:"p"},"L0")," = load after round\n",(0,i.kt)("inlineCode",{parentName:"p"},"0"),', i.e., the "round" before the first round). We shall see shortly how this load is updated and\nused to select candidates.'),(0,i.kt)("p",null,'We 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.'),(0,i.kt)("p",null,"For 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 ",(0,i.kt)("inlineCode",{parentName:"p"},"1/n")," will\nget smaller as ",(0,i.kt)("inlineCode",{parentName:"p"},"n")," increases. For this first example round, for instance, candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"A")," had only one\nballot vote for them. Thus, the average load for candidate A is ",(0,i.kt)("inlineCode",{parentName:"p"},"1/1"),", or 1. Candidate C has two\nballots approving of them, so the average load is ",(0,i.kt)("inlineCode",{parentName:"p"},"1/2"),". Candidate B has the lowest average load, at\n",(0,i.kt)("inlineCode",{parentName:"p"},"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."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Filled 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")),(0,i.kt)("p",null,"We are now down to candidates ",(0,i.kt)("inlineCode",{parentName:"p"},"A"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"C"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"D")," for two open seats. There is only one voter (",(0,i.kt)("inlineCode",{parentName:"p"},"V4"),")\nfor ",(0,i.kt)("inlineCode",{parentName:"p"},"A"),", with load ",(0,i.kt)("inlineCode",{parentName:"p"},"1/4"),". ",(0,i.kt)("inlineCode",{parentName:"p"},"C")," has two voters, ",(0,i.kt)("inlineCode",{parentName:"p"},"V2")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"V5"),", with loads of ",(0,i.kt)("inlineCode",{parentName:"p"},"0")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"1/4"),". ",(0,i.kt)("inlineCode",{parentName:"p"},"D")," has\nthree voters approving of them, ",(0,i.kt)("inlineCode",{parentName:"p"},"V2"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"V3"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"V5"),", with loads of ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"1/4"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"1/4"),",\nrespectively."),(0,i.kt)("p",null,"If Candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"A")," wins, the average load would be ",(0,i.kt)("inlineCode",{parentName:"p"},"(1/4 + 1/1) / 1"),", or ",(0,i.kt)("inlineCode",{parentName:"p"},"5/4"),". If candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"C")," wins,\nthe average load would be ",(0,i.kt)("inlineCode",{parentName:"p"},"((0 + 1/2) + (1/4 + 1/2)) / 2"),", or ",(0,i.kt)("inlineCode",{parentName:"p"},"5/8"),". If candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"D")," wins, the\naverage load would be ",(0,i.kt)("inlineCode",{parentName:"p"},"((0 + 1/3) + (1/4 + 1/3) + (1/4 + 1/3)) / 3"),", or ",(0,i.kt)("inlineCode",{parentName:"p"},"1/2"),". Since ",(0,i.kt)("inlineCode",{parentName:"p"},"1/2")," is the\nlowest average load, candidate D wins the second round."),(0,i.kt)("p",null,"Now everybody who voted for Candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"D")," has their load set to the average, ",(0,i.kt)("inlineCode",{parentName:"p"},"1/2")," of all the loads."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Filled 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")),(0,i.kt)("p",null,"There is now one seat open and two candidates, ",(0,i.kt)("inlineCode",{parentName:"p"},"A")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"C"),". Voter ",(0,i.kt)("inlineCode",{parentName:"p"},"V4")," is the only one voting for\n",(0,i.kt)("inlineCode",{parentName:"p"},"A"),", so if ",(0,i.kt)("inlineCode",{parentName:"p"},"A")," wins then the average load would be ",(0,i.kt)("inlineCode",{parentName:"p"},"(1/4 + 1/1) / 1"),", or ",(0,i.kt)("inlineCode",{parentName:"p"},"5/4"),". Voters ",(0,i.kt)("inlineCode",{parentName:"p"},"V2")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"V5"),"\n(both with load ",(0,i.kt)("inlineCode",{parentName:"p"},"1/2"),") support ",(0,i.kt)("inlineCode",{parentName:"p"},"C"),", so if ",(0,i.kt)("inlineCode",{parentName:"p"},"C")," wins the average load would be\n",(0,i.kt)("inlineCode",{parentName:"p"},"((1/2 + 1/2) + (1/2 + 1/2)) / 2"),", or ",(0,i.kt)("inlineCode",{parentName:"p"},"1"),". Since the average load would be lower with ",(0,i.kt)("inlineCode",{parentName:"p"},"C"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"C")," wins\nthe final seat."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Filled 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")),(0,i.kt)("p",null,"An 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,i.kt)("inlineCode",{parentName:"p"},"0")," and there\nare no seats filled. After the first round, the total of all loads is ",(0,i.kt)("inlineCode",{parentName:"p"},"1"),", after the second round it\nis ",(0,i.kt)("inlineCode",{parentName:"p"},"2"),", etc."),(0,i.kt)("h3",{id:"weighted-phragm\xe9n"},"Weighted Phragm\xe9n"),(0,i.kt)("h3",{id:"rationale-1"},"Rationale"),(0,i.kt)("p",null,"While this method works well if all voters have equal weight, this is not the case in\nPolkadot. Elections for both validators and\ncandidates for the Polkadot Council are\nweighted by the number of tokens held by the voters. This makes elections more similar to a\ncorporate shareholder election than a traditional political election, where some members have more\npull than others. Someone with a single token will have much less voting power than someone\nwith 100. Although this may seem anti-democratic, in a pseudonymous system, it is trivial for\nsomeone with 100 tokens to create 100 different accounts and spread their wealth to all of their\npseudonyms."),(0,i.kt)("p",null,"Therefore, 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\xe9n method allows us to reach these goals."),(0,i.kt)("h3",{id:"algorithm-1"},"Algorithm"),(0,i.kt)("p",null,"Weighted Phragm\xe9n is similar to Basic Phragm\xe9n 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."),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},'NOTE: in terms of validator selection, for the following algorithm, you can think of "voters" as\n"nominators" and "candidates" as "validators".')),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},'Candidates are elected, one per round, and added to the set of successful candidates (they have\nwon a "seat"). This aspect of the algorithm is very similar to the "basic Phragm\xe9n" algorithm\ndescribed above.'),(0,i.kt)("li",{parentName:"ol"},"However, as candidates are elected, a weighted mapping is built, defining the weights of each\nselection of a validator by each nominator.")),(0,i.kt)("p",null,"In more depth, the algorithm operates like so:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Create a list of all voters, their total amount of stake, and which validators they support."),(0,i.kt)("li",{parentName:"ol"},"Generate an initial edge-weighted graph mapping from voters to candidates, where each edge weight\nis the total ",(0,i.kt)("em",{parentName:"li"},"potential")," weight (stake) given by that voter. The sum of all potential weight for\na given candidate is called their ",(0,i.kt)("em",{parentName:"li"},"approval stake"),"."),(0,i.kt)("li",{parentName:"ol"},"Now we start electing candidates. For the list of all candidates who have not been elected, get\ntheir score, which is equal to ",(0,i.kt)("inlineCode",{parentName:"li"},"1 / approval_stake"),"."),(0,i.kt)("li",{parentName:"ol"},"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",(0,i.kt)("inlineCode",{parentName:"li"},"(voter_budget * voter_load / candidate_approval_stake)"),"."),(0,i.kt)("li",{parentName:"ol"},"Determine the candidate with the lowest score and elect that candidate. Remove the elected\ncandidate from the pool of potential candidates."),(0,i.kt)("li",{parentName:"ol"},"The load for each edge connecting to the winning candidate is updated, with the edge load set to\nthe score of the candidate minus the voter's load, and the voter's load then set to the\ncandidate's score."),(0,i.kt)("li",{parentName:"ol"},"If there are more candidates to elect, go to Step 3. Otherwise, continue to step 8."),(0,i.kt)("li",{parentName:"ol"},"Now the stake is distributed amongst each nominator who backed at least one elected candidate.\nThe backing stake for each candidate is calculated by taking the budget of the voter and\nmultiplying by the edge load then dividing by the candidate load\n(",(0,i.kt)("inlineCode",{parentName:"li"},"voter_budget * edge_load / candidate_load"),").")),(0,i.kt)("h3",{id:"example-1"},"Example"),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Note: All numbers in this example are rounded off to three decimal places.")),(0,i.kt)("p",null,"In the following example, there are five voters and five candidates vying for three potential seats.\nEach voter ",(0,i.kt)("inlineCode",{parentName:"p"},"V1 - V5")," has an amount of stake equal to their number (e.g., ",(0,i.kt)("inlineCode",{parentName:"p"},"V1")," has stake of 1, ",(0,i.kt)("inlineCode",{parentName:"p"},"V2"),"\nhas stake of 2, etc.). Every voter is also going to have a ",(0,i.kt)("em",{parentName:"p"},"load,")," which initially starts at ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Filled 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")),(0,i.kt)("p",null,"Let 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."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Candidate 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")),(0,i.kt)("p",null,"The first step is easy - candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"E")," has 0 approval stake and can be ignored from here on out.\nThey will never be elected."),(0,i.kt)("p",null,"We can now calculate the initial scores of the candidates, which is ",(0,i.kt)("inlineCode",{parentName:"p"},"1 / approval_stake"),":"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Candidate 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")),(0,i.kt)("p",null,"For 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,i.kt)("inlineCode",{parentName:"p"},"0 / x"),", or 0. This\nmeans that this step can be safely ignored for the initial round."),(0,i.kt)("p",null,"Thus, the best (lowest) score for Round 0 is Candidate A, with a score of ",(0,i.kt)("inlineCode",{parentName:"p"},"0.091"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Candidates: 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")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Filled 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")),(0,i.kt)("p",null,"Candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"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."),(0,i.kt)("p",null,"We 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."),(0,i.kt)("p",null,"Any voter who had one of their choices for candidate fill the seat in this round (i.e., voters ",(0,i.kt)("inlineCode",{parentName:"p"},"V1"),",\n",(0,i.kt)("inlineCode",{parentName:"p"},"V2"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"V3"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"V5"),", who all voted for ",(0,i.kt)("inlineCode",{parentName:"p"},"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 ",(0,i.kt)("em",{parentName:"p"},"current")," voter load."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"edge_load = elected_candidate_score - voter_load\nvoter_load = elected_candidate_score\n")),(0,i.kt)("p",null,"In this instance, the score of the elected candidate is ",(0,i.kt)("inlineCode",{parentName:"p"},"0.091")," and the voter loads are all ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),". So\nfor each voter who voted for ",(0,i.kt)("inlineCode",{parentName:"p"},"A"),", we will calculate a new edge load ",(0,i.kt)("inlineCode",{parentName:"p"},"Voter")," -> ",(0,i.kt)("inlineCode",{parentName:"p"},"A")," of:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Edge load: 0.091 - 0 = 0.091\n")),(0,i.kt)("p",null,"and a new voter load of:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Voter load: 0.091\n")),(0,i.kt)("p",null,"As a reminder, here are the current scores. Loads of the voters are all ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Candidate B : 0.143\nCandidate C : 0.25\nCandidate D : 0.111\n")),(0,i.kt)("p",null,"Now, we go through the weighted graph and update the score of the candidate and the load of the\nedge, using the algorithm:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"candidate_score = candidate_score + ((voter_budget * voter_load) / candidate_approval_stake)\n")),(0,i.kt)("p",null,"Without walking through each step, this gives us the following modifications to the scores of the\ndifferent candidates."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"V1 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")),(0,i.kt)("p",null,"After scores are updated, the final scores for the candidates for this round are:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Candidate B: 0.182\nCandidate C: 0.25\nCandidate D: 0.162\n")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"D"),", with the lowest score, is elected. You will note that even though candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"B")," had more voters\nsupporting them, candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"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."),(0,i.kt)("p",null,"We then update the loads for the voters and edges as specified above for any voters who voted for\ncandidate ",(0,i.kt)("inlineCode",{parentName:"p"},"D")," (viz., ",(0,i.kt)("inlineCode",{parentName:"p"},"V4")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"V5"),") using the same formula as above."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Filled 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")),(0,i.kt)("p",null,"Following a similar process for Round 2, we start with initial candidate scores of:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Candidate B : 0.143\nCandidate C : 0.25\n")),(0,i.kt)("p",null,"We can then update the scores of the remaining two candidates according to the algorithm described\nabove."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"V1 updates B to 0.156\nV2 updates B to 0.182\nV4 updates B to 0.274\nV4 updates C to 0.412\n")),(0,i.kt)("p",null,"With the lowest score of ",(0,i.kt)("inlineCode",{parentName:"p"},"0.274"),", Candidate ",(0,i.kt)("inlineCode",{parentName:"p"},"B")," claims the last open seat. Candidates ",(0,i.kt)("inlineCode",{parentName:"p"},"A"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"D"),", and\n",(0,i.kt)("inlineCode",{parentName:"p"},"B")," have been elected, and candidates ",(0,i.kt)("inlineCode",{parentName:"p"},"C")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"E")," are not."),(0,i.kt)("p",null,"Before moving on, we must perform a final load adjustment for the voters and the graph."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Filled 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")),(0,i.kt)("p",null,"Now 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."),(0,i.kt)("p",null,"In this example, the weighted graph ended up looking like this:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Nominator: V1\n Edge to A load= 0.091\n Edge to B load= 0.183\nNominator: V2\n Edge to A load= 0.091\n Edge to B load= 0.183\nNominator: V3\n Edge to A load= 0.091\nNominator: V4\n Edge to B load= 0.113\n Edge to D load= 0.162\nNominator: V5\n Edge to A load= 0.091\n Edge to D load= 0.071\n")),(0,i.kt)("p",null,"For instance, the budget of ",(0,i.kt)("inlineCode",{parentName:"p"},"V1")," is ",(0,i.kt)("inlineCode",{parentName:"p"},"1"),", the edge load to ",(0,i.kt)("inlineCode",{parentName:"p"},"A")," is ",(0,i.kt)("inlineCode",{parentName:"p"},"0.091"),", and the voter load is\n",(0,i.kt)("inlineCode",{parentName:"p"},"0.274"),". Using our equation:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"backing_stake (A) = voter_budget * edge_load / voter_load\n")),(0,i.kt)("p",null,"We can fill these variables in with:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"backing_stake (A) = 1 * 0.091 / 0.274 = 0.332\n")),(0,i.kt)("p",null,"For ",(0,i.kt)("inlineCode",{parentName:"p"},"V1")," backing stake of ",(0,i.kt)("inlineCode",{parentName:"p"},"B"),", you can simply replace the edge load value and re-calculate."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"backing_stake (B) = 1 * 0.183 / 0.274 = 0.668\n")),(0,i.kt)("p",null,"Note 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."),(0,i.kt)("p",null,"The final results are:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"A 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")),(0,i.kt)("p",null,"You will notice that the total amount of stake for candidates ",(0,i.kt)("inlineCode",{parentName:"p"},"A"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"D"),", and ",(0,i.kt)("inlineCode",{parentName:"p"},"B")," equals (aside from\nrounding errors) the total amount of stake of all the voters (",(0,i.kt)("inlineCode",{parentName:"p"},"1 + 2 + 3 + 4 + 5 = 15"),"). This is\nbecause each voter had at least one of their candidates fill a seat. Any voter whose had none of\ntheir candidates selected will also not have any stake in any of the elected candidates."),(0,i.kt)("h2",{id:"optimizations"},"Optimizations"),(0,i.kt)("p",null,"The results for nominating validators are further optimized for several purposes:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"To reduce the number of edges, i.e. to minimize the number of validators any nominator selects"),(0,i.kt)("li",{parentName:"ol"},"To ensure, as much as possible, an even distribution of stake among the validators"),(0,i.kt)("li",{parentName:"ol"},"Reduce the amount of block computation time")),(0,i.kt)("h3",{id:"high-level-description"},"High-Level Description"),(0,i.kt)("p",null,"After running the weighted Phragm\xe9n 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."),(0,i.kt)("p",null,"To minimize block computation time, the staking process is run as an\n",(0,i.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/how-to-guides/offchain-workers/"},"off-chain worker"),". 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."),(0,i.kt)("p",null,"These optimizations will not be covered in-depth on this page. For more details, you can view the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/master/frame/elections-phragmen/src/lib.rs"},"Rust implementation of elections in Substrate"),",\nthe\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/master/frame/staking/src/lib.rs"},"Rust implementation of staking in Substrate"),",\nor the ",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhragm\xe9nwithpostprocessing")," method in the\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/w3f/consensus/tree/master/NPoS"},"Python reference implementation"),". If you would\nlike to dive even more deeply, you can review the\n",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/protocols/NPoS/Overview#the-election-process"},"W3F Research Page on Sequential Phragm\xe9n Method"),"."),(0,i.kt)("h3",{id:"rationale-for-minimizing-the-number-of-validators-per-nominator"},"Rationale for Minimizing the Number of Validators Per Nominator"),(0,i.kt)("p",null,"Paying 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 ",(0,i.kt)("inlineCode",{parentName:"p"},"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."),(0,i.kt)("p",null,"While 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 goes\noffline or acts maliciously, then the nominator incurs a risk of a significant amount of slashing.\nNominators are thus allowed to nominate up to 16 different validators. However, after the weighted\nedge-reducing algorithm is run, the number of validators per nominator is minimized. Nominators are\nlikely to see themselves nominating a single active validator for an era."),(0,i.kt)("p",null,"At 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."),(0,i.kt)("h3",{id:"rationale-for-maintaining-an-even-distribution-of-stake"},"Rationale for Maintaining an Even Distribution of Stake"),(0,i.kt)("p",null,"Another 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: ",(0,i.kt)("inlineCode",{parentName:"p"},"{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).'),(0,i.kt)("p",null,"In contrast, imagine a different result with the same amount of total stake, but with that stake\nperfectly equally distributed: ",(0,i.kt)("inlineCode",{parentName:"p"},"{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."),(0,i.kt)("h3",{id:"rationale-for-reducing-block-computing-time"},"Rationale for Reducing Block Computing Time"),(0,i.kt)("p",null,"Running the Phragm\xe9n 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."),(0,i.kt)("p",null,"There are several restrictions put in place to limit the complexity of the election and payout. As\nalready mentioned, any given nominator can only select up to\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominations",defaultValue:16,mdxType:"RPC"}),"\n","\nvalidators to nominate. Conversely, a single validator can have only\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.maxNominatorsCount",defaultValue:5e4,mdxType:"RPC"}),"\n",'\nnominators. A drawback to this is that it is possible, if the number of nominators is very high or\nthe number of validators is very low, that all available validators may be "oversubscribed" and\nunable to accept more nominations. In this case, one may need a larger amount of stake to\nparticipate in staking, since nominations are priority-ranked in terms of amount of stake.'),(0,i.kt)("h3",{id:"phragmms-aka-balphragmms"},"Phragmms (aka Balphragmms)"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"Phragmms"),", formerly known as ",(0,i.kt)("inlineCode",{parentName:"p"},"Balphragmms"),", is a new election rule inspired by Phragm\xe9n and\ndeveloped in-house for Polkadot. In general,\nelection rules on blockchains is an active topic of research. This is due to the conflicting\nrequirements for election rules and blockchains: elections are computationally expensive, but\nblockchains are computationally limited. Thus, this work constitutes state of the art in terms of\noptimization."),(0,i.kt)("p",null,"Proportional 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 ",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhragmen"),", this new 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."),(0,i.kt)("p",null,"The security of a distributed and decentralized system such as\nPolkadot is directly related to the goal of\navoiding ",(0,i.kt)("em",{parentName:"p"},"overrepresentation")," of any minority. This is a stark contrast to traditional approaches to\nproportional representation axioms, which typically only seek to avoid underrepresentation."),(0,i.kt)("h4",{id:"maximin-support-objective-and-pjr"},"Maximin Support Objective and PJR"),(0,i.kt)("p",null,"This new election rule aims to achieve a constant-factor approximation guarantee for the ",(0,i.kt)("em",{parentName:"p"},"maximin\nsupport objective")," and the closely related ",(0,i.kt)("em",{parentName:"p"},"proportional justified representation")," (PJR) property."),(0,i.kt)("p",null,"The 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\u2019s validator nodes to be elected. The ",(0,i.kt)("inlineCode",{parentName:"p"},"Phragmms"),"\nrule, and the guarantees it provides in terms of security and proportionality, have been formalized\nin a ",(0,i.kt)("a",{parentName:"p",href:"https://arxiv.org/pdf/2004.12990.pdf"},"peer-reviewed paper"),")."),(0,i.kt)("p",null,"The PJR property considers the proportionality of the voter\u2019s 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\u2019s vote strength."),(0,i.kt)("h4",{id:"comparing-sequential-phragm\xe9n-mms-and-phragmms"},"Comparing Sequential Phragm\xe9n, MMS, and Phragmms"),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Sequential Phragm\xe9n")," (",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhragmen"),") and ",(0,i.kt)("inlineCode",{parentName:"p"},"MMS")," are two efficient election rules that both achieve\nPJR."),(0,i.kt)("p",null,"Currently, Polkadot employs the ",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhragmen"),"\nmethod for validator and council elections. Although ",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhramen")," has a very fast runtime, it does\nnot provide constant-factor approximation for the maximin support problem. This is due to\n",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhramen")," only performing an ",(0,i.kt)("em",{parentName:"p"},"approximate")," rebalancing of the distribution of stake."),(0,i.kt)("p",null,"In contrast, ",(0,i.kt)("inlineCode",{parentName:"p"},"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, ",(0,i.kt)("inlineCode",{parentName:"p"},"MMS")," computes a balanced\nedge weight vector for each possible augmented committee when a new candidate is added, which is\ncomputationally expensive."),(0,i.kt)("p",null,"We introduce a new heuristic inspired by ",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhragmen"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"PhragMMS"),", which maintains a comparable\nruntime to ",(0,i.kt)("inlineCode",{parentName:"p"},"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."),(0,i.kt)("h4",{id:"the-new-election-rule-phragmms"},"The New Election Rule: Phragmms"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"Phragmms")," is an iterative greedy algorithm that starts with an empty committee and alternates\nbetween the ",(0,i.kt)("inlineCode",{parentName:"p"},"Phragmms")," heuristic for inserting a new candidate and ",(0,i.kt)("em",{parentName:"p"},"rebalancing")," by replacing the\nweight vector with a balanced one. The main differentiator between ",(0,i.kt)("inlineCode",{parentName:"p"},"Phragmms")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhragmen")," is\nthat the latter only perform an approximate rebalancing. Details can be found in\n",(0,i.kt)("a",{parentName:"p",href:"#rationale-for-maintaining-an-even-distribution-of-stake"},"Balanced Stake Distribution"),"."),(0,i.kt)("p",null,"The 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 ",(0,i.kt)("em",{parentName:"p"},"A"),",\nthe score of an unelected candidate ",(0,i.kt)("em",{parentName:"p"},"c")," is an easy-to-compute rough estimate of what would be the\nsize of the least stake backing if we added ",(0,i.kt)("em",{parentName:"p"},"c")," to committee ",(0,i.kt)("em",{parentName:"p"},"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:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Feasibility,"),(0,i.kt)("li",{parentName:"ol"},"Balance and"),(0,i.kt)("li",{parentName:"ol"},"Local Optimality - The least stake backing of ",(0,i.kt)("em",{parentName:"li"},"A")," is higher than the highest score among\nunelected candidates")),(0,i.kt)("p",null,"If 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."),(0,i.kt)("p",null,"A 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 ",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhragmen")," also has\na notion of score for unelected candidates, ",(0,i.kt)("inlineCode",{parentName:"p"},"Phragmms")," can be seen as a natural complication of the\n",(0,i.kt)("inlineCode",{parentName:"p"},"seqPhragmen")," algorithm, where ",(0,i.kt)("inlineCode",{parentName:"p"},"Phragmms")," always grants higher score values to candidates and thus\ninserts them with higher support values."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"To summarize, the main differences between the two rules are:")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"In ",(0,i.kt)("inlineCode",{parentName:"li"},"seqPhragmen"),", lower scores are better, whereas in ",(0,i.kt)("inlineCode",{parentName:"li"},"Phragmms"),", higher scores are better."),(0,i.kt)("li",{parentName:"ul"},"Inspired by ",(0,i.kt)("inlineCode",{parentName:"li"},"seqPhragmen"),", the scoring system of ",(0,i.kt)("inlineCode",{parentName:"li"},"Phragmms")," can be considered to be more intuitive\nand does a better job at estimating the value of adding a candidate to the current solution, and\nhence leads to a better candidate-selection heuristic."),(0,i.kt)("li",{parentName:"ul"},"Unlike ",(0,i.kt)("inlineCode",{parentName:"li"},"seqPhragmen"),", in ",(0,i.kt)("inlineCode",{parentName:"li"},"Phragmms"),", the edge weight vector ",(0,i.kt)("em",{parentName:"li"},"w")," is completely rebalanced after\neach iteration of the algorithm.")),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"Phragmms")," election rule is currently being implemented on\nPolkadot. Once completed, it will become one\nof the most sophisticated election rules implemented on a blockchain. For the first time, this\nelection rule will provide both fair representation (PJR) and security (constant-factor\napproximation for the maximin support objection) to a blockchain network."),(0,i.kt)("h4",{id:"algorithm-2"},"Algorithm"),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"Phragmms")," algorithm iterates through the available seats, starting with an empty committee of\nsize ",(0,i.kt)("em",{parentName:"p"},"k"),":"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Initialize an empty committee ",(0,i.kt)("em",{parentName:"p"},"A")," and zero edge weight vector ",(0,i.kt)("em",{parentName:"p"},"w = 0"),".")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Repeat ",(0,i.kt)("em",{parentName:"p"},"k")," times:"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Find the unelected candidate with highest score and add it to committee ",(0,i.kt)("em",{parentName:"li"},"A"),"."),(0,i.kt)("li",{parentName:"ul"},"Re-balance the weight vector ",(0,i.kt)("em",{parentName:"li"},"w")," for the new committee ",(0,i.kt)("em",{parentName:"li"},"A"),"."))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Return ",(0,i.kt)("em",{parentName:"p"},"A")," and ",(0,i.kt)("em",{parentName:"p"},"w"),"."))),(0,i.kt)("h2",{id:"external-resources"},"External Resources"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://arxiv.org/pdf/2004.12990.pdf"},"Phragmms")," - W3F research paper that expands on the\nsequential Phragm\xe9n method."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://research.web3.foundation/Polkadot/protocols/NPoS/Overview"},"W3F Research Page on NPoS")," -\nAn overview of Nominated Proof of Stake as its applied to Polkadot."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/w3f/consensus/tree/master/NPoS"},"Python Reference Implementations")," - Python\nimplementations of Simple and Complicated Phragm\xe9n methods."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/paritytech/substrate/blob/master/frame/staking/src/lib.rs"},"Substrate Implementation")," -\nRust implementation used in Substrate."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://arxiv.org/pdf/1611.08826.pdf"},"Phragm\xe9n's and Thiele's Election Methods")," - 95-page paper\nexplaining Phragm\xe9n's election methods in detail."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://ojs.aaai.org/index.php/AAAI/article/view/10598"},"Phragm\xe9n\u2019s Voting Methods and Justified Representation")," -\nThis paper by Brill ",(0,i.kt)("em",{parentName:"li"},"et al.")," is the source for the simple Phragm\xe9n method, along with proofs about\nits properties."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/kianenigma/offline-phragmen"},"Offline Phragm\xe9n")," - Script to generate the\nPhragm\xe9n validator election outcome before the start of an era.")))}k.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/b940de31.d2e09ff9.js b/assets/js/b940de31.d2e09ff9.js new file mode 100644 index 000000000000..fc63d4118d9b --- /dev/null +++ b/assets/js/b940de31.d2e09ff9.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[7633],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>h});var n=a(74165),s=a(15861),o=a(67294),r=a(87152),i=a(17145),l=a(67425);function c(e,t,a){return p.apply(this,arguments)}function p(){return(p=(0,s.Z)((0,n.Z)().mark((function e(t,a,s){var o,l,c,p,u;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:o=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return o="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return o="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return o="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return o="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==o){e.next=18;break}return e.abrupt("return");case 18:return c=new r.U(o),e.next=21,i.G.create({provider:c});case 21:p=e.sent,(u=a.split(".")).forEach((function(e){e in p&&(p=p[e])})),e.t1=u[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=p.toString(),e.abrupt("break",35);case 29:return e.next=31,p();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function u(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"permillToPercent":(0,l.PermillToPercent)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const h=function(e){var t=e.network,a=e.path,r=e.defaultValue,i=e.filter,l=void 0===i?void 0:i,p=(0,o.useState)(""),h=p[0],d=p[1];return t=t.toLowerCase(),(0,o.useEffect)((function(){void 0!==l?u(r.toString(),l,t,d):d(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var o=function(){var e=(0,s.Z)((0,n.Z)().mark((function e(){var s;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c(t,a,d);case 2:if(void 0!==(s=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?u(s,l,t,d):d(s);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{o()}catch(i){console.log(i)}}}),[]),h}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var s=void 0;if("polkadot"===a||"statemint"===a)s=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");s=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(s)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},11427:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>m,frontMatter:()=>l,metadata:()=>p,toc:()=>h});var n=a(87462),s=a(63366),o=(a(67294),a(3905)),r=a(47940),i=["components"],l={id:"learn-assets",title:"Asset Hub",sidebar_label:"Asset Hub",description:"Fungible Tokens and NFTs on Polkadot.",keywords:["assets","fungible","non-fungible","asset hub","statemine","statemint"],slug:"../learn-assets"},c=void 0,p={unversionedId:"learn/learn-assets",id:"learn/learn-assets",title:"Asset Hub",description:"Fungible Tokens and NFTs on Polkadot.",source:"@site/../docs/learn/learn-assets.md",sourceDirName:"learn",slug:"/learn-assets",permalink:"/docs/learn-assets",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-assets.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1695131861,formattedLastUpdatedAt:"Sep 19, 2023",frontMatter:{id:"learn-assets",title:"Asset Hub",sidebar_label:"Asset Hub",description:"Fungible Tokens and NFTs on Polkadot.",keywords:["assets","fungible","non-fungible","asset hub","statemine","statemint"],slug:"../learn-assets"},sidebar:"docs",previous:{title:"Tokens and Assets",permalink:"/docs/learn-assets-index"},next:{title:"DOT",permalink:"/docs/learn-DOT"}},u={},h=[{value:"Creation and Management",id:"creation-and-management",level:2},{value:"Fungible Assets",id:"fungible-assets",level:2},{value:"Transferring Asset Balances",id:"transferring-asset-balances",level:3},{value:"Destroying an Asset",id:"destroying-an-asset",level:3},{value:"Application Development",id:"application-development",level:3},{value:"Cross-Chain Accounting",id:"cross-chain-accounting",level:3},{value:"Non-Fungible Assets",id:"non-fungible-assets",level:2},{value:"Transferring NFTs",id:"transferring-nfts",level:3},{value:"Advanced Techniques",id:"advanced-techniques",level:2}],d={toc:h},f="wrapper";function m(e){var t=e.components,a=(0,s.Z)(e,i);return(0,o.kt)(f,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Assets in the Polkadot network can be\nrepresented on several chains. They can take many forms, from a parachain's native token to on-chain\nrepresentations of off-chain reserves. This page focuses on the latter, namely assets issued by a\ncreator (e.g. rights to audited, off-chain reserves held by the creator, or art issued as an NFT)."),(0,o.kt)("p",null,"The\n",(0,o.kt)("a",{parentName:"p",href:"https://www.parity.io/blog/statemint-generic-assets-chain-proposing-a-common-good-parachain-to-polkadot-governance/"},"Asset Hub system parachain"),'\nhosts data structures and logic that specialize in the creation, management, and use of assets in\nthe Polkadot network. Although other\nparachains can host applications dealing with assets on the Asset Hub, the hub can be thought of as\nthe "home base" of assets in the network.'),(0,o.kt)("p",null,"The Asset Hub uses DOT as its native token. The\nchain yields its governance to its parent Relay Chain and has no inflation or era-based rewards for\ncollators (although collators receive a portion of transaction fees). As a\n",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/common-good-parachains-an-introduction-to-governance-allocated-parachain-slots/"},"system parachain"),",\nthe Asset Hub has a trusted relationship with the Relay Chain, and as such, can teleport\nDOT between itself and the Relay Chain. That is,\nDOT on the Asset Hub is just as good as\nDOT on the Relay Chain."),(0,o.kt)("p",null,"The Asset Hub does not support smart contracts. See the ",(0,o.kt)("a",{parentName:"p",href:"#advanced-techniques"},"Advanced")," section at\nthe bottom for a discussion on using proxy and multisig accounts to replicate oft-used contract\nlogic."),(0,o.kt)("h2",{id:"creation-and-management"},"Creation and Management"),(0,o.kt)("admonition",{title:"Walk-through video tutorial about creating assets",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"See\n",(0,o.kt)("a",{parentName:"p",href:"https://youtu.be/knNLZEyposM?list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&t=63"},"this technical explainer video"),"\nto learn how to create fungible assets on the Asset Hub.")),(0,o.kt)("p",null,"Anyone on the network can create assets on the Asset Hub as long as they can reserve the required\ndeposit of\n",(0,o.kt)(r.Z,{network:"statemint",path:"consts.assets.assetDeposit",defaultValue:1e11,filter:"humanReadable",mdxType:"RPC"}),"\n","\nand around\n",(0,o.kt)(r.Z,{network:"statemint",path:"consts.assets.metadataDepositBase",defaultValue:668933304,filter:"humanReadable",mdxType:"RPC"}),"\n","\nfor the metadata. The network reserves the deposit on creation. The creator also must specify a\nunique ",(0,o.kt)("inlineCode",{parentName:"p"},"AssetId"),", an integer of type ",(0,o.kt)("inlineCode",{parentName:"p"},"u32"),", to identify the asset. The ",(0,o.kt)("inlineCode",{parentName:"p"},"AssetId"),' should be the\ncanonical identifier for an asset, as the chain does not enforce the uniqueness of metadata like\n"name" and "symbol". The creator must also specify a minimum balance, preventing accounts from\nhaving dust balances.'),(0,o.kt)("admonition",{title:"Advanced How-to Guides",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"See ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-guides-assets-create"},"this page")," to learn more about creating assets using the Asset\nHub.")),(0,o.kt)("p",null,"Asset 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 ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-nft-pallets#uniques-pallet"},"Uniques pallet")," also supports setting key/value\npairs as attributes to a class or instance."),(0,o.kt)("p",null,"An asset class has several privileged roles. The asset creator automatically takes on all privileged\nroles but can reassign them after creation. These roles are:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"The ",(0,o.kt)("strong",{parentName:"li"},"owner")," can set the accounts responsible for the other three roles and set asset metadata\n(e.g. name, symbol, decimals)."),(0,o.kt)("li",{parentName:"ul"},"The ",(0,o.kt)("strong",{parentName:"li"},"issuer")," can mint and burn tokens to/from their chosen addresses."),(0,o.kt)("li",{parentName:"ul"},"The ",(0,o.kt)("strong",{parentName:"li"},"admin")," can make force transfers as well as unfreeze accounts of the asset class."),(0,o.kt)("li",{parentName:"ul"},"The ",(0,o.kt)("strong",{parentName:"li"},"freezer")," can freeze assets on target addresses or the entire asset class.")),(0,o.kt)("p",null,"Always refer to the ",(0,o.kt)("a",{parentName:"p",href:"https://crates.parity.io/pallet_assets/index.html"},(0,o.kt)("strong",{parentName:"a"},"reference documentation")),"\nfor certainty on privileged roles."),(0,o.kt)("p",null,"An asset's details contain one field not accessible to its owner or admin team, ",(0,o.kt)("strong",{parentName:"p"},"asset\nsufficiency"),". Only the network's governance mechanism can deem an asset as ",(0,o.kt)("em",{parentName:"p"},"sufficient"),". A balance\nof a non-sufficient asset can only exist on accounts that are on-chain (i.e. accounts having the\nexistential deposit of a sufficient asset). That is, a user could not keep an account on-chain by\ntransferring an insufficient asset to it; the account must already be on-chain by having more than\nthe existential deposit in DOT (or a sufficient\nasset). However, assets deemed ",(0,o.kt)("em",{parentName:"p"},"sufficient")," can instantiate accounts and pay for transaction fees,\nsuch that users can transact on the Asset Hub without the need for\nDOT."),(0,o.kt)("admonition",{title:"Transaction Fees on Polkadot-JS UI",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Polkadot-JS UI\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/polkadot-js/apps/issues/7812"},"doesn't support the functionality to pay with a sufficient asset yet"),".\nWhen using Polkadot-JS UI, transaction fee needs to be paid in\nDOT.")),(0,o.kt)("h2",{id:"fungible-assets"},"Fungible Assets"),(0,o.kt)("p",null,"Fungible 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."),(0,o.kt)("h3",{id:"transferring-asset-balances"},"Transferring Asset Balances"),(0,o.kt)("admonition",{title:"Walk-through video tutorial about transferring assets",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"See\n",(0,o.kt)("a",{parentName:"p",href:"https://youtu.be/knNLZEyposM?list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&t=326"},"this technical explainer video"),"\nto learn how to transfer assets on the Asset Hub."),(0,o.kt)("p",{parentName:"admonition"},"For Ledger users see ",(0,o.kt)("a",{parentName:"p",href:"https://youtu.be/j0O-KziV9iw"},"this video tutorial")," to learn how to use the\nStatemine Ledger app and what its current limitations are.")),(0,o.kt)("p",null,"Users have a simple interface, namely the ability to transfer asset balances to other accounts\non-chain. As mentioned before, if the asset is not ",(0,o.kt)("em",{parentName:"p"},"sufficient"),", then the destination account must\nalready exist for the transfer to succeed."),(0,o.kt)("p",null,"The chain also contains a ",(0,o.kt)("inlineCode",{parentName:"p"},"transfer_keep_alive")," function, similar to that of the Balances pallet,\nthat will fail if execution kills the sending account."),(0,o.kt)("p",null,"The 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."),(0,o.kt)("admonition",{title:"Non-sufficient assets",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"Before transferring a non-sufficient asset, ensure the receiver account has enough funds to cover\nthe existential deposit and transaction fees for future transfers. Failing to do so will cause the\nasset transfer to fail. The transfer will be successful for sufficient assets, but without\nDOT tokens, you will not be able to transfer\nthose assets from the receiver account through Polkadot-JS UI. The feature request to\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/polkadot-js/apps/issues/7812"},"enable sufficient assets for transaction fee payment on Polkadot-JS UI"),"\nis yet to be implemented.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"See\n",(0,o.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181118-how-to-transfer-tether-usdt-on-statemine"},"this support article"),"\nto learn more about transferring assets using the Asset Hub.")),(0,o.kt)("h3",{id:"destroying-an-asset"},"Destroying an Asset"),(0,o.kt)("admonition",{title:"Walk-through video tutorial about destroying assets",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"See\n",(0,o.kt)("a",{parentName:"p",href:"https://youtu.be/knNLZEyposM?list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&t=422"},"this technical explainer video"),"\nto learn how to destroy assets on the Asset Hub.")),(0,o.kt)("p",null,"To destroy an asset, go to the Polkadot-JS UI on the Asset Hub > Developer > Extrinsics. If you\ncreated an asset without minting any unit, you could call ",(0,o.kt)("inlineCode",{parentName:"p"},"assets.startDestroy")," and then the\n",(0,o.kt)("inlineCode",{parentName:"p"},"assets.finishDestroy")," extrinsics specifying the asset id you want to destroy. If you created an\nasset and minted some units, follow the steps below:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"assets.freezeAsset")," will freeze all assets on all accounts holding that asset id. Those accounts\nwill no longer be able to transfer that asset."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"assets.startDestroy")," will start the destroying process."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"assets.destroyApprovals")," will destroy all approvals related to that asset id (if there are any\napprovals)."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"assets.destroyAccounts")," will destroy all accounts related to that asset id. All asset units will\nbe removed from those accounts."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"assets.finishDestroy")," will finish the destroying process. The asset id will be removed and\navailable for another fungible token.")),(0,o.kt)("h3",{id:"application-development"},"Application Development"),(0,o.kt)("p",null,"The Asset Hub provides an ",(0,o.kt)("inlineCode",{parentName:"p"},"approve_transfer"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"transfer_approved"),", and ",(0,o.kt)("inlineCode",{parentName:"p"},"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."),(0,o.kt)("h3",{id:"cross-chain-accounting"},"Cross-Chain Accounting"),(0,o.kt)("p",null,"The 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."),(0,o.kt)("p",null,"As 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."),(0,o.kt)("p",null,'Parachains 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. For more info, see the "Moving Assets between\nChains in XCM" section of the\n',(0,o.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/xcm-the-cross-consensus-message-format/"},"article on the XCM format"),"."),(0,o.kt)("h2",{id:"non-fungible-assets"},"Non-Fungible Assets"),(0,o.kt)("p",null,"Unlike fungible assets, the particular instance of a ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-nft"},"non-fungible asset (NFT)")," has\na separate meaning from another instance of the same class. The Asset Hub represents NFTs in the\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-nft-pallets"},"Uniques and NFTs pallets"),"."),(0,o.kt)("p",null,"Similar 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."),(0,o.kt)("h3",{id:"transferring-nfts"},"Transferring NFTs"),(0,o.kt)("p",null,"Users can transfer their NFTs to other accounts. The chain also provides an ",(0,o.kt)("inlineCode",{parentName:"p"},"approve_transfer"),",\n",(0,o.kt)("inlineCode",{parentName:"p"},"transfer_approved")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"cancel_approval")," interfaces that application developers can use to allow\nusers to authorize an application to transfer an instance on their behalf."),(0,o.kt)("h2",{id:"advanced-techniques"},"Advanced Techniques"),(0,o.kt)("p",null,"Many 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 ",(0,o.kt)("a",{parentName:"p",href:"https://crates.parity.io/pallet_multisig/index.html"},"Multisig"),",\n",(0,o.kt)("a",{parentName:"p",href:"https://crates.parity.io/pallet_proxy/index.html"},"Proxy"),", and\n",(0,o.kt)("a",{parentName:"p",href:"https://crates.parity.io/pallet_utility/index.html"},"Utility")," pallets, which will meet most account\nmanagement needs."),(0,o.kt)("p",null,"For example, if a team wants sign-off from two groups to perform a privileged operation, it could\ncreate a 2-of-2 ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-account-multisig"},(0,o.kt)("strong",{parentName:"a"},"multisig"))," from two\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-proxies-pure#anonymous-proxy-pure-proxy"},(0,o.kt)("strong",{parentName:"a"},"pure proxies")),", and then set members from\neach group as proxies to those two accounts."))}m.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/b940de31.f3c78a50.js b/assets/js/b940de31.f3c78a50.js deleted file mode 100644 index d48a7edd493f..000000000000 --- a/assets/js/b940de31.f3c78a50.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[7633],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>h});var n=a(74165),s=a(15861),o=a(67294),r=a(87152),i=a(17145),l=a(67425);function c(e,t,a){return p.apply(this,arguments)}function p(){return(p=(0,s.Z)((0,n.Z)().mark((function e(t,a,s){var o,l,c,p,u;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:o=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return o="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return o="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return o="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return o="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==o){e.next=18;break}return e.abrupt("return");case 18:return c=new r.U(o),e.next=21,i.G.create({provider:c});case 21:p=e.sent,(u=a.split(".")).forEach((function(e){e in p&&(p=p[e])})),e.t1=u[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=p.toString(),e.abrupt("break",35);case 29:return e.next=31,p();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function u(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const h=function(e){var t=e.network,a=e.path,r=e.defaultValue,i=e.filter,l=void 0===i?void 0:i,p=(0,o.useState)(""),h=p[0],d=p[1];return t=t.toLowerCase(),(0,o.useEffect)((function(){void 0!==l?u(r.toString(),l,t,d):d(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var o=function(){var e=(0,s.Z)((0,n.Z)().mark((function e(){var s;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c(t,a,d);case 2:if(void 0!==(s=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?u(s,l,t,d):d(s);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{o()}catch(i){console.log(i)}}}),[]),h}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var s=void 0;if("polkadot"===a||"statemint"===a)s=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");s=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(s)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},11427:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>m,frontMatter:()=>l,metadata:()=>p,toc:()=>h});var n=a(87462),s=a(63366),o=(a(67294),a(3905)),r=a(47940),i=["components"],l={id:"learn-assets",title:"Asset Hub",sidebar_label:"Asset Hub",description:"Fungible Tokens and NFTs on Polkadot.",keywords:["assets","fungible","non-fungible","asset hub","statemine","statemint"],slug:"../learn-assets"},c=void 0,p={unversionedId:"learn/learn-assets",id:"learn/learn-assets",title:"Asset Hub",description:"Fungible Tokens and NFTs on Polkadot.",source:"@site/../docs/learn/learn-assets.md",sourceDirName:"learn",slug:"/learn-assets",permalink:"/docs/learn-assets",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-assets.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1695131861,formattedLastUpdatedAt:"Sep 19, 2023",frontMatter:{id:"learn-assets",title:"Asset Hub",sidebar_label:"Asset Hub",description:"Fungible Tokens and NFTs on Polkadot.",keywords:["assets","fungible","non-fungible","asset hub","statemine","statemint"],slug:"../learn-assets"},sidebar:"docs",previous:{title:"Tokens and Assets",permalink:"/docs/learn-assets-index"},next:{title:"DOT",permalink:"/docs/learn-DOT"}},u={},h=[{value:"Creation and Management",id:"creation-and-management",level:2},{value:"Fungible Assets",id:"fungible-assets",level:2},{value:"Transferring Asset Balances",id:"transferring-asset-balances",level:3},{value:"Destroying an Asset",id:"destroying-an-asset",level:3},{value:"Application Development",id:"application-development",level:3},{value:"Cross-Chain Accounting",id:"cross-chain-accounting",level:3},{value:"Non-Fungible Assets",id:"non-fungible-assets",level:2},{value:"Transferring NFTs",id:"transferring-nfts",level:3},{value:"Advanced Techniques",id:"advanced-techniques",level:2}],d={toc:h},f="wrapper";function m(e){var t=e.components,a=(0,s.Z)(e,i);return(0,o.kt)(f,(0,n.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Assets in the Polkadot network can be\nrepresented on several chains. They can take many forms, from a parachain's native token to on-chain\nrepresentations of off-chain reserves. This page focuses on the latter, namely assets issued by a\ncreator (e.g. rights to audited, off-chain reserves held by the creator, or art issued as an NFT)."),(0,o.kt)("p",null,"The\n",(0,o.kt)("a",{parentName:"p",href:"https://www.parity.io/blog/statemint-generic-assets-chain-proposing-a-common-good-parachain-to-polkadot-governance/"},"Asset Hub system parachain"),'\nhosts data structures and logic that specialize in the creation, management, and use of assets in\nthe Polkadot network. Although other\nparachains can host applications dealing with assets on the Asset Hub, the hub can be thought of as\nthe "home base" of assets in the network.'),(0,o.kt)("p",null,"The Asset Hub uses DOT as its native token. The\nchain yields its governance to its parent Relay Chain and has no inflation or era-based rewards for\ncollators (although collators receive a portion of transaction fees). As a\n",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/common-good-parachains-an-introduction-to-governance-allocated-parachain-slots/"},"system parachain"),",\nthe Asset Hub has a trusted relationship with the Relay Chain, and as such, can teleport\nDOT between itself and the Relay Chain. That is,\nDOT on the Asset Hub is just as good as\nDOT on the Relay Chain."),(0,o.kt)("p",null,"The Asset Hub does not support smart contracts. See the ",(0,o.kt)("a",{parentName:"p",href:"#advanced-techniques"},"Advanced")," section at\nthe bottom for a discussion on using proxy and multisig accounts to replicate oft-used contract\nlogic."),(0,o.kt)("h2",{id:"creation-and-management"},"Creation and Management"),(0,o.kt)("admonition",{title:"Walk-through video tutorial about creating assets",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"See\n",(0,o.kt)("a",{parentName:"p",href:"https://youtu.be/knNLZEyposM?list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&t=63"},"this technical explainer video"),"\nto learn how to create fungible assets on the Asset Hub.")),(0,o.kt)("p",null,"Anyone on the network can create assets on the Asset Hub as long as they can reserve the required\ndeposit of\n",(0,o.kt)(r.Z,{network:"statemint",path:"consts.assets.assetDeposit",defaultValue:1e11,filter:"humanReadable",mdxType:"RPC"}),"\n","\nand around\n",(0,o.kt)(r.Z,{network:"statemint",path:"consts.assets.metadataDepositBase",defaultValue:668933304,filter:"humanReadable",mdxType:"RPC"}),"\n","\nfor the metadata. The network reserves the deposit on creation. The creator also must specify a\nunique ",(0,o.kt)("inlineCode",{parentName:"p"},"AssetId"),", an integer of type ",(0,o.kt)("inlineCode",{parentName:"p"},"u32"),", to identify the asset. The ",(0,o.kt)("inlineCode",{parentName:"p"},"AssetId"),' should be the\ncanonical identifier for an asset, as the chain does not enforce the uniqueness of metadata like\n"name" and "symbol". The creator must also specify a minimum balance, preventing accounts from\nhaving dust balances.'),(0,o.kt)("admonition",{title:"Advanced How-to Guides",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"See ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-guides-assets-create"},"this page")," to learn more about creating assets using the Asset\nHub.")),(0,o.kt)("p",null,"Asset 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 ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-nft-pallets#uniques-pallet"},"Uniques pallet")," also supports setting key/value\npairs as attributes to a class or instance."),(0,o.kt)("p",null,"An asset class has several privileged roles. The asset creator automatically takes on all privileged\nroles but can reassign them after creation. These roles are:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"The ",(0,o.kt)("strong",{parentName:"li"},"owner")," can set the accounts responsible for the other three roles and set asset metadata\n(e.g. name, symbol, decimals)."),(0,o.kt)("li",{parentName:"ul"},"The ",(0,o.kt)("strong",{parentName:"li"},"issuer")," can mint and burn tokens to/from their chosen addresses."),(0,o.kt)("li",{parentName:"ul"},"The ",(0,o.kt)("strong",{parentName:"li"},"admin")," can make force transfers as well as unfreeze accounts of the asset class."),(0,o.kt)("li",{parentName:"ul"},"The ",(0,o.kt)("strong",{parentName:"li"},"freezer")," can freeze assets on target addresses or the entire asset class.")),(0,o.kt)("p",null,"Always refer to the ",(0,o.kt)("a",{parentName:"p",href:"https://crates.parity.io/pallet_assets/index.html"},(0,o.kt)("strong",{parentName:"a"},"reference documentation")),"\nfor certainty on privileged roles."),(0,o.kt)("p",null,"An asset's details contain one field not accessible to its owner or admin team, ",(0,o.kt)("strong",{parentName:"p"},"asset\nsufficiency"),". Only the network's governance mechanism can deem an asset as ",(0,o.kt)("em",{parentName:"p"},"sufficient"),". A balance\nof a non-sufficient asset can only exist on accounts that are on-chain (i.e. accounts having the\nexistential deposit of a sufficient asset). That is, a user could not keep an account on-chain by\ntransferring an insufficient asset to it; the account must already be on-chain by having more than\nthe existential deposit in DOT (or a sufficient\nasset). However, assets deemed ",(0,o.kt)("em",{parentName:"p"},"sufficient")," can instantiate accounts and pay for transaction fees,\nsuch that users can transact on the Asset Hub without the need for\nDOT."),(0,o.kt)("admonition",{title:"Transaction Fees on Polkadot-JS UI",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Polkadot-JS UI\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/polkadot-js/apps/issues/7812"},"doesn't support the functionality to pay with a sufficient asset yet"),".\nWhen using Polkadot-JS UI, transaction fee needs to be paid in\nDOT.")),(0,o.kt)("h2",{id:"fungible-assets"},"Fungible Assets"),(0,o.kt)("p",null,"Fungible 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."),(0,o.kt)("h3",{id:"transferring-asset-balances"},"Transferring Asset Balances"),(0,o.kt)("admonition",{title:"Walk-through video tutorial about transferring assets",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"See\n",(0,o.kt)("a",{parentName:"p",href:"https://youtu.be/knNLZEyposM?list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&t=326"},"this technical explainer video"),"\nto learn how to transfer assets on the Asset Hub."),(0,o.kt)("p",{parentName:"admonition"},"For Ledger users see ",(0,o.kt)("a",{parentName:"p",href:"https://youtu.be/j0O-KziV9iw"},"this video tutorial")," to learn how to use the\nStatemine Ledger app and what its current limitations are.")),(0,o.kt)("p",null,"Users have a simple interface, namely the ability to transfer asset balances to other accounts\non-chain. As mentioned before, if the asset is not ",(0,o.kt)("em",{parentName:"p"},"sufficient"),", then the destination account must\nalready exist for the transfer to succeed."),(0,o.kt)("p",null,"The chain also contains a ",(0,o.kt)("inlineCode",{parentName:"p"},"transfer_keep_alive")," function, similar to that of the Balances pallet,\nthat will fail if execution kills the sending account."),(0,o.kt)("p",null,"The 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."),(0,o.kt)("admonition",{title:"Non-sufficient assets",type:"warning"},(0,o.kt)("p",{parentName:"admonition"},"Before transferring a non-sufficient asset, ensure the receiver account has enough funds to cover\nthe existential deposit and transaction fees for future transfers. Failing to do so will cause the\nasset transfer to fail. The transfer will be successful for sufficient assets, but without\nDOT tokens, you will not be able to transfer\nthose assets from the receiver account through Polkadot-JS UI. The feature request to\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/polkadot-js/apps/issues/7812"},"enable sufficient assets for transaction fee payment on Polkadot-JS UI"),"\nis yet to be implemented.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"See\n",(0,o.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181118-how-to-transfer-tether-usdt-on-statemine"},"this support article"),"\nto learn more about transferring assets using the Asset Hub.")),(0,o.kt)("h3",{id:"destroying-an-asset"},"Destroying an Asset"),(0,o.kt)("admonition",{title:"Walk-through video tutorial about destroying assets",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"See\n",(0,o.kt)("a",{parentName:"p",href:"https://youtu.be/knNLZEyposM?list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&t=422"},"this technical explainer video"),"\nto learn how to destroy assets on the Asset Hub.")),(0,o.kt)("p",null,"To destroy an asset, go to the Polkadot-JS UI on the Asset Hub > Developer > Extrinsics. If you\ncreated an asset without minting any unit, you could call ",(0,o.kt)("inlineCode",{parentName:"p"},"assets.startDestroy")," and then the\n",(0,o.kt)("inlineCode",{parentName:"p"},"assets.finishDestroy")," extrinsics specifying the asset id you want to destroy. If you created an\nasset and minted some units, follow the steps below:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"assets.freezeAsset")," will freeze all assets on all accounts holding that asset id. Those accounts\nwill no longer be able to transfer that asset."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"assets.startDestroy")," will start the destroying process."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"assets.destroyApprovals")," will destroy all approvals related to that asset id (if there are any\napprovals)."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"assets.destroyAccounts")," will destroy all accounts related to that asset id. All asset units will\nbe removed from those accounts."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"assets.finishDestroy")," will finish the destroying process. The asset id will be removed and\navailable for another fungible token.")),(0,o.kt)("h3",{id:"application-development"},"Application Development"),(0,o.kt)("p",null,"The Asset Hub provides an ",(0,o.kt)("inlineCode",{parentName:"p"},"approve_transfer"),", ",(0,o.kt)("inlineCode",{parentName:"p"},"transfer_approved"),", and ",(0,o.kt)("inlineCode",{parentName:"p"},"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."),(0,o.kt)("h3",{id:"cross-chain-accounting"},"Cross-Chain Accounting"),(0,o.kt)("p",null,"The 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."),(0,o.kt)("p",null,"As 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."),(0,o.kt)("p",null,'Parachains 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. For more info, see the "Moving Assets between\nChains in XCM" section of the\n',(0,o.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/xcm-the-cross-consensus-message-format/"},"article on the XCM format"),"."),(0,o.kt)("h2",{id:"non-fungible-assets"},"Non-Fungible Assets"),(0,o.kt)("p",null,"Unlike fungible assets, the particular instance of a ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-nft"},"non-fungible asset (NFT)")," has\na separate meaning from another instance of the same class. The Asset Hub represents NFTs in the\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-nft-pallets"},"Uniques and NFTs pallets"),"."),(0,o.kt)("p",null,"Similar 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."),(0,o.kt)("h3",{id:"transferring-nfts"},"Transferring NFTs"),(0,o.kt)("p",null,"Users can transfer their NFTs to other accounts. The chain also provides an ",(0,o.kt)("inlineCode",{parentName:"p"},"approve_transfer"),",\n",(0,o.kt)("inlineCode",{parentName:"p"},"transfer_approved")," and ",(0,o.kt)("inlineCode",{parentName:"p"},"cancel_approval")," interfaces that application developers can use to allow\nusers to authorize an application to transfer an instance on their behalf."),(0,o.kt)("h2",{id:"advanced-techniques"},"Advanced Techniques"),(0,o.kt)("p",null,"Many 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 ",(0,o.kt)("a",{parentName:"p",href:"https://crates.parity.io/pallet_multisig/index.html"},"Multisig"),",\n",(0,o.kt)("a",{parentName:"p",href:"https://crates.parity.io/pallet_proxy/index.html"},"Proxy"),", and\n",(0,o.kt)("a",{parentName:"p",href:"https://crates.parity.io/pallet_utility/index.html"},"Utility")," pallets, which will meet most account\nmanagement needs."),(0,o.kt)("p",null,"For example, if a team wants sign-off from two groups to perform a privileged operation, it could\ncreate a 2-of-2 ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-account-multisig"},(0,o.kt)("strong",{parentName:"a"},"multisig"))," from two\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-proxies-pure#anonymous-proxy-pure-proxy"},(0,o.kt)("strong",{parentName:"a"},"pure proxies")),", and then set members from\neach group as proxies to those two accounts."))}m.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/bb8b1738.1b439eff.js b/assets/js/bb8b1738.1b439eff.js new file mode 100644 index 000000000000..5f0b83e5a371 --- /dev/null +++ b/assets/js/bb8b1738.1b439eff.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[7368],{47940:(a,e,t)=>{"use strict";t.d(e,{Z:()=>h});var o=t(74165),n=t(15861),i=t(67294),r=t(87152),l=t(17145),s=t(67425);function d(a,e,t){return c.apply(this,arguments)}function c(){return(c=(0,n.Z)((0,o.Z)().mark((function a(e,t,n){var i,s,d,c,p;return(0,o.Z)().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:i=void 0,s=void 0,a.t0=e,a.next="polkadot"===a.t0?5:"kusama"===a.t0?7:"statemine"===a.t0?9:"statemint"===a.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",a.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",a.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",a.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",a.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){a.next=18;break}return a.abrupt("return");case 18:return d=new r.U(i),a.next=21,l.G.create({provider:d});case 21:c=a.sent,(p=t.split(".")).forEach((function(a){a in c&&(c=c[a])})),a.t1=p[0],a.next="consts"===a.t1?27:"query"===a.t1?29:34;break;case 27:return s=c.toString(),a.abrupt("break",35);case 29:return a.next=31,c();case 31:return s=(s=a.sent).toString(),a.abrupt("break",35);case 34:console.log("Unknown path prefix ("+p[0]+") in "+t);case 35:return a.abrupt("return",s);case 36:case"end":return a.stop()}}),a)})))).apply(this,arguments)}function p(a,e,t,o){switch(e){case"humanReadable":(0,s.HumanReadable)(a,t,o);break;case"precise":(0,s.Precise)(a,t,o);break;case"blocksToDays":(0,s.BlocksToDays)(a,o);break;case"percentage":(0,s.Percentage)(a,o);break;case"permillToPercent":(0,s.PermillToPercent)(a,o);break;case"arrayLength":(0,s.ArrayLength)(a,o);break;default:return void console.log("Ignoring unknown filter type")}}const h=function(a){var e=a.network,t=a.path,r=a.defaultValue,l=a.filter,s=void 0===l?void 0:l,c=(0,i.useState)(""),h=c[0],u=c[1];return e=e.toLowerCase(),(0,i.useEffect)((function(){void 0!==s?p(r.toString(),s,e,u):u(r.toString());var a=void 0;switch(e){case"polkadot":a="wss://rpc.polkadot.io";break;case"kusama":a="wss://kusama-rpc.polkadot.io/";break;case"statemine":a="wss://statemine-rpc.polkadot.io/";break;case"statemint":a="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===a)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var a=(0,n.Z)((0,o.Z)().mark((function a(){var n;return(0,o.Z)().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.next=2,d(e,t,u);case 2:if(void 0!==(n=a.sent)){a.next=7;break}return a.abrupt("return");case 7:void 0!==s?p(n,s,e,u):u(n);case 8:case"end":return a.stop()}}),a)})));return function(){return a.apply(this,arguments)}}();try{i()}catch(l){console.log(l)}}}),[]),h}},67425:a=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};a.exports={HumanReadable:function(a,t,o){var n=void 0;if("polkadot"===t||"statemint"===t)n=3;else{if("kusama"!==t&&"statemine"!==t)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");n=6}a=parseFloat(a),o((a=Number.isInteger(a/e[t].precision)?a/e[t].precision+" "+e[t].symbol:(a/e[t].precision).toFixed(n)+" "+e[t].symbol).toString())},Precise:function(a,t,o){o(a=(a=parseFloat(a))/e[t].precision+" "+e[t].symbol)},BlocksToDays:function(a,e){e((a=6*a/86400).toString())},Percentage:function(a,e){e((a/=1e7).toString())},PermillToPercent:function(a,e){e((a/=1e4).toString())},ArrayLength:function(a,e){e((a=a.split(",").length).toString())}}},49175:(a,e,t)=>{"use strict";t.r(e),t.d(e,{assets:()=>p,contentTitle:()=>d,default:()=>m,frontMatter:()=>s,metadata:()=>c,toc:()=>h});var o=t(87462),n=t(63366),i=(t(67294),t(3905)),r=t(47940),l=["components"],s={id:"learn-validator",title:"Validator",sidebar_label:"Validator",description:"Role of Validators within the Polkadot Ecosystem.",keywords:["validate","validator","maintain","NPoS","stake"],slug:"../learn-validator"},d=void 0,c={unversionedId:"learn/learn-validator",id:"learn/learn-validator",title:"Validator",description:"Role of Validators within the Polkadot Ecosystem.",source:"@site/../docs/learn/learn-validator.md",sourceDirName:"learn",slug:"/learn-validator",permalink:"/docs/learn-validator",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-validator.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1688135081,formattedLastUpdatedAt:"Jun 30, 2023",frontMatter:{id:"learn-validator",title:"Validator",sidebar_label:"Validator",description:"Role of Validators within the Polkadot Ecosystem.",keywords:["validate","validator","maintain","NPoS","stake"],slug:"../learn-validator"},sidebar:"docs",previous:{title:"Nominator",permalink:"/docs/learn-nominator"},next:{title:"Parachains",permalink:"/docs/learn-parachains-index"}},p={},h=[{value:"Para-validators",id:"para-validators",level:2},{value:"Block Authors",id:"block-authors",level:2},{value:"Other Validators",id:"other-validators",level:2},{value:"Further Readings",id:"further-readings",level:2},{value:"Guides",id:"guides",level:3},{value:"Other References",id:"other-references",level:3},{value:"Security / Key Management",id:"security--key-management",level:3},{value:"Monitoring Tools",id:"monitoring-tools",level:3},{value:"Validator Stats",id:"validator-stats",level:3}],u={toc:h},k="wrapper";function m(a){var e=a.components,t=(0,n.Z)(a,l);return(0,i.kt)(k,(0,o.Z)({},u,t,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"This page provides a general overview of the role of validators in\nPolkadot. For more detailed information you\ncan read the Protocol Overview Section in\n",(0,i.kt)("a",{parentName:"p",href:"https://paritytech.github.io/polkadot/book/"},"The Polkadot Parachain Host Implementers' Guide"),".")),(0,i.kt)("p",null,"Validators secure the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-architecture#relay-chain"},"relay chain")," by staking\nDOT, validating proofs from collators and\nparticipating in consensus with other validators."),(0,i.kt)("p",null,"Validators play a crucial role in adding new blocks to the relay chain and, by extension, to all\nparachains. This allows parties to complete cross-chain transactions via the relay chain. They\nguarantee that each parachain follows its unique rules and can pass messages between shards in a\ntrust-free environment."),(0,i.kt)("h2",{id:"para-validators"},"Para-validators"),(0,i.kt)("p",null,"Parachain validators (i.e. para-validators) participate to the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol/#parachain-phase"},"Parachain Phase of the AnV Protocol"),", and submit\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol/#candidate-receipts"},"candidate receipts")," to the Relay Chain\ntransaction queue so that a block author can include information on the parablock in a fork of of\nthe Relay Chain."),(0,i.kt)("p",null,"Para-validators work in groups and are selected by the runtime in every epoch to validate parachain\nblocks for all parachains connected to the relay chain. The selected para-validators are one of\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.validatorCount",defaultValue:297,mdxType:"RPC"}),"\n","\nvalidators randomly selected (per epoch) to participate in the validation, creating a validator pool\nof 200 para-validators."),(0,i.kt)("p",null,"Para-validators verify that the information contained in an assigned set of parachain blocks is\nvalid. They receive parachain block candidates from the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-collator"},"collators")," together\nwith a Proof-of-Validity (PoV). The para-validators perform the first round of validity checks on\nthe block candidates. Candidates that gather enough signed validity statements are considered\n",(0,i.kt)("em",{parentName:"p"},"backable"),"."),(0,i.kt)("h2",{id:"block-authors"},"Block Authors"),(0,i.kt)("p",null,"There 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 ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus/#block-production-babe"},"BABE")," and can note\nup to one backable candidate for each parachain to include in the relay chain. A backable candidate\nincluded in the relay chain is considered ",(0,i.kt)("em",{parentName:"p"},"backed")," in that fork of the chain."),(0,i.kt)("p",null,"In a Relay Chain block, block authors will only include\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol/#candidate-receipts"},"candidate receipts")," that have a parent\ncandidate receipt in an earlier Relay Chain block. This ensures the parachain follows a valid chain.\nAlso, the block authors will only include a receipt for which they have an erasure coding chunk,\nensuring that the system can perform the next round of availability and validity checks."),(0,i.kt)("h2",{id:"other-validators"},"Other Validators"),(0,i.kt)("p",null,"Validators also contribute to the so-called ",(0,i.kt)("strong",{parentName:"p"},"availability distribution"),". In fact, once the\ncandidate is backed in a fork of the relay chain, it is still ",(0,i.kt)("em",{parentName:"p"},"pending availability"),", i.e. it is not\nfully included (only tentative included) as part of the parachain until it is proven avaialable\n(together with the PoV). Information regarding the availability of the candidate will be noted in\nthe following relay chain blocks. Only when there is enough information, the candidate is considered\na full parachain block or ",(0,i.kt)("em",{parentName:"p"},"parablock"),"."),(0,i.kt)("p",null,"Validators also participate in the so-called\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol/#approval-process"},(0,i.kt)("strong",{parentName:"a"},"approval process")),". Once the parablock is\nconsidered available and part of the parachain, it is still ",(0,i.kt)("em",{parentName:"p"},"pending approval"),". Because\npara-validators are a small subset of all validators, there is a risk that by chance the majority of\npara-validators assigned to a parachain might be dishonest. It is thus necessary to run a secondary\nverification of the parablock before it can be considered approved. Having a secondary verification\nstep avoids the allocation of more para-validators that will ultimately reduce the throughput of the\nsystem."),(0,i.kt)("p",null,"Any instances of non-compliance with the consensus algorithms result in\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol/#disputes"},(0,i.kt)("strong",{parentName:"a"},"disputes"))," with the punishment of the validators on\nthe wrong side by removing some or all their staked\nDOT, thereby discouraging bad actors. Good\nperformance, however, will be rewarded, with validators receiving block rewards (including\ntransaction fees) in the form of DOT in exchange\nfor their activities."),(0,i.kt)("p",null,"Finally, validators participate in the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol/#chain-selection"},"chain selection process within GRANDPA"),", ensuring\nthat only available and valid blocks end within the finalized Relay Chain."),(0,i.kt)("admonition",{title:"Within an era roles can change",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Within the same era, a Validator can be a para-validator, block author, and participate in the\navailability distribution or the approval process. Those roles can change between sessions.")),(0,i.kt)("h2",{id:"further-readings"},"Further Readings"),(0,i.kt)("h3",{id:"guides"},"Guides"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-validate-polkadot"},"How to Validate on Polkadot")," - Guide on\nhow to set up a validator on the Polkadot live network."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/maintain-guides-validator-payout"},"Validator Payout Overview")," - A short overview on\nhow the validator payout mechanism works."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-systemd"},"How to run your validator as a systemd process")," -\nGuide on running your validator as a ",(0,i.kt)("inlineCode",{parentName:"li"},"systemd")," process so that it will run in the background and\nstart automatically on reboots."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-upgrade"},"How to Upgrade your Validator")," - Guide for\nsecurely upgrading your validator when you want to switch to a different machine or begin running\nthe latest version of client code."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-validate-polkadot"},"How to Use Validator Setup")," - Guide on\nhow to use Polkadot / Kusama validator setup.")),(0,i.kt)("h3",{id:"other-references"},"Other References"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://medium.com/@acvlls/setting-up-a-maintain-the-easy-way-3a885283091f"},"How to run a Polkadot node (Docker)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://medium.com/hackernoon/a-serverless-failover-solution-for-web-3-0-validator-nodes-e26b9d24c71d"},"A Serverless Failover Solution for Web3.0 Validator Nodes")," -\nBlog that details how to create a robust failover solution for running validators."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-validate-kusama##vps-list"},"VPS list")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://matrix.to/#/!NZrbtteFeqYKCUGQtr:matrix.parity.io?via=matrix.parity.io&via=matrix.org&via=web3.foundation"},"Polkadot Validator Lounge")," -\nA place to chat about being a validator."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"learn-staking#slashing"},"Slashing Consequences")," - Learn more about slashing consequences for\nrunning a validator node."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=0EmP0s6JOW4&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&index=2"},"Why You Should be A Validator on Polkadot and Kusama")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=riVg_Up_fCg&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&index=15"},"Roles and Responsibilities of a Validator")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.crowdcast.io/e/validating-on-polkadot"},"Validating on Polkadot")," - An explanation of\nhow to validate on Polkadot, with Joe Petrowski and David Dorgan of Parity Technologies, along\nwith Tim Ogilvie from Staked.")),(0,i.kt)("h3",{id:"security--key-management"},"Security / Key Management"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/w3f/validator-security"},"Validator Security Overview"))),(0,i.kt)("h3",{id:"monitoring-tools"},"Monitoring Tools"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/SimplyVC/panic_polkadot"},"PANIC for Polkadot")," - A monitoring and alerting\nsolution for Polkadot / Kusama node"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://telemetry.polkadot.io/#list/Kusama%20CC3"},"Polkadot Telemetry Service")," - Network\ninformation, including what nodes are running on a given chain, what software versions they are\nrunning, and sync status.")),(0,i.kt)("h3",{id:"validator-stats"},"Validator Stats"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://polkacube.hashquark.io/#/polkadot/strategy"},"HashQuark Staking Strategy")," - The HashQuark\nstaking strategy dashboard helps you choose the optimal set-up to maximize rewards, and provides\nother useful network monitoring tools."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://polkastats.io/"},"Polkastats")," - Polkastats is a cleanly designed dashboard for validator\nstatistics."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://yieldscan.app/"},"YieldScan")," - Staking yield maximization platform, designed to minimize\neffort."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://kusama.subscan.io/validator"},"Subscan Validators Page")," - Displays information on the\ncurrent validators - not as tailored for validators as the other sites.")))}m.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/bb8b1738.eb8a9feb.js b/assets/js/bb8b1738.eb8a9feb.js deleted file mode 100644 index 47a40c62530f..000000000000 --- a/assets/js/bb8b1738.eb8a9feb.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[7368],{47940:(a,e,t)=>{"use strict";t.d(e,{Z:()=>h});var o=t(74165),n=t(15861),i=t(67294),r=t(87152),l=t(17145),s=t(67425);function d(a,e,t){return c.apply(this,arguments)}function c(){return(c=(0,n.Z)((0,o.Z)().mark((function a(e,t,n){var i,s,d,c,p;return(0,o.Z)().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:i=void 0,s=void 0,a.t0=e,a.next="polkadot"===a.t0?5:"kusama"===a.t0?7:"statemine"===a.t0?9:"statemint"===a.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",a.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",a.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",a.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",a.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){a.next=18;break}return a.abrupt("return");case 18:return d=new r.U(i),a.next=21,l.G.create({provider:d});case 21:c=a.sent,(p=t.split(".")).forEach((function(a){a in c&&(c=c[a])})),a.t1=p[0],a.next="consts"===a.t1?27:"query"===a.t1?29:34;break;case 27:return s=c.toString(),a.abrupt("break",35);case 29:return a.next=31,c();case 31:return s=(s=a.sent).toString(),a.abrupt("break",35);case 34:console.log("Unknown path prefix ("+p[0]+") in "+t);case 35:return a.abrupt("return",s);case 36:case"end":return a.stop()}}),a)})))).apply(this,arguments)}function p(a,e,t,o){switch(e){case"humanReadable":(0,s.HumanReadable)(a,t,o);break;case"precise":(0,s.Precise)(a,t,o);break;case"blocksToDays":(0,s.BlocksToDays)(a,o);break;case"percentage":(0,s.Percentage)(a,o);break;case"arrayLength":(0,s.ArrayLength)(a,o);break;default:return void console.log("Ignoring unknown filter type")}}const h=function(a){var e=a.network,t=a.path,r=a.defaultValue,l=a.filter,s=void 0===l?void 0:l,c=(0,i.useState)(""),h=c[0],u=c[1];return e=e.toLowerCase(),(0,i.useEffect)((function(){void 0!==s?p(r.toString(),s,e,u):u(r.toString());var a=void 0;switch(e){case"polkadot":a="wss://rpc.polkadot.io";break;case"kusama":a="wss://kusama-rpc.polkadot.io/";break;case"statemine":a="wss://statemine-rpc.polkadot.io/";break;case"statemint":a="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===a)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var a=(0,n.Z)((0,o.Z)().mark((function a(){var n;return(0,o.Z)().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.next=2,d(e,t,u);case 2:if(void 0!==(n=a.sent)){a.next=7;break}return a.abrupt("return");case 7:void 0!==s?p(n,s,e,u):u(n);case 8:case"end":return a.stop()}}),a)})));return function(){return a.apply(this,arguments)}}();try{i()}catch(l){console.log(l)}}}),[]),h}},67425:a=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};a.exports={HumanReadable:function(a,t,o){var n=void 0;if("polkadot"===t||"statemint"===t)n=3;else{if("kusama"!==t&&"statemine"!==t)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");n=6}a=parseFloat(a),o((a=Number.isInteger(a/e[t].precision)?a/e[t].precision+" "+e[t].symbol:(a/e[t].precision).toFixed(n)+" "+e[t].symbol).toString())},Precise:function(a,t,o){o(a=(a=parseFloat(a))/e[t].precision+" "+e[t].symbol)},BlocksToDays:function(a,e){e((a=6*a/86400).toString())},Percentage:function(a,e){e((a/=1e7).toString())},ArrayLength:function(a,e){e((a=a.split(",").length).toString())}}},49175:(a,e,t)=>{"use strict";t.r(e),t.d(e,{assets:()=>p,contentTitle:()=>d,default:()=>m,frontMatter:()=>s,metadata:()=>c,toc:()=>h});var o=t(87462),n=t(63366),i=(t(67294),t(3905)),r=t(47940),l=["components"],s={id:"learn-validator",title:"Validator",sidebar_label:"Validator",description:"Role of Validators within the Polkadot Ecosystem.",keywords:["validate","validator","maintain","NPoS","stake"],slug:"../learn-validator"},d=void 0,c={unversionedId:"learn/learn-validator",id:"learn/learn-validator",title:"Validator",description:"Role of Validators within the Polkadot Ecosystem.",source:"@site/../docs/learn/learn-validator.md",sourceDirName:"learn",slug:"/learn-validator",permalink:"/docs/learn-validator",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-validator.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1688135081,formattedLastUpdatedAt:"Jun 30, 2023",frontMatter:{id:"learn-validator",title:"Validator",sidebar_label:"Validator",description:"Role of Validators within the Polkadot Ecosystem.",keywords:["validate","validator","maintain","NPoS","stake"],slug:"../learn-validator"},sidebar:"docs",previous:{title:"Nominator",permalink:"/docs/learn-nominator"},next:{title:"Parachains",permalink:"/docs/learn-parachains-index"}},p={},h=[{value:"Para-validators",id:"para-validators",level:2},{value:"Block Authors",id:"block-authors",level:2},{value:"Other Validators",id:"other-validators",level:2},{value:"Further Readings",id:"further-readings",level:2},{value:"Guides",id:"guides",level:3},{value:"Other References",id:"other-references",level:3},{value:"Security / Key Management",id:"security--key-management",level:3},{value:"Monitoring Tools",id:"monitoring-tools",level:3},{value:"Validator Stats",id:"validator-stats",level:3}],u={toc:h},k="wrapper";function m(a){var e=a.components,t=(0,n.Z)(a,l);return(0,i.kt)(k,(0,o.Z)({},u,t,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"This page provides a general overview of the role of validators in\nPolkadot. For more detailed information you\ncan read the Protocol Overview Section in\n",(0,i.kt)("a",{parentName:"p",href:"https://paritytech.github.io/polkadot/book/"},"The Polkadot Parachain Host Implementers' Guide"),".")),(0,i.kt)("p",null,"Validators secure the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-architecture#relay-chain"},"relay chain")," by staking\nDOT, validating proofs from collators and\nparticipating in consensus with other validators."),(0,i.kt)("p",null,"Validators play a crucial role in adding new blocks to the relay chain and, by extension, to all\nparachains. This allows parties to complete cross-chain transactions via the relay chain. They\nguarantee that each parachain follows its unique rules and can pass messages between shards in a\ntrust-free environment."),(0,i.kt)("h2",{id:"para-validators"},"Para-validators"),(0,i.kt)("p",null,"Parachain validators (i.e. para-validators) participate to the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol/#parachain-phase"},"Parachain Phase of the AnV Protocol"),", and submit\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol/#candidate-receipts"},"candidate receipts")," to the Relay Chain\ntransaction queue so that a block author can include information on the parablock in a fork of of\nthe Relay Chain."),(0,i.kt)("p",null,"Para-validators work in groups and are selected by the runtime in every epoch to validate parachain\nblocks for all parachains connected to the relay chain. The selected para-validators are one of\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.validatorCount",defaultValue:297,mdxType:"RPC"}),"\n","\nvalidators randomly selected (per epoch) to participate in the validation, creating a validator pool\nof 200 para-validators."),(0,i.kt)("p",null,"Para-validators verify that the information contained in an assigned set of parachain blocks is\nvalid. They receive parachain block candidates from the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-collator"},"collators")," together\nwith a Proof-of-Validity (PoV). The para-validators perform the first round of validity checks on\nthe block candidates. Candidates that gather enough signed validity statements are considered\n",(0,i.kt)("em",{parentName:"p"},"backable"),"."),(0,i.kt)("h2",{id:"block-authors"},"Block Authors"),(0,i.kt)("p",null,"There 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 ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-consensus/#block-production-babe"},"BABE")," and can note\nup to one backable candidate for each parachain to include in the relay chain. A backable candidate\nincluded in the relay chain is considered ",(0,i.kt)("em",{parentName:"p"},"backed")," in that fork of the chain."),(0,i.kt)("p",null,"In a Relay Chain block, block authors will only include\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol/#candidate-receipts"},"candidate receipts")," that have a parent\ncandidate receipt in an earlier Relay Chain block. This ensures the parachain follows a valid chain.\nAlso, the block authors will only include a receipt for which they have an erasure coding chunk,\nensuring that the system can perform the next round of availability and validity checks."),(0,i.kt)("h2",{id:"other-validators"},"Other Validators"),(0,i.kt)("p",null,"Validators also contribute to the so-called ",(0,i.kt)("strong",{parentName:"p"},"availability distribution"),". In fact, once the\ncandidate is backed in a fork of the relay chain, it is still ",(0,i.kt)("em",{parentName:"p"},"pending availability"),", i.e. it is not\nfully included (only tentative included) as part of the parachain until it is proven avaialable\n(together with the PoV). Information regarding the availability of the candidate will be noted in\nthe following relay chain blocks. Only when there is enough information, the candidate is considered\na full parachain block or ",(0,i.kt)("em",{parentName:"p"},"parablock"),"."),(0,i.kt)("p",null,"Validators also participate in the so-called\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol/#approval-process"},(0,i.kt)("strong",{parentName:"a"},"approval process")),". Once the parablock is\nconsidered available and part of the parachain, it is still ",(0,i.kt)("em",{parentName:"p"},"pending approval"),". Because\npara-validators are a small subset of all validators, there is a risk that by chance the majority of\npara-validators assigned to a parachain might be dishonest. It is thus necessary to run a secondary\nverification of the parablock before it can be considered approved. Having a secondary verification\nstep avoids the allocation of more para-validators that will ultimately reduce the throughput of the\nsystem."),(0,i.kt)("p",null,"Any instances of non-compliance with the consensus algorithms result in\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol/#disputes"},(0,i.kt)("strong",{parentName:"a"},"disputes"))," with the punishment of the validators on\nthe wrong side by removing some or all their staked\nDOT, thereby discouraging bad actors. Good\nperformance, however, will be rewarded, with validators receiving block rewards (including\ntransaction fees) in the form of DOT in exchange\nfor their activities."),(0,i.kt)("p",null,"Finally, validators participate in the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol/#chain-selection"},"chain selection process within GRANDPA"),", ensuring\nthat only available and valid blocks end within the finalized Relay Chain."),(0,i.kt)("admonition",{title:"Within an era roles can change",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Within the same era, a Validator can be a para-validator, block author, and participate in the\navailability distribution or the approval process. Those roles can change between sessions.")),(0,i.kt)("h2",{id:"further-readings"},"Further Readings"),(0,i.kt)("h3",{id:"guides"},"Guides"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-validate-polkadot"},"How to Validate on Polkadot")," - Guide on\nhow to set up a validator on the Polkadot live network."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/maintain-guides-validator-payout"},"Validator Payout Overview")," - A short overview on\nhow the validator payout mechanism works."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-systemd"},"How to run your validator as a systemd process")," -\nGuide on running your validator as a ",(0,i.kt)("inlineCode",{parentName:"li"},"systemd")," process so that it will run in the background and\nstart automatically on reboots."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-upgrade"},"How to Upgrade your Validator")," - Guide for\nsecurely upgrading your validator when you want to switch to a different machine or begin running\nthe latest version of client code."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-validate-polkadot"},"How to Use Validator Setup")," - Guide on\nhow to use Polkadot / Kusama validator setup.")),(0,i.kt)("h3",{id:"other-references"},"Other References"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://medium.com/@acvlls/setting-up-a-maintain-the-easy-way-3a885283091f"},"How to run a Polkadot node (Docker)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://medium.com/hackernoon/a-serverless-failover-solution-for-web-3-0-validator-nodes-e26b9d24c71d"},"A Serverless Failover Solution for Web3.0 Validator Nodes")," -\nBlog that details how to create a robust failover solution for running validators."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-validate-kusama##vps-list"},"VPS list")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://matrix.to/#/!NZrbtteFeqYKCUGQtr:matrix.parity.io?via=matrix.parity.io&via=matrix.org&via=web3.foundation"},"Polkadot Validator Lounge")," -\nA place to chat about being a validator."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"learn-staking#slashing"},"Slashing Consequences")," - Learn more about slashing consequences for\nrunning a validator node."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=0EmP0s6JOW4&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&index=2"},"Why You Should be A Validator on Polkadot and Kusama")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=riVg_Up_fCg&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&index=15"},"Roles and Responsibilities of a Validator")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.crowdcast.io/e/validating-on-polkadot"},"Validating on Polkadot")," - An explanation of\nhow to validate on Polkadot, with Joe Petrowski and David Dorgan of Parity Technologies, along\nwith Tim Ogilvie from Staked.")),(0,i.kt)("h3",{id:"security--key-management"},"Security / Key Management"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/w3f/validator-security"},"Validator Security Overview"))),(0,i.kt)("h3",{id:"monitoring-tools"},"Monitoring Tools"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/SimplyVC/panic_polkadot"},"PANIC for Polkadot")," - A monitoring and alerting\nsolution for Polkadot / Kusama node"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://telemetry.polkadot.io/#list/Kusama%20CC3"},"Polkadot Telemetry Service")," - Network\ninformation, including what nodes are running on a given chain, what software versions they are\nrunning, and sync status.")),(0,i.kt)("h3",{id:"validator-stats"},"Validator Stats"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://polkacube.hashquark.io/#/polkadot/strategy"},"HashQuark Staking Strategy")," - The HashQuark\nstaking strategy dashboard helps you choose the optimal set-up to maximize rewards, and provides\nother useful network monitoring tools."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://polkastats.io/"},"Polkastats")," - Polkastats is a cleanly designed dashboard for validator\nstatistics."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://yieldscan.app/"},"YieldScan")," - Staking yield maximization platform, designed to minimize\neffort."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://kusama.subscan.io/validator"},"Subscan Validators Page")," - Displays information on the\ncurrent validators - not as tailored for validators as the other sites.")))}m.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/c07c2447.3c93cf72.js b/assets/js/c07c2447.3c93cf72.js new file mode 100644 index 000000000000..5d84466a3aec --- /dev/null +++ b/assets/js/c07c2447.3c93cf72.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[7654],{47940:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var a=n(74165),o=n(15861),i=n(67294),r=n(87152),s=n(17145),d=n(67425);function p(e,t,n){return l.apply(this,arguments)}function l(){return(l=(0,o.Z)((0,a.Z)().mark((function e(t,n,o){var i,d,p,l,c;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,d=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return p=new r.U(i),e.next=21,s.G.create({provider:p});case 21:l=e.sent,(c=n.split(".")).forEach((function(e){e in l&&(l=l[e])})),e.t1=c[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return d=l.toString(),e.abrupt("break",35);case 29:return e.next=31,l();case 31:return d=(d=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+n);case 35:return e.abrupt("return",d);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function c(e,t,n,a){switch(t){case"humanReadable":(0,d.HumanReadable)(e,n,a);break;case"precise":(0,d.Precise)(e,n,a);break;case"blocksToDays":(0,d.BlocksToDays)(e,a);break;case"percentage":(0,d.Percentage)(e,a);break;case"permillToPercent":(0,d.PermillToPercent)(e,a);break;case"arrayLength":(0,d.ArrayLength)(e,a);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(e){var t=e.network,n=e.path,r=e.defaultValue,s=e.filter,d=void 0===s?void 0:s,l=(0,i.useState)(""),u=l[0],m=l[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==d?c(r.toString(),d,t,m):m(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,a.Z)().mark((function e(){var o;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p(t,n,m);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==d?c(o,d,t,m):m(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),u}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,n,a){var o=void 0;if("polkadot"===n||"statemint"===n)o=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),a((e=Number.isInteger(e/t[n].precision)?e/t[n].precision+" "+t[n].symbol:(e/t[n].precision).toFixed(o)+" "+t[n].symbol).toString())},Precise:function(e,n,a){a(e=(e=parseFloat(e))/t[n].precision+" "+t[n].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},40569:(e,t,n)=>{"use strict";n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>p,default:()=>h,frontMatter:()=>d,metadata:()=>l,toc:()=>u});var a=n(87462),o=n(63366),i=(n(67294),n(3905)),r=n(47940),s=["components"],d={id:"learn-guides-polkadot-opengov",title:"Polkadot OpenGov How-to Guides",sidebar_label:"OpenGov",description:"Advanced How-to Guides about Polkadot OpenGov.",keywords:["opengov","polkadot opengov","referenda","cancel"],slug:"../learn-guides-polkadot-opengov"},p=void 0,l={unversionedId:"learn/learn-guides-polkadot-opengov",id:"learn/learn-guides-polkadot-opengov",title:"Polkadot OpenGov How-to Guides",description:"Advanced How-to Guides about Polkadot OpenGov.",source:"@site/../docs/learn/learn-guides-polkadot-opengov.md",sourceDirName:"learn",slug:"/learn-guides-polkadot-opengov",permalink:"/docs/learn-guides-polkadot-opengov",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-guides-polkadot-opengov.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1697709829,formattedLastUpdatedAt:"Oct 19, 2023",frontMatter:{id:"learn-guides-polkadot-opengov",title:"Polkadot OpenGov How-to Guides",sidebar_label:"OpenGov",description:"Advanced How-to Guides about Polkadot OpenGov.",keywords:["opengov","polkadot opengov","referenda","cancel"],slug:"../learn-guides-polkadot-opengov"},sidebar:"docs",previous:{title:"Nomination Pools",permalink:"/docs/learn-guides-staking-pools"},next:{title:"Treasury",permalink:"/docs/learn-guides-treasury"}},c={},u=[{value:"Cancel or Kill a Referendum",id:"cancel-or-kill-a-referendum",level:2},{value:"Claiming the Preimage and Decision Deposits",id:"claiming-the-preimage-and-decision-deposits",level:2},{value:"Claiming the Referendum Submission Deposit",id:"claiming-the-referendum-submission-deposit",level:2}],m={toc:u},k="wrapper";function h(e){var t=e.components,d=(0,o.Z)(e,s);return(0,i.kt)(k,(0,a.Z)({},m,d,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"This page is for advanced users of Polkadot OpenGov. If you would learn about and participate in\nOpenGov, please navigate to the page on\n",(0,i.kt)("a",{parentName:"p",href:"https://wiki.polkadot.network/docs/maintain-guides-polkadot-opengov"},"participating in Polkadot Opengov.")),(0,i.kt)("h2",{id:"cancel-or-kill-a-referendum"},"Cancel or Kill a Referendum"),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Anybody can cancel an ongoing referendum (i.e., a referendum within the Lead-in or\nvoting/confirmation period). For more information about the referenda timeline in Polkadot OpenGov,\nsee the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov#referenda-timeline"},"dedicated page"),"."),(0,i.kt)("p",{parentName:"admonition"},"To successfully cancel a referendum through the track ",(0,i.kt)("inlineCode",{parentName:"p"},"20 / Referendum Canceller"),", you will need to\nattain\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#referendum-canceller"},"specific approval and support levels"),".")),(0,i.kt)("p",null,"To cancel a referendum, you need first to submit a preimage with the ",(0,i.kt)("inlineCode",{parentName:"p"},"referenda.cancel")," extrinsic. Go to the\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/referenda"},"Polkadot-JS UI > Governance > Referenda"),' and click on the\n"Add Preimage" button. You must specify\nthe ',(0,i.kt)("inlineCode",{parentName:"p"},"referenda.cancel")," extrinsic with the index equal to the ongoing Referendum you wish to cancel.\nIn the screenshot below, the Referendum to be cancelled is 249."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"cancel-referenda-preimage-creation",src:n(78996).Z,width:"2144",height:"944"})),(0,i.kt)("p",null,"This call will cancel the referendum and return the deposit. You can also kill a referendum using\nthe ",(0,i.kt)("inlineCode",{parentName:"p"},"referenda.kill")," extrinsic. This will cancel the referendum and slash the deposit."),(0,i.kt)("admonition",{title:"Preimage Submission Deposit",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"A deposit is required for the preimage to be stored on chain. The preimage deposit is proportional\nto the amount of information stored within the preimage. The deposit amount required for a preimage\nwith a treasury spend transaction is around\n41 DOT. Ensure you have enough account\nbalance to pay for this submission deposit as well as the transaction fees.")),(0,i.kt)("p",null,"Once a preimage is submitted, it can be checked under\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/preimages"},"Governance > Preimages"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"cancel-referenda-preimage-check",src:n(16212).Z,width:"2758",height:"190"})),(0,i.kt)("p",null,"You 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",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/referenda"},"Governance > Referenda"),' and click the "Submit Proposal"\nbutton.'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"cancel-referenda-proposal",src:n(81405).Z,width:"2130",height:"1226"})),(0,i.kt)("p",null,"You 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 ",(0,i.kt)("inlineCode",{parentName:"p"},"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 of\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.referenda.submissionDeposit",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),"","\nwill be reserved for submitting the proposal."),(0,i.kt)("p",null,"Once the proposal has been submitted, it will stay in the Lead-in period until there is enough space\nwithin the track, and a\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#polkadot-opengov-terminology-and-parameters"},"track-dependent preparation period and decision deposit"),"\nhave been met. Failing to submit the decision deposit within a\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.referenda.undecidingTimeout",defaultValue:201600,filter:"blocksToDays",mdxType:"RPC"}),"","-day\nperiod will lead to a referendum timeout."),(0,i.kt)("h2",{id:"claiming-the-preimage-and-decision-deposits"},"Claiming the Preimage and Decision Deposits"),(0,i.kt)("p",null,"After 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",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/preimages"},"Polkadot-JS UI > Governance > Preimages")," and click on\nunnote button shown on the preimage you submitted."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Claim Preimage Deposit",src:n(80560).Z,width:"2828",height:"362"})),(0,i.kt)("p",null,"Similarly, to claim the decision deposit, navigate to\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/referenda"},"Polkadot-JS UI > Governance > Referenda")," and scroll down\nto the end of the page to click on the referenda with the decision deposit and claim it."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Claim Referendum Deposits",src:n(62248).Z,width:"2830",height:"444"})),(0,i.kt)("h2",{id:"claiming-the-referendum-submission-deposit"},"Claiming the Referendum Submission Deposit"),(0,i.kt)("p",null,"The submission deposit for a referendum can be claimed\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/blob/cfb29254f74412cea35e8048d8aea94bc789fcb1/substrate/frame/referenda/src/types.rs#L261"},"only if the referendum was ",(0,i.kt)("inlineCode",{parentName:"a"},"Approved")," or ",(0,i.kt)("inlineCode",{parentName:"a"},"Canceled")),".\nThe submission deposit can be claimed by issuing the ",(0,i.kt)("inlineCode",{parentName:"p"},"refundSubmissionDeposit")," extrinsic."),(0,i.kt)("p",null,"Users can not refund their submission deposit while the referendum is ",(0,i.kt)("inlineCode",{parentName:"p"},"Ongoing")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"Rejected"),".\nSimilarly, users cannot refund their submission deposit if the proposal has ",(0,i.kt)("inlineCode",{parentName:"p"},"TimedOut")," (failing to\nsubmit the decision deposit within a\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.referenda.undecidingTimeout",defaultValue:201600,filter:"blocksToDays",mdxType:"RPC"}),"","-day\nperiod will lead to a referendum timeout). This behavior exists so that users can refrain from\nspamming the chain with proposals that have no interest from the community. If a proposal is in the\n",(0,i.kt)("inlineCode",{parentName:"p"},"TimedOut")," state, any user can call ",(0,i.kt)("inlineCode",{parentName:"p"},"slash_proposal_deposit"),", which will move the funds from the\nuser to a runtime-configured account, like the treasury."),(0,i.kt)("p",null,"To 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",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#small-tipper"},"Small Tipper Track")," would be fine for\nany kind of deposit refund up to\n250 DOT."))}h.isMDXComponent=!0},16212:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/cancel-referenda-preimage-check-45ef7f984450113a2b1a87e9e2751d69.png"},78996:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/cancel-referenda-preimage-creation-3923463db47aec298f74a426dba23166.png"},81405:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/cancel-referenda-proposal-b9c5e90784ec8216360053d8bda84980.png"},80560:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/claim-preimage-deposit-069843b91eba35d4829b237b59ab2d12.png"},62248:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/claim-referendum-decision-deposit-6352bbad189dac6fe7a651b5a3c8f5a5.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/c07c2447.af3db419.js b/assets/js/c07c2447.af3db419.js deleted file mode 100644 index 1d2ac50e4db6..000000000000 --- a/assets/js/c07c2447.af3db419.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[7654],{47940:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var a=n(74165),o=n(15861),i=n(67294),r=n(87152),s=n(17145),d=n(67425);function p(e,t,n){return l.apply(this,arguments)}function l(){return(l=(0,o.Z)((0,a.Z)().mark((function e(t,n,o){var i,d,p,l,c;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,d=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return p=new r.U(i),e.next=21,s.G.create({provider:p});case 21:l=e.sent,(c=n.split(".")).forEach((function(e){e in l&&(l=l[e])})),e.t1=c[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return d=l.toString(),e.abrupt("break",35);case 29:return e.next=31,l();case 31:return d=(d=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+n);case 35:return e.abrupt("return",d);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function c(e,t,n,a){switch(t){case"humanReadable":(0,d.HumanReadable)(e,n,a);break;case"precise":(0,d.Precise)(e,n,a);break;case"blocksToDays":(0,d.BlocksToDays)(e,a);break;case"percentage":(0,d.Percentage)(e,a);break;case"arrayLength":(0,d.ArrayLength)(e,a);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(e){var t=e.network,n=e.path,r=e.defaultValue,s=e.filter,d=void 0===s?void 0:s,l=(0,i.useState)(""),u=l[0],m=l[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==d?c(r.toString(),d,t,m):m(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,a.Z)().mark((function e(){var o;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p(t,n,m);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==d?c(o,d,t,m):m(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),u}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,n,a){var o=void 0;if("polkadot"===n||"statemint"===n)o=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),a((e=Number.isInteger(e/t[n].precision)?e/t[n].precision+" "+t[n].symbol:(e/t[n].precision).toFixed(o)+" "+t[n].symbol).toString())},Precise:function(e,n,a){a(e=(e=parseFloat(e))/t[n].precision+" "+t[n].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},40569:(e,t,n)=>{"use strict";n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>p,default:()=>k,frontMatter:()=>d,metadata:()=>l,toc:()=>u});var a=n(87462),o=n(63366),i=(n(67294),n(3905)),r=n(47940),s=["components"],d={id:"learn-guides-polkadot-opengov",title:"Polkadot OpenGov How-to Guides",sidebar_label:"OpenGov",description:"Advanced How-to Guides about Polkadot OpenGov.",keywords:["opengov","polkadot opengov","referenda","cancel"],slug:"../learn-guides-polkadot-opengov"},p=void 0,l={unversionedId:"learn/learn-guides-polkadot-opengov",id:"learn/learn-guides-polkadot-opengov",title:"Polkadot OpenGov How-to Guides",description:"Advanced How-to Guides about Polkadot OpenGov.",source:"@site/../docs/learn/learn-guides-polkadot-opengov.md",sourceDirName:"learn",slug:"/learn-guides-polkadot-opengov",permalink:"/docs/learn-guides-polkadot-opengov",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-guides-polkadot-opengov.md",tags:[],version:"current",lastUpdatedBy:"Radha",lastUpdatedAt:1697706972,formattedLastUpdatedAt:"Oct 19, 2023",frontMatter:{id:"learn-guides-polkadot-opengov",title:"Polkadot OpenGov How-to Guides",sidebar_label:"OpenGov",description:"Advanced How-to Guides about Polkadot OpenGov.",keywords:["opengov","polkadot opengov","referenda","cancel"],slug:"../learn-guides-polkadot-opengov"},sidebar:"docs",previous:{title:"Nomination Pools",permalink:"/docs/learn-guides-staking-pools"},next:{title:"Treasury",permalink:"/docs/learn-guides-treasury"}},c={},u=[{value:"Cancel or Kill a Referendum",id:"cancel-or-kill-a-referendum",level:2},{value:"Claiming the Preimage and Decision Deposits",id:"claiming-the-preimage-and-decision-deposits",level:2},{value:"Claiming the Referendum Submission Deposit",id:"claiming-the-referendum-submission-deposit",level:2}],m={toc:u},h="wrapper";function k(e){var t=e.components,d=(0,o.Z)(e,s);return(0,i.kt)(h,(0,a.Z)({},m,d,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"This page is for advanced users of Polkadot OpenGov. If you would learn about and participate in\nOpenGov, please navigate to the page on\n",(0,i.kt)("a",{parentName:"p",href:"https://wiki.polkadot.network/docs/maintain-guides-polkadot-opengov"},"participating in Polkadot Opengov.")),(0,i.kt)("h2",{id:"cancel-or-kill-a-referendum"},"Cancel or Kill a Referendum"),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Anybody can cancel an ongoing referendum (i.e., a referendum within the Lead-in or\nvoting/confirmation period). For more information about the referenda timeline in Polkadot OpenGov,\nsee the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov#referenda-timeline"},"dedicated page"),"."),(0,i.kt)("p",{parentName:"admonition"},"To successfully cancel a referendum through the track ",(0,i.kt)("inlineCode",{parentName:"p"},"20 / Referendum Canceller"),", you will need to\nattain\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#referendum-canceller"},"specific approval and support levels"),".")),(0,i.kt)("p",null,"To cancel a referendum, you need first to submit a preimage with the ",(0,i.kt)("inlineCode",{parentName:"p"},"referenda.cancel")," extrinsic. Go to the\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/referenda"},"Polkadot-JS UI > Governance > Referenda"),' and click on the\n"Add Preimage" button. You must specify\nthe ',(0,i.kt)("inlineCode",{parentName:"p"},"referenda.cancel")," extrinsic with the index equal to the ongoing Referendum you wish to cancel.\nIn the screenshot below, the Referendum to be cancelled is 249."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"cancel-referenda-preimage-creation",src:n(78996).Z,width:"2144",height:"944"})),(0,i.kt)("p",null,"This call will cancel the referendum and return the deposit. You can also kill a referendum using\nthe ",(0,i.kt)("inlineCode",{parentName:"p"},"referenda.kill")," extrinsic. This will cancel the referendum and slash the deposit."),(0,i.kt)("admonition",{title:"Preimage Submission Deposit",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"A deposit is required for the preimage to be stored on chain. The preimage deposit is proportional\nto the amount of information stored within the preimage. The deposit amount required for a preimage\nwith a treasury spend transaction is around\n41 DOT. Ensure you have enough account\nbalance to pay for this submission deposit as well as the transaction fees.")),(0,i.kt)("p",null,"Once a preimage is submitted, it can be checked under\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/preimages"},"Governance > Preimages"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"cancel-referenda-preimage-check",src:n(16212).Z,width:"2758",height:"190"})),(0,i.kt)("p",null,"You 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",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/referenda"},"Governance > Referenda"),' and click the "Submit Proposal"\nbutton.'),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"cancel-referenda-proposal",src:n(81405).Z,width:"2130",height:"1226"})),(0,i.kt)("p",null,"You 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 ",(0,i.kt)("inlineCode",{parentName:"p"},"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 of\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.referenda.submissionDeposit",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),"","\nwill be reserved for submitting the proposal."),(0,i.kt)("p",null,"Once the proposal has been submitted, it will stay in the Lead-in period until there is enough space\nwithin the track, and a\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#polkadot-opengov-terminology-and-parameters"},"track-dependent preparation period and decision deposit"),"\nhave been met. Failing to submit the decision deposit within a\n",(0,i.kt)(r.Z,{network:"polkadot",path:"const.referenda.undecidingTimeout",defaultValue:201600,filter:"blocksToDays",mdxType:"RPC"}),"","-day\nperiod will lead to a referendum timeout."),(0,i.kt)("h2",{id:"claiming-the-preimage-and-decision-deposits"},"Claiming the Preimage and Decision Deposits"),(0,i.kt)("p",null,"After 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",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/preimages"},"Polkadot-JS UI > Governance > Preimages")," and click on\nunnote button shown on the preimage you submitted."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Claim Preimage Deposit",src:n(80560).Z,width:"2828",height:"362"})),(0,i.kt)("p",null,"Similarly, to claim the decision deposit, navigate to\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/referenda"},"Polkadot-JS UI > Governance > Referenda")," and scroll down\nto the end of the page to click on the referenda with the decision deposit and claim it."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Claim Referendum Deposits",src:n(62248).Z,width:"2830",height:"444"})),(0,i.kt)("h2",{id:"claiming-the-referendum-submission-deposit"},"Claiming the Referendum Submission Deposit"),(0,i.kt)("p",null,"The submission deposit for a referendum can be claimed\n",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/blob/cfb29254f74412cea35e8048d8aea94bc789fcb1/substrate/frame/referenda/src/types.rs#L261"},"only if the referendum was ",(0,i.kt)("inlineCode",{parentName:"a"},"Approved")," or ",(0,i.kt)("inlineCode",{parentName:"a"},"Canceled")),".\nThe submission deposit can be claimed by issuing the ",(0,i.kt)("inlineCode",{parentName:"p"},"refundSubmissionDeposit")," extrinsic."),(0,i.kt)("p",null,"Users can not refund their submission deposit while the referendum is ",(0,i.kt)("inlineCode",{parentName:"p"},"Ongoing")," or ",(0,i.kt)("inlineCode",{parentName:"p"},"Rejected"),".\nSimilarly, users cannot refund their submission deposit if the proposal has ",(0,i.kt)("inlineCode",{parentName:"p"},"TimedOut")," (failing to\nsubmit the decision deposit within a\n",(0,i.kt)(r.Z,{network:"polkadot",path:"const.referenda.undecidingTimeout",defaultValue:201600,filter:"blocksToDays",mdxType:"RPC"}),"","-day\nperiod will lead to a referendum timeout). This behavior exists so that users can refrain from\nspamming the chain with proposals that have no interest from the community. If a proposal is in the\n",(0,i.kt)("inlineCode",{parentName:"p"},"TimedOut")," state, any user can call ",(0,i.kt)("inlineCode",{parentName:"p"},"slash_proposal_deposit"),", which will move the funds from the\nuser to a runtime-configured account, like the treasury."),(0,i.kt)("p",null,"To 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",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-polkadot-opengov#small-tipper"},"Small Tipper Track")," would be fine for\nany kind of deposit refund up to\n250 DOT."))}k.isMDXComponent=!0},16212:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/cancel-referenda-preimage-check-45ef7f984450113a2b1a87e9e2751d69.png"},78996:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/cancel-referenda-preimage-creation-3923463db47aec298f74a426dba23166.png"},81405:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/cancel-referenda-proposal-b9c5e90784ec8216360053d8bda84980.png"},80560:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/claim-preimage-deposit-069843b91eba35d4829b237b59ab2d12.png"},62248:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const a=n.p+"assets/images/claim-referendum-decision-deposit-6352bbad189dac6fe7a651b5a3c8f5a5.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/c41801b5.21e11aa0.js b/assets/js/c41801b5.21e11aa0.js new file mode 100644 index 000000000000..cd3d8bd5d2f3 --- /dev/null +++ b/assets/js/c41801b5.21e11aa0.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[5013],{12418:(a,e,t)=>{"use strict";t.d(e,{Z:()=>c});var n=t(74165),o=t(15861),r=t(67294),i=t(87152),s=t(17145),u=t(67425);function l(a,e,t){return d.apply(this,arguments)}function d(){return(d=(0,o.Z)((0,n.Z)().mark((function a(e,t,o){var r,l,d,c,m,p,k,h;return(0,n.Z)().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return r=new i.U(t),a.next=3,s.G.create({provider:r});case 3:return l=a.sent,a.next=6,Promise.all([l.query.session.validators(),l.query.staking.currentEra()]);case 6:return d=a.sent,c=d[0],m=d[1],a.next=11,l.query.staking.erasStakers(m.toString(),c[0]);case 11:return p=a.sent,k=parseInt(p.total),a.next=15,l.query.staking.erasStakers.entries(m.toString());case 15:a.sent.forEach((function(a){a[0];var e=a[1],t=parseInt(e.total);t{"use strict";t.d(e,{Z:()=>m});var n=t(74165),o=t(15861),r=t(67294),i=t(87152),s=t(17145),u=t(67425);function l(a,e,t){return d.apply(this,arguments)}function d(){return(d=(0,o.Z)((0,n.Z)().mark((function a(e,t,o){var r,u,l,d,c;return(0,n.Z)().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:r=void 0,u=void 0,a.t0=e,a.next="polkadot"===a.t0?5:"kusama"===a.t0?7:"statemine"===a.t0?9:"statemint"===a.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",a.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",a.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",a.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",a.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){a.next=18;break}return a.abrupt("return");case 18:return l=new i.U(r),a.next=21,s.G.create({provider:l});case 21:d=a.sent,(c=t.split(".")).forEach((function(a){a in d&&(d=d[a])})),a.t1=c[0],a.next="consts"===a.t1?27:"query"===a.t1?29:34;break;case 27:return u=d.toString(),a.abrupt("break",35);case 29:return a.next=31,d();case 31:return u=(u=a.sent).toString(),a.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+t);case 35:return a.abrupt("return",u);case 36:case"end":return a.stop()}}),a)})))).apply(this,arguments)}function c(a,e,t,n){switch(e){case"humanReadable":(0,u.HumanReadable)(a,t,n);break;case"precise":(0,u.Precise)(a,t,n);break;case"blocksToDays":(0,u.BlocksToDays)(a,n);break;case"percentage":(0,u.Percentage)(a,n);break;case"permillToPercent":(0,u.PermillToPercent)(a,n);break;case"arrayLength":(0,u.ArrayLength)(a,n);break;default:return void console.log("Ignoring unknown filter type")}}const m=function(a){var e=a.network,t=a.path,i=a.defaultValue,s=a.filter,u=void 0===s?void 0:s,d=(0,r.useState)(""),m=d[0],p=d[1];return e=e.toLowerCase(),(0,r.useEffect)((function(){void 0!==u?c(i.toString(),u,e,p):p(i.toString());var a=void 0;switch(e){case"polkadot":a="wss://rpc.polkadot.io";break;case"kusama":a="wss://kusama-rpc.polkadot.io/";break;case"statemine":a="wss://statemine-rpc.polkadot.io/";break;case"statemint":a="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===a)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var a=(0,o.Z)((0,n.Z)().mark((function a(){var o;return(0,n.Z)().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.next=2,l(e,t,p);case 2:if(void 0!==(o=a.sent)){a.next=7;break}return a.abrupt("return");case 7:void 0!==u?c(o,u,e,p):p(o);case 8:case"end":return a.stop()}}),a)})));return function(){return a.apply(this,arguments)}}();try{r()}catch(s){console.log(s)}}}),[]),m}},67425:a=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};a.exports={HumanReadable:function(a,t,n){var o=void 0;if("polkadot"===t||"statemint"===t)o=3;else{if("kusama"!==t&&"statemine"!==t)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}a=parseFloat(a),n((a=Number.isInteger(a/e[t].precision)?a/e[t].precision+" "+e[t].symbol:(a/e[t].precision).toFixed(o)+" "+e[t].symbol).toString())},Precise:function(a,t,n){n(a=(a=parseFloat(a))/e[t].precision+" "+e[t].symbol)},BlocksToDays:function(a,e){e((a=6*a/86400).toString())},Percentage:function(a,e){e((a/=1e7).toString())},PermillToPercent:function(a,e){e((a/=1e4).toString())},ArrayLength:function(a,e){e((a=a.split(",").length).toString())}}},63801:(a,e,t)=>{"use strict";t.r(e),t.d(e,{assets:()=>m,contentTitle:()=>d,default:()=>f,frontMatter:()=>l,metadata:()=>c,toc:()=>p});var n=t(87462),o=t(63366),r=(t(67294),t(3905)),i=t(47940),s=t(12418),u=["components"],l={id:"maintain-guides-how-to-validate-kusama",title:"Run a Validator (Kusama)",sidebar_label:"How to run a Validator on Kusama",description:"The fundamentals for running a Kusama validator.",keywords:["validate","validator","kusama","stake","maintain"],slug:"../../maintain-guides-how-to-validate-kusama"},d=void 0,c={unversionedId:"maintain/kusama/maintain-guides-how-to-validate-kusama",id:"maintain/kusama/maintain-guides-how-to-validate-kusama",title:"Run a Validator (Kusama)",description:"The fundamentals for running a Kusama validator.",source:"@site/../docs/maintain/kusama/maintain-guides-how-to-validate-kusama.md",sourceDirName:"maintain/kusama",slug:"/maintain-guides-how-to-validate-kusama",permalink:"/docs/maintain-guides-how-to-validate-kusama",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/kusama/maintain-guides-how-to-validate-kusama.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1691393601,formattedLastUpdatedAt:"Aug 7, 2023",frontMatter:{id:"maintain-guides-how-to-validate-kusama",title:"Run a Validator (Kusama)",sidebar_label:"How to run a Validator on Kusama",description:"The fundamentals for running a Kusama validator.",keywords:["validate","validator","kusama","stake","maintain"],slug:"../../maintain-guides-how-to-validate-kusama"}},m={},p=[{value:"Preliminaries",id:"preliminaries",level:2},{value:"How many KSM do I need to become an active Validator?",id:"how-many-ksm-do-i-need-to-become-an-active-validator",level:3},{value:"Validator Rewards",id:"validator-rewards",level:3},{value:"Run a Kusama Validator",id:"run-a-kusama-validator",level:2}],k={toc:p},h="wrapper";function f(a){var e=a.components,t=(0,o.Z)(a,u);return(0,r.kt)(h,(0,n.Z)({},k,t,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"preliminaries"},"Preliminaries"),(0,r.kt)("p",null,"Running a validator on a live network is a lot of responsibility! You will be accountable for not\nonly your own stake, but also the stake of your current nominators. If you make a mistake and get\nslashed, your tokens and your reputation will be at risk. However, running a validator can also be\nvery rewarding, knowing that you contribute to the security of a decentralized network while growing\nyour stash."),(0,r.kt)("admonition",{type:"warning"},(0,r.kt)("p",{parentName:"admonition"},"It is highly recommended that you have significant system administration experience before\nattempting to run your own validator."),(0,r.kt)("p",{parentName:"admonition"},"You must be able to handle technical issues and anomalies with your node which you must be able to\ntackle yourself. Being a validator involves more than just executing the binary file.")),(0,r.kt)("p",null,"Since security is so important to running a successful validator, you should take a look at the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-secure-validator"},"secure validator")," information to make sure you understand\nthe factors to consider when constructing your infrastructure. As you progress in your journey as a\nvalidator, you will likely want to use this repository as a ",(0,r.kt)("em",{parentName:"p"},"starting point")," for your own\nmodifications and customizations."),(0,r.kt)("p",null,"If you need help, please reach out on the\n",(0,r.kt)("a",{parentName:"p",href:"https://matrix.to/#/#KusamaValidatorLounge:polkadot.builders"},"Kusama Validator Lounge")," on Element.\nThe team and other validators are there to help answer questions and provide tips from experience."),(0,r.kt)("h3",{id:"how-many-ksm-do-i-need-to-become-an-active-validator"},"How many KSM do I need to become an active Validator?"),(0,r.kt)("admonition",{title:"Controller accounts are deprecated",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Controller accounts are deprecated. For more information, see\n",(0,r.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/t/staking-controller-deprecation-plan-staking-ui-leads-comms/2748"},"this discussion"),".")),(0,r.kt)("p",null,"You can have a rough estimate on that by using the methods listed\n",(0,r.kt)("a",{parentName:"p",href:"/docs/faq/#what-is-the-minimum-stake-necessary-to-be-elected-as-an-active-validator"},"here"),".\nTo be elected into the set, you need a minimum stake behind your validator. This stake can come from\nyourself or from ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-nominator"},"nominators"),". This means that as a minimum, you\nwill need enough KSM to set up Stash and staking proxy ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"accounts"),"\nwith the existential deposit, plus a little extra for transaction fees. The rest can come from\nnominators. To understand how validators are elected, check the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"NPoS Election algorithms")," page."),(0,r.kt)("admonition",{title:"On-Chain Data for Reference",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"On Kusama, the minimum stake backing a validator in the active set is\n","\n",(0,r.kt)(s.Z,{network:"kusama",defaultValue:5288388652143741,mdxType:"MinimumStake"})," in the\nera\n","\n",(0,r.kt)(i.Z,{network:"kusama",path:"query.staking.currentEra",defaultValue:"4838",mdxType:"RPC"}),"."),(0,r.kt)("p",{parentName:"admonition"},"On Polkadot, the minimum stake backing a validator in the active set is\n",(0,r.kt)(s.Z,{network:"polkadot",defaultValue:0x3d83c4f4e51b08,mdxType:"MinimumStake"}),"\n"," in the era\n",(0,r.kt)(i.Z,{network:"polkadot",path:"query.staking.currentEra",defaultValue:"998",mdxType:"RPC"}),".\n","")),(0,r.kt)("admonition",{title:"Join the Thousand Validator Programme",type:"tip"},(0,r.kt)("p",{parentName:"admonition"},(0,r.kt)("a",{parentName:"p",href:"/docs/thousand-validators"},"The Thousand Validator Programme")," is an initiative by Web3\nFoundation and Parity Technologies to use the funds held by both organizations to nominate\nvalidators in the community.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Warning:")," Any KSM that you stake for your validator is liable to be slashed, meaning that an\ninsecure or improper setup may result in loss of KSM tokens! If you are not confident in your\nability to run a validator node, it is recommended to nominate your KSM to a trusted validator node\ninstead."),(0,r.kt)("h3",{id:"validator-rewards"},"Validator Rewards"),(0,r.kt)("p",null,"On Kusama, one day is approximately four eras whereas on Polkadot, one era is approximately a day.\nIn each era, the validators elected to the active set earn era points which correspond to the actual\nrewards earned that are distributed proportionally to the nominators after deducting the validator\ncommission. Currently, the minimum validator commission is set to\n","\n",(0,r.kt)(i.Z,{network:"kusama",path:"query.staking.minCommission",filter:"percentage",defaultValue:"10",mdxType:"RPC"}),"%\nwhich can be set through on-chain governance. For more information rewards and payouts, check the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-validator-payout"},"validator payout")," document."),(0,r.kt)("h2",{id:"run-a-kusama-validator"},"Run a Kusama Validator"),(0,r.kt)("p",null,"Running a validator on the Kusama network is identical to running a Polkadot validator. Check out\nthe ",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-validate-polkadot"},"Polkadot guide")," on how to setup a validator."),(0,r.kt)("p",null,"Make sure to adjust the Polkadot guide to run a Kusama network validator (the instructions will also\nbe available in the Polkadot Validator guide):"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"When starting the node pass ",(0,r.kt)("inlineCode",{parentName:"li"},"--chain=kusama")," CLI flag")))}f.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/c41801b5.2ce6efac.js b/assets/js/c41801b5.2ce6efac.js deleted file mode 100644 index d3273c2ff764..000000000000 --- a/assets/js/c41801b5.2ce6efac.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[5013],{12418:(a,t,e)=>{"use strict";e.d(t,{Z:()=>c});var n=e(74165),o=e(15861),r=e(67294),i=e(87152),s=e(17145),u=e(67425);function l(a,t,e){return d.apply(this,arguments)}function d(){return(d=(0,o.Z)((0,n.Z)().mark((function a(t,e,o){var r,l,d,c,m,p,k,h;return(0,n.Z)().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return r=new i.U(e),a.next=3,s.G.create({provider:r});case 3:return l=a.sent,a.next=6,Promise.all([l.query.session.validators(),l.query.staking.currentEra()]);case 6:return d=a.sent,c=d[0],m=d[1],a.next=11,l.query.staking.erasStakers(m.toString(),c[0]);case 11:return p=a.sent,k=parseInt(p.total),a.next=15,l.query.staking.erasStakers.entries(m.toString());case 15:a.sent.forEach((function(a){a[0];var t=a[1],e=parseInt(t.total);e{"use strict";e.d(t,{Z:()=>m});var n=e(74165),o=e(15861),r=e(67294),i=e(87152),s=e(17145),u=e(67425);function l(a,t,e){return d.apply(this,arguments)}function d(){return(d=(0,o.Z)((0,n.Z)().mark((function a(t,e,o){var r,u,l,d,c;return(0,n.Z)().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:r=void 0,u=void 0,a.t0=t,a.next="polkadot"===a.t0?5:"kusama"===a.t0?7:"statemine"===a.t0?9:"statemint"===a.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",a.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",a.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",a.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",a.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){a.next=18;break}return a.abrupt("return");case 18:return l=new i.U(r),a.next=21,s.G.create({provider:l});case 21:d=a.sent,(c=e.split(".")).forEach((function(a){a in d&&(d=d[a])})),a.t1=c[0],a.next="consts"===a.t1?27:"query"===a.t1?29:34;break;case 27:return u=d.toString(),a.abrupt("break",35);case 29:return a.next=31,d();case 31:return u=(u=a.sent).toString(),a.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+e);case 35:return a.abrupt("return",u);case 36:case"end":return a.stop()}}),a)})))).apply(this,arguments)}function c(a,t,e,n){switch(t){case"humanReadable":(0,u.HumanReadable)(a,e,n);break;case"precise":(0,u.Precise)(a,e,n);break;case"blocksToDays":(0,u.BlocksToDays)(a,n);break;case"percentage":(0,u.Percentage)(a,n);break;case"arrayLength":(0,u.ArrayLength)(a,n);break;default:return void console.log("Ignoring unknown filter type")}}const m=function(a){var t=a.network,e=a.path,i=a.defaultValue,s=a.filter,u=void 0===s?void 0:s,d=(0,r.useState)(""),m=d[0],p=d[1];return t=t.toLowerCase(),(0,r.useEffect)((function(){void 0!==u?c(i.toString(),u,t,p):p(i.toString());var a=void 0;switch(t){case"polkadot":a="wss://rpc.polkadot.io";break;case"kusama":a="wss://kusama-rpc.polkadot.io/";break;case"statemine":a="wss://statemine-rpc.polkadot.io/";break;case"statemint":a="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===a)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var a=(0,o.Z)((0,n.Z)().mark((function a(){var o;return(0,n.Z)().wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.next=2,l(t,e,p);case 2:if(void 0!==(o=a.sent)){a.next=7;break}return a.abrupt("return");case 7:void 0!==u?c(o,u,t,p):p(o);case 8:case"end":return a.stop()}}),a)})));return function(){return a.apply(this,arguments)}}();try{r()}catch(s){console.log(s)}}}),[]),m}},67425:a=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};a.exports={HumanReadable:function(a,e,n){var o=void 0;if("polkadot"===e||"statemint"===e)o=3;else{if("kusama"!==e&&"statemine"!==e)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}a=parseFloat(a),n((a=Number.isInteger(a/t[e].precision)?a/t[e].precision+" "+t[e].symbol:(a/t[e].precision).toFixed(o)+" "+t[e].symbol).toString())},Precise:function(a,e,n){n(a=(a=parseFloat(a))/t[e].precision+" "+t[e].symbol)},BlocksToDays:function(a,t){t((a=6*a/86400).toString())},Percentage:function(a,t){t((a/=1e7).toString())},ArrayLength:function(a,t){t((a=a.split(",").length).toString())}}},63801:(a,t,e)=>{"use strict";e.r(t),e.d(t,{assets:()=>m,contentTitle:()=>d,default:()=>f,frontMatter:()=>l,metadata:()=>c,toc:()=>p});var n=e(87462),o=e(63366),r=(e(67294),e(3905)),i=e(47940),s=e(12418),u=["components"],l={id:"maintain-guides-how-to-validate-kusama",title:"Run a Validator (Kusama)",sidebar_label:"How to run a Validator on Kusama",description:"The fundamentals for running a Kusama validator.",keywords:["validate","validator","kusama","stake","maintain"],slug:"../../maintain-guides-how-to-validate-kusama"},d=void 0,c={unversionedId:"maintain/kusama/maintain-guides-how-to-validate-kusama",id:"maintain/kusama/maintain-guides-how-to-validate-kusama",title:"Run a Validator (Kusama)",description:"The fundamentals for running a Kusama validator.",source:"@site/../docs/maintain/kusama/maintain-guides-how-to-validate-kusama.md",sourceDirName:"maintain/kusama",slug:"/maintain-guides-how-to-validate-kusama",permalink:"/docs/maintain-guides-how-to-validate-kusama",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/kusama/maintain-guides-how-to-validate-kusama.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1691393601,formattedLastUpdatedAt:"Aug 7, 2023",frontMatter:{id:"maintain-guides-how-to-validate-kusama",title:"Run a Validator (Kusama)",sidebar_label:"How to run a Validator on Kusama",description:"The fundamentals for running a Kusama validator.",keywords:["validate","validator","kusama","stake","maintain"],slug:"../../maintain-guides-how-to-validate-kusama"}},m={},p=[{value:"Preliminaries",id:"preliminaries",level:2},{value:"How many KSM do I need to become an active Validator?",id:"how-many-ksm-do-i-need-to-become-an-active-validator",level:3},{value:"Validator Rewards",id:"validator-rewards",level:3},{value:"Run a Kusama Validator",id:"run-a-kusama-validator",level:2}],k={toc:p},h="wrapper";function f(a){var t=a.components,e=(0,o.Z)(a,u);return(0,r.kt)(h,(0,n.Z)({},k,e,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"preliminaries"},"Preliminaries"),(0,r.kt)("p",null,"Running a validator on a live network is a lot of responsibility! You will be accountable for not\nonly your own stake, but also the stake of your current nominators. If you make a mistake and get\nslashed, your tokens and your reputation will be at risk. However, running a validator can also be\nvery rewarding, knowing that you contribute to the security of a decentralized network while growing\nyour stash."),(0,r.kt)("admonition",{type:"warning"},(0,r.kt)("p",{parentName:"admonition"},"It is highly recommended that you have significant system administration experience before\nattempting to run your own validator."),(0,r.kt)("p",{parentName:"admonition"},"You must be able to handle technical issues and anomalies with your node which you must be able to\ntackle yourself. Being a validator involves more than just executing the binary file.")),(0,r.kt)("p",null,"Since security is so important to running a successful validator, you should take a look at the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-secure-validator"},"secure validator")," information to make sure you understand\nthe factors to consider when constructing your infrastructure. As you progress in your journey as a\nvalidator, you will likely want to use this repository as a ",(0,r.kt)("em",{parentName:"p"},"starting point")," for your own\nmodifications and customizations."),(0,r.kt)("p",null,"If you need help, please reach out on the\n",(0,r.kt)("a",{parentName:"p",href:"https://matrix.to/#/#KusamaValidatorLounge:polkadot.builders"},"Kusama Validator Lounge")," on Element.\nThe team and other validators are there to help answer questions and provide tips from experience."),(0,r.kt)("h3",{id:"how-many-ksm-do-i-need-to-become-an-active-validator"},"How many KSM do I need to become an active Validator?"),(0,r.kt)("admonition",{title:"Controller accounts are deprecated",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Controller accounts are deprecated. For more information, see\n",(0,r.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/t/staking-controller-deprecation-plan-staking-ui-leads-comms/2748"},"this discussion"),".")),(0,r.kt)("p",null,"You can have a rough estimate on that by using the methods listed\n",(0,r.kt)("a",{parentName:"p",href:"/docs/faq/#what-is-the-minimum-stake-necessary-to-be-elected-as-an-active-validator"},"here"),".\nTo be elected into the set, you need a minimum stake behind your validator. This stake can come from\nyourself or from ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-nominator"},"nominators"),". This means that as a minimum, you\nwill need enough KSM to set up Stash and staking proxy ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"accounts"),"\nwith the existential deposit, plus a little extra for transaction fees. The rest can come from\nnominators. To understand how validators are elected, check the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"NPoS Election algorithms")," page."),(0,r.kt)("admonition",{title:"On-Chain Data for Reference",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"On Kusama, the minimum stake backing a validator in the active set is\n","\n",(0,r.kt)(s.Z,{network:"kusama",defaultValue:5288388652143741,mdxType:"MinimumStake"})," in the\nera\n","\n",(0,r.kt)(i.Z,{network:"kusama",path:"query.staking.currentEra",defaultValue:"4838",mdxType:"RPC"}),"."),(0,r.kt)("p",{parentName:"admonition"},"On Polkadot, the minimum stake backing a validator in the active set is\n",(0,r.kt)(s.Z,{network:"polkadot",defaultValue:0x3d83c4f4e51b08,mdxType:"MinimumStake"}),"\n"," in the era\n",(0,r.kt)(i.Z,{network:"polkadot",path:"query.staking.currentEra",defaultValue:"998",mdxType:"RPC"}),".\n","")),(0,r.kt)("admonition",{title:"Join the Thousand Validator Programme",type:"tip"},(0,r.kt)("p",{parentName:"admonition"},(0,r.kt)("a",{parentName:"p",href:"/docs/thousand-validators"},"The Thousand Validator Programme")," is an initiative by Web3\nFoundation and Parity Technologies to use the funds held by both organizations to nominate\nvalidators in the community.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Warning:")," Any KSM that you stake for your validator is liable to be slashed, meaning that an\ninsecure or improper setup may result in loss of KSM tokens! If you are not confident in your\nability to run a validator node, it is recommended to nominate your KSM to a trusted validator node\ninstead."),(0,r.kt)("h3",{id:"validator-rewards"},"Validator Rewards"),(0,r.kt)("p",null,"On Kusama, one day is approximately four eras whereas on Polkadot, one era is approximately a day.\nIn each era, the validators elected to the active set earn era points which correspond to the actual\nrewards earned that are distributed proportionally to the nominators after deducting the validator\ncommission. Currently, the minimum validator commission is set to\n","\n",(0,r.kt)(i.Z,{network:"kusama",path:"query.staking.minCommission",filter:"percentage",defaultValue:"10",mdxType:"RPC"}),"%\nwhich can be set through on-chain governance. For more information rewards and payouts, check the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-validator-payout"},"validator payout")," document."),(0,r.kt)("h2",{id:"run-a-kusama-validator"},"Run a Kusama Validator"),(0,r.kt)("p",null,"Running a validator on the Kusama network is identical to running a Polkadot validator. Check out\nthe ",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-validate-polkadot"},"Polkadot guide")," on how to setup a validator."),(0,r.kt)("p",null,"Make sure to adjust the Polkadot guide to run a Kusama network validator (the instructions will also\nbe available in the Polkadot Validator guide):"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"When starting the node pass ",(0,r.kt)("inlineCode",{parentName:"li"},"--chain=kusama")," CLI flag")))}f.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/c7c5ba1a.8fd8100f.js b/assets/js/c7c5ba1a.8fd8100f.js deleted file mode 100644 index 6d852ff09c19..000000000000 --- a/assets/js/c7c5ba1a.8fd8100f.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[6104],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>p});var n=a(74165),o=a(15861),r=a(67294),s=a(87152),i=a(17145),c=a(67425);function l(e,t,a){return d.apply(this,arguments)}function d(){return(d=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var r,c,l,d,u;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=void 0,c=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){e.next=18;break}return e.abrupt("return");case 18:return l=new s.U(r),e.next=21,i.G.create({provider:l});case 21:d=e.sent,(u=a.split(".")).forEach((function(e){e in d&&(d=d[e])})),e.t1=u[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return c=d.toString(),e.abrupt("break",35);case 29:return e.next=31,d();case 31:return c=(c=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+a);case 35:return e.abrupt("return",c);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function u(e,t,a,n){switch(t){case"humanReadable":(0,c.HumanReadable)(e,a,n);break;case"precise":(0,c.Precise)(e,a,n);break;case"blocksToDays":(0,c.BlocksToDays)(e,n);break;case"percentage":(0,c.Percentage)(e,n);break;case"arrayLength":(0,c.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(e){var t=e.network,a=e.path,s=e.defaultValue,i=e.filter,c=void 0===i?void 0:i,d=(0,r.useState)(""),p=d[0],h=d[1];return t=t.toLowerCase(),(0,r.useEffect)((function(){void 0!==c?u(s.toString(),c,t,h):h(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,l(t,a,h);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==c?u(o,c,t,h):h(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{r()}catch(i){console.log(i)}}}),[]),p}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},63706:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>k,frontMatter:()=>c,metadata:()=>d,toc:()=>p});var n=a(87462),o=a(63366),r=(a(67294),a(3905)),s=a(47940),i=["components"],c={id:"learn-accounts",title:"Polkadot Accounts",sidebar_label:"Polkadot Accounts",description:"Polkadot Accounts, Account Identity, and Account Reaping.",keywords:["account","polkadot account","polkadotjs","indices","identity","reaping"],slug:"../learn-accounts"},l=void 0,d={unversionedId:"learn/learn-accounts",id:"learn/learn-accounts",title:"Polkadot Accounts",description:"Polkadot Accounts, Account Identity, and Account Reaping.",source:"@site/../docs/learn/learn-accounts.md",sourceDirName:"learn",slug:"/learn-accounts",permalink:"/docs/learn-accounts",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-accounts.md",tags:[],version:"current",lastUpdatedBy:"omahs",lastUpdatedAt:1695203423,formattedLastUpdatedAt:"Sep 20, 2023",frontMatter:{id:"learn-accounts",title:"Polkadot Accounts",sidebar_label:"Polkadot Accounts",description:"Polkadot Accounts, Account Identity, and Account Reaping.",keywords:["account","polkadot account","polkadotjs","indices","identity","reaping"],slug:"../learn-accounts"},sidebar:"docs",previous:{title:"Accounts",permalink:"/docs/learn-accounts-index"},next:{title:"Account Generation",permalink:"/docs/learn-account-generation"}},u={},p=[{value:"Account Address",id:"account-address",level:2},{value:"Mnemonic and Address Generation",id:"mnemonic-and-address-generation",level:3},{value:"Obtaining and Managing an Address",id:"obtaining-and-managing-an-address",level:3},{value:"Account Balance Types",id:"account-balance-types",level:2},{value:"Query Account Data in Polkadot-JS",id:"query-account-data-in-polkadot-js",level:3},{value:"Unlocking Locks",id:"unlocking-locks",level:3},{value:"Existential Deposit and Reaping",id:"existential-deposit-and-reaping",level:2},{value:"Account Identity",id:"account-identity",level:2},{value:"Proxy Accounts",id:"proxy-accounts",level:2},{value:"Multi-signature Accounts",id:"multi-signature-accounts",level:2},{value:"Resources",id:"resources",level:2}],h={toc:p},m="wrapper";function k(e){var t=e.components,c=(0,o.Z)(e,i);return(0,r.kt)(m,(0,n.Z)({},h,c,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"This document covers the basics of Polkadot\naccounts. See the ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced"},"Advanced Account")," page for more information about\naccounts such as ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced#derivation-paths"},"account derivation")," and\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced#indices"},"indices"),". For a more in-depth explanation of the cryptography\nbehind Polkadot accounts, please see\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"the cryptography page"),"."),(0,r.kt)("h2",{id:"account-address"},"Account Address"),(0,r.kt)("p",null,"An address is the public part of a Polkadot\naccount. The private part is the key used to access this address. The public and private parts\ntogether make up a Polkadot account. You can\nthink of the public address of your account like your mailbox and the private key like the key to\nopen that mailbox. Anybody can send mail to your mailbox, but only you can access them as only you\nhave access to its key. In the context of\nPolkadot accounts, anybody can send tokens to\nyour public address but only you can transact with them using your private key. That is why you\nshould keep your private key secret."),(0,r.kt)("h3",{id:"mnemonic-and-address-generation"},"Mnemonic and Address Generation"),(0,r.kt)("p",null,"A valid account requires a private key that can sign on to one of the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/build-protocol-info#cryptography"},"supported curves and signature schemes"),". Without a\nprivate key an account cannot sign anything. In\nPolkadot there are some exceptions of accounts\nthat do not have private keys (i.e. key-less accounts). Such accounts are\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-multisig"},"multi-signature accounts")," and\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-proxies-pure#anonymous-proxy-pure-proxy"},"anonymous proxies")," that are not discussed here\nand are meant for an advanced audience."),(0,r.kt)("p",null,"Most 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."),(0,r.kt)("admonition",{title:"Not all wallets use the same algorithm to convert from mnemonic phrase to private key",type:"danger"},(0,r.kt)("p",{parentName:"admonition"},(0,r.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/command-line-tools/subkey/"},"Subkey")," and Polkadot-JS based\nwallets use the BIP39 dictionary for mnemonic generation, but use the entropy byte array to generate\nthe private key, while full BIP39 wallets (like Ledger) use 2048 rounds of PBKDF2 on the mnemonic.\nThe same mnemonic may generate different private keys on other wallets due to the various\ncryptographic algorithms used. See\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate-bip39"},"Substrate BIP39 Repo")," for more information.")),(0,r.kt)("p",null,"A typical mnemonic phrase generated by\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/command-line-tools/subkey/"},"the Subkey tool")," is shown below."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"'caution juice atom organ advance problem want pledge someone senior holiday very'\n")),(0,r.kt)("p",null,"Its corresponding ",(0,r.kt)("em",{parentName:"p"},"private/public keypair")," is also shown."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"Secret seed (Private key): 0x056a6a4e203766ffbea3146967ef25e9daf677b14dc6f6ed8919b1983c9bebbc\nPublic key (SS58): 5F3sa2TJAWMqDhXG6jhV4N8ko9SxwGy8TpaNS1repo5EYjQX\n")),(0,r.kt)("p",null,"Polkadot default address format is the ",(0,r.kt)("inlineCode",{parentName:"p"},"MultiAddress")," type. This means that the same mnemonic phrase\nwill generate public keys for different parachains. For more information see the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced#address-format"},"Address Format")," section on the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced"},"Advanced Account")," page."),(0,r.kt)("h3",{id:"obtaining-and-managing-an-address"},"Obtaining and Managing an Address"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"To learn more about generating accounts on\nPolkadot visit the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-generation"},"Account Generation page"),".")),(0,r.kt)("h2",{id:"account-balance-types"},"Account Balance Types"),(0,r.kt)("p",null,"In Polkadot there are different types of\nbalance depending on the account activity. Different balance types indicate whether your balance can\nbe used for transfers, to pay fees, or must remain frozen and unused due to an on-chain requirement.\nBelow is an example that displays different balance types of a Kusama account in the\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/accounts"},"Accounts tab of the Polkadot-JS UI")," (note that the balance\ntypes are the same for a Polkadot account)."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"account_balance_types",src:a(84241).Z,width:"1061",height:"291"})),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("strong",{parentName:"li"},"total")," balance indicates the total number of tokens in the account. Note that this number\ndoes not necessarily correspond to the tokens you are allowed to transfer. In the example the\ntotal number of tokens in 0.6274 KSM. The ",(0,r.kt)("strong",{parentName:"li"},"transferrable")," balance indicates the number of tokens\nthat are free to be transferred. This is calculated by subtracting the number of ",(0,r.kt)("em",{parentName:"li"},"locked")," and\n",(0,r.kt)("em",{parentName:"li"},"reserved")," tokens from the total number of tokens. Locked funds correspond to tokens used in\nstaking, governance, and vested transfers (see below). In the example, the transferrable balance\nis 0.0106 KSM."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("strong",{parentName:"li"},"vested")," balance indicates tokens that were sent to the account and that are released with a\nspecific time schedule. The tokens are owned by the account but are ",(0,r.kt)("em",{parentName:"li"},"locked")," and become available\nfor transfer after a specific number of blocks. In the example, the vested balance is 0.25 KSM."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("strong",{parentName:"li"},"bonded")," balance indicates the number of tokens that are ",(0,r.kt)("em",{parentName:"li"},"locked")," for on-chain participation\nto staking. In the example the bonded balance is 0.4 KSM."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("strong",{parentName:"li"},"democracy")," balance indicates the number of tokens that are ",(0,r.kt)("em",{parentName:"li"},"locked")," for on-chain\nparticipation to democracy (i.e. voting for referenda and council). In the example, the democracy\nbalance is 0.4 KSM."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("strong",{parentName:"li"},"redeemable")," balance indicates the number of tokens that are ready to be unlocked to become\ntransferrable again. Those tokens already went through the unbonding period. In this case, the\nredeemable balance is 0.1 KSM."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("strong",{parentName:"li"},"locked")," balance indicates the number of tokens that are frozen for on-chain participation\nto staking and democracy, or for vested transfers. ",(0,r.kt)("strong",{parentName:"li"},"Locks do not stack"),", which means that if you\nhave different locks the total locked balance is not the addition of all single locks. Instead,\n",(0,r.kt)("strong",{parentName:"li"},"the biggest lock decides the total locked balance"),". In the example, the locked balance is 0.55\nKSM because the biggest lock is on democracy (0.55 KSM)."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("strong",{parentName:"li"},"reserved"),' balance indicates the number of tokens that are frozen for on-chain activity\nother than staking, governance, and vested transfers. Such activity can be setting an identity or\na proxy. Reserved funds are held due to on-chain requirements and can usually be freed by taking\nsome on-chain action. For example, the "Identity" pallet reserves funds while an on-chain identity\nis registered, but by clearing the identity, you can unreserve the funds and make them free again.\nThe same applies to proxies. The idea is that those actions require some network memory usage that\nis not given for free. In the example we created a governance proxy and the reserved funds for\nthis are 0.0668 KSM.')),(0,r.kt)("h3",{id:"query-account-data-in-polkadot-js"},"Query Account Data in Polkadot-JS"),(0,r.kt)("p",null,"In the Polkadot-JS UI, you can also query account data under\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate"},"Developer > Chain state"),". Under ",(0,r.kt)("inlineCode",{parentName:"p"},"selected state query"),"\nchoose the system pallet followed by ",(0,r.kt)("inlineCode",{parentName:"p"},"account(AccountId32): FrameSystemAccountInfo"),", under ",(0,r.kt)("inlineCode",{parentName:"p"},"Option"),'\nchoose an account, and then click on the "+" button on the right.'),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"account_balance_types",src:a(9853).Z,width:"1636",height:"343"})),(0,r.kt)("p",null,"Account information include:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"nonce"),", the number of transactions the account sent."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"consumers"),", the number of other modules that currently depend on this account's existence. The\naccount cannot be reaped until this is zero."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"providers"),", the number of other modules that allow this account to exist. The account may not be\nreaped until this and ",(0,r.kt)("inlineCode",{parentName:"li"},"sufficients")," are both zero."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"sufficients"),", the number of modules that allow this account to exist for their own purposes. The\naccount may not be reaped until this and ",(0,r.kt)("inlineCode",{parentName:"li"},"providers")," are both zero."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"data"),", the additional data that belongs to this account. Used to store the balance(s) in a lot of\nchains.")),(0,r.kt)("p",null,"More in-depth information about the above data can be found in the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/2e7fde832b77b242269b136f1c3b6fffef86f9b6/frame/system/src/lib.rs#LL767C1-L781C24"},"substrate code base"),"."),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"AccountData")," structure defines the balance types in Substrate. The three types of balances\ninclude ",(0,r.kt)("inlineCode",{parentName:"p"},"free"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"reserved"),", and ",(0,r.kt)("inlineCode",{parentName:"p"},"frozen"),". The ",(0,r.kt)("strong",{parentName:"p"},"usable")," balance of the account is the amount that\nis ",(0,r.kt)("inlineCode",{parentName:"p"},"free")," minus any funds considered ",(0,r.kt)("inlineCode",{parentName:"p"},"frozen"),", while the ",(0,r.kt)("strong",{parentName:"p"},"total")," balance of the account is the sum\nof ",(0,r.kt)("inlineCode",{parentName:"p"},"free")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"reserved")," funds. The ",(0,r.kt)("inlineCode",{parentName:"p"},"flags")," describe extra information about the account."),(0,r.kt)("p",null,"More in-depth information about the above data can be found in the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/2e7fde832b77b242269b136f1c3b6fffef86f9b6/frame/balances/src/types.rs#LL95-L114"},"balances pallet in the Substrate code base"),"."),(0,r.kt)("h3",{id:"unlocking-locks"},"Unlocking Locks"),(0,r.kt)("admonition",{title:"Locks do not stack!",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The biggest lock decides the total amount of locked funds. See\n",(0,r.kt)("a",{parentName:"p",href:"https://youtu.be/LHgY7ds_bZ0"},(0,r.kt)("strong",{parentName:"a"},"this walk-through video tutorial"))," that will guide you in the\nprocess of unlocking funds in the example above.")),(0,r.kt)("p",null,"In the example, we mentioned that the locked balance is 0.55 KSM because the biggest lock is on\ndemocracy and is 0.55 KSM. As soon as the democracy lock is removed the next biggest lock is on\nstaking 0.5 KSM (bonded 0.4 KSM + redeemable 0.1 KSM). This means that the locked balance will be\n0.5 KSM, and 0.05 KSM will be added to the transferrable balance. After redeeming the unbonded 0.1\nKSM, the locked balance will be 0.4 KSM, and an additional 0.1 KSM will be added to the\ntransferrable balance. Now the biggest lock is still the bonded one. This means that even if we\nremove the vested lock, the locked balance will still be 0.4 KSM and no tokens will be added to the\ntransferrable balance. To free those bonded tokens we will need to unbond them and wait for the\nunbonding period to make them redeemable. If we remove the proxy the reserved funds will be\nautomatically added to the transferrable balance."),(0,r.kt)("h2",{id:"existential-deposit-and-reaping"},"Existential Deposit and Reaping"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"https://youtu.be/Wg0pH05CC9Y"},(0,r.kt)("strong",{parentName:"a"},"this video tutorial"))," or visit\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000168651-what-is-the-existential-deposit-"},(0,r.kt)("strong",{parentName:"a"},"this support page")),"\nfor more information about existential deposit.")),(0,r.kt)("p",null,"When you generate an account (address), you only generate a ",(0,r.kt)("em",{parentName:"p"},"key")," that lets you access it. The\naccount does not exist yet on-chain. For that, it needs the existential deposit of\n",(0,r.kt)(s.Z,{network:"polkadot",path:"consts.balances.existentialDeposit",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),".\n",""),(0,r.kt)("p",null,"Having an account go below the existential deposit causes that account to be ",(0,r.kt)("em",{parentName:"p"},"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."),(0,r.kt)("p",null,"Transaction fees cannot cause an account to be reaped. Since fees are deducted from the account\nbefore any other transaction logic, accounts with balances ",(0,r.kt)("em",{parentName:"p"},"equal to")," the existential deposit cannot\nconstruct a valid transaction. Additional funds will need to be added to cover the transaction fees."),(0,r.kt)("p",null,"Here's another way to think about existential deposits. Ever notice those ",(0,r.kt)("inlineCode",{parentName:"p"},"Thumbs.db")," files on\nWindows or ",(0,r.kt)("inlineCode",{parentName:"p"},".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 lose access to this folder forever -\nyou can always recreate it. You have the ",(0,r.kt)("em",{parentName:"p"},"key"),", after all - you're the computer's owner. It just\nmeans you want to keep your computer clean until you maybe end up needing this folder again and then\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."),(0,r.kt)("h2",{id:"account-identity"},"Account Identity"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/tree/master/frame/identity"},"Identities pallet")," built\ninto Polkadot allows users to attach on-chain\nmetadata to their accounts. Independent registrars can verify this metadata to provide\ntrustworthiness."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"To learn more about how to set or release an identity, how to define sub-accounts, or how to become\na registrar, please read ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-identity"},"this guide"),".")),(0,r.kt)("h2",{id:"proxy-accounts"},"Proxy Accounts"),(0,r.kt)("p",null,"Polkadot comes with a generalized proxy\naccount system that allows users to keep keys in cold storage while proxies act on their behalf with\nrestricted (or unrestricted) functionality."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See the ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-proxies"},"proxies")," page for more information about proxies.")),(0,r.kt)("h2",{id:"multi-signature-accounts"},"Multi-signature Accounts"),(0,r.kt)("p",null,"Multi-signature accounts are accounts created from several standard accounts, pure proxies, and even\nother multi-sig accounts."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See the ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-multisig"},"Multi-signature accounts page")," for a full explanation about\nmulti-signature accounts, including their use-cases.")),(0,r.kt)("h2",{id:"resources"},"Resources"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.crowdcast.io/e/polkadot-keys"},"Understanding Accounts and Keys in Polkadot")," - An\nexplanation of what the different kinds of accounts and keys are used for in Polkadot, with Bill\nLaboon and Chinmay Patel of BlockX Labs.")))}k.isMDXComponent=!0},9853:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/AccountData-struct-118d0bf533806084460cba05bef62b9c.png"},84241:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/account-balance-types-95095ee12fb785022e957c5ab975a776.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/c7c5ba1a.90ce391d.js b/assets/js/c7c5ba1a.90ce391d.js new file mode 100644 index 000000000000..d1964809cfa3 --- /dev/null +++ b/assets/js/c7c5ba1a.90ce391d.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[6104],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>p});var n=a(74165),o=a(15861),r=a(67294),s=a(87152),i=a(17145),c=a(67425);function l(e,t,a){return d.apply(this,arguments)}function d(){return(d=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var r,c,l,d,u;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=void 0,c=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){e.next=18;break}return e.abrupt("return");case 18:return l=new s.U(r),e.next=21,i.G.create({provider:l});case 21:d=e.sent,(u=a.split(".")).forEach((function(e){e in d&&(d=d[e])})),e.t1=u[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return c=d.toString(),e.abrupt("break",35);case 29:return e.next=31,d();case 31:return c=(c=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+a);case 35:return e.abrupt("return",c);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function u(e,t,a,n){switch(t){case"humanReadable":(0,c.HumanReadable)(e,a,n);break;case"precise":(0,c.Precise)(e,a,n);break;case"blocksToDays":(0,c.BlocksToDays)(e,n);break;case"percentage":(0,c.Percentage)(e,n);break;case"permillToPercent":(0,c.PermillToPercent)(e,n);break;case"arrayLength":(0,c.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(e){var t=e.network,a=e.path,s=e.defaultValue,i=e.filter,c=void 0===i?void 0:i,d=(0,r.useState)(""),p=d[0],h=d[1];return t=t.toLowerCase(),(0,r.useEffect)((function(){void 0!==c?u(s.toString(),c,t,h):h(s.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,l(t,a,h);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==c?u(o,c,t,h):h(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{r()}catch(i){console.log(i)}}}),[]),p}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},63706:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>k,frontMatter:()=>c,metadata:()=>d,toc:()=>p});var n=a(87462),o=a(63366),r=(a(67294),a(3905)),s=a(47940),i=["components"],c={id:"learn-accounts",title:"Polkadot Accounts",sidebar_label:"Polkadot Accounts",description:"Polkadot Accounts, Account Identity, and Account Reaping.",keywords:["account","polkadot account","polkadotjs","indices","identity","reaping"],slug:"../learn-accounts"},l=void 0,d={unversionedId:"learn/learn-accounts",id:"learn/learn-accounts",title:"Polkadot Accounts",description:"Polkadot Accounts, Account Identity, and Account Reaping.",source:"@site/../docs/learn/learn-accounts.md",sourceDirName:"learn",slug:"/learn-accounts",permalink:"/docs/learn-accounts",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-accounts.md",tags:[],version:"current",lastUpdatedBy:"omahs",lastUpdatedAt:1695203423,formattedLastUpdatedAt:"Sep 20, 2023",frontMatter:{id:"learn-accounts",title:"Polkadot Accounts",sidebar_label:"Polkadot Accounts",description:"Polkadot Accounts, Account Identity, and Account Reaping.",keywords:["account","polkadot account","polkadotjs","indices","identity","reaping"],slug:"../learn-accounts"},sidebar:"docs",previous:{title:"Accounts",permalink:"/docs/learn-accounts-index"},next:{title:"Account Generation",permalink:"/docs/learn-account-generation"}},u={},p=[{value:"Account Address",id:"account-address",level:2},{value:"Mnemonic and Address Generation",id:"mnemonic-and-address-generation",level:3},{value:"Obtaining and Managing an Address",id:"obtaining-and-managing-an-address",level:3},{value:"Account Balance Types",id:"account-balance-types",level:2},{value:"Query Account Data in Polkadot-JS",id:"query-account-data-in-polkadot-js",level:3},{value:"Unlocking Locks",id:"unlocking-locks",level:3},{value:"Existential Deposit and Reaping",id:"existential-deposit-and-reaping",level:2},{value:"Account Identity",id:"account-identity",level:2},{value:"Proxy Accounts",id:"proxy-accounts",level:2},{value:"Multi-signature Accounts",id:"multi-signature-accounts",level:2},{value:"Resources",id:"resources",level:2}],h={toc:p},m="wrapper";function k(e){var t=e.components,c=(0,o.Z)(e,i);return(0,r.kt)(m,(0,n.Z)({},h,c,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"This document covers the basics of Polkadot\naccounts. See the ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced"},"Advanced Account")," page for more information about\naccounts such as ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced#derivation-paths"},"account derivation")," and\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced#indices"},"indices"),". For a more in-depth explanation of the cryptography\nbehind Polkadot accounts, please see\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"the cryptography page"),"."),(0,r.kt)("h2",{id:"account-address"},"Account Address"),(0,r.kt)("p",null,"An address is the public part of a Polkadot\naccount. The private part is the key used to access this address. The public and private parts\ntogether make up a Polkadot account. You can\nthink of the public address of your account like your mailbox and the private key like the key to\nopen that mailbox. Anybody can send mail to your mailbox, but only you can access them as only you\nhave access to its key. In the context of\nPolkadot accounts, anybody can send tokens to\nyour public address but only you can transact with them using your private key. That is why you\nshould keep your private key secret."),(0,r.kt)("h3",{id:"mnemonic-and-address-generation"},"Mnemonic and Address Generation"),(0,r.kt)("p",null,"A valid account requires a private key that can sign on to one of the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/build-protocol-info#cryptography"},"supported curves and signature schemes"),". Without a\nprivate key an account cannot sign anything. In\nPolkadot there are some exceptions of accounts\nthat do not have private keys (i.e. key-less accounts). Such accounts are\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-multisig"},"multi-signature accounts")," and\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-proxies-pure#anonymous-proxy-pure-proxy"},"anonymous proxies")," that are not discussed here\nand are meant for an advanced audience."),(0,r.kt)("p",null,"Most 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."),(0,r.kt)("admonition",{title:"Not all wallets use the same algorithm to convert from mnemonic phrase to private key",type:"danger"},(0,r.kt)("p",{parentName:"admonition"},(0,r.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/command-line-tools/subkey/"},"Subkey")," and Polkadot-JS based\nwallets use the BIP39 dictionary for mnemonic generation, but use the entropy byte array to generate\nthe private key, while full BIP39 wallets (like Ledger) use 2048 rounds of PBKDF2 on the mnemonic.\nThe same mnemonic may generate different private keys on other wallets due to the various\ncryptographic algorithms used. See\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate-bip39"},"Substrate BIP39 Repo")," for more information.")),(0,r.kt)("p",null,"A typical mnemonic phrase generated by\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.substrate.io/reference/command-line-tools/subkey/"},"the Subkey tool")," is shown below."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"'caution juice atom organ advance problem want pledge someone senior holiday very'\n")),(0,r.kt)("p",null,"Its corresponding ",(0,r.kt)("em",{parentName:"p"},"private/public keypair")," is also shown."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"Secret seed (Private key): 0x056a6a4e203766ffbea3146967ef25e9daf677b14dc6f6ed8919b1983c9bebbc\nPublic key (SS58): 5F3sa2TJAWMqDhXG6jhV4N8ko9SxwGy8TpaNS1repo5EYjQX\n")),(0,r.kt)("p",null,"Polkadot default address format is the ",(0,r.kt)("inlineCode",{parentName:"p"},"MultiAddress")," type. This means that the same mnemonic phrase\nwill generate public keys for different parachains. For more information see the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced#address-format"},"Address Format")," section on the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced"},"Advanced Account")," page."),(0,r.kt)("h3",{id:"obtaining-and-managing-an-address"},"Obtaining and Managing an Address"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"To learn more about generating accounts on\nPolkadot visit the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-generation"},"Account Generation page"),".")),(0,r.kt)("h2",{id:"account-balance-types"},"Account Balance Types"),(0,r.kt)("p",null,"In Polkadot there are different types of\nbalance depending on the account activity. Different balance types indicate whether your balance can\nbe used for transfers, to pay fees, or must remain frozen and unused due to an on-chain requirement.\nBelow is an example that displays different balance types of a Kusama account in the\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/accounts"},"Accounts tab of the Polkadot-JS UI")," (note that the balance\ntypes are the same for a Polkadot account)."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"account_balance_types",src:a(84241).Z,width:"1061",height:"291"})),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("strong",{parentName:"li"},"total")," balance indicates the total number of tokens in the account. Note that this number\ndoes not necessarily correspond to the tokens you are allowed to transfer. In the example the\ntotal number of tokens in 0.6274 KSM. The ",(0,r.kt)("strong",{parentName:"li"},"transferrable")," balance indicates the number of tokens\nthat are free to be transferred. This is calculated by subtracting the number of ",(0,r.kt)("em",{parentName:"li"},"locked")," and\n",(0,r.kt)("em",{parentName:"li"},"reserved")," tokens from the total number of tokens. Locked funds correspond to tokens used in\nstaking, governance, and vested transfers (see below). In the example, the transferrable balance\nis 0.0106 KSM."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("strong",{parentName:"li"},"vested")," balance indicates tokens that were sent to the account and that are released with a\nspecific time schedule. The tokens are owned by the account but are ",(0,r.kt)("em",{parentName:"li"},"locked")," and become available\nfor transfer after a specific number of blocks. In the example, the vested balance is 0.25 KSM."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("strong",{parentName:"li"},"bonded")," balance indicates the number of tokens that are ",(0,r.kt)("em",{parentName:"li"},"locked")," for on-chain participation\nto staking. In the example the bonded balance is 0.4 KSM."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("strong",{parentName:"li"},"democracy")," balance indicates the number of tokens that are ",(0,r.kt)("em",{parentName:"li"},"locked")," for on-chain\nparticipation to democracy (i.e. voting for referenda and council). In the example, the democracy\nbalance is 0.4 KSM."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("strong",{parentName:"li"},"redeemable")," balance indicates the number of tokens that are ready to be unlocked to become\ntransferrable again. Those tokens already went through the unbonding period. In this case, the\nredeemable balance is 0.1 KSM."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("strong",{parentName:"li"},"locked")," balance indicates the number of tokens that are frozen for on-chain participation\nto staking and democracy, or for vested transfers. ",(0,r.kt)("strong",{parentName:"li"},"Locks do not stack"),", which means that if you\nhave different locks the total locked balance is not the addition of all single locks. Instead,\n",(0,r.kt)("strong",{parentName:"li"},"the biggest lock decides the total locked balance"),". In the example, the locked balance is 0.55\nKSM because the biggest lock is on democracy (0.55 KSM)."),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("strong",{parentName:"li"},"reserved"),' balance indicates the number of tokens that are frozen for on-chain activity\nother than staking, governance, and vested transfers. Such activity can be setting an identity or\na proxy. Reserved funds are held due to on-chain requirements and can usually be freed by taking\nsome on-chain action. For example, the "Identity" pallet reserves funds while an on-chain identity\nis registered, but by clearing the identity, you can unreserve the funds and make them free again.\nThe same applies to proxies. The idea is that those actions require some network memory usage that\nis not given for free. In the example we created a governance proxy and the reserved funds for\nthis are 0.0668 KSM.')),(0,r.kt)("h3",{id:"query-account-data-in-polkadot-js"},"Query Account Data in Polkadot-JS"),(0,r.kt)("p",null,"In the Polkadot-JS UI, you can also query account data under\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate"},"Developer > Chain state"),". Under ",(0,r.kt)("inlineCode",{parentName:"p"},"selected state query"),"\nchoose the system pallet followed by ",(0,r.kt)("inlineCode",{parentName:"p"},"account(AccountId32): FrameSystemAccountInfo"),", under ",(0,r.kt)("inlineCode",{parentName:"p"},"Option"),'\nchoose an account, and then click on the "+" button on the right.'),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"account_balance_types",src:a(9853).Z,width:"1636",height:"343"})),(0,r.kt)("p",null,"Account information include:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"nonce"),", the number of transactions the account sent."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"consumers"),", the number of other modules that currently depend on this account's existence. The\naccount cannot be reaped until this is zero."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"providers"),", the number of other modules that allow this account to exist. The account may not be\nreaped until this and ",(0,r.kt)("inlineCode",{parentName:"li"},"sufficients")," are both zero."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"sufficients"),", the number of modules that allow this account to exist for their own purposes. The\naccount may not be reaped until this and ",(0,r.kt)("inlineCode",{parentName:"li"},"providers")," are both zero."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"data"),", the additional data that belongs to this account. Used to store the balance(s) in a lot of\nchains.")),(0,r.kt)("p",null,"More in-depth information about the above data can be found in the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/2e7fde832b77b242269b136f1c3b6fffef86f9b6/frame/system/src/lib.rs#LL767C1-L781C24"},"substrate code base"),"."),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"AccountData")," structure defines the balance types in Substrate. The three types of balances\ninclude ",(0,r.kt)("inlineCode",{parentName:"p"},"free"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"reserved"),", and ",(0,r.kt)("inlineCode",{parentName:"p"},"frozen"),". The ",(0,r.kt)("strong",{parentName:"p"},"usable")," balance of the account is the amount that\nis ",(0,r.kt)("inlineCode",{parentName:"p"},"free")," minus any funds considered ",(0,r.kt)("inlineCode",{parentName:"p"},"frozen"),", while the ",(0,r.kt)("strong",{parentName:"p"},"total")," balance of the account is the sum\nof ",(0,r.kt)("inlineCode",{parentName:"p"},"free")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"reserved")," funds. The ",(0,r.kt)("inlineCode",{parentName:"p"},"flags")," describe extra information about the account."),(0,r.kt)("p",null,"More in-depth information about the above data can be found in the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/2e7fde832b77b242269b136f1c3b6fffef86f9b6/frame/balances/src/types.rs#LL95-L114"},"balances pallet in the Substrate code base"),"."),(0,r.kt)("h3",{id:"unlocking-locks"},"Unlocking Locks"),(0,r.kt)("admonition",{title:"Locks do not stack!",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The biggest lock decides the total amount of locked funds. See\n",(0,r.kt)("a",{parentName:"p",href:"https://youtu.be/LHgY7ds_bZ0"},(0,r.kt)("strong",{parentName:"a"},"this walk-through video tutorial"))," that will guide you in the\nprocess of unlocking funds in the example above.")),(0,r.kt)("p",null,"In the example, we mentioned that the locked balance is 0.55 KSM because the biggest lock is on\ndemocracy and is 0.55 KSM. As soon as the democracy lock is removed the next biggest lock is on\nstaking 0.5 KSM (bonded 0.4 KSM + redeemable 0.1 KSM). This means that the locked balance will be\n0.5 KSM, and 0.05 KSM will be added to the transferrable balance. After redeeming the unbonded 0.1\nKSM, the locked balance will be 0.4 KSM, and an additional 0.1 KSM will be added to the\ntransferrable balance. Now the biggest lock is still the bonded one. This means that even if we\nremove the vested lock, the locked balance will still be 0.4 KSM and no tokens will be added to the\ntransferrable balance. To free those bonded tokens we will need to unbond them and wait for the\nunbonding period to make them redeemable. If we remove the proxy the reserved funds will be\nautomatically added to the transferrable balance."),(0,r.kt)("h2",{id:"existential-deposit-and-reaping"},"Existential Deposit and Reaping"),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"https://youtu.be/Wg0pH05CC9Y"},(0,r.kt)("strong",{parentName:"a"},"this video tutorial"))," or visit\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000168651-what-is-the-existential-deposit-"},(0,r.kt)("strong",{parentName:"a"},"this support page")),"\nfor more information about existential deposit.")),(0,r.kt)("p",null,"When you generate an account (address), you only generate a ",(0,r.kt)("em",{parentName:"p"},"key")," that lets you access it. The\naccount does not exist yet on-chain. For that, it needs the existential deposit of\n",(0,r.kt)(s.Z,{network:"polkadot",path:"consts.balances.existentialDeposit",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),".\n",""),(0,r.kt)("p",null,"Having an account go below the existential deposit causes that account to be ",(0,r.kt)("em",{parentName:"p"},"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."),(0,r.kt)("p",null,"Transaction fees cannot cause an account to be reaped. Since fees are deducted from the account\nbefore any other transaction logic, accounts with balances ",(0,r.kt)("em",{parentName:"p"},"equal to")," the existential deposit cannot\nconstruct a valid transaction. Additional funds will need to be added to cover the transaction fees."),(0,r.kt)("p",null,"Here's another way to think about existential deposits. Ever notice those ",(0,r.kt)("inlineCode",{parentName:"p"},"Thumbs.db")," files on\nWindows or ",(0,r.kt)("inlineCode",{parentName:"p"},".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 lose access to this folder forever -\nyou can always recreate it. You have the ",(0,r.kt)("em",{parentName:"p"},"key"),", after all - you're the computer's owner. It just\nmeans you want to keep your computer clean until you maybe end up needing this folder again and then\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."),(0,r.kt)("h2",{id:"account-identity"},"Account Identity"),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/tree/master/frame/identity"},"Identities pallet")," built\ninto Polkadot allows users to attach on-chain\nmetadata to their accounts. Independent registrars can verify this metadata to provide\ntrustworthiness."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"To learn more about how to set or release an identity, how to define sub-accounts, or how to become\na registrar, please read ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-identity"},"this guide"),".")),(0,r.kt)("h2",{id:"proxy-accounts"},"Proxy Accounts"),(0,r.kt)("p",null,"Polkadot comes with a generalized proxy\naccount system that allows users to keep keys in cold storage while proxies act on their behalf with\nrestricted (or unrestricted) functionality."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See the ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-proxies"},"proxies")," page for more information about proxies.")),(0,r.kt)("h2",{id:"multi-signature-accounts"},"Multi-signature Accounts"),(0,r.kt)("p",null,"Multi-signature accounts are accounts created from several standard accounts, pure proxies, and even\nother multi-sig accounts."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See the ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-multisig"},"Multi-signature accounts page")," for a full explanation about\nmulti-signature accounts, including their use-cases.")),(0,r.kt)("h2",{id:"resources"},"Resources"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.crowdcast.io/e/polkadot-keys"},"Understanding Accounts and Keys in Polkadot")," - An\nexplanation of what the different kinds of accounts and keys are used for in Polkadot, with Bill\nLaboon and Chinmay Patel of BlockX Labs.")))}k.isMDXComponent=!0},9853:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/AccountData-struct-118d0bf533806084460cba05bef62b9c.png"},84241:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/account-balance-types-95095ee12fb785022e957c5ab975a776.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/c91a9c06.99752c4c.js b/assets/js/c91a9c06.99752c4c.js deleted file mode 100644 index 05d6a5373369..000000000000 --- a/assets/js/c91a9c06.99752c4c.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[8355],{47940:(t,e,n)=>{"use strict";n.d(e,{Z:()=>c});var a=n(74165),i=n(15861),r=n(67294),o=n(87152),s=n(17145),l=n(67425);function d(t,e,n){return u.apply(this,arguments)}function u(){return(u=(0,i.Z)((0,a.Z)().mark((function t(e,n,i){var r,l,d,u,p;return(0,a.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:r=void 0,l=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){t.next=18;break}return t.abrupt("return");case 18:return d=new o.U(r),t.next=21,s.G.create({provider:d});case 21:u=t.sent,(p=n.split(".")).forEach((function(t){t in u&&(u=u[t])})),t.t1=p[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return l=u.toString(),t.abrupt("break",35);case 29:return t.next=31,u();case 31:return l=(l=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+p[0]+") in "+n);case 35:return t.abrupt("return",l);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function p(t,e,n,a){switch(e){case"humanReadable":(0,l.HumanReadable)(t,n,a);break;case"precise":(0,l.Precise)(t,n,a);break;case"blocksToDays":(0,l.BlocksToDays)(t,a);break;case"percentage":(0,l.Percentage)(t,a);break;case"arrayLength":(0,l.ArrayLength)(t,a);break;default:return void console.log("Ignoring unknown filter type")}}const c=function(t){var e=t.network,n=t.path,o=t.defaultValue,s=t.filter,l=void 0===s?void 0:s,u=(0,r.useState)(""),c=u[0],h=u[1];return e=e.toLowerCase(),(0,r.useEffect)((function(){void 0!==l?p(o.toString(),l,e,h):h(o.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var t=(0,i.Z)((0,a.Z)().mark((function t(){var i;return(0,a.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,d(e,n,h);case 2:if(void 0!==(i=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==l?p(i,l,e,h):h(i);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{r()}catch(s){console.log(s)}}}),[]),c}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,n,a){var i=void 0;if("polkadot"===n||"statemint"===n)i=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");i=6}t=parseFloat(t),a((t=Number.isInteger(t/e[n].precision)?t/e[n].precision+" "+e[n].symbol:(t/e[n].precision).toFixed(i)+" "+e[n].symbol).toString())},Precise:function(t,n,a){a(t=(t=parseFloat(t))/e[n].precision+" "+e[n].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},48693:(t,e,n)=>{"use strict";n.r(e),n.d(e,{assets:()=>p,contentTitle:()=>d,default:()=>k,frontMatter:()=>l,metadata:()=>u,toc:()=>c});var a=n(87462),i=n(63366),r=(n(67294),n(3905)),o=n(47940),s=["components"],l={id:"learn-identity",title:"Account Identity",sidebar_label:"Account Identity",description:"On-chain Identity, Judgements and Registrars.",keywords:["identity","registrars","judgements"],slug:"../learn-identity"},d=void 0,u={unversionedId:"learn/learn-identity",id:"learn/learn-identity",title:"Account Identity",description:"On-chain Identity, Judgements and Registrars.",source:"@site/../docs/learn/learn-identity.md",sourceDirName:"learn",slug:"/learn-identity",permalink:"/docs/learn-identity",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-identity.md",tags:[],version:"current",lastUpdatedBy:"Radha",lastUpdatedAt:1695298132,formattedLastUpdatedAt:"Sep 21, 2023",frontMatter:{id:"learn-identity",title:"Account Identity",sidebar_label:"Account Identity",description:"On-chain Identity, Judgements and Registrars.",keywords:["identity","registrars","judgements"],slug:"../learn-identity"},sidebar:"docs",previous:{title:"Account Abstraction",permalink:"/docs/learn-account-abstraction"},next:{title:"Multi-Signature Accounts",permalink:"/docs/learn-account-multisig"}},p={},c=[{value:"Setting an Identity",id:"setting-an-identity",level:2},{value:"Format Caveat",id:"format-caveat",level:3},{value:"Judgements",id:"judgements",level:2},{value:"Registrars",id:"registrars",level:2},{value:"Becoming a Registrar",id:"becoming-a-registrar",level:3},{value:"Current Registrars",id:"current-registrars",level:3},{value:"Sub Accounts",id:"sub-accounts",level:2},{value:"Clearing and Killing an Identity",id:"clearing-and-killing-an-identity",level:2}],h={toc:c},m="wrapper";function k(t){var e=t.components,l=(0,i.Z)(t,s);return(0,r.kt)(m,(0,a.Z)({},h,l,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Polkadot provides a naming system that allows\nparticipants to add personal information to their on-chain account and subsequently ask for\nverification of this information by ",(0,r.kt)("a",{parentName:"p",href:"#registrars"},"registrars"),"."),(0,r.kt)("h2",{id:"setting-an-identity"},"Setting an Identity"),(0,r.kt)("p",null,"Users 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 ",(0,r.kt)("a",{parentName:"p",href:"#judgements"},"Judgements"),")."),(0,r.kt)("p",null,"Users must reserve funds in a bond to store their information on chain:\n",(0,r.kt)(o.Z,{network:"polkadot",path:"consts.identity.basicDeposit",defaultValue:20258e7,filter:"humanReadable",mdxType:"RPC"}),"\n","\nand\n",(0,r.kt)(o.Z,{network:"polkadot",path:"consts.identity.fieldDeposit",defaultValue:66e7,filter:"humanReadable",mdxType:"RPC"}),"\n","\nper each field beyond the legal name. These funds are ",(0,r.kt)("em",{parentName:"p"},"locked"),", not spent - they are returned when\nthe identity is cleared."),(0,r.kt)("p",null,"These amounts can also be extracted by querying constants through the\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate/constants"},"Chain state constants")," tab on Polkadot-JS\nApps."),(0,r.kt)("admonition",{title:"Instructions for setting and clearing Identities",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The procedure to set and clear identities is explained in detail in this support article -\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181981-how-to-set-and-clear-an-identity"},"How to set and clear an Identity"))),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"The Ledger app on ",(0,r.kt)("strong",{parentName:"p"},"Nano S")," doesn't support the extrinsic for setting identity. As a workaround,\ncreate a primary identity with an on-chain account and then using that primary identity, assign a\n",(0,r.kt)("a",{parentName:"p",href:"#sub-accounts"},"sub-identity")," to the Ledger stash.")),(0,r.kt)("h3",{id:"format-caveat"},"Format Caveat"),(0,r.kt)("p",null,"Please 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-JS UI 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."),(0,r.kt)("h2",{id:"judgements"},"Judgements"),(0,r.kt)("p",null,"After 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."),(0,r.kt)("p",null,"When a registrar provides judgement, they can select up to six levels of confidence in their\nattestation:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Unknown: The default value, no judgement made yet."),(0,r.kt)("li",{parentName:"ul"},"Reasonable: The data appears reasonable, but no in-depth checks (e.g. formal KYC process) were\nperformed (all the currently verified identities on-chain)."),(0,r.kt)("li",{parentName:"ul"},"Known Good: The registrar has certified that the information is correct (this step involves\nverification of state issued identity documents, and at the moment no account has known good\nidentity, with the exception of registrars)."),(0,r.kt)("li",{parentName:"ul"},"Out of Date: The information used to be good, but is now out of date."),(0,r.kt)("li",{parentName:"ul"},"Low Quality: The information is low quality or imprecise, but can be fixed with an update."),(0,r.kt)("li",{parentName:"ul"},"Erroneous: The information is erroneous and may indicate malicious intent.")),(0,r.kt)("p",null,'A seventh state, "fee paid", is for when a user has requested judgement and it is in progress.\nInformation that is in this state or "erroneous" is "sticky" and cannot be modified; it can only be\nremoved by the complete removal of the identity.'),(0,r.kt)("p",null,"Registrars gain trust by performing proper due diligence and would presumably be replaced for\nissuing faulty judgments."),(0,r.kt)("p",null,"To be judged after submitting your identity information, go to the\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/extrinsics"},"Extrinsics tab in the Polkadot-JS UI")," and select the\n",(0,r.kt)("inlineCode",{parentName:"p"},"identity")," pallet, then ",(0,r.kt)("inlineCode",{parentName:"p"},"requestJudgement"),". For the ",(0,r.kt)("inlineCode",{parentName:"p"},"reg_index")," put the index of the registrar you\nwant to be judged by, and for the ",(0,r.kt)("inlineCode",{parentName:"p"},"max_fee")," put the maximum you're willing to pay for these\nconfirmations."),(0,r.kt)("p",null,"If you don't know which registrar to pick, first check the available registrars by going to\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate"},"Chain State tab in the Polkadot-JS UI")," and selecting\n",(0,r.kt)("inlineCode",{parentName:"p"},"identity.registrars()")," to get the full list."),(0,r.kt)("admonition",{title:"Instructions for requesting and cancelling Identity judgments",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The procedure to request and cancel identity judgments is explained in detail in this\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181990-how-to-request-and-cancel-identity-judgement"},"support article"))),(0,r.kt)("admonition",{title:"Requesting judgement through Web3 Foundation Registrar If you requested judgement for your",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"on-chain identity through the Web3 Foundation Registrar (i.e. Registrar #0) you will need to\ncomplete a few additional tasks. For more information visit\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000179747-how-to-use-the-w3f-registrar-page"},"this support article"),".")),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"The set identity calls go on-chain. Hence, the contact information is available publicly, for both\nlegitimate entities, like registrars or validators, but also scammers who might impersonate them.\nThe strings in the identity fields are good candidates for homograph attacks, as someone could list\na fraudulent website (web3.f0undation instead of web3.foundation for example) and still get verified\nby the registrar (if the checks are automated)!"),(0,r.kt)("p",{parentName:"admonition"},"In a decentralized network, one should be cautious making transactions with accounts solely based on\ntheir identity. If an account on-chain claims to be of Web3 Foundation, it is wise to verify its\nauthenticity by checking directly with Web3 Foundation or examining the established history of that\naccount on-chain.")),(0,r.kt)("h2",{id:"registrars"},"Registrars"),(0,r.kt)("p",null,"Registrars can set a fee for their services and limit their attestation to certain fields. For\nexample, a registrar could charge 1 DOT to\nverify one's legal name, email, and GPG key. When a user requests judgement, they will pay this fee\nto the registrar who provides the judgement on those claims. Users set a maximum fee they are\nwilling to pay and only registrars below this amount would provide judgement."),(0,r.kt)("h3",{id:"becoming-a-registrar"},"Becoming a Registrar"),(0,r.kt)("admonition",{title:"Advanced How-to Guides",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-guides-identity#registrars"},"this page")," to learn how to become a Registrar.")),(0,r.kt)("h3",{id:"current-registrars"},"Current Registrars"),(0,r.kt)("p",null,"There are multiple registrars on Polkadot.\nUnless no additional information is available here, you must reach out to specific registrars\nindividually if you want to be judged by those."),(0,r.kt)("p",null,"Registrar 0: ",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"URL"),": ",(0,r.kt)("a",{parentName:"p",href:"https://registrar.web3.foundation/"},"https://registrar.web3.foundation/")," ",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"Account"),":\n12j3Cz8qskCGJxmSJpVL2z2t3Fpmw3KoBaBaRGPnuibFc7o8\n",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"Fee"),":\n0 DOT ",(0,r.kt)("br",null)),(0,r.kt)("p",null,"Registrar 1: ",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"URL"),": ",(0,r.kt)("a",{parentName:"p",href:"https://registrar.d11d.net/"},"https://registrar.d11d.net/")," ",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"Account"),":\n1Reg2TYv9rGfrQKpPREmrHRxrNsUDBQKzkYwP1UstD97wpJ\n",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"Fee"),":\n10 DOT ",(0,r.kt)("br",null)),(0,r.kt)("p",null,"Registrar 2: ",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"Account"),":\n1EpXirnoTimS1SWq52BeYx7sitsusXNGzMyGx8WPujPd1HB\n",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"Fee"),":\n0 DOT ",(0,r.kt)("br",null)),(0,r.kt)("p",null,"Registrar 3: ",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"Account"),":\n13SceNt2ELz3ti4rnQbY1snpYH4XE4fLFsW8ph9rpwJd6HFC\n",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"Fee"),":\n0 DOT ",(0,r.kt)("br",null)),(0,r.kt)("p",null,"","","","","",""),(0,r.kt)("p",null,"Polkassembly (Registrar 3) provides setting on-chain ID as a service on their ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/"},"website"),"."),(0,r.kt)("p",null,"To find out how to contact the registrar after the application for judgement or to learn who they\nare, we can check their identity by adding them to our Address Book. Their identity will be\nautomatically loaded."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Chevdor is registrar #1",src:n(65494).Z,width:"579",height:"217"})),(0,r.kt)("h2",{id:"sub-accounts"},"Sub Accounts"),(0,r.kt)("p",null,'Users 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 ',(0,r.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"Stash accounts")," of each of\ntheir validators."),(0,r.kt)("p",null,"An account can have a maximum of 100 sub-accounts. Note that a deposit of\n",(0,r.kt)(o.Z,{network:"polkadot",path:"consts.identity.subAccountDeposit",defaultValue:20053e7,filter:"humanReadable",mdxType:"RPC"}),"\n","\nis required for every sub-account."),(0,r.kt)("admonition",{title:"Explainer article and video on setting sub-identities",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Here is the\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181991-how-to-set-identities-for-sub-accounts"},"how to set sub-identities"),"\narticle and a ",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=0Yh1JYg3ZKU"},"video tutorial")," on setting\nsub-identities using Polkadot-JS UI")),(0,r.kt)("h2",{id:"clearing-and-killing-an-identity"},"Clearing and Killing an Identity"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Clearing:")," Users can clear their identity information and have their deposit returned. Clearing\nan identity also clears all sub accounts and returns their deposits."),(0,r.kt)("admonition",{title:'Visit the section "Clear an Identity" on',type:"info"},(0,r.kt)("p",{parentName:"admonition"},(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181981"},"this support article")," for\nguidelines about clearing identities.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Killing:")," The Council can kill an identity that it deems erroneous. This results in a slash of\nthe deposit."))}k.isMDXComponent=!0},65494:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});const a=n.p+"assets/images/16-95dc969648d23cdfdd68bf04135818bb.jpg"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/c91a9c06.d294be5a.js b/assets/js/c91a9c06.d294be5a.js new file mode 100644 index 000000000000..d7e7016cffa2 --- /dev/null +++ b/assets/js/c91a9c06.d294be5a.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[8355],{47940:(t,e,n)=>{"use strict";n.d(e,{Z:()=>p});var a=n(74165),i=n(15861),r=n(67294),o=n(87152),s=n(17145),l=n(67425);function d(t,e,n){return u.apply(this,arguments)}function u(){return(u=(0,i.Z)((0,a.Z)().mark((function t(e,n,i){var r,l,d,u,c;return(0,a.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:r=void 0,l=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){t.next=18;break}return t.abrupt("return");case 18:return d=new o.U(r),t.next=21,s.G.create({provider:d});case 21:u=t.sent,(c=n.split(".")).forEach((function(t){t in u&&(u=u[t])})),t.t1=c[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return l=u.toString(),t.abrupt("break",35);case 29:return t.next=31,u();case 31:return l=(l=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+n);case 35:return t.abrupt("return",l);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function c(t,e,n,a){switch(e){case"humanReadable":(0,l.HumanReadable)(t,n,a);break;case"precise":(0,l.Precise)(t,n,a);break;case"blocksToDays":(0,l.BlocksToDays)(t,a);break;case"percentage":(0,l.Percentage)(t,a);break;case"permillToPercent":(0,l.PermillToPercent)(t,a);break;case"arrayLength":(0,l.ArrayLength)(t,a);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(t){var e=t.network,n=t.path,o=t.defaultValue,s=t.filter,l=void 0===s?void 0:s,u=(0,r.useState)(""),p=u[0],h=u[1];return e=e.toLowerCase(),(0,r.useEffect)((function(){void 0!==l?c(o.toString(),l,e,h):h(o.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var t=(0,i.Z)((0,a.Z)().mark((function t(){var i;return(0,a.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,d(e,n,h);case 2:if(void 0!==(i=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==l?c(i,l,e,h):h(i);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{r()}catch(s){console.log(s)}}}),[]),p}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,n,a){var i=void 0;if("polkadot"===n||"statemint"===n)i=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");i=6}t=parseFloat(t),a((t=Number.isInteger(t/e[n].precision)?t/e[n].precision+" "+e[n].symbol:(t/e[n].precision).toFixed(i)+" "+e[n].symbol).toString())},Precise:function(t,n,a){a(t=(t=parseFloat(t))/e[n].precision+" "+e[n].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},PermillToPercent:function(t,e){e((t/=1e4).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},48693:(t,e,n)=>{"use strict";n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>d,default:()=>k,frontMatter:()=>l,metadata:()=>u,toc:()=>p});var a=n(87462),i=n(63366),r=(n(67294),n(3905)),o=n(47940),s=["components"],l={id:"learn-identity",title:"Account Identity",sidebar_label:"Account Identity",description:"On-chain Identity, Judgements and Registrars.",keywords:["identity","registrars","judgements"],slug:"../learn-identity"},d=void 0,u={unversionedId:"learn/learn-identity",id:"learn/learn-identity",title:"Account Identity",description:"On-chain Identity, Judgements and Registrars.",source:"@site/../docs/learn/learn-identity.md",sourceDirName:"learn",slug:"/learn-identity",permalink:"/docs/learn-identity",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-identity.md",tags:[],version:"current",lastUpdatedBy:"Radha",lastUpdatedAt:1695298132,formattedLastUpdatedAt:"Sep 21, 2023",frontMatter:{id:"learn-identity",title:"Account Identity",sidebar_label:"Account Identity",description:"On-chain Identity, Judgements and Registrars.",keywords:["identity","registrars","judgements"],slug:"../learn-identity"},sidebar:"docs",previous:{title:"Account Abstraction",permalink:"/docs/learn-account-abstraction"},next:{title:"Multi-Signature Accounts",permalink:"/docs/learn-account-multisig"}},c={},p=[{value:"Setting an Identity",id:"setting-an-identity",level:2},{value:"Format Caveat",id:"format-caveat",level:3},{value:"Judgements",id:"judgements",level:2},{value:"Registrars",id:"registrars",level:2},{value:"Becoming a Registrar",id:"becoming-a-registrar",level:3},{value:"Current Registrars",id:"current-registrars",level:3},{value:"Sub Accounts",id:"sub-accounts",level:2},{value:"Clearing and Killing an Identity",id:"clearing-and-killing-an-identity",level:2}],h={toc:p},m="wrapper";function k(t){var e=t.components,l=(0,i.Z)(t,s);return(0,r.kt)(m,(0,a.Z)({},h,l,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Polkadot provides a naming system that allows\nparticipants to add personal information to their on-chain account and subsequently ask for\nverification of this information by ",(0,r.kt)("a",{parentName:"p",href:"#registrars"},"registrars"),"."),(0,r.kt)("h2",{id:"setting-an-identity"},"Setting an Identity"),(0,r.kt)("p",null,"Users 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 ",(0,r.kt)("a",{parentName:"p",href:"#judgements"},"Judgements"),")."),(0,r.kt)("p",null,"Users must reserve funds in a bond to store their information on chain:\n",(0,r.kt)(o.Z,{network:"polkadot",path:"consts.identity.basicDeposit",defaultValue:20258e7,filter:"humanReadable",mdxType:"RPC"}),"\n","\nand\n",(0,r.kt)(o.Z,{network:"polkadot",path:"consts.identity.fieldDeposit",defaultValue:66e7,filter:"humanReadable",mdxType:"RPC"}),"\n","\nper each field beyond the legal name. These funds are ",(0,r.kt)("em",{parentName:"p"},"locked"),", not spent - they are returned when\nthe identity is cleared."),(0,r.kt)("p",null,"These amounts can also be extracted by querying constants through the\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate/constants"},"Chain state constants")," tab on Polkadot-JS\nApps."),(0,r.kt)("admonition",{title:"Instructions for setting and clearing Identities",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The procedure to set and clear identities is explained in detail in this support article -\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181981-how-to-set-and-clear-an-identity"},"How to set and clear an Identity"))),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"The Ledger app on ",(0,r.kt)("strong",{parentName:"p"},"Nano S")," doesn't support the extrinsic for setting identity. As a workaround,\ncreate a primary identity with an on-chain account and then using that primary identity, assign a\n",(0,r.kt)("a",{parentName:"p",href:"#sub-accounts"},"sub-identity")," to the Ledger stash.")),(0,r.kt)("h3",{id:"format-caveat"},"Format Caveat"),(0,r.kt)("p",null,"Please 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-JS UI 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."),(0,r.kt)("h2",{id:"judgements"},"Judgements"),(0,r.kt)("p",null,"After 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."),(0,r.kt)("p",null,"When a registrar provides judgement, they can select up to six levels of confidence in their\nattestation:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Unknown: The default value, no judgement made yet."),(0,r.kt)("li",{parentName:"ul"},"Reasonable: The data appears reasonable, but no in-depth checks (e.g. formal KYC process) were\nperformed (all the currently verified identities on-chain)."),(0,r.kt)("li",{parentName:"ul"},"Known Good: The registrar has certified that the information is correct (this step involves\nverification of state issued identity documents, and at the moment no account has known good\nidentity, with the exception of registrars)."),(0,r.kt)("li",{parentName:"ul"},"Out of Date: The information used to be good, but is now out of date."),(0,r.kt)("li",{parentName:"ul"},"Low Quality: The information is low quality or imprecise, but can be fixed with an update."),(0,r.kt)("li",{parentName:"ul"},"Erroneous: The information is erroneous and may indicate malicious intent.")),(0,r.kt)("p",null,'A seventh state, "fee paid", is for when a user has requested judgement and it is in progress.\nInformation that is in this state or "erroneous" is "sticky" and cannot be modified; it can only be\nremoved by the complete removal of the identity.'),(0,r.kt)("p",null,"Registrars gain trust by performing proper due diligence and would presumably be replaced for\nissuing faulty judgments."),(0,r.kt)("p",null,"To be judged after submitting your identity information, go to the\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/extrinsics"},"Extrinsics tab in the Polkadot-JS UI")," and select the\n",(0,r.kt)("inlineCode",{parentName:"p"},"identity")," pallet, then ",(0,r.kt)("inlineCode",{parentName:"p"},"requestJudgement"),". For the ",(0,r.kt)("inlineCode",{parentName:"p"},"reg_index")," put the index of the registrar you\nwant to be judged by, and for the ",(0,r.kt)("inlineCode",{parentName:"p"},"max_fee")," put the maximum you're willing to pay for these\nconfirmations."),(0,r.kt)("p",null,"If you don't know which registrar to pick, first check the available registrars by going to\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate"},"Chain State tab in the Polkadot-JS UI")," and selecting\n",(0,r.kt)("inlineCode",{parentName:"p"},"identity.registrars()")," to get the full list."),(0,r.kt)("admonition",{title:"Instructions for requesting and cancelling Identity judgments",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The procedure to request and cancel identity judgments is explained in detail in this\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181990-how-to-request-and-cancel-identity-judgement"},"support article"))),(0,r.kt)("admonition",{title:"Requesting judgement through Web3 Foundation Registrar If you requested judgement for your",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"on-chain identity through the Web3 Foundation Registrar (i.e. Registrar #0) you will need to\ncomplete a few additional tasks. For more information visit\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000179747-how-to-use-the-w3f-registrar-page"},"this support article"),".")),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"The set identity calls go on-chain. Hence, the contact information is available publicly, for both\nlegitimate entities, like registrars or validators, but also scammers who might impersonate them.\nThe strings in the identity fields are good candidates for homograph attacks, as someone could list\na fraudulent website (web3.f0undation instead of web3.foundation for example) and still get verified\nby the registrar (if the checks are automated)!"),(0,r.kt)("p",{parentName:"admonition"},"In a decentralized network, one should be cautious making transactions with accounts solely based on\ntheir identity. If an account on-chain claims to be of Web3 Foundation, it is wise to verify its\nauthenticity by checking directly with Web3 Foundation or examining the established history of that\naccount on-chain.")),(0,r.kt)("h2",{id:"registrars"},"Registrars"),(0,r.kt)("p",null,"Registrars can set a fee for their services and limit their attestation to certain fields. For\nexample, a registrar could charge 1 DOT to\nverify one's legal name, email, and GPG key. When a user requests judgement, they will pay this fee\nto the registrar who provides the judgement on those claims. Users set a maximum fee they are\nwilling to pay and only registrars below this amount would provide judgement."),(0,r.kt)("h3",{id:"becoming-a-registrar"},"Becoming a Registrar"),(0,r.kt)("admonition",{title:"Advanced How-to Guides",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"See ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-guides-identity#registrars"},"this page")," to learn how to become a Registrar.")),(0,r.kt)("h3",{id:"current-registrars"},"Current Registrars"),(0,r.kt)("p",null,"There are multiple registrars on Polkadot.\nUnless no additional information is available here, you must reach out to specific registrars\nindividually if you want to be judged by those."),(0,r.kt)("p",null,"Registrar 0: ",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"URL"),": ",(0,r.kt)("a",{parentName:"p",href:"https://registrar.web3.foundation/"},"https://registrar.web3.foundation/")," ",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"Account"),":\n12j3Cz8qskCGJxmSJpVL2z2t3Fpmw3KoBaBaRGPnuibFc7o8\n",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"Fee"),":\n0 DOT ",(0,r.kt)("br",null)),(0,r.kt)("p",null,"Registrar 1: ",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"URL"),": ",(0,r.kt)("a",{parentName:"p",href:"https://registrar.d11d.net/"},"https://registrar.d11d.net/")," ",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"Account"),":\n1Reg2TYv9rGfrQKpPREmrHRxrNsUDBQKzkYwP1UstD97wpJ\n",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"Fee"),":\n10 DOT ",(0,r.kt)("br",null)),(0,r.kt)("p",null,"Registrar 2: ",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"Account"),":\n1EpXirnoTimS1SWq52BeYx7sitsusXNGzMyGx8WPujPd1HB\n",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"Fee"),":\n0 DOT ",(0,r.kt)("br",null)),(0,r.kt)("p",null,"Registrar 3: ",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"Account"),":\n13SceNt2ELz3ti4rnQbY1snpYH4XE4fLFsW8ph9rpwJd6HFC\n",(0,r.kt)("br",null)," ",(0,r.kt)("strong",{parentName:"p"},"Fee"),":\n0 DOT ",(0,r.kt)("br",null)),(0,r.kt)("p",null,"","","","","",""),(0,r.kt)("p",null,"Polkassembly (Registrar 3) provides setting on-chain ID as a service on their ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/"},"website"),"."),(0,r.kt)("p",null,"To find out how to contact the registrar after the application for judgement or to learn who they\nare, we can check their identity by adding them to our Address Book. Their identity will be\nautomatically loaded."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Chevdor is registrar #1",src:n(65494).Z,width:"579",height:"217"})),(0,r.kt)("h2",{id:"sub-accounts"},"Sub Accounts"),(0,r.kt)("p",null,'Users 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 ',(0,r.kt)("a",{parentName:"p",href:"/docs/learn-cryptography"},"Stash accounts")," of each of\ntheir validators."),(0,r.kt)("p",null,"An account can have a maximum of 100 sub-accounts. Note that a deposit of\n",(0,r.kt)(o.Z,{network:"polkadot",path:"consts.identity.subAccountDeposit",defaultValue:20053e7,filter:"humanReadable",mdxType:"RPC"}),"\n","\nis required for every sub-account."),(0,r.kt)("admonition",{title:"Explainer article and video on setting sub-identities",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Here is the\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181991-how-to-set-identities-for-sub-accounts"},"how to set sub-identities"),"\narticle and a ",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=0Yh1JYg3ZKU"},"video tutorial")," on setting\nsub-identities using Polkadot-JS UI")),(0,r.kt)("h2",{id:"clearing-and-killing-an-identity"},"Clearing and Killing an Identity"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Clearing:")," Users can clear their identity information and have their deposit returned. Clearing\nan identity also clears all sub accounts and returns their deposits."),(0,r.kt)("admonition",{title:'Visit the section "Clear an Identity" on',type:"info"},(0,r.kt)("p",{parentName:"admonition"},(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181981"},"this support article")," for\nguidelines about clearing identities.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Killing:")," The Council can kill an identity that it deems erroneous. This results in a slash of\nthe deposit."))}k.isMDXComponent=!0},65494:(t,e,n)=>{"use strict";n.d(e,{Z:()=>a});const a=n.p+"assets/images/16-95dc969648d23cdfdd68bf04135818bb.jpg"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/c977dfe8.2aa71482.js b/assets/js/c977dfe8.2aa71482.js new file mode 100644 index 000000000000..81e63f856cf2 --- /dev/null +++ b/assets/js/c977dfe8.2aa71482.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[1506],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>d});var n=a(74165),o=a(15861),s=a(67294),r=a(87152),i=a(17145),l=a(67425);function p(e,t,a){return c.apply(this,arguments)}function c(){return(c=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var s,l,p,c,u;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:s=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return s="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return s="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return s="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return s="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==s){e.next=18;break}return e.abrupt("return");case 18:return p=new r.U(s),e.next=21,i.G.create({provider:p});case 21:c=e.sent,(u=a.split(".")).forEach((function(e){e in c&&(c=c[e])})),e.t1=u[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=c.toString(),e.abrupt("break",35);case 29:return e.next=31,c();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function u(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"permillToPercent":(0,l.PermillToPercent)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const d=function(e){var t=e.network,a=e.path,r=e.defaultValue,i=e.filter,l=void 0===i?void 0:i,c=(0,s.useState)(""),d=c[0],h=c[1];return t=t.toLowerCase(),(0,s.useEffect)((function(){void 0!==l?u(r.toString(),l,t,h):h(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var s=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p(t,a,h);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?u(o,l,t,h):h(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{s()}catch(i){console.log(i)}}}),[]),d}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},38948:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>k,frontMatter:()=>i,metadata:()=>p,toc:()=>u});var n=a(87462),o=a(63366),s=(a(67294),a(3905)),r=(a(47940),["components"]),i={id:"learn-teleport",title:"Teleporting Assets",sidebar_label:"Teleporting Assets",description:"Teleport Assets between Parachains and Relay Chain.",keywords:["teleport","assets","transfer"],slug:"../learn-teleport"},l=void 0,p={unversionedId:"learn/learn-teleport",id:"learn/learn-teleport",title:"Teleporting Assets",description:"Teleport Assets between Parachains and Relay Chain.",source:"@site/../docs/learn/learn-teleport.md",sourceDirName:"learn",slug:"/learn-teleport",permalink:"/docs/learn-teleport",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-teleport.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1688135081,formattedLastUpdatedAt:"Jun 30, 2023",frontMatter:{id:"learn-teleport",title:"Teleporting Assets",sidebar_label:"Teleporting Assets",description:"Teleport Assets between Parachains and Relay Chain.",keywords:["teleport","assets","transfer"],slug:"../learn-teleport"},sidebar:"docs",previous:{title:"Token Inflation",permalink:"/docs/learn-inflation"},next:{title:"NFTs",permalink:"/docs/learn-nft-index"}},c={},u=[{value:"How Teleports work",id:"how-teleports-work",level:2},{value:"Initiate Teleport",id:"initiate-teleport",level:3},{value:"Receive Teleported Assets",id:"receive-teleported-assets",level:3},{value:"Deposit Asset",id:"deposit-asset",level:3},{value:"Teleporting Tokens using the Polkadot-JS UI",id:"teleporting-tokens-using-the-polkadot-js-ui",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2}],d={toc:u},h="wrapper";function k(e){var t=e.components,i=(0,o.Z)(e,r);return(0,s.kt)(h,(0,n.Z)({},d,i,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("p",null,"One of the main properties that Polkadot and Kusama bring to the ecosystems is decentralized\nblockchain interoperability. This interoperability allows for asset teleportation: the process of\nmoving assets, such as coins, tokens, or NFTs, between chains (parachains) to use them as you would\nany other asset native to that chain. Interoperability is possible through ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-xcm"},"XCM")," and\n",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-spree"},"SPREE modules"),", which together ensure that assets are not lost or duplicated across\nmultiple chain."),(0,s.kt)("admonition",{title:"Walk-through video tutorial about teleporting assets",type:"info"},(0,s.kt)("p",{parentName:"admonition"},"See ",(0,s.kt)("a",{parentName:"p",href:"https://youtu.be/3tE9ouub5Tg"},"this technical explainer video")," to learn how to teleport assets\nfrom Kusama to the Asset Hub. The same procedure applies to teleporting between Polkadot and the\nPolkadot Asset Hub, or between any other parachain.")),(0,s.kt)("h2",{id:"how-teleports-work"},"How Teleports work"),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"teleport",src:a(16176).Z,width:"1397",height:"611"})),(0,s.kt)("p",null,"As you can see from the diagram above, there are only 2 actors within this model: the source and the\ndestination. The way in which we transfer assets between the source and the destination are briefly\nsummarized in the numbered labels on the diagram, and are explained in more detail below:"),(0,s.kt)("h3",{id:"initiate-teleport"},"Initiate Teleport"),(0,s.kt)("p",null,"The source gathers the assets to be teleported from the sending account and ",(0,s.kt)("strong",{parentName:"p"},"takes them out")," from\nthe circulating supply, taking note of the total amount of assets that was taken out."),(0,s.kt)("h3",{id:"receive-teleported-assets"},"Receive Teleported Assets"),(0,s.kt)("p",null,"The source then creates an ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-xcm"},"XCM")," instruction called ",(0,s.kt)("inlineCode",{parentName:"p"},"ReceiveTeleportedAssets"),"\ncontaining as parameters a) the receiving account and b) the amount of assets taken out from\ncirculation. It then sends this instruction over to the destination, where it gets processed and new\nassets are ",(0,s.kt)("strong",{parentName:"p"},"put back into")," the circulating supply."),(0,s.kt)("h3",{id:"deposit-asset"},"Deposit Asset"),(0,s.kt)("p",null,"The destination deposits the assets to the receiving account. The actions of ",(0,s.kt)("strong",{parentName:"p"},"taking out")," from the\ncirculating supply and ",(0,s.kt)("strong",{parentName:"p"},"putting back")," into the circulating supply show the great flexibility that\nan ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-xcm"},"XCM")," executor has in regulating the flow of an asset without changing its\ncirculating supply. Assets are transferred to an inaccessible account in order to take them out 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."),(0,s.kt)("h2",{id:"teleporting-tokens-using-the-polkadot-js-ui"},"Teleporting Tokens using the Polkadot-JS UI"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://youtu.be/PGyDpH2kad8"},"Video tutorial on Teleporting")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000181119-how-to-teleport-dot-or-ksm-between-statemint-or-statemine"},"Additional support article"))),(0,s.kt)("h2",{id:"troubleshooting"},"Troubleshooting"),(0,s.kt)("p",null,'If you do not see "Accounts > Teleport" in ',"[Polkadot-JS UI]",", the source chain that you have selected\ndoes not support teleportation yet."))}k.isMDXComponent=!0},16176:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/teleport-asset-4f624ff92c1b79da7067a267f10abc95.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/c977dfe8.f0e953a9.js b/assets/js/c977dfe8.f0e953a9.js deleted file mode 100644 index 8162c7f00fe8..000000000000 --- a/assets/js/c977dfe8.f0e953a9.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[1506],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>d});var n=a(74165),o=a(15861),s=a(67294),r=a(87152),i=a(17145),l=a(67425);function p(e,t,a){return c.apply(this,arguments)}function c(){return(c=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var s,l,p,c,u;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:s=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return s="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return s="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return s="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return s="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==s){e.next=18;break}return e.abrupt("return");case 18:return p=new r.U(s),e.next=21,i.G.create({provider:p});case 21:c=e.sent,(u=a.split(".")).forEach((function(e){e in c&&(c=c[e])})),e.t1=u[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=c.toString(),e.abrupt("break",35);case 29:return e.next=31,c();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function u(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const d=function(e){var t=e.network,a=e.path,r=e.defaultValue,i=e.filter,l=void 0===i?void 0:i,c=(0,s.useState)(""),d=c[0],h=c[1];return t=t.toLowerCase(),(0,s.useEffect)((function(){void 0!==l?u(r.toString(),l,t,h):h(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var s=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p(t,a,h);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?u(o,l,t,h):h(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{s()}catch(i){console.log(i)}}}),[]),d}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},38948:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>l,default:()=>k,frontMatter:()=>i,metadata:()=>p,toc:()=>u});var n=a(87462),o=a(63366),s=(a(67294),a(3905)),r=(a(47940),["components"]),i={id:"learn-teleport",title:"Teleporting Assets",sidebar_label:"Teleporting Assets",description:"Teleport Assets between Parachains and Relay Chain.",keywords:["teleport","assets","transfer"],slug:"../learn-teleport"},l=void 0,p={unversionedId:"learn/learn-teleport",id:"learn/learn-teleport",title:"Teleporting Assets",description:"Teleport Assets between Parachains and Relay Chain.",source:"@site/../docs/learn/learn-teleport.md",sourceDirName:"learn",slug:"/learn-teleport",permalink:"/docs/learn-teleport",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-teleport.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1688135081,formattedLastUpdatedAt:"Jun 30, 2023",frontMatter:{id:"learn-teleport",title:"Teleporting Assets",sidebar_label:"Teleporting Assets",description:"Teleport Assets between Parachains and Relay Chain.",keywords:["teleport","assets","transfer"],slug:"../learn-teleport"},sidebar:"docs",previous:{title:"Token Inflation",permalink:"/docs/learn-inflation"},next:{title:"NFTs",permalink:"/docs/learn-nft-index"}},c={},u=[{value:"How Teleports work",id:"how-teleports-work",level:2},{value:"Initiate Teleport",id:"initiate-teleport",level:3},{value:"Receive Teleported Assets",id:"receive-teleported-assets",level:3},{value:"Deposit Asset",id:"deposit-asset",level:3},{value:"Teleporting Tokens using the Polkadot-JS UI",id:"teleporting-tokens-using-the-polkadot-js-ui",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2}],d={toc:u},h="wrapper";function k(e){var t=e.components,i=(0,o.Z)(e,r);return(0,s.kt)(h,(0,n.Z)({},d,i,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("p",null,"One of the main properties that Polkadot and Kusama bring to the ecosystems is decentralized\nblockchain interoperability. This interoperability allows for asset teleportation: the process of\nmoving assets, such as coins, tokens, or NFTs, between chains (parachains) to use them as you would\nany other asset native to that chain. Interoperability is possible through ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-xcm"},"XCM")," and\n",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-spree"},"SPREE modules"),", which together ensure that assets are not lost or duplicated across\nmultiple chain."),(0,s.kt)("admonition",{title:"Walk-through video tutorial about teleporting assets",type:"info"},(0,s.kt)("p",{parentName:"admonition"},"See ",(0,s.kt)("a",{parentName:"p",href:"https://youtu.be/3tE9ouub5Tg"},"this technical explainer video")," to learn how to teleport assets\nfrom Kusama to the Asset Hub. The same procedure applies to teleporting between Polkadot and the\nPolkadot Asset Hub, or between any other parachain.")),(0,s.kt)("h2",{id:"how-teleports-work"},"How Teleports work"),(0,s.kt)("p",null,(0,s.kt)("img",{alt:"teleport",src:a(16176).Z,width:"1397",height:"611"})),(0,s.kt)("p",null,"As you can see from the diagram above, there are only 2 actors within this model: the source and the\ndestination. The way in which we transfer assets between the source and the destination are briefly\nsummarized in the numbered labels on the diagram, and are explained in more detail below:"),(0,s.kt)("h3",{id:"initiate-teleport"},"Initiate Teleport"),(0,s.kt)("p",null,"The source gathers the assets to be teleported from the sending account and ",(0,s.kt)("strong",{parentName:"p"},"takes them out")," from\nthe circulating supply, taking note of the total amount of assets that was taken out."),(0,s.kt)("h3",{id:"receive-teleported-assets"},"Receive Teleported Assets"),(0,s.kt)("p",null,"The source then creates an ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-xcm"},"XCM")," instruction called ",(0,s.kt)("inlineCode",{parentName:"p"},"ReceiveTeleportedAssets"),"\ncontaining as parameters a) the receiving account and b) the amount of assets taken out from\ncirculation. It then sends this instruction over to the destination, where it gets processed and new\nassets are ",(0,s.kt)("strong",{parentName:"p"},"put back into")," the circulating supply."),(0,s.kt)("h3",{id:"deposit-asset"},"Deposit Asset"),(0,s.kt)("p",null,"The destination deposits the assets to the receiving account. The actions of ",(0,s.kt)("strong",{parentName:"p"},"taking out")," from the\ncirculating supply and ",(0,s.kt)("strong",{parentName:"p"},"putting back")," into the circulating supply show the great flexibility that\nan ",(0,s.kt)("a",{parentName:"p",href:"/docs/learn-xcm"},"XCM")," executor has in regulating the flow of an asset without changing its\ncirculating supply. Assets are transferred to an inaccessible account in order to take them out 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."),(0,s.kt)("h2",{id:"teleporting-tokens-using-the-polkadot-js-ui"},"Teleporting Tokens using the Polkadot-JS UI"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://youtu.be/PGyDpH2kad8"},"Video tutorial on Teleporting")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000181119-how-to-teleport-dot-or-ksm-between-statemint-or-statemine"},"Additional support article"))),(0,s.kt)("h2",{id:"troubleshooting"},"Troubleshooting"),(0,s.kt)("p",null,'If you do not see "Accounts > Teleport" in ',"[Polkadot-JS UI]",", the source chain that you have selected\ndoes not support teleportation yet."))}k.isMDXComponent=!0},16176:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/teleport-asset-4f624ff92c1b79da7067a267f10abc95.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/d3db551a.006cec14.js b/assets/js/d3db551a.006cec14.js new file mode 100644 index 000000000000..d06c39eea815 --- /dev/null +++ b/assets/js/d3db551a.006cec14.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[7485],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>h});var n=a(74165),o=a(15861),r=a(67294),i=a(87152),s=a(17145),l=a(67425);function p(e,t,a){return u.apply(this,arguments)}function u(){return(u=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var r,l,p,u,d;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){e.next=18;break}return e.abrupt("return");case 18:return p=new i.U(r),e.next=21,s.G.create({provider:p});case 21:u=e.sent,(d=a.split(".")).forEach((function(e){e in u&&(u=u[e])})),e.t1=d[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=u.toString(),e.abrupt("break",35);case 29:return e.next=31,u();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+d[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function d(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"permillToPercent":(0,l.PermillToPercent)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const h=function(e){var t=e.network,a=e.path,i=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,u=(0,r.useState)(""),h=u[0],c=u[1];return t=t.toLowerCase(),(0,r.useEffect)((function(){void 0!==l?d(i.toString(),l,t,c):c(i.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p(t,a,c);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?d(o,l,t,c):c(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{r()}catch(s){console.log(s)}}}),[]),h}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},67445:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>p,default:()=>f,frontMatter:()=>l,metadata:()=>u,toc:()=>h});var n=a(87462),o=a(63366),r=(a(67294),a(3905)),i=a(47940),s=["components"],l={id:"learn-treasury",title:"Governance v1 Treasury",sidebar_label:"Gov1 Treasury",description:"The Polkadot's On-chain Treasury during Gov1.",keywords:["treasury","funds","funding","tips","tipping"],slug:"../learn-treasury"},p=void 0,u={unversionedId:"learn/learn-treasury",id:"learn/learn-treasury",title:"Governance v1 Treasury",description:"The Polkadot's On-chain Treasury during Gov1.",source:"@site/../docs/learn/learn-treasury.md",sourceDirName:"learn",slug:"/learn-treasury",permalink:"/docs/learn-treasury",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-treasury.md",tags:[],version:"current",lastUpdatedBy:"Radha",lastUpdatedAt:1688717602,formattedLastUpdatedAt:"Jul 7, 2023",frontMatter:{id:"learn-treasury",title:"Governance v1 Treasury",sidebar_label:"Gov1 Treasury",description:"The Polkadot's On-chain Treasury during Gov1.",keywords:["treasury","funds","funding","tips","tipping"],slug:"../learn-treasury"},sidebar:"docs",previous:{title:"Governance V1",permalink:"/docs/learn-governance"},next:{title:"Polkadot Launch Phases",permalink:"/docs/learn-launch"}},d={},h=[{value:"Funding the Treasury",id:"funding-the-treasury",level:2},{value:"Tipping",id:"tipping",level:2},{value:"Example",id:"example",level:3},{value:"Bounties Spending",id:"bounties-spending",level:2},{value:"Creating a Bounty Proposal",id:"creating-a-bounty-proposal",level:3},{value:"Closing a bounty",id:"closing-a-bounty",level:3},{value:"FAQ",id:"faq",level:2},{value:"What prevents the Treasury from being captured by a majority of the Council?",id:"what-prevents-the-treasury-from-being-captured-by-a-majority-of-the-council",level:3},{value:"Further Reading",id:"further-reading",level:2}],c={toc:h},m="wrapper";function f(e){var t=e.components,a=(0,o.Z)(e,s);return(0,r.kt)(m,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("admonition",{title:"Use OpenGov to access treasury funds",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Governance v1 is deprecated. To access\nPolkadot treasury funds use\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov"},"OpenGov"),". For more information about OpenGov Treasury see the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov-treasury"},"dedicated wiki page"),".")),(0,r.kt)("p",null,"The Treasury is a pot of funds collected through a portion of block production rewards, transaction\nfees, slashing, ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-staking#inflation"},"staking inefficiencies"),", etc."),(0,r.kt)("p",null,"The Treasury funds are held in a ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced#system-accounts"},"system account")," not\naccessible by anyone; only the system internal logic can access it. Funds can be spent by making a\nspending proposal that, if approved by the ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#council"},"Council"),", will enter a\nwaiting period before distribution. This waiting period is known as the ",(0,r.kt)("em",{parentName:"p"},"spend period"),", and its\nduration is subject to ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance"},"governance"),", with the current default set to\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.treasury.spendPeriod",defaultValue:345600,filter:"blocksToDays",mdxType:"RPC"}),"\n","\ndays. The Treasury attempts to spend as many proposals in the queue as it can without running out of\nfunds."),(0,r.kt)("p",null,"Treasury payout is an automatic process:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"If the Treasury funds run out with approved proposals left to fund, those proposals are kept in\nthe approved queue, and will receive funding in the following spend period."),(0,r.kt)("li",{parentName:"ul"},"If the Treasury ends a spend period without spending all of its funds, it suffers a burn of a\npercentage of its funds - thereby causing deflationary pressure. This encourages the spending of\nthe funds in the Treasury by Polkadot's governance system.\nThis percentage is currently at 1% on Polkadot.\n","")),(0,r.kt)("p",null,"When a stakeholder wishes to propose a spend from the Treasury, they must reserve a deposit of at\nleast 5% of the proposed spend (see below for variations). This deposit will be slashed if the\nproposal is rejected, and returned if it is accepted."),(0,r.kt)("p",null,"Proposals may consist of (but are not limited to):"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Infrastructure deployment and continued operation."),(0,r.kt)("li",{parentName:"ul"},"Network security operations (monitoring services, continuous auditing)."),(0,r.kt)("li",{parentName:"ul"},"Ecosystem provisions (collaborations with friendly chains)."),(0,r.kt)("li",{parentName:"ul"},"Marketing activities (advertising, paid features, collaborations)."),(0,r.kt)("li",{parentName:"ul"},"Community events and outreach (meetups, pizza parties, hackerspaces)."),(0,r.kt)("li",{parentName:"ul"},"Software development (wallets and wallet integration, clients and client upgrades).")),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"learn-governance#council"},"Council")," governs the Treasury and how the funds are spent is up to\ntheir judgment."),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"The Council does not approve or deny Treasury Proposals based on the available funds. Proposals are\nnot approved just because there are funds ready to spend but are subject to a burn.")),(0,r.kt)("h2",{id:"funding-the-treasury"},"Funding the Treasury"),(0,r.kt)("p",null,"The Treasury is funded from different sources:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Slashing: When a validator is slashed for any reason, the slashed amount is sent to the Treasury\nwith a reward going to the entity that reported the validator (another validator). The reward is\ntaken from the slash amount and varies per offence and number of reporters."),(0,r.kt)("li",{parentName:"ol"},"Transaction fees: A portion of each block's transaction fees goes to the Treasury, with the\nremainder going to the block author."),(0,r.kt)("li",{parentName:"ol"},"Staking inefficiency: ",(0,r.kt)("a",{parentName:"li",href:"/docs/learn-staking#inflation"},"Inflation")," is designed to be 10% in the first\nyear, and the ideal staking ratio is set at 50%, meaning half of all tokens should be locked in\nstaking. Any deviation from this ratio will cause a proportional amount of the inflation to go to\nthe Treasury. In other words, if 50% of all tokens are staked, then 100% of the inflation goes to\nthe validators as reward. If the staking rate is greater than or less than 50%, then the\nvalidators will receive less, with the remainder going to the Treasury."),(0,r.kt)("li",{parentName:"ol"},"Parathreads: ",(0,r.kt)("a",{parentName:"li",href:"/docs/learn-parathreads"},"Parathreads")," participate in a per-block auction for block\ninclusion. Part of this bid goes to the validator that accepts the block and the remainder goes\nto the Treasury.")),(0,r.kt)("h2",{id:"tipping"},"Tipping"),(0,r.kt)("p",null,"Next to the proposals process, a separate system for making tips exists for the Treasury. Tips can\nbe suggested by anyone and are supported by members of the Council. Tips do not have any definite\nvalue, and the final value of the tip is decided based on the median of all tips issued by the\ntippers."),(0,r.kt)("p",null,"Currently, the tippers are the same as the members of the Council. However, being a tipper is not\nthe direct responsibility of the Council, and at some point the Council and the tippers may be\ndifferent groups of accounts."),(0,r.kt)("p",null,"A tip will enter a closing phase when more than a half plus one of the tipping group have endorsed a\ntip. During that time frame, the other members of the tipping group can still issue their tips, but\ndo not have to. Once the window closes, anyone can call the ",(0,r.kt)("inlineCode",{parentName:"p"},"close_tip")," extrinsic, and the tip will\nbe paid out."),(0,r.kt)("p",null,"There are two types of tips:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"public: A small bond is required to place them. This bond depends on the tip message length, and a\nfixed bond constant defined on chain, currently\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.tips.tipReportDepositBase",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),".\n","\nPublic tips carry a finder's fee of\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.tips.tipFindersFee",defaultValue:20,mdxType:"RPC"}),"%,\n","\nwhich is paid out from the total amount."),(0,r.kt)("li",{parentName:"ul"},"tipper-initiated: Tips that a Council member published, do not have a finder's fee or a bond.")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"For information about how to submit a tip from the Treasury you can read\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181971"},"this support article"),".")),(0,r.kt)("p",null,"To better understand the process a tip goes through until it is paid out, let's consider the example\nbelow."),(0,r.kt)("h3",{id:"example"},"Example"),(0,r.kt)("p",null,"Bob has done something great for Polkadot.\nAlice has noticed this and decides to report Bob as deserving a tip from the Treasury. The Council\nis composed of three members Charlie, Dave, and Eve."),(0,r.kt)("p",null,"Alice begins the process by issuing the ",(0,r.kt)("inlineCode",{parentName:"p"},"report_awesome")," extrinsic. This extrinsic requires two\narguments, a reason and the beneficiary. Alice submits Bob's address with the reason being a UTF-8\nencoded URL to a post on ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io"},"Polkassembly"),"\n"," that explains her reasoning for\nwhy Bob deserves the tip."),(0,r.kt)("p",null,"As mentioned above, Alice must also lock up a deposit for making this report. The deposit is the\nbase deposit as set in the chain's parameter list, plus the additional deposit per byte contained in\nthe reason. This is why Alice submitted a URL as the reason instead of the explanation directly: it\nwas cheaper for her to do so. For her trouble, Alice is able to claim the eventual finder's fee if\nthe tip is approved by the tippers."),(0,r.kt)("p",null,"Since the tipper group is the same as the Council, the Council must now collectively (but also\nindependently) decide on the value of the tip that Bob deserves. Charlie, Dave, and Eve all review\nthe report and make tips according to their personal valuation of the benefit Bob has provided to\nPolkadot. Charlie tips\n10 DOT, Dave tips\n30 DOT, and Eve tips\n100 DOT."),(0,r.kt)("p",null,"The tip could have been closed out with only two of the three tippers. Once more than half of the\ntippers group have issued tip valuations, the countdown to close the tip will begin. In this case,\nthe third tipper issued their tip before the end of the closing period, so all three were able to\nmake their tip valuations known."),(0,r.kt)("p",null,"The actual tip that will be paid out to Bob is the median of these tips, so Bob will be paid out\n30 DOT from the Treasury. In order for Bob to\nbe paid his tip, some account must call the ",(0,r.kt)("inlineCode",{parentName:"p"},"close_tip")," extrinsic at the end of the closing period\nfor the tip. This extrinsic may be called by anyone."),(0,r.kt)("h2",{id:"bounties-spending"},"Bounties Spending"),(0,r.kt)("p",null,"There are practical limits to Council Members curation capabilities when it comes to treasury\nproposals: Council members likely do not have the expertise to make a proper assessment of the\nactivities described in all proposals. Even if individual Councillors have that expertise, it is\nhighly unlikely that a majority of members are capable in such diverse topics."),(0,r.kt)("p",null,"Bounties Spending proposals aim to delegate the curation activity of spending proposals to experts\ncalled Curators: They can be defined as addresses with agency over a portion of the Treasury with\nthe goal of fixing a bug or vulnerability, developing a strategy, or monitoring a set of tasks\nrelated to a specific topic: all for the benefit of the\nPolkadot ecosystem."),(0,r.kt)("p",null,"A proposer can submit a bounty proposal for the Council to pass, with a curator to be defined later,\nwhose background and expertise is such that they are capable of determining when the task is\ncomplete. Curators are selected by the Council after the bounty proposal passes, and need to add an\nupfront payment to take the position. This deposit can be used to punish them if they act\nmaliciously. However, if they are successful in their task of getting someone to complete the bounty\nwork, they will receive their deposit back and part of the bounty reward."),(0,r.kt)("p",null,"When submitting the value of the bounty, the proposer includes a reward for curators willing to\ninvest their time and expertise in the task: this amount is included in the total value of the\nbounty. In this sense, the curator's fee can be defined as the result of subtracting the value paid\nto the bounty rewardee from the total value of the bounty."),(0,r.kt)("p",null,"In general terms, curators are expected to have a well-balanced track record related to the issues\nthe bounty tries to resolve: they should be at least knowledgeable on the topics the bounty touches,\nand show project management skills or experience. These recommendations ensure an effective use of\nthe mechanism. A Bounty Spending is a reward for a specified body of work - or specified set of\nobjectives - that needs to be executed for a predefined treasury amount to be paid out. The\nresponsibility of assigning a payout address once the specified set of objectives is completed is\ndelegated to the curator."),(0,r.kt)("p",null,"After the Council has activated a bounty, it delegates the work that requires expertise to the\ncurator who gets to close the active bounty. Closing the active bounty enacts a delayed payout to\nthe payout address and a payout of the curator fee. The delay phase allows the Council to act if any\nissues arise."),(0,r.kt)("p",null,"To 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 probably need to find an\noff-chain way to explain the proposal (any of the available community forums serve this purpose).\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.google.com/document/d/1-IBz_owspV5OcvezWXpksWDQReWowschD0TFuaVKKcU/edit?usp=sharing"},"This template"),"\ncan help as a checklist of all needed information for the Council to make an informed decision."),(0,r.kt)("p",null,"The bounty has a predetermined duration of 90 days with the possibility of being extended by the\ncurator. Aiming to maintain flexibility on the tasks\u2019 curation, the curator will be able to create\nsub-bounties for more granularity and allocation in the next iteration of the mechanism."),(0,r.kt)("h3",{id:"creating-a-bounty-proposal"},"Creating a Bounty Proposal"),(0,r.kt)("p",null,"Anyone can create a Bounty proposal using Polkadot-JS Apps: Users are able to submit a proposal on\nthe dedicated Bounty section under Governance. The development of a robust user interface to view\nand manage bounties in the Polkadot Apps is still under development and it will serve Council\nmembers, Curators and Beneficiaries of the bounties, as well as all users observing the on-chain\ntreasury governance. For now, the help of a Councillor is needed to open a bounty proposal as a\nmotion to be voted."),(0,r.kt)("p",null,"To submit a bounty, please visit ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps"},"Polkadot-JS Apps")," and click on the\ngovernance tab in the options bar on the top of the site. After, click on 'Bounties' and find the\nbutton '+ Add Bounty' on the upper-right side of the interface. Complete the bounty title, the\nrequested allocation (including curator's fee) and confirm the call."),(0,r.kt)("p",null,"After this, a Council member will need to assist you to pass the bounty proposal for vote as a\nmotion. You can contact the Council by joining the\nPolkadot Direction ",(0,r.kt)("a",{parentName:"p",href:"https://matrix.to/#/#Polkadot-Direction:parity.io"},"channel"),"\n"," in\nElement or joining our\nPolkadot Discord ",(0,r.kt)("a",{parentName:"p",href:"https://parity.link/polkadot-discord"},"server"),"\n"," and publishing a\nshort description of your bounty, with a link to one of the ",(0,r.kt)("a",{parentName:"p",href:"#announcing-the-proposal"},"forums")," for\ncontextual information."),(0,r.kt)("p",null,"A bounty can be cancelled by deleting the earmark for a specific treasury amount or be closed if the\ntasks have been completed. On the opposite side, the 90 days life of a bounty can be extended by\namending the expiry block number of the bounty to stay active."),(0,r.kt)("h3",{id:"closing-a-bounty"},"Closing a bounty"),(0,r.kt)("p",null,"The curator can close the bounty once they approve the completion of its tasks. The curator should\nmake sure to set up the payout address on the active bounty beforehand. Closing the Active bounty\nenacts a delayed payout to the payout address and a payout of the curator fee."),(0,r.kt)("p",null,"A bounty can be closed by using the extrinsics tab and selecting the Treasury pallet, then\n",(0,r.kt)("inlineCode",{parentName:"p"},"Award_bounty"),", making sure the right bounty is to be closed and finally sign the transaction. It is\nimportant to note that those who received a reward after the bounty is completed, must claim the\nspecific amount of the payout from the payout address, by calling ",(0,r.kt)("inlineCode",{parentName:"p"},"Claim_bounty")," after the curator\nclosed the allocation."),(0,r.kt)("p",null,"To understand more about Bounties and how this new mechanism works, read this\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.network/kusama-and-polkadot-now-reward-curators-helping-to-scale-councils-functions-join-the-force-moving-the-community-forward/"},"Polkadot Blog post"),"."),(0,r.kt)("h2",{id:"faq"},"FAQ"),(0,r.kt)("h3",{id:"what-prevents-the-treasury-from-being-captured-by-a-majority-of-the-council"},"What prevents the Treasury from being captured by a majority of the Council?"),(0,r.kt)("p",null,"The majority of the Council can decide the outcome of a treasury spend proposal. In an adversarial\nmindset, we may consider the possibility that the Council may at some point go rogue and attempt to\nsteal all of the treasury funds. It is a possibility that the treasury pot becomes so great, that a\nlarge financial incentive would present itself."),(0,r.kt)("p",null,"For one, the Treasury has deflationary pressure due to the burn that is suffered every spend period.\nThe burn aims to incentivize the complete spend of all treasury funds at every burn period, so\nideally the treasury pot doesn't have time to accumulate mass amounts of wealth. However, it is the\ncase that the burn on the Treasury could be so little that it does not matter - as is the case\ncurrently on Kusama with a 0.2% burn."),(0,r.kt)("p",null,"However, it is the case on Kusama that the Council is composed of mainly well-known members of the\ncommunity. Remember, the Council is voted in by the token holders, so they must do some campaigning\nor otherwise be recognized to earn votes. In the scenario of an attack, the Council members would\nlose their social credibility. Furthermore, members of the Council are usually externally motivated\nby the proper operation of the chain. This external motivation is either because they run businesses\nthat depend on the chain, or they have direct financial gain (through their holdings) of the token\nvalue remaining steady."),(0,r.kt)("p",null,"Concretely, there are a couple on-chain methods that resist this kind of attack. One, the Council\nmajority may not be the token majority of the chain. This means that the token majority could vote\nto replace the Council if they attempted this attack - or even reverse the treasury spend. They\nwould do this through a normal referendum. Two, there are time delays to treasury spends. They are\nonly enacted every spend period. This means that there will be some time to observe this attack is\ntaking place. The time delay then allows chain participants time to respond. The response may take\nthe form of governance measures or - in the most extreme cases a liquidation of their holdings and a\nmigration to a minority fork. However, the possibility of this scenario is quite low."),(0,r.kt)("h2",{id:"further-reading"},"Further Reading"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/master/frame/treasury/src/lib.rs"},"Substrate's Treasury Pallet"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_treasury/index.html"},"Documentation of the Rust implementation of the Treasury")))))}f.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/d3db551a.9eb5fd31.js b/assets/js/d3db551a.9eb5fd31.js deleted file mode 100644 index 4a4dd2dff8e2..000000000000 --- a/assets/js/d3db551a.9eb5fd31.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[7485],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>h});var n=a(74165),o=a(15861),r=a(67294),i=a(87152),s=a(17145),l=a(67425);function p(e,t,a){return u.apply(this,arguments)}function u(){return(u=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var r,l,p,u,d;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){e.next=18;break}return e.abrupt("return");case 18:return p=new i.U(r),e.next=21,s.G.create({provider:p});case 21:u=e.sent,(d=a.split(".")).forEach((function(e){e in u&&(u=u[e])})),e.t1=d[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=u.toString(),e.abrupt("break",35);case 29:return e.next=31,u();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+d[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function d(e,t,a,n){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,n);break;case"precise":(0,l.Precise)(e,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const h=function(e){var t=e.network,a=e.path,i=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,u=(0,r.useState)(""),h=u[0],c=u[1];return t=t.toLowerCase(),(0,r.useEffect)((function(){void 0!==l?d(i.toString(),l,t,c):c(i.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p(t,a,c);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?d(o,l,t,c):c(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{r()}catch(s){console.log(s)}}}),[]),h}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},67445:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>p,default:()=>f,frontMatter:()=>l,metadata:()=>u,toc:()=>h});var n=a(87462),o=a(63366),r=(a(67294),a(3905)),i=a(47940),s=["components"],l={id:"learn-treasury",title:"Governance v1 Treasury",sidebar_label:"Gov1 Treasury",description:"The Polkadot's On-chain Treasury during Gov1.",keywords:["treasury","funds","funding","tips","tipping"],slug:"../learn-treasury"},p=void 0,u={unversionedId:"learn/learn-treasury",id:"learn/learn-treasury",title:"Governance v1 Treasury",description:"The Polkadot's On-chain Treasury during Gov1.",source:"@site/../docs/learn/learn-treasury.md",sourceDirName:"learn",slug:"/learn-treasury",permalink:"/docs/learn-treasury",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-treasury.md",tags:[],version:"current",lastUpdatedBy:"Radha",lastUpdatedAt:1688717602,formattedLastUpdatedAt:"Jul 7, 2023",frontMatter:{id:"learn-treasury",title:"Governance v1 Treasury",sidebar_label:"Gov1 Treasury",description:"The Polkadot's On-chain Treasury during Gov1.",keywords:["treasury","funds","funding","tips","tipping"],slug:"../learn-treasury"},sidebar:"docs",previous:{title:"Governance V1",permalink:"/docs/learn-governance"},next:{title:"Polkadot Launch Phases",permalink:"/docs/learn-launch"}},d={},h=[{value:"Funding the Treasury",id:"funding-the-treasury",level:2},{value:"Tipping",id:"tipping",level:2},{value:"Example",id:"example",level:3},{value:"Bounties Spending",id:"bounties-spending",level:2},{value:"Creating a Bounty Proposal",id:"creating-a-bounty-proposal",level:3},{value:"Closing a bounty",id:"closing-a-bounty",level:3},{value:"FAQ",id:"faq",level:2},{value:"What prevents the Treasury from being captured by a majority of the Council?",id:"what-prevents-the-treasury-from-being-captured-by-a-majority-of-the-council",level:3},{value:"Further Reading",id:"further-reading",level:2}],c={toc:h},m="wrapper";function f(e){var t=e.components,a=(0,o.Z)(e,s);return(0,r.kt)(m,(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("admonition",{title:"Use OpenGov to access treasury funds",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Governance v1 is deprecated. To access\nPolkadot treasury funds use\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov"},"OpenGov"),". For more information about OpenGov Treasury see the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov-treasury"},"dedicated wiki page"),".")),(0,r.kt)("p",null,"The Treasury is a pot of funds collected through a portion of block production rewards, transaction\nfees, slashing, ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-staking#inflation"},"staking inefficiencies"),", etc."),(0,r.kt)("p",null,"The Treasury funds are held in a ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced#system-accounts"},"system account")," not\naccessible by anyone; only the system internal logic can access it. Funds can be spent by making a\nspending proposal that, if approved by the ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#council"},"Council"),", will enter a\nwaiting period before distribution. This waiting period is known as the ",(0,r.kt)("em",{parentName:"p"},"spend period"),", and its\nduration is subject to ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance"},"governance"),", with the current default set to\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.treasury.spendPeriod",defaultValue:345600,filter:"blocksToDays",mdxType:"RPC"}),"\n","\ndays. The Treasury attempts to spend as many proposals in the queue as it can without running out of\nfunds."),(0,r.kt)("p",null,"Treasury payout is an automatic process:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"If the Treasury funds run out with approved proposals left to fund, those proposals are kept in\nthe approved queue, and will receive funding in the following spend period."),(0,r.kt)("li",{parentName:"ul"},"If the Treasury ends a spend period without spending all of its funds, it suffers a burn of a\npercentage of its funds - thereby causing deflationary pressure. This encourages the spending of\nthe funds in the Treasury by Polkadot's governance system.\nThis percentage is currently at 1% on Polkadot.\n","")),(0,r.kt)("p",null,"When a stakeholder wishes to propose a spend from the Treasury, they must reserve a deposit of at\nleast 5% of the proposed spend (see below for variations). This deposit will be slashed if the\nproposal is rejected, and returned if it is accepted."),(0,r.kt)("p",null,"Proposals may consist of (but are not limited to):"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Infrastructure deployment and continued operation."),(0,r.kt)("li",{parentName:"ul"},"Network security operations (monitoring services, continuous auditing)."),(0,r.kt)("li",{parentName:"ul"},"Ecosystem provisions (collaborations with friendly chains)."),(0,r.kt)("li",{parentName:"ul"},"Marketing activities (advertising, paid features, collaborations)."),(0,r.kt)("li",{parentName:"ul"},"Community events and outreach (meetups, pizza parties, hackerspaces)."),(0,r.kt)("li",{parentName:"ul"},"Software development (wallets and wallet integration, clients and client upgrades).")),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"learn-governance#council"},"Council")," governs the Treasury and how the funds are spent is up to\ntheir judgment."),(0,r.kt)("admonition",{type:"caution"},(0,r.kt)("p",{parentName:"admonition"},"The Council does not approve or deny Treasury Proposals based on the available funds. Proposals are\nnot approved just because there are funds ready to spend but are subject to a burn.")),(0,r.kt)("h2",{id:"funding-the-treasury"},"Funding the Treasury"),(0,r.kt)("p",null,"The Treasury is funded from different sources:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Slashing: When a validator is slashed for any reason, the slashed amount is sent to the Treasury\nwith a reward going to the entity that reported the validator (another validator). The reward is\ntaken from the slash amount and varies per offence and number of reporters."),(0,r.kt)("li",{parentName:"ol"},"Transaction fees: A portion of each block's transaction fees goes to the Treasury, with the\nremainder going to the block author."),(0,r.kt)("li",{parentName:"ol"},"Staking inefficiency: ",(0,r.kt)("a",{parentName:"li",href:"/docs/learn-staking#inflation"},"Inflation")," is designed to be 10% in the first\nyear, and the ideal staking ratio is set at 50%, meaning half of all tokens should be locked in\nstaking. Any deviation from this ratio will cause a proportional amount of the inflation to go to\nthe Treasury. In other words, if 50% of all tokens are staked, then 100% of the inflation goes to\nthe validators as reward. If the staking rate is greater than or less than 50%, then the\nvalidators will receive less, with the remainder going to the Treasury."),(0,r.kt)("li",{parentName:"ol"},"Parathreads: ",(0,r.kt)("a",{parentName:"li",href:"/docs/learn-parathreads"},"Parathreads")," participate in a per-block auction for block\ninclusion. Part of this bid goes to the validator that accepts the block and the remainder goes\nto the Treasury.")),(0,r.kt)("h2",{id:"tipping"},"Tipping"),(0,r.kt)("p",null,"Next to the proposals process, a separate system for making tips exists for the Treasury. Tips can\nbe suggested by anyone and are supported by members of the Council. Tips do not have any definite\nvalue, and the final value of the tip is decided based on the median of all tips issued by the\ntippers."),(0,r.kt)("p",null,"Currently, the tippers are the same as the members of the Council. However, being a tipper is not\nthe direct responsibility of the Council, and at some point the Council and the tippers may be\ndifferent groups of accounts."),(0,r.kt)("p",null,"A tip will enter a closing phase when more than a half plus one of the tipping group have endorsed a\ntip. During that time frame, the other members of the tipping group can still issue their tips, but\ndo not have to. Once the window closes, anyone can call the ",(0,r.kt)("inlineCode",{parentName:"p"},"close_tip")," extrinsic, and the tip will\nbe paid out."),(0,r.kt)("p",null,"There are two types of tips:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"public: A small bond is required to place them. This bond depends on the tip message length, and a\nfixed bond constant defined on chain, currently\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.tips.tipReportDepositBase",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),".\n","\nPublic tips carry a finder's fee of\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.tips.tipFindersFee",defaultValue:20,mdxType:"RPC"}),"%,\n","\nwhich is paid out from the total amount."),(0,r.kt)("li",{parentName:"ul"},"tipper-initiated: Tips that a Council member published, do not have a finder's fee or a bond.")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"For information about how to submit a tip from the Treasury you can read\n",(0,r.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181971"},"this support article"),".")),(0,r.kt)("p",null,"To better understand the process a tip goes through until it is paid out, let's consider the example\nbelow."),(0,r.kt)("h3",{id:"example"},"Example"),(0,r.kt)("p",null,"Bob has done something great for Polkadot.\nAlice has noticed this and decides to report Bob as deserving a tip from the Treasury. The Council\nis composed of three members Charlie, Dave, and Eve."),(0,r.kt)("p",null,"Alice begins the process by issuing the ",(0,r.kt)("inlineCode",{parentName:"p"},"report_awesome")," extrinsic. This extrinsic requires two\narguments, a reason and the beneficiary. Alice submits Bob's address with the reason being a UTF-8\nencoded URL to a post on ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io"},"Polkassembly"),"\n"," that explains her reasoning for\nwhy Bob deserves the tip."),(0,r.kt)("p",null,"As mentioned above, Alice must also lock up a deposit for making this report. The deposit is the\nbase deposit as set in the chain's parameter list, plus the additional deposit per byte contained in\nthe reason. This is why Alice submitted a URL as the reason instead of the explanation directly: it\nwas cheaper for her to do so. For her trouble, Alice is able to claim the eventual finder's fee if\nthe tip is approved by the tippers."),(0,r.kt)("p",null,"Since the tipper group is the same as the Council, the Council must now collectively (but also\nindependently) decide on the value of the tip that Bob deserves. Charlie, Dave, and Eve all review\nthe report and make tips according to their personal valuation of the benefit Bob has provided to\nPolkadot. Charlie tips\n10 DOT, Dave tips\n30 DOT, and Eve tips\n100 DOT."),(0,r.kt)("p",null,"The tip could have been closed out with only two of the three tippers. Once more than half of the\ntippers group have issued tip valuations, the countdown to close the tip will begin. In this case,\nthe third tipper issued their tip before the end of the closing period, so all three were able to\nmake their tip valuations known."),(0,r.kt)("p",null,"The actual tip that will be paid out to Bob is the median of these tips, so Bob will be paid out\n30 DOT from the Treasury. In order for Bob to\nbe paid his tip, some account must call the ",(0,r.kt)("inlineCode",{parentName:"p"},"close_tip")," extrinsic at the end of the closing period\nfor the tip. This extrinsic may be called by anyone."),(0,r.kt)("h2",{id:"bounties-spending"},"Bounties Spending"),(0,r.kt)("p",null,"There are practical limits to Council Members curation capabilities when it comes to treasury\nproposals: Council members likely do not have the expertise to make a proper assessment of the\nactivities described in all proposals. Even if individual Councillors have that expertise, it is\nhighly unlikely that a majority of members are capable in such diverse topics."),(0,r.kt)("p",null,"Bounties Spending proposals aim to delegate the curation activity of spending proposals to experts\ncalled Curators: They can be defined as addresses with agency over a portion of the Treasury with\nthe goal of fixing a bug or vulnerability, developing a strategy, or monitoring a set of tasks\nrelated to a specific topic: all for the benefit of the\nPolkadot ecosystem."),(0,r.kt)("p",null,"A proposer can submit a bounty proposal for the Council to pass, with a curator to be defined later,\nwhose background and expertise is such that they are capable of determining when the task is\ncomplete. Curators are selected by the Council after the bounty proposal passes, and need to add an\nupfront payment to take the position. This deposit can be used to punish them if they act\nmaliciously. However, if they are successful in their task of getting someone to complete the bounty\nwork, they will receive their deposit back and part of the bounty reward."),(0,r.kt)("p",null,"When submitting the value of the bounty, the proposer includes a reward for curators willing to\ninvest their time and expertise in the task: this amount is included in the total value of the\nbounty. In this sense, the curator's fee can be defined as the result of subtracting the value paid\nto the bounty rewardee from the total value of the bounty."),(0,r.kt)("p",null,"In general terms, curators are expected to have a well-balanced track record related to the issues\nthe bounty tries to resolve: they should be at least knowledgeable on the topics the bounty touches,\nand show project management skills or experience. These recommendations ensure an effective use of\nthe mechanism. A Bounty Spending is a reward for a specified body of work - or specified set of\nobjectives - that needs to be executed for a predefined treasury amount to be paid out. The\nresponsibility of assigning a payout address once the specified set of objectives is completed is\ndelegated to the curator."),(0,r.kt)("p",null,"After the Council has activated a bounty, it delegates the work that requires expertise to the\ncurator who gets to close the active bounty. Closing the active bounty enacts a delayed payout to\nthe payout address and a payout of the curator fee. The delay phase allows the Council to act if any\nissues arise."),(0,r.kt)("p",null,"To 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 probably need to find an\noff-chain way to explain the proposal (any of the available community forums serve this purpose).\n",(0,r.kt)("a",{parentName:"p",href:"https://docs.google.com/document/d/1-IBz_owspV5OcvezWXpksWDQReWowschD0TFuaVKKcU/edit?usp=sharing"},"This template"),"\ncan help as a checklist of all needed information for the Council to make an informed decision."),(0,r.kt)("p",null,"The bounty has a predetermined duration of 90 days with the possibility of being extended by the\ncurator. Aiming to maintain flexibility on the tasks\u2019 curation, the curator will be able to create\nsub-bounties for more granularity and allocation in the next iteration of the mechanism."),(0,r.kt)("h3",{id:"creating-a-bounty-proposal"},"Creating a Bounty Proposal"),(0,r.kt)("p",null,"Anyone can create a Bounty proposal using Polkadot-JS Apps: Users are able to submit a proposal on\nthe dedicated Bounty section under Governance. The development of a robust user interface to view\nand manage bounties in the Polkadot Apps is still under development and it will serve Council\nmembers, Curators and Beneficiaries of the bounties, as well as all users observing the on-chain\ntreasury governance. For now, the help of a Councillor is needed to open a bounty proposal as a\nmotion to be voted."),(0,r.kt)("p",null,"To submit a bounty, please visit ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps"},"Polkadot-JS Apps")," and click on the\ngovernance tab in the options bar on the top of the site. After, click on 'Bounties' and find the\nbutton '+ Add Bounty' on the upper-right side of the interface. Complete the bounty title, the\nrequested allocation (including curator's fee) and confirm the call."),(0,r.kt)("p",null,"After this, a Council member will need to assist you to pass the bounty proposal for vote as a\nmotion. You can contact the Council by joining the\nPolkadot Direction ",(0,r.kt)("a",{parentName:"p",href:"https://matrix.to/#/#Polkadot-Direction:parity.io"},"channel"),"\n"," in\nElement or joining our\nPolkadot Discord ",(0,r.kt)("a",{parentName:"p",href:"https://parity.link/polkadot-discord"},"server"),"\n"," and publishing a\nshort description of your bounty, with a link to one of the ",(0,r.kt)("a",{parentName:"p",href:"#announcing-the-proposal"},"forums")," for\ncontextual information."),(0,r.kt)("p",null,"A bounty can be cancelled by deleting the earmark for a specific treasury amount or be closed if the\ntasks have been completed. On the opposite side, the 90 days life of a bounty can be extended by\namending the expiry block number of the bounty to stay active."),(0,r.kt)("h3",{id:"closing-a-bounty"},"Closing a bounty"),(0,r.kt)("p",null,"The curator can close the bounty once they approve the completion of its tasks. The curator should\nmake sure to set up the payout address on the active bounty beforehand. Closing the Active bounty\nenacts a delayed payout to the payout address and a payout of the curator fee."),(0,r.kt)("p",null,"A bounty can be closed by using the extrinsics tab and selecting the Treasury pallet, then\n",(0,r.kt)("inlineCode",{parentName:"p"},"Award_bounty"),", making sure the right bounty is to be closed and finally sign the transaction. It is\nimportant to note that those who received a reward after the bounty is completed, must claim the\nspecific amount of the payout from the payout address, by calling ",(0,r.kt)("inlineCode",{parentName:"p"},"Claim_bounty")," after the curator\nclosed the allocation."),(0,r.kt)("p",null,"To understand more about Bounties and how this new mechanism works, read this\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.network/kusama-and-polkadot-now-reward-curators-helping-to-scale-councils-functions-join-the-force-moving-the-community-forward/"},"Polkadot Blog post"),"."),(0,r.kt)("h2",{id:"faq"},"FAQ"),(0,r.kt)("h3",{id:"what-prevents-the-treasury-from-being-captured-by-a-majority-of-the-council"},"What prevents the Treasury from being captured by a majority of the Council?"),(0,r.kt)("p",null,"The majority of the Council can decide the outcome of a treasury spend proposal. In an adversarial\nmindset, we may consider the possibility that the Council may at some point go rogue and attempt to\nsteal all of the treasury funds. It is a possibility that the treasury pot becomes so great, that a\nlarge financial incentive would present itself."),(0,r.kt)("p",null,"For one, the Treasury has deflationary pressure due to the burn that is suffered every spend period.\nThe burn aims to incentivize the complete spend of all treasury funds at every burn period, so\nideally the treasury pot doesn't have time to accumulate mass amounts of wealth. However, it is the\ncase that the burn on the Treasury could be so little that it does not matter - as is the case\ncurrently on Kusama with a 0.2% burn."),(0,r.kt)("p",null,"However, it is the case on Kusama that the Council is composed of mainly well-known members of the\ncommunity. Remember, the Council is voted in by the token holders, so they must do some campaigning\nor otherwise be recognized to earn votes. In the scenario of an attack, the Council members would\nlose their social credibility. Furthermore, members of the Council are usually externally motivated\nby the proper operation of the chain. This external motivation is either because they run businesses\nthat depend on the chain, or they have direct financial gain (through their holdings) of the token\nvalue remaining steady."),(0,r.kt)("p",null,"Concretely, there are a couple on-chain methods that resist this kind of attack. One, the Council\nmajority may not be the token majority of the chain. This means that the token majority could vote\nto replace the Council if they attempted this attack - or even reverse the treasury spend. They\nwould do this through a normal referendum. Two, there are time delays to treasury spends. They are\nonly enacted every spend period. This means that there will be some time to observe this attack is\ntaking place. The time delay then allows chain participants time to respond. The response may take\nthe form of governance measures or - in the most extreme cases a liquidation of their holdings and a\nmigration to a minority fork. However, the possibility of this scenario is quite low."),(0,r.kt)("h2",{id:"further-reading"},"Further Reading"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/master/frame/treasury/src/lib.rs"},"Substrate's Treasury Pallet"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_treasury/index.html"},"Documentation of the Rust implementation of the Treasury")))))}f.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/d6d2b2d5.0119991a.js b/assets/js/d6d2b2d5.0119991a.js deleted file mode 100644 index 6c95f914f59c..000000000000 --- a/assets/js/d6d2b2d5.0119991a.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[2483],{47940:(e,o,t)=>{"use strict";t.d(o,{Z:()=>p});var n=t(74165),a=t(15861),r=t(67294),i=t(87152),s=t(17145),l=t(67425);function c(e,o,t){return u.apply(this,arguments)}function u(){return(u=(0,a.Z)((0,n.Z)().mark((function e(o,t,a){var r,l,c,u,d;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=void 0,l=void 0,e.t0=o,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){e.next=18;break}return e.abrupt("return");case 18:return c=new i.U(r),e.next=21,s.G.create({provider:c});case 21:u=e.sent,(d=t.split(".")).forEach((function(e){e in u&&(u=u[e])})),e.t1=d[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=u.toString(),e.abrupt("break",35);case 29:return e.next=31,u();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+d[0]+") in "+t);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function d(e,o,t,n){switch(o){case"humanReadable":(0,l.HumanReadable)(e,t,n);break;case"precise":(0,l.Precise)(e,t,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(e){var o=e.network,t=e.path,i=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,u=(0,r.useState)(""),p=u[0],k=u[1];return o=o.toLowerCase(),(0,r.useEffect)((function(){void 0!==l?d(i.toString(),l,o,k):k(i.toString());var e=void 0;switch(o){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+o)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var e=(0,a.Z)((0,n.Z)().mark((function e(){var a;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c(o,t,k);case 2:if(void 0!==(a=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?d(a,l,o,k):k(a);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{r()}catch(s){console.log(s)}}}),[]),p}},67425:e=>{var o={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,t,n){var a=void 0;if("polkadot"===t||"statemint"===t)a=3;else{if("kusama"!==t&&"statemine"!==t)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");a=6}e=parseFloat(e),n((e=Number.isInteger(e/o[t].precision)?e/o[t].precision+" "+o[t].symbol:(e/o[t].precision).toFixed(a)+" "+o[t].symbol).toString())},Precise:function(e,t,n){n(e=(e=parseFloat(e))/o[t].precision+" "+o[t].symbol)},BlocksToDays:function(e,o){o((e=6*e/86400).toString())},Percentage:function(e,o){o((e/=1e7).toString())},ArrayLength:function(e,o){o((e=e.split(",").length).toString())}}},41973:(e,o,t)=>{"use strict";t.r(o),t.d(o,{assets:()=>d,contentTitle:()=>c,default:()=>m,frontMatter:()=>l,metadata:()=>u,toc:()=>p});var n=t(87462),a=t(63366),r=(t(67294),t(3905)),i=t(47940),s=["components"],l={id:"maintain-guides-how-to-vote-councillor",title:"Voting for Councillors",sidebar_label:"Voting for Councillors",description:"Steps on how to vote for councillors.",keywords:["council","vote","councillors"],slug:"../maintain-guides-how-to-vote-councillor"},c=void 0,u={unversionedId:"maintain/maintain-guides-how-to-vote-councillor",id:"maintain/maintain-guides-how-to-vote-councillor",title:"Voting for Councillors",description:"Steps on how to vote for councillors.",source:"@site/../docs/maintain/maintain-guides-how-to-vote-councillor.md",sourceDirName:"maintain",slug:"/maintain-guides-how-to-vote-councillor",permalink:"/docs/maintain-guides-how-to-vote-councillor",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/maintain-guides-how-to-vote-councillor.md",tags:[],version:"current",lastUpdatedBy:"Keith Alfaro",lastUpdatedAt:1672251942,formattedLastUpdatedAt:"Dec 28, 2022",frontMatter:{id:"maintain-guides-how-to-vote-councillor",title:"Voting for Councillors",sidebar_label:"Voting for Councillors",description:"Steps on how to vote for councillors.",keywords:["council","vote","councillors"],slug:"../maintain-guides-how-to-vote-councillor"},sidebar:"docs",previous:{title:"Join the Council",permalink:"/docs/maintain-guides-how-to-join-council"}},d={},p=[{value:"Voting for Councillors",id:"voting-for-councillors",level:2},{value:"Removing your Vote",id:"removing-your-vote",level:2}],k={toc:p},h="wrapper";function m(e){var o=e.components,l=(0,a.Z)(e,s);return(0,r.kt)(h,(0,n.Z)({},k,l,{components:o,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"The council is an elected body of on-chain accounts that are intended to represent the passive\nstakeholders of Polkadot and/or Kusama. The council has two major tasks in governance: proposing\nreferenda and vetoing dangerous or malicious referenda. For more information on the council, see the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#council"},"governance page"),". This guide will walk you through voting for\ncouncillors in the elections."),(0,r.kt)("h2",{id:"voting-for-councillors"},"Voting for Councillors"),(0,r.kt)("p",null,"Voting for councillors requires you to reserve\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.phragmenElection.votingBondBase",defaultValue:20064e7,filter:"humanReadable",mdxType:"RPC"}),"","\nas a base amount and an amount of\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.phragmenElection.votingBondFactor",defaultValue:32e7,filter:"humanReadable",mdxType:"RPC"}),"","\nper vote. You can then bond whatever amount you wish to put behind your vote. See the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-democracy"},"democracy guide")," for more information."),(0,r.kt)("admonition",{title:"Voting and staking locks can overlap",type:"info"},(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"A user can use staked funds to vote for Councillors (and/or use those funds in referenda)."),(0,r.kt)("li",{parentName:"ul"},"A user is only prohibited from transferring these funds to another account."))),(0,r.kt)("admonition",{type:"warning"},(0,r.kt)("p",{parentName:"admonition"},"If your balance is vesting, you cannot use unvested tokens for this lock. You will have to wait\nuntil you have at least that many ",(0,r.kt)("strong",{parentName:"p"},"free")," tokens to vote.")),(0,r.kt)("p",null,"Like the validator elections, you can approve up to 16 different councillors and your vote will be\nequalized among the chosen group. Unlike validator elections, there is no unbonding period for your\nreserved tokens. Once you remove your vote, your tokens will be liquid again."),(0,r.kt)("admonition",{type:"warning"},(0,r.kt)("p",{parentName:"admonition"},"It is your responsibility not to put your entire balance into the reserved value when you make a\nvote for councillors. It's best to keep ",(0,r.kt)("em",{parentName:"p"},"at least")," enough DOT/KSM to pay for transaction fees.")),(0,r.kt)("p",null,"Go to the ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps"},"Polkadot-JS Apps Dashboard"),' and click on the "Council" tab.\nOn the right side of the window there are two blue buttons, click on the one that says "Vote."'),(0,r.kt)("p",null,'Since the council uses approval voting, when you vote you signal which of the candidates you approve\nof and your voted tokens will be equalized among the selected candidates. Select up to 16 council\ncandidates by moving the slider to "Aye" for each one that you want to be elected. When you\'ve made\nthe proper configuration submit your transaction.'),(0,r.kt)("p",null,"You should see your vote appear in the interface immediately after your transaction is included."),(0,r.kt)("h2",{id:"removing-your-vote"},"Removing your Vote"),(0,r.kt)("p",null,"In order to get your reserved tokens back, you will need to remove your vote. Only remove your vote\nwhen you're done participating in elections and you no longer want your reserved tokens to count for\nthe councillors that you approve."),(0,r.kt)("p",null,'Go to the "Governance" > "Council" tab on the\n',(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps"},"Polkadot-JS Apps Dashboard"),"."),(0,r.kt)("p",null,'Under the "Council overview" tab, click on "Vote".'),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"polkadotjs_removeVoter",src:t(30301).Z,width:"1878",height:"361"})),(0,r.kt)("p",null,'Issue the "Unvote all" option.'),(0,r.kt)("p",null,"When the transaction is included in a block you should have your reserved tokens made liquid again\nand your vote will no longer be counting for any councillors in the elections starting in the next\nterm."))}m.isMDXComponent=!0},30301:(e,o,t)=>{"use strict";t.d(o,{Z:()=>n});const n=t.p+"assets/images/polkadotjs_removeVoter-b66eb203df51ecdb1d926990120aa76b.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/d6d2b2d5.82345bc8.js b/assets/js/d6d2b2d5.82345bc8.js new file mode 100644 index 000000000000..6fcae4168be0 --- /dev/null +++ b/assets/js/d6d2b2d5.82345bc8.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[2483],{47940:(e,o,t)=>{"use strict";t.d(o,{Z:()=>p});var n=t(74165),a=t(15861),r=t(67294),i=t(87152),s=t(17145),l=t(67425);function c(e,o,t){return u.apply(this,arguments)}function u(){return(u=(0,a.Z)((0,n.Z)().mark((function e(o,t,a){var r,l,c,u,d;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=void 0,l=void 0,e.t0=o,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){e.next=18;break}return e.abrupt("return");case 18:return c=new i.U(r),e.next=21,s.G.create({provider:c});case 21:u=e.sent,(d=t.split(".")).forEach((function(e){e in u&&(u=u[e])})),e.t1=d[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=u.toString(),e.abrupt("break",35);case 29:return e.next=31,u();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+d[0]+") in "+t);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function d(e,o,t,n){switch(o){case"humanReadable":(0,l.HumanReadable)(e,t,n);break;case"precise":(0,l.Precise)(e,t,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"permillToPercent":(0,l.PermillToPercent)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(e){var o=e.network,t=e.path,i=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,u=(0,r.useState)(""),p=u[0],k=u[1];return o=o.toLowerCase(),(0,r.useEffect)((function(){void 0!==l?d(i.toString(),l,o,k):k(i.toString());var e=void 0;switch(o){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+o)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var e=(0,a.Z)((0,n.Z)().mark((function e(){var a;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,c(o,t,k);case 2:if(void 0!==(a=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?d(a,l,o,k):k(a);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{r()}catch(s){console.log(s)}}}),[]),p}},67425:e=>{var o={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,t,n){var a=void 0;if("polkadot"===t||"statemint"===t)a=3;else{if("kusama"!==t&&"statemine"!==t)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");a=6}e=parseFloat(e),n((e=Number.isInteger(e/o[t].precision)?e/o[t].precision+" "+o[t].symbol:(e/o[t].precision).toFixed(a)+" "+o[t].symbol).toString())},Precise:function(e,t,n){n(e=(e=parseFloat(e))/o[t].precision+" "+o[t].symbol)},BlocksToDays:function(e,o){o((e=6*e/86400).toString())},Percentage:function(e,o){o((e/=1e7).toString())},PermillToPercent:function(e,o){o((e/=1e4).toString())},ArrayLength:function(e,o){o((e=e.split(",").length).toString())}}},41973:(e,o,t)=>{"use strict";t.r(o),t.d(o,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>l,metadata:()=>u,toc:()=>p});var n=t(87462),a=t(63366),r=(t(67294),t(3905)),i=t(47940),s=["components"],l={id:"maintain-guides-how-to-vote-councillor",title:"Voting for Councillors",sidebar_label:"Voting for Councillors",description:"Steps on how to vote for councillors.",keywords:["council","vote","councillors"],slug:"../maintain-guides-how-to-vote-councillor"},c=void 0,u={unversionedId:"maintain/maintain-guides-how-to-vote-councillor",id:"maintain/maintain-guides-how-to-vote-councillor",title:"Voting for Councillors",description:"Steps on how to vote for councillors.",source:"@site/../docs/maintain/maintain-guides-how-to-vote-councillor.md",sourceDirName:"maintain",slug:"/maintain-guides-how-to-vote-councillor",permalink:"/docs/maintain-guides-how-to-vote-councillor",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/maintain-guides-how-to-vote-councillor.md",tags:[],version:"current",lastUpdatedBy:"Keith Alfaro",lastUpdatedAt:1672251942,formattedLastUpdatedAt:"Dec 28, 2022",frontMatter:{id:"maintain-guides-how-to-vote-councillor",title:"Voting for Councillors",sidebar_label:"Voting for Councillors",description:"Steps on how to vote for councillors.",keywords:["council","vote","councillors"],slug:"../maintain-guides-how-to-vote-councillor"},sidebar:"docs",previous:{title:"Join the Council",permalink:"/docs/maintain-guides-how-to-join-council"}},d={},p=[{value:"Voting for Councillors",id:"voting-for-councillors",level:2},{value:"Removing your Vote",id:"removing-your-vote",level:2}],k={toc:p},m="wrapper";function h(e){var o=e.components,l=(0,a.Z)(e,s);return(0,r.kt)(m,(0,n.Z)({},k,l,{components:o,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"The council is an elected body of on-chain accounts that are intended to represent the passive\nstakeholders of Polkadot and/or Kusama. The council has two major tasks in governance: proposing\nreferenda and vetoing dangerous or malicious referenda. For more information on the council, see the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-governance#council"},"governance page"),". This guide will walk you through voting for\ncouncillors in the elections."),(0,r.kt)("h2",{id:"voting-for-councillors"},"Voting for Councillors"),(0,r.kt)("p",null,"Voting for councillors requires you to reserve\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.phragmenElection.votingBondBase",defaultValue:20064e7,filter:"humanReadable",mdxType:"RPC"}),"","\nas a base amount and an amount of\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.phragmenElection.votingBondFactor",defaultValue:32e7,filter:"humanReadable",mdxType:"RPC"}),"","\nper vote. You can then bond whatever amount you wish to put behind your vote. See the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-democracy"},"democracy guide")," for more information."),(0,r.kt)("admonition",{title:"Voting and staking locks can overlap",type:"info"},(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},"A user can use staked funds to vote for Councillors (and/or use those funds in referenda)."),(0,r.kt)("li",{parentName:"ul"},"A user is only prohibited from transferring these funds to another account."))),(0,r.kt)("admonition",{type:"warning"},(0,r.kt)("p",{parentName:"admonition"},"If your balance is vesting, you cannot use unvested tokens for this lock. You will have to wait\nuntil you have at least that many ",(0,r.kt)("strong",{parentName:"p"},"free")," tokens to vote.")),(0,r.kt)("p",null,"Like the validator elections, you can approve up to 16 different councillors and your vote will be\nequalized among the chosen group. Unlike validator elections, there is no unbonding period for your\nreserved tokens. Once you remove your vote, your tokens will be liquid again."),(0,r.kt)("admonition",{type:"warning"},(0,r.kt)("p",{parentName:"admonition"},"It is your responsibility not to put your entire balance into the reserved value when you make a\nvote for councillors. It's best to keep ",(0,r.kt)("em",{parentName:"p"},"at least")," enough DOT/KSM to pay for transaction fees.")),(0,r.kt)("p",null,"Go to the ",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps"},"Polkadot-JS Apps Dashboard"),' and click on the "Council" tab.\nOn the right side of the window there are two blue buttons, click on the one that says "Vote."'),(0,r.kt)("p",null,'Since the council uses approval voting, when you vote you signal which of the candidates you approve\nof and your voted tokens will be equalized among the selected candidates. Select up to 16 council\ncandidates by moving the slider to "Aye" for each one that you want to be elected. When you\'ve made\nthe proper configuration submit your transaction.'),(0,r.kt)("p",null,"You should see your vote appear in the interface immediately after your transaction is included."),(0,r.kt)("h2",{id:"removing-your-vote"},"Removing your Vote"),(0,r.kt)("p",null,"In order to get your reserved tokens back, you will need to remove your vote. Only remove your vote\nwhen you're done participating in elections and you no longer want your reserved tokens to count for\nthe councillors that you approve."),(0,r.kt)("p",null,'Go to the "Governance" > "Council" tab on the\n',(0,r.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps"},"Polkadot-JS Apps Dashboard"),"."),(0,r.kt)("p",null,'Under the "Council overview" tab, click on "Vote".'),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"polkadotjs_removeVoter",src:t(30301).Z,width:"1878",height:"361"})),(0,r.kt)("p",null,'Issue the "Unvote all" option.'),(0,r.kt)("p",null,"When the transaction is included in a block you should have your reserved tokens made liquid again\nand your vote will no longer be counting for any councillors in the elections starting in the next\nterm."))}h.isMDXComponent=!0},30301:(e,o,t)=>{"use strict";t.d(o,{Z:()=>n});const n=t.p+"assets/images/polkadotjs_removeVoter-b66eb203df51ecdb1d926990120aa76b.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/da9f79cb.50e723c1.js b/assets/js/da9f79cb.50e723c1.js deleted file mode 100644 index 9af529dd072f..000000000000 --- a/assets/js/da9f79cb.50e723c1.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[2248],{47940:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var o=n(74165),a=n(15861),i=n(67294),r=n(87152),s=n(17145),l=n(67425);function m(e,t,n){return d.apply(this,arguments)}function d(){return(d=(0,a.Z)((0,o.Z)().mark((function e(t,n,a){var i,l,m,d,p;return(0,o.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return m=new r.U(i),e.next=21,s.G.create({provider:m});case 21:d=e.sent,(p=n.split(".")).forEach((function(e){e in d&&(d=d[e])})),e.t1=p[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=d.toString(),e.abrupt("break",35);case 29:return e.next=31,d();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+p[0]+") in "+n);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function p(e,t,n,o){switch(t){case"humanReadable":(0,l.HumanReadable)(e,n,o);break;case"precise":(0,l.Precise)(e,n,o);break;case"blocksToDays":(0,l.BlocksToDays)(e,o);break;case"percentage":(0,l.Percentage)(e,o);break;case"arrayLength":(0,l.ArrayLength)(e,o);break;default:return void console.log("Ignoring unknown filter type")}}const c=function(e){var t=e.network,n=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,d=(0,i.useState)(""),c=d[0],h=d[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?p(r.toString(),l,t,h):h(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,a.Z)((0,o.Z)().mark((function e(){var a;return(0,o.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,m(t,n,h);case 2:if(void 0!==(a=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?p(a,l,t,h):h(a);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),c}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,n,o){var a=void 0;if("polkadot"===n||"statemint"===n)a=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");a=6}e=parseFloat(e),o((e=Number.isInteger(e/t[n].precision)?e/t[n].precision+" "+t[n].symbol:(e/t[n].precision).toFixed(a)+" "+t[n].symbol).toString())},Precise:function(e,n,o){o(e=(e=parseFloat(e))/t[n].precision+" "+t[n].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},92916:(e,t,n)=>{"use strict";n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>m,default:()=>k,frontMatter:()=>l,metadata:()=>d,toc:()=>c});var o=n(87462),a=n(63366),i=(n(67294),n(3905)),r=n(47940),s=["components"],l={id:"learn-nomination-pools",title:"Nomination Pools",sidebar_label:"Nomination Pools",description:"Staking through Polkadot's Nomination Pools.",keyword:["nominate","nominator","stake","staking","pools"],slug:"../learn-nomination-pools"},m=void 0,d={unversionedId:"learn/learn-nomination-pools",id:"learn/learn-nomination-pools",title:"Nomination Pools",description:"Staking through Polkadot's Nomination Pools.",source:"@site/../docs/learn/learn-nomination-pools.md",sourceDirName:"learn",slug:"/learn-nomination-pools",permalink:"/docs/learn-nomination-pools",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-nomination-pools.md",tags:[],version:"current",lastUpdatedBy:"bader y",lastUpdatedAt:1693406812,formattedLastUpdatedAt:"Aug 30, 2023",frontMatter:{id:"learn-nomination-pools",title:"Nomination Pools",sidebar_label:"Nomination Pools",description:"Staking through Polkadot's Nomination Pools.",keyword:["nominate","nominator","stake","staking","pools"],slug:"../learn-nomination-pools"},sidebar:"docs",previous:{title:"Introduction to Staking",permalink:"/docs/learn-staking"},next:{title:"Advanced",permalink:"/docs/learn-advanced-index"}},p={},c=[{value:"Key Components",id:"key-components",level:2},{value:"Pool Member Lifecycle",id:"pool-member-lifecycle",level:2},{value:"Join a pool",id:"join-a-pool",level:3},{value:"Claim rewards",id:"claim-rewards",level:3},{value:"Claim Permissions",id:"claim-permissions",level:3},{value:"Unbond and withdraw funds",id:"unbond-and-withdraw-funds",level:3},{value:"Limitations of Nomination Pools",id:"limitations-of-nomination-pools",level:3},{value:"Pool Administration",id:"pool-administration",level:2},{value:"States",id:"states",level:3},{value:"Roles",id:"roles",level:3},{value:"Pool Commissions",id:"pool-commissions",level:3},{value:"Pool Lifecycle",id:"pool-lifecycle",level:2},{value:"Nomination Pools - Slashing",id:"nomination-pools---slashing",level:2},{value:"Nominating vs Joining a Pool",id:"nominating-vs-joining-a-pool",level:2}],h={toc:c},u="wrapper";function k(e){var t=e.components,l=(0,a.Z)(e,s);return(0,i.kt)(u,(0,o.Z)({},h,l,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{title:"Nomination Pools are live on Polkadot!",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Nomination pools are a new feature for Polkadot\u2019s staking system that allows users to pool their\nDOT tokens together on-chain to nominate\nvalidators and receive rewards, significantly improving the system\u2019s scalability. Now, anyone with\nas little as\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/nomination-pools-are-live-stake-natively-with-just-1-dot/"},"1 DOT can receive rewards for staking natively on Polkadot"),".\nNote that rewards are not guaranteed for those pools that do not have enough bonded funds to be\nincluded within the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced#bags-list"},"bags list"),". ",(0,i.kt)("strong",{parentName:"p"},"Only members of active\npools will receive rewards.")),(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},"There are currently\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.nominationPools.counterForPoolMembers",defaultValue:4376,mdxType:"RPC"}),"\nmembers. (There can be a maximum of\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.nominationPools.maxPoolMembers",defaultValue:16384,mdxType:"RPC"}),"\nmembers.)"),(0,i.kt)("li",{parentName:"ul"},"There are currently\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.nominationPools.lastPoolId",defaultValue:80,mdxType:"RPC"}),"\npools. (There can be a maximum of\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.nominationPools.maxPools",defaultValue:64,mdxType:"RPC"}),"\npools)"),(0,i.kt)("li",{parentName:"ul"},"No limit on\n","\nmembers per pool."))),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"Learn the key differences between\n",(0,i.kt)("a",{parentName:"p",href:"#nominating-vs-joining-a-pool"},(0,i.kt)("strong",{parentName:"a"},"Staking directly vs Joining a Nomination Pool")),"."),(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("strong",{parentName:"p"},"For Ledger users:")," Joining a nomination pool is possible only with the XL version of the Polkadot\nLedger App. This should be installed by default on Ledger Nano X and S Plus, but not on the Nano S."),(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("strong",{parentName:"p"},"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",(0,i.kt)("a",{parentName:"strong",href:"/docs/learn-account-advanced#system-accounts"},"system account"),"."))),(0,i.kt)("admonition",{title:"Have questions on Nomination Pools?",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"Please join the ",(0,i.kt)("a",{parentName:"p",href:"https://dot.li/discord"},"Polkadot Discord")," for asking general questions about\nNomination Pools. If you are a developer, please join our\n",(0,i.kt)("a",{parentName:"p",href:"https://matrix.to/#/#nompools-support:matrix.parity.io"},"nomination pools support channel"),".")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Nomination Pools",src:n(85408).Z,width:"1720",height:"963"})),(0,i.kt)("p",null,"Nomination pools are one of the key features from the roadmap of staking improvements on\nPolkadot. They are designed to\npermissionlessly allow members to pool their funds together and act as a single nominator account."),(0,i.kt)("p",null,"Due to the current runtime constraints,\nPolkadot can only handle\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.maxElectingVoters",defaultValue:22500,mdxType:"RPC"}),"\n","\nnominators comfortably in the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nominator#staking-election-stages"},"electing set"),". As one of\nthe objectives of the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"NPoS algorithm")," is to maximize the overall stake on the\nnetwork, it can be inferred that the staking system on\nPolkadot favors nominators with a larger\nstake. Only the nominator accounts which back the validators in the active set are eligible for\nreceiving staking rewards. This leaves out nomination intents from the accounts with lower token\nbalance than the min-active nomination and places them in a waiting queue to enter electing set.\nNomination pools will be handy for members who want to participate in the staking system with a\nstake much lower than the dynamic min-active nomination threshold on the network. All operations are\nconstant space and time complexity relative to the number of members, eliminating any theoretical\nupper bound on the number of members the system can handle and thus scaling the number of accounts\nthat can participate and earn rewards in the staking system on\nPolkadot. In summary, each nomination pool is\nviewed as a single nominator from the NPoS system point of view."),(0,i.kt)("admonition",{title:"Why aren't the members in the nomination pools called delegators?",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The term ",(0,i.kt)("inlineCode",{parentName:"p"},"delegator")," is associated too much with Delegated Proof of Staking (DPoS), and since\nPolkadot implements Nominated Proof of Staking\n(NPoS), naming them delegators would be misleading. The term ",(0,i.kt)("inlineCode",{parentName:"p"},"member")," is our generic replacement for\n",(0,i.kt)("inlineCode",{parentName:"p"},"delegator"),". In action, members are quite similar to delegators and delegate their nomination power\nto the pool.")),(0,i.kt)("p",null,"The pool\u2019s earnings are split pro rata to a member's stake in the bonded pool (and thus, the staking\nrewards for members will be the same as if they were a nominator). Importantly, slashes are also\napplied proportionally to members who may have been actively bonded."),(0,i.kt)("h2",{id:"key-components"},"Key Components"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Bonded Pool: Tracks the distribution of actively staked funds."),(0,i.kt)("li",{parentName:"ul"},"Reward Pool: Tracks rewards earned by actively staked funds."),(0,i.kt)("li",{parentName:"ul"},"Unbonding Sub Pools: Collection of pools at different phases (i.e. eras) of the unbonding\nlifecycle."),(0,i.kt)("li",{parentName:"ul"},"Members: Accounts that nominate to the pools."),(0,i.kt)("li",{parentName:"ul"},"Point: Unit of measure for a member\u2019s portion of a pool's funds. All pools start with a point to\nPlanck ratio of 1. Over time, if the pool receives rewards, they increase in value, and if the\npool is slashed, it decreases in value.")),(0,i.kt)("h2",{id:"pool-member-lifecycle"},"Pool Member Lifecycle"),(0,i.kt)("h3",{id:"join-a-pool"},"Join a pool"),(0,i.kt)("p",null,"A member delegates funds to a pool by transferring some amount to the pool\u2019s bonded account with the\n",(0,i.kt)("inlineCode",{parentName:"p"},"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."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"The current minimum bond to join a pool on"),"\n",(0,i.kt)("strong",{parentName:"p"},"Polkadot"),"","\n",(0,i.kt)("strong",{parentName:"p"},"is ",(0,i.kt)(r.Z,{network:"polkadot",path:"query.nominationPools.minJoinBond",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),"."),"\n",""),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The funds nominated to a pool will not be visible in the member's account balance on Polkadot JS\nApps UI. This is because the member funds are transferred from their account to the pool's\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced#system-accounts"},"system account"),". This pool account is not accessible\nby anyone (including the pool root or depositor) and only the pool's internal logic can access the\naccount.")),(0,i.kt)("admonition",{title:"Use Non-Transfer or Nomination Pools Proxy Accounts to join Nomination Pools",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"Only ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-proxies#non-transfer-proxy"},"non-transfer proxies")," and\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-proxies#nomination-pools-proxy"},"nomination pools proxy")," can be used to participate in\nnomination pools. ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-proxies#staking-proxy"},"Staking proxies")," cannot be used as they cannot\nmake calls to the nomination pools pallet. (The nomination pools will be supported through a staking\nproxy when the changes made in ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/pull/7448"},"this PR")," are\nreleased on the network."),(0,i.kt)("p",{parentName:"admonition"},"Thus, depending on how much control you want to give your proxy, you might choose between\nnon-transfer > staking > nomination pool proxy, with the latter being only able to sign transactions\nrelated to the ",(0,i.kt)("inlineCode",{parentName:"p"},"NominationPool")," pallet.")),(0,i.kt)("p",null,'Check the "How to join a pool" section in\n',(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181401-how-to-join-nomination-pools"},"this support article"),"\nfor guidelines."),(0,i.kt)("h3",{id:"claim-rewards"},"Claim rewards"),(0,i.kt)("p",null,'The 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',(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181401-how-to-join-nomination-pools"},"this support article"),"\nfor guidelines."),(0,i.kt)("h3",{id:"claim-permissions"},"Claim Permissions"),(0,i.kt)("p",null,"As a pool member, you can grant permission to any other account to claim and compound rewards on\nyour behalf. There are four permission options:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Permissioned")," (default): you need to claim and compound your rewards."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"PermissionlessCompound"),": you grant permission to any other account to compound (claim and bond)\nyour rewards on your behalf."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"PermissionlessWithdraw"),": you grant permission to any other account to withdraw (claim and keep as\na free balance) your rewards on your behalf."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"PermissionlessAll"),": you grant permission to any other account to compound or withdraw your\nrewards on your behalf.")),(0,i.kt)("p",null,"See the ",(0,i.kt)("a",{parentName:"p",href:"/docs/staking-dashboard#pools"},"Staking Dashboard page")," for more information about\nhow to set your claim permissions."),(0,i.kt)("p",null,"See the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-guides-staking-pools#claim-rewards-for-other-pool-members"},"advanced guides")," to\nlearn how to claim rewards for another pool member."),(0,i.kt)("h3",{id:"unbond-and-withdraw-funds"},"Unbond and withdraw funds"),(0,i.kt)("p",null,"At any point in time after joining the pool, a member can start the process of exiting by unbonding.\n",(0,i.kt)("inlineCode",{parentName:"p"},"unbond")," will unbond part or all of the member's funds. After unbond has been called and the\nunbonding duration has passed\n(",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.bondingDuration",defaultValue:28,mdxType:"RPC"}),"\n","\neras which correspond to\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.bondingDuration",defaultValue:28,mdxType:"RPC"}),"\n","\ndays on Polkadot), a member may withdraw\ntheir funds with ",(0,i.kt)("inlineCode",{parentName:"p"},"withdrawUnbonded"),'. Withdrawing effectively ends a member\'s relationship with their\npool, allowing them to join a different pool if desired. Check the "Withdraw unbonded funds" section\nin\n',(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181401-how-to-join-nomination-pools"},"this support article"),"\nfor guidelines."),(0,i.kt)("admonition",{title:"Unbonding transaction automatically triggers withdrawal of rewards",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"When there is a change in the bonded balance, the accumulated rewards in the pool thus far are\nautomatically withdrawn to the account. The rewards are then accrued based on the updated bonded\nbalance.")),(0,i.kt)("h3",{id:"limitations-of-nomination-pools"},"Limitations of Nomination Pools"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"A member cannot vote (e.g. in Referenda or for Council members) with their nominated funds. This\nmay be changed in the future once accounts are afforded the ability to split votes."),(0,i.kt)("li",{parentName:"ul"},"For a member to switch pools, all funds from the account must be unbonded. This process takes 28\neras."),(0,i.kt)("li",{parentName:"ul"},"A member can partially unbond the staked funds in the pool (at most 16 partial unbonds).")),(0,i.kt)("h2",{id:"pool-administration"},"Pool Administration"),(0,i.kt)("h3",{id:"states"},"States"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Open: The pool is open to be joined by anyone."),(0,i.kt)("li",{parentName:"ul"},"Blocked: The pool is blocked; no joiners are permitted."),(0,i.kt)("li",{parentName:"ul"},"Destroying: The pool is in the process of being destroyed. Once in this state, the pool may never\nrevert to any other state; it can only proceed to be destroyed. All members can be\npermissionlessly unbonded; this allows the pool to be dismantled regardless of any member\u2019s\nproactivity.")),(0,i.kt)("h3",{id:"roles"},"Roles"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Depositor: Creates the pool and is the initial member. The depositor can only leave the pool once\nall other members have left. Once they leave by withdrawing, the pool is fully removed from the\nsystem."),(0,i.kt)("li",{parentName:"ul"},"Nominator: Can select the validators the pool nominates."),(0,i.kt)("li",{parentName:"ul"},"Bouncer: Can change the pool\u2019s state and kick (permissionlessly unbond/withdraw) members if the\npool is blocked."),(0,i.kt)("li",{parentName:"ul"},"Root: Can change the nominator, bouncer, or itself. Further, it can perform any of the actions the\nnominator or bouncer can.")),(0,i.kt)("h3",{id:"pool-commissions"},"Pool Commissions"),(0,i.kt)("p",null,"As 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 ",(0,i.kt)("a",{parentName:"p",href:"/docs/staking-dashboard#pools"},"Polkadot Staking Dashboard"),"."),(0,i.kt)("p",null,"Three methods can be used when setting the pool commission:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Commission Rate")," (",(0,i.kt)("inlineCode",{parentName:"li"},"nominationPools.setCommission")," extrinsic): the start or new commission rate\n(",(0,i.kt)("inlineCode",{parentName:"li"},"newCommission")," parameter) that can be set between 0% and\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.nominationPools.globalMaxCommission",defaultValue:1e8,filter:"percentage",mdxType:"RPC"}),"%\n(decided through ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-polkadot-opengov"},"governance referendum"),") via the\n",(0,i.kt)("a",{parentName:"li",href:"https://paritytech.github.io/substrate/master/pallet_nomination_pools/pallet/type.GlobalMaxCommission.html"},(0,i.kt)("inlineCode",{parentName:"a"},"globalMaxCommission")),"\nparameter. You will need to specify an Input Payee Account, i.e. the account that will receive the\ncommission."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Max Commission")," (",(0,i.kt)("inlineCode",{parentName:"li"},"nominationPools.setCommissionMax")," extrinsic): the maximum commission\n(",(0,i.kt)("inlineCode",{parentName:"li"},"maxCommission")," parameter) the pool will apply to its members (between 0% and Max Commission).\nNote that once set, ",(0,i.kt)("strong",{parentName:"li"},"the pool admin can only lower it"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Change Rate")," (",(0,i.kt)("inlineCode",{parentName:"li"},"nominationPools.setCommissionChangeRate")," extrinsic): the maximum rate increase\n(",(0,i.kt)("inlineCode",{parentName:"li"},"maxIncrease")," parameter) allowed for a single commission update. Note that once set, ",(0,i.kt)("strong",{parentName:"li"},"the pool\nadmin can only lower it"),". When setting the Change Rate, it will also be possible to set a\n",(0,i.kt)("inlineCode",{parentName:"li"},"minDelay")," quantified as the number of blocks (since last commission update) after which it is\npossible to change the commission (i.e. the minimum delay between commission updates). Note that\nonce set, ",(0,i.kt)("strong",{parentName:"li"},"the pool admin can only increase it"),".")),(0,i.kt)("p",null,"Max 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."),(0,i.kt)("admonition",{title:"Max Commission and Change Rate are currently permanent",type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"Once the Max Commission and the Change Rate are set, the pool admin currently can only decrease\nthose values. The minimum delay between commission updates can only be increased. The situation can\nchange in the future and a ",(0,i.kt)("inlineCode",{parentName:"p"},"forceSetCommissionMax")," method can be proposed through governance\nreferendum.")),(0,i.kt)("p",null,"Let'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:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"The pool commission can be increased by 1% every 30 minutes. Bigger increases are not allowed.\nIncreases of less than or equal to 1% are not allowed sooner than 30 minutes since the last\ncommission update."),(0,i.kt)("li",{parentName:"ul"},"The Max Commission can only be decreased from 100%. Once decreased, it can be decreased again but\nit cannot be increased."),(0,i.kt)("li",{parentName:"ul"},"The Change Rate's maximum increase can only be decreased from 1%. Once decreased, it can be\ndecreased again but it cannot be increased."),(0,i.kt)("li",{parentName:"ul"},"The Change Rate's minimum delay between updates of 30 min can only be increased. Once increased,\nit can be increased again but it cannot be decreased.")),(0,i.kt)("h2",{id:"pool-lifecycle"},"Pool Lifecycle"),(0,i.kt)("admonition",{title:"Advanced How-to Guides",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"See ",(0,i.kt)("a",{parentName:"p",href:"./learn-guides-staking-pools#pool-creation"},"this page")," for more information about the lifecycle\nof nomination pools. The cycle includes creation, upkeep and destruction.")),(0,i.kt)("h2",{id:"nomination-pools---slashing"},"Nomination Pools - Slashing"),(0,i.kt)("p",null,"Suppose the staking system slashes a pool\u2019s underlying nomination account. In that case, the slash\nis distributed evenly across the bonded pool, and the unbonding pools from slash era+1 through the\nslash apply era. Thus, any member who either a) was unbonding or b) was actively bonded in the\naforementioned range of eras will be affected by the slash. In other words, a member who may have\nbeen actively bonded during the offence is slashed pro rata based on its stake relative to the total\nslash amount."),(0,i.kt)("p",null,"Unbonding 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."),(0,i.kt)("p",null,"This 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."),(0,i.kt)("h2",{id:"nominating-vs-joining-a-pool"},"Nominating vs Joining a Pool"),(0,i.kt)("p",null,"Nominating is the action of choosing validators. It does not simply involve bonding tokens.\nNominating is an active task, which implies that you regularly monitor that your stake is backing an\nactive validator in all the eras and check if you are receiving your staking rewards. More\nimportantly, ensure that the validators you chose always act in the best interests of the network\nprotocol and have less chance of getting slashed. To nominate, you need a minimum of\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.minNominatorBond",defaultValue:1e11,filter:"humanReadable",mdxType:"RPC"}),"",",\nand to receive rewards, you need at least a balance greater than the minimum active bond. Depending\non your validators, if your active validator is oversubscribed, you will earn rewards only if your\nstake is within that of the top\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"","\nnominators. If the validator misbehaves, It is worth noting that your stake is subject to slashing,\nirrespective of whether you are at the top\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"","\nnominators or not."),(0,i.kt)("p",null,"As the minimum active bond is a dynamic value, it can make your nomination inactive when the\nthreshold goes above your bonded balance. Hence, to be eligible to earn rewards while nominating,\nyou would need to stake a much higher balance than the minimum active bond."),(0,i.kt)("p",null,"Nomination pools are a way to participate in staking with as little as 1 DOT and earn staking\nrewards. Nomination pools differ from custodial solutions (like staking through central exchanges)\nbecause they are non-custodial, native to Polkadot's protocol, permissionless, transparent, and run\nin a decentralized way by the community. Before 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."),(0,i.kt)("admonition",{title:"Minimum Active Nomination Value is Dynamic",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The minimum amount required to become an active nominator and earn rewards is\n",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.minimumActiveStake",defaultValue:2937e9,filter:"humanReadable",mdxType:"RPC"})),".\n","\nIf you have less DOT than the minimum active\nnomination and still want to participate in staking, you can join the nomination pools. You can now\nstake on Polkadot natively with just\n",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)(r.Z,{network:"polkadot",path:"query.nominationPools.minJoinBond",filter:"humanReadable",defaultValue:1e10,mdxType:"RPC"})),"\n","\nin the nomination pools and earn staking rewards. For additional information, see\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/nomination-pools-are-live-stake-natively-with-just-1-dot/"},"this blog post"),".\nCheck the wiki doc on ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pools")," for more information.")),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:"center"},"Nominating"),(0,i.kt)("th",{parentName:"tr",align:"center"},"Joining a Pool"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Minimum 250 DOT to nominate."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Minimum 1 DOT to be a member.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Rewards can be compounded automatically or sent to any account."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Rewards can be manually claimed to the pool member's account and be bonded in the pool again to compound them.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"If the active validator gets slashed, all active nominators are subjected to slashing, also those that do not receive rewards due to the oversubscription issue."),(0,i.kt)("td",{parentName:"tr",align:"center"},"If the active validator gets slashed, all pool members are subjected to slashing.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Can bond and stake DOT indefinitely."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Can bond and stake DOT until the pool exists.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Unbonding period of 28 days. Can switch validators without unbonding."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Unbonding period of 28 days. Need to unbond before switching to a different pool.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Maximum uncapped."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Maximum uncapped.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Should bond more than the ",(0,i.kt)("a",{parentName:"td",href:"/docs/learn-nominator#minimum-active-nomination-to-receive-staking-rewards"},"minimum active nomination")," in an era to be eligible to earn staking rewards, although it can depend on multiple other factors outlined in the linked document."),(0,i.kt)("td",{parentName:"tr",align:"center"},"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 ",(0,i.kt)("a",{parentName:"td",href:"/docs/learn-phragmen"},"the NPoS system")," perspective).")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Staked tokens can be used for participation in Governance."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Staked tokens cannot be used for participation in Governance.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},(0,i.kt)("a",{parentName:"td",href:"/docs/learn-staking-advanced#claiming-rewards"},"Rewards payout")," can be triggered permissionlessly by anyone (typically done by the validator)."),(0,i.kt)("td",{parentName:"tr",align:"center"},"The pool member must claim the rewards.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Bonded funds remain in your account."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Bonded funds are transferred to a pool account which is administered by the network protocol and is not accessible to anyone else. See ",(0,i.kt)("a",{parentName:"td",href:"/docs/learn-account-advanced#system-accounts"},"System Accounts")," for more information.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Nominator manages the list of staked validators (up to 16)."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Nominations managed by the pool operator.")))))}k.isMDXComponent=!0},85408:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const o=n.p+"assets/images/NPoS-Pools-b758caea750e9e772fe7fcdbd6babeca.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/da9f79cb.d9943246.js b/assets/js/da9f79cb.d9943246.js new file mode 100644 index 000000000000..98057c07b36b --- /dev/null +++ b/assets/js/da9f79cb.d9943246.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[2248],{47940:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var o=n(74165),a=n(15861),i=n(67294),r=n(87152),s=n(17145),l=n(67425);function m(e,t,n){return d.apply(this,arguments)}function d(){return(d=(0,a.Z)((0,o.Z)().mark((function e(t,n,a){var i,l,m,d,p;return(0,o.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return m=new r.U(i),e.next=21,s.G.create({provider:m});case 21:d=e.sent,(p=n.split(".")).forEach((function(e){e in d&&(d=d[e])})),e.t1=p[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=d.toString(),e.abrupt("break",35);case 29:return e.next=31,d();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+p[0]+") in "+n);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function p(e,t,n,o){switch(t){case"humanReadable":(0,l.HumanReadable)(e,n,o);break;case"precise":(0,l.Precise)(e,n,o);break;case"blocksToDays":(0,l.BlocksToDays)(e,o);break;case"percentage":(0,l.Percentage)(e,o);break;case"permillToPercent":(0,l.PermillToPercent)(e,o);break;case"arrayLength":(0,l.ArrayLength)(e,o);break;default:return void console.log("Ignoring unknown filter type")}}const c=function(e){var t=e.network,n=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,d=(0,i.useState)(""),c=d[0],h=d[1];return t=t.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?p(r.toString(),l,t,h):h(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,a.Z)((0,o.Z)().mark((function e(){var a;return(0,o.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,m(t,n,h);case 2:if(void 0!==(a=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?p(a,l,t,h):h(a);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),c}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,n,o){var a=void 0;if("polkadot"===n||"statemint"===n)a=3;else{if("kusama"!==n&&"statemine"!==n)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");a=6}e=parseFloat(e),o((e=Number.isInteger(e/t[n].precision)?e/t[n].precision+" "+t[n].symbol:(e/t[n].precision).toFixed(a)+" "+t[n].symbol).toString())},Precise:function(e,n,o){o(e=(e=parseFloat(e))/t[n].precision+" "+t[n].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},92916:(e,t,n)=>{"use strict";n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>m,default:()=>k,frontMatter:()=>l,metadata:()=>d,toc:()=>c});var o=n(87462),a=n(63366),i=(n(67294),n(3905)),r=n(47940),s=["components"],l={id:"learn-nomination-pools",title:"Nomination Pools",sidebar_label:"Nomination Pools",description:"Staking through Polkadot's Nomination Pools.",keyword:["nominate","nominator","stake","staking","pools"],slug:"../learn-nomination-pools"},m=void 0,d={unversionedId:"learn/learn-nomination-pools",id:"learn/learn-nomination-pools",title:"Nomination Pools",description:"Staking through Polkadot's Nomination Pools.",source:"@site/../docs/learn/learn-nomination-pools.md",sourceDirName:"learn",slug:"/learn-nomination-pools",permalink:"/docs/learn-nomination-pools",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-nomination-pools.md",tags:[],version:"current",lastUpdatedBy:"bader y",lastUpdatedAt:1693406812,formattedLastUpdatedAt:"Aug 30, 2023",frontMatter:{id:"learn-nomination-pools",title:"Nomination Pools",sidebar_label:"Nomination Pools",description:"Staking through Polkadot's Nomination Pools.",keyword:["nominate","nominator","stake","staking","pools"],slug:"../learn-nomination-pools"},sidebar:"docs",previous:{title:"Introduction to Staking",permalink:"/docs/learn-staking"},next:{title:"Polkadot OpenGov",permalink:"/docs/learn-polkadot-opengov"}},p={},c=[{value:"Key Components",id:"key-components",level:2},{value:"Pool Member Lifecycle",id:"pool-member-lifecycle",level:2},{value:"Join a pool",id:"join-a-pool",level:3},{value:"Claim rewards",id:"claim-rewards",level:3},{value:"Claim Permissions",id:"claim-permissions",level:3},{value:"Unbond and withdraw funds",id:"unbond-and-withdraw-funds",level:3},{value:"Limitations of Nomination Pools",id:"limitations-of-nomination-pools",level:3},{value:"Pool Administration",id:"pool-administration",level:2},{value:"States",id:"states",level:3},{value:"Roles",id:"roles",level:3},{value:"Pool Commissions",id:"pool-commissions",level:3},{value:"Pool Lifecycle",id:"pool-lifecycle",level:2},{value:"Nomination Pools - Slashing",id:"nomination-pools---slashing",level:2},{value:"Nominating vs Joining a Pool",id:"nominating-vs-joining-a-pool",level:2}],h={toc:c},u="wrapper";function k(e){var t=e.components,l=(0,a.Z)(e,s);return(0,i.kt)(u,(0,o.Z)({},h,l,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{title:"Nomination Pools are live on Polkadot!",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Nomination pools are a new feature for Polkadot\u2019s staking system that allows users to pool their\nDOT tokens together on-chain to nominate\nvalidators and receive rewards, significantly improving the system\u2019s scalability. Now, anyone with\nas little as\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/nomination-pools-are-live-stake-natively-with-just-1-dot/"},"1 DOT can receive rewards for staking natively on Polkadot"),".\nNote that rewards are not guaranteed for those pools that do not have enough bonded funds to be\nincluded within the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced#bags-list"},"bags list"),". ",(0,i.kt)("strong",{parentName:"p"},"Only members of active\npools will receive rewards.")),(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},"There are currently\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.nominationPools.counterForPoolMembers",defaultValue:4376,mdxType:"RPC"}),"\nmembers. (There can be a maximum of\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.nominationPools.maxPoolMembers",defaultValue:16384,mdxType:"RPC"}),"\nmembers.)"),(0,i.kt)("li",{parentName:"ul"},"There are currently\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.nominationPools.lastPoolId",defaultValue:80,mdxType:"RPC"}),"\npools. (There can be a maximum of\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.nominationPools.maxPools",defaultValue:64,mdxType:"RPC"}),"\npools)"),(0,i.kt)("li",{parentName:"ul"},"No limit on\n","\nmembers per pool."))),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"Learn the key differences between\n",(0,i.kt)("a",{parentName:"p",href:"#nominating-vs-joining-a-pool"},(0,i.kt)("strong",{parentName:"a"},"Staking directly vs Joining a Nomination Pool")),"."),(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("strong",{parentName:"p"},"For Ledger users:")," Joining a nomination pool is possible only with the XL version of the Polkadot\nLedger App. This should be installed by default on Ledger Nano X and S Plus, but not on the Nano S."),(0,i.kt)("p",{parentName:"admonition"},(0,i.kt)("strong",{parentName:"p"},"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",(0,i.kt)("a",{parentName:"strong",href:"/docs/learn-account-advanced#system-accounts"},"system account"),"."))),(0,i.kt)("admonition",{title:"Have questions on Nomination Pools?",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"Please join the ",(0,i.kt)("a",{parentName:"p",href:"https://dot.li/discord"},"Polkadot Discord")," for asking general questions about\nNomination Pools. If you are a developer, please join our\n",(0,i.kt)("a",{parentName:"p",href:"https://matrix.to/#/#nompools-support:matrix.parity.io"},"nomination pools support channel"),".")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Nomination Pools",src:n(85408).Z,width:"1720",height:"963"})),(0,i.kt)("p",null,"Nomination pools are one of the key features from the roadmap of staking improvements on\nPolkadot. They are designed to\npermissionlessly allow members to pool their funds together and act as a single nominator account."),(0,i.kt)("p",null,"Due to the current runtime constraints,\nPolkadot can only handle\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.maxElectingVoters",defaultValue:22500,mdxType:"RPC"}),"\n","\nnominators comfortably in the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nominator#staking-election-stages"},"electing set"),". As one of\nthe objectives of the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"NPoS algorithm")," is to maximize the overall stake on the\nnetwork, it can be inferred that the staking system on\nPolkadot favors nominators with a larger\nstake. Only the nominator accounts which back the validators in the active set are eligible for\nreceiving staking rewards. This leaves out nomination intents from the accounts with lower token\nbalance than the min-active nomination and places them in a waiting queue to enter electing set.\nNomination pools will be handy for members who want to participate in the staking system with a\nstake much lower than the dynamic min-active nomination threshold on the network. All operations are\nconstant space and time complexity relative to the number of members, eliminating any theoretical\nupper bound on the number of members the system can handle and thus scaling the number of accounts\nthat can participate and earn rewards in the staking system on\nPolkadot. In summary, each nomination pool is\nviewed as a single nominator from the NPoS system point of view."),(0,i.kt)("admonition",{title:"Why aren't the members in the nomination pools called delegators?",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The term ",(0,i.kt)("inlineCode",{parentName:"p"},"delegator")," is associated too much with Delegated Proof of Staking (DPoS), and since\nPolkadot implements Nominated Proof of Staking\n(NPoS), naming them delegators would be misleading. The term ",(0,i.kt)("inlineCode",{parentName:"p"},"member")," is our generic replacement for\n",(0,i.kt)("inlineCode",{parentName:"p"},"delegator"),". In action, members are quite similar to delegators and delegate their nomination power\nto the pool.")),(0,i.kt)("p",null,"The pool\u2019s earnings are split pro rata to a member's stake in the bonded pool (and thus, the staking\nrewards for members will be the same as if they were a nominator). Importantly, slashes are also\napplied proportionally to members who may have been actively bonded."),(0,i.kt)("h2",{id:"key-components"},"Key Components"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Bonded Pool: Tracks the distribution of actively staked funds."),(0,i.kt)("li",{parentName:"ul"},"Reward Pool: Tracks rewards earned by actively staked funds."),(0,i.kt)("li",{parentName:"ul"},"Unbonding Sub Pools: Collection of pools at different phases (i.e. eras) of the unbonding\nlifecycle."),(0,i.kt)("li",{parentName:"ul"},"Members: Accounts that nominate to the pools."),(0,i.kt)("li",{parentName:"ul"},"Point: Unit of measure for a member\u2019s portion of a pool's funds. All pools start with a point to\nPlanck ratio of 1. Over time, if the pool receives rewards, they increase in value, and if the\npool is slashed, it decreases in value.")),(0,i.kt)("h2",{id:"pool-member-lifecycle"},"Pool Member Lifecycle"),(0,i.kt)("h3",{id:"join-a-pool"},"Join a pool"),(0,i.kt)("p",null,"A member delegates funds to a pool by transferring some amount to the pool\u2019s bonded account with the\n",(0,i.kt)("inlineCode",{parentName:"p"},"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."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"The current minimum bond to join a pool on"),"\n",(0,i.kt)("strong",{parentName:"p"},"Polkadot"),"","\n",(0,i.kt)("strong",{parentName:"p"},"is ",(0,i.kt)(r.Z,{network:"polkadot",path:"query.nominationPools.minJoinBond",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),"."),"\n",""),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The funds nominated to a pool will not be visible in the member's account balance on Polkadot JS\nApps UI. This is because the member funds are transferred from their account to the pool's\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-account-advanced#system-accounts"},"system account"),". This pool account is not accessible\nby anyone (including the pool root or depositor) and only the pool's internal logic can access the\naccount.")),(0,i.kt)("admonition",{title:"Use Non-Transfer or Nomination Pools Proxy Accounts to join Nomination Pools",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"Only ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-proxies#non-transfer-proxy"},"non-transfer proxies")," and\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-proxies#nomination-pools-proxy"},"nomination pools proxy")," can be used to participate in\nnomination pools. ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-proxies#staking-proxy"},"Staking proxies")," cannot be used as they cannot\nmake calls to the nomination pools pallet. (The nomination pools will be supported through a staking\nproxy when the changes made in ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot/pull/7448"},"this PR")," are\nreleased on the network."),(0,i.kt)("p",{parentName:"admonition"},"Thus, depending on how much control you want to give your proxy, you might choose between\nnon-transfer > staking > nomination pool proxy, with the latter being only able to sign transactions\nrelated to the ",(0,i.kt)("inlineCode",{parentName:"p"},"NominationPool")," pallet.")),(0,i.kt)("p",null,'Check the "How to join a pool" section in\n',(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181401-how-to-join-nomination-pools"},"this support article"),"\nfor guidelines."),(0,i.kt)("h3",{id:"claim-rewards"},"Claim rewards"),(0,i.kt)("p",null,'The 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',(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181401-how-to-join-nomination-pools"},"this support article"),"\nfor guidelines."),(0,i.kt)("h3",{id:"claim-permissions"},"Claim Permissions"),(0,i.kt)("p",null,"As a pool member, you can grant permission to any other account to claim and compound rewards on\nyour behalf. There are four permission options:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Permissioned")," (default): you need to claim and compound your rewards."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"PermissionlessCompound"),": you grant permission to any other account to compound (claim and bond)\nyour rewards on your behalf."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"PermissionlessWithdraw"),": you grant permission to any other account to withdraw (claim and keep as\na free balance) your rewards on your behalf."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"PermissionlessAll"),": you grant permission to any other account to compound or withdraw your\nrewards on your behalf.")),(0,i.kt)("p",null,"See the ",(0,i.kt)("a",{parentName:"p",href:"/docs/staking-dashboard#pools"},"Staking Dashboard page")," for more information about\nhow to set your claim permissions."),(0,i.kt)("p",null,"See the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-guides-staking-pools#claim-rewards-for-other-pool-members"},"advanced guides")," to\nlearn how to claim rewards for another pool member."),(0,i.kt)("h3",{id:"unbond-and-withdraw-funds"},"Unbond and withdraw funds"),(0,i.kt)("p",null,"At any point in time after joining the pool, a member can start the process of exiting by unbonding.\n",(0,i.kt)("inlineCode",{parentName:"p"},"unbond")," will unbond part or all of the member's funds. After unbond has been called and the\nunbonding duration has passed\n(",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.bondingDuration",defaultValue:28,mdxType:"RPC"}),"\n","\neras which correspond to\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.bondingDuration",defaultValue:28,mdxType:"RPC"}),"\n","\ndays on Polkadot), a member may withdraw\ntheir funds with ",(0,i.kt)("inlineCode",{parentName:"p"},"withdrawUnbonded"),'. Withdrawing effectively ends a member\'s relationship with their\npool, allowing them to join a different pool if desired. Check the "Withdraw unbonded funds" section\nin\n',(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181401-how-to-join-nomination-pools"},"this support article"),"\nfor guidelines."),(0,i.kt)("admonition",{title:"Unbonding transaction automatically triggers withdrawal of rewards",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"When there is a change in the bonded balance, the accumulated rewards in the pool thus far are\nautomatically withdrawn to the account. The rewards are then accrued based on the updated bonded\nbalance.")),(0,i.kt)("h3",{id:"limitations-of-nomination-pools"},"Limitations of Nomination Pools"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"A member cannot vote (e.g. in Referenda or for Council members) with their nominated funds. This\nmay be changed in the future once accounts are afforded the ability to split votes."),(0,i.kt)("li",{parentName:"ul"},"For a member to switch pools, all funds from the account must be unbonded. This process takes 28\neras."),(0,i.kt)("li",{parentName:"ul"},"A member can partially unbond the staked funds in the pool (at most 16 partial unbonds).")),(0,i.kt)("h2",{id:"pool-administration"},"Pool Administration"),(0,i.kt)("h3",{id:"states"},"States"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Open: The pool is open to be joined by anyone."),(0,i.kt)("li",{parentName:"ul"},"Blocked: The pool is blocked; no joiners are permitted."),(0,i.kt)("li",{parentName:"ul"},"Destroying: The pool is in the process of being destroyed. Once in this state, the pool may never\nrevert to any other state; it can only proceed to be destroyed. All members can be\npermissionlessly unbonded; this allows the pool to be dismantled regardless of any member\u2019s\nproactivity.")),(0,i.kt)("h3",{id:"roles"},"Roles"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Depositor: Creates the pool and is the initial member. The depositor can only leave the pool once\nall other members have left. Once they leave by withdrawing, the pool is fully removed from the\nsystem."),(0,i.kt)("li",{parentName:"ul"},"Nominator: Can select the validators the pool nominates."),(0,i.kt)("li",{parentName:"ul"},"Bouncer: Can change the pool\u2019s state and kick (permissionlessly unbond/withdraw) members if the\npool is blocked."),(0,i.kt)("li",{parentName:"ul"},"Root: Can change the nominator, bouncer, or itself. Further, it can perform any of the actions the\nnominator or bouncer can.")),(0,i.kt)("h3",{id:"pool-commissions"},"Pool Commissions"),(0,i.kt)("p",null,"As 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 ",(0,i.kt)("a",{parentName:"p",href:"/docs/staking-dashboard#pools"},"Polkadot Staking Dashboard"),"."),(0,i.kt)("p",null,"Three methods can be used when setting the pool commission:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Commission Rate")," (",(0,i.kt)("inlineCode",{parentName:"li"},"nominationPools.setCommission")," extrinsic): the start or new commission rate\n(",(0,i.kt)("inlineCode",{parentName:"li"},"newCommission")," parameter) that can be set between 0% and\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.nominationPools.globalMaxCommission",defaultValue:1e8,filter:"percentage",mdxType:"RPC"}),"%\n(decided through ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-polkadot-opengov"},"governance referendum"),") via the\n",(0,i.kt)("a",{parentName:"li",href:"https://paritytech.github.io/substrate/master/pallet_nomination_pools/pallet/type.GlobalMaxCommission.html"},(0,i.kt)("inlineCode",{parentName:"a"},"globalMaxCommission")),"\nparameter. You will need to specify an Input Payee Account, i.e. the account that will receive the\ncommission."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Max Commission")," (",(0,i.kt)("inlineCode",{parentName:"li"},"nominationPools.setCommissionMax")," extrinsic): the maximum commission\n(",(0,i.kt)("inlineCode",{parentName:"li"},"maxCommission")," parameter) the pool will apply to its members (between 0% and Max Commission).\nNote that once set, ",(0,i.kt)("strong",{parentName:"li"},"the pool admin can only lower it"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Change Rate")," (",(0,i.kt)("inlineCode",{parentName:"li"},"nominationPools.setCommissionChangeRate")," extrinsic): the maximum rate increase\n(",(0,i.kt)("inlineCode",{parentName:"li"},"maxIncrease")," parameter) allowed for a single commission update. Note that once set, ",(0,i.kt)("strong",{parentName:"li"},"the pool\nadmin can only lower it"),". When setting the Change Rate, it will also be possible to set a\n",(0,i.kt)("inlineCode",{parentName:"li"},"minDelay")," quantified as the number of blocks (since last commission update) after which it is\npossible to change the commission (i.e. the minimum delay between commission updates). Note that\nonce set, ",(0,i.kt)("strong",{parentName:"li"},"the pool admin can only increase it"),".")),(0,i.kt)("p",null,"Max 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."),(0,i.kt)("admonition",{title:"Max Commission and Change Rate are currently permanent",type:"warning"},(0,i.kt)("p",{parentName:"admonition"},"Once the Max Commission and the Change Rate are set, the pool admin currently can only decrease\nthose values. The minimum delay between commission updates can only be increased. The situation can\nchange in the future and a ",(0,i.kt)("inlineCode",{parentName:"p"},"forceSetCommissionMax")," method can be proposed through governance\nreferendum.")),(0,i.kt)("p",null,"Let'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:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"The pool commission can be increased by 1% every 30 minutes. Bigger increases are not allowed.\nIncreases of less than or equal to 1% are not allowed sooner than 30 minutes since the last\ncommission update."),(0,i.kt)("li",{parentName:"ul"},"The Max Commission can only be decreased from 100%. Once decreased, it can be decreased again but\nit cannot be increased."),(0,i.kt)("li",{parentName:"ul"},"The Change Rate's maximum increase can only be decreased from 1%. Once decreased, it can be\ndecreased again but it cannot be increased."),(0,i.kt)("li",{parentName:"ul"},"The Change Rate's minimum delay between updates of 30 min can only be increased. Once increased,\nit can be increased again but it cannot be decreased.")),(0,i.kt)("h2",{id:"pool-lifecycle"},"Pool Lifecycle"),(0,i.kt)("admonition",{title:"Advanced How-to Guides",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"See ",(0,i.kt)("a",{parentName:"p",href:"./learn-guides-staking-pools#pool-creation"},"this page")," for more information about the lifecycle\nof nomination pools. The cycle includes creation, upkeep and destruction.")),(0,i.kt)("h2",{id:"nomination-pools---slashing"},"Nomination Pools - Slashing"),(0,i.kt)("p",null,"Suppose the staking system slashes a pool\u2019s underlying nomination account. In that case, the slash\nis distributed evenly across the bonded pool, and the unbonding pools from slash era+1 through the\nslash apply era. Thus, any member who either a) was unbonding or b) was actively bonded in the\naforementioned range of eras will be affected by the slash. In other words, a member who may have\nbeen actively bonded during the offence is slashed pro rata based on its stake relative to the total\nslash amount."),(0,i.kt)("p",null,"Unbonding 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."),(0,i.kt)("p",null,"This 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."),(0,i.kt)("h2",{id:"nominating-vs-joining-a-pool"},"Nominating vs Joining a Pool"),(0,i.kt)("p",null,"Nominating is the action of choosing validators. It does not simply involve bonding tokens.\nNominating is an active task, which implies that you regularly monitor that your stake is backing an\nactive validator in all the eras and check if you are receiving your staking rewards. More\nimportantly, ensure that the validators you chose always act in the best interests of the network\nprotocol and have less chance of getting slashed. To nominate, you need a minimum of\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.minNominatorBond",defaultValue:1e11,filter:"humanReadable",mdxType:"RPC"}),"",",\nand to receive rewards, you need at least a balance greater than the minimum active bond. Depending\non your validators, if your active validator is oversubscribed, you will earn rewards only if your\nstake is within that of the top\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"","\nnominators. If the validator misbehaves, It is worth noting that your stake is subject to slashing,\nirrespective of whether you are at the top\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"","\nnominators or not."),(0,i.kt)("p",null,"As the minimum active bond is a dynamic value, it can make your nomination inactive when the\nthreshold goes above your bonded balance. Hence, to be eligible to earn rewards while nominating,\nyou would need to stake a much higher balance than the minimum active bond."),(0,i.kt)("p",null,"Nomination pools are a way to participate in staking with as little as 1 DOT and earn staking\nrewards. Nomination pools differ from custodial solutions (like staking through central exchanges)\nbecause they are non-custodial, native to Polkadot's protocol, permissionless, transparent, and run\nin a decentralized way by the community. Before 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."),(0,i.kt)("admonition",{title:"Minimum Active Nomination Value is Dynamic",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The minimum amount required to become an active nominator and earn rewards is\n",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.minimumActiveStake",defaultValue:2937e9,filter:"humanReadable",mdxType:"RPC"})),".\n","\nIf you have less DOT than the minimum active\nnomination and still want to participate in staking, you can join the nomination pools. You can now\nstake on Polkadot natively with just\n",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)(r.Z,{network:"polkadot",path:"query.nominationPools.minJoinBond",filter:"humanReadable",defaultValue:1e10,mdxType:"RPC"})),"\n","\nin the nomination pools and earn staking rewards. For additional information, see\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/nomination-pools-are-live-stake-natively-with-just-1-dot/"},"this blog post"),".\nCheck the wiki doc on ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pools")," for more information.")),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:"center"},"Nominating"),(0,i.kt)("th",{parentName:"tr",align:"center"},"Joining a Pool"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Minimum 250 DOT to nominate."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Minimum 1 DOT to be a member.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Rewards can be compounded automatically or sent to any account."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Rewards can be manually claimed to the pool member's account and be bonded in the pool again to compound them.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"If the active validator gets slashed, all active nominators are subjected to slashing, also those that do not receive rewards due to the oversubscription issue."),(0,i.kt)("td",{parentName:"tr",align:"center"},"If the active validator gets slashed, all pool members are subjected to slashing.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Can bond and stake DOT indefinitely."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Can bond and stake DOT until the pool exists.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Unbonding period of 28 days. Can switch validators without unbonding."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Unbonding period of 28 days. Need to unbond before switching to a different pool.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Maximum uncapped."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Maximum uncapped.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Should bond more than the ",(0,i.kt)("a",{parentName:"td",href:"/docs/learn-nominator#minimum-active-nomination-to-receive-staking-rewards"},"minimum active nomination")," in an era to be eligible to earn staking rewards, although it can depend on multiple other factors outlined in the linked document."),(0,i.kt)("td",{parentName:"tr",align:"center"},"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 ",(0,i.kt)("a",{parentName:"td",href:"/docs/learn-phragmen"},"the NPoS system")," perspective).")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Staked tokens can be used for participation in Governance."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Staked tokens cannot be used for participation in Governance.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},(0,i.kt)("a",{parentName:"td",href:"/docs/learn-staking-advanced#claiming-rewards"},"Rewards payout")," can be triggered permissionlessly by anyone (typically done by the validator)."),(0,i.kt)("td",{parentName:"tr",align:"center"},"The pool member must claim the rewards.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Bonded funds remain in your account."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Bonded funds are transferred to a pool account which is administered by the network protocol and is not accessible to anyone else. See ",(0,i.kt)("a",{parentName:"td",href:"/docs/learn-account-advanced#system-accounts"},"System Accounts")," for more information.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"Nominator manages the list of staked validators (up to 16)."),(0,i.kt)("td",{parentName:"tr",align:"center"},"Nominations managed by the pool operator.")))))}k.isMDXComponent=!0},85408:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const o=n.p+"assets/images/NPoS-Pools-b758caea750e9e772fe7fcdbd6babeca.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/dbc4065c.6138d82c.js b/assets/js/dbc4065c.6138d82c.js new file mode 100644 index 000000000000..37575559b606 --- /dev/null +++ b/assets/js/dbc4065c.6138d82c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6312],{8654:e=>{e.exports=JSON.parse('{"title":"Tokens and Assets","description":"Everything about tokens and assets on Polkadot.","slug":"/learn-assets-index","permalink":"/docs/learn-assets-index","navigation":{"previous":{"title":"Treasury","permalink":"/docs/learn-polkadot-opengov-treasury"},"next":{"title":"Asset Hub","permalink":"/docs/learn-assets"}}}')}}]); \ No newline at end of file diff --git a/assets/js/dbc4065c.ed91dbbd.js b/assets/js/dbc4065c.ed91dbbd.js deleted file mode 100644 index 881acfa92767..000000000000 --- a/assets/js/dbc4065c.ed91dbbd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[6312],{8654:s=>{s.exports=JSON.parse('{"title":"Tokens and Assets","description":"Everything about tokens and assets on Polkadot.","slug":"/learn-assets-index","permalink":"/docs/learn-assets-index","navigation":{"previous":{"title":"Transaction Fees","permalink":"/docs/learn-transaction-fees"},"next":{"title":"Asset Hub","permalink":"/docs/learn-assets"}}}')}}]); \ No newline at end of file diff --git a/assets/js/eef3f1dd.d65f6427.js b/assets/js/eef3f1dd.d65f6427.js deleted file mode 100644 index a7270f66c630..000000000000 --- a/assets/js/eef3f1dd.d65f6427.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[4097],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>c});var r=a(74165),o=a(15861),n=a(67294),i=a(87152),s=a(17145),l=a(67425);function p(e,t,a){return u.apply(this,arguments)}function u(){return(u=(0,o.Z)((0,r.Z)().mark((function e(t,a,o){var n,l,p,u,d;return(0,r.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return n="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return n="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return n="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return n="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==n){e.next=18;break}return e.abrupt("return");case 18:return p=new i.U(n),e.next=21,s.G.create({provider:p});case 21:u=e.sent,(d=a.split(".")).forEach((function(e){e in u&&(u=u[e])})),e.t1=d[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=u.toString(),e.abrupt("break",35);case 29:return e.next=31,u();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+d[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function d(e,t,a,r){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,r);break;case"precise":(0,l.Precise)(e,a,r);break;case"blocksToDays":(0,l.BlocksToDays)(e,r);break;case"percentage":(0,l.Percentage)(e,r);break;case"arrayLength":(0,l.ArrayLength)(e,r);break;default:return void console.log("Ignoring unknown filter type")}}const c=function(e){var t=e.network,a=e.path,i=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,u=(0,n.useState)(""),c=u[0],m=u[1];return t=t.toLowerCase(),(0,n.useEffect)((function(){void 0!==l?d(i.toString(),l,t,m):m(i.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var n=function(){var e=(0,o.Z)((0,r.Z)().mark((function e(){var o;return(0,r.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p(t,a,m);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?d(o,l,t,m):m(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{n()}catch(s){console.log(s)}}}),[]),c}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,r){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),r((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,r){r(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},7522:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>p,default:()=>k,frontMatter:()=>l,metadata:()=>u,toc:()=>c});var r=a(87462),o=a(63366),n=(a(67294),a(3905)),i=a(47940),s=["components"],l={id:"learn-guides-treasury",title:"Polkadot Treasury How-to Guides",sidebar_label:"Treasury",description:"Advanced How-to Guides about requesting funds from the Polkadot Treasury.",keywords:["opengov","polkadot opengov","referenda","treasury","tipps","bounties"],slug:"../learn-guides-treasury"},p=void 0,u={unversionedId:"learn/learn-guides-treasury",id:"learn/learn-guides-treasury",title:"Polkadot Treasury How-to Guides",description:"Advanced How-to Guides about requesting funds from the Polkadot Treasury.",source:"@site/../docs/learn/learn-guides-treasury.md",sourceDirName:"learn",slug:"/learn-guides-treasury",permalink:"/docs/learn-guides-treasury",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-guides-treasury.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1697113203,formattedLastUpdatedAt:"Oct 12, 2023",frontMatter:{id:"learn-guides-treasury",title:"Polkadot Treasury How-to Guides",sidebar_label:"Treasury",description:"Advanced How-to Guides about requesting funds from the Polkadot Treasury.",keywords:["opengov","polkadot opengov","referenda","treasury","tipps","bounties"],slug:"../learn-guides-treasury"},sidebar:"docs",previous:{title:"OpenGov",permalink:"/docs/learn-guides-polkadot-opengov"},next:{title:"Identity",permalink:"/docs/learn-guides-identity"}},d={},c=[{value:"Creating a Treasury Proposal",id:"creating-a-treasury-proposal",level:2},{value:"Announcing the Proposal",id:"announcing-the-proposal",level:3},{value:"Submit Treasury Proposal Preimage",id:"submit-treasury-proposal-preimage",level:3},{value:"Submit a Treasury Track Referendum",id:"submit-a-treasury-track-referendum",level:3},{value:"Place a Decision Deposit for the Treasury Track Referendum",id:"place-a-decision-deposit-for-the-treasury-track-referendum",level:3},{value:"Requesting Tips from the Treasury",id:"requesting-tips-from-the-treasury",level:2}],m={toc:c},h="wrapper";function k(e){var t=e.components,l=(0,o.Z)(e,s);return(0,n.kt)(h,(0,r.Z)({},m,l,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"creating-a-treasury-proposal"},"Creating a Treasury Proposal"),(0,n.kt)("p",null,"Your 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\n",(0,n.kt)("a",{parentName:"p",href:"https://docs.google.com/document/d/1IZykdp2cyQavcRyZd_dgNj5DcgxgZR6kAqGdcNARu1w"},"guidelines for a successful proposal"),"","\nand fill out the\n",(0,n.kt)("a",{parentName:"p",href:"https://docs.google.com/document/d/1O_84mXYFERCavmnJyxbIPKFkG0bVBySRjCVy-d-VKcc"},"Treasury proposal template"),"\nprovided."),(0,n.kt)("h3",{id:"announcing-the-proposal"},"Announcing the Proposal"),(0,n.kt)("p",null,"To 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:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Many community members participate in discussion in the\n",(0,n.kt)("a",{parentName:"li",href:"https://matrix.to/#/#polkadot-watercooler:web3.foundation"},"Polkadot Watercooler")," and\n",(0,n.kt)("a",{parentName:"li",href:"https://matrix.to/#/#Polkadot-Direction:parity.io"},"Polkadot Direction room"),".\n",""),(0,n.kt)("li",{parentName:"ul"},"Use platforms like ",(0,n.kt)("a",{parentName:"li",href:"https://polkassembly.io"},"Polkassembly")," and\n",(0,n.kt)("a",{parentName:"li",href:"https://www.subsquare.io/"},"SubSquare")," to initiate discussion with the community. They also offer\na gauge poll to capture the community sentiment before submitting an on-chain referendum.")),(0,n.kt)("p",null,"Spreading the word about the proposal's explanation to the community is ultimately up to the\nproposer."),(0,n.kt)("admonition",{title:"Use Accounts with Verified On-Chain Identity for Treasury Proposals",type:"tip"},(0,n.kt)("p",{parentName:"admonition"},"To ensure legitimacy, it is required that the account linked to the Treasury proposal has an\n",(0,n.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181981-how-to-set-and-clear-an-identity"},"identity set"),"\nand is\n",(0,n.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181990-how-to-request-and-cancel-identity-judgement"},"verified by an on-chain registrar"),".")),(0,n.kt)("h3",{id:"submit-treasury-proposal-preimage"},"Submit Treasury Proposal Preimage"),(0,n.kt)("p",null,"The example below shows how to create a ",(0,n.kt)("a",{parentName:"p",href:"../general/glossary#preimage"},"preimage")," for a transaction\nthat requests 100 DOT from Treasury."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Navigate to ",(0,n.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/preimages"},"Polkadot-JS UI > Governance > Preimages"),"\nand then click on Add Preimage."),(0,n.kt)("li",{parentName:"ul"},"Select the account which will be used to submit the preimage."),(0,n.kt)("li",{parentName:"ul"},"Choose ",(0,n.kt)("inlineCode",{parentName:"li"},"treasury"),' pallet in the "propose" dropdown and the ',(0,n.kt)("inlineCode",{parentName:"li"},"spend(amount, beneficiary)"),"call"),(0,n.kt)("li",{parentName:"ul"},"Enter the DOT amount."),(0,n.kt)("li",{parentName:"ul"},"Enter the AccountID of the beneficiary (which has a verified on-chain identity)."),(0,n.kt)("li",{parentName:"ul"},"Submit preimage"),(0,n.kt)("li",{parentName:"ul"},"Sign and submit the transaction by paying the specified transaction fees.")),(0,n.kt)("admonition",{title:"Preimage Submission Deposit",type:"info"},(0,n.kt)("p",{parentName:"admonition"},"A deposit is required for the preimage to be stored on chain. The preimage deposit is proportional\nto the amount of information stored within the preimage. The deposit amount required for a preimage\nwith a treasury spend transaction is around\n41 DOT. Ensure you have enough account\nbalance to pay for the submission deposit and the transaction fees.")),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Treasury Preimage",src:a(95773).Z,width:"2147",height:"1199"})),(0,n.kt)("p",null,"After successful submission of the preimage, it is displayed on Polkadot-JS UI > 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."),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Treasury Preimage Hash",src:a(83601).Z,width:"2879",height:"453"})),(0,n.kt)("h3",{id:"submit-a-treasury-track-referendum"},"Submit a Treasury Track Referendum"),(0,n.kt)("p",null,"The example below shows how to submit a Treasury track referendum."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Navigate to ",(0,n.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/referenda"},"Polkadot-JS UI > Governance > Referenda"),"\nand then click on Submit proposal."),(0,n.kt)("li",{parentName:"ul"},"Select the account which will be used to submit the proposal."),(0,n.kt)("li",{parentName:"ul"},"Choose the appropriate submission track (The example below selected Small Spender track)."),(0,n.kt)("li",{parentName:"ul"},"Enter the preimage hash of the treasury spend transaction.(If the preimage exists on-chain, the\npreimage length box is automatically populated)"),(0,n.kt)("li",{parentName:"ul"},"Click on Submit proposal."),(0,n.kt)("li",{parentName:"ul"},"Sign and submit the transaction.")),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Submit Treasury Proposal",src:a(67847).Z,width:"2141",height:"1238"})),(0,n.kt)("p",null,"Once your submission is executed, your referendum will appear under your chosen track on the\nPolkadot-JS UI ",(0,n.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/referenda"},"referenda page"),"."),(0,n.kt)("h3",{id:"place-a-decision-deposit-for-the-treasury-track-referendum"},"Place a Decision Deposit for the Treasury Track Referendum"),(0,n.kt)("p",null,"For 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",(0,n.kt)("a",{parentName:"p",href:"./learn-polkadot-opengov-treasury#treasury-tracks"},"Treasury Tracks")," are listed in a section above\nin this document."),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Submit Treasury Proposal Decision Deposit",src:a(49431).Z,width:"2133",height:"168"})),(0,n.kt)("p",null,"The preimage and decision deposits\n",(0,n.kt)("a",{parentName:"p",href:"/docs/learn-guides-polkadot-opengov#claiming-the-preimage-and-decision-deposits"},"can be claimed once the referendum ends"),"."),(0,n.kt)("h2",{id:"requesting-tips-from-the-treasury"},"Requesting Tips from the Treasury"),(0,n.kt)("p",null,"To request a tip funded by the treasury, you can follow the above steps for\n",(0,n.kt)("a",{parentName:"p",href:"#creating-a-treasury-proposal"},"creating a treasury proposal")," but instead of submitting the proposal\nto the ",(0,n.kt)("inlineCode",{parentName:"p"},"32 / Small Spender")," track, you will need to submit it to the ",(0,n.kt)("inlineCode",{parentName:"p"},"30 / Small Tipper")," or\n",(0,n.kt)("inlineCode",{parentName:"p"},"31 / Big Tipper")," tracks depending on the number of tokens to be requested."),(0,n.kt)("p",null,"Briefly, you will need to:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Create a preimage using the ",(0,n.kt)("inlineCode",{parentName:"li"},"treasury.Spend")," extrinsic and specifying the number of tokens and the\nbeneficiary of the tip"),(0,n.kt)("li",{parentName:"ul"},"Submit a proposal to the right track (i.e. ",(0,n.kt)("inlineCode",{parentName:"li"},"30")," or ",(0,n.kt)("inlineCode",{parentName:"li"},"31"),") using the preimage hash"),(0,n.kt)("li",{parentName:"ul"},"Once you started the referendum go to ",(0,n.kt)("a",{parentName:"li",href:"https://polkassembly.io/"},"Polkassembly"),", log in with the\nproposer account and edit the referendum details"),(0,n.kt)("li",{parentName:"ul"},"Notify the\n",(0,n.kt)("a",{parentName:"li",href:"https://matrix.to/#/#Polkadot-Direction:parity.io"},"Polkadot Direction Element Channel"),"","\nabout your referendum"),(0,n.kt)("li",{parentName:"ul"},"Place the decision deposit before the\n",(0,n.kt)(i.Z,{network:"polkadot",path:"const.referenda.undecidingTimeout",defaultValue:201600,filter:"blocksToDays",mdxType:"RPC"}),"","-day\ntimeout"),(0,n.kt)("li",{parentName:"ul"},"Once the referendum ends you can\n",(0,n.kt)("a",{parentName:"li",href:"/docs/learn-guides-polkadot-opengov#claiming-the-preimage-and-decision-deposits"},"claim the preimage and decision deposits back"))))}k.isMDXComponent=!0},67847:(e,t,a)=>{"use strict";a.d(t,{Z:()=>r});const r=a.p+"assets/images/submit-proposal-treasury-3948a231c4f3162a8680ad052af9e903.png"},83601:(e,t,a)=>{"use strict";a.d(t,{Z:()=>r});const r=a.p+"assets/images/treasury-preimage-hash-05bb427d21d3ecf7d5e38418a0a0f4ed.png"},95773:(e,t,a)=>{"use strict";a.d(t,{Z:()=>r});const r=a.p+"assets/images/treasury-preimage-3024cca2a7b9593c35b4d44e64d9414e.png"},49431:(e,t,a)=>{"use strict";a.d(t,{Z:()=>r});const r=a.p+"assets/images/treasury-proposal-decision-deposit-849d27481ba0134acf743f7474d8f6a4.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/eef3f1dd.f09334c9.js b/assets/js/eef3f1dd.f09334c9.js new file mode 100644 index 000000000000..08163387a3f9 --- /dev/null +++ b/assets/js/eef3f1dd.f09334c9.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[4097],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>c});var r=a(74165),o=a(15861),n=a(67294),i=a(87152),s=a(17145),l=a(67425);function p(e,t,a){return u.apply(this,arguments)}function u(){return(u=(0,o.Z)((0,r.Z)().mark((function e(t,a,o){var n,l,p,u,d;return(0,r.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return n="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return n="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return n="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return n="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==n){e.next=18;break}return e.abrupt("return");case 18:return p=new i.U(n),e.next=21,s.G.create({provider:p});case 21:u=e.sent,(d=a.split(".")).forEach((function(e){e in u&&(u=u[e])})),e.t1=d[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=u.toString(),e.abrupt("break",35);case 29:return e.next=31,u();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+d[0]+") in "+a);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function d(e,t,a,r){switch(t){case"humanReadable":(0,l.HumanReadable)(e,a,r);break;case"precise":(0,l.Precise)(e,a,r);break;case"blocksToDays":(0,l.BlocksToDays)(e,r);break;case"percentage":(0,l.Percentage)(e,r);break;case"permillToPercent":(0,l.PermillToPercent)(e,r);break;case"arrayLength":(0,l.ArrayLength)(e,r);break;default:return void console.log("Ignoring unknown filter type")}}const c=function(e){var t=e.network,a=e.path,i=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,u=(0,n.useState)(""),c=u[0],m=u[1];return t=t.toLowerCase(),(0,n.useEffect)((function(){void 0!==l?d(i.toString(),l,t,m):m(i.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var n=function(){var e=(0,o.Z)((0,r.Z)().mark((function e(){var o;return(0,r.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p(t,a,m);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?d(o,l,t,m):m(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{n()}catch(s){console.log(s)}}}),[]),c}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,r){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),r((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,r){r(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},7522:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>p,default:()=>k,frontMatter:()=>l,metadata:()=>u,toc:()=>c});var r=a(87462),o=a(63366),n=(a(67294),a(3905)),i=a(47940),s=["components"],l={id:"learn-guides-treasury",title:"Polkadot Treasury How-to Guides",sidebar_label:"Treasury",description:"Advanced How-to Guides about requesting funds from the Polkadot Treasury.",keywords:["opengov","polkadot opengov","referenda","treasury","tipps","bounties"],slug:"../learn-guides-treasury"},p=void 0,u={unversionedId:"learn/learn-guides-treasury",id:"learn/learn-guides-treasury",title:"Polkadot Treasury How-to Guides",description:"Advanced How-to Guides about requesting funds from the Polkadot Treasury.",source:"@site/../docs/learn/learn-guides-treasury.md",sourceDirName:"learn",slug:"/learn-guides-treasury",permalink:"/docs/learn-guides-treasury",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-guides-treasury.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1697709829,formattedLastUpdatedAt:"Oct 19, 2023",frontMatter:{id:"learn-guides-treasury",title:"Polkadot Treasury How-to Guides",sidebar_label:"Treasury",description:"Advanced How-to Guides about requesting funds from the Polkadot Treasury.",keywords:["opengov","polkadot opengov","referenda","treasury","tipps","bounties"],slug:"../learn-guides-treasury"},sidebar:"docs",previous:{title:"OpenGov",permalink:"/docs/learn-guides-polkadot-opengov"},next:{title:"Identity",permalink:"/docs/learn-guides-identity"}},d={},c=[{value:"Creating a Treasury Proposal",id:"creating-a-treasury-proposal",level:2},{value:"Announcing the Proposal",id:"announcing-the-proposal",level:3},{value:"Submit Treasury Proposal Preimage",id:"submit-treasury-proposal-preimage",level:3},{value:"Submit a Treasury Track Referendum",id:"submit-a-treasury-track-referendum",level:3},{value:"Place a Decision Deposit for the Treasury Track Referendum",id:"place-a-decision-deposit-for-the-treasury-track-referendum",level:3},{value:"Requesting Tips from the Treasury",id:"requesting-tips-from-the-treasury",level:2}],m={toc:c},h="wrapper";function k(e){var t=e.components,l=(0,o.Z)(e,s);return(0,n.kt)(h,(0,r.Z)({},m,l,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"creating-a-treasury-proposal"},"Creating a Treasury Proposal"),(0,n.kt)("p",null,"Your 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\n",(0,n.kt)("a",{parentName:"p",href:"https://docs.google.com/document/d/1IZykdp2cyQavcRyZd_dgNj5DcgxgZR6kAqGdcNARu1w"},"guidelines for a successful proposal"),"","\nand fill out the\n",(0,n.kt)("a",{parentName:"p",href:"https://docs.google.com/document/d/1O_84mXYFERCavmnJyxbIPKFkG0bVBySRjCVy-d-VKcc"},"Treasury proposal template"),"\nprovided."),(0,n.kt)("h3",{id:"announcing-the-proposal"},"Announcing the Proposal"),(0,n.kt)("p",null,"To 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:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Many community members participate in discussion in the\n",(0,n.kt)("a",{parentName:"li",href:"https://matrix.to/#/#polkadot-watercooler:web3.foundation"},"Polkadot Watercooler")," and\n",(0,n.kt)("a",{parentName:"li",href:"https://matrix.to/#/#Polkadot-Direction:parity.io"},"Polkadot Direction room"),".\n",""),(0,n.kt)("li",{parentName:"ul"},"Use platforms like ",(0,n.kt)("a",{parentName:"li",href:"https://polkassembly.io"},"Polkassembly")," and\n",(0,n.kt)("a",{parentName:"li",href:"https://www.subsquare.io/"},"SubSquare")," to initiate discussion with the community. They also offer\na gauge poll to capture the community sentiment before submitting an on-chain referendum.")),(0,n.kt)("p",null,"Spreading the word about the proposal's explanation to the community is ultimately up to the\nproposer."),(0,n.kt)("admonition",{title:"Use Accounts with Verified On-Chain Identity for Treasury Proposals",type:"tip"},(0,n.kt)("p",{parentName:"admonition"},"To ensure legitimacy, it is required that the account linked to the Treasury proposal has an\n",(0,n.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181981-how-to-set-and-clear-an-identity"},"identity set"),"\nand is\n",(0,n.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181990-how-to-request-and-cancel-identity-judgement"},"verified by an on-chain registrar"),".")),(0,n.kt)("h3",{id:"submit-treasury-proposal-preimage"},"Submit Treasury Proposal Preimage"),(0,n.kt)("p",null,"The example below shows how to create a ",(0,n.kt)("a",{parentName:"p",href:"../general/glossary#preimage"},"preimage")," for a transaction\nthat requests 100 DOT from Treasury."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Navigate to ",(0,n.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/preimages"},"Polkadot-JS UI > Governance > Preimages"),"\nand then click on Add Preimage."),(0,n.kt)("li",{parentName:"ul"},"Select the account which will be used to submit the preimage."),(0,n.kt)("li",{parentName:"ul"},"Choose ",(0,n.kt)("inlineCode",{parentName:"li"},"treasury"),' pallet in the "propose" dropdown and the ',(0,n.kt)("inlineCode",{parentName:"li"},"spend(amount, beneficiary)"),"call"),(0,n.kt)("li",{parentName:"ul"},"Enter the DOT amount."),(0,n.kt)("li",{parentName:"ul"},"Enter the AccountID of the beneficiary (which has a verified on-chain identity)."),(0,n.kt)("li",{parentName:"ul"},"Submit preimage"),(0,n.kt)("li",{parentName:"ul"},"Sign and submit the transaction by paying the specified transaction fees.")),(0,n.kt)("admonition",{title:"Preimage Submission Deposit",type:"info"},(0,n.kt)("p",{parentName:"admonition"},"A deposit is required for the preimage to be stored on chain. The preimage deposit is proportional\nto the amount of information stored within the preimage. The deposit amount required for a preimage\nwith a treasury spend transaction is around\n41 DOT. Ensure you have enough account\nbalance to pay for the submission deposit and the transaction fees.")),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Treasury Preimage",src:a(95773).Z,width:"2147",height:"1199"})),(0,n.kt)("p",null,"After successful submission of the preimage, it is displayed on Polkadot-JS UI > 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."),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Treasury Preimage Hash",src:a(83601).Z,width:"2879",height:"453"})),(0,n.kt)("h3",{id:"submit-a-treasury-track-referendum"},"Submit a Treasury Track Referendum"),(0,n.kt)("p",null,"The example below shows how to submit a Treasury track referendum."),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Navigate to ",(0,n.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/referenda"},"Polkadot-JS UI > Governance > Referenda"),"\nand then click on Submit proposal."),(0,n.kt)("li",{parentName:"ul"},"Select the account which will be used to submit the proposal."),(0,n.kt)("li",{parentName:"ul"},"Choose the appropriate submission track (The example below selected Small Spender track)."),(0,n.kt)("li",{parentName:"ul"},"Enter the preimage hash of the treasury spend transaction.(If the preimage exists on-chain, the\npreimage length box is automatically populated)"),(0,n.kt)("li",{parentName:"ul"},"Click on Submit proposal."),(0,n.kt)("li",{parentName:"ul"},"Sign and submit the transaction.")),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Submit Treasury Proposal",src:a(67847).Z,width:"2141",height:"1238"})),(0,n.kt)("p",null,"Once your submission is executed, your referendum will appear under your chosen track on the\nPolkadot-JS UI ",(0,n.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/referenda"},"referenda page"),"."),(0,n.kt)("h3",{id:"place-a-decision-deposit-for-the-treasury-track-referendum"},"Place a Decision Deposit for the Treasury Track Referendum"),(0,n.kt)("p",null,"For 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",(0,n.kt)("a",{parentName:"p",href:"./learn-polkadot-opengov-treasury#treasury-tracks"},"Treasury Tracks")," are listed in a section above\nin this document."),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Submit Treasury Proposal Decision Deposit",src:a(49431).Z,width:"2133",height:"168"})),(0,n.kt)("p",null,"The preimage and decision deposits\n",(0,n.kt)("a",{parentName:"p",href:"/docs/learn-guides-polkadot-opengov#claiming-the-preimage-and-decision-deposits"},"can be claimed once the referendum ends"),"."),(0,n.kt)("h2",{id:"requesting-tips-from-the-treasury"},"Requesting Tips from the Treasury"),(0,n.kt)("p",null,"To request a tip funded by the treasury, you can follow the above steps for\n",(0,n.kt)("a",{parentName:"p",href:"#creating-a-treasury-proposal"},"creating a treasury proposal")," but instead of submitting the proposal\nto the ",(0,n.kt)("inlineCode",{parentName:"p"},"32 / Small Spender")," track, you will need to submit it to the ",(0,n.kt)("inlineCode",{parentName:"p"},"30 / Small Tipper")," or\n",(0,n.kt)("inlineCode",{parentName:"p"},"31 / Big Tipper")," tracks depending on the number of tokens to be requested."),(0,n.kt)("p",null,"Briefly, you will need to:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Create a preimage using the ",(0,n.kt)("inlineCode",{parentName:"li"},"treasury.Spend")," extrinsic and specifying the number of tokens and the\nbeneficiary of the tip"),(0,n.kt)("li",{parentName:"ul"},"Submit a proposal to the right track (i.e. ",(0,n.kt)("inlineCode",{parentName:"li"},"30")," or ",(0,n.kt)("inlineCode",{parentName:"li"},"31"),") using the preimage hash"),(0,n.kt)("li",{parentName:"ul"},"Once you started the referendum go to ",(0,n.kt)("a",{parentName:"li",href:"https://polkassembly.io/"},"Polkassembly"),", log in with the\nproposer account and edit the referendum details"),(0,n.kt)("li",{parentName:"ul"},"Notify the\n",(0,n.kt)("a",{parentName:"li",href:"https://matrix.to/#/#Polkadot-Direction:parity.io"},"Polkadot Direction Element Channel"),"","\nabout your referendum"),(0,n.kt)("li",{parentName:"ul"},"Place the decision deposit before the\n",(0,n.kt)(i.Z,{network:"polkadot",path:"consts.referenda.undecidingTimeout",defaultValue:201600,filter:"blocksToDays",mdxType:"RPC"}),"","-day\ntimeout"),(0,n.kt)("li",{parentName:"ul"},"Once the referendum ends you can\n",(0,n.kt)("a",{parentName:"li",href:"/docs/learn-guides-polkadot-opengov#claiming-the-preimage-and-decision-deposits"},"claim the preimage and decision deposits back"))))}k.isMDXComponent=!0},67847:(e,t,a)=>{"use strict";a.d(t,{Z:()=>r});const r=a.p+"assets/images/submit-proposal-treasury-3948a231c4f3162a8680ad052af9e903.png"},83601:(e,t,a)=>{"use strict";a.d(t,{Z:()=>r});const r=a.p+"assets/images/treasury-preimage-hash-05bb427d21d3ecf7d5e38418a0a0f4ed.png"},95773:(e,t,a)=>{"use strict";a.d(t,{Z:()=>r});const r=a.p+"assets/images/treasury-preimage-3024cca2a7b9593c35b4d44e64d9414e.png"},49431:(e,t,a)=>{"use strict";a.d(t,{Z:()=>r});const r=a.p+"assets/images/treasury-proposal-decision-deposit-849d27481ba0134acf743f7474d8f6a4.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/f2521980.0e2eb0b4.js b/assets/js/f2521980.0e2eb0b4.js deleted file mode 100644 index 59b4711c6151..000000000000 --- a/assets/js/f2521980.0e2eb0b4.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[6689],{47940:(t,e,a)=>{"use strict";a.d(e,{Z:()=>k});var o=a(74165),n=a(15861),r=a(67294),i=a(87152),s=a(17145),l=a(67425);function d(t,e,a){return p.apply(this,arguments)}function p(){return(p=(0,n.Z)((0,o.Z)().mark((function t(e,a,n){var r,l,d,p,c;return(0,o.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:r=void 0,l=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){t.next=18;break}return t.abrupt("return");case 18:return d=new i.U(r),t.next=21,s.G.create({provider:d});case 21:p=t.sent,(c=a.split(".")).forEach((function(t){t in p&&(p=p[t])})),t.t1=c[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return l=p.toString(),t.abrupt("break",35);case 29:return t.next=31,p();case 31:return l=(l=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+a);case 35:return t.abrupt("return",l);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function c(t,e,a,o){switch(e){case"humanReadable":(0,l.HumanReadable)(t,a,o);break;case"precise":(0,l.Precise)(t,a,o);break;case"blocksToDays":(0,l.BlocksToDays)(t,o);break;case"percentage":(0,l.Percentage)(t,o);break;case"arrayLength":(0,l.ArrayLength)(t,o);break;default:return void console.log("Ignoring unknown filter type")}}const k=function(t){var e=t.network,a=t.path,i=t.defaultValue,s=t.filter,l=void 0===s?void 0:s,p=(0,r.useState)(""),k=p[0],u=p[1];return e=e.toLowerCase(),(0,r.useEffect)((function(){void 0!==l?c(i.toString(),l,e,u):u(i.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var t=(0,n.Z)((0,o.Z)().mark((function t(){var n;return(0,o.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,d(e,a,u);case 2:if(void 0!==(n=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==l?c(n,l,e,u):u(n);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{r()}catch(s){console.log(s)}}}),[]),k}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,a,o){var n=void 0;if("polkadot"===a||"statemint"===a)n=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");n=6}t=parseFloat(t),o((t=Number.isInteger(t/e[a].precision)?t/e[a].precision+" "+e[a].symbol:(t/e[a].precision).toFixed(n)+" "+e[a].symbol).toString())},Precise:function(t,a,o){o(t=(t=parseFloat(t))/e[a].precision+" "+e[a].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},24595:(t,e,a)=>{"use strict";a.r(e),a.d(e,{assets:()=>c,contentTitle:()=>d,default:()=>m,frontMatter:()=>l,metadata:()=>p,toc:()=>k});var o=a(87462),n=a(63366),r=(a(67294),a(3905)),i=a(47940),s=["components"],l={id:"getting-started",title:"Getting Started",sidebar_label:"Getting Started",description:"Get started with Polkadot and Web3.",keywords:["introduction","getting started","what is polkadot","why polkadot"],slug:"../getting-started"},d=void 0,p={unversionedId:"general/getting-started",id:"general/getting-started",title:"Getting Started",description:"Get started with Polkadot and Web3.",source:"@site/../docs/general/getting-started.md",sourceDirName:"general",slug:"/getting-started",permalink:"/docs/getting-started",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/general/getting-started.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696484972,formattedLastUpdatedAt:"Oct 5, 2023",frontMatter:{id:"getting-started",title:"Getting Started",sidebar_label:"Getting Started",description:"Get started with Polkadot and Web3.",keywords:["introduction","getting started","what is polkadot","why polkadot"],slug:"../getting-started"},sidebar:"docs",previous:{title:"General",permalink:"/docs/general-index"},next:{title:"Web3 and Polkadot",permalink:"/docs/web3-and-polkadot"}},c={},k=[{value:"Interact with Polkadot",id:"interact-with-polkadot",level:2},{value:"What is Polkadot?",id:"what-is-polkadot",level:2},{value:"What can I do with my DOT?",id:"what-can-i-do-with-my-dot",level:2},{value:"Polkadot Gifts",id:"polkadot-gifts",level:2},{value:"Why should you use Polkadot?",id:"why-should-you-use-polkadot",level:2},{value:"Where to start learning?",id:"where-to-start-learning",level:2},{value:"Brand-New Polkadot learners",id:"brand-new-polkadot-learners",level:3},{value:"Resources",id:"resources",level:2}],u={toc:k},h="wrapper";function m(t){var e=t.components,a=(0,n.Z)(t,s);return(0,r.kt)(h,(0,o.Z)({},u,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("admonition",{title:"Welcome to the Polkadot Wiki",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The Polkadot Wiki serves as the central source of truth for Polkadot. It is a community-focused\ninitiative led by Web3 Foundation to keep an up-to-date resource on the best information for\nlearning, building, and maintaining on Polkadot."),(0,r.kt)("p",{parentName:"admonition"},"The Wiki has three main sections:"),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"./learn-index"},(0,r.kt)("strong",{parentName:"a"},"Learn"))," (for people who want to learn about Polkadot)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/docs/build-index"},(0,r.kt)("strong",{parentName:"a"},"Build"))," (for people who want to build on Polkadot)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/docs/maintain-index"},(0,r.kt)("strong",{parentName:"a"},"Maintain"))," (for people who want to maintain the Polkadot\nnetwork)."))),(0,r.kt)("h2",{id:"interact-with-polkadot"},"Interact with Polkadot"),(0,r.kt)("tr",{class:"cards-container"},(0,r.kt)("td",null,(0,r.kt)("a",{class:"guide-link",href:"../docs/learn-account-generation"},(0,r.kt)("img",{src:"/img/polkadot-guide/Account.jpg",alt:"Drawing",width:"250",height:"150"}),(0,r.kt)("div",{class:"cards-body"},(0,r.kt)("h5",{class:"cards-title"},"Creating an Account")))),(0,r.kt)("td",null,(0,r.kt)("a",{class:"guide-link",href:"../docs/learn-balance-transfers"},(0,r.kt)("img",{src:"/img/polkadot-guide/Transfer.jpg",alt:"Drawing",width:"250",height:"150"}),(0,r.kt)("div",{class:"cards-body"},(0,r.kt)("h5",{class:"cards-title"},"Balance Transfers")))),(0,r.kt)("td",null,(0,r.kt)("a",{class:"guide-link",href:"../docs/learn-staking"},(0,r.kt)("img",{class:"guide-image",src:"/img/polkadot-guide/Stake.jpg",alt:"Drawing",width:"250",height:"150"}),(0,r.kt)("div",{class:"cards-body"},(0,r.kt)("h5",{class:"cards-title"},"Staking"))))),(0,r.kt)("br",null),(0,r.kt)("tr",{class:"cards-container"},(0,r.kt)("td",null,(0,r.kt)("a",{class:"guide-link",href:"../docs/learn-polkadot-opengov"},(0,r.kt)("img",{class:"guide-image",src:"/img/polkadot-guide/Council.jpg",alt:"Drawing",width:"250",height:"150"}),(0,r.kt)("div",{class:"cards-body"},(0,r.kt)("h5",{class:"cards-title"},"Polkadot OpenGov")))),(0,r.kt)("td",null,(0,r.kt)("a",{class:"guide-link",href:"../docs/learn-proxies"},(0,r.kt)("img",{class:"guide-image",src:"/img/polkadot-guide/Proxy.jpg",alt:"Drawing",width:"250",height:"150"}),(0,r.kt)("div",{class:"cards-body"},(0,r.kt)("h5",{class:"cards-title"},"Proxy Accounts")))),(0,r.kt)("td",null,(0,r.kt)("a",{class:"guide-link",href:"../docs/learn-identity"},(0,r.kt)("img",{class:"guide-image",src:"/img/polkadot-guide/Identity.jpg",alt:"Drawing",width:"250",height:"150"}),(0,r.kt)("div",{class:"cards-body"},(0,r.kt)("h5",{class:"cards-title"},"Set an Identity"))))),(0,r.kt)("br",null),(0,r.kt)("tr",{class:"cards-container"},(0,r.kt)("td",null,(0,r.kt)("a",{class:"guide-link",href:"../docs/learn-parachains"},(0,r.kt)("img",{class:"guide-image",src:"/img/polkadot-guide/Parachain.jpg",alt:"Drawing",width:"250",height:"150"}),(0,r.kt)("div",{class:"cards-body"},(0,r.kt)("h5",{class:"cards-title"},"Parachains")))),(0,r.kt)("td",null,(0,r.kt)("a",{class:"guide-link",href:"../docs/learn-bridges"},(0,r.kt)("img",{class:"guide-image",src:"/img/polkadot-guide/Bridges.jpg",alt:"Drawing",width:"250",height:"150"}),(0,r.kt)("div",{class:"cards-body"},(0,r.kt)("h5",{class:"cards-title"},"Bridges")))),(0,r.kt)("td",null,(0,r.kt)("a",{class:"guide-link",href:"../docs/ambassadors"},(0,r.kt)("img",{class:"guide-image",src:"/img/polkadot-guide/Ambassadors.jpg",alt:"Drawing",width:"250",height:"150"}),(0,r.kt)("div",{class:"cards-body"},(0,r.kt)("h5",{class:"cards-title"},"Become an Ambassador"))))),(0,r.kt)("br",null),(0,r.kt)("h2",{id:"what-is-polkadot"},"What is Polkadot?"),(0,r.kt)("p",null,"Polkadot is the first layer-0 (L0) blockchain that provides shared security and secure\ninteroperability to layer-1 (L1) blockchains. Those L1 blockchain attached to Polkadot are also\ncalled ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-parachains"},"parachains")," as their transactions are processed in parallel by\nPolkadot. For more information about Polkadot see the dedicated page about the state of\n",(0,r.kt)("a",{parentName:"p",href:"/docs/polkadot-v1"},"Polkadot 1.0")," released in mid 2023."),(0,r.kt)("p",null,"Polkadot has an on-chain ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov"},"open governance")," (also called Polkadot\nOpenGov) to orchestrate decisions, including accessing funds from the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov-treasury"},"treasury"),"."),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-DOT"},"DOT token")," gives you the power to participate in Polkadot OpenGov,\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-staking"},"staking"),", and ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-crowdloans"},"parachains' crowdloans"),"."),(0,r.kt)("p",null,"The level of abstraction and generalization of Polkadot allows to build applications that are\nspecific to their use cases, and for those applications to communicate securely leveraging each\nother value proposition. The trustless cooperation between applications is what makes Polkadot an\nideal ecosystem to build a ",(0,r.kt)("a",{parentName:"p",href:"/docs/web3-and-polkadot"},"web3 future"),"."),(0,r.kt)("p",null,"See the videos below to know more about Polkadot."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=_-k0xkooSlA"},(0,r.kt)("img",{parentName:"a",src:"https://img.youtube.com/vi/_-k0xkooSlA/0.jpg",alt:"Polkadot"}))),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=BQ60bTU1bPg"},(0,r.kt)("img",{parentName:"a",src:"https://img.youtube.com/vi/BQ60bTU1bPg/0.jpg",alt:"Introduction to Polkadot"}))),(0,r.kt)("h2",{id:"what-can-i-do-with-my-dot"},"What can I do with my DOT?"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"/docs/learn-DOT"},"DOT")," is the native token of the Polkadot Network. DOT can be used for\ntransaction fees, staking, governance, acquisition of a parachain slot and for enabling several key\nfunctionalities on Polkadot."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"",(0,r.kt)("strong",{parentName:"p"},(0,r.kt)(i.Z,{network:"polkadot",path:"consts.balances.existentialDeposit",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),":"),"\nthe minimum balance required to have an active account on Polkadot Network. If your account\nbalance drops below the minimum, your account will be reaped. Learn more about\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-accounts"},"Accounts")," and the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/build-protocol-info#existential-deposit"},"Existential Deposit")," requirement.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"",(0,r.kt)("strong",{parentName:"p"},(0,r.kt)(i.Z,{network:"polkadot",path:"query.nominationPools.minJoinBond",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),":"),"\nthe minimum contribution required to join a ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pool"),"\nand earn staking rewards for contributing to the security of the network. Learn more about\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pools"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"",(0,r.kt)("strong",{parentName:"p"},(0,r.kt)(i.Z,{network:"polkadot",path:"consts.crowdloan.minContribution",defaultValue:5e10,filter:"humanReadable",mdxType:"RPC"}),":"),"\nthe minimum contribution required to participate in ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-crowdloans"},"crowdloans")," for\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-auction"},"parachain slot auctions"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Around 20 DOT"),":"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"",(0,r.kt)("strong",{parentName:"li"},(0,r.kt)(i.Z,{network:"polkadot",path:"consts.identity.basicDeposit",defaultValue:20258e7,filter:"humanReadable",mdxType:"RPC"}),":"),"\nregister an ",(0,r.kt)("a",{parentName:"li",href:"/docs/learn-identity"},"on-chain identity")),(0,r.kt)("li",{parentName:"ul"},"",(0,r.kt)("strong",{parentName:"li"},(0,r.kt)(i.Z,{network:"polkadot",path:"consts.proxy.proxyDepositBase",defaultValue:20008e7,filter:"humanReadable",mdxType:"RPC"}),":"),"\ncreate a ",(0,r.kt)("a",{parentName:"li",href:"/docs/learn-proxies"},"proxy account"),"."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"",(0,r.kt)("strong",{parentName:"p"},(0,r.kt)(i.Z,{network:"polkadot",path:"query.staking.minNominatorBond",defaultValue:25e11,filter:"humanReadable",mdxType:"RPC"}),":"),"\nthe minimum stake required to submit your intent to directly nominate validators.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"",(0,r.kt)("strong",{parentName:"p"},(0,r.kt)(i.Z,{network:"polkadot",path:"query.staking.minimumActiveStake",defaultValue:2937e9,filter:"humanReadable",mdxType:"RPC"}),":"),"\nthe minimum amount of DOT required to become an active nominator and earn rewards, i.e. the\nminimum active bond. To increase the chance of earning staking rewards, your stake should not be\nless than the minimum stake among the active nominators, which is a dynamic threshold. If you have\nlesser DOT than the minimum active nomination, please consider contributing to\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pools"),". Learn more about\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-nominator"},"becoming a nominator"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"",(0,r.kt)("strong",{parentName:"p"},(0,r.kt)(i.Z,{network:"polkadot",path:"query.nominationPools.minCreateBond",defaultValue:5e12,filter:"humanReadable",mdxType:"RPC"}),":"),"\nyou can create your own ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pool"),"."))),(0,r.kt)("p",null,"DOT has utility in ",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-democracy"},"Polkadot's democracy"),". Bonding DOT is\na requirement to create proposals, to endorse them and to vote on them when they become referendums.\nBonding\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.treasury.proposalBondMinimum",defaultValue:1e12,filter:"humanReadable",mdxType:"RPC"}),"\nor 5% of requested funding is a requirement to make a\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-treasury#creating-a-treasury-proposal"},"treasury proposal"),". DOT can also enable\nyou to participate in programs like the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/thousand-validators#polkadot"},"Thousand Validators Program"),"."),(0,r.kt)("h2",{id:"polkadot-gifts"},"Polkadot Gifts"),(0,r.kt)("img",{align:"right",src:"/img/polkadot-gift.png",width:"210",height:"200"}),(0,r.kt)("p",null,"Polkadot Gifts provide an easy way to:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Onboard friends or family who are curious about blockchain but haven\u2019t made the leap yet."),(0,r.kt)("li",{parentName:"ul"},"Share your love of Polkadot and send any amount of DOT."),(0,r.kt)("li",{parentName:"ul"},"Say \u2018thank you\u2019 or send someone tokens when you don\u2019t know their address."),(0,r.kt)("li",{parentName:"ul"},"Get friends and family set up to participate in crowdloans.")),(0,r.kt)("p",null,"Learn more about how you can create and send Polkadot Gifts\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/introducing-polkadot-kusama-gifts/"},"here"),"."),(0,r.kt)("h2",{id:"why-should-you-use-polkadot"},"Why should you use Polkadot?"),(0,r.kt)("p",null,"Whether you're a blockchain developer or if you're interested in taking part of\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.network/polkadot-ambassador-program/"},"Polkadot's community"),", Polkadot offers a\nplatform for everyone. This wiki offers a place for builders and maintainers to utilize\n",(0,r.kt)("a",{parentName:"p",href:"/docs/build-tools-index"},"tools")," and for brand-new learners to dive into educational material."),(0,r.kt)("h2",{id:"where-to-start-learning"},"Where to start learning?"),(0,r.kt)("p",null,"The\n",(0,r.kt)("a",{parentName:"p",href:"https://mooc.web3.foundation/course/blockchain-fundamentals/"},"Blockchain Fundamentals MOOC course"),"\nis a great introduction to start familiarizing yourself with blockchain concepts such as\ncryptography and networks, and how these play into things like decentralization and cryptocurrency."),(0,r.kt)("p",null,"This is recommended for users with backgrounds of all levels, and the course is free!"),(0,r.kt)("h3",{id:"brand-new-polkadot-learners"},"Brand-New Polkadot learners"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot.network/PolkaDotPaper.pdf"},"Polkadot's original white paper")," is a technical\nsummary around one possible direction of implementing the Polkadot network. This paper uses\nrationale and technical details to support why this direction is beneficial. This original white\npaper also explains how Polkadot's core components work together to build this decentralized\nnetwork."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/w3f/research/blob/master/docs/papers/OverviewPaper-V1.pdf"},"Polkadot's overview paper"),"\nis an updated version of the white paper that describes the protocol in more technical terms. We\nwould recommend reading this overview paper if you are interested in digging more into the\nprotocol itself."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot.network/Polkadot-lightpaper.pdf"},"Polkadot's light paper")," is a visual, easy to\nread, and less technical introduction into its blockchain technology. This paper dives into the\ncomponents of Polkadot but is understandable for both a non-technical and technical reader."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://linktr.ee/polkadotbook"},"Polkadot for Beginners: A non-technical guide to decentralization, blockchains & Polkadot")," -\na book funded by the Polkadot Treasury"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/w3f/polkadot-spec"},"Polkadot's specification")," is a GitHub repository that holds\nthe latest Polkadot Host protocol specification, Polkadot's specification tests of the many\ncomponents of the network, and the Polkadot Runtime specification. This repo holds algorithms and\nexplores how various processes function in the Polkadot network. The Polkadot specification takes\nPolkadot's ideas and concepts from the light and the white paper but focuses on the technical\nspecs of the technology."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=mNStMPZjiHM&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8"},"Watching the Technical Explainer Videos"),":\nThese are great introductory videos that explain and demonstrate how to use Polkadot and its\n",(0,r.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/"},"User Interface"),"."),(0,r.kt)("li",{parentName:"ul"},"Reading\n",(0,r.kt)("a",{parentName:"li",href:"https://medium.com/polkadot-network/what-is-polkadot-a-brief-introduction-ca3eac9ddca5"},"What is Polkadot? A Brief Introduction"),"\non Medium. There are also other great articles to read on\n",(0,r.kt)("a",{parentName:"li",href:"https://medium.com/polkadot-network"},"Polkadot's Medium")," or\n",(0,r.kt)("a",{parentName:"li",href:"https://medium.com/web3foundation"},"Web3 Foundation's Medium"),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot.study/"},"Polkadot Study")," is a platform where developers can write tutorials for\nthe Polkadot ecosystem. Part of the development of the platform was funded by the\n",(0,r.kt)("a",{parentName:"li",href:"https://kusama.subsquare.io/referenda/102"},"Kusama treasury"),". The platform also hosts\n",(0,r.kt)("a",{parentName:"li",href:"https://polkadot.study/tutorials/substrate-in-bits/"},"Substrate in Bits"),", a technical content\nseries aimed at solving the pain points of developers building with\n",(0,r.kt)("a",{parentName:"li",href:"https://substrate.io/"},"Substrate")," and ",(0,r.kt)("a",{parentName:"li",href:"https://www.rust-lang.org/"},"Rust"),".")),(0,r.kt)("p",null,"For brand-new learners of Kusama, Polkadot's canary cousin network: To learn more about how to build\nand maintain on the Kusama network, please head over to our\n",(0,r.kt)("a",{parentName:"p",href:"https://guide.kusama.network/"},"Kusama Guide"),"."),(0,r.kt)("h2",{id:"resources"},"Resources"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.crowdcast.io/polkadot"},"Polkadot Crowdcast")," - List of all Crowdcast webinars that the\nWeb3 Foundation has done."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"Polkadot Explorer")," - Browser for the Polkadot network;\ncan be used for Polkadot, Kusama, or any Substrate-based chain."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"http://polkascan.io/"},"Polkascan")," ","-"," Real-time multi-chain data for Polkadot Relay Chain and\nParity Substrate chains."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://subscan.io"},"Subscan.io")," - Explorer for Substrate based chains."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://youtu.be/lIghiCmHz0U"},"Polkadot Overview")," - Dr. Gavin Wood presents an overview of\nPolkadot. (Video)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://techcrunch.com/video/fireside-chat-with-jutta-steiner-parity-technologies/"},"Polkadot Overview")," -\nDr. Jutta Steiner presents Polkadot. (Video)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=0IoUZdDi5Is&feature=youtu.be"},"Polkadot & Substrate Overview")," -\nDr. Gavin Wood presents Substrate (blockchain in-a-box + VM) and Polkadot, and builds a blockchain\non-stage in 30 minutes using Substrate. (Video)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/docs/community"},"Community / Ecosystem")," - List of community rooms and channels to talk to others\nabout Polkadot."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#"},"Sample Applications")," - Sample applications that are built on or currently being built for\nPolkadot."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/docs/contributing"},"Contributing Guide")," - Rules for contributing to the wiki."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://support.polkadot.network/"},"Polkadot Knowledge Base")," - Troubleshooting resources for\nspecific errors and problems.")))}m.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/f2521980.6fc5ee7c.js b/assets/js/f2521980.6fc5ee7c.js new file mode 100644 index 000000000000..32e92cc59884 --- /dev/null +++ b/assets/js/f2521980.6fc5ee7c.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[6689],{47940:(t,e,a)=>{"use strict";a.d(e,{Z:()=>k});var o=a(74165),n=a(15861),r=a(67294),i=a(87152),s=a(17145),l=a(67425);function d(t,e,a){return p.apply(this,arguments)}function p(){return(p=(0,n.Z)((0,o.Z)().mark((function t(e,a,n){var r,l,d,p,c;return(0,o.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:r=void 0,l=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){t.next=18;break}return t.abrupt("return");case 18:return d=new i.U(r),t.next=21,s.G.create({provider:d});case 21:p=t.sent,(c=a.split(".")).forEach((function(t){t in p&&(p=p[t])})),t.t1=c[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return l=p.toString(),t.abrupt("break",35);case 29:return t.next=31,p();case 31:return l=(l=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+c[0]+") in "+a);case 35:return t.abrupt("return",l);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function c(t,e,a,o){switch(e){case"humanReadable":(0,l.HumanReadable)(t,a,o);break;case"precise":(0,l.Precise)(t,a,o);break;case"blocksToDays":(0,l.BlocksToDays)(t,o);break;case"percentage":(0,l.Percentage)(t,o);break;case"permillToPercent":(0,l.PermillToPercent)(t,o);break;case"arrayLength":(0,l.ArrayLength)(t,o);break;default:return void console.log("Ignoring unknown filter type")}}const k=function(t){var e=t.network,a=t.path,i=t.defaultValue,s=t.filter,l=void 0===s?void 0:s,p=(0,r.useState)(""),k=p[0],u=p[1];return e=e.toLowerCase(),(0,r.useEffect)((function(){void 0!==l?c(i.toString(),l,e,u):u(i.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var t=(0,n.Z)((0,o.Z)().mark((function t(){var n;return(0,o.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,d(e,a,u);case 2:if(void 0!==(n=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==l?c(n,l,e,u):u(n);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{r()}catch(s){console.log(s)}}}),[]),k}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,a,o){var n=void 0;if("polkadot"===a||"statemint"===a)n=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");n=6}t=parseFloat(t),o((t=Number.isInteger(t/e[a].precision)?t/e[a].precision+" "+e[a].symbol:(t/e[a].precision).toFixed(n)+" "+e[a].symbol).toString())},Precise:function(t,a,o){o(t=(t=parseFloat(t))/e[a].precision+" "+e[a].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},PermillToPercent:function(t,e){e((t/=1e4).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},24595:(t,e,a)=>{"use strict";a.r(e),a.d(e,{assets:()=>c,contentTitle:()=>d,default:()=>m,frontMatter:()=>l,metadata:()=>p,toc:()=>k});var o=a(87462),n=a(63366),r=(a(67294),a(3905)),i=a(47940),s=["components"],l={id:"getting-started",title:"Getting Started",sidebar_label:"Getting Started",description:"Get started with Polkadot and Web3.",keywords:["introduction","getting started","what is polkadot","why polkadot"],slug:"../getting-started"},d=void 0,p={unversionedId:"general/getting-started",id:"general/getting-started",title:"Getting Started",description:"Get started with Polkadot and Web3.",source:"@site/../docs/general/getting-started.md",sourceDirName:"general",slug:"/getting-started",permalink:"/docs/getting-started",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/general/getting-started.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696484972,formattedLastUpdatedAt:"Oct 5, 2023",frontMatter:{id:"getting-started",title:"Getting Started",sidebar_label:"Getting Started",description:"Get started with Polkadot and Web3.",keywords:["introduction","getting started","what is polkadot","why polkadot"],slug:"../getting-started"},sidebar:"docs",previous:{title:"General",permalink:"/docs/general-index"},next:{title:"Web3 and Polkadot",permalink:"/docs/web3-and-polkadot"}},c={},k=[{value:"Interact with Polkadot",id:"interact-with-polkadot",level:2},{value:"What is Polkadot?",id:"what-is-polkadot",level:2},{value:"What can I do with my DOT?",id:"what-can-i-do-with-my-dot",level:2},{value:"Polkadot Gifts",id:"polkadot-gifts",level:2},{value:"Why should you use Polkadot?",id:"why-should-you-use-polkadot",level:2},{value:"Where to start learning?",id:"where-to-start-learning",level:2},{value:"Brand-New Polkadot learners",id:"brand-new-polkadot-learners",level:3},{value:"Resources",id:"resources",level:2}],u={toc:k},h="wrapper";function m(t){var e=t.components,a=(0,n.Z)(t,s);return(0,r.kt)(h,(0,o.Z)({},u,a,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("admonition",{title:"Welcome to the Polkadot Wiki",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The Polkadot Wiki serves as the central source of truth for Polkadot. It is a community-focused\ninitiative led by Web3 Foundation to keep an up-to-date resource on the best information for\nlearning, building, and maintaining on Polkadot."),(0,r.kt)("p",{parentName:"admonition"},"The Wiki has three main sections:"),(0,r.kt)("ul",{parentName:"admonition"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"./learn-index"},(0,r.kt)("strong",{parentName:"a"},"Learn"))," (for people who want to learn about Polkadot)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/docs/build-index"},(0,r.kt)("strong",{parentName:"a"},"Build"))," (for people who want to build on Polkadot)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/docs/maintain-index"},(0,r.kt)("strong",{parentName:"a"},"Maintain"))," (for people who want to maintain the Polkadot\nnetwork)."))),(0,r.kt)("h2",{id:"interact-with-polkadot"},"Interact with Polkadot"),(0,r.kt)("tr",{class:"cards-container"},(0,r.kt)("td",null,(0,r.kt)("a",{class:"guide-link",href:"../docs/learn-account-generation"},(0,r.kt)("img",{src:"/img/polkadot-guide/Account.jpg",alt:"Drawing",width:"250",height:"150"}),(0,r.kt)("div",{class:"cards-body"},(0,r.kt)("h5",{class:"cards-title"},"Creating an Account")))),(0,r.kt)("td",null,(0,r.kt)("a",{class:"guide-link",href:"../docs/learn-balance-transfers"},(0,r.kt)("img",{src:"/img/polkadot-guide/Transfer.jpg",alt:"Drawing",width:"250",height:"150"}),(0,r.kt)("div",{class:"cards-body"},(0,r.kt)("h5",{class:"cards-title"},"Balance Transfers")))),(0,r.kt)("td",null,(0,r.kt)("a",{class:"guide-link",href:"../docs/learn-staking"},(0,r.kt)("img",{class:"guide-image",src:"/img/polkadot-guide/Stake.jpg",alt:"Drawing",width:"250",height:"150"}),(0,r.kt)("div",{class:"cards-body"},(0,r.kt)("h5",{class:"cards-title"},"Staking"))))),(0,r.kt)("br",null),(0,r.kt)("tr",{class:"cards-container"},(0,r.kt)("td",null,(0,r.kt)("a",{class:"guide-link",href:"../docs/learn-polkadot-opengov"},(0,r.kt)("img",{class:"guide-image",src:"/img/polkadot-guide/Council.jpg",alt:"Drawing",width:"250",height:"150"}),(0,r.kt)("div",{class:"cards-body"},(0,r.kt)("h5",{class:"cards-title"},"Polkadot OpenGov")))),(0,r.kt)("td",null,(0,r.kt)("a",{class:"guide-link",href:"../docs/learn-proxies"},(0,r.kt)("img",{class:"guide-image",src:"/img/polkadot-guide/Proxy.jpg",alt:"Drawing",width:"250",height:"150"}),(0,r.kt)("div",{class:"cards-body"},(0,r.kt)("h5",{class:"cards-title"},"Proxy Accounts")))),(0,r.kt)("td",null,(0,r.kt)("a",{class:"guide-link",href:"../docs/learn-identity"},(0,r.kt)("img",{class:"guide-image",src:"/img/polkadot-guide/Identity.jpg",alt:"Drawing",width:"250",height:"150"}),(0,r.kt)("div",{class:"cards-body"},(0,r.kt)("h5",{class:"cards-title"},"Set an Identity"))))),(0,r.kt)("br",null),(0,r.kt)("tr",{class:"cards-container"},(0,r.kt)("td",null,(0,r.kt)("a",{class:"guide-link",href:"../docs/learn-parachains"},(0,r.kt)("img",{class:"guide-image",src:"/img/polkadot-guide/Parachain.jpg",alt:"Drawing",width:"250",height:"150"}),(0,r.kt)("div",{class:"cards-body"},(0,r.kt)("h5",{class:"cards-title"},"Parachains")))),(0,r.kt)("td",null,(0,r.kt)("a",{class:"guide-link",href:"../docs/learn-bridges"},(0,r.kt)("img",{class:"guide-image",src:"/img/polkadot-guide/Bridges.jpg",alt:"Drawing",width:"250",height:"150"}),(0,r.kt)("div",{class:"cards-body"},(0,r.kt)("h5",{class:"cards-title"},"Bridges")))),(0,r.kt)("td",null,(0,r.kt)("a",{class:"guide-link",href:"../docs/ambassadors"},(0,r.kt)("img",{class:"guide-image",src:"/img/polkadot-guide/Ambassadors.jpg",alt:"Drawing",width:"250",height:"150"}),(0,r.kt)("div",{class:"cards-body"},(0,r.kt)("h5",{class:"cards-title"},"Become an Ambassador"))))),(0,r.kt)("br",null),(0,r.kt)("h2",{id:"what-is-polkadot"},"What is Polkadot?"),(0,r.kt)("p",null,"Polkadot is the first layer-0 (L0) blockchain that provides shared security and secure\ninteroperability to layer-1 (L1) blockchains. Those L1 blockchain attached to Polkadot are also\ncalled ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-parachains"},"parachains")," as their transactions are processed in parallel by\nPolkadot. For more information about Polkadot see the dedicated page about the state of\n",(0,r.kt)("a",{parentName:"p",href:"/docs/polkadot-v1"},"Polkadot 1.0")," released in mid 2023."),(0,r.kt)("p",null,"Polkadot has an on-chain ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov"},"open governance")," (also called Polkadot\nOpenGov) to orchestrate decisions, including accessing funds from the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov-treasury"},"treasury"),"."),(0,r.kt)("p",null,"The ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-DOT"},"DOT token")," gives you the power to participate in Polkadot OpenGov,\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-staking"},"staking"),", and ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-crowdloans"},"parachains' crowdloans"),"."),(0,r.kt)("p",null,"The level of abstraction and generalization of Polkadot allows to build applications that are\nspecific to their use cases, and for those applications to communicate securely leveraging each\nother value proposition. The trustless cooperation between applications is what makes Polkadot an\nideal ecosystem to build a ",(0,r.kt)("a",{parentName:"p",href:"/docs/web3-and-polkadot"},"web3 future"),"."),(0,r.kt)("p",null,"See the videos below to know more about Polkadot."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=_-k0xkooSlA"},(0,r.kt)("img",{parentName:"a",src:"https://img.youtube.com/vi/_-k0xkooSlA/0.jpg",alt:"Polkadot"}))),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=BQ60bTU1bPg"},(0,r.kt)("img",{parentName:"a",src:"https://img.youtube.com/vi/BQ60bTU1bPg/0.jpg",alt:"Introduction to Polkadot"}))),(0,r.kt)("h2",{id:"what-can-i-do-with-my-dot"},"What can I do with my DOT?"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"/docs/learn-DOT"},"DOT")," is the native token of the Polkadot Network. DOT can be used for\ntransaction fees, staking, governance, acquisition of a parachain slot and for enabling several key\nfunctionalities on Polkadot."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"",(0,r.kt)("strong",{parentName:"p"},(0,r.kt)(i.Z,{network:"polkadot",path:"consts.balances.existentialDeposit",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),":"),"\nthe minimum balance required to have an active account on Polkadot Network. If your account\nbalance drops below the minimum, your account will be reaped. Learn more about\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-accounts"},"Accounts")," and the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/build-protocol-info#existential-deposit"},"Existential Deposit")," requirement.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"",(0,r.kt)("strong",{parentName:"p"},(0,r.kt)(i.Z,{network:"polkadot",path:"query.nominationPools.minJoinBond",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"}),":"),"\nthe minimum contribution required to join a ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pool"),"\nand earn staking rewards for contributing to the security of the network. Learn more about\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pools"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"",(0,r.kt)("strong",{parentName:"p"},(0,r.kt)(i.Z,{network:"polkadot",path:"consts.crowdloan.minContribution",defaultValue:5e10,filter:"humanReadable",mdxType:"RPC"}),":"),"\nthe minimum contribution required to participate in ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-crowdloans"},"crowdloans")," for\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-auction"},"parachain slot auctions"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Around 20 DOT"),":"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"",(0,r.kt)("strong",{parentName:"li"},(0,r.kt)(i.Z,{network:"polkadot",path:"consts.identity.basicDeposit",defaultValue:20258e7,filter:"humanReadable",mdxType:"RPC"}),":"),"\nregister an ",(0,r.kt)("a",{parentName:"li",href:"/docs/learn-identity"},"on-chain identity")),(0,r.kt)("li",{parentName:"ul"},"",(0,r.kt)("strong",{parentName:"li"},(0,r.kt)(i.Z,{network:"polkadot",path:"consts.proxy.proxyDepositBase",defaultValue:20008e7,filter:"humanReadable",mdxType:"RPC"}),":"),"\ncreate a ",(0,r.kt)("a",{parentName:"li",href:"/docs/learn-proxies"},"proxy account"),"."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"",(0,r.kt)("strong",{parentName:"p"},(0,r.kt)(i.Z,{network:"polkadot",path:"query.staking.minNominatorBond",defaultValue:25e11,filter:"humanReadable",mdxType:"RPC"}),":"),"\nthe minimum stake required to submit your intent to directly nominate validators.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"",(0,r.kt)("strong",{parentName:"p"},(0,r.kt)(i.Z,{network:"polkadot",path:"query.staking.minimumActiveStake",defaultValue:2937e9,filter:"humanReadable",mdxType:"RPC"}),":"),"\nthe minimum amount of DOT required to become an active nominator and earn rewards, i.e. the\nminimum active bond. To increase the chance of earning staking rewards, your stake should not be\nless than the minimum stake among the active nominators, which is a dynamic threshold. If you have\nlesser DOT than the minimum active nomination, please consider contributing to\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pools"),". Learn more about\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-nominator"},"becoming a nominator"),".")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"",(0,r.kt)("strong",{parentName:"p"},(0,r.kt)(i.Z,{network:"polkadot",path:"query.nominationPools.minCreateBond",defaultValue:5e12,filter:"humanReadable",mdxType:"RPC"}),":"),"\nyou can create your own ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pool"),"."))),(0,r.kt)("p",null,"DOT has utility in ",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-democracy"},"Polkadot's democracy"),". Bonding DOT is\na requirement to create proposals, to endorse them and to vote on them when they become referendums.\nBonding\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.treasury.proposalBondMinimum",defaultValue:1e12,filter:"humanReadable",mdxType:"RPC"}),"\nor 5% of requested funding is a requirement to make a\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-treasury#creating-a-treasury-proposal"},"treasury proposal"),". DOT can also enable\nyou to participate in programs like the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/thousand-validators#polkadot"},"Thousand Validators Program"),"."),(0,r.kt)("h2",{id:"polkadot-gifts"},"Polkadot Gifts"),(0,r.kt)("img",{align:"right",src:"/img/polkadot-gift.png",width:"210",height:"200"}),(0,r.kt)("p",null,"Polkadot Gifts provide an easy way to:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Onboard friends or family who are curious about blockchain but haven\u2019t made the leap yet."),(0,r.kt)("li",{parentName:"ul"},"Share your love of Polkadot and send any amount of DOT."),(0,r.kt)("li",{parentName:"ul"},"Say \u2018thank you\u2019 or send someone tokens when you don\u2019t know their address."),(0,r.kt)("li",{parentName:"ul"},"Get friends and family set up to participate in crowdloans.")),(0,r.kt)("p",null,"Learn more about how you can create and send Polkadot Gifts\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/introducing-polkadot-kusama-gifts/"},"here"),"."),(0,r.kt)("h2",{id:"why-should-you-use-polkadot"},"Why should you use Polkadot?"),(0,r.kt)("p",null,"Whether you're a blockchain developer or if you're interested in taking part of\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.network/polkadot-ambassador-program/"},"Polkadot's community"),", Polkadot offers a\nplatform for everyone. This wiki offers a place for builders and maintainers to utilize\n",(0,r.kt)("a",{parentName:"p",href:"/docs/build-tools-index"},"tools")," and for brand-new learners to dive into educational material."),(0,r.kt)("h2",{id:"where-to-start-learning"},"Where to start learning?"),(0,r.kt)("p",null,"The\n",(0,r.kt)("a",{parentName:"p",href:"https://mooc.web3.foundation/course/blockchain-fundamentals/"},"Blockchain Fundamentals MOOC course"),"\nis a great introduction to start familiarizing yourself with blockchain concepts such as\ncryptography and networks, and how these play into things like decentralization and cryptocurrency."),(0,r.kt)("p",null,"This is recommended for users with backgrounds of all levels, and the course is free!"),(0,r.kt)("h3",{id:"brand-new-polkadot-learners"},"Brand-New Polkadot learners"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot.network/PolkaDotPaper.pdf"},"Polkadot's original white paper")," is a technical\nsummary around one possible direction of implementing the Polkadot network. This paper uses\nrationale and technical details to support why this direction is beneficial. This original white\npaper also explains how Polkadot's core components work together to build this decentralized\nnetwork."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/w3f/research/blob/master/docs/papers/OverviewPaper-V1.pdf"},"Polkadot's overview paper"),"\nis an updated version of the white paper that describes the protocol in more technical terms. We\nwould recommend reading this overview paper if you are interested in digging more into the\nprotocol itself."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot.network/Polkadot-lightpaper.pdf"},"Polkadot's light paper")," is a visual, easy to\nread, and less technical introduction into its blockchain technology. This paper dives into the\ncomponents of Polkadot but is understandable for both a non-technical and technical reader."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://linktr.ee/polkadotbook"},"Polkadot for Beginners: A non-technical guide to decentralization, blockchains & Polkadot")," -\na book funded by the Polkadot Treasury"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/w3f/polkadot-spec"},"Polkadot's specification")," is a GitHub repository that holds\nthe latest Polkadot Host protocol specification, Polkadot's specification tests of the many\ncomponents of the network, and the Polkadot Runtime specification. This repo holds algorithms and\nexplores how various processes function in the Polkadot network. The Polkadot specification takes\nPolkadot's ideas and concepts from the light and the white paper but focuses on the technical\nspecs of the technology."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=mNStMPZjiHM&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8"},"Watching the Technical Explainer Videos"),":\nThese are great introductory videos that explain and demonstrate how to use Polkadot and its\n",(0,r.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/"},"User Interface"),"."),(0,r.kt)("li",{parentName:"ul"},"Reading\n",(0,r.kt)("a",{parentName:"li",href:"https://medium.com/polkadot-network/what-is-polkadot-a-brief-introduction-ca3eac9ddca5"},"What is Polkadot? A Brief Introduction"),"\non Medium. There are also other great articles to read on\n",(0,r.kt)("a",{parentName:"li",href:"https://medium.com/polkadot-network"},"Polkadot's Medium")," or\n",(0,r.kt)("a",{parentName:"li",href:"https://medium.com/web3foundation"},"Web3 Foundation's Medium"),"."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot.study/"},"Polkadot Study")," is a platform where developers can write tutorials for\nthe Polkadot ecosystem. Part of the development of the platform was funded by the\n",(0,r.kt)("a",{parentName:"li",href:"https://kusama.subsquare.io/referenda/102"},"Kusama treasury"),". The platform also hosts\n",(0,r.kt)("a",{parentName:"li",href:"https://polkadot.study/tutorials/substrate-in-bits/"},"Substrate in Bits"),", a technical content\nseries aimed at solving the pain points of developers building with\n",(0,r.kt)("a",{parentName:"li",href:"https://substrate.io/"},"Substrate")," and ",(0,r.kt)("a",{parentName:"li",href:"https://www.rust-lang.org/"},"Rust"),".")),(0,r.kt)("p",null,"For brand-new learners of Kusama, Polkadot's canary cousin network: To learn more about how to build\nand maintain on the Kusama network, please head over to our\n",(0,r.kt)("a",{parentName:"p",href:"https://guide.kusama.network/"},"Kusama Guide"),"."),(0,r.kt)("h2",{id:"resources"},"Resources"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.crowdcast.io/polkadot"},"Polkadot Crowdcast")," - List of all Crowdcast webinars that the\nWeb3 Foundation has done."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"Polkadot Explorer")," - Browser for the Polkadot network;\ncan be used for Polkadot, Kusama, or any Substrate-based chain."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"http://polkascan.io/"},"Polkascan")," ","-"," Real-time multi-chain data for Polkadot Relay Chain and\nParity Substrate chains."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://subscan.io"},"Subscan.io")," - Explorer for Substrate based chains."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://youtu.be/lIghiCmHz0U"},"Polkadot Overview")," - Dr. Gavin Wood presents an overview of\nPolkadot. (Video)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://techcrunch.com/video/fireside-chat-with-jutta-steiner-parity-technologies/"},"Polkadot Overview")," -\nDr. Jutta Steiner presents Polkadot. (Video)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=0IoUZdDi5Is&feature=youtu.be"},"Polkadot & Substrate Overview")," -\nDr. Gavin Wood presents Substrate (blockchain in-a-box + VM) and Polkadot, and builds a blockchain\non-stage in 30 minutes using Substrate. (Video)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/docs/community"},"Community / Ecosystem")," - List of community rooms and channels to talk to others\nabout Polkadot."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#"},"Sample Applications")," - Sample applications that are built on or currently being built for\nPolkadot."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/docs/contributing"},"Contributing Guide")," - Rules for contributing to the wiki."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://support.polkadot.network/"},"Polkadot Knowledge Base")," - Troubleshooting resources for\nspecific errors and problems.")))}m.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/f4003c83.3ee8242f.js b/assets/js/f4003c83.3ee8242f.js new file mode 100644 index 000000000000..12750e43d78a --- /dev/null +++ b/assets/js/f4003c83.3ee8242f.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[4476],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>m});var n=a(74165),o=a(15861),r=a(67294),i=a(87152),l=a(17145),s=a(67425);function p(e,t,a){return c.apply(this,arguments)}function c(){return(c=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var r,s,p,c,u;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=void 0,s=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){e.next=18;break}return e.abrupt("return");case 18:return p=new i.U(r),e.next=21,l.G.create({provider:p});case 21:c=e.sent,(u=a.split(".")).forEach((function(e){e in c&&(c=c[e])})),e.t1=u[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return s=c.toString(),e.abrupt("break",35);case 29:return e.next=31,c();case 31:return s=(s=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+a);case 35:return e.abrupt("return",s);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function u(e,t,a,n){switch(t){case"humanReadable":(0,s.HumanReadable)(e,a,n);break;case"precise":(0,s.Precise)(e,a,n);break;case"blocksToDays":(0,s.BlocksToDays)(e,n);break;case"percentage":(0,s.Percentage)(e,n);break;case"permillToPercent":(0,s.PermillToPercent)(e,n);break;case"arrayLength":(0,s.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const m=function(e){var t=e.network,a=e.path,i=e.defaultValue,l=e.filter,s=void 0===l?void 0:l,c=(0,r.useState)(""),m=c[0],d=c[1];return t=t.toLowerCase(),(0,r.useEffect)((function(){void 0!==s?u(i.toString(),s,t,d):d(i.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p(t,a,d);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==s?u(o,s,t,d):d(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{r()}catch(l){console.log(l)}}}),[]),m}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},19084:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>p,default:()=>k,frontMatter:()=>s,metadata:()=>c,toc:()=>m});var n=a(87462),o=a(63366),r=(a(67294),a(3905)),i=a(47940),l=["components"],s={id:"learn-governance",title:"Governance V1",sidebar_label:"Governance V1",description:"Polkadot's First Governance Model.",keywords:["governance","referenda","proposal","voting","endorse"],slug:"../learn-governance"},p=void 0,c={unversionedId:"learn/learn-governance",id:"learn/learn-governance",title:"Governance V1",description:"Polkadot's First Governance Model.",source:"@site/../docs/learn/learn-governance.md",sourceDirName:"learn",slug:"/learn-governance",permalink:"/docs/learn-governance",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-governance.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1695728743,formattedLastUpdatedAt:"Sep 26, 2023",frontMatter:{id:"learn-governance",title:"Governance V1",sidebar_label:"Governance V1",description:"Polkadot's First Governance Model.",keywords:["governance","referenda","proposal","voting","endorse"],slug:"../learn-governance"},sidebar:"docs",previous:{title:"Archive",permalink:"/docs/learn-archive-index"},next:{title:"Gov1 Treasury",permalink:"/docs/learn-treasury"}},u={},m=[{value:"Governance Summary",id:"governance-summary",level:2},{value:"Proposals",id:"proposals",level:2},{value:"Endorsing Proposals",id:"endorsing-proposals",level:3},{value:"Cancelling Proposals",id:"cancelling-proposals",level:3},{value:"Blacklisting Proposals",id:"blacklisting-proposals",level:3},{value:"Referenda",id:"referenda",level:2},{value:"Referenda Timeline",id:"referenda-timeline",level:3},{value:"Public Referenda",id:"public-referenda",level:3},{value:"Council Referenda",id:"council-referenda",level:3},{value:"Alternating Voting Timetable",id:"alternating-voting-timetable",level:3},{value:"Adaptive Quorum Biasing",id:"adaptive-quorum-biasing",level:3},{value:"Example of Adaptive Quorum Biasing",id:"example-of-adaptive-quorum-biasing",level:4},{value:"Enactment",id:"enactment",level:3},{value:"Voting on a Referendum",id:"voting-on-a-referendum",level:2},{value:"Voluntary Locking",id:"voluntary-locking",level:3},{value:"Delegations",id:"delegations",level:3},{value:"Council",id:"council",level:2},{value:"Prime Members",id:"prime-members",level:3},{value:"Technical Committee",id:"technical-committee",level:2},{value:"Frequently Asked Questions",id:"frequently-asked-questions",level:2},{value:"How to be a council member?",id:"how-to-be-a-council-member",level:3},{value:"How can I appeal to the council to enact a change on my behalf?",id:"how-can-i-appeal-to-the-council-to-enact-a-change-on-my-behalf",level:3},{value:"Resources",id:"resources",level:2}],d={toc:m},h="wrapper";function k(e){var t=e.components,s=(0,o.Z)(e,l);return(0,r.kt)(h,(0,n.Z)({},d,s,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Polkadot uses a sophisticated governance\nmechanism that allows it to evolve gracefully overtime at the ultimate behest of its assembled\nstakeholders. The stated goal is to ensure that the majority of the stake can always command the\nnetwork."),(0,r.kt)("admonition",{title:"Polkadot OpenGov is live on Kusama Network",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Learn about the upcoming changes to the governance on\nPolkadot in this\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov"},"Wiki doc on Polkadot OpenGov"),".")),(0,r.kt)("p",null,"Polkadot brings together various novel\nmechanisms, including an amorphous (abstract) form of state-transition function stored on-chain\ndefined in a platform-agnostic language (i.e. ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-wasm"},"WebAssembly"),"). It also allows for\nseveral on-chain voting mechanisms, such as referenda with the novel concept of\n",(0,r.kt)("a",{parentName:"p",href:"#adaptive-quorum-biasing"},"Adaptive Quorum Biasing")," and batch approval voting. All changes to the\nprotocol must be agreed upon by stake-weighted referenda."),(0,r.kt)("p",null,"To make any changes to the network, the idea is to compose active token holders and the council\ntogether to administrate a network upgrade decision. No matter whether the proposal is proposed by\nthe public (token holders) or the ",(0,r.kt)("a",{parentName:"p",href:"#council"},"Council"),", it finally will have to go through a vote on\na referendum to let all holders, weighted by stake, make the decision."),(0,r.kt)("h2",{id:"governance-summary"},"Governance Summary"),(0,r.kt)("p",null,"The figure below shows an overview of Governance V1 with the key actors and different paths for\nsubmitting a proposal that can potentially be voted on as a referendum."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"gov1-overview",src:a(74562).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"The public (i.e. token holders) can submit a proposal that gets added to the proposal queue. Here,\nproposals are ",(0,r.kt)("a",{parentName:"p",href:"#endorsing-proposals"},"endorsed"),", and the one that gets the most support will climb to\nthe top of the queue. When it is time, the proposal at the top of the queue will become a\n",(0,r.kt)("a",{parentName:"p",href:"#public-referenda"},"Public Referendum"),". For instance, the proposal with 11 endorsements is shown at\nthe top of the queue in the figure, which is ready to become a referendum."),(0,r.kt)("p",null,"The public can also submit a ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-treasury#creating-a-treasury-proposal"},"treasury proposal"),",\nwhich must be evaluated by the ",(0,r.kt)("a",{parentName:"p",href:"#council"},"Council")," through a motion. If the Council motion passes,\nthe treasury proposal can be directly executed or go to the external queue, which will be voted on\nthrough a ",(0,r.kt)("a",{parentName:"p",href:"#council-referenda"},"Council Referendum"),". See the figure's green horizontal path from the\nPublic (green) to the Council (yellow). Treasury proposals and Council proposals can be directly\nexecuted (horizontal yellow arrows) or go to the external queue, where they will become a referendum"),(0,r.kt)("p",null,"Note that the external queue always consists of\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/f4a2e84ee5974b219f2a03cd195105060c41e3cd/frame/democracy/src/lib.rs#LL29C8-L31C4"},"a single proposal"),".\nA proposal in the external queue can be fast-tracked by the\n",(0,r.kt)("a",{parentName:"p",href:"#technical-committee"},"Technical Committee")," (light blue). The fast track can contain as many\nproposals as possible (also called emergency proposals) that can be voted on simultaneously with\nwith the referenda introduced either by the Council or the Public. See in the figure the yellow\ncircle (i.e. Council Proposal) exiting the external queue, and the yellow circle with a light-blue\nborder also leaving the queue and being fast-tracked by the Technical Committee (TC). Once empty,\nthe external queue can be filled with another Council proposal."),(0,r.kt)("p",null,"The Council can also submit proposals that will end up in the external queue. Voting on Council and\nPublic proposals subject to an ",(0,r.kt)("a",{parentName:"p",href:"#alternating-voting-timetable"},"alternating timetable"),', shown in the\nfigure as the "on" and "off" toggles on the external and proposal queues. In this example, the\nPublic proposal will be voted on together with the fast-tracked Council Proposal. Voting on\nnon-fast-tracked Council Proposals will be blocked until the alternating timetable switches the\ntoggles, which stops Public proposals from becoming a referenda.'),(0,r.kt)("p",null,"Referenda will follow an ",(0,r.kt)("a",{parentName:"p",href:"#adaptive-quorum-biasing"},"adaptive quorum biasing")," mechanism for deciding\nwhether they get enacted, and if they do, they will be executed after an\n",(0,r.kt)("a",{parentName:"p",href:"#enactment"},"enactment period"),"."),(0,r.kt)("p",null,"Token holders can delegate their votes (with a conviction multiplier) to another account belonging\nto a trusted entity voting on their behalf."),(0,r.kt)("h2",{id:"proposals"},"Proposals"),(0,r.kt)("p",null,"Referenda can be started in different ways:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Publicly submitted proposals"),(0,r.kt)("li",{parentName:"ul"},"Proposals submitted by the council, either through a majority or unanimously"),(0,r.kt)("li",{parentName:"ul"},"Proposals submitted as part of the ",(0,r.kt)("a",{parentName:"li",href:"#enactment"},"enactment")," of a prior referendum (i.e. making a\nreferendum to start a new referendum)"),(0,r.kt)("li",{parentName:"ul"},"Emergency proposals submitted by the ",(0,r.kt)("a",{parentName:"li",href:"#technical-committee"},"Technical Committee")," and approved by\nthe ",(0,r.kt)("a",{parentName:"li",href:"#council"},"Council"))),(0,r.kt)("admonition",{title:"Starting a proposal in Governance V1",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"For more information about how to start a proposal, see the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-democracy#proposing-an-action"},"dedicated page"),".")),(0,r.kt)("h3",{id:"endorsing-proposals"},"Endorsing Proposals"),(0,r.kt)("p",null,"Anyone can submit a proposal by depositing the minimum amount of tokens for a certain period (number\nof blocks). If someone agrees with the proposal, they may deposit the same amount of tokens to\nsupport it - this action is called\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-democracy#endorsing-a-proposal"},(0,r.kt)("em",{parentName:"a"},"endorsing")),". The proposal with the\nhighest amount of bonded support will be selected to be a referendum in the next voting cycle based\non an ",(0,r.kt)("a",{parentName:"p",href:"#alternating-voting-timetable"},"alternating voting timetable"),"."),(0,r.kt)("h3",{id:"cancelling-proposals"},"Cancelling Proposals"),(0,r.kt)("p",null,"A proposal can be canceled if the ",(0,r.kt)("a",{parentName:"p",href:"#technical-committee"},"Technical Committee")," unanimously agrees to\ndo so or if Root Origin (e.g. sudo) triggers this functionality. A canceled proposal's deposit is\nburned."),(0,r.kt)("p",null,"Additionally, a two-thirds majority of the council can cancel a referendum. This may function as a\nlast-resort if there is an issue found late in a referendum's proposal, such as a bug in the code of\nthe runtime that the proposal would institute."),(0,r.kt)("p",null,"If the cancellation is controversial enough that the council cannot get a two-thirds majority, then\nit will be left to the stakeholders ",(0,r.kt)("em",{parentName:"p"},"en masse")," to determine the proposal\u2019s fate."),(0,r.kt)("h3",{id:"blacklisting-proposals"},"Blacklisting Proposals"),(0,r.kt)("p",null,"A proposal can be blacklisted by Root Origin (e.g. sudo). A blacklisted proposal and its related\nreferendum (if any) are immediately ",(0,r.kt)("a",{parentName:"p",href:"#canceling"},"canceled"),". Additionally, a blacklisted proposal's\nhash cannot re-appear in the proposal queue. Blacklisting is useful when removing erroneous\nproposals that could be submitted with the same hash."),(0,r.kt)("p",null,"Upon seeing their proposal removed, a submitter who is not properly introduced to the democracy\nsystem of Polkadot might be tempted to\nre-submit the same proposal. That said, this is far from a fool-proof method of preventing invalid\nproposals from being submitted - a single changed character in a proposal's text will also change\nthe hash of the proposal, rendering the per-hash blacklist invalid."),(0,r.kt)("h2",{id:"referenda"},"Referenda"),(0,r.kt)("p",null,"Referenda are simple, inclusive, stake-based voting schemes. Each referendum has a specific proposal\nthat takes the form of a ",(0,r.kt)("strong",{parentName:"p"},"privileged function")," call in the runtime. That function includes the\nmost powerful ",(0,r.kt)("strong",{parentName:"p"},"call"),": ",(0,r.kt)("inlineCode",{parentName:"p"},"set_code"),', which can switch out the entire runtime code, achieving what\nwould otherwise require a "hard fork".'),(0,r.kt)("p",null,'Referenda are discrete events, have a fixed period where voting happens, and then are tallied, and\nthe function call is executed if the vote is approved. Referenda are always binary: your only\noptions in voting are "aye", "nay", or abstaining entirely.'),(0,r.kt)("h3",{id:"referenda-timeline"},"Referenda Timeline"),(0,r.kt)("p",null,"The structure of the timeline for all referenda is the same regardless of who initiates the\nproposal, although the timeline length can vary (see below)."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"gov1-timeline",src:a(11173).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"The figure above provides a summary view of the referenda timeline for Governance V1."),(0,r.kt)("p",null,"In (1), the proposal is submitted, and the Launch Period starts. During this period of indefinite\nlength the voters can ",(0,r.kt)("a",{parentName:"p",href:"#endorsing-proposals"},"endorse")," proposals by bonding the same amount of tokens\nused by the depositor. Deposited tokens for endorsement will be returned once the proposal becomes a\nreferendum. During the launch period, the proposal will compete with other proposals, and the one\nthat gets to the top will be selected for a referendum when the next voting period starts."),(0,r.kt)("p",null,"The figure shows that the launch period is shown with a fixed length. Still, it varies depending on\nwho initiated the proposal and how many proposals there are in the pipeline. Council motions will\nlikely have a short launch period when compared to the public referenda which might take longer\nunless they are the only ones in the pipeline."),(0,r.kt)("p",null,"In (2), the proposal is selected for a referendum. Proposals initiated by the public will become a\n",(0,r.kt)("a",{parentName:"p",href:"#public-referenda"},"public referendum"),", while those initiated by the council will become\n",(0,r.kt)("a",{parentName:"p",href:"#council-referenda"},"council referenda"),". The voting period lasts\n28 days, after which, if the proposal is\napproved, it will go through an enactment period. Rejected proposals will need to start from (1).\nNote that Governance V1 uses an ",(0,r.kt)("a",{parentName:"p",href:"#alternating-voting-timetable"},"alternating voting timeline")," where\nvoters can vote either for a public proposal or a council motion every\n28 days."),(0,r.kt)("p",null,"In (3), the proposal is approved and moves through the ",(0,r.kt)("a",{parentName:"p",href:"#enactment"},"enactment period")," that can be of\ndifferent lengths depending on who initiated the proposal in the first place, with emergency\nproposals being the fastest ones and the only ones that can be voted simultaneously with other\nreferenda."),(0,r.kt)("h3",{id:"public-referenda"},"Public Referenda"),(0,r.kt)("p",null,"Public referenda will have a ",(0,r.kt)("a",{parentName:"p",href:"#adaptive-quorum-biasing"},(0,r.kt)("strong",{parentName:"a"},"positive turnout bias")),", meaning that\nthey will require a heavy supermajority of ",(0,r.kt)("em",{parentName:"p"},"aye")," votes to pass at low turnouts but as turnout\nincreases towards 100%, it will require a simple majority of ",(0,r.kt)("em",{parentName:"p"},"aye")," votes to pass (i.e. 51% wins)."),(0,r.kt)("p",null,"Note that the bonded tokens will be released once the proposal is tabled (that is, brought to a\nvote), and a maximum of\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.democracy.maxProposals",defaultValue:100,mdxType:"RPC"}),"\n","\npublic proposals can be in the proposal queue."),(0,r.kt)("admonition",{title:"turnout",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The total number of voting tokens excluding conviction or ",(0,r.kt)("a",{parentName:"p",href:"#voluntary-locking"},"voluntary locking"),".")),(0,r.kt)("h3",{id:"council-referenda"},"Council Referenda"),(0,r.kt)("p",null,"Unanimous Council - When all council members agree on a proposal, it can be moved to a referendum\nwith a ",(0,r.kt)("a",{parentName:"p",href:"#adaptive-quorum-biasing"},(0,r.kt)("strong",{parentName:"a"},"negative turnout bias")),". Briefly, it will require a heavy\nsupermajority of ",(0,r.kt)("em",{parentName:"p"},"nay")," votes to reject at low turnouts, but as turnout increases towards 100%, it\nwill require a simple majority of ",(0,r.kt)("em",{parentName:"p"},"nay")," votes to fail (i.e. 51% wins)."),(0,r.kt)("p",null,"Majority Council - When agreement from only a simple majority of council members occurs, the\nreferendum will need ",(0,r.kt)("a",{parentName:"p",href:"#adaptive-quorum-biasing"},(0,r.kt)("strong",{parentName:"a"},"simple majority"))," to pass."),(0,r.kt)("admonition",{title:"Public- vs. Council-initiated Referenda",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Public referenda must be agreed upon using a positive bias to mitigate attacks by malicious or\nill-conceived proposals. Conversely, when a proposal is unanimously voted in favor by the council,\nit benefits from using the negative bias. We assume low turnout is less problematic if the council\nproposes a referendum. Also, the council members are elected by the community and have strong\ntechnical as well as functional knowledge about the system, and we assume solid justifications back\nchanges proposed by the council.")),(0,r.kt)("h3",{id:"alternating-voting-timetable"},"Alternating Voting Timetable"),(0,r.kt)("p",null,"All referenda are executed by Root Origin. It follows that multiple referenda cannot be voted upon\nin the same period, excluding emergency referenda. An emergency referendum occurring at the same\ntime as a regular referendum (either public- or council-proposed) is the only time multiple\nreferenda can be voted on."),(0,r.kt)("p",null,"Every\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.democracy.votingPeriod",defaultValue:403200,filter:"blocksToDays",mdxType:"RPC"}),"\n","\ndays, a new referendum will come up for a vote, assuming there is at least one proposal in one of\nthe queues. There is a queue for Council-approved proposals and a queue for publicly-submitted\nproposals. The referendum to be voted upon alternates between the top proposal in the two queues,\nwhere the proposals' rank is based on ",(0,r.kt)("a",{parentName:"p",href:"#endorsing-proposals"},"endorsement")," (i.e. bonded tokens)."),(0,r.kt)("h3",{id:"adaptive-quorum-biasing"},"Adaptive Quorum Biasing"),(0,r.kt)("p",null,"Polkadot introduces the concept of ",(0,r.kt)("strong",{parentName:"p"},"Adaptive\nQuorum Biasing"),", which is used to alter the effective super-majority required to make it easier or\nmore difficult for a proposal to pass depending on voting power (turnout) and origin (Council or\npublic)."),(0,r.kt)("p",null,"Adaptive Quorum Biasing creates three tallying mechanisms: majority carry, super-majority approve,\nand super-majority against. They all equate to a simple majority-carry system at 100% turnout. Their\nselection depends on which entity proposed the proposal and whether all Council members voted yes\n(in the case of Council Referenda)."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},(0,r.kt)("strong",{parentName:"th"},"Entity")),(0,r.kt)("th",{parentName:"tr",align:"center"},(0,r.kt)("strong",{parentName:"th"},"Metric")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Public"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Positive Turnout Bias (Super-Majority Approve)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Council (Complete agreement)"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Negative Turnout Bias (Super-Majority Against)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Council (Majority agreement)"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Simple Majority")))),(0,r.kt)("p",null,"Let's use the image below as an example."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"adaptive-quorum-biasing",src:a(72895).Z,width:"537",height:"439"})),(0,r.kt)("p",null,"If a publicly submitted referendum only has a 25% turnout, the tally of ",(0,r.kt)("em",{parentName:"p"},"aye")," votes has to reach 66%\nfor it to pass since we applied ",(0,r.kt)("strong",{parentName:"p"},"Positive Turnout Bias"),". In contrast, when it has a 75% turnout,\nthe tally of ",(0,r.kt)("em",{parentName:"p"},"aye")," votes has to reach 54%, which means that the super-majority required decreases as\nthe turnout increases. A positive turnout bias, whereby a heavy super-majority of aye votes is\nrequired to carry at low turnouts. However, as turnout increases towards 100%, it becomes a simple\nmajority carry as below."),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://latex.codecogs.com/svg.latex?%5Clarge&space;%7Bagainst&space;%5Cover&space;%5Csqrt%7Bturnout%7D%7D&space;%3C&space;%7Bapprove&space;%5Cover&space;%5Csqrt%7Belectorate%7D%7D",alt:null})),(0,r.kt)("p",null,"Where ",(0,r.kt)("inlineCode",{parentName:"p"},"approve")," is the number of ",(0,r.kt)("em",{parentName:"p"},"aye")," votes, ",(0,r.kt)("inlineCode",{parentName:"p"},"against")," is the number of ",(0,r.kt)("em",{parentName:"p"},"nay")," votes, ",(0,r.kt)("inlineCode",{parentName:"p"},"turnout")," is\nthe total number of voting tokens excluding ",(0,r.kt)("a",{parentName:"p",href:"#voluntary-locking"},"voluntary locking"),", and\n",(0,r.kt)("inlineCode",{parentName:"p"},"electorate")," is the total number of tokens issued in the network."),(0,r.kt)("p",null,"When the council proposes a new proposal through unanimous consent, the referendum would be put to\nthe vote using ",(0,r.kt)("strong",{parentName:"p"},"Negative Turnout Bias"),". Referring to the above image, when a Council referendum\nonly has a 25% turnout, the tally of ",(0,r.kt)("em",{parentName:"p"},"aye")," votes has to reach 34% for it to pass, while if the\nturnout increases to 75%, the tally of ",(0,r.kt)("em",{parentName:"p"},"aye")," votes has to reach 46%. A negative turnout bias\nrequires a heavy super-majority of ",(0,r.kt)("em",{parentName:"p"},"nay")," votes to reject at low turnouts. However, as turnout\nincreases towards 100%, it becomes a simple majority carry as below."),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://latex.codecogs.com/svg.latex?%5Clarge&space;%7Bagainst&space;%5Cover&space;%5Csqrt%7Belectorate%7D%7D&space;%3C&space;%7Bapprove&space;%5Cover&space;%5Csqrt%7Bturnout%7D%7D",alt:null})),(0,r.kt)("p",null,"In short, when the turnout rate is low, a super-majority is required to reject the proposal, which\nmeans a lower threshold of ",(0,r.kt)("em",{parentName:"p"},"aye")," votes must be reached. As turnout increases toward 100%, it becomes\na simple majority, a simple comparison of votes. If there are more ",(0,r.kt)("em",{parentName:"p"},"aye")," votes than ",(0,r.kt)("em",{parentName:"p"},"nay"),", then the\nproposal is carried, no matter how much stake votes on the proposal."),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://latex.codecogs.com/svg.latex?%5Clarge&space;%7Bapprove%7D&space;%3E&space;%7Bagainst%7D",alt:null})),(0,r.kt)("p",null,"To know more about where these above formulas come from, please read the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/master/frame/democracy/src/vote_threshold.rs"},"democracy pallet"),"."),(0,r.kt)("h4",{id:"example-of-adaptive-quorum-biasing"},"Example of Adaptive Quorum Biasing"),(0,r.kt)("p",null,"Let's assume we only have 1,500 DOT tokens in\ntotal and that this is a public proposal."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"John: 500 DOT"),(0,r.kt)("li",{parentName:"ul"},"Peter: 100 DOT"),(0,r.kt)("li",{parentName:"ul"},"Lilly: 150 DOT"),(0,r.kt)("li",{parentName:"ul"},"JJ: 150 DOT"),(0,r.kt)("li",{parentName:"ul"},"Ken: 600 DOT")),(0,r.kt)("p",null,"John: Votes ",(0,r.kt)("inlineCode",{parentName:"p"},"Yes")," for a 4 week lock period =>\n500 x 1 = 500 Votes"),(0,r.kt)("p",null,"Peter: Votes ",(0,r.kt)("inlineCode",{parentName:"p"},"Yes")," for a 4 week lock period =>\n100 x 1 = 100 Votes"),(0,r.kt)("p",null,"JJ: Votes ",(0,r.kt)("inlineCode",{parentName:"p"},"No")," for a 16 week lock period =>\n150 x 3 = 450 Votes"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"approve = 600"),(0,r.kt)("li",{parentName:"ul"},"against = 450"),(0,r.kt)("li",{parentName:"ul"},"turnout = 750"),(0,r.kt)("li",{parentName:"ul"},"electorate = 1500")),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://latex.codecogs.com/svg.latex?%5Clarge&space;%5Cfrac%7B450%7D%7B%5Csqrt%7B750%7D%7D&space;%3C&space;%5Cfrac%7B600%7D%7B%5Csqrt%7B1500%7D%7D",alt:"\\Large \\frac{450}{\\sqrt{750}}&space;<&space;\\frac{600}{\\sqrt{1500}}"})),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://latex.codecogs.com/svg.latex?%5Clarge&space;%7B16.432%7D&space;%3C&space;%7B15.492%7D",alt:"\\Large {16.432}&space;<&space;{15.492}"})),(0,r.kt)("p",null,"Since the above example is a public referendum, ",(0,r.kt)("strong",{parentName:"p"},"Super-Majority Approve")," would be used to\ncalculate the result. Super-Majority Approve requires more ",(0,r.kt)("em",{parentName:"p"},"aye")," votes to pass the referendum when\nturnout is low; therefore, based on the above result, the referendum will be rejected."),(0,r.kt)("admonition",{title:"only the winning voter's tokens are locked.",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"If the voters on the losing side of the referendum believe that the outcome will have adverse\neffects, their tokens are transferrable, so they will not be locked into the decision. Winning\nproposals are autonomously enacted after the ",(0,r.kt)("a",{parentName:"p",href:"#enactment"},"enactment period"),".")),(0,r.kt)("h3",{id:"enactment"},"Enactment"),(0,r.kt)("p",null,"Referenda are considered ",(0,r.kt)("em",{parentName:"p"},"baked")," if they are closed and tallied. Assuming a referendum is approved,\nit will be scheduled for ",(0,r.kt)("strong",{parentName:"p"},"enactment"),". Referenda are considered ",(0,r.kt)("em",{parentName:"p"},"unbaked")," if they are pending an\noutcome, i.e. being voted on."),(0,r.kt)("p",null,"All referenda are associated with an enactment delay or ",(0,r.kt)("strong",{parentName:"p"},"enactment period"),". This is the period\nbetween a referendum ending and (assuming it was approved) the changes being enacted."),(0,r.kt)("p",null,"For public and Council referenda, the enactment period is a fixed time of\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.democracy.enactmentPeriod",defaultValue:403200,filter:"blocksToDays",mdxType:"RPC"}),"",'.\nFor proposals submitted as part of the enactment of a prior referendum, it can be set as desired.\nEmergency proposals deal with major problems with the network and need to be "fast-tracked". These\nwill have a shorter enactment period.'),(0,r.kt)("h2",{id:"voting-on-a-referendum"},"Voting on a Referendum"),(0,r.kt)("p",null,"To vote, a voter generally must lock their tokens up for at least the enactment period beyond the\nend of the referendum. This is to ensure that some minimal economic buy-in to the result is needed\nand to dissuade vote selling."),(0,r.kt)("admonition",{title:"Referenda explainer video",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"To learn more about voting on referenda, please check out our\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=BkbhhlsezGA&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&index=31&ab_channel=Polkadot"},"technical explainer video"),".")),(0,r.kt)("p",null,"It is possible to vote without locking, but your vote is worth a small fraction of a normal vote,\ngiven your stake. At the same time, holding only a small amount of tokens does not mean that the\nholder cannot influence the referendum result, thanks to time-locking or ",(0,r.kt)("strong",{parentName:"p"},"voluntary locking")," (see\nbelow)."),(0,r.kt)("h3",{id:"voluntary-locking"},"Voluntary Locking"),(0,r.kt)("admonition",{title:"Voluntary Locking",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"For more information about voluntary locking or conviction voting see\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov#voluntary-locking"},"Polkadot OpenGov"),".")),(0,r.kt)("h3",{id:"delegations"},"Delegations"),(0,r.kt)("p",null,"In Polkadot you can\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-democracy#delegate-a-vote"},"delegate your voting power")," to another\naccount you trust if you are not willing to stay up-to-date with all referenda."),(0,r.kt)("p",null,"You can also use a ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-proxies#governance-proxy"},"governance proxy")," to vote on behalf of your\nstash account. The proxy can be yours, or you can authorize a third-party governance proxy to vote\nwith your stash. Learn more from the ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-proxies"},"dedicated page on Proxy Accounts"),"."),(0,r.kt)("h2",{id:"council"},"Council"),(0,r.kt)("p",null,'To represent passive stakeholders, Polkadot\nintroduces the idea of a "council". The council is an on-chain entity comprising several actors,\neach represented as an on-chain account. On\nPolkadot, the council currently consists of\n',(0,r.kt)(i.Z,{network:"polkadot",path:"query.council.members",defaultValue:Array(13),filter:"arrayLength",mdxType:"RPC"}),"\n","\nmembers."),(0,r.kt)("p",null,"Along with ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-treasury"},"controlling the treasury"),", the council is called upon primarily for\nthree tasks of governance:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Proposing sensible referenda"),(0,r.kt)("li",{parentName:"ul"},"Cancelling uncontroversially dangerous or malicious referenda"),(0,r.kt)("li",{parentName:"ul"},"Electing the ",(0,r.kt)("a",{parentName:"li",href:"#technical-committee"},"Technical Committee"),".")),(0,r.kt)("p",null,"For a referendum to be proposed by the council, a strict majority of members must be in favor, with\nno member exercising a veto. Vetoes may be exercised only once by a member for any single proposal.\nIf the proposal is resubmitted after a cool-down period, they may not veto it a second time."),(0,r.kt)("p",null,"Council motion that pass with a 3/5 (60%) super-majority - but without reaching unanimous support -\nwill move to a public referendum under a neutral, majority-carries voting scheme. In the case that\nall members of the council that voted are in favor of a motion, the vote is considered unanimous and\nbecomes a referendum with ",(0,r.kt)("a",{parentName:"p",href:"#adaptive-quorum-biasing"},"negative turnout bias"),"."),(0,r.kt)("admonition",{title:"Explainer video on the Council",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"For more information, check out our\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=837Vv3gdRzI"},"video explainer on Council"))),(0,r.kt)("h3",{id:"prime-members"},"Prime Members"),(0,r.kt)("p",null,"The council, being an instantiation of\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/tree/master/frame/collective"},"Substrate's Collective pallet"),",\nimplements what's called a ",(0,r.kt)("em",{parentName:"p"},"prime member")," whose vote acts as the default for other members that fail\nto vote before the timeout."),(0,r.kt)("p",null,"The prime member is chosen based on a ",(0,r.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Borda_count"},"Borda count"),"."),(0,r.kt)("p",null,'The purpose of having a prime council member is to ensure a quorum, even when several members\nabstain from a vote. Council members might be tempted to vote a "soft rejection" or a "soft\napproval" by not voting and letting the others vote. The existence of a prime member forces\ncouncilors to be explicit in their votes or have their vote counted for whatever is voted on by the\nprime.'),(0,r.kt)("h2",{id:"technical-committee"},"Technical Committee"),(0,r.kt)("p",null,"The Technical Committee(TC) was introduced in the\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.network/kusama-rollout-and-governance/"},"Kusama rollout and governance post")," as one\nof the three chambers of Kusama governance (along with the Council and the Referendum chamber). The\nTC is composed of the teams that have successfully implemented or specified either a\nPolkadot runtime or Polkadot Host. Teams are\nadded or removed from the TC via a simple majority vote of the ",(0,r.kt)("a",{parentName:"p",href:"#council"},"Council"),"."),(0,r.kt)("p",null,'The TC aims to safeguard against malicious referenda, implement bug fixes, reverse faulty runtime\nupdates, or add new but battle-tested features. The TC can fast-track proposals using the Democracy\npallet and is the only origin that can trigger the fast-tracking functionality. We can think of the\nTC as a "unique origin" that cannot generate proposals but fast-track existing ones.'),(0,r.kt)("p",null,"Fast-tracked referenda are the only referenda that can be active alongside another active\nreferendum. Thus, with fast-tracked referenda, it is possible to have two active referendums\nsimultaneously. Voting on one does not prevent a user from voting on the other."),(0,r.kt)("h2",{id:"frequently-asked-questions"},"Frequently Asked Questions"),(0,r.kt)("h3",{id:"how-to-be-a-council-member"},"How to be a council member?"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"approval-vote",src:a(93395).Z,width:"850",height:"340"})),(0,r.kt)("p",null,"All stakeholders can signal their approval of any of the registered candidates."),(0,r.kt)("p",null,"Council elections are handled by the same ",(0,r.kt)("a",{parentName:"p",href:"../docs/learn-phragmen"},"Phragm\xe9n election")," process that\nselects validators from the available pool based on nominations. However, token holders' votes for\ncouncilors are isolated from any nominations they may have on validators. Council terms last for one\nweek."),(0,r.kt)("p",null,"At the end of each term, ",(0,r.kt)("a",{parentName:"p",href:"../docs/learn-phragmen#algorithm"},"Phragm\xe9n election algorithm")," runs and\nthe result will choose the new councilors based on the vote configurations of all voters. The\nelection also chooses a set number of runners-up, which is currently\n20 that will remain in the queue with their votes\nintact."),(0,r.kt)("p",null,'As opposed to a "first-past-the-post" electoral system, where voters can only vote for a single\ncandidate from a list, a Phragm\xe9n election is a more expressive way to include each voter\u2019s views.\nToken holders can treat it as a way to support as many candidates as they want. The election\nalgorithm will find a fair subset of the candidates that most closely matches the expressed\nindications of the electorate as a whole.'),(0,r.kt)("p",null,"Let's take a look at the example below."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"Round 1"),(0,r.kt)("th",{parentName:"tr",align:"center"}),(0,r.kt)("th",{parentName:"tr",align:"center"}),(0,r.kt)("th",{parentName:"tr",align:"center"}),(0,r.kt)("th",{parentName:"tr",align:"center"}),(0,r.kt)("th",{parentName:"tr",align:"center"}))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("strong",{parentName:"td"},"Token Holders")),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("strong",{parentName:"td"},"Candidates")),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"},"A"),(0,r.kt)("td",{parentName:"tr",align:"center"},"B"),(0,r.kt)("td",{parentName:"tr",align:"center"},"C"),(0,r.kt)("td",{parentName:"tr",align:"center"},"D"),(0,r.kt)("td",{parentName:"tr",align:"center"},"E")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Peter"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Alice"),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Bob"),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Kelvin"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("strong",{parentName:"td"},"Total")),(0,r.kt)("td",{parentName:"tr",align:"center"},"2"),(0,r.kt)("td",{parentName:"tr",align:"center"},"1"),(0,r.kt)("td",{parentName:"tr",align:"center"},"3"),(0,r.kt)("td",{parentName:"tr",align:"center"},"2"),(0,r.kt)("td",{parentName:"tr",align:"center"},"2")))),(0,r.kt)("p",null,"The above example shows that candidate C wins the election in round 1, while candidates A, B, D & E\nkeep remaining on the candidates' list for the next round."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"Round 2"),(0,r.kt)("th",{parentName:"tr",align:"center"}),(0,r.kt)("th",{parentName:"tr",align:"center"}),(0,r.kt)("th",{parentName:"tr",align:"center"}),(0,r.kt)("th",{parentName:"tr",align:"center"}))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("strong",{parentName:"td"},"Token Holders")),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("strong",{parentName:"td"},"Candidates")),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"},"A"),(0,r.kt)("td",{parentName:"tr",align:"center"},"B"),(0,r.kt)("td",{parentName:"tr",align:"center"},"D"),(0,r.kt)("td",{parentName:"tr",align:"center"},"E")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Peter"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Alice"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Bob"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Kelvin"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("strong",{parentName:"td"},"Total")),(0,r.kt)("td",{parentName:"tr",align:"center"},"4"),(0,r.kt)("td",{parentName:"tr",align:"center"},"4"),(0,r.kt)("td",{parentName:"tr",align:"center"},"1"),(0,r.kt)("td",{parentName:"tr",align:"center"},"1")))),(0,r.kt)("p",null,"The top-N (say 4 in this example) runners-up can remain, and their votes persist until the next\nelection. After round 2, even though candidates A & B get the same number of votes in this round,\ncandidate A gets elected because after adding the older unused approvals, it is higher than B."),(0,r.kt)("h3",{id:"how-can-i-appeal-to-the-council-to-enact-a-change-on-my-behalf"},"How can I appeal to the council to enact a change on my behalf?"),(0,r.kt)("p",null,"In some circumstances, you may want to appeal to the on-chain council to enact a change on your\nbehalf. One example of this circumstance is the case of lost or locked funds when the funds were\nlost due to a human interface error (such as inputting an address for another network). Another\nexample is if you participated in the 2017 Polkadot ICO with a multi-sig address which now does not\nlet you sign a message easily. When these circumstances can be proven beyond a reasonable doubt to\nbe an error, the council ",(0,r.kt)("em",{parentName:"p"},"may")," consider a governance motion to correct it."),(0,r.kt)("p",null,"The first step to appeal to the council is to contact the councilors. There is no singular place\nwhere you are guaranteed to grab every councilor\u2019s ear with your message. However, there are a\nhandful of good places to start where you can get the attention of some of them. The\n",(0,r.kt)("a",{parentName:"p",href:"https://matrix.to/#/#Polkadot-Direction:parity.io"},"Polkadot Direction"),"\n"," matrix\nroom is one such place. After creating an account and joining this room, you can post a\nwell-thought-through message here that lays down your case and justifies why you think the council\nshould consider enacting a change to the protocol on your behalf."),(0,r.kt)("p",null,"At some point, you will likely need a place for a longer-form discussion. For this, making a post on\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/"},"Polkassembly")," is the recommended place to do so. When you write\na post on Polkassembly, present all the evidence for your circumstances and state clearly what kind\nof change you would suggest to the councilors to enact."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Remember, the councilors do not need to make the change, it is your responsibility to make a strong\ncase for why the change should be made.")),(0,r.kt)("h2",{id:"resources"},"Resources"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/paritytech/polkadot/wiki/Governance"},"Initial Governance Description")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/paritytech/substrate/tree/master/frame/democracy/src"},"Democracy Pallet")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=VsZuDJMmVPY&feature=youtu.be&t=24734"},"Governance Demo")," - Dr.\nGavin Wood presents the initial governance structure for Polkadot. (Video)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.crowdcast.io/e/governance-on-polkadot--"},"Governance on Polkadot")," - A webinar\nexplaining how governance works in Polkadot and Kusama.")))}k.isMDXComponent=!0},74562:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/gov1-overview-515a8f55923136c0b6e6bd23bea3d836.png"},11173:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/gov1-timeline-69424fec137182a898f00c29a90fbdb1.png"},72895:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/adaptive-quorum-biasing-18c2e70b6b9d2c3abf563219b11974dc.png"},93395:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/approval-vote-d0622e1c0a9bc7c50ab9f23761488dbe.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/f4003c83.6835111c.js b/assets/js/f4003c83.6835111c.js deleted file mode 100644 index 3a5c5d2d14a4..000000000000 --- a/assets/js/f4003c83.6835111c.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[4476],{47940:(e,t,a)=>{"use strict";a.d(t,{Z:()=>d});var n=a(74165),o=a(15861),r=a(67294),i=a(87152),l=a(17145),s=a(67425);function p(e,t,a){return c.apply(this,arguments)}function c(){return(c=(0,o.Z)((0,n.Z)().mark((function e(t,a,o){var r,s,p,c,u;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=void 0,s=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return r="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return r="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return r="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return r="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==r){e.next=18;break}return e.abrupt("return");case 18:return p=new i.U(r),e.next=21,l.G.create({provider:p});case 21:c=e.sent,(u=a.split(".")).forEach((function(e){e in c&&(c=c[e])})),e.t1=u[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return s=c.toString(),e.abrupt("break",35);case 29:return e.next=31,c();case 31:return s=(s=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+a);case 35:return e.abrupt("return",s);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function u(e,t,a,n){switch(t){case"humanReadable":(0,s.HumanReadable)(e,a,n);break;case"precise":(0,s.Precise)(e,a,n);break;case"blocksToDays":(0,s.BlocksToDays)(e,n);break;case"percentage":(0,s.Percentage)(e,n);break;case"arrayLength":(0,s.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const d=function(e){var t=e.network,a=e.path,i=e.defaultValue,l=e.filter,s=void 0===l?void 0:l,c=(0,r.useState)(""),d=c[0],m=c[1];return t=t.toLowerCase(),(0,r.useEffect)((function(){void 0!==s?u(i.toString(),s,t,m):m(i.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var r=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p(t,a,m);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==s?u(o,s,t,m):m(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{r()}catch(l){console.log(l)}}}),[]),d}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/t[a].precision)?e/t[a].precision+" "+t[a].symbol:(e/t[a].precision).toFixed(o)+" "+t[a].symbol).toString())},Precise:function(e,a,n){n(e=(e=parseFloat(e))/t[a].precision+" "+t[a].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},19084:(e,t,a)=>{"use strict";a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>p,default:()=>k,frontMatter:()=>s,metadata:()=>c,toc:()=>d});var n=a(87462),o=a(63366),r=(a(67294),a(3905)),i=a(47940),l=["components"],s={id:"learn-governance",title:"Governance V1",sidebar_label:"Governance V1",description:"Polkadot's First Governance Model.",keywords:["governance","referenda","proposal","voting","endorse"],slug:"../learn-governance"},p=void 0,c={unversionedId:"learn/learn-governance",id:"learn/learn-governance",title:"Governance V1",description:"Polkadot's First Governance Model.",source:"@site/../docs/learn/learn-governance.md",sourceDirName:"learn",slug:"/learn-governance",permalink:"/docs/learn-governance",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-governance.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1695728743,formattedLastUpdatedAt:"Sep 26, 2023",frontMatter:{id:"learn-governance",title:"Governance V1",sidebar_label:"Governance V1",description:"Polkadot's First Governance Model.",keywords:["governance","referenda","proposal","voting","endorse"],slug:"../learn-governance"},sidebar:"docs",previous:{title:"Archive",permalink:"/docs/learn-archive-index"},next:{title:"Gov1 Treasury",permalink:"/docs/learn-treasury"}},u={},d=[{value:"Governance Summary",id:"governance-summary",level:2},{value:"Proposals",id:"proposals",level:2},{value:"Endorsing Proposals",id:"endorsing-proposals",level:3},{value:"Cancelling Proposals",id:"cancelling-proposals",level:3},{value:"Blacklisting Proposals",id:"blacklisting-proposals",level:3},{value:"Referenda",id:"referenda",level:2},{value:"Referenda Timeline",id:"referenda-timeline",level:3},{value:"Public Referenda",id:"public-referenda",level:3},{value:"Council Referenda",id:"council-referenda",level:3},{value:"Alternating Voting Timetable",id:"alternating-voting-timetable",level:3},{value:"Adaptive Quorum Biasing",id:"adaptive-quorum-biasing",level:3},{value:"Example of Adaptive Quorum Biasing",id:"example-of-adaptive-quorum-biasing",level:4},{value:"Enactment",id:"enactment",level:3},{value:"Voting on a Referendum",id:"voting-on-a-referendum",level:2},{value:"Voluntary Locking",id:"voluntary-locking",level:3},{value:"Delegations",id:"delegations",level:3},{value:"Council",id:"council",level:2},{value:"Prime Members",id:"prime-members",level:3},{value:"Technical Committee",id:"technical-committee",level:2},{value:"Frequently Asked Questions",id:"frequently-asked-questions",level:2},{value:"How to be a council member?",id:"how-to-be-a-council-member",level:3},{value:"How can I appeal to the council to enact a change on my behalf?",id:"how-can-i-appeal-to-the-council-to-enact-a-change-on-my-behalf",level:3},{value:"Resources",id:"resources",level:2}],m={toc:d},h="wrapper";function k(e){var t=e.components,s=(0,o.Z)(e,l);return(0,r.kt)(h,(0,n.Z)({},m,s,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Polkadot uses a sophisticated governance\nmechanism that allows it to evolve gracefully overtime at the ultimate behest of its assembled\nstakeholders. The stated goal is to ensure that the majority of the stake can always command the\nnetwork."),(0,r.kt)("admonition",{title:"Polkadot OpenGov is live on Kusama Network",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Learn about the upcoming changes to the governance on\nPolkadot in this\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov"},"Wiki doc on Polkadot OpenGov"),".")),(0,r.kt)("p",null,"Polkadot brings together various novel\nmechanisms, including an amorphous (abstract) form of state-transition function stored on-chain\ndefined in a platform-agnostic language (i.e. ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-wasm"},"WebAssembly"),"). It also allows for\nseveral on-chain voting mechanisms, such as referenda with the novel concept of\n",(0,r.kt)("a",{parentName:"p",href:"#adaptive-quorum-biasing"},"Adaptive Quorum Biasing")," and batch approval voting. All changes to the\nprotocol must be agreed upon by stake-weighted referenda."),(0,r.kt)("p",null,"To make any changes to the network, the idea is to compose active token holders and the council\ntogether to administrate a network upgrade decision. No matter whether the proposal is proposed by\nthe public (token holders) or the ",(0,r.kt)("a",{parentName:"p",href:"#council"},"Council"),", it finally will have to go through a vote on\na referendum to let all holders, weighted by stake, make the decision."),(0,r.kt)("h2",{id:"governance-summary"},"Governance Summary"),(0,r.kt)("p",null,"The figure below shows an overview of Governance V1 with the key actors and different paths for\nsubmitting a proposal that can potentially be voted on as a referendum."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"gov1-overview",src:a(74562).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"The public (i.e. token holders) can submit a proposal that gets added to the proposal queue. Here,\nproposals are ",(0,r.kt)("a",{parentName:"p",href:"#endorsing-proposals"},"endorsed"),", and the one that gets the most support will climb to\nthe top of the queue. When it is time, the proposal at the top of the queue will become a\n",(0,r.kt)("a",{parentName:"p",href:"#public-referenda"},"Public Referendum"),". For instance, the proposal with 11 endorsements is shown at\nthe top of the queue in the figure, which is ready to become a referendum."),(0,r.kt)("p",null,"The public can also submit a ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-treasury#creating-a-treasury-proposal"},"treasury proposal"),",\nwhich must be evaluated by the ",(0,r.kt)("a",{parentName:"p",href:"#council"},"Council")," through a motion. If the Council motion passes,\nthe treasury proposal can be directly executed or go to the external queue, which will be voted on\nthrough a ",(0,r.kt)("a",{parentName:"p",href:"#council-referenda"},"Council Referendum"),". See the figure's green horizontal path from the\nPublic (green) to the Council (yellow). Treasury proposals and Council proposals can be directly\nexecuted (horizontal yellow arrows) or go to the external queue, where they will become a referendum"),(0,r.kt)("p",null,"Note that the external queue always consists of\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/f4a2e84ee5974b219f2a03cd195105060c41e3cd/frame/democracy/src/lib.rs#LL29C8-L31C4"},"a single proposal"),".\nA proposal in the external queue can be fast-tracked by the\n",(0,r.kt)("a",{parentName:"p",href:"#technical-committee"},"Technical Committee")," (light blue). The fast track can contain as many\nproposals as possible (also called emergency proposals) that can be voted on simultaneously with\nwith the referenda introduced either by the Council or the Public. See in the figure the yellow\ncircle (i.e. Council Proposal) exiting the external queue, and the yellow circle with a light-blue\nborder also leaving the queue and being fast-tracked by the Technical Committee (TC). Once empty,\nthe external queue can be filled with another Council proposal."),(0,r.kt)("p",null,"The Council can also submit proposals that will end up in the external queue. Voting on Council and\nPublic proposals subject to an ",(0,r.kt)("a",{parentName:"p",href:"#alternating-voting-timetable"},"alternating timetable"),', shown in the\nfigure as the "on" and "off" toggles on the external and proposal queues. In this example, the\nPublic proposal will be voted on together with the fast-tracked Council Proposal. Voting on\nnon-fast-tracked Council Proposals will be blocked until the alternating timetable switches the\ntoggles, which stops Public proposals from becoming a referenda.'),(0,r.kt)("p",null,"Referenda will follow an ",(0,r.kt)("a",{parentName:"p",href:"#adaptive-quorum-biasing"},"adaptive quorum biasing")," mechanism for deciding\nwhether they get enacted, and if they do, they will be executed after an\n",(0,r.kt)("a",{parentName:"p",href:"#enactment"},"enactment period"),"."),(0,r.kt)("p",null,"Token holders can delegate their votes (with a conviction multiplier) to another account belonging\nto a trusted entity voting on their behalf."),(0,r.kt)("h2",{id:"proposals"},"Proposals"),(0,r.kt)("p",null,"Referenda can be started in different ways:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Publicly submitted proposals"),(0,r.kt)("li",{parentName:"ul"},"Proposals submitted by the council, either through a majority or unanimously"),(0,r.kt)("li",{parentName:"ul"},"Proposals submitted as part of the ",(0,r.kt)("a",{parentName:"li",href:"#enactment"},"enactment")," of a prior referendum (i.e. making a\nreferendum to start a new referendum)"),(0,r.kt)("li",{parentName:"ul"},"Emergency proposals submitted by the ",(0,r.kt)("a",{parentName:"li",href:"#technical-committee"},"Technical Committee")," and approved by\nthe ",(0,r.kt)("a",{parentName:"li",href:"#council"},"Council"))),(0,r.kt)("admonition",{title:"Starting a proposal in Governance V1",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"For more information about how to start a proposal, see the\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-democracy#proposing-an-action"},"dedicated page"),".")),(0,r.kt)("h3",{id:"endorsing-proposals"},"Endorsing Proposals"),(0,r.kt)("p",null,"Anyone can submit a proposal by depositing the minimum amount of tokens for a certain period (number\nof blocks). If someone agrees with the proposal, they may deposit the same amount of tokens to\nsupport it - this action is called\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-democracy#endorsing-a-proposal"},(0,r.kt)("em",{parentName:"a"},"endorsing")),". The proposal with the\nhighest amount of bonded support will be selected to be a referendum in the next voting cycle based\non an ",(0,r.kt)("a",{parentName:"p",href:"#alternating-voting-timetable"},"alternating voting timetable"),"."),(0,r.kt)("h3",{id:"cancelling-proposals"},"Cancelling Proposals"),(0,r.kt)("p",null,"A proposal can be canceled if the ",(0,r.kt)("a",{parentName:"p",href:"#technical-committee"},"Technical Committee")," unanimously agrees to\ndo so or if Root Origin (e.g. sudo) triggers this functionality. A canceled proposal's deposit is\nburned."),(0,r.kt)("p",null,"Additionally, a two-thirds majority of the council can cancel a referendum. This may function as a\nlast-resort if there is an issue found late in a referendum's proposal, such as a bug in the code of\nthe runtime that the proposal would institute."),(0,r.kt)("p",null,"If the cancellation is controversial enough that the council cannot get a two-thirds majority, then\nit will be left to the stakeholders ",(0,r.kt)("em",{parentName:"p"},"en masse")," to determine the proposal\u2019s fate."),(0,r.kt)("h3",{id:"blacklisting-proposals"},"Blacklisting Proposals"),(0,r.kt)("p",null,"A proposal can be blacklisted by Root Origin (e.g. sudo). A blacklisted proposal and its related\nreferendum (if any) are immediately ",(0,r.kt)("a",{parentName:"p",href:"#canceling"},"canceled"),". Additionally, a blacklisted proposal's\nhash cannot re-appear in the proposal queue. Blacklisting is useful when removing erroneous\nproposals that could be submitted with the same hash."),(0,r.kt)("p",null,"Upon seeing their proposal removed, a submitter who is not properly introduced to the democracy\nsystem of Polkadot might be tempted to\nre-submit the same proposal. That said, this is far from a fool-proof method of preventing invalid\nproposals from being submitted - a single changed character in a proposal's text will also change\nthe hash of the proposal, rendering the per-hash blacklist invalid."),(0,r.kt)("h2",{id:"referenda"},"Referenda"),(0,r.kt)("p",null,"Referenda are simple, inclusive, stake-based voting schemes. Each referendum has a specific proposal\nthat takes the form of a ",(0,r.kt)("strong",{parentName:"p"},"privileged function")," call in the runtime. That function includes the\nmost powerful ",(0,r.kt)("strong",{parentName:"p"},"call"),": ",(0,r.kt)("inlineCode",{parentName:"p"},"set_code"),', which can switch out the entire runtime code, achieving what\nwould otherwise require a "hard fork".'),(0,r.kt)("p",null,'Referenda are discrete events, have a fixed period where voting happens, and then are tallied, and\nthe function call is executed if the vote is approved. Referenda are always binary: your only\noptions in voting are "aye", "nay", or abstaining entirely.'),(0,r.kt)("h3",{id:"referenda-timeline"},"Referenda Timeline"),(0,r.kt)("p",null,"The structure of the timeline for all referenda is the same regardless of who initiates the\nproposal, although the timeline length can vary (see below)."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"gov1-timeline",src:a(11173).Z,width:"1920",height:"800"})),(0,r.kt)("p",null,"The figure above provides a summary view of the referenda timeline for Governance V1."),(0,r.kt)("p",null,"In (1), the proposal is submitted, and the Launch Period starts. During this period of indefinite\nlength the voters can ",(0,r.kt)("a",{parentName:"p",href:"#endorsing-proposals"},"endorse")," proposals by bonding the same amount of tokens\nused by the depositor. Deposited tokens for endorsement will be returned once the proposal becomes a\nreferendum. During the launch period, the proposal will compete with other proposals, and the one\nthat gets to the top will be selected for a referendum when the next voting period starts."),(0,r.kt)("p",null,"The figure shows that the launch period is shown with a fixed length. Still, it varies depending on\nwho initiated the proposal and how many proposals there are in the pipeline. Council motions will\nlikely have a short launch period when compared to the public referenda which might take longer\nunless they are the only ones in the pipeline."),(0,r.kt)("p",null,"In (2), the proposal is selected for a referendum. Proposals initiated by the public will become a\n",(0,r.kt)("a",{parentName:"p",href:"#public-referenda"},"public referendum"),", while those initiated by the council will become\n",(0,r.kt)("a",{parentName:"p",href:"#council-referenda"},"council referenda"),". The voting period lasts\n28 days, after which, if the proposal is\napproved, it will go through an enactment period. Rejected proposals will need to start from (1).\nNote that Governance V1 uses an ",(0,r.kt)("a",{parentName:"p",href:"#alternating-voting-timetable"},"alternating voting timeline")," where\nvoters can vote either for a public proposal or a council motion every\n28 days."),(0,r.kt)("p",null,"In (3), the proposal is approved and moves through the ",(0,r.kt)("a",{parentName:"p",href:"#enactment"},"enactment period")," that can be of\ndifferent lengths depending on who initiated the proposal in the first place, with emergency\nproposals being the fastest ones and the only ones that can be voted simultaneously with other\nreferenda."),(0,r.kt)("h3",{id:"public-referenda"},"Public Referenda"),(0,r.kt)("p",null,"Public referenda will have a ",(0,r.kt)("a",{parentName:"p",href:"#adaptive-quorum-biasing"},(0,r.kt)("strong",{parentName:"a"},"positive turnout bias")),", meaning that\nthey will require a heavy supermajority of ",(0,r.kt)("em",{parentName:"p"},"aye")," votes to pass at low turnouts but as turnout\nincreases towards 100%, it will require a simple majority of ",(0,r.kt)("em",{parentName:"p"},"aye")," votes to pass (i.e. 51% wins)."),(0,r.kt)("p",null,"Note that the bonded tokens will be released once the proposal is tabled (that is, brought to a\nvote), and a maximum of\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.democracy.maxProposals",defaultValue:100,mdxType:"RPC"}),"\n","\npublic proposals can be in the proposal queue."),(0,r.kt)("admonition",{title:"turnout",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"The total number of voting tokens excluding conviction or ",(0,r.kt)("a",{parentName:"p",href:"#voluntary-locking"},"voluntary locking"),".")),(0,r.kt)("h3",{id:"council-referenda"},"Council Referenda"),(0,r.kt)("p",null,"Unanimous Council - When all council members agree on a proposal, it can be moved to a referendum\nwith a ",(0,r.kt)("a",{parentName:"p",href:"#adaptive-quorum-biasing"},(0,r.kt)("strong",{parentName:"a"},"negative turnout bias")),". Briefly, it will require a heavy\nsupermajority of ",(0,r.kt)("em",{parentName:"p"},"nay")," votes to reject at low turnouts, but as turnout increases towards 100%, it\nwill require a simple majority of ",(0,r.kt)("em",{parentName:"p"},"nay")," votes to fail (i.e. 51% wins)."),(0,r.kt)("p",null,"Majority Council - When agreement from only a simple majority of council members occurs, the\nreferendum will need ",(0,r.kt)("a",{parentName:"p",href:"#adaptive-quorum-biasing"},(0,r.kt)("strong",{parentName:"a"},"simple majority"))," to pass."),(0,r.kt)("admonition",{title:"Public- vs. Council-initiated Referenda",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Public referenda must be agreed upon using a positive bias to mitigate attacks by malicious or\nill-conceived proposals. Conversely, when a proposal is unanimously voted in favor by the council,\nit benefits from using the negative bias. We assume low turnout is less problematic if the council\nproposes a referendum. Also, the council members are elected by the community and have strong\ntechnical as well as functional knowledge about the system, and we assume solid justifications back\nchanges proposed by the council.")),(0,r.kt)("h3",{id:"alternating-voting-timetable"},"Alternating Voting Timetable"),(0,r.kt)("p",null,"All referenda are executed by Root Origin. It follows that multiple referenda cannot be voted upon\nin the same period, excluding emergency referenda. An emergency referendum occurring at the same\ntime as a regular referendum (either public- or council-proposed) is the only time multiple\nreferenda can be voted on."),(0,r.kt)("p",null,"Every\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.democracy.votingPeriod",defaultValue:403200,filter:"blocksToDays",mdxType:"RPC"}),"\n","\ndays, a new referendum will come up for a vote, assuming there is at least one proposal in one of\nthe queues. There is a queue for Council-approved proposals and a queue for publicly-submitted\nproposals. The referendum to be voted upon alternates between the top proposal in the two queues,\nwhere the proposals' rank is based on ",(0,r.kt)("a",{parentName:"p",href:"#endorsing-proposals"},"endorsement")," (i.e. bonded tokens)."),(0,r.kt)("h3",{id:"adaptive-quorum-biasing"},"Adaptive Quorum Biasing"),(0,r.kt)("p",null,"Polkadot introduces the concept of ",(0,r.kt)("strong",{parentName:"p"},"Adaptive\nQuorum Biasing"),", which is used to alter the effective super-majority required to make it easier or\nmore difficult for a proposal to pass depending on voting power (turnout) and origin (Council or\npublic)."),(0,r.kt)("p",null,"Adaptive Quorum Biasing creates three tallying mechanisms: majority carry, super-majority approve,\nand super-majority against. They all equate to a simple majority-carry system at 100% turnout. Their\nselection depends on which entity proposed the proposal and whether all Council members voted yes\n(in the case of Council Referenda)."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},(0,r.kt)("strong",{parentName:"th"},"Entity")),(0,r.kt)("th",{parentName:"tr",align:"center"},(0,r.kt)("strong",{parentName:"th"},"Metric")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Public"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Positive Turnout Bias (Super-Majority Approve)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Council (Complete agreement)"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Negative Turnout Bias (Super-Majority Against)")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Council (Majority agreement)"),(0,r.kt)("td",{parentName:"tr",align:"center"},"Simple Majority")))),(0,r.kt)("p",null,"Let's use the image below as an example."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"adaptive-quorum-biasing",src:a(72895).Z,width:"537",height:"439"})),(0,r.kt)("p",null,"If a publicly submitted referendum only has a 25% turnout, the tally of ",(0,r.kt)("em",{parentName:"p"},"aye")," votes has to reach 66%\nfor it to pass since we applied ",(0,r.kt)("strong",{parentName:"p"},"Positive Turnout Bias"),". In contrast, when it has a 75% turnout,\nthe tally of ",(0,r.kt)("em",{parentName:"p"},"aye")," votes has to reach 54%, which means that the super-majority required decreases as\nthe turnout increases. A positive turnout bias, whereby a heavy super-majority of aye votes is\nrequired to carry at low turnouts. However, as turnout increases towards 100%, it becomes a simple\nmajority carry as below."),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://latex.codecogs.com/svg.latex?%5Clarge&space;%7Bagainst&space;%5Cover&space;%5Csqrt%7Bturnout%7D%7D&space;%3C&space;%7Bapprove&space;%5Cover&space;%5Csqrt%7Belectorate%7D%7D",alt:null})),(0,r.kt)("p",null,"Where ",(0,r.kt)("inlineCode",{parentName:"p"},"approve")," is the number of ",(0,r.kt)("em",{parentName:"p"},"aye")," votes, ",(0,r.kt)("inlineCode",{parentName:"p"},"against")," is the number of ",(0,r.kt)("em",{parentName:"p"},"nay")," votes, ",(0,r.kt)("inlineCode",{parentName:"p"},"turnout")," is\nthe total number of voting tokens excluding ",(0,r.kt)("a",{parentName:"p",href:"#voluntary-locking"},"voluntary locking"),", and\n",(0,r.kt)("inlineCode",{parentName:"p"},"electorate")," is the total number of tokens issued in the network."),(0,r.kt)("p",null,"When the council proposes a new proposal through unanimous consent, the referendum would be put to\nthe vote using ",(0,r.kt)("strong",{parentName:"p"},"Negative Turnout Bias"),". Referring to the above image, when a Council referendum\nonly has a 25% turnout, the tally of ",(0,r.kt)("em",{parentName:"p"},"aye")," votes has to reach 34% for it to pass, while if the\nturnout increases to 75%, the tally of ",(0,r.kt)("em",{parentName:"p"},"aye")," votes has to reach 46%. A negative turnout bias\nrequires a heavy super-majority of ",(0,r.kt)("em",{parentName:"p"},"nay")," votes to reject at low turnouts. However, as turnout\nincreases towards 100%, it becomes a simple majority carry as below."),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://latex.codecogs.com/svg.latex?%5Clarge&space;%7Bagainst&space;%5Cover&space;%5Csqrt%7Belectorate%7D%7D&space;%3C&space;%7Bapprove&space;%5Cover&space;%5Csqrt%7Bturnout%7D%7D",alt:null})),(0,r.kt)("p",null,"In short, when the turnout rate is low, a super-majority is required to reject the proposal, which\nmeans a lower threshold of ",(0,r.kt)("em",{parentName:"p"},"aye")," votes must be reached. As turnout increases toward 100%, it becomes\na simple majority, a simple comparison of votes. If there are more ",(0,r.kt)("em",{parentName:"p"},"aye")," votes than ",(0,r.kt)("em",{parentName:"p"},"nay"),", then the\nproposal is carried, no matter how much stake votes on the proposal."),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://latex.codecogs.com/svg.latex?%5Clarge&space;%7Bapprove%7D&space;%3E&space;%7Bagainst%7D",alt:null})),(0,r.kt)("p",null,"To know more about where these above formulas come from, please read the\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/blob/master/frame/democracy/src/vote_threshold.rs"},"democracy pallet"),"."),(0,r.kt)("h4",{id:"example-of-adaptive-quorum-biasing"},"Example of Adaptive Quorum Biasing"),(0,r.kt)("p",null,"Let's assume we only have 1,500 DOT tokens in\ntotal and that this is a public proposal."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"John: 500 DOT"),(0,r.kt)("li",{parentName:"ul"},"Peter: 100 DOT"),(0,r.kt)("li",{parentName:"ul"},"Lilly: 150 DOT"),(0,r.kt)("li",{parentName:"ul"},"JJ: 150 DOT"),(0,r.kt)("li",{parentName:"ul"},"Ken: 600 DOT")),(0,r.kt)("p",null,"John: Votes ",(0,r.kt)("inlineCode",{parentName:"p"},"Yes")," for a 4 week lock period =>\n500 x 1 = 500 Votes"),(0,r.kt)("p",null,"Peter: Votes ",(0,r.kt)("inlineCode",{parentName:"p"},"Yes")," for a 4 week lock period =>\n100 x 1 = 100 Votes"),(0,r.kt)("p",null,"JJ: Votes ",(0,r.kt)("inlineCode",{parentName:"p"},"No")," for a 16 week lock period =>\n150 x 3 = 450 Votes"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"approve = 600"),(0,r.kt)("li",{parentName:"ul"},"against = 450"),(0,r.kt)("li",{parentName:"ul"},"turnout = 750"),(0,r.kt)("li",{parentName:"ul"},"electorate = 1500")),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://latex.codecogs.com/svg.latex?%5Clarge&space;%5Cfrac%7B450%7D%7B%5Csqrt%7B750%7D%7D&space;%3C&space;%5Cfrac%7B600%7D%7B%5Csqrt%7B1500%7D%7D",alt:"\\Large \\frac{450}{\\sqrt{750}}&space;<&space;\\frac{600}{\\sqrt{1500}}"})),(0,r.kt)("p",null,(0,r.kt)("img",{parentName:"p",src:"https://latex.codecogs.com/svg.latex?%5Clarge&space;%7B16.432%7D&space;%3C&space;%7B15.492%7D",alt:"\\Large {16.432}&space;<&space;{15.492}"})),(0,r.kt)("p",null,"Since the above example is a public referendum, ",(0,r.kt)("strong",{parentName:"p"},"Super-Majority Approve")," would be used to\ncalculate the result. Super-Majority Approve requires more ",(0,r.kt)("em",{parentName:"p"},"aye")," votes to pass the referendum when\nturnout is low; therefore, based on the above result, the referendum will be rejected."),(0,r.kt)("admonition",{title:"only the winning voter's tokens are locked.",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"If the voters on the losing side of the referendum believe that the outcome will have adverse\neffects, their tokens are transferrable, so they will not be locked into the decision. Winning\nproposals are autonomously enacted after the ",(0,r.kt)("a",{parentName:"p",href:"#enactment"},"enactment period"),".")),(0,r.kt)("h3",{id:"enactment"},"Enactment"),(0,r.kt)("p",null,"Referenda are considered ",(0,r.kt)("em",{parentName:"p"},"baked")," if they are closed and tallied. Assuming a referendum is approved,\nit will be scheduled for ",(0,r.kt)("strong",{parentName:"p"},"enactment"),". Referenda are considered ",(0,r.kt)("em",{parentName:"p"},"unbaked")," if they are pending an\noutcome, i.e. being voted on."),(0,r.kt)("p",null,"All referenda are associated with an enactment delay or ",(0,r.kt)("strong",{parentName:"p"},"enactment period"),". This is the period\nbetween a referendum ending and (assuming it was approved) the changes being enacted."),(0,r.kt)("p",null,"For public and Council referenda, the enactment period is a fixed time of\n",(0,r.kt)(i.Z,{network:"polkadot",path:"consts.democracy.enactmentPeriod",defaultValue:403200,filter:"blocksToDays",mdxType:"RPC"}),"",'.\nFor proposals submitted as part of the enactment of a prior referendum, it can be set as desired.\nEmergency proposals deal with major problems with the network and need to be "fast-tracked". These\nwill have a shorter enactment period.'),(0,r.kt)("h2",{id:"voting-on-a-referendum"},"Voting on a Referendum"),(0,r.kt)("p",null,"To vote, a voter generally must lock their tokens up for at least the enactment period beyond the\nend of the referendum. This is to ensure that some minimal economic buy-in to the result is needed\nand to dissuade vote selling."),(0,r.kt)("admonition",{title:"Referenda explainer video",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"To learn more about voting on referenda, please check out our\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=BkbhhlsezGA&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&index=31&ab_channel=Polkadot"},"technical explainer video"),".")),(0,r.kt)("p",null,"It is possible to vote without locking, but your vote is worth a small fraction of a normal vote,\ngiven your stake. At the same time, holding only a small amount of tokens does not mean that the\nholder cannot influence the referendum result, thanks to time-locking or ",(0,r.kt)("strong",{parentName:"p"},"voluntary locking")," (see\nbelow)."),(0,r.kt)("h3",{id:"voluntary-locking"},"Voluntary Locking"),(0,r.kt)("admonition",{title:"Voluntary Locking",type:"info"},(0,r.kt)("p",{parentName:"admonition"},"For more information about voluntary locking or conviction voting see\n",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov#voluntary-locking"},"Polkadot OpenGov"),".")),(0,r.kt)("h3",{id:"delegations"},"Delegations"),(0,r.kt)("p",null,"In Polkadot you can\n",(0,r.kt)("a",{parentName:"p",href:"/docs/maintain-guides-democracy#delegate-a-vote"},"delegate your voting power")," to another\naccount you trust if you are not willing to stay up-to-date with all referenda."),(0,r.kt)("p",null,"You can also use a ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-proxies#governance-proxy"},"governance proxy")," to vote on behalf of your\nstash account. The proxy can be yours, or you can authorize a third-party governance proxy to vote\nwith your stash. Learn more from the ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-proxies"},"dedicated page on Proxy Accounts"),"."),(0,r.kt)("h2",{id:"council"},"Council"),(0,r.kt)("p",null,'To represent passive stakeholders, Polkadot\nintroduces the idea of a "council". The council is an on-chain entity comprising several actors,\neach represented as an on-chain account. On\nPolkadot, the council currently consists of\n',(0,r.kt)(i.Z,{network:"polkadot",path:"query.council.members",defaultValue:Array(13),filter:"arrayLength",mdxType:"RPC"}),"\n","\nmembers."),(0,r.kt)("p",null,"Along with ",(0,r.kt)("a",{parentName:"p",href:"/docs/learn-treasury"},"controlling the treasury"),", the council is called upon primarily for\nthree tasks of governance:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Proposing sensible referenda"),(0,r.kt)("li",{parentName:"ul"},"Cancelling uncontroversially dangerous or malicious referenda"),(0,r.kt)("li",{parentName:"ul"},"Electing the ",(0,r.kt)("a",{parentName:"li",href:"#technical-committee"},"Technical Committee"),".")),(0,r.kt)("p",null,"For a referendum to be proposed by the council, a strict majority of members must be in favor, with\nno member exercising a veto. Vetoes may be exercised only once by a member for any single proposal.\nIf the proposal is resubmitted after a cool-down period, they may not veto it a second time."),(0,r.kt)("p",null,"Council motion that pass with a 3/5 (60%) super-majority - but without reaching unanimous support -\nwill move to a public referendum under a neutral, majority-carries voting scheme. In the case that\nall members of the council that voted are in favor of a motion, the vote is considered unanimous and\nbecomes a referendum with ",(0,r.kt)("a",{parentName:"p",href:"#adaptive-quorum-biasing"},"negative turnout bias"),"."),(0,r.kt)("admonition",{title:"Explainer video on the Council",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"For more information, check out our\n",(0,r.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=837Vv3gdRzI"},"video explainer on Council"))),(0,r.kt)("h3",{id:"prime-members"},"Prime Members"),(0,r.kt)("p",null,"The council, being an instantiation of\n",(0,r.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate/tree/master/frame/collective"},"Substrate's Collective pallet"),",\nimplements what's called a ",(0,r.kt)("em",{parentName:"p"},"prime member")," whose vote acts as the default for other members that fail\nto vote before the timeout."),(0,r.kt)("p",null,"The prime member is chosen based on a ",(0,r.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Borda_count"},"Borda count"),"."),(0,r.kt)("p",null,'The purpose of having a prime council member is to ensure a quorum, even when several members\nabstain from a vote. Council members might be tempted to vote a "soft rejection" or a "soft\napproval" by not voting and letting the others vote. The existence of a prime member forces\ncouncilors to be explicit in their votes or have their vote counted for whatever is voted on by the\nprime.'),(0,r.kt)("h2",{id:"technical-committee"},"Technical Committee"),(0,r.kt)("p",null,"The Technical Committee(TC) was introduced in the\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.network/kusama-rollout-and-governance/"},"Kusama rollout and governance post")," as one\nof the three chambers of Kusama governance (along with the Council and the Referendum chamber). The\nTC is composed of the teams that have successfully implemented or specified either a\nPolkadot runtime or Polkadot Host. Teams are\nadded or removed from the TC via a simple majority vote of the ",(0,r.kt)("a",{parentName:"p",href:"#council"},"Council"),"."),(0,r.kt)("p",null,'The TC aims to safeguard against malicious referenda, implement bug fixes, reverse faulty runtime\nupdates, or add new but battle-tested features. The TC can fast-track proposals using the Democracy\npallet and is the only origin that can trigger the fast-tracking functionality. We can think of the\nTC as a "unique origin" that cannot generate proposals but fast-track existing ones.'),(0,r.kt)("p",null,"Fast-tracked referenda are the only referenda that can be active alongside another active\nreferendum. Thus, with fast-tracked referenda, it is possible to have two active referendums\nsimultaneously. Voting on one does not prevent a user from voting on the other."),(0,r.kt)("h2",{id:"frequently-asked-questions"},"Frequently Asked Questions"),(0,r.kt)("h3",{id:"how-to-be-a-council-member"},"How to be a council member?"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"approval-vote",src:a(93395).Z,width:"850",height:"340"})),(0,r.kt)("p",null,"All stakeholders can signal their approval of any of the registered candidates."),(0,r.kt)("p",null,"Council elections are handled by the same ",(0,r.kt)("a",{parentName:"p",href:"../docs/learn-phragmen"},"Phragm\xe9n election")," process that\nselects validators from the available pool based on nominations. However, token holders' votes for\ncouncilors are isolated from any nominations they may have on validators. Council terms last for one\nweek."),(0,r.kt)("p",null,"At the end of each term, ",(0,r.kt)("a",{parentName:"p",href:"../docs/learn-phragmen#algorithm"},"Phragm\xe9n election algorithm")," runs and\nthe result will choose the new councilors based on the vote configurations of all voters. The\nelection also chooses a set number of runners-up, which is currently\n20 that will remain in the queue with their votes\nintact."),(0,r.kt)("p",null,'As opposed to a "first-past-the-post" electoral system, where voters can only vote for a single\ncandidate from a list, a Phragm\xe9n election is a more expressive way to include each voter\u2019s views.\nToken holders can treat it as a way to support as many candidates as they want. The election\nalgorithm will find a fair subset of the candidates that most closely matches the expressed\nindications of the electorate as a whole.'),(0,r.kt)("p",null,"Let's take a look at the example below."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"Round 1"),(0,r.kt)("th",{parentName:"tr",align:"center"}),(0,r.kt)("th",{parentName:"tr",align:"center"}),(0,r.kt)("th",{parentName:"tr",align:"center"}),(0,r.kt)("th",{parentName:"tr",align:"center"}),(0,r.kt)("th",{parentName:"tr",align:"center"}))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("strong",{parentName:"td"},"Token Holders")),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("strong",{parentName:"td"},"Candidates")),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"},"A"),(0,r.kt)("td",{parentName:"tr",align:"center"},"B"),(0,r.kt)("td",{parentName:"tr",align:"center"},"C"),(0,r.kt)("td",{parentName:"tr",align:"center"},"D"),(0,r.kt)("td",{parentName:"tr",align:"center"},"E")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Peter"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Alice"),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Bob"),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Kelvin"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("strong",{parentName:"td"},"Total")),(0,r.kt)("td",{parentName:"tr",align:"center"},"2"),(0,r.kt)("td",{parentName:"tr",align:"center"},"1"),(0,r.kt)("td",{parentName:"tr",align:"center"},"3"),(0,r.kt)("td",{parentName:"tr",align:"center"},"2"),(0,r.kt)("td",{parentName:"tr",align:"center"},"2")))),(0,r.kt)("p",null,"The above example shows that candidate C wins the election in round 1, while candidates A, B, D & E\nkeep remaining on the candidates' list for the next round."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"Round 2"),(0,r.kt)("th",{parentName:"tr",align:"center"}),(0,r.kt)("th",{parentName:"tr",align:"center"}),(0,r.kt)("th",{parentName:"tr",align:"center"}),(0,r.kt)("th",{parentName:"tr",align:"center"}))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("strong",{parentName:"td"},"Token Holders")),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("strong",{parentName:"td"},"Candidates")),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"},"A"),(0,r.kt)("td",{parentName:"tr",align:"center"},"B"),(0,r.kt)("td",{parentName:"tr",align:"center"},"D"),(0,r.kt)("td",{parentName:"tr",align:"center"},"E")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Peter"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Alice"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Bob"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"Kelvin"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"},"X"),(0,r.kt)("td",{parentName:"tr",align:"center"}),(0,r.kt)("td",{parentName:"tr",align:"center"})),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("strong",{parentName:"td"},"Total")),(0,r.kt)("td",{parentName:"tr",align:"center"},"4"),(0,r.kt)("td",{parentName:"tr",align:"center"},"4"),(0,r.kt)("td",{parentName:"tr",align:"center"},"1"),(0,r.kt)("td",{parentName:"tr",align:"center"},"1")))),(0,r.kt)("p",null,"The top-N (say 4 in this example) runners-up can remain, and their votes persist until the next\nelection. After round 2, even though candidates A & B get the same number of votes in this round,\ncandidate A gets elected because after adding the older unused approvals, it is higher than B."),(0,r.kt)("h3",{id:"how-can-i-appeal-to-the-council-to-enact-a-change-on-my-behalf"},"How can I appeal to the council to enact a change on my behalf?"),(0,r.kt)("p",null,"In some circumstances, you may want to appeal to the on-chain council to enact a change on your\nbehalf. One example of this circumstance is the case of lost or locked funds when the funds were\nlost due to a human interface error (such as inputting an address for another network). Another\nexample is if you participated in the 2017 Polkadot ICO with a multi-sig address which now does not\nlet you sign a message easily. When these circumstances can be proven beyond a reasonable doubt to\nbe an error, the council ",(0,r.kt)("em",{parentName:"p"},"may")," consider a governance motion to correct it."),(0,r.kt)("p",null,"The first step to appeal to the council is to contact the councilors. There is no singular place\nwhere you are guaranteed to grab every councilor\u2019s ear with your message. However, there are a\nhandful of good places to start where you can get the attention of some of them. The\n",(0,r.kt)("a",{parentName:"p",href:"https://matrix.to/#/#Polkadot-Direction:parity.io"},"Polkadot Direction"),"\n"," matrix\nroom is one such place. After creating an account and joining this room, you can post a\nwell-thought-through message here that lays down your case and justifies why you think the council\nshould consider enacting a change to the protocol on your behalf."),(0,r.kt)("p",null,"At some point, you will likely need a place for a longer-form discussion. For this, making a post on\n",(0,r.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/"},"Polkassembly")," is the recommended place to do so. When you write\na post on Polkassembly, present all the evidence for your circumstances and state clearly what kind\nof change you would suggest to the councilors to enact."),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"Remember, the councilors do not need to make the change, it is your responsibility to make a strong\ncase for why the change should be made.")),(0,r.kt)("h2",{id:"resources"},"Resources"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/paritytech/polkadot/wiki/Governance"},"Initial Governance Description")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://github.com/paritytech/substrate/tree/master/frame/democracy/src"},"Democracy Pallet")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=VsZuDJMmVPY&feature=youtu.be&t=24734"},"Governance Demo")," - Dr.\nGavin Wood presents the initial governance structure for Polkadot. (Video)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://www.crowdcast.io/e/governance-on-polkadot--"},"Governance on Polkadot")," - A webinar\nexplaining how governance works in Polkadot and Kusama.")))}k.isMDXComponent=!0},74562:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/gov1-overview-515a8f55923136c0b6e6bd23bea3d836.png"},11173:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/gov1-timeline-69424fec137182a898f00c29a90fbdb1.png"},72895:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/adaptive-quorum-biasing-18c2e70b6b9d2c3abf563219b11974dc.png"},93395:(e,t,a)=>{"use strict";a.d(t,{Z:()=>n});const n=a.p+"assets/images/approval-vote-d0622e1c0a9bc7c50ab9f23761488dbe.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/f47489cd.70e3ff3a.js b/assets/js/f47489cd.70e3ff3a.js new file mode 100644 index 000000000000..e3f81838f2f6 --- /dev/null +++ b/assets/js/f47489cd.70e3ff3a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[1966],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),d=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=d(e.components);return a.createElement(l.Provider,{value:t},e.children)},c="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=d(n),m=r,h=c["".concat(l,".").concat(m)]||c[m]||p[m]||o;return n?a.createElement(h,i(i({ref:t},u),{},{components:n})):a.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:r,i[1]=s;for(var d=2;d{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var a=n(87462),r=n(63366),o=(n(67294),n(3905)),i=["components"],s={id:"learn-runtime-upgrades",title:"Runtime Upgrades",sidebar_label:"Runtime Upgrades",description:"Forkless Runtime Upgrades on Polkadot.",keywords:["runtime","upgrades","releases","forkless"],slug:"../learn-runtime-upgrades"},l=void 0,d={unversionedId:"learn/learn-runtime-upgrades",id:"learn/learn-runtime-upgrades",title:"Runtime Upgrades",description:"Forkless Runtime Upgrades on Polkadot.",source:"@site/../docs/learn/learn-runtime-upgrades.md",sourceDirName:"learn",slug:"/learn-runtime-upgrades",permalink:"/docs/learn-runtime-upgrades",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-runtime-upgrades.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696928140,formattedLastUpdatedAt:"Oct 10, 2023",frontMatter:{id:"learn-runtime-upgrades",title:"Runtime Upgrades",sidebar_label:"Runtime Upgrades",description:"Forkless Runtime Upgrades on Polkadot.",keywords:["runtime","upgrades","releases","forkless"],slug:"../learn-runtime-upgrades"},sidebar:"docs",previous:{title:"WebAssembly (Wasm)",permalink:"/docs/learn-wasm"},next:{title:"Consensus",permalink:"/docs/learn-consensus"}},u={},c=[{value:"Forkless Upgrades",id:"forkless-upgrades",level:2},{value:"Client Releases",id:"client-releases",level:2},{value:"Runtime vs Client versions",id:"runtime-vs-client-versions",level:3},{value:"Runtime Upgrades for Various Users",id:"runtime-upgrades-for-various-users",level:2},{value:"For Infrastructure Providers",id:"for-infrastructure-providers",level:3},{value:"For Nominators",id:"for-nominators",level:3},{value:"Monitoring Runtime Changes",id:"monitoring-runtime-changes",level:2}],p={toc:c},m="wrapper";function h(e){var t=e.components,s=(0,r.Z)(e,i);return(0,o.kt)(m,(0,a.Z)({},p,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Runtime upgrades allow Polkadot to change the\nlogic of the chain without the need for a hard fork."),(0,o.kt)("h2",{id:"forkless-upgrades"},"Forkless Upgrades"),(0,o.kt)("p",null,'You may have encountered the term "hard fork" before in the blockchain space. A ',(0,o.kt)("strong",{parentName:"p"},"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."),(0,o.kt)("p",null,'By using Wasm in Substrate (the framework powering Polkadot, Kusama, and many connecting chains),\nparachains are given the ability to upgrade their runtime (a chain\'s "business logic") without hard\nforking.'),(0,o.kt)("p",null,"Rather than encoding the runtime in the nodes,\nPolkadot nodes contain a WebAssembly\n",(0,o.kt)("a",{parentName:"p",href:"learn-polkadot-host"},"execution host"),". They maintain consensus on a very low-level and\nwell-established instruction set. Upgrades can be small, isolated, and very specific by deploying\nWasm on-chain and having nodes auto-enact the new logic at a particular block height."),(0,o.kt)("p",null,"The Polkadot runtime is stored on the\nPolkadot blockchain itself.\nPolkadot can upgrade its runtime by upgrading\nthe logic 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 ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-governance"},"on-chain governance")," system, which also enacts them\nautonomously."),(0,o.kt)("p",null,"As 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."),(0,o.kt)("h2",{id:"client-releases"},"Client Releases"),(0,o.kt)("p",null,"The existing runtime logic is followed to update the ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-wasm"},"Wasm")," 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."),(0,o.kt)("p",null,"Transactions 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\u2019t submit a transaction before the upgrade, it is better to wait and construct it afterward."),(0,o.kt)("p",null,"Although upgrading your nodes is generally not necessary to follow an upgrade, we recommend\nfollowing the Polkadot releases and upgrading\npromptly, especially for high-priority or critical releases."),(0,o.kt)("admonition",{title:"New Client Releases",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"The details about the latest client releases can be found in the\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/releases"},"releases section on the Polkadot repository"),".\nA detailed analysis for client releases can be viewed on the\n",(0,o.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/tag/release-analysis"},"Polkadot Forum"),".")),(0,o.kt)("h3",{id:"runtime-vs-client-versions"},"Runtime vs Client versions"),(0,o.kt)("p",null,"The runtime and client versions are distinct from each other. The runtime versioning typically looks\nlike ",(0,o.kt)("inlineCode",{parentName:"p"},"network-xxxx"),", whereas the client versioning looks like ",(0,o.kt)("inlineCode",{parentName:"p"},"vx.x.xx"),". For instance, the runtime\nversion shown on the top left section of Polkadot-JS UI below is ",(0,o.kt)("inlineCode",{parentName:"p"},"kusama-9370"),", and the client\n(node) version shown on the top right section is ",(0,o.kt)("inlineCode",{parentName:"p"},"v0.9.36"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Runtime vs Client versioning",src:n(87390).Z,width:"1917",height:"280"})),(0,o.kt)("admonition",{title:"Querying runtime and client versions",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"The runtime version can be queried on-chain through Polkadot-JS UI by navigating to the Developer\ntab > Chain State > Storage > system and query ",(0,o.kt)("inlineCode",{parentName:"p"},"lastRuntimeUpgrade()"),"."),(0,o.kt)("p",{parentName:"admonition"},"The node version can be queried by navigating to the Developer tab > RPC calls > system and query\n",(0,o.kt)("inlineCode",{parentName:"p"},"version()"),".")),(0,o.kt)("h2",{id:"runtime-upgrades-for-various-users"},"Runtime Upgrades for Various Users"),(0,o.kt)("h3",{id:"for-infrastructure-providers"},"For Infrastructure Providers"),(0,o.kt)("p",null,"Infrastructure services include but are not limited to the following:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-upgrade"},"Validators")),(0,o.kt)("li",{parentName:"ul"},"API services"),(0,o.kt)("li",{parentName:"ul"},"Node-as-a-Service (NaaS)"),(0,o.kt)("li",{parentName:"ul"},"General infrastructure management (e.g. block explorers, custodians)"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"./wallets"},"Wallets"))),(0,o.kt)("p",null,"For 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."),(0,o.kt)("p",null,"General infrastructure providers, aside from following the\nPolkadot releases and upgrading in a timely\nmanner, should monitor changes to runtime events and auxiliary tooling, such as the\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate-api-sidecar"},"Substrate API Sidecar"),"."),(0,o.kt)("p",null,"Transactions constructed for runtime ",(0,o.kt)("inlineCode",{parentName:"p"},"n")," will not work for any other runtime ",(0,o.kt)("inlineCode",{parentName:"p"},">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."),(0,o.kt)("h3",{id:"for-nominators"},"For ",(0,o.kt)("a",{parentName:"h3",href:"/docs/maintain-guides-how-to-nominate-polkadot"},"Nominators")),(0,o.kt)("p",null,"Runtime 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."),(0,o.kt)("h2",{id:"monitoring-runtime-changes"},"Monitoring Runtime Changes"),(0,o.kt)("p",null,"You 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. Monitor the chain for:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"democracy(Started)")," events and log ",(0,o.kt)("inlineCode",{parentName:"li"},"index")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"blockNumber"),". This event indicates that a\nreferendum has started (although it does not mean it is a runtime upgrade). Get the referendum\ninfo","*","; it should have a status of ",(0,o.kt)("inlineCode",{parentName:"li"},"Ongoing"),". Find the ending block number (",(0,o.kt)("inlineCode",{parentName:"li"},"end"),") and the\nenactment ",(0,o.kt)("inlineCode",{parentName:"li"},"delay")," (delay). If the referendum passes, it will execute on block number\n",(0,o.kt)("inlineCode",{parentName:"li"},"end + delay"),"."),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"democracy(Passed)"),", ",(0,o.kt)("inlineCode",{parentName:"li"},"democracy(NotPassed)"),", or, ",(0,o.kt)("inlineCode",{parentName:"li"},"democracy(Cancelled)")," events citing the index.\nIf ",(0,o.kt)("inlineCode",{parentName:"li"},"Passed"),", you need to look at the ",(0,o.kt)("inlineCode",{parentName:"li"},"scheduler(Scheduled)")," event in the same block for the\nenactment block."),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"democracy(PreimageNoted)")," events with the same hash as the ",(0,o.kt)("inlineCode",{parentName:"li"},"ReferendumInfoOf(index)")," item. This\nmay be up to the last block before execution, but it will not work if this is missing."),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"democracy(Executed)")," events for actual execution. In the case of a runtime upgrade, there will\nalso be a ",(0,o.kt)("inlineCode",{parentName:"li"},"system(CodeUpdated)")," event.")),(0,o.kt)("p",null,"You can also monitor ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/"},"Polkassembly")," for discussions on on-chain\nproposals and referenda."),(0,o.kt)("p",null,"*"," E.g. via ",(0,o.kt)("inlineCode",{parentName:"p"},"pallets/democracy/storage/ReferendumInfoOf?key1=index&at=blockNumber")," on Sidecar."))}h.isMDXComponent=!0},87390:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/runtime-node-version-2903ab51ac01ad44e6424cafc0f63fdf.png"}}]); \ No newline at end of file diff --git a/assets/js/f47489cd.da9f44ad.js b/assets/js/f47489cd.da9f44ad.js deleted file mode 100644 index 3a676c6aab4b..000000000000 --- a/assets/js/f47489cd.da9f44ad.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[1966],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>h});var a=n(67294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),d=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=d(e.components);return a.createElement(l.Provider,{value:t},e.children)},c="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=d(n),m=r,h=c["".concat(l,".").concat(m)]||c[m]||p[m]||o;return n?a.createElement(h,i(i({ref:t},u),{},{components:n})):a.createElement(h,i({ref:t},u))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[c]="string"==typeof e?e:r,i[1]=s;for(var d=2;d{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>c});var a=n(87462),r=n(63366),o=(n(67294),n(3905)),i=["components"],s={id:"learn-runtime-upgrades",title:"Runtime Upgrades",sidebar_label:"Runtime Upgrades",description:"Forkless Runtime Upgrades on Polkadot.",keywords:["runtime","upgrades","releases","forkless"],slug:"../learn-runtime-upgrades"},l=void 0,d={unversionedId:"learn/learn-runtime-upgrades",id:"learn/learn-runtime-upgrades",title:"Runtime Upgrades",description:"Forkless Runtime Upgrades on Polkadot.",source:"@site/../docs/learn/learn-runtime-upgrades.md",sourceDirName:"learn",slug:"/learn-runtime-upgrades",permalink:"/docs/learn-runtime-upgrades",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-runtime-upgrades.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1696928140,formattedLastUpdatedAt:"Oct 10, 2023",frontMatter:{id:"learn-runtime-upgrades",title:"Runtime Upgrades",sidebar_label:"Runtime Upgrades",description:"Forkless Runtime Upgrades on Polkadot.",keywords:["runtime","upgrades","releases","forkless"],slug:"../learn-runtime-upgrades"},sidebar:"docs",previous:{title:"WebAssembly (Wasm)",permalink:"/docs/learn-wasm"},next:{title:"Polkadot OpenGov",permalink:"/docs/learn-polkadot-opengov"}},u={},c=[{value:"Forkless Upgrades",id:"forkless-upgrades",level:2},{value:"Client Releases",id:"client-releases",level:2},{value:"Runtime vs Client versions",id:"runtime-vs-client-versions",level:3},{value:"Runtime Upgrades for Various Users",id:"runtime-upgrades-for-various-users",level:2},{value:"For Infrastructure Providers",id:"for-infrastructure-providers",level:3},{value:"For Nominators",id:"for-nominators",level:3},{value:"Monitoring Runtime Changes",id:"monitoring-runtime-changes",level:2}],p={toc:c},m="wrapper";function h(e){var t=e.components,s=(0,r.Z)(e,i);return(0,o.kt)(m,(0,a.Z)({},p,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Runtime upgrades allow Polkadot to change the\nlogic of the chain without the need for a hard fork."),(0,o.kt)("h2",{id:"forkless-upgrades"},"Forkless Upgrades"),(0,o.kt)("p",null,'You may have encountered the term "hard fork" before in the blockchain space. A ',(0,o.kt)("strong",{parentName:"p"},"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."),(0,o.kt)("p",null,'By using Wasm in Substrate (the framework powering Polkadot, Kusama, and many connecting chains),\nparachains are given the ability to upgrade their runtime (a chain\'s "business logic") without hard\nforking.'),(0,o.kt)("p",null,"Rather than encoding the runtime in the nodes,\nPolkadot nodes contain a WebAssembly\n",(0,o.kt)("a",{parentName:"p",href:"learn-polkadot-host"},"execution host"),". They maintain consensus on a very low-level and\nwell-established instruction set. Upgrades can be small, isolated, and very specific by deploying\nWasm on-chain and having nodes auto-enact the new logic at a particular block height."),(0,o.kt)("p",null,"The Polkadot runtime is stored on the\nPolkadot blockchain itself.\nPolkadot can upgrade its runtime by upgrading\nthe logic 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 ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-governance"},"on-chain governance")," system, which also enacts them\nautonomously."),(0,o.kt)("p",null,"As 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."),(0,o.kt)("h2",{id:"client-releases"},"Client Releases"),(0,o.kt)("p",null,"The existing runtime logic is followed to update the ",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-wasm"},"Wasm")," 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."),(0,o.kt)("p",null,"Transactions 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\u2019t submit a transaction before the upgrade, it is better to wait and construct it afterward."),(0,o.kt)("p",null,"Although upgrading your nodes is generally not necessary to follow an upgrade, we recommend\nfollowing the Polkadot releases and upgrading\npromptly, especially for high-priority or critical releases."),(0,o.kt)("admonition",{title:"New Client Releases",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"The details about the latest client releases can be found in the\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-sdk/releases"},"releases section on the Polkadot repository"),".\nA detailed analysis for client releases can be viewed on the\n",(0,o.kt)("a",{parentName:"p",href:"https://forum.polkadot.network/tag/release-analysis"},"Polkadot Forum"),".")),(0,o.kt)("h3",{id:"runtime-vs-client-versions"},"Runtime vs Client versions"),(0,o.kt)("p",null,"The runtime and client versions are distinct from each other. The runtime versioning typically looks\nlike ",(0,o.kt)("inlineCode",{parentName:"p"},"network-xxxx"),", whereas the client versioning looks like ",(0,o.kt)("inlineCode",{parentName:"p"},"vx.x.xx"),". For instance, the runtime\nversion shown on the top left section of Polkadot-JS UI below is ",(0,o.kt)("inlineCode",{parentName:"p"},"kusama-9370"),", and the client\n(node) version shown on the top right section is ",(0,o.kt)("inlineCode",{parentName:"p"},"v0.9.36"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Runtime vs Client versioning",src:n(87390).Z,width:"1917",height:"280"})),(0,o.kt)("admonition",{title:"Querying runtime and client versions",type:"info"},(0,o.kt)("p",{parentName:"admonition"},"The runtime version can be queried on-chain through Polkadot-JS UI by navigating to the Developer\ntab > Chain State > Storage > system and query ",(0,o.kt)("inlineCode",{parentName:"p"},"lastRuntimeUpgrade()"),"."),(0,o.kt)("p",{parentName:"admonition"},"The node version can be queried by navigating to the Developer tab > RPC calls > system and query\n",(0,o.kt)("inlineCode",{parentName:"p"},"version()"),".")),(0,o.kt)("h2",{id:"runtime-upgrades-for-various-users"},"Runtime Upgrades for Various Users"),(0,o.kt)("h3",{id:"for-infrastructure-providers"},"For Infrastructure Providers"),(0,o.kt)("p",null,"Infrastructure services include but are not limited to the following:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-upgrade"},"Validators")),(0,o.kt)("li",{parentName:"ul"},"API services"),(0,o.kt)("li",{parentName:"ul"},"Node-as-a-Service (NaaS)"),(0,o.kt)("li",{parentName:"ul"},"General infrastructure management (e.g. block explorers, custodians)"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"./wallets"},"Wallets"))),(0,o.kt)("p",null,"For 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."),(0,o.kt)("p",null,"General infrastructure providers, aside from following the\nPolkadot releases and upgrading in a timely\nmanner, should monitor changes to runtime events and auxiliary tooling, such as the\n",(0,o.kt)("a",{parentName:"p",href:"https://github.com/paritytech/substrate-api-sidecar"},"Substrate API Sidecar"),"."),(0,o.kt)("p",null,"Transactions constructed for runtime ",(0,o.kt)("inlineCode",{parentName:"p"},"n")," will not work for any other runtime ",(0,o.kt)("inlineCode",{parentName:"p"},">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."),(0,o.kt)("h3",{id:"for-nominators"},"For ",(0,o.kt)("a",{parentName:"h3",href:"/docs/maintain-guides-how-to-nominate-polkadot"},"Nominators")),(0,o.kt)("p",null,"Runtime 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."),(0,o.kt)("h2",{id:"monitoring-runtime-changes"},"Monitoring Runtime Changes"),(0,o.kt)("p",null,"You 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. Monitor the chain for:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"democracy(Started)")," events and log ",(0,o.kt)("inlineCode",{parentName:"li"},"index")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"blockNumber"),". This event indicates that a\nreferendum has started (although it does not mean it is a runtime upgrade). Get the referendum\ninfo","*","; it should have a status of ",(0,o.kt)("inlineCode",{parentName:"li"},"Ongoing"),". Find the ending block number (",(0,o.kt)("inlineCode",{parentName:"li"},"end"),") and the\nenactment ",(0,o.kt)("inlineCode",{parentName:"li"},"delay")," (delay). If the referendum passes, it will execute on block number\n",(0,o.kt)("inlineCode",{parentName:"li"},"end + delay"),"."),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"democracy(Passed)"),", ",(0,o.kt)("inlineCode",{parentName:"li"},"democracy(NotPassed)"),", or, ",(0,o.kt)("inlineCode",{parentName:"li"},"democracy(Cancelled)")," events citing the index.\nIf ",(0,o.kt)("inlineCode",{parentName:"li"},"Passed"),", you need to look at the ",(0,o.kt)("inlineCode",{parentName:"li"},"scheduler(Scheduled)")," event in the same block for the\nenactment block."),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"democracy(PreimageNoted)")," events with the same hash as the ",(0,o.kt)("inlineCode",{parentName:"li"},"ReferendumInfoOf(index)")," item. This\nmay be up to the last block before execution, but it will not work if this is missing."),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"democracy(Executed)")," events for actual execution. In the case of a runtime upgrade, there will\nalso be a ",(0,o.kt)("inlineCode",{parentName:"li"},"system(CodeUpdated)")," event.")),(0,o.kt)("p",null,"You can also monitor ",(0,o.kt)("a",{parentName:"p",href:"https://polkadot.polkassembly.io/"},"Polkassembly")," for discussions on on-chain\nproposals and referenda."),(0,o.kt)("p",null,"*"," E.g. via ",(0,o.kt)("inlineCode",{parentName:"p"},"pallets/democracy/storage/ReferendumInfoOf?key1=index&at=blockNumber")," on Sidecar."))}h.isMDXComponent=!0},87390:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/runtime-node-version-2903ab51ac01ad44e6424cafc0f63fdf.png"}}]); \ No newline at end of file diff --git a/assets/js/f7acb151.0f990714.js b/assets/js/f7acb151.0f990714.js deleted file mode 100644 index ad9b70eec8f9..000000000000 --- a/assets/js/f7acb151.0f990714.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[5483],{47940:(e,t,s)=>{"use strict";s.d(t,{Z:()=>p});var a=s(74165),n=s(15861),o=s(67294),r=s(87152),i=s(17145),u=s(67425);function l(e,t,s){return c.apply(this,arguments)}function c(){return(c=(0,n.Z)((0,a.Z)().mark((function e(t,s,n){var o,u,l,c,d;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:o=void 0,u=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return o="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return o="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return o="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return o="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==o){e.next=18;break}return e.abrupt("return");case 18:return l=new r.U(o),e.next=21,i.G.create({provider:l});case 21:c=e.sent,(d=s.split(".")).forEach((function(e){e in c&&(c=c[e])})),e.t1=d[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return u=c.toString(),e.abrupt("break",35);case 29:return e.next=31,c();case 31:return u=(u=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+d[0]+") in "+s);case 35:return e.abrupt("return",u);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function d(e,t,s,a){switch(t){case"humanReadable":(0,u.HumanReadable)(e,s,a);break;case"precise":(0,u.Precise)(e,s,a);break;case"blocksToDays":(0,u.BlocksToDays)(e,a);break;case"percentage":(0,u.Percentage)(e,a);break;case"arrayLength":(0,u.ArrayLength)(e,a);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(e){var t=e.network,s=e.path,r=e.defaultValue,i=e.filter,u=void 0===i?void 0:i,c=(0,o.useState)(""),p=c[0],h=c[1];return t=t.toLowerCase(),(0,o.useEffect)((function(){void 0!==u?d(r.toString(),u,t,h):h(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var o=function(){var e=(0,n.Z)((0,a.Z)().mark((function e(){var n;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,l(t,s,h);case 2:if(void 0!==(n=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==u?d(n,u,t,h):h(n);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{o()}catch(i){console.log(i)}}}),[]),p}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,s,a){var n=void 0;if("polkadot"===s||"statemint"===s)n=3;else{if("kusama"!==s&&"statemine"!==s)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");n=6}e=parseFloat(e),a((e=Number.isInteger(e/t[s].precision)?e/t[s].precision+" "+t[s].symbol:(e/t[s].precision).toFixed(n)+" "+t[s].symbol).toString())},Precise:function(e,s,a){a(e=(e=parseFloat(e))/t[s].precision+" "+t[s].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},49736:(e,t,s)=>{"use strict";s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>b,frontMatter:()=>u,metadata:()=>c,toc:()=>p});var a=s(87462),n=s(63366),o=(s(67294),s(3905)),r=s(47940),i=["components"],u={id:"learn-guides-assets-create",title:"Creating Assets with the Asset Hub",sidebar_label:"Creating Assets",description:"Advanced How-to Guides about Creating Assets.",keywords:["asset hub","assets","statemine","statemint"],slug:"../learn-guides-assets-create"},l=void 0,c={unversionedId:"learn/learn-guides-assets-create",id:"learn/learn-guides-assets-create",title:"Creating Assets with the Asset Hub",description:"Advanced How-to Guides about Creating Assets.",source:"@site/../docs/learn/learn-guides-assets-create.md",sourceDirName:"learn",slug:"/learn-guides-assets-create",permalink:"/docs/learn-guides-assets-create",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-guides-assets-create.md",tags:[],version:"current",lastUpdatedBy:"Radha",lastUpdatedAt:1697176471,formattedLastUpdatedAt:"Oct 13, 2023",frontMatter:{id:"learn-guides-assets-create",title:"Creating Assets with the Asset Hub",sidebar_label:"Creating Assets",description:"Advanced How-to Guides about Creating Assets.",keywords:["asset hub","assets","statemine","statemint"],slug:"../learn-guides-assets-create"},sidebar:"docs",previous:{title:"Asset Hub",permalink:"/docs/learn-guides-assets-index"},next:{title:"Asset Hub Ledger App",permalink:"/docs/learn-guides-assets-ledger"}},d={},p=[{value:"Creating Assets on the Asset Hub",id:"creating-assets-on-the-asset-hub",level:2}],h={toc:p},k="wrapper";function b(e){var t=e.components,u=(0,n.Z)(e,i);return(0,o.kt)(k,(0,a.Z)({},h,u,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"The Asset Hub is a generic assets system parachain which provides functionality for deploying and\ntransferring assets \u2014 both Fungible and Non-Fungible Tokens (NFTs). The native token of the Asset\nhub is DOT. The Existential Deposit (ED),\ntransaction fees, and the deposits for proxy/multisig operations are about 1/10th of the values on\nthe Relay chains. For example, the Existential Deposit of an Asset Hub account is\n",(0,o.kt)(r.Z,{network:"statemint",path:"consts.balances.existentialDeposit",defaultValue:1e9,filter:"humanReadable",mdxType:"RPC"}),",\n","\nwhen compared to\n",(0,o.kt)(r.Z,{network:"polkadot",path:"consts.balances.existentialDeposit",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"})," on Polkadot\n",".\nApart from the core protocol token DOT, the\nassets held on the Asset Hub can be broadly categorized as"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Assets backed by an on-chain protocol\u2019s utility"),(0,o.kt)("li",{parentName:"ul"},"Assets with off-chain backing"),(0,o.kt)("li",{parentName:"ul"},"Assets without any backing")),(0,o.kt)("p",null,"For additional background on the Asset Hub check out\n",(0,o.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181800-what-is-statemint-and-statemine-and-how-do-i-use-them-"},"this support article"),"."),(0,o.kt)("h2",{id:"creating-assets-on-the-asset-hub"},"Creating Assets on the Asset Hub"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Before minting assets on the Asset Hub, we recommend that you try out this tutorial on Westmint,\nwhich is a parachain on Westend. The WND tokens (Westies) are free and are available through a\n",(0,o.kt)("a",{parentName:"p",href:"https://wiki.polkadot.network/docs/learn-DOT#getting-westies"},"faucet"),"."),(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("strong",{parentName:"p"},"The images in the guides below are for Polkadot, but they also apply to Kusama."))),(0,o.kt)("p",null,"To create an asset on the Asset Hub, you would need a deposit of\n",(0,o.kt)(r.Z,{network:"statemint",path:"consts.assets.assetDeposit",defaultValue:1e11,filter:"humanReadable",mdxType:"RPC"}),"\n","\nand around\n",(0,o.kt)(r.Z,{network:"statemint",path:"consts.assets.metadataDepositBase",defaultValue:20068e5,filter:"humanReadable",mdxType:"RPC"}),"\n","\nfor the metadata. Before you create an asset on the Asset Hub, ensure that your Asset Hub account\nbalance is a bit more than the sum of those two deposits, which should seamlessly account for the\nrequired deposits and transaction fees. You can send\nDOT from a\nPolkadot account to a the Asset Hub account\nusing the teleport functionality. For instructions on teleporting\nDOT, check this\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-teleport"},"tutorial on Teleports"),"."),(0,o.kt)("p",null,"Assuming you have the required DOT balance on\nyour Asset Hub account, the following instructions should let you successfully create an asset on\nthe Asset Hub"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Access the Asset Hub through ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"Polkadot-JS UI"),"."),(0,o.kt)("li",{parentName:"ul"},"Navigate to Network > Assets.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Navigate to Assets page",src:s(85353).Z,width:"1710",height:"554"})),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Click on the create button and you will be presented with a pop-up window. Choose the creator\naccount, name of the asset to be displayed on the Asset Hub, the asset's symbol, number of\ndecimals for the asset, the minimum balance required to hold this asset on an Asset Hub account\nand the most important field of your asset - the unique asset ID. The UI would not let you enter\nan ID that has already been taken. After all the details are entered, click on the next button.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Add Asset Metadata",src:s(3910).Z,width:"1510",height:"798"})),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Choose the admin, issuer and the freezer accounts for your asset and click on the create button.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Asset managing accounts",src:s(25965).Z,width:"1518",height:"510"})),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Sign and submit the transaction (If you like to verify the transaction details before signing, you\ncan click on the dropdown button pointed by the arrow in the snapshot below).")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Sign asset creating transaction",src:s(39764).Z,width:"1520",height:"610"})),(0,o.kt)("p",null,"If the transaction is successful, you should see the asset and its details displayed in the\nNetwork > Assets page on the Asset Hub."))}b.isMDXComponent=!0},85353:(e,t,s)=>{"use strict";s.d(t,{Z:()=>a});const a=s.p+"assets/images/hub-asset-0-71cbceb69c712729d7920b4575ab8f46.png"},3910:(e,t,s)=>{"use strict";s.d(t,{Z:()=>a});const a=s.p+"assets/images/hub-asset-1-6f406281abdca9f5c2941ebd4d9479fd.png"},25965:(e,t,s)=>{"use strict";s.d(t,{Z:()=>a});const a=s.p+"assets/images/hub-asset-2-2fd6118841d0c4e037d5f51c6b1010e1.png"},39764:(e,t,s)=>{"use strict";s.d(t,{Z:()=>a});const a=s.p+"assets/images/hub-asset-3-3952e84a1b7c80239e8fb1f907af2583.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/f7acb151.a70a813b.js b/assets/js/f7acb151.a70a813b.js new file mode 100644 index 000000000000..0d25b3cdbe31 --- /dev/null +++ b/assets/js/f7acb151.a70a813b.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[5483],{47940:(e,t,s)=>{"use strict";s.d(t,{Z:()=>p});var a=s(74165),n=s(15861),o=s(67294),r=s(87152),i=s(17145),l=s(67425);function u(e,t,s){return c.apply(this,arguments)}function c(){return(c=(0,n.Z)((0,a.Z)().mark((function e(t,s,n){var o,l,u,c,d;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:o=void 0,l=void 0,e.t0=t,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return o="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return o="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return o="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return o="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==o){e.next=18;break}return e.abrupt("return");case 18:return u=new r.U(o),e.next=21,i.G.create({provider:u});case 21:c=e.sent,(d=s.split(".")).forEach((function(e){e in c&&(c=c[e])})),e.t1=d[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=c.toString(),e.abrupt("break",35);case 29:return e.next=31,c();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+d[0]+") in "+s);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function d(e,t,s,a){switch(t){case"humanReadable":(0,l.HumanReadable)(e,s,a);break;case"precise":(0,l.Precise)(e,s,a);break;case"blocksToDays":(0,l.BlocksToDays)(e,a);break;case"percentage":(0,l.Percentage)(e,a);break;case"permillToPercent":(0,l.PermillToPercent)(e,a);break;case"arrayLength":(0,l.ArrayLength)(e,a);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(e){var t=e.network,s=e.path,r=e.defaultValue,i=e.filter,l=void 0===i?void 0:i,c=(0,o.useState)(""),p=c[0],h=c[1];return t=t.toLowerCase(),(0,o.useEffect)((function(){void 0!==l?d(r.toString(),l,t,h):h(r.toString());var e=void 0;switch(t){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+t)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var o=function(){var e=(0,n.Z)((0,a.Z)().mark((function e(){var n;return(0,a.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,u(t,s,h);case 2:if(void 0!==(n=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?d(n,l,t,h):h(n);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{o()}catch(i){console.log(i)}}}),[]),p}},67425:e=>{var t={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,s,a){var n=void 0;if("polkadot"===s||"statemint"===s)n=3;else{if("kusama"!==s&&"statemine"!==s)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");n=6}e=parseFloat(e),a((e=Number.isInteger(e/t[s].precision)?e/t[s].precision+" "+t[s].symbol:(e/t[s].precision).toFixed(n)+" "+t[s].symbol).toString())},Precise:function(e,s,a){a(e=(e=parseFloat(e))/t[s].precision+" "+t[s].symbol)},BlocksToDays:function(e,t){t((e=6*e/86400).toString())},Percentage:function(e,t){t((e/=1e7).toString())},PermillToPercent:function(e,t){t((e/=1e4).toString())},ArrayLength:function(e,t){t((e=e.split(",").length).toString())}}},49736:(e,t,s)=>{"use strict";s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>u,default:()=>b,frontMatter:()=>l,metadata:()=>c,toc:()=>p});var a=s(87462),n=s(63366),o=(s(67294),s(3905)),r=s(47940),i=["components"],l={id:"learn-guides-assets-create",title:"Creating Assets with the Asset Hub",sidebar_label:"Creating Assets",description:"Advanced How-to Guides about Creating Assets.",keywords:["asset hub","assets","statemine","statemint"],slug:"../learn-guides-assets-create"},u=void 0,c={unversionedId:"learn/learn-guides-assets-create",id:"learn/learn-guides-assets-create",title:"Creating Assets with the Asset Hub",description:"Advanced How-to Guides about Creating Assets.",source:"@site/../docs/learn/learn-guides-assets-create.md",sourceDirName:"learn",slug:"/learn-guides-assets-create",permalink:"/docs/learn-guides-assets-create",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-guides-assets-create.md",tags:[],version:"current",lastUpdatedBy:"Radha",lastUpdatedAt:1697176471,formattedLastUpdatedAt:"Oct 13, 2023",frontMatter:{id:"learn-guides-assets-create",title:"Creating Assets with the Asset Hub",sidebar_label:"Creating Assets",description:"Advanced How-to Guides about Creating Assets.",keywords:["asset hub","assets","statemine","statemint"],slug:"../learn-guides-assets-create"},sidebar:"docs",previous:{title:"Asset Hub",permalink:"/docs/learn-guides-assets-index"},next:{title:"Asset Hub Ledger App",permalink:"/docs/learn-guides-assets-ledger"}},d={},p=[{value:"Creating Assets on the Asset Hub",id:"creating-assets-on-the-asset-hub",level:2}],h={toc:p},k="wrapper";function b(e){var t=e.components,l=(0,n.Z)(e,i);return(0,o.kt)(k,(0,a.Z)({},h,l,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"The Asset Hub is a generic assets system parachain which provides functionality for deploying and\ntransferring assets \u2014 both Fungible and Non-Fungible Tokens (NFTs). The native token of the Asset\nhub is DOT. The Existential Deposit (ED),\ntransaction fees, and the deposits for proxy/multisig operations are about 1/10th of the values on\nthe Relay chains. For example, the Existential Deposit of an Asset Hub account is\n",(0,o.kt)(r.Z,{network:"statemint",path:"consts.balances.existentialDeposit",defaultValue:1e9,filter:"humanReadable",mdxType:"RPC"}),",\n","\nwhen compared to\n",(0,o.kt)(r.Z,{network:"polkadot",path:"consts.balances.existentialDeposit",defaultValue:1e10,filter:"humanReadable",mdxType:"RPC"})," on Polkadot\n",".\nApart from the core protocol token DOT, the\nassets held on the Asset Hub can be broadly categorized as"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Assets backed by an on-chain protocol\u2019s utility"),(0,o.kt)("li",{parentName:"ul"},"Assets with off-chain backing"),(0,o.kt)("li",{parentName:"ul"},"Assets without any backing")),(0,o.kt)("p",null,"For additional background on the Asset Hub check out\n",(0,o.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000181800-what-is-statemint-and-statemine-and-how-do-i-use-them-"},"this support article"),"."),(0,o.kt)("h2",{id:"creating-assets-on-the-asset-hub"},"Creating Assets on the Asset Hub"),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Before minting assets on the Asset Hub, we recommend that you try out this tutorial on Westmint,\nwhich is a parachain on Westend. The WND tokens (Westies) are free and are available through a\n",(0,o.kt)("a",{parentName:"p",href:"https://wiki.polkadot.network/docs/learn-DOT#getting-westies"},"faucet"),"."),(0,o.kt)("p",{parentName:"admonition"},(0,o.kt)("strong",{parentName:"p"},"The images in the guides below are for Polkadot, but they also apply to Kusama."))),(0,o.kt)("p",null,"To create an asset on the Asset Hub, you would need a deposit of\n",(0,o.kt)(r.Z,{network:"statemint",path:"consts.assets.assetDeposit",defaultValue:1e11,filter:"humanReadable",mdxType:"RPC"}),"\n","\nand around\n",(0,o.kt)(r.Z,{network:"statemint",path:"consts.assets.metadataDepositBase",defaultValue:20068e5,filter:"humanReadable",mdxType:"RPC"}),"\n","\nfor the metadata. Before you create an asset on the Asset Hub, ensure that your Asset Hub account\nbalance is a bit more than the sum of those two deposits, which should seamlessly account for the\nrequired deposits and transaction fees. You can send\nDOT from a\nPolkadot account to a the Asset Hub account\nusing the teleport functionality. For instructions on teleporting\nDOT, check this\n",(0,o.kt)("a",{parentName:"p",href:"/docs/learn-teleport"},"tutorial on Teleports"),"."),(0,o.kt)("p",null,"Assuming you have the required DOT balance on\nyour Asset Hub account, the following instructions should let you successfully create an asset on\nthe Asset Hub"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Access the Asset Hub through ",(0,o.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/#/explorer"},"Polkadot-JS UI"),"."),(0,o.kt)("li",{parentName:"ul"},"Navigate to Network > Assets.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Navigate to Assets page",src:s(85353).Z,width:"1710",height:"554"})),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Click on the create button and you will be presented with a pop-up window. Choose the creator\naccount, name of the asset to be displayed on the Asset Hub, the asset's symbol, number of\ndecimals for the asset, the minimum balance required to hold this asset on an Asset Hub account\nand the most important field of your asset - the unique asset ID. The UI would not let you enter\nan ID that has already been taken. After all the details are entered, click on the next button.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Add Asset Metadata",src:s(3910).Z,width:"1510",height:"798"})),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Choose the admin, issuer and the freezer accounts for your asset and click on the create button.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Asset managing accounts",src:s(25965).Z,width:"1518",height:"510"})),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Sign and submit the transaction (If you like to verify the transaction details before signing, you\ncan click on the dropdown button pointed by the arrow in the snapshot below).")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Sign asset creating transaction",src:s(39764).Z,width:"1520",height:"610"})),(0,o.kt)("p",null,"If the transaction is successful, you should see the asset and its details displayed in the\nNetwork > Assets page on the Asset Hub."))}b.isMDXComponent=!0},85353:(e,t,s)=>{"use strict";s.d(t,{Z:()=>a});const a=s.p+"assets/images/hub-asset-0-71cbceb69c712729d7920b4575ab8f46.png"},3910:(e,t,s)=>{"use strict";s.d(t,{Z:()=>a});const a=s.p+"assets/images/hub-asset-1-6f406281abdca9f5c2941ebd4d9479fd.png"},25965:(e,t,s)=>{"use strict";s.d(t,{Z:()=>a});const a=s.p+"assets/images/hub-asset-2-2fd6118841d0c4e037d5f51c6b1010e1.png"},39764:(e,t,s)=>{"use strict";s.d(t,{Z:()=>a});const a=s.p+"assets/images/hub-asset-3-3952e84a1b7c80239e8fb1f907af2583.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/fea93377.e881ac82.js b/assets/js/fea93377.e881ac82.js new file mode 100644 index 000000000000..ce8fd444e102 --- /dev/null +++ b/assets/js/fea93377.e881ac82.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[6730],{47940:(e,a,t)=>{"use strict";t.d(a,{Z:()=>h});var n=t(74165),o=t(15861),i=t(67294),r=t(87152),s=t(17145),l=t(67425);function d(e,a,t){return p.apply(this,arguments)}function p(){return(p=(0,o.Z)((0,n.Z)().mark((function e(a,t,o){var i,l,d,p,u;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=a,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return d=new r.U(i),e.next=21,s.G.create({provider:d});case 21:p=e.sent,(u=t.split(".")).forEach((function(e){e in p&&(p=p[e])})),e.t1=u[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=p.toString(),e.abrupt("break",35);case 29:return e.next=31,p();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+t);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function u(e,a,t,n){switch(a){case"humanReadable":(0,l.HumanReadable)(e,t,n);break;case"precise":(0,l.Precise)(e,t,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"permillToPercent":(0,l.PermillToPercent)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const h=function(e){var a=e.network,t=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,p=(0,i.useState)(""),h=p[0],m=p[1];return a=a.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?u(r.toString(),l,a,m):m(r.toString());var e=void 0;switch(a){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+a)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(a,t,m);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?u(o,l,a,m):m(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),h}},67425:e=>{var a={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,t,n){var o=void 0;if("polkadot"===t||"statemint"===t)o=3;else{if("kusama"!==t&&"statemine"!==t)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/a[t].precision)?e/a[t].precision+" "+a[t].symbol:(e/a[t].precision).toFixed(o)+" "+a[t].symbol).toString())},Precise:function(e,t,n){n(e=(e=parseFloat(e))/a[t].precision+" "+a[t].symbol)},BlocksToDays:function(e,a){a((e=6*e/86400).toString())},Percentage:function(e,a){a((e/=1e7).toString())},PermillToPercent:function(e,a){a((e/=1e4).toString())},ArrayLength:function(e,a){a((e=e.split(",").length).toString())}}},26029:(e,a,t)=>{"use strict";t.r(a),t.d(a,{assets:()=>u,contentTitle:()=>d,default:()=>v,frontMatter:()=>l,metadata:()=>p,toc:()=>h});var n=t(87462),o=t(63366),i=(t(67294),t(3905)),r=t(47940),s=["components"],l={id:"maintain-guides-validator-payout",title:"Validator Payout Overview",sidebar_label:"Validator Payout Overview",description:"How validator payout works on the network and what you should expect.",keywords:["validator payout","payments","rewards","era points"],slug:"../maintain-guides-validator-payout"},d=void 0,p={unversionedId:"maintain/maintain-guides-validator-payout",id:"maintain/maintain-guides-validator-payout",title:"Validator Payout Overview",description:"How validator payout works on the network and what you should expect.",source:"@site/../docs/maintain/maintain-guides-validator-payout.md",sourceDirName:"maintain",slug:"/maintain-guides-validator-payout",permalink:"/docs/maintain-guides-validator-payout",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/maintain-guides-validator-payout.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1683802875,formattedLastUpdatedAt:"May 11, 2023",frontMatter:{id:"maintain-guides-validator-payout",title:"Validator Payout Overview",sidebar_label:"Validator Payout Overview",description:"How validator payout works on the network and what you should expect.",keywords:["validator payout","payments","rewards","era points"],slug:"../maintain-guides-validator-payout"},sidebar:"docs",previous:{title:"How to run a Validator on Polkadot",permalink:"/docs/maintain-guides-how-to-validate-polkadot"},next:{title:"Using systemd for a Validator Node",permalink:"/docs/maintain-guides-how-to-systemd"}},u={},h=[{value:"Era Points",id:"era-points",level:2},{value:"Payout Scheme",id:"payout-scheme",level:2},{value:"Running Multiple Validators",id:"running-multiple-validators",level:2},{value:"Slashing",id:"slashing",level:2},{value:"Nominators and Validator Payments",id:"nominators-and-validator-payments",level:2}],m={toc:h},c="wrapper";function v(e){var a=e.components,t=(0,o.Z)(e,s);return(0,i.kt)(c,(0,n.Z)({},m,t,{components:a,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"era-points"},"Era Points"),(0,i.kt)("p",null,"For every era (a period of time approximately 6 hours in length in Kusama, and 24 hours in\nPolkadot), validators are paid proportionally to the amount of ",(0,i.kt)("em",{parentName:"p"},"era points")," they have collected. Era\npoints are reward points earned for payable actions like:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"issuing validity statements for ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-parachains"},"parachain")," blocks."),(0,i.kt)("li",{parentName:"ul"},"producing a non-uncle block in the Relay Chain."),(0,i.kt)("li",{parentName:"ul"},"producing a reference to a previously unreferenced uncle block."),(0,i.kt)("li",{parentName:"ul"},"producing a referenced uncle block.")),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"An uncle block is a Relay Chain block that is valid in every regard, but which failed to become\ncanonical. This can happen when two or more validators are block producers in a single slot, and the\nblock produced by one validator reaches the next block producer before the others. We call the\nlagging blocks uncle blocks.")),(0,i.kt)("p",null,"Payments occur at the end of every era."),(0,i.kt)("p",null,"Era points create a probabilistic component for staking rewards."),(0,i.kt)("p",null,"If the ",(0,i.kt)("em",{parentName:"p"},"mean")," of staking rewards is the average rewards per era, then the ",(0,i.kt)("em",{parentName:"p"},"variance")," is the\nvariability from the average staking rewards. The exact DOT value of each era point is not known in\nadvance since it depends on the total number of points earned by all validators in a given era. This\nis designed this way so that the total payout per era depends on Polkadot's\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced#inflation"},"inflation model"),", and not on the number of payable\nactions (f.e., authoring a new block) executed. For more information, check\n",(0,i.kt)("a",{parentName:"p",href:"https://substrate.stackexchange.com/questions/5353/how-are-rewards-in-dot-calculated-from-the-era-points-earned-by-validators-in-po"},"this stackexchange post"),"."),(0,i.kt)("p",null,"With parachains now on Polkadot, a large percentage of era points will come from parachain\nvalidation, as a subset of validators are selected to para-validate for all parachains each epoch,\nand those para-validators can generate more era points as a result. Para-validators are rewarded 20\nera points each for each parachain block that they validate."),(0,i.kt)("p",null,"In this case, analyzing the ",(0,i.kt)("em",{parentName:"p"},"expected value")," of staking rewards will paint a better picture as the\nweight of era points of validators and para-validators in the reward average are taken into\nconsideration."),(0,i.kt)("admonition",{title:"High-level breakdown of reward variance",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"This should only serve as a high-level overview of the probabilistic nature for staking rewards."),(0,i.kt)("p",{parentName:"admonition"},"Let:"),(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"pe")," = para-validator era points,"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"ne")," = non-para-validator era points,"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"EV")," = expected value of staking rewards,")),(0,i.kt)("p",{parentName:"admonition"},"Then, ",(0,i.kt)("inlineCode",{parentName:"p"},"EV(pe)")," has more influence on the ",(0,i.kt)("inlineCode",{parentName:"p"},"EV")," than ",(0,i.kt)("inlineCode",{parentName:"p"},"EV(ne)"),"."),(0,i.kt)("p",{parentName:"admonition"},"Since ",(0,i.kt)("inlineCode",{parentName:"p"},"EV(pe)")," has a more weighted probability on the ",(0,i.kt)("inlineCode",{parentName:"p"},"EV"),", the increase in variance against the\n",(0,i.kt)("inlineCode",{parentName:"p"},"EV")," becomes apparent between the different validator pools (aka. validators in the active set and\nthe ones chosen to para-validate)."),(0,i.kt)("p",{parentName:"admonition"},"Also, let:"),(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"v")," = the variance of staking rewards,"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"p")," = number of para-validators,"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"w")," = number validators in the active set,"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"e")," = era,")),(0,i.kt)("p",{parentName:"admonition"},"Then, ",(0,i.kt)("inlineCode",{parentName:"p"},"v")," ","\u2191"," if ",(0,i.kt)("inlineCode",{parentName:"p"},"w")," ","\u2191",", as this reduces ",(0,i.kt)("inlineCode",{parentName:"p"},"p")," : ",(0,i.kt)("inlineCode",{parentName:"p"},"w"),", with respect to ",(0,i.kt)("inlineCode",{parentName:"p"},"e"),"."),(0,i.kt)("p",{parentName:"admonition"},"Increased ",(0,i.kt)("inlineCode",{parentName:"p"},"v")," is expected, and initially keeping ",(0,i.kt)("inlineCode",{parentName:"p"},"p")," ","\u2193"," using the same para-validator set for\nall parachains ensures\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol#availability-and-unavailability-phase"},"availability")," and\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-governance"},"approval voting"),". In addition, despite ",(0,i.kt)("inlineCode",{parentName:"p"},"v")," ","\u2191"," on an ",(0,i.kt)("inlineCode",{parentName:"p"},"e")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"e"),"\nbasis, over time, the amount of rewards each validator receives will equal out based on the\ncontinuous selection of para-validators."),(0,i.kt)("p",{parentName:"admonition"},"There are plans to scale the active para-validation set in the future")),(0,i.kt)("h2",{id:"payout-scheme"},"Payout Scheme"),(0,i.kt)("p",null,"No matter how much total stake is behind a validator, all validators split the block authoring\npayout essentially equally. The payout of a specific validator, however, may differ based on\n",(0,i.kt)("a",{parentName:"p",href:"#era-points"},"era points"),", as described above. Although there is a probabilistic component to\nreceiving era points, and they may be impacted slightly depending on factors such as network\nconnectivity, well-behaving validators should generally average out to having similar era point\ntotals over a large number of eras."),(0,i.kt)("p",null,'Validators may also receive "tips" from senders as an incentive to include transactions in their\nproduced blocks. Validators will receive 100% of these tips directly.'),(0,i.kt)("p",null,"Validators will receive staking rewards in the form of the native token of that chain (KSM for\nKusama and DOT for Polkadot)."),(0,i.kt)("p",null,"For simplicity, the examples below will assume all validators have the same amount of era points,\nand received no tips."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Validator Set Size (v): 4\nValidator 1 Stake (v1): 18 tokens\nValidator 2 Stake (v2): 9 tokens\nValidator 3 Stake (v3): 8 tokens\nValidator 4 Stake (v4): 7 tokens\nPayout (p): 8 DOT\n\nPayout for each validator (v1 - v4):\np / v = 8 / 4 = 2 tokens\n")),(0,i.kt)("p",null,"Note that this is different than most other Proof-of-Stake systems such as Cosmos. As long as a\nvalidator is in the validator set, it will receive the same block reward as every other validator.\nValidator ",(0,i.kt)("inlineCode",{parentName:"p"},"v1"),", who had 18 tokens staked, received the same reward (2 tokens) in this era as ",(0,i.kt)("inlineCode",{parentName:"p"},"v4"),"\nwho had only 7 tokens staked."),(0,i.kt)("h2",{id:"running-multiple-validators"},"Running Multiple Validators"),(0,i.kt)("p",null,"It is possible for a single entity to run multiple validators. Running multiple validators may\nprovide a better risk/reward ratio. Assuming you have enough DOT, or enough stake nominates your\nvalidator, to ensure that your validators remain in the validator set, running multiple validators\nwill result in a higher return than running a single validator."),(0,i.kt)("p",null,"For the following example, assume you have 18 DOT to stake. For simplicity's sake, we will ignore\nnominators. Running a single validator, as in the example above, would net you 2 DOT in this era."),(0,i.kt)("p",null,"Note that while DOT is used as an example, this same formula would apply to KSM when running a\nvalidator on Kusama."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Validator Set Size (v): 4\nValidator 1 Stake (v1): 18 DOT <- Your validator\nValidator 2 Stake (v2): 9 DOT\nValidator 3 Stake (v3): 8 DOT\nValidator 4 Stake (v4): 7 DOT\nPayout (p): 8 DOT\n\nYour payout = (p / v) * 1 = (8 / 4) * 1 = 2\n")),(0,i.kt)("p",null,"Running two validators, and splitting the stake equally, would result in the original validator ",(0,i.kt)("inlineCode",{parentName:"p"},"v4"),"\nto be kicked out of the validator set, as only the top ",(0,i.kt)("inlineCode",{parentName:"p"},"v")," validators (as measured by stake) are\nselected to be in the validator set. More important, it would also double the reward that you get\nfrom each era."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Validator Set Size (v): 4\nValidator 1 Stake (v1): 9 DOT <- Your first validator\nValidator 2 Stake (v2): 9 DOT <- Your second validator\nValidator 3 Stake (v3): 9 DOT\nValidator 4 Stake (v4): 8 DOT\nPayout (p): 8 DOT\n\nYour payout = (p / v) * 2 = (8 / 4) * 2 = 4\n")),(0,i.kt)("p",null,"With enough stake, you could run more than two validators. However, each validator must have enough\nstake behind it to be in the validator set."),(0,i.kt)("p",null,"The incentives of the system favor equally-staked validators. This works out to be a dynamic, rather\nthan static, equilibrium. Potential validators will run different numbers of validators and apply\ndifferent amounts of stake to them as time goes on, and in response to the actions of other\nvalidators on the network."),(0,i.kt)("h2",{id:"slashing"},"Slashing"),(0,i.kt)("p",null,"Although rewards are paid equally, slashes are relative to a validator's stake. Therefore, if you do\nhave enough DOT to run multiple validators, it is in your best interest to do so. A slash of 30%\nwill, of course, be more DOT for a validator with 18 DOT staked than one with 9 DOT staked."),(0,i.kt)("p",null,"Running multiple validators does not absolve you of the consequences of misbehavior. Polkadot\npunishes attacks that appear coordinated more severely than individual attacks. You should not, for\nexample, run multiple validators hosted on the same infrastructure. A proper multi-validator\nconfiguration would ensure that they do not fail simultaneously."),(0,i.kt)("p",null,"Nominators have the incentive to nominate the lowest-staked validator, as this will result in the\nlowest risk and highest reward. This is due to the fact that while their vulnerability to slashing\nremains the same (since it is percentage-based), their rewards are higher since they will be a\nhigher proportion of the total stake allocated to that validator."),(0,i.kt)("p",null,"To clarify this, let us imagine two validators, ",(0,i.kt)("inlineCode",{parentName:"p"},"v1")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"v2"),". Assume both are in the active set,\nhave commission set to 0%, and are well-behaved. The only difference is that ",(0,i.kt)("inlineCode",{parentName:"p"},"v1")," has 90 DOT\nnominating it and ",(0,i.kt)("inlineCode",{parentName:"p"},"v2")," only has 10. If you nominate ",(0,i.kt)("inlineCode",{parentName:"p"},"v1"),", it now has ",(0,i.kt)("inlineCode",{parentName:"p"},"90 + 10 = 100")," DOT, and you\nwill get 10% of the staking rewards for the next era. If you nominate ",(0,i.kt)("inlineCode",{parentName:"p"},"v2"),", it now has\n",(0,i.kt)("inlineCode",{parentName:"p"},"10 + 10 = 20")," DOT nominating it, and you will get 50% of the staking rewards for the next era. In\nactuality, it would be quite rare to see such a large difference between the stake of validators,\nbut the same principle holds even for smaller differences. If there is a 10% slash of either\nvalidator, then you will lose 1 DOT in each case."),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"If a validator is oversubscribed in an era, staking rewards are distributed only to the the top\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n","\nnominators and the rest of the nominators do not receive any rewards. This is not the case for\nslashing! Every active nominator of the validator committing slashable offence will be slashed.")),(0,i.kt)("h2",{id:"nominators-and-validator-payments"},"Nominators and Validator Payments"),(0,i.kt)("p",null,'Nominated stake allows you to "vote" for validators and share in the rewards (and slashing) without\nrunning a validator node yourself. Validators can choose to keep a percentage of the rewards due to\ntheir validator to "reimburse" themselves for the cost of running a validator node. Other than that,\nall rewards are shared based on the stake behind each validator. This includes the stake of the\nvalidator itself, plus any stake bonded by nominators.'),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Validators set their preference as a percentage of the block reward, ",(0,i.kt)("em",{parentName:"p"},"not")," an absolute number of\nDOT. Polkadot's block reward is based on the ",(0,i.kt)("em",{parentName:"p"},"total")," amount at stake, with the reward peaking when\nthe amount staked is at 50% of the total supply. The commission is set as the amount taken by the\nvalidator; that is, 0% commission means that the validator does not receive any proportion of the\nrewards besides that owed to it from self-stake, and 100% commission means that the validator\noperator gets all rewards and gives none to its nominators.")),(0,i.kt)("p",null,"In the following examples, we can see the results of several different validator payment schemes and\nsplit between nominator and validator stake. We will assume a single nominator for each validator.\nHowever, there can be numerous nominators for each validator. Rewards are still distributed\nproportionally - for example, if the total rewards to be given to nominators is 2 DOT, and there are\nfour nominators with equal stake bonded, each will receive 0.5 DOT. Note also that a single\nnominator may stake different validators."),(0,i.kt)("p",null,"Each validator in the example has selected a different validator payment (that is, a percentage of\nthe reward set aside directly for the validator before sharing with all bonded stake). The\nvalidator's payment percentage (in DOT, although the same calculations work for KSM) is listed in\nbrackets (",(0,i.kt)("inlineCode",{parentName:"p"},"[]"),") next to each validator. Note that since the validator payment is public knowledge,\nhaving a low or non-existent validator payment may attract more stake from nominators, since they\nknow they will receive a larger reward."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Validator Set Size (v): 4\nValidator 1 Stake (v1) [20% commission]: 18 DOT (9 validator, 9 nominator)\nValidator 2 Stake (v2) [40% commission]: 9 DOT (3 validator, 6 nominator)\nValidator 3 Stake (v3) [10% commission]: 8 DOT (4 validator, 4 nominator)\nValidator 4 Stake (v4) [ 0% commission]: 6 DOT (1 validator, 5 nominator)\nPayout (p): 8 DOT\n\nPayout for each validator (v1 - v4):\np / v = 8 / 4 = 2 DOT\n\nv1:\n(0.2 * 2) = 0.4 DOT -> validator payment\n(2 - 0.4) = 1.6 -> shared between all stake\n(9 / 18) * 1.6 = 0.8 -> validator stake share\n(9 / 18) * 1.6 = 0.8 -> nominator stake share\nv1 validator total reward: 0.4 + 0.8 = 1.2 DOT\nv1 nominator reward: 0.8 DOT\n\nv2:\n(0.4 * 2) = 0.8 DOT -> validator payment\n(2 - 0.8) = 1.2 -> shared between all stake\n(3 / 9) * 1.2 = 0.4 -> validator stake share\n(6 / 9) * 1.2 = 0.8 -> nominator stake share\nv2 validator total reward: 0.8 + 0.4 = 1.2 DOT\nv2 nominator reward: 0.8 DOT\n\nv3:\n(0.1 * 2) = 0.2 DOT -> validator payment\n(2 - 0.2) = 1.8 -> shared between all stake\n(4 / 8) * 1.8 = 0.9 -> validator stake share\n(4 / 8) * 1.8 = 0.9 -> nominator stake share\nv3 validator total reward: 0.2 + 0.9 DOT = 1.1 DOT\nv3 nominator reward: 0.9 DOT\n\nv4:\n(0 * 2) = 0 DOT -> validator payment\n(2 - 0) = 2.0 -> shared between all stake\n(1 / 6) * 2 = 0.33 -> validator stake share\n(5 / 6) * 2 = 1.67 -> nominator stake share\nv4 validator total reward: 0 + 0.33 DOT = 0.33 DOT\nv4 nominator reward: 1.67 DOT\n")))}v.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/fea93377.f38b803b.js b/assets/js/fea93377.f38b803b.js deleted file mode 100644 index b6e4240a0675..000000000000 --- a/assets/js/fea93377.f38b803b.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[6730],{47940:(e,a,t)=>{"use strict";t.d(a,{Z:()=>h});var n=t(74165),o=t(15861),i=t(67294),r=t(87152),s=t(17145),l=t(67425);function d(e,a,t){return p.apply(this,arguments)}function p(){return(p=(0,o.Z)((0,n.Z)().mark((function e(a,t,o){var i,l,d,p,u;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=void 0,l=void 0,e.t0=a,e.next="polkadot"===e.t0?5:"kusama"===e.t0?7:"statemine"===e.t0?9:"statemint"===e.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",e.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",e.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",e.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",e.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){e.next=18;break}return e.abrupt("return");case 18:return d=new r.U(i),e.next=21,s.G.create({provider:d});case 21:p=e.sent,(u=t.split(".")).forEach((function(e){e in p&&(p=p[e])})),e.t1=u[0],e.next="consts"===e.t1?27:"query"===e.t1?29:34;break;case 27:return l=p.toString(),e.abrupt("break",35);case 29:return e.next=31,p();case 31:return l=(l=e.sent).toString(),e.abrupt("break",35);case 34:console.log("Unknown path prefix ("+u[0]+") in "+t);case 35:return e.abrupt("return",l);case 36:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function u(e,a,t,n){switch(a){case"humanReadable":(0,l.HumanReadable)(e,t,n);break;case"precise":(0,l.Precise)(e,t,n);break;case"blocksToDays":(0,l.BlocksToDays)(e,n);break;case"percentage":(0,l.Percentage)(e,n);break;case"arrayLength":(0,l.ArrayLength)(e,n);break;default:return void console.log("Ignoring unknown filter type")}}const h=function(e){var a=e.network,t=e.path,r=e.defaultValue,s=e.filter,l=void 0===s?void 0:s,p=(0,i.useState)(""),h=p[0],m=p[1];return a=a.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?u(r.toString(),l,a,m):m(r.toString());var e=void 0;switch(a){case"polkadot":e="wss://rpc.polkadot.io";break;case"kusama":e="wss://kusama-rpc.polkadot.io/";break;case"statemine":e="wss://statemine-rpc.polkadot.io/";break;case"statemint":e="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+a)}if(void 0===e)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var e=(0,o.Z)((0,n.Z)().mark((function e(){var o;return(0,n.Z)().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,d(a,t,m);case 2:if(void 0!==(o=e.sent)){e.next=7;break}return e.abrupt("return");case 7:void 0!==l?u(o,l,a,m):m(o);case 8:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),h}},67425:e=>{var a={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};e.exports={HumanReadable:function(e,t,n){var o=void 0;if("polkadot"===t||"statemint"===t)o=3;else{if("kusama"!==t&&"statemine"!==t)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}e=parseFloat(e),n((e=Number.isInteger(e/a[t].precision)?e/a[t].precision+" "+a[t].symbol:(e/a[t].precision).toFixed(o)+" "+a[t].symbol).toString())},Precise:function(e,t,n){n(e=(e=parseFloat(e))/a[t].precision+" "+a[t].symbol)},BlocksToDays:function(e,a){a((e=6*e/86400).toString())},Percentage:function(e,a){a((e/=1e7).toString())},ArrayLength:function(e,a){a((e=e.split(",").length).toString())}}},26029:(e,a,t)=>{"use strict";t.r(a),t.d(a,{assets:()=>u,contentTitle:()=>d,default:()=>v,frontMatter:()=>l,metadata:()=>p,toc:()=>h});var n=t(87462),o=t(63366),i=(t(67294),t(3905)),r=t(47940),s=["components"],l={id:"maintain-guides-validator-payout",title:"Validator Payout Overview",sidebar_label:"Validator Payout Overview",description:"How validator payout works on the network and what you should expect.",keywords:["validator payout","payments","rewards","era points"],slug:"../maintain-guides-validator-payout"},d=void 0,p={unversionedId:"maintain/maintain-guides-validator-payout",id:"maintain/maintain-guides-validator-payout",title:"Validator Payout Overview",description:"How validator payout works on the network and what you should expect.",source:"@site/../docs/maintain/maintain-guides-validator-payout.md",sourceDirName:"maintain",slug:"/maintain-guides-validator-payout",permalink:"/docs/maintain-guides-validator-payout",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/maintain/maintain-guides-validator-payout.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1683802875,formattedLastUpdatedAt:"May 11, 2023",frontMatter:{id:"maintain-guides-validator-payout",title:"Validator Payout Overview",sidebar_label:"Validator Payout Overview",description:"How validator payout works on the network and what you should expect.",keywords:["validator payout","payments","rewards","era points"],slug:"../maintain-guides-validator-payout"},sidebar:"docs",previous:{title:"How to run a Validator on Polkadot",permalink:"/docs/maintain-guides-how-to-validate-polkadot"},next:{title:"Using systemd for a Validator Node",permalink:"/docs/maintain-guides-how-to-systemd"}},u={},h=[{value:"Era Points",id:"era-points",level:2},{value:"Payout Scheme",id:"payout-scheme",level:2},{value:"Running Multiple Validators",id:"running-multiple-validators",level:2},{value:"Slashing",id:"slashing",level:2},{value:"Nominators and Validator Payments",id:"nominators-and-validator-payments",level:2}],m={toc:h},c="wrapper";function v(e){var a=e.components,t=(0,o.Z)(e,s);return(0,i.kt)(c,(0,n.Z)({},m,t,{components:a,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"era-points"},"Era Points"),(0,i.kt)("p",null,"For every era (a period of time approximately 6 hours in length in Kusama, and 24 hours in\nPolkadot), validators are paid proportionally to the amount of ",(0,i.kt)("em",{parentName:"p"},"era points")," they have collected. Era\npoints are reward points earned for payable actions like:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"issuing validity statements for ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-parachains"},"parachain")," blocks."),(0,i.kt)("li",{parentName:"ul"},"producing a non-uncle block in the Relay Chain."),(0,i.kt)("li",{parentName:"ul"},"producing a reference to a previously unreferenced uncle block."),(0,i.kt)("li",{parentName:"ul"},"producing a referenced uncle block.")),(0,i.kt)("admonition",{type:"note"},(0,i.kt)("p",{parentName:"admonition"},"An uncle block is a Relay Chain block that is valid in every regard, but which failed to become\ncanonical. This can happen when two or more validators are block producers in a single slot, and the\nblock produced by one validator reaches the next block producer before the others. We call the\nlagging blocks uncle blocks.")),(0,i.kt)("p",null,"Payments occur at the end of every era."),(0,i.kt)("p",null,"Era points create a probabilistic component for staking rewards."),(0,i.kt)("p",null,"If the ",(0,i.kt)("em",{parentName:"p"},"mean")," of staking rewards is the average rewards per era, then the ",(0,i.kt)("em",{parentName:"p"},"variance")," is the\nvariability from the average staking rewards. The exact DOT value of each era point is not known in\nadvance since it depends on the total number of points earned by all validators in a given era. This\nis designed this way so that the total payout per era depends on Polkadot's\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced#inflation"},"inflation model"),", and not on the number of payable\nactions (f.e., authoring a new block) executed. For more information, check\n",(0,i.kt)("a",{parentName:"p",href:"https://substrate.stackexchange.com/questions/5353/how-are-rewards-in-dot-calculated-from-the-era-points-earned-by-validators-in-po"},"this stackexchange post"),"."),(0,i.kt)("p",null,"With parachains now on Polkadot, a large percentage of era points will come from parachain\nvalidation, as a subset of validators are selected to para-validate for all parachains each epoch,\nand those para-validators can generate more era points as a result. Para-validators are rewarded 20\nera points each for each parachain block that they validate."),(0,i.kt)("p",null,"In this case, analyzing the ",(0,i.kt)("em",{parentName:"p"},"expected value")," of staking rewards will paint a better picture as the\nweight of era points of validators and para-validators in the reward average are taken into\nconsideration."),(0,i.kt)("admonition",{title:"High-level breakdown of reward variance",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"This should only serve as a high-level overview of the probabilistic nature for staking rewards."),(0,i.kt)("p",{parentName:"admonition"},"Let:"),(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"pe")," = para-validator era points,"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"ne")," = non-para-validator era points,"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"EV")," = expected value of staking rewards,")),(0,i.kt)("p",{parentName:"admonition"},"Then, ",(0,i.kt)("inlineCode",{parentName:"p"},"EV(pe)")," has more influence on the ",(0,i.kt)("inlineCode",{parentName:"p"},"EV")," than ",(0,i.kt)("inlineCode",{parentName:"p"},"EV(ne)"),"."),(0,i.kt)("p",{parentName:"admonition"},"Since ",(0,i.kt)("inlineCode",{parentName:"p"},"EV(pe)")," has a more weighted probability on the ",(0,i.kt)("inlineCode",{parentName:"p"},"EV"),", the increase in variance against the\n",(0,i.kt)("inlineCode",{parentName:"p"},"EV")," becomes apparent between the different validator pools (aka. validators in the active set and\nthe ones chosen to para-validate)."),(0,i.kt)("p",{parentName:"admonition"},"Also, let:"),(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"v")," = the variance of staking rewards,"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"p")," = number of para-validators,"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"w")," = number validators in the active set,"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"e")," = era,")),(0,i.kt)("p",{parentName:"admonition"},"Then, ",(0,i.kt)("inlineCode",{parentName:"p"},"v")," ","\u2191"," if ",(0,i.kt)("inlineCode",{parentName:"p"},"w")," ","\u2191",", as this reduces ",(0,i.kt)("inlineCode",{parentName:"p"},"p")," : ",(0,i.kt)("inlineCode",{parentName:"p"},"w"),", with respect to ",(0,i.kt)("inlineCode",{parentName:"p"},"e"),"."),(0,i.kt)("p",{parentName:"admonition"},"Increased ",(0,i.kt)("inlineCode",{parentName:"p"},"v")," is expected, and initially keeping ",(0,i.kt)("inlineCode",{parentName:"p"},"p")," ","\u2193"," using the same para-validator set for\nall parachains ensures\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-parachains-protocol#availability-and-unavailability-phase"},"availability")," and\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-governance"},"approval voting"),". In addition, despite ",(0,i.kt)("inlineCode",{parentName:"p"},"v")," ","\u2191"," on an ",(0,i.kt)("inlineCode",{parentName:"p"},"e")," to ",(0,i.kt)("inlineCode",{parentName:"p"},"e"),"\nbasis, over time, the amount of rewards each validator receives will equal out based on the\ncontinuous selection of para-validators."),(0,i.kt)("p",{parentName:"admonition"},"There are plans to scale the active para-validation set in the future")),(0,i.kt)("h2",{id:"payout-scheme"},"Payout Scheme"),(0,i.kt)("p",null,"No matter how much total stake is behind a validator, all validators split the block authoring\npayout essentially equally. The payout of a specific validator, however, may differ based on\n",(0,i.kt)("a",{parentName:"p",href:"#era-points"},"era points"),", as described above. Although there is a probabilistic component to\nreceiving era points, and they may be impacted slightly depending on factors such as network\nconnectivity, well-behaving validators should generally average out to having similar era point\ntotals over a large number of eras."),(0,i.kt)("p",null,'Validators may also receive "tips" from senders as an incentive to include transactions in their\nproduced blocks. Validators will receive 100% of these tips directly.'),(0,i.kt)("p",null,"Validators will receive staking rewards in the form of the native token of that chain (KSM for\nKusama and DOT for Polkadot)."),(0,i.kt)("p",null,"For simplicity, the examples below will assume all validators have the same amount of era points,\nand received no tips."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Validator Set Size (v): 4\nValidator 1 Stake (v1): 18 tokens\nValidator 2 Stake (v2): 9 tokens\nValidator 3 Stake (v3): 8 tokens\nValidator 4 Stake (v4): 7 tokens\nPayout (p): 8 DOT\n\nPayout for each validator (v1 - v4):\np / v = 8 / 4 = 2 tokens\n")),(0,i.kt)("p",null,"Note that this is different than most other Proof-of-Stake systems such as Cosmos. As long as a\nvalidator is in the validator set, it will receive the same block reward as every other validator.\nValidator ",(0,i.kt)("inlineCode",{parentName:"p"},"v1"),", who had 18 tokens staked, received the same reward (2 tokens) in this era as ",(0,i.kt)("inlineCode",{parentName:"p"},"v4"),"\nwho had only 7 tokens staked."),(0,i.kt)("h2",{id:"running-multiple-validators"},"Running Multiple Validators"),(0,i.kt)("p",null,"It is possible for a single entity to run multiple validators. Running multiple validators may\nprovide a better risk/reward ratio. Assuming you have enough DOT, or enough stake nominates your\nvalidator, to ensure that your validators remain in the validator set, running multiple validators\nwill result in a higher return than running a single validator."),(0,i.kt)("p",null,"For the following example, assume you have 18 DOT to stake. For simplicity's sake, we will ignore\nnominators. Running a single validator, as in the example above, would net you 2 DOT in this era."),(0,i.kt)("p",null,"Note that while DOT is used as an example, this same formula would apply to KSM when running a\nvalidator on Kusama."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Validator Set Size (v): 4\nValidator 1 Stake (v1): 18 DOT <- Your validator\nValidator 2 Stake (v2): 9 DOT\nValidator 3 Stake (v3): 8 DOT\nValidator 4 Stake (v4): 7 DOT\nPayout (p): 8 DOT\n\nYour payout = (p / v) * 1 = (8 / 4) * 1 = 2\n")),(0,i.kt)("p",null,"Running two validators, and splitting the stake equally, would result in the original validator ",(0,i.kt)("inlineCode",{parentName:"p"},"v4"),"\nto be kicked out of the validator set, as only the top ",(0,i.kt)("inlineCode",{parentName:"p"},"v")," validators (as measured by stake) are\nselected to be in the validator set. More important, it would also double the reward that you get\nfrom each era."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Validator Set Size (v): 4\nValidator 1 Stake (v1): 9 DOT <- Your first validator\nValidator 2 Stake (v2): 9 DOT <- Your second validator\nValidator 3 Stake (v3): 9 DOT\nValidator 4 Stake (v4): 8 DOT\nPayout (p): 8 DOT\n\nYour payout = (p / v) * 2 = (8 / 4) * 2 = 4\n")),(0,i.kt)("p",null,"With enough stake, you could run more than two validators. However, each validator must have enough\nstake behind it to be in the validator set."),(0,i.kt)("p",null,"The incentives of the system favor equally-staked validators. This works out to be a dynamic, rather\nthan static, equilibrium. Potential validators will run different numbers of validators and apply\ndifferent amounts of stake to them as time goes on, and in response to the actions of other\nvalidators on the network."),(0,i.kt)("h2",{id:"slashing"},"Slashing"),(0,i.kt)("p",null,"Although rewards are paid equally, slashes are relative to a validator's stake. Therefore, if you do\nhave enough DOT to run multiple validators, it is in your best interest to do so. A slash of 30%\nwill, of course, be more DOT for a validator with 18 DOT staked than one with 9 DOT staked."),(0,i.kt)("p",null,"Running multiple validators does not absolve you of the consequences of misbehavior. Polkadot\npunishes attacks that appear coordinated more severely than individual attacks. You should not, for\nexample, run multiple validators hosted on the same infrastructure. A proper multi-validator\nconfiguration would ensure that they do not fail simultaneously."),(0,i.kt)("p",null,"Nominators have the incentive to nominate the lowest-staked validator, as this will result in the\nlowest risk and highest reward. This is due to the fact that while their vulnerability to slashing\nremains the same (since it is percentage-based), their rewards are higher since they will be a\nhigher proportion of the total stake allocated to that validator."),(0,i.kt)("p",null,"To clarify this, let us imagine two validators, ",(0,i.kt)("inlineCode",{parentName:"p"},"v1")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"v2"),". Assume both are in the active set,\nhave commission set to 0%, and are well-behaved. The only difference is that ",(0,i.kt)("inlineCode",{parentName:"p"},"v1")," has 90 DOT\nnominating it and ",(0,i.kt)("inlineCode",{parentName:"p"},"v2")," only has 10. If you nominate ",(0,i.kt)("inlineCode",{parentName:"p"},"v1"),", it now has ",(0,i.kt)("inlineCode",{parentName:"p"},"90 + 10 = 100")," DOT, and you\nwill get 10% of the staking rewards for the next era. If you nominate ",(0,i.kt)("inlineCode",{parentName:"p"},"v2"),", it now has\n",(0,i.kt)("inlineCode",{parentName:"p"},"10 + 10 = 20")," DOT nominating it, and you will get 50% of the staking rewards for the next era. In\nactuality, it would be quite rare to see such a large difference between the stake of validators,\nbut the same principle holds even for smaller differences. If there is a 10% slash of either\nvalidator, then you will lose 1 DOT in each case."),(0,i.kt)("admonition",{type:"caution"},(0,i.kt)("p",{parentName:"admonition"},"If a validator is oversubscribed in an era, staking rewards are distributed only to the the top\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n","\nnominators and the rest of the nominators do not receive any rewards. This is not the case for\nslashing! Every active nominator of the validator committing slashable offence will be slashed.")),(0,i.kt)("h2",{id:"nominators-and-validator-payments"},"Nominators and Validator Payments"),(0,i.kt)("p",null,'Nominated stake allows you to "vote" for validators and share in the rewards (and slashing) without\nrunning a validator node yourself. Validators can choose to keep a percentage of the rewards due to\ntheir validator to "reimburse" themselves for the cost of running a validator node. Other than that,\nall rewards are shared based on the stake behind each validator. This includes the stake of the\nvalidator itself, plus any stake bonded by nominators.'),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Validators set their preference as a percentage of the block reward, ",(0,i.kt)("em",{parentName:"p"},"not")," an absolute number of\nDOT. Polkadot's block reward is based on the ",(0,i.kt)("em",{parentName:"p"},"total")," amount at stake, with the reward peaking when\nthe amount staked is at 50% of the total supply. The commission is set as the amount taken by the\nvalidator; that is, 0% commission means that the validator does not receive any proportion of the\nrewards besides that owed to it from self-stake, and 100% commission means that the validator\noperator gets all rewards and gives none to its nominators.")),(0,i.kt)("p",null,"In the following examples, we can see the results of several different validator payment schemes and\nsplit between nominator and validator stake. We will assume a single nominator for each validator.\nHowever, there can be numerous nominators for each validator. Rewards are still distributed\nproportionally - for example, if the total rewards to be given to nominators is 2 DOT, and there are\nfour nominators with equal stake bonded, each will receive 0.5 DOT. Note also that a single\nnominator may stake different validators."),(0,i.kt)("p",null,"Each validator in the example has selected a different validator payment (that is, a percentage of\nthe reward set aside directly for the validator before sharing with all bonded stake). The\nvalidator's payment percentage (in DOT, although the same calculations work for KSM) is listed in\nbrackets (",(0,i.kt)("inlineCode",{parentName:"p"},"[]"),") next to each validator. Note that since the validator payment is public knowledge,\nhaving a low or non-existent validator payment may attract more stake from nominators, since they\nknow they will receive a larger reward."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"Validator Set Size (v): 4\nValidator 1 Stake (v1) [20% commission]: 18 DOT (9 validator, 9 nominator)\nValidator 2 Stake (v2) [40% commission]: 9 DOT (3 validator, 6 nominator)\nValidator 3 Stake (v3) [10% commission]: 8 DOT (4 validator, 4 nominator)\nValidator 4 Stake (v4) [ 0% commission]: 6 DOT (1 validator, 5 nominator)\nPayout (p): 8 DOT\n\nPayout for each validator (v1 - v4):\np / v = 8 / 4 = 2 DOT\n\nv1:\n(0.2 * 2) = 0.4 DOT -> validator payment\n(2 - 0.4) = 1.6 -> shared between all stake\n(9 / 18) * 1.6 = 0.8 -> validator stake share\n(9 / 18) * 1.6 = 0.8 -> nominator stake share\nv1 validator total reward: 0.4 + 0.8 = 1.2 DOT\nv1 nominator reward: 0.8 DOT\n\nv2:\n(0.4 * 2) = 0.8 DOT -> validator payment\n(2 - 0.8) = 1.2 -> shared between all stake\n(3 / 9) * 1.2 = 0.4 -> validator stake share\n(6 / 9) * 1.2 = 0.8 -> nominator stake share\nv2 validator total reward: 0.8 + 0.4 = 1.2 DOT\nv2 nominator reward: 0.8 DOT\n\nv3:\n(0.1 * 2) = 0.2 DOT -> validator payment\n(2 - 0.2) = 1.8 -> shared between all stake\n(4 / 8) * 1.8 = 0.9 -> validator stake share\n(4 / 8) * 1.8 = 0.9 -> nominator stake share\nv3 validator total reward: 0.2 + 0.9 DOT = 1.1 DOT\nv3 nominator reward: 0.9 DOT\n\nv4:\n(0 * 2) = 0 DOT -> validator payment\n(2 - 0) = 2.0 -> shared between all stake\n(1 / 6) * 2 = 0.33 -> validator stake share\n(5 / 6) * 2 = 1.67 -> nominator stake share\nv4 validator total reward: 0 + 0.33 DOT = 0.33 DOT\nv4 nominator reward: 1.67 DOT\n")))}v.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/ff6596ea.08044ec7.js b/assets/js/ff6596ea.08044ec7.js deleted file mode 100644 index 60a79a1b6f38..000000000000 --- a/assets/js/ff6596ea.08044ec7.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[3842],{47940:(t,e,a)=>{"use strict";a.d(e,{Z:()=>u});var n=a(74165),o=a(15861),i=a(67294),r=a(87152),s=a(17145),l=a(67425);function d(t,e,a){return m.apply(this,arguments)}function m(){return(m=(0,o.Z)((0,n.Z)().mark((function t(e,a,o){var i,l,d,m,h;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:i=void 0,l=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){t.next=18;break}return t.abrupt("return");case 18:return d=new r.U(i),t.next=21,s.G.create({provider:d});case 21:m=t.sent,(h=a.split(".")).forEach((function(t){t in m&&(m=m[t])})),t.t1=h[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return l=m.toString(),t.abrupt("break",35);case 29:return t.next=31,m();case 31:return l=(l=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+h[0]+") in "+a);case 35:return t.abrupt("return",l);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function h(t,e,a,n){switch(e){case"humanReadable":(0,l.HumanReadable)(t,a,n);break;case"precise":(0,l.Precise)(t,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(t,n);break;case"percentage":(0,l.Percentage)(t,n);break;case"arrayLength":(0,l.ArrayLength)(t,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(t){var e=t.network,a=t.path,r=t.defaultValue,s=t.filter,l=void 0===s?void 0:s,m=(0,i.useState)(""),u=m[0],p=m[1];return e=e.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?h(r.toString(),l,e,p):p(r.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var t=(0,o.Z)((0,n.Z)().mark((function t(){var o;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,d(e,a,p);case 2:if(void 0!==(o=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==l?h(o,l,e,p):p(o);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),u}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}t=parseFloat(t),n((t=Number.isInteger(t/e[a].precision)?t/e[a].precision+" "+e[a].symbol:(t/e[a].precision).toFixed(o)+" "+e[a].symbol).toString())},Precise:function(t,a,n){n(t=(t=parseFloat(t))/e[a].precision+" "+e[a].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},25398:(t,e,a)=>{"use strict";a.r(e),a.d(e,{assets:()=>h,contentTitle:()=>d,default:()=>k,frontMatter:()=>l,metadata:()=>m,toc:()=>u});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),r=a(47940),s=["components"],l={id:"learn-nominator",title:"Nominator",sidebar_label:"Nominator",description:"Role of Nominators in the Polkadot Ecosystem.",keyword:["nominate","nominator","stake","staking"],slug:"../learn-nominator"},d=void 0,m={unversionedId:"learn/learn-nominator",id:"learn/learn-nominator",title:"Nominator",description:"Role of Nominators in the Polkadot Ecosystem.",source:"@site/../docs/learn/learn-nominator.md",sourceDirName:"learn",slug:"/learn-nominator",permalink:"/docs/learn-nominator",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-nominator.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1689335021,formattedLastUpdatedAt:"Jul 14, 2023",frontMatter:{id:"learn-nominator",title:"Nominator",sidebar_label:"Nominator",description:"Role of Nominators in the Polkadot Ecosystem.",keyword:["nominate","nominator","stake","staking"],slug:"../learn-nominator"},sidebar:"docs",previous:{title:"Collator",permalink:"/docs/learn-collator"},next:{title:"Validator",permalink:"/docs/learn-validator"}},h={},u=[{value:"Why Nominate?",id:"why-nominate",level:2},{value:"Setting-up Accounts",id:"setting-up-accounts",level:2},{value:"Stash & Staking Proxy",id:"stash--staking-proxy",level:3},{value:"Rewards Payout Account",id:"rewards-payout-account",level:3},{value:"Nominating with the Polkadot-JS UI",id:"nominating-with-the-polkadot-js-ui",level:2},{value:"Targets Page",id:"targets-page",level:3},{value:"Bags-list",id:"bags-list",level:3},{value:"Validator Stats",id:"validator-stats",level:3},{value:"Nominating with the Staking Dashboard",id:"nominating-with-the-staking-dashboard",level:2},{value:"Staking Election Stages",id:"staking-election-stages",level:2},{value:"The Election Solution Set",id:"the-election-solution-set",level:3},{value:"Receiving Rewards",id:"receiving-rewards",level:2},{value:"Good Nominator Practices",id:"good-nominator-practices",level:2},{value:"Required Minimum Stake",id:"required-minimum-stake",level:3},{value:"Avoiding Oversubscribed Validators",id:"avoiding-oversubscribed-validators",level:3},{value:"Active vs. Inactive Nomination",id:"active-vs-inactive-nomination",level:3},{value:"Minimum Active Nomination to Receive Staking Rewards",id:"minimum-active-nomination-to-receive-staking-rewards",level:3},{value:"Guides",id:"guides",level:2}],p={toc:u},c="wrapper";function k(t){var e=t.components,l=(0,o.Z)(t,s);return(0,i.kt)(c,(0,n.Z)({},p,l,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{title:"New to Staking?",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"Start your staking journey or explore more information about staking on\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/staking/"},"Polkadot's Home Page"),". Discover the new\n",(0,i.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/#/overview"},"Staking Dashboard")," that makes staking much easier and\ncheck this\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182104"},"extensive article list")," to\nhelp you get started.\nYou can now ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/nomination-pools-are-live-stake-natively-with-just-1-dot/"},"stake natively with just 1 DOT and earn staking rewards"),".\n")),(0,i.kt)("admonition",{title:"Stake through Nomination Pools",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The minimum amount required to become an active nominator and earn rewards may change from era to\nera.\nIt is currently ",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.minimumActiveStake",defaultValue:2937e9,filter:"humanReadable",mdxType:"RPC"})),".\n","\nIf you have less DOT than the minimum active\nnomination and still want to participate in staking, you can join the nomination pools. You can now\nstake on Polkadot natively with just\n",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)(r.Z,{network:"polkadot",path:"query.nominationPools.minJoinBond",filter:"humanReadable",defaultValue:1e10,mdxType:"RPC"})),"\n","\nin the nomination pools and earn staking rewards. For additional information, see\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/nomination-pools-are-live-stake-natively-with-just-1-dot/"},"this blog post"),".\nCheck the wiki doc on ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pools")," for more information.")),(0,i.kt)("p",null,"If you landed on this page, you decided to understand how you can be a good nominator. Note, this\npage is not for ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pool")," members, although pool members might\ngain essential knowledge about how to choose nomination pools."),(0,i.kt)("p",null,"The information provided on this page is complementary to that on the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking"},(0,i.kt)("strong",{parentName:"a"},"Staking Page"))," and ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced"},(0,i.kt)("strong",{parentName:"a"},"Advanced Staking Page")),".\nMake sure you read those pages as well before nominating."),(0,i.kt)("h2",{id:"why-nominate"},"Why Nominate?"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"You become part of the Polkadot movement, a\ngroup of diverse professionals and enthusiasts around the world aspiring to build and foster the\nnext-gen Internet, Web3: a decentralized, privacy-focused, and trustless internet."),(0,i.kt)("li",{parentName:"ul"},"You are an essential piece of the puzzle, keeping\nPolkadot secure. The bonded balance can be\nused to vote in ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-polkadot-opengov"},"Polkadot OpenGov")," and shape the future direction of\nPolkadot."),(0,i.kt)("li",{parentName:"ul"},"You will start to understand how Polkadot\nworks at a technical-level. When you feel comfortable with your nomination skills and knowledge,\nyou can open your ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-nomination-pools"},"nomination pool"),", help others secure the network\nand earn rewards, and build your reputation as a trusted nomination pool operator. If you like to\nbe more involved, the next step is to become a ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-validator"},"validator"),"."),(0,i.kt)("li",{parentName:"ul"},"By getting ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking"},"staking")," rewards you keep up with or (likely) stay ahead of\nPolkadot inflation.")),(0,i.kt)("p",null,"Nominators secure the Relay Chain by staking DOT\nand nominating validators. You may have an account with\nDOT and want to earn fresh\nDOT. You could do so as a validator, which\nrequires experience setting up a node and running and maintaining it 24/7."),(0,i.kt)("p",null,"On Polkadot you can also earn\nDOT by nominating one or more validators. Doing\nso makes you a nominator for the validator(s) you chose. Pick your validators carefully - if they do\nnot behave properly, they will get slashed, and you will lose\nDOT. However, if they follow the network rules,\nyou can share the staking rewards they generate."),(0,i.kt)("p",null,"While your DOT are staked for nominations, they\nare 'locked' (bonded). You can\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-nominate-polkadot"},"stop nominating at any time"),", but remember\nthat the action is effective in the next era and does not automatically unbond your funds. Unbonding\nis a separate action, and it takes effect after the unbonding period, which is\n28-day long on Polkadot. This is\ncalculated by taking the ",(0,i.kt)("strong",{parentName:"p"},"bonding duration")," (in eras), multiplying it by the ",(0,i.kt)("strong",{parentName:"p"},"length of a single\nera")," (in hours), and dividing by the ",(0,i.kt)("strong",{parentName:"p"},"hours in a day")," (24). Example:\n(28 \xd7 24 \xf7 24 = 28 days). A\nstaking lock will be visible on the Polkadot-JS UI during the unbonding period, and after it, the\nstaking lock can be unlocked, and the bonded funds become free balance you can transfer."),(0,i.kt)("admonition",{title:"Fast Unstaking feature is live!",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"If you accidentally bonded your DOT or your\nbonded DOT never backed any active validator, you\ncan now unbond them immediately.")),(0,i.kt)("p",null,"If your bonded balance did not back any validators in the last\n28 days on Polkadot (when the feature goes live),\nyou are eligible to perform fast unstaking. The\n",(0,i.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/#/overview"},"staking dashboard")," will automatically check if you\nqualify. For more information, visit the\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000169433-can-i-transfer-dot-without-unbonding-and-waiting-28-days-"},'"Fast Unstake" section in this support article'),"."),(0,i.kt)("h2",{id:"setting-up-accounts"},"Setting-up Accounts"),(0,i.kt)("h3",{id:"stash--staking-proxy"},"Stash & Staking Proxy"),(0,i.kt)("p",null,"The first thing you need to do before becoming a nominator is to make sure you have a\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking/#stash-account-and-staking-proxy"},(0,i.kt)("strong",{parentName:"a"},"stash account")),' where you can transfer\nfunds you want to use for staking. For these accounts, it is recommended to use a "cold wallet"\nsolution such as ',(0,i.kt)("a",{parentName:"p",href:"/docs/ledger"},"Ledger")," or\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-account-generation#parity-signer"},"Parity Signer"),"."),(0,i.kt)("p",null,"After setting up the stash account, it is recommended to have a\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced/#staking-proxies"},(0,i.kt)("strong",{parentName:"a"},"staking proxy")),". Although you can be a nominator\nwith just a stash account, having a staking proxy is good practice for security reasons."),(0,i.kt)("p",null,"A 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)."),(0,i.kt)("h3",{id:"rewards-payout-account"},"Rewards Payout Account"),(0,i.kt)("p",null,"As a nominator, you will be asked to choose an account where rewards will be paid. You can select\none of the following options:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"back to staking: rewards are compounded to the bonded amount."),(0,i.kt)("li",{parentName:"ul"},"to stash: rewards are sent to the stash account as a free balance."),(0,i.kt)("li",{parentName:"ul"},"to another account: rewards are sent to a user-defined account (not stash).")),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Being a nominator is made simpler by using the\n",(0,i.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/#/overview"},(0,i.kt)("strong",{parentName:"a"},"Staking Dashboard"))," that will guide you step by\nstep through specifying rewards destination and bonded amount, and nominating validators (more on\nthis below). Note that staking proxies are not currently supported on the dashboard.")),(0,i.kt)("h2",{id:"nominating-with-the-polkadot-js-ui"},"Nominating with the Polkadot-JS UI"),(0,i.kt)("h3",{id:"targets-page"},"Targets Page"),(0,i.kt)("p",null,"There are many factors to consider when deciding which of your nominations. One helpful tool to\nchoose validators is the Staking ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/targets"},"Targets")," table in\nthe Polkadot-JS UI. This allows sorting validators using various metrics. Below are the relevant\nmetrics shown as an example, followed by a brief description of each."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"validator"),(0,i.kt)("th",{parentName:"tr",align:null},"payout"),(0,i.kt)("th",{parentName:"tr",align:null},"nominators"),(0,i.kt)("th",{parentName:"tr",align:null},"comm."),(0,i.kt)("th",{parentName:"tr",align:null},"total stake"),(0,i.kt)("th",{parentName:"tr",align:null},"own stake"),(0,i.kt)("th",{parentName:"tr",align:null},"return"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"A"),(0,i.kt)("td",{parentName:"tr",align:null},"recently"),(0,i.kt)("td",{parentName:"tr",align:null},"1 (",(0,i.kt)("inlineCode",{parentName:"td"},"active"),") 4 (",(0,i.kt)("inlineCode",{parentName:"td"},"all"),")"),(0,i.kt)("td",{parentName:"tr",align:null},"3%"),(0,i.kt)("td",{parentName:"tr",align:null},"1.6 MDOT"),(0,i.kt)("td",{parentName:"tr",align:null},"8500 DOT"),(0,i.kt)("td",{parentName:"tr",align:null},"17.8%")))),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"payout"),": How recently the validator made its last reward payout to nominators.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"nominators"),": This column consists of two number values. The ",(0,i.kt)("strong",{parentName:"p"},"active")," count (left number) is\nthe number of nominators whose stake is baking the validator in the current era. In this case\nValidator A has one active nominator. The total or ",(0,i.kt)("strong",{parentName:"p"},"all")," count (right number) is the number of\nall nominators who nominated Validator A. This includes the active count and all the other\nnominators whose stake in the current era is baking other validators."),(0,i.kt)("p",{parentName:"li"},"Be cautious of validators with a high number of subscribers. A validator is considered\noversubscribed when more than\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n","\nactive nominators are assigned to the validator. In this scenario, only the top\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n","\nnominators (sorted by stake) will receive rewards. The remaining nominators will not be rewarded.\nHowever, they can be slashed if the validator commits a slashable offense."),(0,i.kt)("p",{parentName:"li"},"Every nominator can select up to a maximum of\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominations",defaultValue:16,mdxType:"RPC"}),"\n","\nvalidators, which contributes towards maximizing the probability of having the nominator\u2019s stake\napplied to the validators active set. Nominating too few validators could result in the nominators\nnot receiving their rewards when none of them make it to the active set or when those validators\nstop validating. The election algorithm attempts to maximize the overall network stake while\nminimizing the variance of the active stake across the validators. For additional information on\nthe election process, check out the research behind\n",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/protocols/NPoS"},"nominated proof-of-stake"),".")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"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\nvalidator reward taken by the validator before the rewards are split among the nominators. As a\nnominator, you may think that choosing validators with the lowest commission is best. However,\nvalidators must be able to run at break-even to continue operations sustainably. Independent\nvalidators that rely on the commission to cover their server costs help to keep the network\ndecentralized. Some validators, operated by central exchanges, etc., keep 100% of the commission\nto payout their staking service clients and therefore do not provide any rewards to external\nnominators. The commission is just one piece of the puzzle you should consider when picking\nnominating validators.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"total stake"),": The total amount of DOT tokens\nstaked by nominators and the validator (i.e. own stake, see below).")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"own stake"),': The amount of DOT tokens the\nvalidator has put up as a stake. A higher own stake can be considered as having more "skin in the\ngame". This can imply increased trustworthiness. However, a validator not having a large amount of\n"own stake" is not automatically untrustworthy, as the validator could nominate from a different\naddress.')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"return"),": Average annual yield paid out to nominators (i.e. number of rewards divided by the\nnumber of bonded tokens). Note that nominating those with a higher yield may not guarantee similar\nfuture performance."))),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Staking Returns",src:a(53325).Z,width:"2169",height:"509"})),(0,i.kt)("p",null,"On 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:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"one validator per operator"),": Do not show groups of validators run by a single operator. It\nshows small operators only who will likely have a higher commission and higher self-stake.\nNominating only small operators might not always guarantee staking rewards, but it helps to keep\nthe network more resilient to attacks.")),(0,i.kt)("admonition",{title:"Validator vs Operator",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"A validator is the node, the physical equipment with installed software that allows to produce new\nblocks and earn rewards. An operator is the entity responsible for setting up, running an\nmaintaining the node. An operator can have multiple validators under different sub-identities. For\nexample, ",(0,i.kt)("inlineCode",{parentName:"p"},"ZUG CAPITAL/07")," is one of the numerous validators belonging to the operator Zug Capital.")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"comm. < 20%"),": Do not show any validators with a commission of 20% or higher."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"with capacity"),": Do not show any validators who are currently operating\n",(0,i.kt)("a",{parentName:"li",href:"/docs/glossary#capacity"},"at capacity")," (i.e., could potentially be oversubscribed)."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"recent payouts"),": Only show validators that have recently caused a\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking-advanced"},"payout to be issued"),". Note that anyone can cause a payout to occur; it\ndoes not have to be the operator of a validator."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"currently elected"),": Only show validators in the active set (i.e., they have been elected to\nproduce blocks in the current era)."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"with an identity"),": Only show validators that have set an ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-identity"},"identity"),". Note\nthat this identity does not have to be verified by a registrar for the validator to appear in the\nlist.")),(0,i.kt)("admonition",{title:"Single Operators with Multiple Validators",type:"warning"},(0,i.kt)("p",{parentName:"admonition"},'Recall that slashing is an additive function; the more validators offline or equivocating in a given\nsession, the harsher the penalties. Since validators that are controlled by a single operator are\nmore at risk of a "synchronized" failure, nominating them implies a greater risk of having a large\nslash of your nominated funds. Generally, it is safer to nominate validators whose behavior is\nindependent of others in many ways (different hardware, geographic location, owner, etc.).')),(0,i.kt)("h3",{id:"bags-list"},"Bags-list"),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"On Polkadot and Kusama, the instance of the pallet\n",(0,i.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_bags_list/"},"Bags-List")," is named as\n",(0,i.kt)("inlineCode",{parentName:"p"},"voterList"),".")),(0,i.kt)("p",null,"Nominating 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. Bags-list allows\nup to\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.maxNominatorsCount",defaultValue:5e4,mdxType:"RPC"}),"\n","\nnominators to set their intention to nominate, of which the stake of the top\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.maxElectingVoters",defaultValue:22500,mdxType:"RPC"}),"\n","\nnominators is considered for ",(0,i.kt)("a",{parentName:"p",href:"#staking-election-stages"},"electing set")," that eventually determines the\nactive validators."),(0,i.kt)("p",null,"The nominator accounts in a bag are sorted based on their insertion order, not by their nomination\nstake. The ",(0,i.kt)("inlineCode",{parentName:"p"},"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",(0,i.kt)("inlineCode",{parentName:"p"},"voterList.rebag")," extrinsic."),(0,i.kt)("p",null,"For guidelines about how to rebag or move your account within a bag, see the followings:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},'The "Bags List" Section on\n',(0,i.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000181018-i-have-more-than-the-minimum-bonded-but-i-m-not-getting-rewards"},"this Support Page"),"."),(0,i.kt)("li",{parentName:"ul"},"The ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking-advanced#bags-list"},"Bags List Section")," in Advanced Staking Concepts."),(0,i.kt)("li",{parentName:"ul"},"The ",(0,i.kt)("a",{parentName:"li",href:"https://youtu.be/hIIZRJLrBZA"},"dedicated technical explainer video"),".")),(0,i.kt)("h3",{id:"validator-stats"},"Validator Stats"),(0,i.kt)("p",null,"Nominators can query ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/query/"},"validator histories")," 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' ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-identity"},"identity")," (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."),(0,i.kt)("p",null,"Any problematic behavior must be taken seriously. An example of problematic behavior will be if a\nvalidator is regularly offline. In this case, nominators most likely would get fewer rewards. If\nmany validators are ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking#unresponsiveness"},"unreachable"),", such validators and\ncorresponding nominators will be slashed."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Validator Stats",src:a(95520).Z,width:"1900",height:"1204"})),(0,i.kt)("h2",{id:"nominating-with-the-staking-dashboard"},"Nominating with the Staking Dashboard"),(0,i.kt)("p",null,"The Staking Dashboard allows to choose pre-selected lists of validators based on user preference, or\nto manually select validators similarly as in the Polkadot-JS UI."),(0,i.kt)("p",null,"Pre-selected choices are:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Optimal Selection: Selects a mix of majority active and inactive validators."),(0,i.kt)("li",{parentName:"ul"},"Active Low Commission: Gets a set of active validators with low commission."),(0,i.kt)("li",{parentName:"ul"},"From Favorites: Gets a set of your favorite validators.")),(0,i.kt)("h2",{id:"staking-election-stages"},"Staking Election Stages"),(0,i.kt)("p",null,'The staking election system has three stages for both validators and nominators, namely "intention",\n"electable/electing", and "active".'),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"intention to nominate:"),' an account that has stated the intention to nominate; also called\nsimply a "nominator".'),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"electing nominator:")," a nominator who is selected to be a part of the input to the\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-phragmen"},"NPoS election algorithm"),". This selection is based on stake and is made using\nthe ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking-advanced#bags-list"},"bags-list"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"active nominator:")," a nominator who came out of the NPoS election algorithm backing an active\nvalidator. Staking rewards are received by the top\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\nnominators ranked by stake. When slashing occurs, all the active nominators backing the validator\nget slashed (also those who do not receive rewards due to oversubscription issues).")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Nominator Election",src:a(55404).Z,width:"612",height:"430"})),(0,i.kt)("h3",{id:"the-election-solution-set"},"The Election Solution Set"),(0,i.kt)("p",null,'Determining 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. Currently,\nnominators 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.'),(0,i.kt)("h2",{id:"receiving-rewards"},"Receiving Rewards"),(0,i.kt)("p",null,"As 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 only\nselected oversubscribed validators, or the validator you are nominating has 100% commission. It is\ngenerally wise to choose as many trustworthy validators as you can (up to\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominations",defaultValue:16,mdxType:"RPC"}),")\n","\nto reduce the risk of none of your nominated validators being elected."),(0,i.kt)("admonition",{title:"Not receiving Staking Rewards?",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"To explore the possible reasons for not receiving staking rewards, check out the followings:"),(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},"The\n",(0,i.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000181959-staking-faq-s"},"Staking FAQ"),"\non the Support Pages."),(0,i.kt)("li",{parentName:"ul"},"The\n",(0,i.kt)("a",{parentName:"li",href:"https://www.reddit.com/r/Polkadot/comments/10kurje/why_am_i_not_receiving_staking_rewards/"},'"Why am I not receiving staking rewards?"'),"\nReddit article."),(0,i.kt)("li",{parentName:"ul"},"The ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking#why-am-i-not-receiving-rewards"},'"Why am I not receiving staking rewards?"'),"\nsection on the Staking Page."))),(0,i.kt)("p",null,"Rewards are ",(0,i.kt)("em",{parentName:"p"},"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 ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced"},"Simple Payouts")," for more\ninformation and instructions for claiming rewards."),(0,i.kt)("admonition",{title:"Explainer videos on Nominating",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"These concepts have been further explained in the following videos:"),(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=weG_uzdSs1E&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&index=4"},"Why Nominate on Polkadot & Kusama")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=K-a4CgVchvU&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&index=9"},"What to Consider when Nominating Validators on Polkadot and Kusama")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://youtu.be/FCXC0CDhyS4"},"Nominating/Staking on Polkadot and Kusama")))),(0,i.kt)("h2",{id:"good-nominator-practices"},"Good Nominator Practices"),(0,i.kt)("h3",{id:"required-minimum-stake"},"Required Minimum Stake"),(0,i.kt)("p",null,"Due to the way the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"Phragmen algorithm")," 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."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"min-intention-threshold:")," minimum stake to declare the intention to nominate. This parameter\ncan be updated via on-chain governance, and the most recent and up-to-date version can be found on\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate"},"chain state")," (select ",(0,i.kt)("strong",{parentName:"p"},"state query > staking >\nminimumNominatorBond"),")")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"min-electing:")," minimum stake among the electing nominators. Since this is almost always the\nsame as \u201cmin-active\u201d, it might not be reported.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"min-active:")," minimum stake among the active nominators. If your stake falls below this dynamic\nthreshold in a given era, you will not receive staking rewards for that era."))),(0,i.kt)("p",null,"Thus, for ",(0,i.kt)("strong",{parentName:"p"},"nominator counters"),", we have:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"count of nominator intentions and max possible nominator intentions\n(unlimited)\n",""),(0,i.kt)("li",{parentName:"ul"},"count of electing nominators, and maximum possible electing nominators\n(",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.maxElectingVoters",defaultValue:22500,mdxType:"RPC"}),")\n",""),(0,i.kt)("li",{parentName:"ul"},"count of active nominators and maximum possible active nominators\n(",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.maxElectingVoters",defaultValue:22500,mdxType:"RPC"}),")\n","")),(0,i.kt)("h3",{id:"avoiding-oversubscribed-validators"},"Avoiding Oversubscribed Validators"),(0,i.kt)("p",null,"Validators can only pay out to a certain number of nominators per era. This is currently set to\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n","\nbut can be modified via governance. If more than\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n",'\nnominators nominate the same validator, it is "oversubscribed", and only the top\n',(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n","\nstaked nominators (ranked by the amount of stake) are paid rewards. Other nominators will receive no\nrewards for that era, although their stake will still be used to calculate entry into the active\nvalidator set."),(0,i.kt)("p",null,"Although it is difficult to determine how many nominators will nominate a given validator in the\nnext era, one can estimate based on the current number of nominators. A validator with only 5\nnominators in this era, for instance, is unlikely to have more than\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n","\nin the next era. However, an already-oversubscribed validator with 1000 nominators this era is very\nlikely to be oversubscribed in the next era as well."),(0,i.kt)("p",null,"If you are not nominating with a large number of DOTs, you should try to avoid\n",(0,i.kt)("a",{parentName:"p",href:"/docs/glossary#oversubscribed"},"oversubscribed")," validators. It is not always easy to\ncalculate if the validator selected will be oversubscribed in the next session; one way to avoid\nchoosing potentially oversubscribed validators is to filter out any that are\n",(0,i.kt)("a",{parentName:"p",href:"/docs/glossary#capacity"},"at capacity")," on the Targets page."),(0,i.kt)("p",null,"Finally, if you have a minimal amount of DOTs close to the value of ",(0,i.kt)("inlineCode",{parentName:"p"},"minActiveNomination"),", you may\nneed to stake more DOT to get into the election set. The nominator-to-validator mapping solution\nneeds to be evaluated within a single block duration, and if there are too many nominators, the\nlowest-staked nominations will be dropped from even being considered to be part of the electing set.\nThis ",(0,i.kt)("inlineCode",{parentName:"p"},"minActiveNomination")," value is dynamic and will vary over time. You can read the blog post\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/polkadot-staking-an-update/"},'"Polkadot Staking: An Update"')," for more\ndetails."),(0,i.kt)("h3",{id:"active-vs-inactive-nomination"},"Active vs. Inactive Nomination"),(0,i.kt)("p",null,"When you go to the ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/actions"},"Account actions")," under staking\npage, you should see your bonded accounts and nomination status. If not, you can follow\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-nominate-polkadot"},"this")," guide to configure it first. Your\nnominations will be effective in the next era; eras are roughly\n24 hours on Polkadot."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Nominations",src:a(44277).Z,width:"2878",height:"766"})),(0,i.kt)("p",null,'Suppose 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.'),(0,i.kt)("p",null,"If 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",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen#optimizations"},"section on Phragm\xe9n optimization")," for more details."),(0,i.kt)("h3",{id:"minimum-active-nomination-to-receive-staking-rewards"},"Minimum Active Nomination to Receive Staking Rewards"),(0,i.kt)("admonition",{title:"Minimum DOT required to earn staking rewards",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The minimum DOT required to submit intent to nominate is\n",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.minNominatorBond",defaultValue:1e12,filter:"humanReadable",mdxType:"RPC"})),"\n, but the minimum active nomination required to earn staking rewards is dynamic and may be much\nhigher, which can be viewed on\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/targets"},"Polkadot JS Apps > Network > Staking > Targets page"),".")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Minimum Active Nomination",src:a(95670).Z,width:"1436",height:"166"})),(0,i.kt)("h2",{id:"guides"},"Guides"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-nominate-polkadot"},"Be a Nominator (Polkadot)")," - Guide on\nnominating on the Kusama canary network."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-nominate-polkadot"},"Stop Being a Nominator (all networks)")," -\nGuide on stopping nominations and withdrawing tokens.")))}k.isMDXComponent=!0},53325:(t,e,a)=>{"use strict";a.d(e,{Z:()=>n});const n=a.p+"assets/images/nominators_target-d8652ac89f3cbb16528cd68808a32cf0.png"},95670:(t,e,a)=>{"use strict";a.d(e,{Z:()=>n});const n=a.p+"assets/images/min-active-nomination-bfbe67c2714eb5027c6a4f45608c9bc2.png"},55404:(t,e,a)=>{"use strict";a.d(e,{Z:()=>n});const n=a.p+"assets/images/nominator-election-ae25b5db36fa18b56fa58c5370127dd4.png"},44277:(t,e,a)=>{"use strict";a.d(e,{Z:()=>n});const n=a.p+"assets/images/polkadotjs_nominator_account-e0f5d58cd9cce279d6f462cde9f706f4.png"},95520:(t,e,a)=>{"use strict";a.d(e,{Z:()=>n});const n=a.p+"assets/images/validator_stats-57ec40656d6829e2ef791550116824d4.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/ff6596ea.c9706c2e.js b/assets/js/ff6596ea.c9706c2e.js new file mode 100644 index 000000000000..16ec6e531e1a --- /dev/null +++ b/assets/js/ff6596ea.c9706c2e.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[3842],{47940:(t,e,a)=>{"use strict";a.d(e,{Z:()=>u});var n=a(74165),o=a(15861),i=a(67294),r=a(87152),s=a(17145),l=a(67425);function d(t,e,a){return m.apply(this,arguments)}function m(){return(m=(0,o.Z)((0,n.Z)().mark((function t(e,a,o){var i,l,d,m,h;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:i=void 0,l=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return i="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return i="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return i="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return i="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==i){t.next=18;break}return t.abrupt("return");case 18:return d=new r.U(i),t.next=21,s.G.create({provider:d});case 21:m=t.sent,(h=a.split(".")).forEach((function(t){t in m&&(m=m[t])})),t.t1=h[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return l=m.toString(),t.abrupt("break",35);case 29:return t.next=31,m();case 31:return l=(l=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+h[0]+") in "+a);case 35:return t.abrupt("return",l);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function h(t,e,a,n){switch(e){case"humanReadable":(0,l.HumanReadable)(t,a,n);break;case"precise":(0,l.Precise)(t,a,n);break;case"blocksToDays":(0,l.BlocksToDays)(t,n);break;case"percentage":(0,l.Percentage)(t,n);break;case"permillToPercent":(0,l.PermillToPercent)(t,n);break;case"arrayLength":(0,l.ArrayLength)(t,n);break;default:return void console.log("Ignoring unknown filter type")}}const u=function(t){var e=t.network,a=t.path,r=t.defaultValue,s=t.filter,l=void 0===s?void 0:s,m=(0,i.useState)(""),u=m[0],p=m[1];return e=e.toLowerCase(),(0,i.useEffect)((function(){void 0!==l?h(r.toString(),l,e,p):p(r.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var i=function(){var t=(0,o.Z)((0,n.Z)().mark((function t(){var o;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,d(e,a,p);case 2:if(void 0!==(o=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==l?h(o,l,e,p):p(o);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{i()}catch(s){console.log(s)}}}),[]),u}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}t=parseFloat(t),n((t=Number.isInteger(t/e[a].precision)?t/e[a].precision+" "+e[a].symbol:(t/e[a].precision).toFixed(o)+" "+e[a].symbol).toString())},Precise:function(t,a,n){n(t=(t=parseFloat(t))/e[a].precision+" "+e[a].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},PermillToPercent:function(t,e){e((t/=1e4).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},25398:(t,e,a)=>{"use strict";a.r(e),a.d(e,{assets:()=>h,contentTitle:()=>d,default:()=>k,frontMatter:()=>l,metadata:()=>m,toc:()=>u});var n=a(87462),o=a(63366),i=(a(67294),a(3905)),r=a(47940),s=["components"],l={id:"learn-nominator",title:"Nominator",sidebar_label:"Nominator",description:"Role of Nominators in the Polkadot Ecosystem.",keyword:["nominate","nominator","stake","staking"],slug:"../learn-nominator"},d=void 0,m={unversionedId:"learn/learn-nominator",id:"learn/learn-nominator",title:"Nominator",description:"Role of Nominators in the Polkadot Ecosystem.",source:"@site/../docs/learn/learn-nominator.md",sourceDirName:"learn",slug:"/learn-nominator",permalink:"/docs/learn-nominator",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-nominator.md",tags:[],version:"current",lastUpdatedBy:"Filippo",lastUpdatedAt:1689335021,formattedLastUpdatedAt:"Jul 14, 2023",frontMatter:{id:"learn-nominator",title:"Nominator",sidebar_label:"Nominator",description:"Role of Nominators in the Polkadot Ecosystem.",keyword:["nominate","nominator","stake","staking"],slug:"../learn-nominator"},sidebar:"docs",previous:{title:"Collator",permalink:"/docs/learn-collator"},next:{title:"Validator",permalink:"/docs/learn-validator"}},h={},u=[{value:"Why Nominate?",id:"why-nominate",level:2},{value:"Setting-up Accounts",id:"setting-up-accounts",level:2},{value:"Stash & Staking Proxy",id:"stash--staking-proxy",level:3},{value:"Rewards Payout Account",id:"rewards-payout-account",level:3},{value:"Nominating with the Polkadot-JS UI",id:"nominating-with-the-polkadot-js-ui",level:2},{value:"Targets Page",id:"targets-page",level:3},{value:"Bags-list",id:"bags-list",level:3},{value:"Validator Stats",id:"validator-stats",level:3},{value:"Nominating with the Staking Dashboard",id:"nominating-with-the-staking-dashboard",level:2},{value:"Staking Election Stages",id:"staking-election-stages",level:2},{value:"The Election Solution Set",id:"the-election-solution-set",level:3},{value:"Receiving Rewards",id:"receiving-rewards",level:2},{value:"Good Nominator Practices",id:"good-nominator-practices",level:2},{value:"Required Minimum Stake",id:"required-minimum-stake",level:3},{value:"Avoiding Oversubscribed Validators",id:"avoiding-oversubscribed-validators",level:3},{value:"Active vs. Inactive Nomination",id:"active-vs-inactive-nomination",level:3},{value:"Minimum Active Nomination to Receive Staking Rewards",id:"minimum-active-nomination-to-receive-staking-rewards",level:3},{value:"Guides",id:"guides",level:2}],p={toc:u},c="wrapper";function k(t){var e=t.components,l=(0,o.Z)(t,s);return(0,i.kt)(c,(0,n.Z)({},p,l,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("admonition",{title:"New to Staking?",type:"tip"},(0,i.kt)("p",{parentName:"admonition"},"Start your staking journey or explore more information about staking on\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/staking/"},"Polkadot's Home Page"),". Discover the new\n",(0,i.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/#/overview"},"Staking Dashboard")," that makes staking much easier and\ncheck this\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000182104"},"extensive article list")," to\nhelp you get started.\nYou can now ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/nomination-pools-are-live-stake-natively-with-just-1-dot/"},"stake natively with just 1 DOT and earn staking rewards"),".\n")),(0,i.kt)("admonition",{title:"Stake through Nomination Pools",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The minimum amount required to become an active nominator and earn rewards may change from era to\nera.\nIt is currently ",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.minimumActiveStake",defaultValue:2937e9,filter:"humanReadable",mdxType:"RPC"})),".\n","\nIf you have less DOT than the minimum active\nnomination and still want to participate in staking, you can join the nomination pools. You can now\nstake on Polkadot natively with just\n",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)(r.Z,{network:"polkadot",path:"query.nominationPools.minJoinBond",filter:"humanReadable",defaultValue:1e10,mdxType:"RPC"})),"\n","\nin the nomination pools and earn staking rewards. For additional information, see\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/blog/nomination-pools-are-live-stake-natively-with-just-1-dot/"},"this blog post"),".\nCheck the wiki doc on ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pools")," for more information.")),(0,i.kt)("p",null,"If you landed on this page, you decided to understand how you can be a good nominator. Note, this\npage is not for ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-nomination-pools"},"nomination pool")," members, although pool members might\ngain essential knowledge about how to choose nomination pools."),(0,i.kt)("p",null,"The information provided on this page is complementary to that on the\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking"},(0,i.kt)("strong",{parentName:"a"},"Staking Page"))," and ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced"},(0,i.kt)("strong",{parentName:"a"},"Advanced Staking Page")),".\nMake sure you read those pages as well before nominating."),(0,i.kt)("h2",{id:"why-nominate"},"Why Nominate?"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"You become part of the Polkadot movement, a\ngroup of diverse professionals and enthusiasts around the world aspiring to build and foster the\nnext-gen Internet, Web3: a decentralized, privacy-focused, and trustless internet."),(0,i.kt)("li",{parentName:"ul"},"You are an essential piece of the puzzle, keeping\nPolkadot secure. The bonded balance can be\nused to vote in ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-polkadot-opengov"},"Polkadot OpenGov")," and shape the future direction of\nPolkadot."),(0,i.kt)("li",{parentName:"ul"},"You will start to understand how Polkadot\nworks at a technical-level. When you feel comfortable with your nomination skills and knowledge,\nyou can open your ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-nomination-pools"},"nomination pool"),", help others secure the network\nand earn rewards, and build your reputation as a trusted nomination pool operator. If you like to\nbe more involved, the next step is to become a ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-validator"},"validator"),"."),(0,i.kt)("li",{parentName:"ul"},"By getting ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking"},"staking")," rewards you keep up with or (likely) stay ahead of\nPolkadot inflation.")),(0,i.kt)("p",null,"Nominators secure the Relay Chain by staking DOT\nand nominating validators. You may have an account with\nDOT and want to earn fresh\nDOT. You could do so as a validator, which\nrequires experience setting up a node and running and maintaining it 24/7."),(0,i.kt)("p",null,"On Polkadot you can also earn\nDOT by nominating one or more validators. Doing\nso makes you a nominator for the validator(s) you chose. Pick your validators carefully - if they do\nnot behave properly, they will get slashed, and you will lose\nDOT. However, if they follow the network rules,\nyou can share the staking rewards they generate."),(0,i.kt)("p",null,"While your DOT are staked for nominations, they\nare 'locked' (bonded). You can\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-nominate-polkadot"},"stop nominating at any time"),", but remember\nthat the action is effective in the next era and does not automatically unbond your funds. Unbonding\nis a separate action, and it takes effect after the unbonding period, which is\n28-day long on Polkadot. This is\ncalculated by taking the ",(0,i.kt)("strong",{parentName:"p"},"bonding duration")," (in eras), multiplying it by the ",(0,i.kt)("strong",{parentName:"p"},"length of a single\nera")," (in hours), and dividing by the ",(0,i.kt)("strong",{parentName:"p"},"hours in a day")," (24). Example:\n(28 \xd7 24 \xf7 24 = 28 days). A\nstaking lock will be visible on the Polkadot-JS UI during the unbonding period, and after it, the\nstaking lock can be unlocked, and the bonded funds become free balance you can transfer."),(0,i.kt)("admonition",{title:"Fast Unstaking feature is live!",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"If you accidentally bonded your DOT or your\nbonded DOT never backed any active validator, you\ncan now unbond them immediately.")),(0,i.kt)("p",null,"If your bonded balance did not back any validators in the last\n28 days on Polkadot (when the feature goes live),\nyou are eligible to perform fast unstaking. The\n",(0,i.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/#/overview"},"staking dashboard")," will automatically check if you\nqualify. For more information, visit the\n",(0,i.kt)("a",{parentName:"p",href:"https://support.polkadot.network/support/solutions/articles/65000169433-can-i-transfer-dot-without-unbonding-and-waiting-28-days-"},'"Fast Unstake" section in this support article'),"."),(0,i.kt)("h2",{id:"setting-up-accounts"},"Setting-up Accounts"),(0,i.kt)("h3",{id:"stash--staking-proxy"},"Stash & Staking Proxy"),(0,i.kt)("p",null,"The first thing you need to do before becoming a nominator is to make sure you have a\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking/#stash-account-and-staking-proxy"},(0,i.kt)("strong",{parentName:"a"},"stash account")),' where you can transfer\nfunds you want to use for staking. For these accounts, it is recommended to use a "cold wallet"\nsolution such as ',(0,i.kt)("a",{parentName:"p",href:"/docs/ledger"},"Ledger")," or\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-account-generation#parity-signer"},"Parity Signer"),"."),(0,i.kt)("p",null,"After setting up the stash account, it is recommended to have a\n",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced/#staking-proxies"},(0,i.kt)("strong",{parentName:"a"},"staking proxy")),". Although you can be a nominator\nwith just a stash account, having a staking proxy is good practice for security reasons."),(0,i.kt)("p",null,"A 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)."),(0,i.kt)("h3",{id:"rewards-payout-account"},"Rewards Payout Account"),(0,i.kt)("p",null,"As a nominator, you will be asked to choose an account where rewards will be paid. You can select\none of the following options:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"back to staking: rewards are compounded to the bonded amount."),(0,i.kt)("li",{parentName:"ul"},"to stash: rewards are sent to the stash account as a free balance."),(0,i.kt)("li",{parentName:"ul"},"to another account: rewards are sent to a user-defined account (not stash).")),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"Being a nominator is made simpler by using the\n",(0,i.kt)("a",{parentName:"p",href:"https://staking.polkadot.network/#/overview"},(0,i.kt)("strong",{parentName:"a"},"Staking Dashboard"))," that will guide you step by\nstep through specifying rewards destination and bonded amount, and nominating validators (more on\nthis below). Note that staking proxies are not currently supported on the dashboard.")),(0,i.kt)("h2",{id:"nominating-with-the-polkadot-js-ui"},"Nominating with the Polkadot-JS UI"),(0,i.kt)("h3",{id:"targets-page"},"Targets Page"),(0,i.kt)("p",null,"There are many factors to consider when deciding which of your nominations. One helpful tool to\nchoose validators is the Staking ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/targets"},"Targets")," table in\nthe Polkadot-JS UI. This allows sorting validators using various metrics. Below are the relevant\nmetrics shown as an example, followed by a brief description of each."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"validator"),(0,i.kt)("th",{parentName:"tr",align:null},"payout"),(0,i.kt)("th",{parentName:"tr",align:null},"nominators"),(0,i.kt)("th",{parentName:"tr",align:null},"comm."),(0,i.kt)("th",{parentName:"tr",align:null},"total stake"),(0,i.kt)("th",{parentName:"tr",align:null},"own stake"),(0,i.kt)("th",{parentName:"tr",align:null},"return"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},"A"),(0,i.kt)("td",{parentName:"tr",align:null},"recently"),(0,i.kt)("td",{parentName:"tr",align:null},"1 (",(0,i.kt)("inlineCode",{parentName:"td"},"active"),") 4 (",(0,i.kt)("inlineCode",{parentName:"td"},"all"),")"),(0,i.kt)("td",{parentName:"tr",align:null},"3%"),(0,i.kt)("td",{parentName:"tr",align:null},"1.6 MDOT"),(0,i.kt)("td",{parentName:"tr",align:null},"8500 DOT"),(0,i.kt)("td",{parentName:"tr",align:null},"17.8%")))),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"payout"),": How recently the validator made its last reward payout to nominators.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"nominators"),": This column consists of two number values. The ",(0,i.kt)("strong",{parentName:"p"},"active")," count (left number) is\nthe number of nominators whose stake is baking the validator in the current era. In this case\nValidator A has one active nominator. The total or ",(0,i.kt)("strong",{parentName:"p"},"all")," count (right number) is the number of\nall nominators who nominated Validator A. This includes the active count and all the other\nnominators whose stake in the current era is baking other validators."),(0,i.kt)("p",{parentName:"li"},"Be cautious of validators with a high number of subscribers. A validator is considered\noversubscribed when more than\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n","\nactive nominators are assigned to the validator. In this scenario, only the top\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n","\nnominators (sorted by stake) will receive rewards. The remaining nominators will not be rewarded.\nHowever, they can be slashed if the validator commits a slashable offense."),(0,i.kt)("p",{parentName:"li"},"Every nominator can select up to a maximum of\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominations",defaultValue:16,mdxType:"RPC"}),"\n","\nvalidators, which contributes towards maximizing the probability of having the nominator\u2019s stake\napplied to the validators active set. Nominating too few validators could result in the nominators\nnot receiving their rewards when none of them make it to the active set or when those validators\nstop validating. The election algorithm attempts to maximize the overall network stake while\nminimizing the variance of the active stake across the validators. For additional information on\nthe election process, check out the research behind\n",(0,i.kt)("a",{parentName:"p",href:"https://research.web3.foundation/Polkadot/protocols/NPoS"},"nominated proof-of-stake"),".")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"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\nvalidator reward taken by the validator before the rewards are split among the nominators. As a\nnominator, you may think that choosing validators with the lowest commission is best. However,\nvalidators must be able to run at break-even to continue operations sustainably. Independent\nvalidators that rely on the commission to cover their server costs help to keep the network\ndecentralized. Some validators, operated by central exchanges, etc., keep 100% of the commission\nto payout their staking service clients and therefore do not provide any rewards to external\nnominators. The commission is just one piece of the puzzle you should consider when picking\nnominating validators.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"total stake"),": The total amount of DOT tokens\nstaked by nominators and the validator (i.e. own stake, see below).")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"own stake"),': The amount of DOT tokens the\nvalidator has put up as a stake. A higher own stake can be considered as having more "skin in the\ngame". This can imply increased trustworthiness. However, a validator not having a large amount of\n"own stake" is not automatically untrustworthy, as the validator could nominate from a different\naddress.')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"return"),": Average annual yield paid out to nominators (i.e. number of rewards divided by the\nnumber of bonded tokens). Note that nominating those with a higher yield may not guarantee similar\nfuture performance."))),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Staking Returns",src:a(53325).Z,width:"2169",height:"509"})),(0,i.kt)("p",null,"On 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:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"one validator per operator"),": Do not show groups of validators run by a single operator. It\nshows small operators only who will likely have a higher commission and higher self-stake.\nNominating only small operators might not always guarantee staking rewards, but it helps to keep\nthe network more resilient to attacks.")),(0,i.kt)("admonition",{title:"Validator vs Operator",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"A validator is the node, the physical equipment with installed software that allows to produce new\nblocks and earn rewards. An operator is the entity responsible for setting up, running an\nmaintaining the node. An operator can have multiple validators under different sub-identities. For\nexample, ",(0,i.kt)("inlineCode",{parentName:"p"},"ZUG CAPITAL/07")," is one of the numerous validators belonging to the operator Zug Capital.")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"comm. < 20%"),": Do not show any validators with a commission of 20% or higher."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"with capacity"),": Do not show any validators who are currently operating\n",(0,i.kt)("a",{parentName:"li",href:"/docs/glossary#capacity"},"at capacity")," (i.e., could potentially be oversubscribed)."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"recent payouts"),": Only show validators that have recently caused a\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking-advanced"},"payout to be issued"),". Note that anyone can cause a payout to occur; it\ndoes not have to be the operator of a validator."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"currently elected"),": Only show validators in the active set (i.e., they have been elected to\nproduce blocks in the current era)."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"with an identity"),": Only show validators that have set an ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-identity"},"identity"),". Note\nthat this identity does not have to be verified by a registrar for the validator to appear in the\nlist.")),(0,i.kt)("admonition",{title:"Single Operators with Multiple Validators",type:"warning"},(0,i.kt)("p",{parentName:"admonition"},'Recall that slashing is an additive function; the more validators offline or equivocating in a given\nsession, the harsher the penalties. Since validators that are controlled by a single operator are\nmore at risk of a "synchronized" failure, nominating them implies a greater risk of having a large\nslash of your nominated funds. Generally, it is safer to nominate validators whose behavior is\nindependent of others in many ways (different hardware, geographic location, owner, etc.).')),(0,i.kt)("h3",{id:"bags-list"},"Bags-list"),(0,i.kt)("admonition",{type:"info"},(0,i.kt)("p",{parentName:"admonition"},"On Polkadot and Kusama, the instance of the pallet\n",(0,i.kt)("a",{parentName:"p",href:"https://paritytech.github.io/substrate/master/pallet_bags_list/"},"Bags-List")," is named as\n",(0,i.kt)("inlineCode",{parentName:"p"},"voterList"),".")),(0,i.kt)("p",null,"Nominating 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. Bags-list allows\nup to\n",(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.maxNominatorsCount",defaultValue:5e4,mdxType:"RPC"}),"\n","\nnominators to set their intention to nominate, of which the stake of the top\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.maxElectingVoters",defaultValue:22500,mdxType:"RPC"}),"\n","\nnominators is considered for ",(0,i.kt)("a",{parentName:"p",href:"#staking-election-stages"},"electing set")," that eventually determines the\nactive validators."),(0,i.kt)("p",null,"The nominator accounts in a bag are sorted based on their insertion order, not by their nomination\nstake. The ",(0,i.kt)("inlineCode",{parentName:"p"},"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",(0,i.kt)("inlineCode",{parentName:"p"},"voterList.rebag")," extrinsic."),(0,i.kt)("p",null,"For guidelines about how to rebag or move your account within a bag, see the followings:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},'The "Bags List" Section on\n',(0,i.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000181018-i-have-more-than-the-minimum-bonded-but-i-m-not-getting-rewards"},"this Support Page"),"."),(0,i.kt)("li",{parentName:"ul"},"The ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking-advanced#bags-list"},"Bags List Section")," in Advanced Staking Concepts."),(0,i.kt)("li",{parentName:"ul"},"The ",(0,i.kt)("a",{parentName:"li",href:"https://youtu.be/hIIZRJLrBZA"},"dedicated technical explainer video"),".")),(0,i.kt)("h3",{id:"validator-stats"},"Validator Stats"),(0,i.kt)("p",null,"Nominators can query ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/query/"},"validator histories")," 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' ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-identity"},"identity")," (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."),(0,i.kt)("p",null,"Any problematic behavior must be taken seriously. An example of problematic behavior will be if a\nvalidator is regularly offline. In this case, nominators most likely would get fewer rewards. If\nmany validators are ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking#unresponsiveness"},"unreachable"),", such validators and\ncorresponding nominators will be slashed."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Validator Stats",src:a(95520).Z,width:"1900",height:"1204"})),(0,i.kt)("h2",{id:"nominating-with-the-staking-dashboard"},"Nominating with the Staking Dashboard"),(0,i.kt)("p",null,"The Staking Dashboard allows to choose pre-selected lists of validators based on user preference, or\nto manually select validators similarly as in the Polkadot-JS UI."),(0,i.kt)("p",null,"Pre-selected choices are:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Optimal Selection: Selects a mix of majority active and inactive validators."),(0,i.kt)("li",{parentName:"ul"},"Active Low Commission: Gets a set of active validators with low commission."),(0,i.kt)("li",{parentName:"ul"},"From Favorites: Gets a set of your favorite validators.")),(0,i.kt)("h2",{id:"staking-election-stages"},"Staking Election Stages"),(0,i.kt)("p",null,'The staking election system has three stages for both validators and nominators, namely "intention",\n"electable/electing", and "active".'),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"intention to nominate:"),' an account that has stated the intention to nominate; also called\nsimply a "nominator".'),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"electing nominator:")," a nominator who is selected to be a part of the input to the\n",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-phragmen"},"NPoS election algorithm"),". This selection is based on stake and is made using\nthe ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking-advanced#bags-list"},"bags-list"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"active nominator:")," a nominator who came out of the NPoS election algorithm backing an active\nvalidator. Staking rewards are received by the top\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\nnominators ranked by stake. When slashing occurs, all the active nominators backing the validator\nget slashed (also those who do not receive rewards due to oversubscription issues).")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Nominator Election",src:a(55404).Z,width:"612",height:"430"})),(0,i.kt)("h3",{id:"the-election-solution-set"},"The Election Solution Set"),(0,i.kt)("p",null,'Determining 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. Currently,\nnominators 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.'),(0,i.kt)("h2",{id:"receiving-rewards"},"Receiving Rewards"),(0,i.kt)("p",null,"As 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 only\nselected oversubscribed validators, or the validator you are nominating has 100% commission. It is\ngenerally wise to choose as many trustworthy validators as you can (up to\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominations",defaultValue:16,mdxType:"RPC"}),")\n","\nto reduce the risk of none of your nominated validators being elected."),(0,i.kt)("admonition",{title:"Not receiving Staking Rewards?",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"To explore the possible reasons for not receiving staking rewards, check out the followings:"),(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},"The\n",(0,i.kt)("a",{parentName:"li",href:"https://support.polkadot.network/support/solutions/articles/65000181959-staking-faq-s"},"Staking FAQ"),"\non the Support Pages."),(0,i.kt)("li",{parentName:"ul"},"The\n",(0,i.kt)("a",{parentName:"li",href:"https://www.reddit.com/r/Polkadot/comments/10kurje/why_am_i_not_receiving_staking_rewards/"},'"Why am I not receiving staking rewards?"'),"\nReddit article."),(0,i.kt)("li",{parentName:"ul"},"The ",(0,i.kt)("a",{parentName:"li",href:"/docs/learn-staking#why-am-i-not-receiving-rewards"},'"Why am I not receiving staking rewards?"'),"\nsection on the Staking Page."))),(0,i.kt)("p",null,"Rewards are ",(0,i.kt)("em",{parentName:"p"},"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 ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-staking-advanced"},"Simple Payouts")," for more\ninformation and instructions for claiming rewards."),(0,i.kt)("admonition",{title:"Explainer videos on Nominating",type:"note"},(0,i.kt)("p",{parentName:"admonition"},"These concepts have been further explained in the following videos:"),(0,i.kt)("ul",{parentName:"admonition"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=weG_uzdSs1E&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&index=4"},"Why Nominate on Polkadot & Kusama")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.youtube.com/watch?v=K-a4CgVchvU&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&index=9"},"What to Consider when Nominating Validators on Polkadot and Kusama")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://youtu.be/FCXC0CDhyS4"},"Nominating/Staking on Polkadot and Kusama")))),(0,i.kt)("h2",{id:"good-nominator-practices"},"Good Nominator Practices"),(0,i.kt)("h3",{id:"required-minimum-stake"},"Required Minimum Stake"),(0,i.kt)("p",null,"Due to the way the ",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen"},"Phragmen algorithm")," 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."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"min-intention-threshold:")," minimum stake to declare the intention to nominate. This parameter\ncan be updated via on-chain governance, and the most recent and up-to-date version can be found on\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/chainstate"},"chain state")," (select ",(0,i.kt)("strong",{parentName:"p"},"state query > staking >\nminimumNominatorBond"),")")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"min-electing:")," minimum stake among the electing nominators. Since this is almost always the\nsame as \u201cmin-active\u201d, it might not be reported.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"min-active:")," minimum stake among the active nominators. If your stake falls below this dynamic\nthreshold in a given era, you will not receive staking rewards for that era."))),(0,i.kt)("p",null,"Thus, for ",(0,i.kt)("strong",{parentName:"p"},"nominator counters"),", we have:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"count of nominator intentions and max possible nominator intentions\n(unlimited)\n",""),(0,i.kt)("li",{parentName:"ul"},"count of electing nominators, and maximum possible electing nominators\n(",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.maxElectingVoters",defaultValue:22500,mdxType:"RPC"}),")\n",""),(0,i.kt)("li",{parentName:"ul"},"count of active nominators and maximum possible active nominators\n(",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.electionProviderMultiPhase.maxElectingVoters",defaultValue:22500,mdxType:"RPC"}),")\n","")),(0,i.kt)("h3",{id:"avoiding-oversubscribed-validators"},"Avoiding Oversubscribed Validators"),(0,i.kt)("p",null,"Validators can only pay out to a certain number of nominators per era. This is currently set to\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n","\nbut can be modified via governance. If more than\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n",'\nnominators nominate the same validator, it is "oversubscribed", and only the top\n',(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n","\nstaked nominators (ranked by the amount of stake) are paid rewards. Other nominators will receive no\nrewards for that era, although their stake will still be used to calculate entry into the active\nvalidator set."),(0,i.kt)("p",null,"Although it is difficult to determine how many nominators will nominate a given validator in the\nnext era, one can estimate based on the current number of nominators. A validator with only 5\nnominators in this era, for instance, is unlikely to have more than\n",(0,i.kt)(r.Z,{network:"polkadot",path:"consts.staking.maxNominatorRewardedPerValidator",defaultValue:512,mdxType:"RPC"}),"\n","\nin the next era. However, an already-oversubscribed validator with 1000 nominators this era is very\nlikely to be oversubscribed in the next era as well."),(0,i.kt)("p",null,"If you are not nominating with a large number of DOTs, you should try to avoid\n",(0,i.kt)("a",{parentName:"p",href:"/docs/glossary#oversubscribed"},"oversubscribed")," validators. It is not always easy to\ncalculate if the validator selected will be oversubscribed in the next session; one way to avoid\nchoosing potentially oversubscribed validators is to filter out any that are\n",(0,i.kt)("a",{parentName:"p",href:"/docs/glossary#capacity"},"at capacity")," on the Targets page."),(0,i.kt)("p",null,"Finally, if you have a minimal amount of DOTs close to the value of ",(0,i.kt)("inlineCode",{parentName:"p"},"minActiveNomination"),", you may\nneed to stake more DOT to get into the election set. The nominator-to-validator mapping solution\nneeds to be evaluated within a single block duration, and if there are too many nominators, the\nlowest-staked nominations will be dropped from even being considered to be part of the electing set.\nThis ",(0,i.kt)("inlineCode",{parentName:"p"},"minActiveNomination")," value is dynamic and will vary over time. You can read the blog post\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.network/polkadot-staking-an-update/"},'"Polkadot Staking: An Update"')," for more\ndetails."),(0,i.kt)("h3",{id:"active-vs-inactive-nomination"},"Active vs. Inactive Nomination"),(0,i.kt)("p",null,"When you go to the ",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/actions"},"Account actions")," under staking\npage, you should see your bonded accounts and nomination status. If not, you can follow\n",(0,i.kt)("a",{parentName:"p",href:"/docs/maintain-guides-how-to-nominate-polkadot"},"this")," guide to configure it first. Your\nnominations will be effective in the next era; eras are roughly\n24 hours on Polkadot."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Nominations",src:a(44277).Z,width:"2878",height:"766"})),(0,i.kt)("p",null,'Suppose 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.'),(0,i.kt)("p",null,"If 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",(0,i.kt)("a",{parentName:"p",href:"/docs/learn-phragmen#optimizations"},"section on Phragm\xe9n optimization")," for more details."),(0,i.kt)("h3",{id:"minimum-active-nomination-to-receive-staking-rewards"},"Minimum Active Nomination to Receive Staking Rewards"),(0,i.kt)("admonition",{title:"Minimum DOT required to earn staking rewards",type:"info"},(0,i.kt)("p",{parentName:"admonition"},"The minimum DOT required to submit intent to nominate is\n",(0,i.kt)("strong",{parentName:"p"},(0,i.kt)(r.Z,{network:"polkadot",path:"query.staking.minNominatorBond",defaultValue:1e12,filter:"humanReadable",mdxType:"RPC"})),"\n, but the minimum active nomination required to earn staking rewards is dynamic and may be much\nhigher, which can be viewed on\n",(0,i.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/staking/targets"},"Polkadot JS Apps > Network > Staking > Targets page"),".")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Minimum Active Nomination",src:a(95670).Z,width:"1436",height:"166"})),(0,i.kt)("h2",{id:"guides"},"Guides"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-nominate-polkadot"},"Be a Nominator (Polkadot)")," - Guide on\nnominating on the Kusama canary network."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/docs/maintain-guides-how-to-nominate-polkadot"},"Stop Being a Nominator (all networks)")," -\nGuide on stopping nominations and withdrawing tokens.")))}k.isMDXComponent=!0},53325:(t,e,a)=>{"use strict";a.d(e,{Z:()=>n});const n=a.p+"assets/images/nominators_target-d8652ac89f3cbb16528cd68808a32cf0.png"},95670:(t,e,a)=>{"use strict";a.d(e,{Z:()=>n});const n=a.p+"assets/images/min-active-nomination-bfbe67c2714eb5027c6a4f45608c9bc2.png"},55404:(t,e,a)=>{"use strict";a.d(e,{Z:()=>n});const n=a.p+"assets/images/nominator-election-ae25b5db36fa18b56fa58c5370127dd4.png"},44277:(t,e,a)=>{"use strict";a.d(e,{Z:()=>n});const n=a.p+"assets/images/polkadotjs_nominator_account-e0f5d58cd9cce279d6f462cde9f706f4.png"},95520:(t,e,a)=>{"use strict";a.d(e,{Z:()=>n});const n=a.p+"assets/images/validator_stats-57ec40656d6829e2ef791550116824d4.png"},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/ffe9c3c9.1d14524a.js b/assets/js/ffe9c3c9.1d14524a.js new file mode 100644 index 000000000000..e91b26dee7d4 --- /dev/null +++ b/assets/js/ffe9c3c9.1d14524a.js @@ -0,0 +1 @@ +(self.webpackChunk=self.webpackChunk||[]).push([[1529],{47940:(t,e,a)=>{"use strict";a.d(e,{Z:()=>p});var n=a(74165),o=a(15861),l=a(67294),r=a(87152),i=a(17145),s=a(67425);function c(t,e,a){return u.apply(this,arguments)}function u(){return(u=(0,o.Z)((0,n.Z)().mark((function t(e,a,o){var l,s,c,u,k;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:l=void 0,s=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return l="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return l="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return l="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return l="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==l){t.next=18;break}return t.abrupt("return");case 18:return c=new r.U(l),t.next=21,i.G.create({provider:c});case 21:u=t.sent,(k=a.split(".")).forEach((function(t){t in u&&(u=u[t])})),t.t1=k[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return s=u.toString(),t.abrupt("break",35);case 29:return t.next=31,u();case 31:return s=(s=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+k[0]+") in "+a);case 35:return t.abrupt("return",s);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function k(t,e,a,n){switch(e){case"humanReadable":(0,s.HumanReadable)(t,a,n);break;case"precise":(0,s.Precise)(t,a,n);break;case"blocksToDays":(0,s.BlocksToDays)(t,n);break;case"percentage":(0,s.Percentage)(t,n);break;case"permillToPercent":(0,s.PermillToPercent)(t,n);break;case"arrayLength":(0,s.ArrayLength)(t,n);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(t){var e=t.network,a=t.path,r=t.defaultValue,i=t.filter,s=void 0===i?void 0:i,u=(0,l.useState)(""),p=u[0],d=u[1];return e=e.toLowerCase(),(0,l.useEffect)((function(){void 0!==s?k(r.toString(),s,e,d):d(r.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var l=function(){var t=(0,o.Z)((0,n.Z)().mark((function t(){var o;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,c(e,a,d);case 2:if(void 0!==(o=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==s?k(o,s,e,d):d(o);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{l()}catch(i){console.log(i)}}}),[]),p}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}t=parseFloat(t),n((t=Number.isInteger(t/e[a].precision)?t/e[a].precision+" "+e[a].symbol:(t/e[a].precision).toFixed(o)+" "+e[a].symbol).toString())},Precise:function(t,a,n){n(t=(t=parseFloat(t))/e[a].precision+" "+e[a].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},PermillToPercent:function(t,e){e((t/=1e4).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},64204:(t,e,a)=>{"use strict";a.r(e),a.d(e,{assets:()=>k,contentTitle:()=>c,default:()=>m,frontMatter:()=>s,metadata:()=>u,toc:()=>p});var n=a(87462),o=a(63366),l=(a(67294),a(3905)),r=a(47940),i=["components"],s={id:"learn-DOT",title:"DOT",sidebar_label:"DOT",description:"Tokenomics of Polkadot's Native Token DOT.",keywords:["token","DOT","what are the uses of DOT","KSM","faucet"],slug:"../learn-DOT"},c=void 0,u={unversionedId:"learn/learn-DOT",id:"learn/learn-DOT",title:"DOT",description:"Tokenomics of Polkadot's Native Token DOT.",source:"@site/../docs/learn/learn-DOT.md",sourceDirName:"learn",slug:"/learn-DOT",permalink:"/docs/learn-DOT",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-DOT.md",tags:[],version:"current",lastUpdatedBy:"Radha",lastUpdatedAt:1695991329,formattedLastUpdatedAt:"Sep 29, 2023",frontMatter:{id:"learn-DOT",title:"DOT",sidebar_label:"DOT",description:"Tokenomics of Polkadot's Native Token DOT.",keywords:["token","DOT","what are the uses of DOT","KSM","faucet"],slug:"../learn-DOT"},sidebar:"docs",previous:{title:"Asset Hub",permalink:"/docs/learn-assets"},next:{title:"Token Inflation",permalink:"/docs/learn-inflation"}},k={},p=[{value:"What is DOT?",id:"what-is-dot",level:2},{value:"The Planck Unit",id:"the-planck-unit",level:3},{value:"Polkadot",id:"polkadot",level:3},{value:"Kusama",id:"kusama",level:3},{value:"What are the uses of DOT?",id:"what-are-the-uses-of-dot",level:2},{value:"DOT for Governance",id:"dot-for-governance",level:3},{value:"DOT for Consensus",id:"dot-for-consensus",level:3},{value:"DOT for Parachain Slot Acquisition",id:"dot-for-parachain-slot-acquisition",level:3},{value:"Calculating When Vesting DOT Will Be Available",id:"calculating-when-vesting-dot-will-be-available",level:4},{value:"Token Issuance",id:"token-issuance",level:3},{value:"Total Issuance",id:"total-issuance",level:4},{value:"Inactive Issuance",id:"inactive-issuance",level:4},{value:"Active Issuance",id:"active-issuance",level:4},{value:"Obtaining Testnet Tokens",id:"obtaining-testnet-tokens",level:2},{value:"Getting Tokens on the Westend Testnet",id:"getting-tokens-on-the-westend-testnet",level:3},{value:"Getting Tokens on the Rococo Testnet",id:"getting-tokens-on-the-rococo-testnet",level:3},{value:"Getting Tokens on the Wococo Testnet",id:"getting-tokens-on-the-wococo-testnet",level:3},{value:"Faucets support",id:"faucets-support",level:3},{value:"Kusama Tokens",id:"kusama-tokens",level:2},{value:"Polkadot Mainnet DOT",id:"polkadot-mainnet-dot",level:2}],d={toc:p},h="wrapper";function m(t){var e=t.components,a=(0,o.Z)(t,i);return(0,l.kt)(h,(0,n.Z)({},d,a,{components:e,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"what-is-dot"},"What is DOT?"),(0,l.kt)("p",null,"DOT is the native token of the Polkadot network in a similar way that BTC is the native token of\nBitcoin or Ether is the native token of the Ethereum blockchain."),(0,l.kt)("h3",{id:"the-planck-unit"},"The Planck Unit"),(0,l.kt)("p",null,"The smallest unit for the account balance on Substrate based blockchains (Polkadot, Kusama, etc.) is\nPlanck (a reference to ",(0,l.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Planck_length"},"Planck Length"),", the smallest\npossible distance in the physical Universe). You can compare DOT's Planck to BTC's Satoshi or ETH's\nWei. Polkadot's native token DOT equals to 10",(0,l.kt)("sup",null,"10")," Planck and Kusama's native token KSM\nequals to 10",(0,l.kt)("sup",null,"12")," Planck."),(0,l.kt)("h3",{id:"polkadot"},"Polkadot"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Unit"),(0,l.kt)("th",{parentName:"tr",align:null},"Decimal Places"),(0,l.kt)("th",{parentName:"tr",align:null},"Conversion to Planck"),(0,l.kt)("th",{parentName:"tr",align:null},"Conversion to DOT"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0"),(0,l.kt)("td",{parentName:"tr",align:null},"1 Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.0000000001 DOT")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Microdot (uDOT)"),(0,l.kt)("td",{parentName:"tr",align:null},"4"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"4")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.0000010000 DOT")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Millidot (mDOT)"),(0,l.kt)("td",{parentName:"tr",align:null},"7"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"7")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.0010000000 DOT")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Dot (DOT)"),(0,l.kt)("td",{parentName:"tr",align:null},"10"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"10")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"1.0000000000 DOT")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Million (MDOT)"),(0,l.kt)("td",{parentName:"tr",align:null},"16"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"16")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"1,000,000.00 DOT")))),(0,l.kt)("admonition",{title:"DOT was redenominated at block #1_248_328",type:"note"},(0,l.kt)("p",{parentName:"admonition"},"DOT was originally equal to 10",(0,l.kt)("sup",null,"12"),' Planck just like Kusama (which is referred to as "DOT\n(old)"), but went through a process of ',(0,l.kt)("a",{parentName:"p",href:"/docs/learn-redenomination"},"redenomination")," which increased\nDOT's supply by 100x. As a consequence, 1 DOT now equals to 10",(0,l.kt)("sup",null,"10")," Planck.")),(0,l.kt)("h3",{id:"kusama"},"Kusama"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Unit"),(0,l.kt)("th",{parentName:"tr",align:null},"Decimal Places"),(0,l.kt)("th",{parentName:"tr",align:null},"Conversion to Planck"),(0,l.kt)("th",{parentName:"tr",align:null},"Conversion to KSM"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0"),(0,l.kt)("td",{parentName:"tr",align:null},"1 Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.000000000001 KSM")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Point"),(0,l.kt)("td",{parentName:"tr",align:null},"3"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"3")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.000000001000 KSM")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"MicroKSM (uKSM)"),(0,l.kt)("td",{parentName:"tr",align:null},"6"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"6")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.000001000000 KSM")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"MilliKSM (mKSM)"),(0,l.kt)("td",{parentName:"tr",align:null},"9"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"9")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.001000000000 KSM")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"KSM"),(0,l.kt)("td",{parentName:"tr",align:null},"12"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"12")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"1.000000000000 KSM")))),(0,l.kt)("h2",{id:"what-are-the-uses-of-dot"},"What are the uses of DOT?"),(0,l.kt)("p",null,"DOT serves three key functions in Polkadot:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"to be used for governance of the network,"),(0,l.kt)("li",{parentName:"ul"},"to be staked for the operation of the network,"),(0,l.kt)("li",{parentName:"ul"},"to be bonded to connect a chain to Polkadot as a parachain.")),(0,l.kt)("p",null,"DOT can also serve ancillary functions by being a transferrable token. For example, DOT stored in\nthe Treasury can be sent to teams working on relevant projects for the Polkadot network."),(0,l.kt)("admonition",{title:"Explainer video on token utility",type:"note"},(0,l.kt)("p",{parentName:"admonition"},"These concepts have been further explained in the video\n",(0,l.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=POfFgrMfkTo&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&index=7"},"Usage of DOT and KSM on Polkadot and Kusama"),".")),(0,l.kt)("h3",{id:"dot-for-governance"},"DOT for Governance"),(0,l.kt)("p",null,"The first function of DOT is to entitle holders to control the governance of the platform. Some\nfunctions that are included under the governance mechanism include determining the fees of the\nnetwork, the addition or removal of parachains, and exceptional events such as upgrades and fixes to\nthe Polkadot platform."),(0,l.kt)("p",null,"Polkadot will enable any holder of DOT to participate in governance. For details on how holders can\nparticipate in governance, as well as their rights and responsibilities, see the\n",(0,l.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov"},"governance page"),"."),(0,l.kt)("h3",{id:"dot-for-consensus"},"DOT for Consensus"),(0,l.kt)("p",null,"DOT will be used to facilitate the consensus mechanism that underpins Polkadot. For the platform to\nfunction and allow for valid transactions to be carried out across parachains, Polkadot will rely on\nholders of DOT to play active roles. Participants will put their DOT at risk (via staking) to\nperform these functions. The staking of DOT acts as a disincentive for malicious participants who\nwill be punished by the network by getting their DOT slashed. The DOT required to participate in the\nnetwork will vary depending on the activity that is being performed, the duration the DOT will be\nstaked for, and the total number of DOT staked. For more information about staking on Polkadot visit\n",(0,l.kt)("a",{parentName:"p",href:"/docs/learn-staking"},"the dedicated staking page"),"."),(0,l.kt)("h3",{id:"dot-for-parachain-slot-acquisition"},"DOT for Parachain Slot Acquisition"),(0,l.kt)("p",null,"DOT will have the ability to be locked for a duration in order to secure a parachain slot in the\nnetwork. The DOT will be reserved during the slot lease and will be released back to the account\nthat reserved them after the duration of the lease has elapsed and the parachain is removed. You can\nlearn more about this aspect by reading about the ",(0,l.kt)("a",{parentName:"p",href:"/docs/learn-auction"},"auctions")," that govern parachain\nslots."),(0,l.kt)("h4",{id:"calculating-when-vesting-dot-will-be-available"},"Calculating When Vesting DOT Will Be Available"),(0,l.kt)("p",null,"Generally, you should be able to see from the ",(0,l.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/accounts"},"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).'),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},"Navigate to the\n",(0,l.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/chainstate"},"Chain State")," page on\nPolkadot-JS."),(0,l.kt)("li",{parentName:"ol"},"Query chain state for ",(0,l.kt)("inlineCode",{parentName:"li"},"vesting.vesting(ACCOUNT_ID)")),(0,l.kt)("li",{parentName:"ol"},"Note the ",(0,l.kt)("inlineCode",{parentName:"li"},"startingBlock")," where the unlock starts, and how much DOT is unlocked per block\n(",(0,l.kt)("inlineCode",{parentName:"li"},"perBlock"),")."),(0,l.kt)("li",{parentName:"ol"},'You will have to calculate the result into \u201chuman time". To do this, remember that there are\napproximately 14\u2019400 blocks per day, and you can see what the latest block is shown on the\n',(0,l.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/explorer"},"Explorer")," page.")),(0,l.kt)("h3",{id:"token-issuance"},"Token Issuance"),(0,l.kt)("h4",{id:"total-issuance"},"Total Issuance"),(0,l.kt)("p",null,"It is the total number of token units in existence on the network."),(0,l.kt)("admonition",{title:"On-chain data for reference",type:"info"},(0,l.kt)("p",{parentName:"admonition"},"The total issuance is\n",(0,l.kt)(r.Z,{network:"polkadot",path:"query.balances.totalIssuance",defaultValue:"13557639805348170350",filter:"humanReadable",mdxType:"RPC"}),".\n","\nin the era\n",(0,l.kt)(r.Z,{network:"polkadot",path:"query.staking.currentEra",defaultValue:"1200",mdxType:"RPC"}),".\n","")),(0,l.kt)("h4",{id:"inactive-issuance"},"Inactive Issuance"),(0,l.kt)("p",null,"It is the total units of outstanding deactivated balance on the network that cannot be used for\nparticipation in governance. This comprises tokens locked away in crowdloans and nomination pools."),(0,l.kt)("admonition",{title:"On-chain data for reference",type:"info"},(0,l.kt)("p",{parentName:"admonition"},"The inactive issuance is\n",(0,l.kt)(r.Z,{network:"polkadot",path:"query.balances.inactiveIssuance",defaultValue:"1784854324418488473",filter:"humanReadable",mdxType:"RPC"}),".\n","\nin the era\n",(0,l.kt)(r.Z,{network:"polkadot",path:"query.staking.currentEra",defaultValue:"1200",mdxType:"RPC"}),".\n","")),(0,l.kt)("h4",{id:"active-issuance"},"Active Issuance"),(0,l.kt)("p",null,"Active issuance = Total issuance - Inactive issuance"),(0,l.kt)("p",null,"All the tokens under active issuance are can be used to participate in the governance on-chain."),(0,l.kt)("h2",{id:"obtaining-testnet-tokens"},"Obtaining Testnet Tokens"),(0,l.kt)("p",null,"DOT are required to make transactions on the Polkadot network. Tokens on Polkadot's Testnets like\nWestend and Rococo do not have any value besides allowing you to experiment with the features on the\nnetwork."),(0,l.kt)("h3",{id:"getting-tokens-on-the-westend-testnet"},"Getting Tokens on the Westend Testnet"),(0,l.kt)("p",null,"Polkadot's testnet is called ",(0,l.kt)("a",{parentName:"p",href:"/docs/maintain-networks#westend-test-network"},"Westend")," and\nyou can obtain its native tokens (called Westies!) by posting ",(0,l.kt)("inlineCode",{parentName:"p"},"!drip ")," in the\nMatrix chatroom ",(0,l.kt)("a",{parentName:"p",href:"https://matrix.to/#/#westend_faucet:matrix.org"},"#westend_faucet:matrix.org"),". Your\naccount will be credited with 1 WND by default. You can also specify to get more tokens by\n",(0,l.kt)("inlineCode",{parentName:"p"},"!drip X"),", where X is the number of tokens."),(0,l.kt)("p",null,"Another way is to use our web-based\n",(0,l.kt)("a",{parentName:"p",href:"https://paritytech.github.io/polkadot-testnet-faucet/westend"},"Westend faucet"),"."),(0,l.kt)("p",null,"You can also earn WNDs as rewards by ",(0,l.kt)("a",{parentName:"p",href:"/docs/learn-validator"},"becoming a validator")," on Westend network.\nWatch the video below on how to get started on Westend."),(0,l.kt)("p",null,(0,l.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=0ji0ccZyb3k"},(0,l.kt)("img",{parentName:"a",src:"https://img.youtube.com/vi/0ji0ccZyb3k/0.jpg",alt:"Testing Polkadot features on Westend"}))),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Unit"),(0,l.kt)("th",{parentName:"tr",align:null},"Decimal Places"),(0,l.kt)("th",{parentName:"tr",align:null},"Conversion to Planck"),(0,l.kt)("th",{parentName:"tr",align:null},"Conversion to WND"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0"),(0,l.kt)("td",{parentName:"tr",align:null},"1 Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.000000000001 WND")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Point"),(0,l.kt)("td",{parentName:"tr",align:null},"3"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"3")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.000000001000 WND")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"MicroWND (uWND)"),(0,l.kt)("td",{parentName:"tr",align:null},"6"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"6")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.000001000000 WND")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"MilliWND (mWND)"),(0,l.kt)("td",{parentName:"tr",align:null},"9"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"9")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.001000000000 WND")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"WND"),(0,l.kt)("td",{parentName:"tr",align:null},"12"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"12")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"1.000000000000 WND")))),(0,l.kt)("h3",{id:"getting-tokens-on-the-rococo-testnet"},"Getting Tokens on the Rococo Testnet"),(0,l.kt)("p",null,"Rococo is a parachain testnet. Tokens are given directly to teams working on parachains or exploring\nthe ",(0,l.kt)("a",{parentName:"p",href:"/docs/learn-xcm"},"cross consensus")," message-passing aspects of this testnet. General users can\nobtain ROC by posting ",(0,l.kt)("inlineCode",{parentName:"p"},"!drip ")," in the Matrix chatroom\n",(0,l.kt)("a",{parentName:"p",href:"https://matrix.to/#/#rococo-faucet:matrix.org"},"#rococo-faucet:matrix.org")," or through the web-based\n",(0,l.kt)("a",{parentName:"p",href:"https://paritytech.github.io/polkadot-testnet-faucet/"},"Rococo faucet"),". Learn more about Rococo on\nits ",(0,l.kt)("a",{parentName:"p",href:"/docs/build-pdk##testing-a-parachains:-rococo-testnet"},"dedicated wiki section"),"."),(0,l.kt)("h3",{id:"getting-tokens-on-the-wococo-testnet"},"Getting Tokens on the Wococo Testnet"),(0,l.kt)("p",null,"Wococo is a bridge testnet. General users can obtain WOOK by posting ",(0,l.kt)("inlineCode",{parentName:"p"},"!drip ")," in the\nMatrix chatroom ",(0,l.kt)("a",{parentName:"p",href:"https://matrix.to/#/#wococo-faucet:matrix.org"},"#wococo-faucet:matrix.org"),"."),(0,l.kt)("h3",{id:"faucets-support"},"Faucets support"),(0,l.kt)("p",null,"If you require help with using faucets, or wish to report an issue, there is a support chat\n",(0,l.kt)("a",{parentName:"p",href:"https://matrix.to/#/#faucets-support:matrix.org"},"#faucets-support:matrix.org"),", or you can\n",(0,l.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-testnet-faucet/issues/new/choose"},"create an issue")," directly\nin the faucets repo"),(0,l.kt)("h2",{id:"kusama-tokens"},"Kusama Tokens"),(0,l.kt)("p",null,"Unlike testnet DOT, Kusama tokens are not freely given away. Kusama tokens are available via the\n",(0,l.kt)("a",{parentName:"p",href:"https://claim.kusama.network/"},"claims process")," (if you had DOT at the time of Kusama genesis) or\nthrough the ",(0,l.kt)("a",{parentName:"p",href:"/docs/learn-treasury"},"Treasury"),". Alternatively, they can be obtained on the open market."),(0,l.kt)("h2",{id:"polkadot-mainnet-dot"},"Polkadot Mainnet DOT"),(0,l.kt)("p",null,"Polkadot Mainnet DOT are not freely given away. If you purchased DOT in the original 2017 offering,\nyou may claim them via the ",(0,l.kt)("a",{parentName:"p",href:"https://claims.polkadot.network/"},"Polkadot claims process"),".\nAlternatively, they are available on the open market."))}m.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/ffe9c3c9.aabc98a5.js b/assets/js/ffe9c3c9.aabc98a5.js deleted file mode 100644 index df3deeb19bb6..000000000000 --- a/assets/js/ffe9c3c9.aabc98a5.js +++ /dev/null @@ -1 +0,0 @@ -(self.webpackChunk=self.webpackChunk||[]).push([[1529],{47940:(t,e,a)=>{"use strict";a.d(e,{Z:()=>p});var n=a(74165),o=a(15861),l=a(67294),r=a(87152),i=a(17145),s=a(67425);function c(t,e,a){return u.apply(this,arguments)}function u(){return(u=(0,o.Z)((0,n.Z)().mark((function t(e,a,o){var l,s,c,u,k;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:l=void 0,s=void 0,t.t0=e,t.next="polkadot"===t.t0?5:"kusama"===t.t0?7:"statemine"===t.t0?9:"statemint"===t.t0?11:13;break;case 5:return l="wss://rpc.polkadot.io",t.abrupt("break",14);case 7:return l="wss://kusama-rpc.polkadot.io/",t.abrupt("break",14);case 9:return l="wss://statemine-rpc.polkadot.io/",t.abrupt("break",14);case 11:return l="wss://statemint-rpc.polkadot.io/",t.abrupt("break",14);case 13:console.log("Unknown socket url provided, no connection made.");case 14:if(void 0!==l){t.next=18;break}return t.abrupt("return");case 18:return c=new r.U(l),t.next=21,i.G.create({provider:c});case 21:u=t.sent,(k=a.split(".")).forEach((function(t){t in u&&(u=u[t])})),t.t1=k[0],t.next="consts"===t.t1?27:"query"===t.t1?29:34;break;case 27:return s=u.toString(),t.abrupt("break",35);case 29:return t.next=31,u();case 31:return s=(s=t.sent).toString(),t.abrupt("break",35);case 34:console.log("Unknown path prefix ("+k[0]+") in "+a);case 35:return t.abrupt("return",s);case 36:case"end":return t.stop()}}),t)})))).apply(this,arguments)}function k(t,e,a,n){switch(e){case"humanReadable":(0,s.HumanReadable)(t,a,n);break;case"precise":(0,s.Precise)(t,a,n);break;case"blocksToDays":(0,s.BlocksToDays)(t,n);break;case"percentage":(0,s.Percentage)(t,n);break;case"arrayLength":(0,s.ArrayLength)(t,n);break;default:return void console.log("Ignoring unknown filter type")}}const p=function(t){var e=t.network,a=t.path,r=t.defaultValue,i=t.filter,s=void 0===i?void 0:i,u=(0,l.useState)(""),p=u[0],d=u[1];return e=e.toLowerCase(),(0,l.useEffect)((function(){void 0!==s?k(r.toString(),s,e,d):d(r.toString());var t=void 0;switch(e){case"polkadot":t="wss://rpc.polkadot.io";break;case"kusama":t="wss://kusama-rpc.polkadot.io/";break;case"statemine":t="wss://statemine-rpc.polkadot.io/";break;case"statemint":t="wss://statemint-rpc.polkadot.io/";break;default:console.log("Unknown network provided, "+e)}if(void 0===t)console.log("Failed to connect to a valid websocket, applying default");else{var l=function(){var t=(0,o.Z)((0,n.Z)().mark((function t(){var o;return(0,n.Z)().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,c(e,a,d);case 2:if(void 0!==(o=t.sent)){t.next=7;break}return t.abrupt("return");case 7:void 0!==s?k(o,s,e,d):d(o);case 8:case"end":return t.stop()}}),t)})));return function(){return t.apply(this,arguments)}}();try{l()}catch(i){console.log(i)}}}),[]),p}},67425:t=>{var e={polkadot:{precision:1e10,symbol:"DOT"},kusama:{precision:1e12,symbol:"KSM"},statemint:{precision:1e10,symbol:"DOT"},statemine:{precision:1e12,symbol:"KSM"}};t.exports={HumanReadable:function(t,a,n){var o=void 0;if("polkadot"===a||"statemint"===a)o=3;else{if("kusama"!==a&&"statemine"!==a)return void console.log("Unknown network type found when attempting to apply 'Human Readable' filter");o=6}t=parseFloat(t),n((t=Number.isInteger(t/e[a].precision)?t/e[a].precision+" "+e[a].symbol:(t/e[a].precision).toFixed(o)+" "+e[a].symbol).toString())},Precise:function(t,a,n){n(t=(t=parseFloat(t))/e[a].precision+" "+e[a].symbol)},BlocksToDays:function(t,e){e((t=6*t/86400).toString())},Percentage:function(t,e){e((t/=1e7).toString())},ArrayLength:function(t,e){e((t=t.split(",").length).toString())}}},64204:(t,e,a)=>{"use strict";a.r(e),a.d(e,{assets:()=>k,contentTitle:()=>c,default:()=>m,frontMatter:()=>s,metadata:()=>u,toc:()=>p});var n=a(87462),o=a(63366),l=(a(67294),a(3905)),r=a(47940),i=["components"],s={id:"learn-DOT",title:"DOT",sidebar_label:"DOT",description:"Tokenomics of Polkadot's Native Token DOT.",keywords:["token","DOT","what are the uses of DOT","KSM","faucet"],slug:"../learn-DOT"},c=void 0,u={unversionedId:"learn/learn-DOT",id:"learn/learn-DOT",title:"DOT",description:"Tokenomics of Polkadot's Native Token DOT.",source:"@site/../docs/learn/learn-DOT.md",sourceDirName:"learn",slug:"/learn-DOT",permalink:"/docs/learn-DOT",draft:!1,editUrl:"https://github.com/w3f/polkadot-wiki/edit/master/docs/learn/learn-DOT.md",tags:[],version:"current",lastUpdatedBy:"Radha",lastUpdatedAt:1695991329,formattedLastUpdatedAt:"Sep 29, 2023",frontMatter:{id:"learn-DOT",title:"DOT",sidebar_label:"DOT",description:"Tokenomics of Polkadot's Native Token DOT.",keywords:["token","DOT","what are the uses of DOT","KSM","faucet"],slug:"../learn-DOT"},sidebar:"docs",previous:{title:"Asset Hub",permalink:"/docs/learn-assets"},next:{title:"Token Inflation",permalink:"/docs/learn-inflation"}},k={},p=[{value:"What is DOT?",id:"what-is-dot",level:2},{value:"The Planck Unit",id:"the-planck-unit",level:3},{value:"Polkadot",id:"polkadot",level:3},{value:"Kusama",id:"kusama",level:3},{value:"What are the uses of DOT?",id:"what-are-the-uses-of-dot",level:2},{value:"DOT for Governance",id:"dot-for-governance",level:3},{value:"DOT for Consensus",id:"dot-for-consensus",level:3},{value:"DOT for Parachain Slot Acquisition",id:"dot-for-parachain-slot-acquisition",level:3},{value:"Calculating When Vesting DOT Will Be Available",id:"calculating-when-vesting-dot-will-be-available",level:4},{value:"Token Issuance",id:"token-issuance",level:3},{value:"Total Issuance",id:"total-issuance",level:4},{value:"Inactive Issuance",id:"inactive-issuance",level:4},{value:"Active Issuance",id:"active-issuance",level:4},{value:"Obtaining Testnet Tokens",id:"obtaining-testnet-tokens",level:2},{value:"Getting Tokens on the Westend Testnet",id:"getting-tokens-on-the-westend-testnet",level:3},{value:"Getting Tokens on the Rococo Testnet",id:"getting-tokens-on-the-rococo-testnet",level:3},{value:"Getting Tokens on the Wococo Testnet",id:"getting-tokens-on-the-wococo-testnet",level:3},{value:"Faucets support",id:"faucets-support",level:3},{value:"Kusama Tokens",id:"kusama-tokens",level:2},{value:"Polkadot Mainnet DOT",id:"polkadot-mainnet-dot",level:2}],d={toc:p},h="wrapper";function m(t){var e=t.components,a=(0,o.Z)(t,i);return(0,l.kt)(h,(0,n.Z)({},d,a,{components:e,mdxType:"MDXLayout"}),(0,l.kt)("h2",{id:"what-is-dot"},"What is DOT?"),(0,l.kt)("p",null,"DOT is the native token of the Polkadot network in a similar way that BTC is the native token of\nBitcoin or Ether is the native token of the Ethereum blockchain."),(0,l.kt)("h3",{id:"the-planck-unit"},"The Planck Unit"),(0,l.kt)("p",null,"The smallest unit for the account balance on Substrate based blockchains (Polkadot, Kusama, etc.) is\nPlanck (a reference to ",(0,l.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Planck_length"},"Planck Length"),", the smallest\npossible distance in the physical Universe). You can compare DOT's Planck to BTC's Satoshi or ETH's\nWei. Polkadot's native token DOT equals to 10",(0,l.kt)("sup",null,"10")," Planck and Kusama's native token KSM\nequals to 10",(0,l.kt)("sup",null,"12")," Planck."),(0,l.kt)("h3",{id:"polkadot"},"Polkadot"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Unit"),(0,l.kt)("th",{parentName:"tr",align:null},"Decimal Places"),(0,l.kt)("th",{parentName:"tr",align:null},"Conversion to Planck"),(0,l.kt)("th",{parentName:"tr",align:null},"Conversion to DOT"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0"),(0,l.kt)("td",{parentName:"tr",align:null},"1 Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.0000000001 DOT")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Microdot (uDOT)"),(0,l.kt)("td",{parentName:"tr",align:null},"4"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"4")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.0000010000 DOT")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Millidot (mDOT)"),(0,l.kt)("td",{parentName:"tr",align:null},"7"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"7")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.0010000000 DOT")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Dot (DOT)"),(0,l.kt)("td",{parentName:"tr",align:null},"10"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"10")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"1.0000000000 DOT")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Million (MDOT)"),(0,l.kt)("td",{parentName:"tr",align:null},"16"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"16")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"1,000,000.00 DOT")))),(0,l.kt)("admonition",{title:"DOT was redenominated at block #1_248_328",type:"note"},(0,l.kt)("p",{parentName:"admonition"},"DOT was originally equal to 10",(0,l.kt)("sup",null,"12"),' Planck just like Kusama (which is referred to as "DOT\n(old)"), but went through a process of ',(0,l.kt)("a",{parentName:"p",href:"/docs/learn-redenomination"},"redenomination")," which increased\nDOT's supply by 100x. As a consequence, 1 DOT now equals to 10",(0,l.kt)("sup",null,"10")," Planck.")),(0,l.kt)("h3",{id:"kusama"},"Kusama"),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Unit"),(0,l.kt)("th",{parentName:"tr",align:null},"Decimal Places"),(0,l.kt)("th",{parentName:"tr",align:null},"Conversion to Planck"),(0,l.kt)("th",{parentName:"tr",align:null},"Conversion to KSM"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0"),(0,l.kt)("td",{parentName:"tr",align:null},"1 Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.000000000001 KSM")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Point"),(0,l.kt)("td",{parentName:"tr",align:null},"3"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"3")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.000000001000 KSM")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"MicroKSM (uKSM)"),(0,l.kt)("td",{parentName:"tr",align:null},"6"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"6")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.000001000000 KSM")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"MilliKSM (mKSM)"),(0,l.kt)("td",{parentName:"tr",align:null},"9"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"9")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.001000000000 KSM")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"KSM"),(0,l.kt)("td",{parentName:"tr",align:null},"12"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"12")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"1.000000000000 KSM")))),(0,l.kt)("h2",{id:"what-are-the-uses-of-dot"},"What are the uses of DOT?"),(0,l.kt)("p",null,"DOT serves three key functions in Polkadot:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"to be used for governance of the network,"),(0,l.kt)("li",{parentName:"ul"},"to be staked for the operation of the network,"),(0,l.kt)("li",{parentName:"ul"},"to be bonded to connect a chain to Polkadot as a parachain.")),(0,l.kt)("p",null,"DOT can also serve ancillary functions by being a transferrable token. For example, DOT stored in\nthe Treasury can be sent to teams working on relevant projects for the Polkadot network."),(0,l.kt)("admonition",{title:"Explainer video on token utility",type:"note"},(0,l.kt)("p",{parentName:"admonition"},"These concepts have been further explained in the video\n",(0,l.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=POfFgrMfkTo&list=PLOyWqupZ-WGuAuS00rK-pebTMAOxW41W8&index=7"},"Usage of DOT and KSM on Polkadot and Kusama"),".")),(0,l.kt)("h3",{id:"dot-for-governance"},"DOT for Governance"),(0,l.kt)("p",null,"The first function of DOT is to entitle holders to control the governance of the platform. Some\nfunctions that are included under the governance mechanism include determining the fees of the\nnetwork, the addition or removal of parachains, and exceptional events such as upgrades and fixes to\nthe Polkadot platform."),(0,l.kt)("p",null,"Polkadot will enable any holder of DOT to participate in governance. For details on how holders can\nparticipate in governance, as well as their rights and responsibilities, see the\n",(0,l.kt)("a",{parentName:"p",href:"/docs/learn-polkadot-opengov"},"governance page"),"."),(0,l.kt)("h3",{id:"dot-for-consensus"},"DOT for Consensus"),(0,l.kt)("p",null,"DOT will be used to facilitate the consensus mechanism that underpins Polkadot. For the platform to\nfunction and allow for valid transactions to be carried out across parachains, Polkadot will rely on\nholders of DOT to play active roles. Participants will put their DOT at risk (via staking) to\nperform these functions. The staking of DOT acts as a disincentive for malicious participants who\nwill be punished by the network by getting their DOT slashed. The DOT required to participate in the\nnetwork will vary depending on the activity that is being performed, the duration the DOT will be\nstaked for, and the total number of DOT staked. For more information about staking on Polkadot visit\n",(0,l.kt)("a",{parentName:"p",href:"/docs/learn-staking"},"the dedicated staking page"),"."),(0,l.kt)("h3",{id:"dot-for-parachain-slot-acquisition"},"DOT for Parachain Slot Acquisition"),(0,l.kt)("p",null,"DOT will have the ability to be locked for a duration in order to secure a parachain slot in the\nnetwork. The DOT will be reserved during the slot lease and will be released back to the account\nthat reserved them after the duration of the lease has elapsed and the parachain is removed. You can\nlearn more about this aspect by reading about the ",(0,l.kt)("a",{parentName:"p",href:"/docs/learn-auction"},"auctions")," that govern parachain\nslots."),(0,l.kt)("h4",{id:"calculating-when-vesting-dot-will-be-available"},"Calculating When Vesting DOT Will Be Available"),(0,l.kt)("p",null,"Generally, you should be able to see from the ",(0,l.kt)("a",{parentName:"p",href:"https://polkadot.js.org/apps/#/accounts"},"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).'),(0,l.kt)("ol",null,(0,l.kt)("li",{parentName:"ol"},"Navigate to the\n",(0,l.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/chainstate"},"Chain State")," page on\nPolkadot-JS."),(0,l.kt)("li",{parentName:"ol"},"Query chain state for ",(0,l.kt)("inlineCode",{parentName:"li"},"vesting.vesting(ACCOUNT_ID)")),(0,l.kt)("li",{parentName:"ol"},"Note the ",(0,l.kt)("inlineCode",{parentName:"li"},"startingBlock")," where the unlock starts, and how much DOT is unlocked per block\n(",(0,l.kt)("inlineCode",{parentName:"li"},"perBlock"),")."),(0,l.kt)("li",{parentName:"ol"},'You will have to calculate the result into \u201chuman time". To do this, remember that there are\napproximately 14\u2019400 blocks per day, and you can see what the latest block is shown on the\n',(0,l.kt)("a",{parentName:"li",href:"https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.polkadot.io#/explorer"},"Explorer")," page.")),(0,l.kt)("h3",{id:"token-issuance"},"Token Issuance"),(0,l.kt)("h4",{id:"total-issuance"},"Total Issuance"),(0,l.kt)("p",null,"It is the total number of token units in existence on the network."),(0,l.kt)("admonition",{title:"On-chain data for reference",type:"info"},(0,l.kt)("p",{parentName:"admonition"},"The total issuance is\n",(0,l.kt)(r.Z,{network:"polkadot",path:"query.balances.totalIssuance",defaultValue:"13557639805348170350",filter:"humanReadable",mdxType:"RPC"}),".\n","\nin the era\n",(0,l.kt)(r.Z,{network:"polkadot",path:"query.staking.currentEra",defaultValue:"1200",mdxType:"RPC"}),".\n","")),(0,l.kt)("h4",{id:"inactive-issuance"},"Inactive Issuance"),(0,l.kt)("p",null,"It is the total units of outstanding deactivated balance on the network that cannot be used for\nparticipation in governance. This comprises tokens locked away in crowdloans and nomination pools."),(0,l.kt)("admonition",{title:"On-chain data for reference",type:"info"},(0,l.kt)("p",{parentName:"admonition"},"The inactive issuance is\n",(0,l.kt)(r.Z,{network:"polkadot",path:"query.balances.inactiveIssuance",defaultValue:"1784854324418488473",filter:"humanReadable",mdxType:"RPC"}),".\n","\nin the era\n",(0,l.kt)(r.Z,{network:"polkadot",path:"query.staking.currentEra",defaultValue:"1200",mdxType:"RPC"}),".\n","")),(0,l.kt)("h4",{id:"active-issuance"},"Active Issuance"),(0,l.kt)("p",null,"Active issuance = Total issuance - Inactive issuance"),(0,l.kt)("p",null,"All the tokens under active issuance are can be used to participate in the governance on-chain."),(0,l.kt)("h2",{id:"obtaining-testnet-tokens"},"Obtaining Testnet Tokens"),(0,l.kt)("p",null,"DOT are required to make transactions on the Polkadot network. Tokens on Polkadot's Testnets like\nWestend and Rococo do not have any value besides allowing you to experiment with the features on the\nnetwork."),(0,l.kt)("h3",{id:"getting-tokens-on-the-westend-testnet"},"Getting Tokens on the Westend Testnet"),(0,l.kt)("p",null,"Polkadot's testnet is called ",(0,l.kt)("a",{parentName:"p",href:"/docs/maintain-networks#westend-test-network"},"Westend")," and\nyou can obtain its native tokens (called Westies!) by posting ",(0,l.kt)("inlineCode",{parentName:"p"},"!drip ")," in the\nMatrix chatroom ",(0,l.kt)("a",{parentName:"p",href:"https://matrix.to/#/#westend_faucet:matrix.org"},"#westend_faucet:matrix.org"),". Your\naccount will be credited with 1 WND by default. You can also specify to get more tokens by\n",(0,l.kt)("inlineCode",{parentName:"p"},"!drip X"),", where X is the number of tokens."),(0,l.kt)("p",null,"Another way is to use our web-based\n",(0,l.kt)("a",{parentName:"p",href:"https://paritytech.github.io/polkadot-testnet-faucet/westend"},"Westend faucet"),"."),(0,l.kt)("p",null,"You can also earn WNDs as rewards by ",(0,l.kt)("a",{parentName:"p",href:"/docs/learn-validator"},"becoming a validator")," on Westend network.\nWatch the video below on how to get started on Westend."),(0,l.kt)("p",null,(0,l.kt)("a",{parentName:"p",href:"https://www.youtube.com/watch?v=0ji0ccZyb3k"},(0,l.kt)("img",{parentName:"a",src:"https://img.youtube.com/vi/0ji0ccZyb3k/0.jpg",alt:"Testing Polkadot features on Westend"}))),(0,l.kt)("table",null,(0,l.kt)("thead",{parentName:"table"},(0,l.kt)("tr",{parentName:"thead"},(0,l.kt)("th",{parentName:"tr",align:null},"Unit"),(0,l.kt)("th",{parentName:"tr",align:null},"Decimal Places"),(0,l.kt)("th",{parentName:"tr",align:null},"Conversion to Planck"),(0,l.kt)("th",{parentName:"tr",align:null},"Conversion to WND"))),(0,l.kt)("tbody",{parentName:"table"},(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0"),(0,l.kt)("td",{parentName:"tr",align:null},"1 Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.000000000001 WND")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"Point"),(0,l.kt)("td",{parentName:"tr",align:null},"3"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"3")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.000000001000 WND")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"MicroWND (uWND)"),(0,l.kt)("td",{parentName:"tr",align:null},"6"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"6")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.000001000000 WND")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"MilliWND (mWND)"),(0,l.kt)("td",{parentName:"tr",align:null},"9"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"9")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"0.001000000000 WND")),(0,l.kt)("tr",{parentName:"tbody"},(0,l.kt)("td",{parentName:"tr",align:null},"WND"),(0,l.kt)("td",{parentName:"tr",align:null},"12"),(0,l.kt)("td",{parentName:"tr",align:null},"10",(0,l.kt)("sup",null,"12")," Planck"),(0,l.kt)("td",{parentName:"tr",align:null},"1.000000000000 WND")))),(0,l.kt)("h3",{id:"getting-tokens-on-the-rococo-testnet"},"Getting Tokens on the Rococo Testnet"),(0,l.kt)("p",null,"Rococo is a parachain testnet. Tokens are given directly to teams working on parachains or exploring\nthe ",(0,l.kt)("a",{parentName:"p",href:"/docs/learn-xcm"},"cross consensus")," message-passing aspects of this testnet. General users can\nobtain ROC by posting ",(0,l.kt)("inlineCode",{parentName:"p"},"!drip ")," in the Matrix chatroom\n",(0,l.kt)("a",{parentName:"p",href:"https://matrix.to/#/#rococo-faucet:matrix.org"},"#rococo-faucet:matrix.org")," or through the web-based\n",(0,l.kt)("a",{parentName:"p",href:"https://paritytech.github.io/polkadot-testnet-faucet/"},"Rococo faucet"),". Learn more about Rococo on\nits ",(0,l.kt)("a",{parentName:"p",href:"/docs/build-pdk##testing-a-parachains:-rococo-testnet"},"dedicated wiki section"),"."),(0,l.kt)("h3",{id:"getting-tokens-on-the-wococo-testnet"},"Getting Tokens on the Wococo Testnet"),(0,l.kt)("p",null,"Wococo is a bridge testnet. General users can obtain WOOK by posting ",(0,l.kt)("inlineCode",{parentName:"p"},"!drip ")," in the\nMatrix chatroom ",(0,l.kt)("a",{parentName:"p",href:"https://matrix.to/#/#wococo-faucet:matrix.org"},"#wococo-faucet:matrix.org"),"."),(0,l.kt)("h3",{id:"faucets-support"},"Faucets support"),(0,l.kt)("p",null,"If you require help with using faucets, or wish to report an issue, there is a support chat\n",(0,l.kt)("a",{parentName:"p",href:"https://matrix.to/#/#faucets-support:matrix.org"},"#faucets-support:matrix.org"),", or you can\n",(0,l.kt)("a",{parentName:"p",href:"https://github.com/paritytech/polkadot-testnet-faucet/issues/new/choose"},"create an issue")," directly\nin the faucets repo"),(0,l.kt)("h2",{id:"kusama-tokens"},"Kusama Tokens"),(0,l.kt)("p",null,"Unlike testnet DOT, Kusama tokens are not freely given away. Kusama tokens are available via the\n",(0,l.kt)("a",{parentName:"p",href:"https://claim.kusama.network/"},"claims process")," (if you had DOT at the time of Kusama genesis) or\nthrough the ",(0,l.kt)("a",{parentName:"p",href:"/docs/learn-treasury"},"Treasury"),". Alternatively, they can be obtained on the open market."),(0,l.kt)("h2",{id:"polkadot-mainnet-dot"},"Polkadot Mainnet DOT"),(0,l.kt)("p",null,"Polkadot Mainnet DOT are not freely given away. If you purchased DOT in the original 2017 offering,\nyou may claim them via the ",(0,l.kt)("a",{parentName:"p",href:"https://claims.polkadot.network/"},"Polkadot claims process"),".\nAlternatively, they are available on the open market."))}m.isMDXComponent=!0},46601:()=>{}}]); \ No newline at end of file diff --git a/assets/js/main.e6022e1c.js b/assets/js/main.0b5cdd03.js similarity index 99% rename from assets/js/main.e6022e1c.js rename to assets/js/main.0b5cdd03.js index 1fe8939f3973..a16e96ba6bc4 100644 --- a/assets/js/main.e6022e1c.js +++ b/assets/js/main.0b5cdd03.js @@ -1,2 +1,2 @@ -/*! For license information please see main.e6022e1c.js.LICENSE.txt */ -(self.webpackChunk=self.webpackChunk||[]).push([[179],{20830:(e,t,n)=>{"use strict";n.d(t,{W:()=>a});var r=n(67294);function a(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},98934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(67294),a=r.createContext(!1);function o(e){var t=e.children,n=(0,r.useState)(!1),o=n[0],i=n[1];return(0,r.useEffect)((function(){i(!0)}),[]),r.createElement(a.Provider,{value:o},t)}},94926:(e,t,n)=>{"use strict";var r=n(67294),a=n(73935),o=n(73727),i=n(70405),s=n(10412);const c=[n(32497),n(3310),n(18320),n(39604),n(32104),n(70378)];var l=n(69204),u=n(16550),d=n(18790);function f(e){var t=e.children;return r.createElement(r.Fragment,null,t)}var p=n(87462),m=n(35742),h=n(52263),g=n(44996),b=n(86668),v=n(10833),y=n(94711),x=n(19727),k=n(43320),w=n(18780),E=n(90197);function _(){var e=(0,h.Z)().i18n,t=e.defaultLocale,n=e.localeConfigs,a=(0,y.l)();return r.createElement(m.Z,null,Object.entries(n).map((function(e){var t=e[0],n=e[1].htmlLang;return r.createElement("link",{key:t,rel:"alternate",href:a.createUrl({locale:t,fullyQualified:!0}),hrefLang:n})})),r.createElement("link",{rel:"alternate",href:a.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}))}function S(e){var t=e.permalink,n=(0,h.Z)().siteConfig.url,a=function(){var e=(0,h.Z)().siteConfig,t=e.url,n=e.baseUrl,r=e.trailingSlash,a=(0,u.TH)().pathname;return t+(0,w.applyTrailingSlash)((0,g.Z)(a),{trailingSlash:r,baseUrl:n})}(),o=t?""+n+t:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function C(){var e=(0,h.Z)().i18n.currentLocale,t=(0,b.L)(),n=t.metadata,a=t.image;return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:x.h})),a&&r.createElement(v.d,{image:a}),r.createElement(S,null),r.createElement(_,null),r.createElement(E.Z,{tag:k.HX,locale:e}),r.createElement(m.Z,null,n.map((function(e,t){return r.createElement("meta",(0,p.Z)({key:t},e))}))))}var T=new Map;function A(e){if(T.has(e.pathname))return Object.assign({},e,{pathname:T.get(e.pathname)});if((0,d.f)(l.Z,e.pathname).some((function(e){return!0===e.route.exact})))return T.set(e.pathname,e.pathname),e;var t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),Object.assign({},e,{pathname:t})}var P=n(98934),O=n(49633),L=n(94578);function N(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = '+e+" "+("/"===e?" (default value)":"")+'

\n

We suggest trying baseUrl =

\n\n'}(e)).replace(/{"use strict";n.d(t,{_:()=>u,M:()=>d});var r=n(67294),a=n(8618);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"general/getting-started","docs":[{"id":"build/build-data","path":"/docs/build-data","sidebar":"docs"},{"id":"build/build-guide","path":"/docs/build-guide","sidebar":"docs"},{"id":"build/build-hackathon","path":"/docs/build-hackathon","sidebar":"docs"},{"id":"build/build-hrmp-channels","path":"/docs/build-hrmp-channels","sidebar":"docs"},{"id":"build/build-index","path":"/docs/build-index","sidebar":"docs"},{"id":"build/build-integrate-assets","path":"/docs/build-integrate-assets","sidebar":"docs"},{"id":"build/build-integration","path":"/docs/build-integration","sidebar":"docs"},{"id":"build/build-node-interaction","path":"/docs/build-node-interaction","sidebar":"docs"},{"id":"build/build-node-management","path":"/docs/build-node-management","sidebar":"docs"},{"id":"build/build-open-source","path":"/docs/build-open-source","sidebar":"docs"},{"id":"build/build-oracle","path":"/docs/build-oracle","sidebar":"docs"},{"id":"build/build-parachains","path":"/docs/build-pdk","sidebar":"docs"},{"id":"build/build-protocol-info","path":"/docs/build-protocol-info","sidebar":"docs"},{"id":"build/build-smart-contracts","path":"/docs/build-smart-contracts","sidebar":"docs"},{"id":"build/build-ss58-registry","path":"/docs/build-ss58-registry","sidebar":"docs"},{"id":"build/build-storage","path":"/docs/build-storage","sidebar":"docs"},{"id":"build/build-substrate","path":"/docs/build-substrate","sidebar":"docs"},{"id":"build/build-tools-index","path":"/docs/build-tools-index","sidebar":"docs"},{"id":"build/build-transaction-construction","path":"/docs/build-transaction-construction","sidebar":"docs"},{"id":"general/ambassadors","path":"/docs/ambassadors","sidebar":"docs"},{"id":"general/bug-bounty","path":"/docs/bug-bounty","sidebar":"docs"},{"id":"general/builders-program","path":"/docs/builders-program","sidebar":"docs"},{"id":"general/community","path":"/docs/community","sidebar":"docs"},{"id":"general/contributing","path":"/docs/contributing","sidebar":"docs"},{"id":"general/contributors","path":"/docs/contributors","sidebar":"docs"},{"id":"general/dev-heroes","path":"/docs/dev-heroes","sidebar":"docs"},{"id":"general/doc-thousand-contributors","path":"/docs/thousand-contributors","sidebar":"docs"},{"id":"general/doc-thousand-validators","path":"/docs/thousand-validators","sidebar":"docs"},{"id":"general/faq","path":"/docs/faq","sidebar":"docs"},{"id":"general/getting-started","path":"/docs/getting-started","sidebar":"docs"},{"id":"general/glossary","path":"/docs/glossary","sidebar":"docs"},{"id":"general/grants","path":"/docs/grants","sidebar":"docs"},{"id":"general/how-to-dyor","path":"/docs/how-to-dyor","sidebar":"docs"},{"id":"general/kusama/kusama-adversarial-cheatsheet","path":"/docs/kusama-adversarial-cheatsheet"},{"id":"general/kusama/kusama-bug-bounty","path":"/docs/kusama-bug-bounty"},{"id":"general/kusama/kusama-claims","path":"/docs/kusama-claims"},{"id":"general/kusama/kusama-coc","path":"/docs/kusama-coc"},{"id":"general/kusama/kusama-community","path":"/docs/kusama-community"},{"id":"general/kusama/kusama-getting-started","path":"/docs/kusama-getting-started"},{"id":"general/kusama/kusama-index","path":"/docs/kusama-index"},{"id":"general/kusama/kusama-parameters","path":"/docs/kusama-parameters"},{"id":"general/kusama/kusama-social-recovery","path":"/docs/kusama-social-recovery"},{"id":"general/kusama/kusama-timeline","path":"/docs/kusama-timeline"},{"id":"general/ledger","path":"/docs/ledger","sidebar":"docs"},{"id":"general/metadata","path":"/docs/metadata","sidebar":"docs"},{"id":"general/polkadot-direction","path":"/docs/polkadot-direction","sidebar":"docs"},{"id":"general/polkadot-v1","path":"/docs/polkadot-v1","sidebar":"docs"},{"id":"general/polkadot-vault","path":"/docs/polkadot-vault","sidebar":"docs"},{"id":"general/polkadotjs","path":"/docs/polkadotjs","sidebar":"docs"},{"id":"general/polkadotjs-ui","path":"/docs/polkadotjs-ui","sidebar":"docs"},{"id":"general/research","path":"/docs/research","sidebar":"docs"},{"id":"general/scams","path":"/docs/learn-scams","sidebar":"docs"},{"id":"general/staking-dashboard","path":"/docs/staking-dashboard","sidebar":"docs"},{"id":"general/start-building","path":"/docs/start-building","sidebar":"docs"},{"id":"general/wallets-and-extensions","path":"/docs/wallets-and-extensions","sidebar":"docs"},{"id":"general/web3-and-polkadot","path":"/docs/web3-and-polkadot","sidebar":"docs"},{"id":"learn/learn-account-abstraction","path":"/docs/learn-account-abstraction","sidebar":"docs"},{"id":"learn/learn-account-advanced","path":"/docs/learn-account-advanced","sidebar":"docs"},{"id":"learn/learn-account-generation","path":"/docs/learn-account-generation","sidebar":"docs"},{"id":"learn/learn-account-multisig","path":"/docs/learn-account-multisig","sidebar":"docs"},{"id":"learn/learn-accounts","path":"/docs/learn-accounts","sidebar":"docs"},{"id":"learn/learn-architecture","path":"/docs/learn-architecture","sidebar":"docs"},{"id":"learn/learn-assets","path":"/docs/learn-assets","sidebar":"docs"},{"id":"learn/learn-async-backing","path":"/docs/learn-async-backing","sidebar":"docs"},{"id":"learn/learn-auction","path":"/docs/learn-auction","sidebar":"docs"},{"id":"learn/learn-balance-transfers","path":"/docs/learn-balance-transfers","sidebar":"docs"},{"id":"learn/learn-bridges","path":"/docs/learn-bridges","sidebar":"docs"},{"id":"learn/learn-collator","path":"/docs/learn-collator","sidebar":"docs"},{"id":"learn/learn-comparisons","path":"/docs/learn-comparisons","sidebar":"docs"},{"id":"learn/learn-comparisons-avalanche","path":"/docs/learn-comparisons-avalanche","sidebar":"docs"},{"id":"learn/learn-comparisons-cosmos","path":"/docs/learn-comparisons-cosmos","sidebar":"docs"},{"id":"learn/learn-comparisons-ethereum-2","path":"/docs/learn-comparisons-ethereum-2","sidebar":"docs"},{"id":"learn/learn-comparisons-kusama","path":"/docs/learn-comparisons-kusama","sidebar":"docs"},{"id":"learn/learn-comparisons-rollups","path":"/docs/learn-comparisons-rollups","sidebar":"docs"},{"id":"learn/learn-consensus","path":"/docs/learn-consensus","sidebar":"docs"},{"id":"learn/learn-controller","path":"/docs/learn-controller","sidebar":"docs"},{"id":"learn/learn-crowdloans","path":"/docs/learn-crowdloans","sidebar":"docs"},{"id":"learn/learn-cryptography","path":"/docs/learn-cryptography","sidebar":"docs"},{"id":"learn/learn-DOT","path":"/docs/learn-DOT","sidebar":"docs"},{"id":"learn/learn-extrinsics","path":"/docs/learn-extrinsics","sidebar":"docs"},{"id":"learn/learn-governance","path":"/docs/learn-governance","sidebar":"docs"},{"id":"learn/learn-guides-assets-create","path":"/docs/learn-guides-assets-create","sidebar":"docs"},{"id":"learn/learn-guides-assets-ledger","path":"/docs/learn-guides-assets-ledger","sidebar":"docs"},{"id":"learn/learn-guides-identity","path":"/docs/learn-guides-identity","sidebar":"docs"},{"id":"learn/learn-guides-polkadot-opengov","path":"/docs/learn-guides-polkadot-opengov","sidebar":"docs"},{"id":"learn/learn-guides-staking","path":"/docs/learn-guides-staking","sidebar":"docs"},{"id":"learn/learn-guides-staking-pools","path":"/docs/learn-guides-staking-pools","sidebar":"docs"},{"id":"learn/learn-guides-treasury","path":"/docs/learn-guides-treasury","sidebar":"docs"},{"id":"learn/learn-guides-vault","path":"/docs/learn-guides-vault","sidebar":"docs"},{"id":"learn/learn-identity","path":"/docs/learn-identity","sidebar":"docs"},{"id":"learn/learn-implementations","path":"/docs/learn-implementations"},{"id":"learn/learn-inflation","path":"/docs/learn-inflation","sidebar":"docs"},{"id":"learn/learn-launch","path":"/docs/learn-launch","sidebar":"docs"},{"id":"learn/learn-nft","path":"/docs/learn-nft","sidebar":"docs"},{"id":"learn/learn-nft-pallets","path":"/docs/learn-nft-pallets","sidebar":"docs"},{"id":"learn/learn-nft-projects","path":"/docs/learn-nft-projects","sidebar":"docs"},{"id":"learn/learn-nomination-pools","path":"/docs/learn-nomination-pools","sidebar":"docs"},{"id":"learn/learn-nominator","path":"/docs/learn-nominator","sidebar":"docs"},{"id":"learn/learn-parachains","path":"/docs/learn-parachains","sidebar":"docs"},{"id":"learn/learn-parachains-faq","path":"/docs/learn-parachains-faq","sidebar":"docs"},{"id":"learn/learn-parachains-protocol","path":"/docs/learn-parachains-protocol","sidebar":"docs"},{"id":"learn/learn-parathreads","path":"/docs/learn-parathreads","sidebar":"docs"},{"id":"learn/learn-phragmen","path":"/docs/learn-phragmen","sidebar":"docs"},{"id":"learn/learn-polkadot-host","path":"/docs/learn-polkadot-host","sidebar":"docs"},{"id":"learn/learn-polkadot-opengov","path":"/docs/learn-polkadot-opengov","sidebar":"docs"},{"id":"learn/learn-polkadot-opengov-treasury","path":"/docs/learn-polkadot-opengov-treasury","sidebar":"docs"},{"id":"learn/learn-proxies","path":"/docs/learn-proxies","sidebar":"docs"},{"id":"learn/learn-proxies-pure","path":"/docs/learn-proxies-pure","sidebar":"docs"},{"id":"learn/learn-redenomination","path":"/docs/learn-redenomination","sidebar":"docs"},{"id":"learn/learn-runtime-upgrades","path":"/docs/learn-runtime-upgrades","sidebar":"docs"},{"id":"learn/learn-sassafras","path":"/docs/learn-sassafras","sidebar":"docs"},{"id":"learn/learn-spree","path":"/docs/learn-spree","sidebar":"docs"},{"id":"learn/learn-staking","path":"/docs/learn-staking","sidebar":"docs"},{"id":"learn/learn-staking-advanced","path":"/docs/learn-staking-advanced","sidebar":"docs"},{"id":"learn/learn-system-chains","path":"/docs/learn-system-chains","sidebar":"docs"},{"id":"learn/learn-teleport","path":"/docs/learn-teleport","sidebar":"docs"},{"id":"learn/learn-transaction-fees","path":"/docs/learn-transaction-fees","sidebar":"docs"},{"id":"learn/learn-treasury","path":"/docs/learn-treasury","sidebar":"docs"},{"id":"learn/learn-validator","path":"/docs/learn-validator","sidebar":"docs"},{"id":"learn/learn-video-tutorials","path":"/docs/learn-video-tutorials","sidebar":"docs"},{"id":"learn/learn-wasm","path":"/docs/learn-wasm","sidebar":"docs"},{"id":"learn/learn-xcm","path":"/docs/learn-xcm","sidebar":"docs"},{"id":"learn/learn-xcm-instructions","path":"/docs/learn-xcm-instructions","sidebar":"docs"},{"id":"learn/learn-xcm-pallet","path":"/docs/learn-xcm-pallet","sidebar":"docs"},{"id":"learn/learn-xcm-transport","path":"/docs/learn-xcm-transport","sidebar":"docs"},{"id":"learn/learn-xcm-usecases","path":"/docs/learn-xcm-usecases","sidebar":"docs"},{"id":"learn/learn-xcvm","path":"/docs/learn-xcvm","sidebar":"docs"},{"id":"learn/xcm/executor_config/learn-xcm-docs-config-deep-dive","path":"/docs/learn/xcm/config-deep-dive","sidebar":"docs"},{"id":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-fees","path":"/docs/learn/xcm/fundamentals-fees","sidebar":"docs"},{"id":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-multiasset","path":"/docs/learn/xcm/fundamentals-multiasset","sidebar":"docs"},{"id":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-summary","path":"/docs/learn/xcm/fundamentals-summary","sidebar":"docs"},{"id":"learn/xcm/fundamentals/learn-xcm-docs-fundamentals-xcvm","path":"/docs/learn/xcm/fundamentals-xcvm","sidebar":"docs"},{"id":"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-example","path":"/docs/learn/xcm/fundamentals/multilocation-example","sidebar":"docs"},{"id":"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-junctions","path":"/docs/learn/xcm/fundamentals/multilocation-junctions","sidebar":"docs"},{"id":"learn/xcm/fundamentals/multilocation/learn-xcm-docs-multilocation-summary","path":"/docs/learn/xcm/fundamentals/multilocation-summary","sidebar":"docs"},{"id":"learn/xcm/journey/learn-xcm-docs-journey-assets","path":"/docs/learn/xcm/journey-assets","sidebar":"docs"},{"id":"learn/xcm/journey/learn-xcm-docs-journey-channels","path":"/docs/learn/xcm/journey-channels","sidebar":"docs"},{"id":"learn/xcm/journey/learn-xcm-docs-journey-expectations","path":"/docs/learn/xcm/journey-expectations","sidebar":"docs"},{"id":"learn/xcm/journey/learn-xcm-docs-journey-fees","path":"/docs/learn/xcm/journey-fees","sidebar":"docs"},{"id":"learn/xcm/journey/learn-xcm-docs-journey-holding","path":"/docs/learn/xcm/journey-holding","sidebar":"docs"},{"id":"learn/xcm/journey/learn-xcm-docs-journey-origin","path":"/docs/learn/xcm/journey-origin","sidebar":"docs"},{"id":"learn/xcm/journey/learn-xcm-docs-journey-queries","path":"/docs/learn/xcm/journey-queries","sidebar":"docs"},{"id":"learn/xcm/journey/learn-xcm-docs-journey-register","path":"/docs/learn/xcm/journey-register","sidebar":"docs"},{"id":"learn/xcm/journey/learn-xcm-docs-journey-summary","path":"/docs/learn/xcm/journey-summary","sidebar":"docs"},{"id":"learn/xcm/journey/learn-xcm-docs-journey-transact","path":"/docs/learn/xcm/journey-transact","sidebar":"docs"},{"id":"learn/xcm/journey/learn-xcm-docs-journey-version","path":"/docs/learn/xcm/journey-version","sidebar":"docs"},{"id":"learn/xcm/journey/locks/learn-xcm-docs-journey-locks","path":"/docs/learn/xcm/journey-locks","sidebar":"docs"},{"id":"learn/xcm/journey/transfers/learn-xcm-docs-transfers-reserve","path":"/docs/learn/xcm/journey/transfers-reserve","sidebar":"docs"},{"id":"learn/xcm/journey/transfers/learn-xcm-docs-transfers-summary","path":"/docs/learn/xcm/journey/transfers-summary","sidebar":"docs"},{"id":"learn/xcm/journey/transfers/learn-xcm-docs-transfers-teleport","path":"/docs/learn/xcm/journey/transfers-teleport","sidebar":"docs"},{"id":"learn/xcm/learn-xcm-docs-intro","path":"/docs/learn/xcm/introduction","sidebar":"docs"},{"id":"learn/xcm/learn-xcm-docs-testing","path":"/docs/learn/xcm/testing","sidebar":"docs"},{"id":"learn/xcm/overview/learn-xcm-docs-overview-architecture","path":"/docs/learn/xcm/overview-architecture","sidebar":"docs"},{"id":"learn/xcm/overview/learn-xcm-docs-overview-format","path":"/docs/learn/xcm/overview-format","sidebar":"docs"},{"id":"learn/xcm/overview/learn-xcm-docs-overview-intro","path":"/docs/learn/xcm/overview-intro","sidebar":"docs"},{"id":"learn/xcm/overview/learn-xcm-docs-overview-summary","path":"/docs/learn/xcm/overview-summary","sidebar":"docs"},{"id":"learn/xcm/overview/learn-xcm-docs-overview-xcvm","path":"/docs/learn/xcm/overview-xcvm","sidebar":"docs"},{"id":"learn/xcm/quickstart/learn-xcm-docs-quickstart-first-look","path":"/docs/learn/xcm/quickstart-first-look","sidebar":"docs"},{"id":"learn/xcm/quickstart/learn-xcm-docs-quickstart-simulator","path":"/docs/learn/xcm/quickstart-simulator","sidebar":"docs"},{"id":"learn/xcm/quickstart/learn-xcm-docs-quickstart-summary","path":"/docs/learn/xcm/quickstart-summary","sidebar":"docs"},{"id":"learn/xcm/reference/learn-xcm-docs-reference-glossary","path":"/docs/learn/xcm/reference-glossary","sidebar":"docs"},{"id":"learn/xcm/reference/learn-xcm-docs-reference-xcvm-registers","path":"/docs/learn/xcm/reference-xcvm-registers","sidebar":"docs"},{"id":"maintain/doc-maintain-guides-validator-community","path":"/docs/maintain-guides-validator-community","sidebar":"docs"},{"id":"maintain/kusama/maintain-guides-how-to-nominate-kusama","path":"/docs/maintain-guides-how-to-nominate-kusama"},{"id":"maintain/kusama/maintain-guides-how-to-validate-kusama","path":"/docs/maintain-guides-how-to-validate-kusama"},{"id":"maintain/kusama/maintain-guides-society-kusama","path":"/docs/maintain-guides-society-kusama"},{"id":"maintain/maintain-bootnode","path":"/docs/maintain-bootnode","sidebar":"docs"},{"id":"maintain/maintain-endpoints","path":"/docs/maintain-endpoints","sidebar":"docs"},{"id":"maintain/maintain-errors","path":"/docs/maintain-errors","sidebar":"docs"},{"id":"maintain/maintain-guides-avoid-slashing","path":"/docs/maintain-guides-avoid-slashing","sidebar":"docs"},{"id":"maintain/maintain-guides-democracy","path":"/docs/maintain-guides-democracy","sidebar":"docs"},{"id":"maintain/maintain-guides-how-to-chill","path":"/docs/maintain-guides-how-to-chill","sidebar":"docs"},{"id":"maintain/maintain-guides-how-to-join-council","path":"/docs/maintain-guides-how-to-join-council","sidebar":"docs"},{"id":"maintain/maintain-guides-how-to-monitor-your-node","path":"/docs/maintain-guides-how-to-monitor-your-node","sidebar":"docs"},{"id":"maintain/maintain-guides-how-to-nominate-polkadot","path":"/docs/maintain-guides-how-to-nominate-polkadot","sidebar":"docs"},{"id":"maintain/maintain-guides-how-to-stop-validating","path":"/docs/maintain-guides-how-to-stop-validating","sidebar":"docs"},{"id":"maintain/maintain-guides-how-to-systemd","path":"/docs/maintain-guides-how-to-systemd","sidebar":"docs"},{"id":"maintain/maintain-guides-how-to-upgrade","path":"/docs/maintain-guides-how-to-upgrade","sidebar":"docs"},{"id":"maintain/maintain-guides-how-to-validate-polkadot","path":"/docs/maintain-guides-how-to-validate-polkadot","sidebar":"docs"},{"id":"maintain/maintain-guides-how-to-vote-councillor","path":"/docs/maintain-guides-how-to-vote-councillor","sidebar":"docs"},{"id":"maintain/maintain-guides-polkadot-opengov","path":"/docs/maintain-guides-polkadot-opengov","sidebar":"docs"},{"id":"maintain/maintain-guides-secure-validator","path":"/docs/maintain-guides-secure-validator","sidebar":"docs"},{"id":"maintain/maintain-guides-validator-payout","path":"/docs/maintain-guides-validator-payout","sidebar":"docs"},{"id":"maintain/maintain-index","path":"/docs/maintain-index","sidebar":"docs"},{"id":"maintain/maintain-networks","path":"/docs/maintain-networks","sidebar":"docs"},{"id":"maintain/maintain-polkadot-parameters","path":"/docs/maintain-polkadot-parameters","sidebar":"docs"},{"id":"maintain/maintain-rpc","path":"/docs/maintain-rpc","sidebar":"docs"},{"id":"maintain/maintain-sync","path":"/docs/maintain-sync","sidebar":"docs"},{"id":"maintain/maintain-wss","path":"/docs/maintain-wss","sidebar":"docs"},{"id":"/learn-index","path":"/docs/learn-index","sidebar":"docs"},{"id":"/general-index","path":"/docs/general-index","sidebar":"docs"},{"id":"/polkadot-vision-index","path":"/docs/polkadot-vision-index","sidebar":"docs"},{"id":"/stay-safe-index","path":"/docs/stay-safe-index","sidebar":"docs"},{"id":"/wallets-index","path":"/docs/wallets-index","sidebar":"docs"},{"id":"/dashboards-index","path":"/docs/dashboards-index","sidebar":"docs"},{"id":"/community-index","path":"/docs/community-index","sidebar":"docs"},{"id":"/programmes-index","path":"/docs/programmes-index","sidebar":"docs"},{"id":"/learn-basics-index","path":"/docs/learn-basics-index","sidebar":"docs"},{"id":"/learn-accounts-index","path":"/docs/learn-accounts-index","sidebar":"docs"},{"id":"/learn-transactions-index","path":"/docs/learn-transactions-index","sidebar":"docs"},{"id":"/learn-assets-index","path":"/docs/learn-assets-index","sidebar":"docs"},{"id":"/learn-nft-index","path":"/docs/learn-nft-index","sidebar":"docs"},{"id":"/learn-components-index","path":"/docs/learn-components-index","sidebar":"docs"},{"id":"/learn-staking-index","path":"/docs/learn-staking-index","sidebar":"docs"},{"id":"/learn-advanced-index","path":"/docs/learn-advanced-index","sidebar":"docs"},{"id":"/learn-guides-index","path":"/docs/learn-guides-index","sidebar":"docs"},{"id":"/learn-guides-staking-index","path":"/docs/learn-guides-staking-index","sidebar":"docs"},{"id":"/learn-guides-assets-index","path":"/docs/learn-guides-assets-index","sidebar":"docs"},{"id":"/learn-architecture-index","path":"/docs/learn-architecture-index","sidebar":"docs"},{"id":"/learn-participants-index","path":"/docs/learn-participants-index","sidebar":"docs"},{"id":"/learn-parachains-index","path":"/docs/learn-parachains-index","sidebar":"docs"},{"id":"/learn-xcm-index","path":"/docs/learn-xcm-index","sidebar":"docs"},{"id":"learn/xcm","path":"/docs/learn/xcm","sidebar":"docs"},{"id":"/learn/xcm/overview","path":"/docs/learn/xcm/overview","sidebar":"docs"},{"id":"/learn/xcm/quickstart","path":"/docs/learn/xcm/quickstart","sidebar":"docs"},{"id":"/learn/xcm/fundamentals","path":"/docs/learn/xcm/fundamentals","sidebar":"docs"},{"id":"/learn/xcm/fundamentals/multilocation","path":"/docs/learn/xcm/fundamentals/multilocation","sidebar":"docs"},{"id":"/learn/xcm/journey","path":"/docs/learn/xcm/journey","sidebar":"docs"},{"id":"/learn/xcm/journey/transfers","path":"/docs/learn/xcm/journey/transfers","sidebar":"docs"},{"id":"/learn/xcm/references","path":"/docs/learn/xcm/references","sidebar":"docs"},{"id":"/learn-comparisons-index","path":"/docs/learn-comparisons-index","sidebar":"docs"},{"id":"/learn-future-implementations-index","path":"/docs/learn-future-implementations-index","sidebar":"docs"},{"id":"/learn-archive-index","path":"/docs/learn-archive-index","sidebar":"docs"}],"draftIds":[],"sidebars":{"docs":{"link":{"path":"/docs/learn-index","label":"Learn"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(81465);const c=JSON.parse('{"docusaurusVersion":"2.4.3","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.3"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.4.3"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.3"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.3"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.3"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"2.4.3"},"undefined":{"type":"package","name":"remark-docusaurus-tabs","version":"0.2.0"},"docusaurus-plugin-client-redirects":{"type":"package","name":"@docusaurus/plugin-client-redirects","version":"2.4.3"},"docusaurus-theme-mermaid":{"type":"package","name":"@docusaurus/theme-mermaid","version":"2.4.3"}}}');var l={siteConfig:a.default,siteMetadata:c,globalData:o,i18n:i,codeTranslations:s},u=r.createContext(l);function d(e){var t=e.children;return r.createElement(u.Provider,{value:l},t)}},44763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(94578),a=n(67294),o=n(10412),i=n(35742),s=n(18780),c=n(34033);function l(e){var t=e.error,n=e.tryAgain;return a.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},a.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),a.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),a.createElement(u,{error:t}))}function u(e){var t=e.error,n=(0,s.getErrorCausalChain)(t).map((function(e){return e.message})).join("\n\nCause:\n");return a.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function d(e){var t=e.error,n=e.tryAgain;return a.createElement(p,{fallback:function(){return a.createElement(l,{error:t,tryAgain:n})}},a.createElement(i.Z,null,a.createElement("title",null,"Page Error")),a.createElement(c.Z,null,a.createElement(l,{error:t,tryAgain:n})))}var f=function(e){return a.createElement(d,e)},p=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={error:null},n}(0,r.Z)(t,e);var n=t.prototype;return n.componentDidCatch=function(e){o.Z.canUseDOM&&this.setState({error:e})},n.render=function(){var e=this,t=this.props.children,n=this.state.error;if(n){var r,a={error:n,tryAgain:function(){return e.setState({error:null})}};return(null!=(r=this.props.fallback)?r:f)(a)}return null!=t?t:null},t}(a.Component)},10412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document;const a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},35742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(70405);function o(e){return r.createElement(a.ql,e)}},39960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>h});var r=n(87462),a=n(63366),o=n(67294),i=n(73727),s=n(18780),c=n(52263),l=n(13919),u=n(10412),d=o.createContext({collectLink:function(){}});var f=n(44996),p=["isNavLink","to","href","activeClassName","isActive","data-noBrokenLinkCheck","autoAddBaseUrl"];function m(e,t){var n,m,h=e.isNavLink,g=e.to,b=e.href,v=e.activeClassName,y=e.isActive,x=e["data-noBrokenLinkCheck"],k=e.autoAddBaseUrl,w=void 0===k||k,E=(0,a.Z)(e,p),_=(0,c.Z)().siteConfig,S=_.trailingSlash,C=_.baseUrl,T=(0,f.C)().withBaseUrl,A=(0,o.useContext)(d),P=(0,o.useRef)(null);(0,o.useImperativeHandle)(t,(function(){return P.current}));var O=g||b;var L,N=(0,l.Z)(O),I=null==O?void 0:O.replace("pathname://",""),R=void 0!==I?(L=I,w&&function(e){return e.startsWith("/")}(L)?T(L):L):void 0;R&&N&&(R=(0,s.applyTrailingSlash)(R,{trailingSlash:S,baseUrl:C}));var j=(0,o.useRef)(!1),M=h?i.OL:i.rU,D=u.Z.canUseIntersectionObserver,F=(0,o.useRef)(),B=function(){j.current||null==R||(window.docusaurus.preload(R),j.current=!0)};(0,o.useEffect)((function(){return!D&&N&&null!=R&&window.docusaurus.prefetch(R),function(){D&&F.current&&F.current.disconnect()}}),[F,R,D,N]);var z=null!=(n=null==(m=R)?void 0:m.startsWith("#"))&&n,U=!R||!N||z;return U||x||A.collectLink(R),U?o.createElement("a",(0,r.Z)({ref:P,href:R},O&&!N&&{target:"_blank",rel:"noopener noreferrer"},E)):o.createElement(M,(0,r.Z)({},E,{onMouseEnter:B,onTouchStart:B,innerRef:function(e){P.current=e,D&&e&&N&&(F.current=new window.IntersectionObserver((function(t){t.forEach((function(t){e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(F.current.unobserve(e),F.current.disconnect(),null!=R&&window.docusaurus.prefetch(R))}))})),F.current.observe(e))},to:R},h&&{isActive:y,activeClassName:v}))}const h=o.forwardRef(m)},95999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c,I:()=>s});var r=n(67294);function a(e,t){var n=e.split(/(\{\w+\})/).map((function(e,n){if(n%2==1){var r=null==t?void 0:t[e.slice(1,-1)];if(void 0!==r)return r}return e}));return n.some((function(e){return(0,r.isValidElement)(e)}))?n.map((function(e,t){return(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e})).filter((function(e){return""!==e})):n.join("")}var o=n(81465);function i(e){var t,n,r=e.id,a=e.message;if(void 0===r&&void 0===a)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return null!=(t=null!=(n=o[null!=r?r:a])?n:a)?t:r}function s(e,t){return a(i({message:e.message,id:e.id}),t)}function c(e){var t=e.children,n=e.id,o=e.values;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");var s=i({message:t,id:n});return r.createElement(r.Fragment,null,a(s,o))}},29935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});var r="default"},13919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},44996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>s});var r=n(67294),a=n(52263),o=n(13919);function i(){var e=(0,a.Z)().siteConfig,t=e.baseUrl,n=e.url,i=(0,r.useCallback)((function(e,r){return function(e,t,n,r){var a=void 0===r?{}:r,i=a.forcePrependBaseUrl,s=void 0!==i&&i,c=a.absolute,l=void 0!==c&&c;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(s)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;var u=n.startsWith(t)?n:t+n.replace(/^\//,"");return l?e+u:u}(n,t,e,r)}),[n,t]);return{withBaseUrl:i}}function s(e,t){return void 0===t&&(t={}),(0,i().withBaseUrl)(e,t)}},52263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(49633);function o(){return(0,r.useContext)(a._)}},72389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(98934);function o(){return(0,r.useContext)(a._)}},99670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=function(e){return"object"==typeof e&&!!e&&Object.keys(e).length>0};function a(e){var t={};return function e(n,a){Object.entries(n).forEach((function(n){var o=n[0],i=n[1],s=a?a+"."+o:o;r(i)?e(i,s):t[s]=i}))}(e),t}},30226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(67294),a=r.createContext(null);function o(e){var t=e.children,n=e.value,o=r.useContext(a),i=(0,r.useMemo)((function(){return function(e){var t=e.parent,n=e.value;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}var r=Object.assign({},t.data,null==n?void 0:n.data);return{plugin:t.plugin,data:r}}({parent:o,value:n})}),[o,n]);return r.createElement(a.Provider,{value:i},t)}},80143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>b,gA:()=>p,WS:()=>m,_r:()=>d,Jo:()=>v,zh:()=>f,yW:()=>g,gB:()=>h});var r=n(16550),a=n(52263),o=n(29935);function i(e,t){void 0===t&&(t={});var n=(0,a.Z)().globalData[e];if(!n&&t.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin.');return n}var s=function(e){return e.versions.find((function(e){return e.isLast}))};function c(e,t){var n=s(e);return[].concat(e.versions.filter((function(e){return e!==n})),[n]).find((function(e){return!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})}))}function l(e,t){var n,a,o=c(e,t),i=null==o?void 0:o.docs.find((function(e){return!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})}));return{activeVersion:o,activeDoc:i,alternateDocVersions:i?(n=i.id,a={},e.versions.forEach((function(e){e.docs.forEach((function(t){t.id===n&&(a[e.name]=t)}))})),a):{}}}var u={},d=function(){var e;return null!=(e=i("docusaurus-plugin-content-docs"))?e:u},f=function(e){return function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});var r=i(e),a=null==r?void 0:r[t];if(!a&&n.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin with id "'+t+'".');return a}("docusaurus-plugin-content-docs",e,{failfast:!0})};function p(e){return void 0===e&&(e={}),function(e,t,n){void 0===n&&(n={});var a=Object.entries(e).sort((function(e,t){return t[1].path.localeCompare(e[1].path)})).find((function(e){var n=e[1];return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error("Can't find active docs plugin for \""+t+'" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: '+Object.values(e).map((function(e){return e.path})).join(", "));return o}(d(),(0,r.TH)().pathname,e)}function m(e){void 0===e&&(e={});var t=p(e),n=(0,r.TH)().pathname;if(t)return{activePlugin:t,activeVersion:c(t.pluginData,n)}}function h(e){return f(e).versions}function g(e){var t=f(e);return s(t)}function b(e){return l(f(e),(0,r.TH)().pathname)}function v(e){return function(e,t){var n=s(e);return{latestDocSuggestion:l(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(f(e),(0,r.TH)().pathname)}},18320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(74865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate:function(e){var t=e.location,n=e.previousLocation;if(n&&t.pathname!==n.pathname){var r=window.setTimeout((function(){a().start()}),200);return function(){return window.clearTimeout(r)}}},onRouteDidUpdate:function(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r,a,o=n(87410),i=n(8618);r=o.Z,a=i.default.themeConfig.prism.additionalLanguages,globalThis.Prism=r,a.forEach((function(e){n(54294)("./prism-"+e)})),delete globalThis.Prism},39471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294);const a={iconExternalLink:"iconExternalLink_nPIU"};function o(e){var t=e.width,n=void 0===t?13.5:t,o=e.height,i=void 0===o?13.5:o;return r.createElement("svg",{width:n,height:i,"aria-hidden":"true",viewBox:"0 0 24 24",className:a.iconExternalLink},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},34033:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Xt});var r=n(67294),a=n(86010),o=n(44763),i=n(10833),s=n(87462),c=n(16550),l=n(95999),u=n(85936),d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){var e=(0,r.useRef)(null),t=(0,c.k6)().action,n=(0,r.useCallback)((function(e){e.preventDefault();var t,n=null!=(t=document.querySelector("main:first-of-type"))?t:document.getElementById(d);n&&f(n)}),[]);return(0,u.S)((function(n){var r=n.location;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}var m=(0,l.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){var t,n=null!=(t=e.children)?t:m,a=p(),o=a.containerRef,i=a.onClick;return r.createElement("div",{ref:o,role:"region","aria-label":m},r.createElement("a",(0,s.Z)({},e,{href:"#"+d,onClick:i}),n))}var g=n(35281),b=n(19727);const v={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(h,{className:v.skipToContent})}var x=n(86668),k=n(59689),w=n(63366),E=["width","height","color","strokeWidth","className"];function _(e){var t=e.width,n=void 0===t?21:t,a=e.height,o=void 0===a?21:a,i=e.color,c=void 0===i?"currentColor":i,l=e.strokeWidth,u=void 0===l?1.2:l,d=(e.className,(0,w.Z)(e,E));return r.createElement("svg",(0,s.Z)({viewBox:"0 0 15 15",width:n,height:o},d),r.createElement("g",{stroke:c,strokeWidth:u},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const S={closeButton:"closeButton_CVFx"};function C(e){return r.createElement("button",(0,s.Z)({type:"button","aria-label":(0,l.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,a.Z)("clean-btn close",S.closeButton,e.className)}),r.createElement(_,{width:14,height:14,strokeWidth:3.1}))}const T={content:"content_knG7"};function A(e){var t=(0,x.L)().announcementBar.content;return r.createElement("div",(0,s.Z)({},e,{className:(0,a.Z)(T.content,e.className),dangerouslySetInnerHTML:{__html:t}}))}const P={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function O(){var e=(0,x.L)().announcementBar,t=(0,k.nT)(),n=t.isActive,a=t.close;if(!n)return null;var o=e.backgroundColor,i=e.textColor,s=e.isCloseable;return r.createElement("div",{className:P.announcementBar,style:{backgroundColor:o,color:i},role:"banner"},s&&r.createElement("div",{className:P.announcementBarPlaceholder}),r.createElement(A,{className:P.announcementBarContent}),s&&r.createElement(C,{onClick:a,className:P.announcementBarClose}))}var L=n(93163),N=n(12466);var I=n(69688),R=n(13102),j=r.createContext(null);function M(e){var t,n,a,o,i,s,c,l=e.children,u=(t=(0,L.e)(),n=(0,R.HY)(),a=(0,r.useState)(!1),o=a[0],i=a[1],s=null!==n.component,c=(0,I.D9)(s),(0,r.useEffect)((function(){s&&!c&&i(!0)}),[s,c]),(0,r.useEffect)((function(){s?t.shown||i(!0):i(!1)}),[t.shown,s]),(0,r.useMemo)((function(){return[o,i]}),[o]));return r.createElement(j.Provider,{value:u},l)}function D(e){if(e.component){var t=e.component;return r.createElement(t,e.props)}}function F(){var e=(0,r.useContext)(j);if(!e)throw new I.i6("NavbarSecondaryMenuDisplayProvider");var t=e[0],n=e[1],a=(0,r.useCallback)((function(){return n(!1)}),[n]),o=(0,R.HY)();return(0,r.useMemo)((function(){return{shown:t,hide:a,content:D(o)}}),[a,o,t])}function B(e){var t=e.header,n=e.primaryMenu,o=e.secondaryMenu,i=F().shown;return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var z=n(92949),U=n(72389);function $(e){return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function Z(e){return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const H={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function G(e){var t=e.className,n=e.buttonClassName,o=e.value,i=e.onChange,s=(0,U.Z)(),c=(0,l.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===o?(0,l.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)(H.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",H.toggleButton,!s&&H.toggleButtonDisabled,n),type:"button",onClick:function(){return i("dark"===o?"light":"dark")},disabled:!s,title:c,"aria-label":c,"aria-live":"polite"},r.createElement($,{className:(0,a.Z)(H.toggleIcon,H.lightToggleIcon)}),r.createElement(Z,{className:(0,a.Z)(H.toggleIcon,H.darkToggleIcon)})))}const V=r.memo(G),q={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function W(e){var t=e.className,n=(0,x.L)().navbar.style,a=(0,x.L)().colorMode.disableSwitch,o=(0,z.I)(),i=o.colorMode,s=o.setColorMode;return a?null:r.createElement(V,{className:t,buttonClassName:"dark"===n?q.darkNavbarColorModeToggle:void 0,value:i,onChange:s})}var Y=n(87846);function K(){return r.createElement(Y.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function X(){var e=(0,L.e)();return r.createElement("button",{type:"button","aria-label":(0,l.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:function(){return e.toggle()}},r.createElement(_,{color:"var(--ifm-color-emphasis-600)"}))}function Q(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(K,null),r.createElement(W,{className:"margin-right--md"}),r.createElement(X,null))}var J=n(39960),ee=n(44996),te=n(13919),ne=n(98022),re=n(39471),ae=["activeBasePath","activeBaseRegex","to","href","label","html","isDropdownLink","prependBaseUrlToHref"];function oe(e){var t=e.activeBasePath,n=e.activeBaseRegex,a=e.to,o=e.href,i=e.label,c=e.html,l=e.isDropdownLink,u=e.prependBaseUrlToHref,d=(0,w.Z)(e,ae),f=(0,ee.Z)(a),p=(0,ee.Z)(t),m=(0,ee.Z)(o,{forcePrependBaseUrl:!0}),h=i&&o&&!(0,te.Z)(o),g=c?{dangerouslySetInnerHTML:{__html:c}}:{children:r.createElement(r.Fragment,null,i,h&&r.createElement(re.Z,l&&{width:12,height:12}))};return o?r.createElement(J.Z,(0,s.Z)({href:u?m:o},d,g)):r.createElement(J.Z,(0,s.Z)({to:f,isNavLink:!0},(t||n)&&{isActive:function(e,t){return n?(0,ne.F)(n,t.pathname):t.pathname.startsWith(p)}},d,g))}var ie=["className","isDropdownItem"],se=["className","isDropdownItem"],ce=["mobile","position"];function le(e){var t=e.className,n=e.isDropdownItem,o=void 0!==n&&n,i=(0,w.Z)(e,ie),c=r.createElement(oe,(0,s.Z)({className:(0,a.Z)(o?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:o},i));return o?r.createElement("li",null,c):c}function ue(e){var t=e.className,n=(e.isDropdownItem,(0,w.Z)(e,se));return r.createElement("li",{className:"menu__list-item"},r.createElement(oe,(0,s.Z)({className:(0,a.Z)("menu__link",t)},n)))}function de(e){var t,n=e.mobile,a=void 0!==n&&n,o=(e.position,(0,w.Z)(e,ce)),i=a?ue:le;return r.createElement(i,(0,s.Z)({},o,{activeClassName:null!=(t=o.activeClassName)?t:a?"menu__link--active":"navbar__link--active"}))}var fe=n(86043),pe=n(48596),me=n(52263);var he=["items","position","className","onClick"],ge=["items","className","position","onClick"],be=["mobile"];function ve(e,t){return e.some((function(e){return function(e,t){return!!(0,pe.Mg)(e.to,t)||!!(0,ne.F)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)}))}function ye(e){var t,n=e.items,o=e.position,i=e.className,c=(e.onClick,(0,w.Z)(e,he)),l=(0,r.useRef)(null),u=(0,r.useState)(!1),d=u[0],f=u[1];return(0,r.useEffect)((function(){var e=function(e){l.current&&!l.current.contains(e.target)&&f(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),function(){document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),r.createElement("div",{ref:l,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===o,"dropdown--show":d})},r.createElement(oe,(0,s.Z)({"aria-haspopup":"true","aria-expanded":d,role:"button",href:c.to?void 0:"#",className:(0,a.Z)("navbar__link",i)},c,{onClick:c.to?void 0:function(e){return e.preventDefault()},onKeyDown:function(e){"Enter"===e.key&&(e.preventDefault(),f(!d))}}),null!=(t=c.children)?t:c.label),r.createElement("ul",{className:"dropdown__menu"},n.map((function(e,t){return r.createElement(it,(0,s.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))}))))}function xe(e){var t,n,o=e.items,i=e.className,l=(e.position,e.onClick),u=(0,w.Z)(e,ge),d=(n=(0,me.Z)().siteConfig.baseUrl,(0,c.TH)().pathname.replace(n,"/")),f=ve(o,d),p=(0,fe.u)({initialState:function(){return!f}}),m=p.collapsed,h=p.toggleCollapsed,g=p.setCollapsed;return(0,r.useEffect)((function(){f&&g(!f)}),[d,f,g]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":m})},r.createElement(oe,(0,s.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",i)},u,{onClick:function(e){e.preventDefault(),h()}}),null!=(t=u.children)?t:u.label),r.createElement(fe.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:m},o.map((function(e,t){return r.createElement(it,(0,s.Z)({mobile:!0,isDropdownItem:!0,onClick:l,activeClassName:"menu__link--active"},e,{key:t}))}))))}function ke(e){var t=e.mobile,n=void 0!==t&&t,a=(0,w.Z)(e,be),o=n?xe:ye;return r.createElement(o,a)}var we=n(94711),Ee=["width","height"];function _e(e){var t=e.width,n=void 0===t?20:t,a=e.height,o=void 0===a?20:a,i=(0,w.Z)(e,Ee);return r.createElement("svg",(0,s.Z)({viewBox:"0 0 24 24",width:n,height:o,"aria-hidden":!0},i),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const Se="iconLanguage_nlXk";var Ce=["mobile","dropdownItemsBefore","dropdownItemsAfter"];function Te(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var Ae=n(20830),Pe=["translations"];function Oe(){return Oe=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var Re="Ctrl";var je=r.forwardRef((function(e,t){var n=e.translations,a=void 0===n?{}:n,o=Ie(e,Pe),i=a.buttonText,s=void 0===i?"Search":i,c=a.buttonAriaLabel,l=void 0===c?"Search":c,u=Le((0,r.useState)(null),2),d=u[0],f=u[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?f("\u2318"):f(Re))}),[]),r.createElement("button",Oe({type:"button",className:"DocSearch DocSearch-Button","aria-label":l},o,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(Ae.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},s)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement("kbd",{className:"DocSearch-Button-Key"},d===Re?r.createElement(Te,null):d),r.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),Me=n(35742),De=n(66177),Fe=n(239),Be=n(43320);var ze=n(73935);const Ue={button:{buttonText:(0,l.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,l.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,l.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,l.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,l.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,l.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,l.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,l.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,l.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,l.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,l.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,l.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,l.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,l.I)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,l.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,l.I)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,l.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,l.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,l.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,l.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,l.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};var $e=["contextualSearch","externalUrlRegex"],Ze=null;function He(e){var t=e.hit,n=e.children;return r.createElement(J.Z,{to:t.url},n)}function Ge(e){var t=e.state,n=e.onClose,a=(0,De.M)();return r.createElement(J.Z,{to:a(t.query),onClick:n},r.createElement(l.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits}},"See all {count} results"))}function Ve(e){var t,a,o,i,l,u=e.contextualSearch,d=e.externalUrlRegex,f=(0,w.Z)(e,$e),p=(0,me.Z)().siteMetadata,m=(0,Fe.l)(),h=["language:"+(o=(0,Be._q)()).locale,o.tags.map((function(e){return"docusaurus_tag:"+e}))],g=null!=(t=null==(a=f.searchParameters)?void 0:a.facetFilters)?t:[],b=u?(i=g,[].concat((l=function(e){return"string"==typeof e?[e]:e})(h),l(i))):g,v=Object.assign({},f.searchParameters,{facetFilters:b}),y=(0,c.k6)(),x=(0,r.useRef)(null),k=(0,r.useRef)(null),E=(0,r.useState)(!1),_=E[0],S=E[1],C=(0,r.useState)(void 0),T=C[0],A=C[1],P=(0,r.useCallback)((function(){return Ze?Promise.resolve():Promise.all([n.e(6780).then(n.bind(n,76780)),Promise.all([n.e(532),n.e(6945)]).then(n.bind(n,46945)),Promise.all([n.e(532),n.e(8894)]).then(n.bind(n,18894))]).then((function(e){var t=e[0].DocSearchModal;Ze=t}))}),[]),O=(0,r.useCallback)((function(){P().then((function(){x.current=document.createElement("div"),document.body.insertBefore(x.current,document.body.firstChild),S(!0)}))}),[P,S]),L=(0,r.useCallback)((function(){var e;S(!1),null==(e=x.current)||e.remove()}),[S]),N=(0,r.useCallback)((function(e){P().then((function(){S(!0),A(e.key)}))}),[P,S,A]),I=(0,r.useRef)({navigate:function(e){var t=e.itemUrl;(0,ne.F)(d,t)?window.location.href=t:y.push(t)}}).current,R=(0,r.useRef)((function(e){return f.transformItems?f.transformItems(e):e.map((function(e){return Object.assign({},e,{url:m(e.url)})}))})).current,j=(0,r.useMemo)((function(){return function(e){return r.createElement(Ge,(0,s.Z)({},e,{onClose:L}))}}),[L]),M=(0,r.useCallback)((function(e){return e.addAlgoliaAgent("docusaurus",p.docusaurusVersion),e}),[p.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,a=e.onClose,o=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){(27===e.keyCode&&t||"k"===e.key.toLowerCase()&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?a():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&o&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&o(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,a,o,i])}({isOpen:_,onOpen:O,onClose:L,onInput:N,searchButtonRef:k}),r.createElement(r.Fragment,null,r.createElement(Me.Z,null,r.createElement("link",{rel:"preconnect",href:"https://"+f.appId+"-dsn.algolia.net",crossOrigin:"anonymous"})),r.createElement(je,{onTouchStart:P,onFocus:P,onMouseOver:P,onClick:O,ref:k,translations:Ue.button}),_&&Ze&&x.current&&(0,ze.createPortal)(r.createElement(Ze,(0,s.Z)({onClose:L,initialScrollY:window.scrollY,initialQuery:T,navigator:I,transformItems:R,hitComponent:He,transformSearchClient:M},f.searchPagePath&&{resultsFooterComponent:j},f,{searchParameters:v,placeholder:Ue.placeholder,translations:Ue.modal})),x.current))}function qe(){var e=(0,me.Z)().siteConfig;return r.createElement(Ve,e.themeConfig.algolia)}const We={searchBox:"searchBox_ZlJk"};function Ye(e){var t=e.children,n=e.className;return r.createElement("div",{className:(0,a.Z)(n,We.searchBox)},t)}var Ke=n(80143),Xe=n(53438),Qe=["docId","label","docsPluginId"];var Je=["sidebarId","label","docsPluginId"];var et=["label","to","docsPluginId"];var tt=n(60373),nt=["mobile","docsPluginId","dropdownActiveClassDisabled","dropdownItemsBefore","dropdownItemsAfter"],rt=function(e){return e.docs.find((function(t){return t.id===e.mainDocId}))};const at={default:de,localeDropdown:function(e){var t=e.mobile,n=e.dropdownItemsBefore,a=e.dropdownItemsAfter,o=(0,w.Z)(e,Ce),i=(0,me.Z)().i18n,u=i.currentLocale,d=i.locales,f=i.localeConfigs,p=(0,we.l)(),m=(0,c.TH)(),h=m.search,g=m.hash,b=d.map((function(e){var n=""+("pathname://"+p.createUrl({locale:e,fullyQualified:!1}))+h+g;return{label:f[e].label,lang:f[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===u?t?"menu__link--active":"dropdown__link--active":""}})),v=[].concat(n,b,a),y=t?(0,l.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):f[u].label;return r.createElement(ke,(0,s.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(_e,{className:Se}),y),items:v}))},search:function(e){var t=e.mobile,n=e.className;return t?null:r.createElement(Ye,{className:n},r.createElement(qe,null))},dropdown:ke,html:function(e){var t=e.value,n=e.className,o=e.mobile,i=void 0!==o&&o,s=e.isDropdownItem,c=void 0!==s&&s,l=c?"li":"div";return r.createElement(l,{className:(0,a.Z)({navbar__item:!i&&!c,"menu__list-item":i},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){var t=e.docId,n=e.label,a=e.docsPluginId,o=(0,w.Z)(e,Qe),i=(0,Ke.Iw)(a).activeDoc,c=(0,Xe.vY)(t,a);return null===c?null:r.createElement(de,(0,s.Z)({exact:!0},o,{isActive:function(){return(null==i?void 0:i.path)===c.path||!(null==i||!i.sidebar)&&i.sidebar===c.sidebar},label:null!=n?n:c.id,to:c.path}))},docSidebar:function(e){var t=e.sidebarId,n=e.label,a=e.docsPluginId,o=(0,w.Z)(e,Je),i=(0,Ke.Iw)(a).activeDoc,c=(0,Xe.oz)(t,a).link;if(!c)throw new Error('DocSidebarNavbarItem: Sidebar with ID "'+t+"\" doesn't have anything to be linked to.");return r.createElement(de,(0,s.Z)({exact:!0},o,{isActive:function(){return(null==i?void 0:i.sidebar)===t},label:null!=n?n:c.label,to:c.path}))},docsVersion:function(e){var t=e.label,n=e.to,a=e.docsPluginId,o=(0,w.Z)(e,et),i=(0,Xe.lO)(a)[0],c=null!=t?t:i.label,l=null!=n?n:function(e){return e.docs.find((function(t){return t.id===e.mainDocId}))}(i).path;return r.createElement(de,(0,s.Z)({},o,{label:c,to:l}))},docsVersionDropdown:function(e){var t=e.mobile,n=e.docsPluginId,a=e.dropdownActiveClassDisabled,o=e.dropdownItemsBefore,i=e.dropdownItemsAfter,u=(0,w.Z)(e,nt),d=(0,c.TH)(),f=d.search,p=d.hash,m=(0,Ke.Iw)(n),h=(0,Ke.gB)(n),g=(0,tt.J)(n).savePreferredVersionName,b=h.map((function(e){var t,n=null!=(t=m.alternateDocVersions[e.name])?t:rt(e);return{label:e.label,to:""+n.path+f+p,isActive:function(){return e===m.activeVersion},onClick:function(){return g(e.name)}}})),v=[].concat(o,b,i),y=(0,Xe.lO)(n)[0],x=t&&v.length>1?(0,l.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):y.label,k=t&&v.length>1?void 0:rt(y).path;return v.length<=1?r.createElement(de,(0,s.Z)({},u,{mobile:t,label:x,to:k,isActive:a?function(){return!1}:void 0})):r.createElement(ke,(0,s.Z)({},u,{mobile:t,label:x,to:k,items:v,isActive:a?function(){return!1}:void 0}))}};var ot=["type"];function it(e){var t=e.type,n=(0,w.Z)(e,ot),a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=at[a];if(!o)throw new Error('No NavbarItem component found for type "'+t+'".');return r.createElement(o,n)}function st(){var e=(0,L.e)(),t=(0,x.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map((function(t,n){return r.createElement(it,(0,s.Z)({mobile:!0},t,{onClick:function(){return e.toggle()},key:n}))})))}function ct(e){return r.createElement("button",(0,s.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(l.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function lt(){var e=0===(0,x.L)().navbar.items.length,t=F();return r.createElement(r.Fragment,null,!e&&r.createElement(ct,{onClick:function(){return t.hide()}}),t.content)}function ut(){var e,t=(0,L.e)();return void 0===(e=t.shown)&&(e=!0),(0,r.useEffect)((function(){return document.body.style.overflow=e?"hidden":"visible",function(){document.body.style.overflow="visible"}}),[e]),t.shouldRender?r.createElement(B,{header:r.createElement(Q,null),primaryMenu:r.createElement(st,null),secondaryMenu:r.createElement(lt,null)}):null}const dt={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function ft(e){return r.createElement("div",(0,s.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function pt(e){var t=e.children,n=(0,x.L)().navbar,o=n.hideOnScroll,i=n.style,s=(0,L.e)(),c=function(e){var t=(0,r.useState)(e),n=t[0],a=t[1],o=(0,r.useRef)(!1),i=(0,r.useRef)(0),s=(0,r.useCallback)((function(e){null!==e&&(i.current=e.getBoundingClientRect().height)}),[]);return(0,N.RF)((function(t,n){var r=t.scrollY;if(e)if(r=s?a(!1):r+l=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}const Zt=function(e){var t=e.title,n=e.titleId,a=$t(e,zt);return r.createElement("svg",Ut({id:"Content",xmlns:"http://www.w3.org/2000/svg",x:0,y:0,viewBox:"0 0 6593.8 1410.3",style:{enableBackground:"new 0 0 6593.8 1410.3"},xmlSpace:"preserve","aria-labelledby":n},a),t?r.createElement("title",{id:n},t):null,Pt||(Pt=r.createElement("style",null,".st0{fill:#fff}")),Ot||(Ot=r.createElement("path",{className:"st0",d:"M2047.8 210.4c-77.2 0-151.6 9.7-181.9 17.9-44.1 12.4-55.1 31.7-63.4 71.7l-175 807.5c-2.8 16.5-5.5 30.3-5.5 44.1 0 40 26.2 66.1 68.9 66.1 46.9 0 66.2-30.3 75.8-77.2l49.6-230.1c34.4 4.1 79.9 8.3 144.7 8.3 285.3 0 463-154.3 463-387.2 0-204-142-321.1-376.2-321.1zm-93.7 576c-44.1 0-78.6-1.4-110.2-5.5l92.3-428.6c28.9-4.1 71.7-9.7 115.8-9.7 151.6 0 228.8 71.7 228.8 190.2-.1 151.6-110.4 253.6-326.7 253.6zM6537.3 951.7c-23.4 0-38.6 13.8-67.5 45.5-51 52.4-82.7 81.3-122.6 81.3-35.8 0-55.1-28.9-55.1-75.8 0-26.2 5.5-57.9 12.4-92.3l51-239.8h153c48.2 0 77.2-27.6 77.2-77.2 0-27.6-17.9-48.2-59.2-48.2H6383l24.8-111.6c2.8-16.5 5.5-31.7 5.5-45.5 0-38.6-26.2-66.2-68.9-66.2-45.5 0-66.1 30.3-75.8 77.2l-31.7 146.1h-64.8c-49.6 0-78.5 27.6-78.5 77.2 0 27.6 19.3 48.2 60.6 48.2h56.5l-51 237c-5.5 26.2-12.4 68.9-12.4 113 0 111.6 57.9 192.9 181.9 192.9 71.7 0 135-35.8 183.3-78.6 46.9-41.3 81.3-92.3 81.3-125.4 0-31.6-24.8-57.8-56.5-57.8zM3367.9 291.7c0-40-27.6-66.2-70.3-66.2-45.5 0-66.1 30.3-75.8 77.2l-172.2 800.6c-4.1 16.5-6.9 30.3-6.9 44.1 0 40 27.6 66.1 68.9 66.1 46.9 0 67.5-30.3 77.2-77.2L3361 335.8c2.8-16.6 6.9-30.3 6.9-44.1zM5827.6 531.4c-220.5 0-370.7 219.1-370.7 427.2 0 3.9.1 7.8.2 11.6-34.6 52.5-78.8 106.9-109.1 106.9-22 0-30.3-20.7-30.3-52.4 0-38.6 11-103.4 23.4-159.9l114.4-529.2c2.8-16.5 5.5-30.3 5.5-44.1 0-40-26.2-66.2-68.9-66.2-46.9 0-66.1 30.3-75.8 77.2l-62 286.6c-33.1-34.4-81.4-57.9-154.4-57.9-146.4 0-293.7 112.7-351.1 285.6-63.2 163.4-119.7 260.1-164.3 260.1-16.5 0-26.2-13.8-26.2-37.2 0-68.9 38.6-237 55.1-318.3 5.5-30.3 8.3-42.7 8.3-60.6 0-60.6-100.6-132.3-231.5-132.3-151.4 0-288.5 95.9-357.2 238.3-102.1 180.4-195.8 310.1-242.2 310.1-20.7 0-27.6-26.2-33.1-51L3723.4 836l210.8-172.2c19.3-16.5 44.1-40 44.1-70.3 0-37.2-24.8-62-62-62-27.6 0-51 16.5-74.4 35.8L3525 829.1l106.1-493.3c2.8-16.5 6.9-30.3 6.9-44.1 0-40-27.6-66.2-70.3-66.2-45.5 0-66.1 30.3-75.8 77.2l-172.2 800.6c-4.1 16.5-6.9 30.3-6.9 44.1 0 40 27.6 66.1 68.9 66.1 46.9 0 67.5-30.3 77.2-77.2L3481 1033l129.5-104.7 31.7 159.8c12.4 63.4 45.5 125.4 130.9 125.4 85 0 151.9-77.6 218.9-182.5 20.3 109.9 98.5 182.5 207 182.5 108.9 0 183.3-64.8 231.5-151.6v2.8c0 89.6 45.5 148.8 125.4 148.8 72.3 0 132.3-43.6 185.9-136.2 30.4 80.7 98.4 136.2 193 136.2 111.6 0 191.5-67.5 242.5-161.2v8.3c0 99.2 49.6 153 130.9 153 71.8 0 132.8-41.7 184.9-109.5 39.6 67.8 110.6 109.5 206.5 109.5 220.5 0 370.7-219.1 370.7-428.6-.1-147.5-89.7-253.6-242.7-253.6zM4453.8 811.2c-40 172.2-125.4 270.1-221.9 270.1-64.8 0-100.6-49.6-100.6-124 0-146.1 106.1-303.2 248-303.2 42.7 0 75.8 12.4 104.7 30.3l-30.2 126.8zm767.5-73c-44.1 202.6-144.7 343.1-254.9 343.1-60.6 0-96.5-46.9-96.5-124 0-147.4 102-300.4 238.4-300.4 52.4 0 92.3 17.9 121.3 41.3l-8.3 40zm494.7 343.1c-79.9 0-113-57.9-113-130.9 0-133.7 92.3-286.6 208.1-286.6 79.9 0 113 57.9 113 130.9 0 135-92.3 286.6-208.1 286.6zM2767.1 531.4c-220.5 0-370.7 219.1-370.7 427.2 0 148.8 89.6 254.9 242.5 254.9 220.5 0 370.7-219.1 370.7-428.6 0-147.4-89.6-253.5-242.5-253.5zm-111.6 549.9c-79.9 0-113-57.9-113-130.9 0-133.7 92.3-286.6 208.1-286.6 79.9 0 113 57.9 113 130.9-.1 135-92.4 286.6-208.1 286.6z"})),Lt||(Lt=r.createElement("ellipse",{className:"st0",cx:663,cy:147.9,rx:254.3,ry:147.9})),Nt||(Nt=r.createElement("ellipse",{className:"st0",cx:663,cy:1262.3,rx:254.3,ry:147.9})),It||(It=r.createElement("ellipse",{transform:"rotate(-60 180.499 426.56)",className:"st0",cx:180.5,cy:426.5,rx:254.3,ry:148})),Rt||(Rt=r.createElement("ellipse",{transform:"rotate(-60 1145.575 983.768)",className:"st0",cx:1145.6,cy:983.7,rx:254.3,ry:147.9})),jt||(jt=r.createElement("ellipse",{transform:"rotate(-30 180.45 983.72)",className:"st0",cx:180.5,cy:983.7,rx:148,ry:254.3})),Mt||(Mt=r.createElement("ellipse",{transform:"rotate(-30 1145.522 426.601)",className:"st0",cx:1145.6,cy:426.6,rx:147.9,ry:254.3})))};function Ht(){var e=function(e){var t=e.href,n=e.className;return r.createElement("li",{className:"text-white mr-2 mr-lg-0 mr-xl-2"},r.createElement("a",{href:t,target:"_blank",rel:"noopener noreferrer"},r.createElement("i",{className:n})))},t=function(){return r.createElement("ul",{className:"list-social-links mt-5 mt-lg-0 justify-content-lg-end"},r.createElement(e,{href:"https://twitter.com/Polkadot",className:"socicon-twitter"}),r.createElement(e,{href:"https://www.reddit.com/r/polkadot",className:"socicon-reddit"}),r.createElement(e,{href:"https://github.com/paritytech/polkadot",className:"socicon-github"}),r.createElement(e,{href:"https://www.youtube.com/channel/UCB7PbjuZLEba_znc7mEGNgw",className:"socicon-youtube"}),r.createElement(e,{href:"https://dot.li/discord",className:"socicon-discord"}))};return r.createElement(Bt.Z,{className:"px-lg-0"},r.createElement(t,null))}function Gt(e){var t=e.href,n=e.content;return r.createElement("li",null,r.createElement("a",{href:t,className:"text-white text-small",target:"_blank",rel:"noopener noreferrer"},n))}function Vt(){var e=(0,me.Z)().siteConfig.themeConfig.footer;return r.createElement("footer",{className:"nav-footer spacer-y-4",id:"footer"},r.createElement(Dt.Z,{className:"container-custom"},r.createElement(Ft.Z,{className:"footer-legal align-items-end"},e&&r.createElement(Bt.Z,{lg:2,className:"mb-2 mb-lg-0"},r.createElement("a",{className:"navbar-brand",href:"https://polkadot.network/",target:"_blank",rel:"noopener noreferrer"},r.createElement(Zt,{height:31,alt:"Polkadot Network"}))),r.createElement(Bt.Z,{lg:6},r.createElement("ul",{className:"list-unstyled d-flex flex-wrap list-pipe-separator mt-2"},r.createElement(Gt,{content:e.copyright,href:"https://web3.foundation"}),r.createElement(Gt,{content:(0,l.I)({message:"Legal Disclosures",id:"footer.footerLegal.legal-diclosures",description:"Legal Disclosures Button Label in Footer Legal"}),href:"https://polkadot.network/legal-disclosures"}),r.createElement(Gt,{content:(0,l.I)({message:"Disclaimer",id:"footer.footerLegal.disclaimer",description:"Disclaimer Button Label in Footer Legal"}),href:"https://polkadot.network/disclaimer"}),r.createElement(Gt,{content:(0,l.I)({message:"Privacy",id:"footer.footerLegal.privacy",description:"Privacy Button Label in Footer Legal"}),href:"https://polkadot.network/privacy"}))),r.createElement(Ht,null))))}var qt=(0,I.Qc)([z.S,k.pl,N.OC,tt.L5,i.VC,function(e){var t=e.children;return r.createElement(R.n2,null,r.createElement(L.M,null,r.createElement(M,null,t)))}]);function Wt(e){var t=e.children;return r.createElement(qt,null,t)}function Yt(e){var t=e.error,n=e.tryAgain;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(l.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("div",{className:"margin-vert--lg"},r.createElement(bt,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(vt,{error:t})))))}const Kt={mainWrapper:"mainWrapper_z2l0"};function Xt(e){var t=e.children,n=e.noFooter,s=e.wrapperClassName,c=e.title,l=e.description;return(0,b.t)(),r.createElement(Wt,null,r.createElement(i.d,{title:c,description:l}),r.createElement(y,null),r.createElement(O,null),r.createElement(At,null),r.createElement("div",{id:d,className:(0,a.Z)(g.k.wrapper.main,Kt.mainWrapper,s)},r.createElement(o.Z,{fallback:function(e){return r.createElement(Yt,e)}},t)),!n&&r.createElement(Vt,null))}},87846:(e,t,n)=>{"use strict";n.d(t,{Z:()=>v});var r=n(87462),a=n(63366),o=n(67294),i=n(39960),s=n(44996),c=n(52263),l=n(86668),u=n(86010),d=n(72389),f=n(92949);const p={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};var m=["sources","className","alt"];function h(e){var t=(0,d.Z)(),n=(0,f.I)().colorMode,i=e.sources,s=e.className,c=e.alt,l=(0,a.Z)(e,m),h=t?"dark"===n?["dark"]:["light"]:["light","dark"];return o.createElement(o.Fragment,null,h.map((function(e){return o.createElement("img",(0,r.Z)({key:e,src:i[e],alt:c,className:(0,u.Z)(p.themedImage,p["themedImage--"+e],s)},l))})))}var g=["imageClassName","titleClassName"];function b(e){var t=e.logo,n=e.alt,r=e.imageClassName,a={light:(0,s.Z)(t.src),dark:(0,s.Z)(t.srcDark||t.src)},i=o.createElement(h,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?o.createElement("div",{className:r},i):i}function v(e){var t,n=(0,c.Z)().siteConfig.title,u=(0,l.L)().navbar,d=u.title,f=u.logo,p=e.imageClassName,m=e.titleClassName,h=(0,a.Z)(e,g),v=(0,s.Z)((null==f?void 0:f.href)||"/"),y=d?"":n,x=null!=(t=null==f?void 0:f.alt)?t:y;return o.createElement(i.Z,(0,r.Z)({to:v},h,(null==f?void 0:f.target)&&{target:f.target}),f&&o.createElement(b,{logo:f,alt:x,imageClassName:p}),null!=d&&o.createElement("b",{className:m},d))}},90197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(35742);function o(e){var t=e.locale,n=e.version,o=e.tag,i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},86043:(e,t,n)=>{"use strict";n.d(t,{u:()=>d,z:()=>y});var r=n(87462),a=n(63366),o=n(67294),i=n(10412),s=n(91442),c=["collapsed"],l=["lazy"],u="ease-in-out";function d(e){var t=e.initialState,n=(0,o.useState)(null!=t&&t),r=n[0],a=n[1],i=(0,o.useCallback)((function(){a((function(e){return!e}))}),[]);return{collapsed:r,setCollapsed:a,toggleCollapsed:i}}var f={display:"none",overflow:"hidden",height:"0px"},p={display:"block",overflow:"visible",height:"auto"};function m(e,t){var n=t?f:p;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function h(e){var t=e.collapsibleRef,n=e.collapsed,r=e.animation,a=(0,o.useRef)(!1);(0,o.useEffect)((function(){var e,o=t.current;function i(){var e,t,n=o.scrollHeight,a=null!=(e=null==r?void 0:r.duration)?e:function(e){if((0,s.n)())return 1;var t=e/36;return Math.round(10*(4+15*Math.pow(t,.25)+t/5))}(n);return{transition:"height "+a+"ms "+(null!=(t=null==r?void 0:r.easing)?t:u),height:n+"px"}}function c(){var e=i();o.style.transition=e.transition,o.style.height=e.height}if(!a.current)return m(o,n),void(a.current=!0);return o.style.willChange="height",e=requestAnimationFrame((function(){n?(c(),requestAnimationFrame((function(){o.style.height=f.height,o.style.overflow=f.overflow}))):(o.style.display="block",requestAnimationFrame((function(){c()})))})),function(){return cancelAnimationFrame(e)}}),[t,n,r])}function g(e){if(!i.Z.canUseDOM)return e?f:p}function b(e){var t=e.as,n=void 0===t?"div":t,r=e.collapsed,a=e.children,i=e.animation,s=e.onCollapseTransitionEnd,c=e.className,l=e.disableSSRStyle,u=(0,o.useRef)(null);return h({collapsibleRef:u,collapsed:r,animation:i}),o.createElement(n,{ref:u,style:l?void 0:g(r),onTransitionEnd:function(e){"height"===e.propertyName&&(m(u.current,r),null==s||s(r))},className:c},a)}function v(e){var t=e.collapsed,n=(0,a.Z)(e,c),i=(0,o.useState)(!t),s=i[0],l=i[1],u=(0,o.useState)(t),d=u[0],f=u[1];return(0,o.useLayoutEffect)((function(){t||l(!0)}),[t]),(0,o.useLayoutEffect)((function(){s&&f(t)}),[s,t]),s?o.createElement(b,(0,r.Z)({},n,{collapsed:d})):null}function y(e){var t=e.lazy,n=(0,a.Z)(e,l),r=t?v:b;return o.createElement(r,n)}},59689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>p});var r=n(67294),a=n(72389),o=n(50012),i=n(69688),s=n(86668),c=(0,o.WA)("docusaurus.announcement.dismiss"),l=(0,o.WA)("docusaurus.announcement.id"),u=function(){return"true"===c.get()},d=function(e){return c.set(String(e))},f=r.createContext(null);function p(e){var t=e.children,n=function(){var e=(0,s.L)().announcementBar,t=(0,a.Z)(),n=(0,r.useState)((function(){return!!t&&u()})),o=n[0],i=n[1];(0,r.useEffect)((function(){i(u())}),[]);var c=(0,r.useCallback)((function(){d(!0),i(!0)}),[]);return(0,r.useEffect)((function(){if(e){var t=e.id,n=l.get();"annoucement-bar"===n&&(n="announcement-bar");var r=t!==n;l.set(t),r&&d(!1),!r&&u()||i(!1)}}),[e]),(0,r.useMemo)((function(){return{isActive:!!e&&!o,close:c}}),[e,o,c])}();return r.createElement(f.Provider,{value:n},t)}function m(){var e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},92949:(e,t,n)=>{"use strict";n.d(t,{I:()=>g,S:()=>h});var r=n(67294),a=n(10412),o=n(69688),i=n(50012),s=n(86668),c=r.createContext(void 0),l="theme",u=(0,i.WA)(l),d={light:"light",dark:"dark"},f=function(e){return e===d.dark?d.dark:d.light},p=function(e){return a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e)},m=function(e){u.set(f(e))};function h(e){var t=e.children,n=function(){var e=(0,s.L)().colorMode,t=e.defaultMode,n=e.disableSwitch,a=e.respectPrefersColorScheme,o=(0,r.useState)(p(t)),i=o[0],c=o[1];(0,r.useEffect)((function(){n&&u.del()}),[n]);var h=(0,r.useCallback)((function(e,n){void 0===n&&(n={});var r=n.persist,o=void 0===r||r;e?(c(e),o&&m(e)):(c(a?window.matchMedia("(prefers-color-scheme: dark)").matches?d.dark:d.light:t),u.del())}),[a,t]);(0,r.useEffect)((function(){document.documentElement.setAttribute("data-theme",f(i))}),[i]),(0,r.useEffect)((function(){if(!n){var e=function(e){if(e.key===l){var t=u.get();null!==t&&h(f(t))}};return window.addEventListener("storage",e),function(){return window.removeEventListener("storage",e)}}}),[n,h]);var g=(0,r.useRef)(!1);return(0,r.useEffect)((function(){if(!n||a){var e=window.matchMedia("(prefers-color-scheme: dark)"),t=function(){window.matchMedia("print").matches||g.current?g.current=window.matchMedia("print").matches:h(null)};return e.addListener(t),function(){return e.removeListener(t)}}}),[h,n,a]),(0,r.useMemo)((function(){return{colorMode:i,setColorMode:h,get isDarkTheme(){return i===d.dark},setLightTheme:function(){h(d.light)},setDarkTheme:function(){h(d.dark)}}}),[i,h])}();return r.createElement(c.Provider,{value:n},t)}function g(){var e=(0,r.useContext)(c);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},60373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>g,Oh:()=>y});var r=n(67294),a=n(80143),o=n(29935),i=n(86668),s=n(53438),c=n(69688),l=n(50012),u=function(e){return"docs-preferred-version-"+e},d={save:function(e,t,n){(0,l.WA)(u(e),{persistence:t}).set(n)},read:function(e,t){return(0,l.WA)(u(e),{persistence:t}).get()},clear:function(e,t){(0,l.WA)(u(e),{persistence:t}).del()}},f=function(e){return Object.fromEntries(e.map((function(e){return[e,{preferredVersionName:null}]})))};var p=r.createContext(null);function m(){var e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((function(){return Object.keys(e)}),[e]),o=(0,r.useState)((function(){return f(n)})),s=o[0],c=o[1];return(0,r.useEffect)((function(){c(function(e){var t=e.pluginIds,n=e.versionPersistence,r=e.allDocsData;return Object.fromEntries(t.map((function(e){return[e,(t=e,a=d.read(t,n),r[t].versions.some((function(e){return e.name===a}))?{preferredVersionName:a}:(d.clear(t,n),{preferredVersionName:null}))];var t,a})))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]),[s,(0,r.useMemo)((function(){return{savePreferredVersion:function(e,n){d.save(e,t,n),c((function(t){var r;return Object.assign({},t,((r={})[e]={preferredVersionName:n},r))}))}}}),[t])]}function h(e){var t=e.children,n=m();return r.createElement(p.Provider,{value:n},t)}function g(e){var t=e.children;return s.cE?r.createElement(h,null,t):r.createElement(r.Fragment,null,t)}function b(){var e=(0,r.useContext)(p);if(!e)throw new c.i6("DocsPreferredVersionContextProvider");return e}function v(e){var t;void 0===e&&(e=o.m);var n=(0,a.zh)(e),i=b(),s=i[0],c=i[1],l=s[e].preferredVersionName;return{preferredVersion:null!=(t=n.versions.find((function(e){return e.name===l})))?t:null,savePreferredVersionName:(0,r.useCallback)((function(t){c.savePreferredVersion(e,t)}),[c,e])}}function y(){var e=(0,a._r)(),t=b()[0];var n=Object.keys(e);return Object.fromEntries(n.map((function(n){return[n,(r=n,o=e[r],i=t[r].preferredVersionName,null!=(a=o.versions.find((function(e){return e.name===i})))?a:null)];var r,a,o,i})))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>c,b:()=>s});var r=n(67294),a=n(69688),o=Symbol("EmptyContext"),i=r.createContext(o);function s(e){var t=e.children,n=e.name,a=e.items,o=(0,r.useMemo)((function(){return n&&a?{name:n,items:a}:null}),[n,a]);return r.createElement(i.Provider,{value:o},t)}function c(){var e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},74477:(e,t,n)=>{"use strict";n.d(t,{E:()=>s,q:()=>i});var r=n(67294),a=n(69688),o=r.createContext(null);function i(e){var t=e.children,n=e.version;return r.createElement(o.Provider,{value:n},t)}function s(){var e=(0,r.useContext)(o);if(null===e)throw new a.i6("DocsVersionProvider");return e}},93163:(e,t,n)=>{"use strict";n.d(t,{M:()=>d,e:()=>f});var r=n(67294),a=n(13102),o=n(87524),i=n(91980),s=n(86668),c=n(69688),l=r.createContext(void 0);function u(){var e,t=(e=(0,a.HY)(),0===(0,s.L)().navbar.items.length&&!e.component),n=(0,o.i)(),c=!t&&"mobile"===n,l=(0,r.useState)(!1),u=l[0],d=l[1];(0,i.Rb)((function(){if(u)return d(!1),!1}));var f=(0,r.useCallback)((function(){d((function(e){return!e}))}),[]);return(0,r.useEffect)((function(){"desktop"===n&&d(!1)}),[n]),(0,r.useMemo)((function(){return{disabled:t,shouldRender:c,toggle:f,shown:u}}),[t,c,f,u])}function d(e){var t=e.children,n=u();return r.createElement(l.Provider,{value:n},t)}function f(){var e=r.useContext(l);if(void 0===e)throw new c.i6("NavbarMobileSidebarProvider");return e}},13102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>s,Zo:()=>c,n2:()=>i});var r=n(67294),a=n(69688),o=r.createContext(null);function i(e){var t=e.children,n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function s(){var e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){var t=e.component,n=e.props,i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");var s=i[1],c=(0,a.Ql)(n);return(0,r.useEffect)((function(){s({component:t,props:c})}),[s,t,c]),(0,r.useEffect)((function(){return function(){return s({component:null,props:null})}}),[s]),null}},19727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(67294),a="navigation-with-keyboard";function o(){(0,r.useEffect)((function(){function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),function(){document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},66177:(e,t,n)=>{"use strict";n.d(t,{K:()=>s,M:()=>c});var r=n(67294),a=n(52263),o=n(91980),i="q";function s(){return(0,o.Nc)(i)}function c(){var e=(0,a.Z)().siteConfig,t=e.baseUrl,n=e.themeConfig.algolia.searchPagePath;return(0,r.useCallback)((function(e){return""+t+n+"?"+i+"="+encodeURIComponent(e)}),[t,n])}},87524:(e,t,n)=>{"use strict";n.d(t,{i:()=>l});var r=n(67294),a=n(10412),o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(){return a.Z.canUseDOM?window.innerWidth>i?o.desktop:o.mobile:o.ssr}var c=!1;function l(){var e=(0,r.useState)((function(){return c?"ssr":s()})),t=e[0],n=e[1];return(0,r.useEffect)((function(){function e(){n(s())}var t=c?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),function(){window.removeEventListener("resize",e),clearTimeout(t)}}),[]),t}},35281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});var r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:function(e){return"theme-admonition-"+e}},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:function(e){return"theme-doc-sidebar-item-category-level-"+e},docSidebarItemLinkLevel:function(e){return"theme-doc-sidebar-item-link-level-"+e}},blog:{}}},91442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},53438:(e,t,n)=>{"use strict";n.d(t,{MN:()=>C,Wl:()=>h,_F:()=>y,cE:()=>p,hI:()=>S,jA:()=>g,lO:()=>w,oz:()=>E,s1:()=>k,vY:()=>_,xz:()=>m});var r=n(67855),a=n(67294),o=n(16550),i=n(18790),s=n(80143),c=n(60373),l=n(74477),u=n(1116),d=n(67392),f=n(48596),p=!!s._r;function m(e){var t=(0,l.E)();if(e){var n=t.docs[e];if(!n)throw new Error("no version doc found by id="+e);return n}}function h(e){if(e.href)return e.href;for(var t,n=(0,r.Z)(e.items);!(t=n()).done;){var a=t.value;if("link"===a.type)return a.href;if("category"===a.type){var o=h(a);if(o)return o}}}function g(){var e=(0,o.TH)().pathname,t=(0,u.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");var n=x({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(e+" is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.");return n}var b=function(e,t){return void 0!==e&&(0,f.Mg)(e,t)},v=function(e,t){return e.some((function(e){return y(e,t)}))};function y(e,t){return"link"===e.type?b(e.href,t):"category"===e.type&&(b(e.href,t)||v(e.items,t))}function x(e){var t=e.sidebarItems,n=e.pathname,a=e.onlyCategories,o=void 0!==a&&a,i=[];return function e(t){for(var a,s=(0,r.Z)(t);!(a=s()).done;){var c=a.value;if("category"===c.type&&((0,f.Mg)(c.href,n)||e(c.items))||"link"===c.type&&(0,f.Mg)(c.href,n))return o&&"category"!==c.type||i.unshift(c),!0}return!1}(t),i}function k(){var e,t=(0,u.V)(),n=(0,o.TH)().pathname;return!1!==(null==(e=(0,s.gA)())?void 0:e.pluginData.breadcrumbs)&&t?x({sidebarItems:t.items,pathname:n}):null}function w(e){var t=(0,s.Iw)(e).activeVersion,n=(0,c.J)(e).preferredVersion,r=(0,s.yW)(e);return(0,a.useMemo)((function(){return(0,d.j)([t,n,r].filter(Boolean))}),[t,n,r])}function E(e,t){var n=w(t);return(0,a.useMemo)((function(){var t=n.flatMap((function(e){return e.sidebars?Object.entries(e.sidebars):[]})),r=t.find((function(t){return t[0]===e}));if(!r)throw new Error("Can't find any sidebar with id \""+e+'" in version'+(n.length>1?"s":"")+" "+n.map((function(e){return e.name})).join(", ")+'".\nAvailable sidebar ids are:\n- '+t.map((function(e){return e[0]})).join("\n- "));return r[1]}),[e,n])}function _(e,t){var n=w(t);return(0,a.useMemo)((function(){var t=n.flatMap((function(e){return e.docs})),r=t.find((function(t){return t.id===e}));if(!r){if(n.flatMap((function(e){return e.draftIds})).includes(e))return null;throw new Error("Couldn't find any doc with id \""+e+'" in version'+(n.length>1?"s":"")+' "'+n.map((function(e){return e.name})).join(", ")+'".\nAvailable doc ids are:\n- '+(0,d.j)(t.map((function(e){return e.id}))).join("\n- "))}return r}),[e,n])}function S(e){var t=e.route,n=e.versionMetadata,r=(0,o.TH)(),a=t.routes,s=a.find((function(e){return(0,o.LX)(r.pathname,e)}));if(!s)return null;var c=s.sidebar,l=c?n.docsSidebars[c]:void 0;return{docElement:(0,i.H)(a),sidebarName:c,sidebarItems:l}}function C(e){return e.filter((function(e){return"category"!==e.type||!!h(e)}))}},82128:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(52263);function a(e){var t=(0,r.Z)().siteConfig,n=t.title,a=t.titleDelimiter;return null!=e&&e.trim().length?e.trim()+" "+a+" "+n:n}},91980:(e,t,n)=>{"use strict";n.d(t,{Nc:()=>l,Rb:()=>s,_X:()=>c});var r=n(67294),a=n(16550),o=n(61688),i=n(69688);function s(e){!function(e){var t=(0,a.k6)(),n=(0,i.zX)(e);(0,r.useEffect)((function(){return t.block((function(e,t){return n(e,t)}))}),[t,n])}((function(t,n){if("POP"===n)return e(t,n)}))}function c(e){return t=function(t){return null===e?null:new URLSearchParams(t.location.search).get(e)},n=(0,a.k6)(),(0,o.useSyncExternalStore)(n.listen,(function(){return t(n)}),(function(){return t(n)}));var t,n}function l(e){var t,n,o=null!=(t=c(e))?t:"",i=(n=(0,a.k6)(),(0,r.useCallback)((function(e,t,r){var a=new URLSearchParams(n.location.search);t?a.set(e,t):a.delete(e),(null!=r&&r.push?n.push:n.replace)({search:a.toString()})}),[n]));return[o,(0,r.useCallback)((function(t,n){i(e,t,n)}),[i,e])]}},67392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=function(e,t){return e===t}),e.filter((function(n,r){return e.findIndex((function(e){return t(e,n)}))!==r}))}function a(e){return Array.from(new Set(e))}n.d(t,{j:()=>a,l:()=>r})},10833:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>u,VC:()=>p});var r=n(67294),a=n(86010),o=n(35742),i=n(30226);function s(){var e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var c=n(44996),l=n(82128);function u(e){var t=e.title,n=e.description,a=e.keywords,i=e.image,s=e.children,u=(0,l.p)(t),d=(0,c.C)().withBaseUrl,f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,u),t&&r.createElement("meta",{property:"og:title",content:u}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),s)}var d=r.createContext(void 0);function f(e){var t=e.className,n=e.children,i=r.useContext(d),s=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:s},r.createElement(o.Z,null,r.createElement("html",{className:s})),n)}function p(e){var t=e.children,n=s(),o="plugin-"+n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,""),i="plugin-id-"+n.plugin.id;return r.createElement(f,{className:(0,a.Z)(o,i)},t)}},69688:(e,t,n)=>{"use strict";n.d(t,{i6:()=>p,Qc:()=>h,zX:()=>d,D9:()=>f,Ql:()=>m});var r=n(87099),a=n(94578);function o(e){return o=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},o(e)}var i=n(89611);function s(e,t,n){return s=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}()?Reflect.construct.bind():function(e,t,n){var r=[null];r.push.apply(r,t);var a=new(Function.bind.apply(e,r));return n&&(0,i.Z)(a,n.prototype),a},s.apply(null,arguments)}function c(e){var t="function"==typeof Map?new Map:void 0;return c=function(e){if(null===e||(n=e,-1===Function.toString.call(n).indexOf("[native code]")))return e;var n;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return s(e,arguments,o(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),(0,i.Z)(r,e)},c(e)}var l=n(67294),u=n(10412).Z.canUseDOM?l.useLayoutEffect:l.useEffect;function d(e){var t=(0,l.useRef)(e);return u((function(){t.current=e}),[e]),(0,l.useCallback)((function(){return t.current.apply(t,arguments)}),[])}function f(e){var t=(0,l.useRef)();return u((function(){t.current=e})),t.current}var p=function(e){function t(t,n){var a,o,i,s,c;return(c=e.call(this)||this).name="ReactContextError",c.message="Hook "+(null!=(a=null==(o=c.stack)||null==(i=o.split("\n")[1])||null==(s=i.match((0,r.Z)(/at (?:\w+\.)?(\w+)/,{name:1})))?void 0:s.groups.name)?a:"")+" is called outside the <"+t+">. "+(null!=n?n:""),c}return(0,a.Z)(t,e),t}(c(Error));function m(e){var t=Object.entries(e);return t.sort((function(e,t){return e[0].localeCompare(t[0])})),(0,l.useMemo)((function(){return e}),t.flat())}function h(e){return function(t){var n=t.children;return l.createElement(l.Fragment,null,e.reduceRight((function(e,t){return l.createElement(t,null,e)}),n))}}},98022:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{F:()=>r})},48596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});var r=n(67294),a=n(69204),o=n(52263);function i(e,t){var n=function(e){var t;return null==(t=!e||e.endsWith("/")?e:e+"/")?void 0:t.toLowerCase()};return n(e)===n(t)}function s(){var e=(0,o.Z)().siteConfig.baseUrl;return(0,r.useMemo)((function(){return function(e){var t=e.baseUrl;function n(e){return e.path===t&&!0===e.exact}function r(e){return e.path===t&&!e.exact}return function e(t){if(0!==t.length)return t.find(n)||e(t.filter(r).flatMap((function(e){var t;return null!=(t=e.routes)?t:[]})))}(e.routes)}({routes:a.Z,baseUrl:e})}),[e])}},12466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>p,OC:()=>c,RF:()=>d,o5:()=>f});var r=n(67294),a=n(10412),o=n(72389),i=n(69688);var s=r.createContext(void 0);function c(e){var t,n=e.children,a=(t=(0,r.useRef)(!0),(0,r.useMemo)((function(){return{scrollEventsEnabledRef:t,enableScrollEvents:function(){t.current=!0},disableScrollEvents:function(){t.current=!1}}}),[]));return r.createElement(s.Provider,{value:a},n)}function l(){var e=(0,r.useContext)(s);if(null==e)throw new i.i6("ScrollControllerProvider");return e}var u=function(){return a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null};function d(e,t){void 0===t&&(t=[]);var n=l().scrollEventsEnabledRef,a=(0,r.useRef)(u()),o=(0,i.zX)(e);(0,r.useEffect)((function(){var e=function(){if(n.current){var e=u();o(e,a.current),a.current=e}},t={passive:!0};return e(),window.addEventListener("scroll",e,t),function(){return window.removeEventListener("scroll",e,t)}}),[o,n].concat(t))}function f(){var e,t,n,a=l(),o=(e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((function(t){e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((function(){var t=e.current,n=t.elem,r=t.top;if(!n)return{restored:!1};var a=n.getBoundingClientRect().top-r;return a&&window.scrollBy({left:0,top:a}),e.current={elem:null,top:0},{restored:0!==a}}),[]),(0,r.useMemo)((function(){return{save:t,restore:n}}),[n,t])),i=(0,r.useRef)(void 0),s=(0,r.useCallback)((function(e){o.save(e),a.disableScrollEvents(),i.current=function(){var e=o.restore().restored;if(i.current=void 0,e){window.addEventListener("scroll",(function e(){a.enableScrollEvents(),window.removeEventListener("scroll",e)}))}else a.enableScrollEvents()}}),[a,o]);return(0,r.useLayoutEffect)((function(){queueMicrotask((function(){return null==i.current?void 0:i.current()}))})),{blockElementScrollPositionUntilNextRender:s}}function p(){var e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:function(n){e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),function(){}}(n):function(e){var t=null,n=document.documentElement.scrollTop>e;return function r(){var a=document.documentElement.scrollTop;(n&&a>e||!n&&a{"use strict";n.d(t,{HX:()=>i,_q:()=>c,os:()=>s});var r=n(80143),a=n(52263),o=n(60373),i="default";function s(e,t){return"docs-"+e+"-"+t}function c(){var e=(0,a.Z)().i18n,t=(0,r._r)(),n=(0,r.WS)(),c=(0,o.Oh)();var l=[i].concat(Object.keys(t).map((function(e){var r,a=(null==n?void 0:n.activePlugin.pluginId)===e?n.activeVersion:void 0,o=c[e],i=t[e].versions.find((function(e){return e.isLast}));return s(e,(null!=(r=null!=a?a:o)?r:i).name)})));return{locale:e.currentLocale,tags:l}}},50012:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>d,WA:()=>u});var r=n(67294),a=n(61688),o="localStorage";function i(e){var t=e.key,n=e.oldValue,r=e.newValue,a=e.storage;if(n!==r){var o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}}function s(e){if(void 0===e&&(e=o),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,c||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),c=!0),null}var t}var c=!1;var l={get:function(){return null},set:function(){},del:function(){},listen:function(){return function(){}}};function u(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error('Illegal storage API usage for storage key "'+e+'".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.')}return{get:t,set:t,del:t,listen:t}}(e);var n=s(null==t?void 0:t.persistence);return null===n?l:{get:function(){try{return n.getItem(e)}catch(t){return console.error("Docusaurus storage error, can't get key="+e,t),null}},set:function(t){try{var r=n.getItem(e);n.setItem(e,t),i({key:e,oldValue:r,newValue:t,storage:n})}catch(a){console.error("Docusaurus storage error, can't set "+e+"="+t,a)}},del:function(){try{var t=n.getItem(e);n.removeItem(e),i({key:e,oldValue:t,newValue:null,storage:n})}catch(r){console.error("Docusaurus storage error, can't delete key="+e,r)}},listen:function(t){try{var r=function(r){r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),function(){return window.removeEventListener("storage",r)}}catch(a){return console.error("Docusaurus storage error, can't listen for changes of key="+e,a),function(){}}}}}function d(e,t){var n=(0,r.useRef)((function(){return null===e?l:u(e,t)})).current(),o=(0,r.useCallback)((function(e){return"undefined"==typeof window?function(){}:n.listen(e)}),[n]);return[(0,a.useSyncExternalStore)(o,(function(){return"undefined"==typeof window?null:n.get()}),(function(){return null})),n]}},94711:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(52263),a=n(16550),o=n(18780);function i(){var e=(0,r.Z)(),t=e.siteConfig,n=t.baseUrl,i=t.url,s=t.trailingSlash,c=e.i18n,l=c.defaultLocale,u=c.currentLocale,d=(0,a.TH)().pathname,f=(0,o.applyTrailingSlash)(d,{trailingSlash:s,baseUrl:n}),p=u===l?n:n.replace("/"+u+"/","/"),m=f.replace(n,"");return{createUrl:function(e){var t=e.locale;return""+(e.fullyQualified?i:"")+function(e){return e===l?""+p:""+p+e+"/"}(t)+m}}}},85936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(67294),a=n(16550),o=n(69688);function i(e){var t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((function(){n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},86668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(52263);function a(){return(0,r.Z)().siteConfig.themeConfig}},6278:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(52263);function a(){return(0,r.Z)().siteConfig.themeConfig}},239:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(67294),a=n(98022),o=n(44996),i=n(6278);function s(){var e=(0,o.C)().withBaseUrl,t=(0,i.L)().algolia,n=t.externalUrlRegex,s=t.replaceSearchResultPathname;return(0,r.useCallback)((function(t){var r=new URL(t);if((0,a.F)(n,r.href))return t;var o=""+(r.pathname+r.hash);return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(o,s))}),[e,n,s])}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var n=t.trailingSlash,r=t.baseUrl;if(e.startsWith("#"))return e;if(void 0===n)return e;var a,o=e.split(/[#?]/)[0],i="/"===o||o===r?o:(a=o,n?function(e){return e.endsWith("/")?e:e+"/"}(a):function(e){return e.endsWith("/")?e.slice(0,-1):e}(a));return e.replace(o,i)}},54143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t].concat(e(t.cause)):[t]}},18780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(54143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},69204:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(67294),a=n(87462),o=n(68356),i=n.n(o),s=n(85345);const c={"04a995e6":[function(){return n.e(785).then(n.t.bind(n,76886,19))},"~docs/default/category-docs-docs-category-advanced-guides-for-staking-dcd.json",76886],"0a3f0c9b":[function(){return n.e(7837).then(n.bind(n,83388))},"@site/../docs/general/ledger.md",83388],"0c06bca3":[function(){return n.e(601).then(n.bind(n,52812))},"@site/../docs/maintain/maintain-guides-how-to-join-council.md",52812],"0c68fb82":[function(){return n.e(5526).then(n.bind(n,81424))},"@site/../docs/general/kusama/kusama-claims.md",81424],"0cb62240":[function(){return n.e(1979).then(n.t.bind(n,74518,19))},"~docs/default/category-docs-docs-category-fundamentals-60b.json",74518],"0df78d26":[function(){return n.e(1723).then(n.bind(n,13449))},"@site/../docs/maintain/maintain-guides-secure-validator.md",13449],"12331e8b":[function(){return n.e(8270).then(n.bind(n,67881))},"@site/../docs/general/polkadotjs.md",67881],"131c7f55":[function(){return n.e(9323).then(n.bind(n,93928))},"@site/../docs/learn/learn-architecture.md",93928],"13b7bafa":[function(){return Promise.all([n.e(1122),n.e(9447),n.e(6585)]).then(n.bind(n,83881))},"@site/../docs/learn/learn-auction.md",83881],"145746f5":[function(){return Promise.all([n.e(1122),n.e(691)]).then(n.bind(n,1735))},"@site/../docs/maintain/maintain-polkadot-parameters.md",1735],"14eb3368":[function(){return Promise.all([n.e(532),n.e(9817)]).then(n.bind(n,34228))},"@theme/DocCategoryGeneratedIndexPage",34228],15985664:[function(){return n.e(7830).then(n.bind(n,43394))},"@site/../docs/learn/xcm/journey/summary.md",43394],"1646726c":[function(){return Promise.all([n.e(1122),n.e(2169)]).then(n.bind(n,78381))},"@site/../docs/learn/learn-staking.md",78381],17896441:[function(){return Promise.all([n.e(532),n.e(7918)]).then(n.bind(n,81026))},"@theme/DocItem",81026],"1882e65d":[function(){return n.e(5492).then(n.t.bind(n,77274,19))},"/home/runner/work/polkadot-wiki/polkadot-wiki/polkadot-wiki/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",77274],"19ed4d4c":[function(){return n.e(4355).then(n.bind(n,51191))},"@site/../docs/learn/learn-comparisons-cosmos.md",51191],"1a4e3797":[function(){return Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,56675))},"@theme/SearchPage",56675],"1ae2b102":[function(){return Promise.all([n.e(1122),n.e(4537)]).then(n.bind(n,1799))},"@site/../docs/build/build-protocol-info.md",1799],"1be78505":[function(){return Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,19963))},"@theme/DocPage",19963],"1d6d4797":[function(){return n.e(12).then(n.bind(n,35290))},"@site/../docs/learn/xcm/journey/transact.md",35290],"1dc05242":[function(){return n.e(4696).then(n.t.bind(n,14820,19))},"~docs/default/category-docs-docs-category-nfts-9fb.json",14820],"1e15616a":[function(){return n.e(9802).then(n.bind(n,39420))},"@site/../docs/learn/learn-wasm.md",39420],"1ed3671a":[function(){return n.e(1953).then(n.bind(n,63092))},"@site/../docs/learn/xcm/journey/trap-and-claim.md",63092],"21877fa5":[function(){return Promise.all([n.e(1122),n.e(2117)]).then(n.bind(n,4381))},"@site/../docs/learn/learn-system-chains.md",4381],"21899dd2":[function(){return n.e(3599).then(n.bind(n,2741))},"@site/../docs/learn/learn-parachains.md",2741],"23498fd5":[function(){return n.e(810).then(n.bind(n,7551))},"@site/../docs/build/build-integrate-assets.md",7551],"25f2bd2a":[function(){return n.e(1213).then(n.bind(n,16769))},"@site/../docs/maintain/maintain-guides-how-to-stop-validating.md",16769],"279fb1d6":[function(){return Promise.all([n.e(1122),n.e(6827)]).then(n.bind(n,81807))},"@site/../docs/general/kusama/kusama-getting-started.md",81807],"295fff6c":[function(){return n.e(4543).then(n.t.bind(n,15619,19))},"~docs/default/category-docs-docs-category-advanced-guides-69d.json",15619],"29a046f3":[function(){return n.e(6918).then(n.t.bind(n,59904,19))},"~docs/default/category-docs-docs-category-polkadot-comparisons-3b4.json",59904],"2be0d940":[function(){return n.e(2914).then(n.bind(n,77078))},"@site/../docs/learn/learn-guides-identity.md",77078],"2d429218":[function(){return n.e(502).then(n.bind(n,20925))},"@site/../docs/learn/learn-consensus.md",20925],"2ea50c63":[function(){return n.e(2949).then(n.bind(n,84941))},"@site/../docs/learn/learn-xcm-usecases.md",84941],"2f3b630e":[function(){return Promise.all([n.e(1122),n.e(9226)]).then(n.bind(n,42569))},"@site/../docs/learn/learn-polkadot-opengov.md",42569],"30d868e8":[function(){return n.e(8215).then(n.t.bind(n,8578,19))},"~docs/default/category-docs-docs-category-multilocation-8c6.json",8578],"31bd35e0":[function(){return n.e(5281).then(n.bind(n,35660))},"@site/../docs/learn/xcm/overview/summary.md",35660],"31c99aa1":[function(){return n.e(8876).then(n.t.bind(n,45497,19))},"~docs/default/category-docs-docs-category-references-a4f.json",45497],"320c8a05":[function(){return n.e(5005).then(n.bind(n,76184))},"@site/../docs/maintain/maintain-networks.md",76184],"32c9742a":[function(){return n.e(9626).then(n.bind(n,84639))},"@site/../docs/learn/xcm/fundamentals/summary.md",84639],"32dac8d4":[function(){return n.e(3347).then(n.t.bind(n,76432,19))},"~docs/default/category-docs-docs-category-programmes-ab0.json",76432],"32e8da05":[function(){return Promise.all([n.e(1122),n.e(6140)]).then(n.bind(n,65779))},"@site/../docs/learn/learn-crowdloans.md",65779],"33b0bcab":[function(){return n.e(1585).then(n.bind(n,27281))},"@site/../docs/learn/xcm/reference/xcvm-registers.md",27281],"33bbe353":[function(){return n.e(7908).then(n.bind(n,46437))},"@site/../docs/maintain/kusama/maintain-guides-society-kusama.md",46437],"3497b7c6":[function(){return n.e(3332).then(n.t.bind(n,73834,19))},"~docs/default/category-docs-docs-category-quickstart-1e9.json",73834],"3829cf1d":[function(){return n.e(537).then(n.bind(n,77778))},"@site/../docs/maintain/maintain-guides-validator-community.md",77778],"386099fc":[function(){return Promise.all([n.e(1122),n.e(8139)]).then(n.bind(n,60283))},"@site/../docs/learn/learn-polkadot-opengov-treasury.md",60283],"386bfe51":[function(){return n.e(657).then(n.bind(n,35810))},"@site/../docs/general/contributing.md",35810],"3bd77df4":[function(){return n.e(8831).then(n.bind(n,94752))},"@site/../docs/learn/learn-bridges.md",94752],"3e56470e":[function(){return n.e(4541).then(n.bind(n,80432))},"@site/../docs/maintain/maintain-wss.md",80432],"408829bd":[function(){return n.e(6).then(n.bind(n,11982))},"@site/../docs/learn/learn-transaction-fees.md",11982],"41871d53":[function(){return n.e(7778).then(n.t.bind(n,69713,19))},"/home/runner/work/polkadot-wiki/polkadot-wiki/polkadot-wiki/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",69713],"41b7b3e8":[function(){return Promise.all([n.e(1122),n.e(3513)]).then(n.bind(n,84358))},"@site/../docs/learn/learn-staking-advanced.md",84358],"43cda9e8":[function(){return n.e(6357).then(n.bind(n,96736))},"@site/../docs/learn/learn-guides-assets-ledger.md",96736],"43ee4f22":[function(){return Promise.all([n.e(532),n.e(4672)]).then(n.bind(n,24567))},"@site/../docs/build/build-guide.md",24567],"452ad91d":[function(){return n.e(6255).then(n.bind(n,94100))},"@site/../docs/learn/xcm/overview/intro.md",94100],"4642ab5c":[function(){return n.e(6946).then(n.bind(n,75925))},"@site/../docs/learn/learn-cryptography.md",75925],"48074a08":[function(){return n.e(1825).then(n.t.bind(n,64515,19))},"~docs/default/category-docs-docs-category-advanced-concepts-637.json",64515],"482bfb5c":[function(){return n.e(9993).then(n.t.bind(n,59085,19))},"~docs/default/category-docs-docs-category-dashboards-ddd.json",59085],"48d75399":[function(){return Promise.all([n.e(1122),n.e(4620)]).then(n.bind(n,17384))},"@site/../docs/general/faq.md",17384],"493c7fdf":[function(){return Promise.all([n.e(1122),n.e(2354)]).then(n.bind(n,22703))},"@site/../docs/general/glossary.md",22703],49816380:[function(){return n.e(6482).then(n.t.bind(n,13302,19))},"~docs/default/category-docs-docs-category-polkadot-vision-2bc.json",13302],"4a8eb552":[function(){return Promise.all([n.e(1122),n.e(7202)]).then(n.bind(n,87149))},"@site/../docs/learn/learn-comparisons-kusama.md",87149],"4d76887f":[function(){return n.e(1415).then(n.bind(n,77799))},"@site/../docs/build/build-hackathon.md",77799],"4d9b9869":[function(){return n.e(4445).then(n.bind(n,56136))},"@site/../docs/learn/learn-parachains-protocol.md",56136],"4dff184a":[function(){return Promise.all([n.e(1122),n.e(6495),n.e(1481)]).then(n.bind(n,32323))},"@site/../docs/maintain/maintain-guides-polkadot-opengov.md",32323],"4f031749":[function(){return Promise.all([n.e(1122),n.e(2008)]).then(n.bind(n,44002))},"@site/../docs/learn/learn-guides-staking-pools.md",44002],"5136ee31":[function(){return n.e(1446).then(n.bind(n,57904))},"@site/../docs/learn/xcm/journey/expects.md",57904],"51fbc2c9":[function(){return n.e(9806).then(n.bind(n,68114))},"@site/../docs/learn/learn-comparisons.md",68114],"54338ffb":[function(){return Promise.all([n.e(1122),n.e(4634)]).then(n.bind(n,97765))},"@site/../docs/learn/learn-account-multisig.md",97765],"543610b9":[function(){return n.e(7022).then(n.t.bind(n,50491,19))},"~docs/default/category-docs-docs-category-community-contributors-548.json",50491],"591eca19":[function(){return n.e(7714).then(n.bind(n,32876))},"@site/../docs/general/polkadot-direction.md",32876],"5c90fc9b":[function(){return n.e(3484).then(n.bind(n,11213))},"@site/../docs/learn/xcm/executor_config/config.md",11213],"5d69d9d4":[function(){return n.e(2884).then(n.bind(n,48470))},"@site/../docs/maintain/maintain-guides-how-to-upgrade.md",48470],"5e9f5e1a":[function(){return Promise.resolve().then(n.bind(n,8618))},"@generated/docusaurus.config",8618],"60738e36":[function(){return Promise.all([n.e(1122),n.e(9071)]).then(n.bind(n,71345))},"@site/../docs/general/metadata.md",71345],"60e73337":[function(){return n.e(6862).then(n.bind(n,71401))},"@site/../docs/maintain/maintain-guides-democracy.md",71401],"6151e7ce":[function(){return Promise.all([n.e(1122),n.e(2194)]).then(n.bind(n,8417))},"@site/../docs/general/kusama/kusama-parameters.md",8417],"64c7e1cc":[function(){return n.e(9217).then(n.bind(n,45725))},"@site/../docs/build/build-integration.md",45725],"666ba125":[function(){return n.e(6776).then(n.bind(n,39949))},"@site/../docs/learn/learn-redenomination.md",39949],"694672cd":[function(){return Promise.all([n.e(1122),n.e(8138)]).then(n.bind(n,29576))},"@site/../docs/learn/learn-guides-staking.md",29576],"694e7470":[function(){return n.e(4566).then(n.t.bind(n,6269,19))},"~docs/default/category-docs-docs-category-future-implementations-236.json",6269],"69b97ecd":[function(){return n.e(8067).then(n.bind(n,75217))},"@site/../docs/learn/learn-implementations.md",75217],"6d2ffbf3":[function(){return n.e(9315).then(n.bind(n,91599))},"@site/../docs/learn/xcm/quickstart/first-look.md",91599],"6f1a81b8":[function(){return Promise.all([n.e(1122),n.e(7288)]).then(n.bind(n,15418))},"@site/../docs/maintain/maintain-guides-how-to-chill.md",15418],"702d5d94":[function(){return n.e(4105).then(n.t.bind(n,54229,19))},"~docs/default/category-docs-docs-category-wallets-bf2.json",54229],"71ed82b9":[function(){return n.e(8648).then(n.bind(n,4401))},"@site/../docs/general/start-building.md",4401],"73c3bebc":[function(){return n.e(1211).then(n.t.bind(n,47084,19))},"~docs/default/category-docs-docs-category-stay-safe-1ef.json",47084],"74df6a22":[function(){return n.e(1299).then(n.bind(n,50223))},"@site/../docs/maintain/maintain-rpc.md",50223],"75a6958b":[function(){return n.e(3635).then(n.t.bind(n,14183,19))},"~docs/default/category-docs-docs-category-advanced-guides-for-staking-1-526.json",14183],"766a10e1":[function(){return n.e(8860).then(n.bind(n,83611))},"@site/../docs/learn/learn-comparisons-avalanche.md",83611],"77a2b809":[function(){return Promise.all([n.e(1122),n.e(8080)]).then(n.bind(n,83583))},"@site/../docs/learn/learn-balance-transfers.md",83583],"78868b16":[function(){return n.e(2754).then(n.bind(n,17134))},"@site/../docs/general/kusama/kusama-social-recovery.md",17134],"78e1e977":[function(){return n.e(1872).then(n.bind(n,3830))},"@site/../docs/learn/xcm/journey/holding-modifiers.md",3830],"79d4be33":[function(){return n.e(626).then(n.bind(n,60657))},"@site/../docs/build/build-substrate.md",60657],"7c78c461":[function(){return n.e(2507).then(n.bind(n,41962))},"@site/../docs/general/kusama/kusama-community.md",41962],"7ccc428f":[function(){return n.e(3348).then(n.t.bind(n,56705,19))},"~docs/default/category-docs-docs-category-learn-about-polkadot-534.json",56705],"7d54ab5a":[function(){return Promise.all([n.e(1122),n.e(2791)]).then(n.bind(n,77611))},"@site/../docs/maintain/kusama/maintain-guides-how-to-nominate-kusama.md",77611],"7e9389ad":[function(){return n.e(5011).then(n.t.bind(n,69074,19))},"~docs/default/category-docs-docs-category-participants-in-the-polkadot-ecosystem-e03.json",69074],"7fbac68a":[function(){return n.e(1598).then(n.bind(n,81475))},"@site/../docs/general/ambassadors.md",81475],"8167490d":[function(){return n.e(9247).then(n.bind(n,92468))},"@site/../docs/learn/learn-controller.md",92468],"824749c6":[function(){return n.e(8361).then(n.bind(n,94521))},"@site/../docs/build/build-node-interaction.md",94521],"8247eba8":[function(){return n.e(8115).then(n.bind(n,76785))},"@site/../docs/learn/xcm/journey/transfers/teleports.md",76785],"83d4859f":[function(){return n.e(8757).then(n.bind(n,25310))},"@site/../docs/learn/xcm/journey/transfers/summary.md",25310],"84f79495":[function(){return n.e(2078).then(n.bind(n,96709))},"@site/../docs/learn/learn-parathreads.md",96709],"85afe03a":[function(){return n.e(3132).then(n.bind(n,31714))},"@site/../docs/maintain/maintain-errors.md",31714],"863c4753":[function(){return n.e(2552).then(n.bind(n,15719))},"@site/../docs/learn/xcm/journey/register-modifiers.md",15719],"899aadcc":[function(){return n.e(1083).then(n.bind(n,11422))},"@site/../docs/learn/xcm/overview/architecture.md",11422],"8a8a7d05":[function(){return n.e(3262).then(n.bind(n,34204))},"@site/../docs/build/build-parachains.md",34204],"8b670b2b":[function(){return n.e(7799).then(n.bind(n,12897))},"@site/../docs/build/build-index.md",12897],"8d3a1bf8":[function(){return Promise.all([n.e(1122),n.e(2399)]).then(n.bind(n,10209))},"@site/../docs/learn/learn-inflation.md",10209],"8dd7cee0":[function(){return n.e(1486).then(n.bind(n,63349))},"@site/../docs/general/thousand-validators.md",63349],"918b38b6":[function(){return Promise.all([n.e(1122),n.e(2508)]).then(n.bind(n,90594))},"@site/../docs/learn/learn-async-backing.md",90594],"924835c1":[function(){return n.e(9126).then(n.t.bind(n,32788,19))},"~docs/default/category-docs-docs-category-archive-519.json",32788],"935f2afb":[function(){return n.e(53).then(n.t.bind(n,22624,19))},"~docs/default/version-current-metadata-prop-751.json",22624],"9528ac88":[function(){return n.e(315).then(n.bind(n,85517))},"@site/../docs/learn/learn-xcm-transport.md",85517],"987d08ef":[function(){return n.e(1748).then(n.bind(n,11732))},"@site/../docs/build/build-smart-contracts.md",11732],"98a30fd8":[function(){return n.e(8866).then(n.bind(n,94062))},"@site/../docs/learn/xcm/fundamentals/multiasset.md",94062],"991ceaa9":[function(){return Promise.all([n.e(1122),n.e(4428)]).then(n.bind(n,35265))},"@site/../docs/maintain/maintain-guides-how-to-nominate-polkadot.md",35265],"9a101178":[function(){return n.e(2505).then(n.bind(n,42047))},"@site/../docs/build/build-ss58-registry.md",42047],"9a679a70":[function(){return n.e(8178).then(n.t.bind(n,92189,19))},"~docs/default/category-docs-docs-category-overview-c3c.json",92189],"9e2042f5":[function(){return n.e(5651).then(n.bind(n,99476))},"@site/../docs/learn/learn-collator.md",99476],"9e3f6a8a":[function(){return n.e(2758).then(n.bind(n,14865))},"@site/../docs/learn/learn-comparison-ethereum-2.md",14865],"9e6341e5":[function(){return n.e(1774).then(n.bind(n,61601))},"@site/../docs/learn/xcm/journey/transfers/reserve.md",61601],"9e76b49d":[function(){return n.e(7823).then(n.bind(n,85268))},"@site/../docs/learn/xcm/testing.md",85268],"9f319605":[function(){return n.e(63).then(n.bind(n,48442))},"@site/../docs/learn/xcm/journey/fees.md",48442],a2800a5b:[function(){return n.e(7961).then(n.bind(n,69595))},"@site/../docs/build/build-transaction-construction.md",69595],a29dc56e:[function(){return n.e(6253).then(n.bind(n,16898))},"@site/../docs/maintain/maintain-guides-how-to-monitor-your-node.md",16898],a4b71220:[function(){return n.e(9112).then(n.t.bind(n,68388,19))},"/home/runner/work/polkadot-wiki/polkadot-wiki/polkadot-wiki/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",68388],a5002e4a:[function(){return n.e(1703).then(n.bind(n,53714))},"@site/../docs/build/build-oracle.md",53714],a5b3561d:[function(){return n.e(7466).then(n.bind(n,75007))},"@site/../docs/general/kusama/kusama-coc.md",75007],a62d9768:[function(){return n.e(6277).then(n.t.bind(n,46241,19))},"~docs/default/category-docs-docs-category-advanced-guides-for-asset-hub-9aa.json",46241],a74a59a0:[function(){return Promise.all([n.e(1122),n.e(8702)]).then(n.bind(n,11300))},"@site/../docs/maintain/maintain-guides-how-to-validate-polkadot.md",11300],a7b37b86:[function(){return n.e(4507).then(n.bind(n,588))},"@site/../docs/general/scams.md",588],a7c27f4d:[function(){return n.e(4174).then(n.t.bind(n,39220,19))},"~docs/default/category-docs-docs-category-basic-concepts-about-polkadot-793.json",39220],a996ffc3:[function(){return n.e(9383).then(n.t.bind(n,58976,19))},"~docs/default/category-docs-docs-category-transactions-db3.json",58976],ab138bf8:[function(){return Promise.all([n.e(1122),n.e(8791)]).then(n.bind(n,83433))},"@site/../docs/learn/learn-proxies.md",83433],ad762f86:[function(){return Promise.all([n.e(1122),n.e(7940)]).then(n.bind(n,79569))},"@site/../docs/learn/learn-account-advanced.md",79569],af40287e:[function(){return n.e(3066).then(n.t.bind(n,48292,19))},"~docs/default/category-docs-docs-category-transfers-b84.json",48292],b0cb055f:[function(){return n.e(9905).then(n.bind(n,65959))},"@site/../docs/learn/xcm/fundamentals/xcvm.md",65959],b0cbc1d4:[function(){return Promise.all([n.e(1122),n.e(3667)]).then(n.bind(n,14374))},"@site/../docs/general/staking-dashboard.md",14374],b21dd8a7:[function(){return n.e(1494).then(n.bind(n,7788))},"@site/../docs/learn/learn-comparison-rollups.md",7788],b225a2ce:[function(){return n.e(3668).then(n.bind(n,63021))},"@site/../docs/learn/xcm/fundamentals/multilocation/summary.md",63021],b336bb09:[function(){return n.e(1592).then(n.t.bind(n,34082,19))},"~docs/default/category-docs-docs-category-accounts-c2d.json",34082],b3719d54:[function(){return n.e(5422).then(n.bind(n,64633))},"@site/../docs/general/polkadot-v1.md",64633],b38833d4:[function(){return Promise.all([n.e(1122),n.e(9062)]).then(n.bind(n,2774))},"@site/../docs/learn/learn-phragmen.md",2774],b48c599b:[function(){return n.e(8901).then(n.bind(n,99098))},"@site/../docs/general/kusama/kusama-bug-bounty.md",99098],b61f6dc7:[function(){return n.e(1372).then(n.bind(n,7678))},"@site/../docs/general/research.md",7678],b940de31:[function(){return Promise.all([n.e(1122),n.e(7633)]).then(n.bind(n,11427))},"@site/../docs/learn/learn-assets.md",11427],b9b4ec9e:[function(){return n.e(5704).then(n.bind(n,15137))},"@site/../docs/learn/xcm/reference/glossary.md",15137],bb8b1738:[function(){return Promise.all([n.e(1122),n.e(7368)]).then(n.bind(n,49175))},"@site/../docs/learn/learn-validator.md",49175],bbba852d:[function(){return n.e(6294).then(n.bind(n,33736))},"@site/../docs/general/kusama/kusama-adverserial-cheatsheet.md",33736],bd701914:[function(){return n.e(7388).then(n.bind(n,55965))},"@site/../docs/learn/learn-parachains-faq.md",55965],bea375d6:[function(){return n.e(3757).then(n.bind(n,86676))},"@site/../docs/general/grants.md",86676],c07c2447:[function(){return Promise.all([n.e(1122),n.e(7654)]).then(n.bind(n,40569))},"@site/../docs/learn/learn-guides-polkadot-opengov.md",40569],c1bbdb2a:[function(){return n.e(4916).then(n.bind(n,27122))},"@site/../docs/learn/learn-polkadot-host.md",27122],c2c6a3a6:[function(){return n.e(2712).then(n.bind(n,5812))},"@site/../docs/learn/learn-nft-projects.md",5812],c41801b5:[function(){return Promise.all([n.e(1122),n.e(5013)]).then(n.bind(n,63801))},"@site/../docs/maintain/kusama/maintain-guides-how-to-validate-kusama.md",63801],c4f5d8e4:[function(){return n.e(4195).then(n.bind(n,75844))},"@site/src/pages/index.js",75844],c662f00a:[function(){return n.e(4379).then(n.bind(n,56021))},"@site/../docs/learn/xcm/journey/queries.md",56021],c7a044bb:[function(){return n.e(217).then(n.bind(n,47223))},"@site/../docs/learn/xcm/journey/channels-and-bridges.md",47223],c7a2145e:[function(){return n.e(9478).then(n.bind(n,25690))},"@site/../docs/general/how-to-dyor.md",25690],c7c5ba1a:[function(){return Promise.all([n.e(1122),n.e(6104)]).then(n.bind(n,63706))},"@site/../docs/learn/learn-accounts.md",63706],c91a9c06:[function(){return Promise.all([n.e(1122),n.e(8355)]).then(n.bind(n,48693))},"@site/../docs/learn/learn-identity.md",48693],c977dfe8:[function(){return Promise.all([n.e(1122),n.e(1506)]).then(n.bind(n,38948))},"@site/../docs/learn/learn-teleport.md",38948],ca9fe671:[function(){return n.e(6598).then(n.bind(n,37579))},"@site/../docs/learn/xcm/overview/xcvm.md",37579],cc44e8fd:[function(){return n.e(7683).then(n.bind(n,6005))},"@site/../docs/build/build-node-management.md",6005],ccc1222e:[function(){return n.e(6920).then(n.bind(n,60147))},"@site/../docs/build/build-open-source.md",60147],cd144357:[function(){return n.e(9779).then(n.t.bind(n,14423,19))},"~docs/default/category-docs-docs-category-polkadots-parachains-4b5.json",14423],cda87995:[function(){return n.e(3933).then(n.bind(n,27023))},"@site/../docs/build/build-tools-index.md",27023],ceaa29cb:[function(){return n.e(6373).then(n.bind(n,41230))},"@site/../docs/learn/xcm/journey/locks/locks.md",41230],cfd53ea4:[function(){return n.e(1090).then(n.bind(n,7007))},"@site/../docs/general/kusama/kusama-timeline.md",7007],d01f45b7:[function(){return n.e(6220).then(n.t.bind(n,73443,19))},"~docs/default/category-docs-docs-category-polkadots-xcm-416.json",73443],d27ae88d:[function(){return n.e(5157).then(n.bind(n,19994))},"@site/../docs/learn/learn-video-tutorials.md",19994],d3a753cf:[function(){return n.e(8855).then(n.bind(n,8032))},"@site/../docs/learn/xcm/fundamentals/multilocation/example.md",8032],d3db551a:[function(){return Promise.all([n.e(1122),n.e(7485)]).then(n.bind(n,67445))},"@site/../docs/learn/learn-treasury.md",67445],d569989b:[function(){return n.e(609).then(n.bind(n,17340))},"@site/../docs/general/bug-bounty.md",17340],d5909206:[function(){return n.e(3554).then(n.bind(n,43543))},"@site/../docs/learn/xcm/fundamentals/multilocation/junction.md",43543],d6a97e7e:[function(){return n.e(7858).then(n.bind(n,55984))},"@site/../docs/learn/xcm/quickstart/xcm-simulator.md",55984],d6b0148d:[function(){return n.e(5548).then(n.bind(n,7926))},"@site/../docs/learn/xcm/journey/origins.md",7926],d6d2b2d5:[function(){return Promise.all([n.e(1122),n.e(2483)]).then(n.bind(n,41973))},"@site/../docs/maintain/maintain-guides-how-to-vote-councillor.md",41973],d9ef69a7:[function(){return n.e(1786).then(n.bind(n,4245))},"@site/../docs/general/contributors.md",4245],da9f79cb:[function(){return Promise.all([n.e(1122),n.e(2248)]).then(n.bind(n,92916))},"@site/../docs/learn/learn-nomination-pools.md",92916],db039c7f:[function(){return n.e(5103).then(n.bind(n,50740))},"@site/../docs/learn/xcm/overview/format.md",50740],db0b42b0:[function(){return n.e(2609).then(n.bind(n,64271))},"@site/../docs/learn/learn-sassafras.md",64271],db3d6c4d:[function(){return n.e(7313).then(n.bind(n,1171))},"@site/../docs/learn/learn-account-abstraction.md",1171],dbbd9e76:[function(){return n.e(3669).then(n.bind(n,69156))},"@site/../docs/learn/learn-guides-vault.md",69156],dbc4065c:[function(){return n.e(6312).then(n.t.bind(n,8654,19))},"~docs/default/category-docs-docs-category-tokens-and-assets-d90.json",8654],dc776cbc:[function(){return n.e(9764).then(n.bind(n,8117))},"@site/../docs/general/thousand-contributors.md",8117],dd32e389:[function(){return n.e(2042).then(n.bind(n,63689))},"@site/../docs/general/polkadot-vault.md",63689],df154d69:[function(){return n.e(1957).then(n.bind(n,15474))},"@site/../docs/learn/learn-xcm.md",15474],e2e89062:[function(){return n.e(2633).then(n.bind(n,81843))},"@site/../docs/learn/learn-proxies-pure.md",81843],e31fc461:[function(){return n.e(3330).then(n.bind(n,60682))},"@site/../docs/learn/xcm/learn-xcm-docs-intro.md",60682],e344dd79:[function(){return n.e(9276).then(n.t.bind(n,71462,19))},"~docs/default/category-docs-docs-category-polkadots-architecture-348.json",71462],e4f3654b:[function(){return n.e(8618).then(n.bind(n,22610))},"@site/../docs/learn/learn-extrinsics.md",22610],ec3b6a32:[function(){return n.e(4004).then(n.bind(n,56794))},"@site/../docs/learn/learn-nft.md",56794],ecb495b7:[function(){return n.e(2136).then(n.bind(n,82956))},"@site/../docs/maintain/maintain-guides-how-to-systemd.md",82956],ece9fdae:[function(){return n.e(2677).then(n.bind(n,81862))},"@site/../docs/general/community.md",81862],eef3f1dd:[function(){return Promise.all([n.e(1122),n.e(4097)]).then(n.bind(n,7522))},"@site/../docs/learn/learn-guides-treasury.md",7522],f0855ff9:[function(){return n.e(4909).then(n.bind(n,9012))},"@site/../docs/general/kusama/kusama-index.md",9012],f137ce68:[function(){return Promise.all([n.e(532),n.e(3620)]).then(n.bind(n,2137))},"@site/../docs/learn/learn-xcm-instructions.md",2137],f14351c1:[function(){return n.e(3356).then(n.t.bind(n,2551,19))},"~docs/default/category-docs-docs-category-components-a98.json",2551],f1585bfb:[function(){return n.e(3665).then(n.bind(n,43507))},"@site/../docs/learn/xcm/quickstart/summary.md",43507],f189ca9f:[function(){return n.e(192).then(n.bind(n,20458))},"@site/../docs/learn/learn-spree.md",20458],f2521980:[function(){return Promise.all([n.e(1122),n.e(6689)]).then(n.bind(n,24595))},"@site/../docs/general/getting-started.md",24595],f2717f8e:[function(){return n.e(250).then(n.bind(n,96879))},"@site/../docs/general/builders-program.md",96879],f2c21b54:[function(){return n.e(4363).then(n.bind(n,3011))},"@site/../docs/build/build-storage.md",3011],f3027c84:[function(){return n.e(2242).then(n.bind(n,3361))},"@site/../docs/general/polkadotjs-ui.md",3361],f359a251:[function(){return n.e(1239).then(n.bind(n,15759))},"@site/../docs/maintain/maintain-endpoints.md",15759],f3bde756:[function(){return n.e(2704).then(n.bind(n,84741))},"@site/../docs/maintain/maintain-bootnode.md",84741],f4003c83:[function(){return Promise.all([n.e(1122),n.e(4476)]).then(n.bind(n,19084))},"@site/../docs/learn/learn-governance.md",19084],f4130007:[function(){return n.e(2665).then(n.bind(n,86975))},"@site/../docs/general/wallets-and-extensions.md",86975],f41c4e9d:[function(){return n.e(4666).then(n.bind(n,32036))},"@site/../docs/learn/learn-xcm-pallet.md",32036],f4200fe5:[function(){return Promise.all([n.e(532),n.e(2909)]).then(n.bind(n,31101))},"@site/../docs/maintain/maintain-sync.md",31101],f44ed8f8:[function(){return n.e(7211).then(n.bind(n,71294))},"@site/../docs/build/build-hrmp-channels.md",71294],f47489cd:[function(){return n.e(1966).then(n.bind(n,11611))},"@site/../docs/learn/learn-runtime-upgrades.md",11611],f4fb6e9c:[function(){return n.e(1).then(n.t.bind(n,40132,19))},"~docs/default/category-docs-docs-category-a-journey-through-xcm-9f8.json",40132],f7191335:[function(){return n.e(1686).then(n.t.bind(n,1691,19))},"~docs/default/category-docs-docs-category-general-cbc.json",1691],f750c690:[function(){return n.e(1419).then(n.bind(n,91251))},"@site/../docs/learn/learn-nft-pallets.md",91251],f7acb151:[function(){return Promise.all([n.e(1122),n.e(5483)]).then(n.bind(n,49736))},"@site/../docs/learn/learn-guides-assets-create.md",49736],f8518919:[function(){return n.e(3945).then(n.bind(n,51094))},"@site/../docs/general/web3-and-polkadot.md",51094],f90fa732:[function(){return n.e(1062).then(n.bind(n,71358))},"@site/../docs/build/build-data.md",71358],f95cee6f:[function(){return n.e(9548).then(n.bind(n,24195))},"@site/../docs/maintain/maintain-guides-best-practices-to-avoid-slashes.md",24195],fa343ad1:[function(){return n.e(1678).then(n.bind(n,42352))},"@site/../docs/learn/xcm/fundamentals/weight_and_fees.md",42352],fabebe44:[function(){return n.e(1288).then(n.bind(n,38993))},"@site/../docs/general/dev-heroes.md",38993],fac80962:[function(){return n.e(3944).then(n.bind(n,96238))},"@site/../docs/learn/learn-account-generation.md",96238],fbea1897:[function(){return n.e(7280).then(n.bind(n,56025))},"@site/../docs/learn/learn-launch.md",56025],fbf58567:[function(){return n.e(5989).then(n.t.bind(n,46599,19))},"~docs/default/category-docs-docs-category-xcm-documentation-30c.json",46599],fea93377:[function(){return Promise.all([n.e(1122),n.e(6730)]).then(n.bind(n,26029))},"@site/../docs/maintain/maintain-guides-validator-payout.md",26029],fecdcc34:[function(){return n.e(8034).then(n.bind(n,26269))},"@site/../docs/learn/xcm/journey/version.md",26269],feea648c:[function(){return n.e(7061).then(n.bind(n,39966))},"@site/../docs/learn/learn-xcvm.md",39966],ff6596ea:[function(){return Promise.all([n.e(1122),n.e(3842)]).then(n.bind(n,25398))},"@site/../docs/learn/learn-nominator.md",25398],ffd76171:[function(){return n.e(8236).then(n.bind(n,88559))},"@site/../docs/maintain/maintain-index.md",88559],ffe9c3c9:[function(){return Promise.all([n.e(1122),n.e(1529)]).then(n.bind(n,64204))},"@site/../docs/learn/learn-DOT.md",64204]};function l(e){var t=e.error,n=e.retry,a=e.pastDelay;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var u=n(99670),d=n(30226);function f(e,t){if("*"===e)return i()({loading:l,loader:function(){return n.e(4972).then(n.bind(n,4972))},modules:["@theme/NotFound"],webpack:function(){return[4972]},render:function(e,t){var n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});var o=s[e+"-"+t],f={},p=[],m=[],h=(0,u.Z)(o);return Object.entries(h).forEach((function(e){var t=e[0],n=e[1],r=c[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:l,loader:f,modules:p,webpack:function(){return m},render:function(t,n){var i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((function(t){var n=t[0],r=t[1],a=r.default;if(!a)throw new Error("The page component at "+e+" doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.");"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((function(e){return"default"!==e})).forEach((function(e){a[e]=r[e]}));var o=i,s=n.split(".");s.slice(0,-1).forEach((function(e){o=o[e]})),o[s[s.length-1]]=a}));var s=i.__comp;delete i.__comp;var c=i.__context;return delete i.__context,r.createElement(d.z,{value:c},r.createElement(s,(0,a.Z)({},i,n)))}})}const p=[{path:"/search",component:f("/search","740"),exact:!0},{path:"/docs",component:f("/docs","12a"),routes:[{path:"/docs/ambassadors",component:f("/docs/ambassadors","afd"),exact:!0,sidebar:"docs"},{path:"/docs/bug-bounty",component:f("/docs/bug-bounty","bab"),exact:!0,sidebar:"docs"},{path:"/docs/build-data",component:f("/docs/build-data","c63"),exact:!0,sidebar:"docs"},{path:"/docs/build-guide",component:f("/docs/build-guide","4c0"),exact:!0,sidebar:"docs"},{path:"/docs/build-hackathon",component:f("/docs/build-hackathon","170"),exact:!0,sidebar:"docs"},{path:"/docs/build-hrmp-channels",component:f("/docs/build-hrmp-channels","9d7"),exact:!0,sidebar:"docs"},{path:"/docs/build-index",component:f("/docs/build-index","a82"),exact:!0,sidebar:"docs"},{path:"/docs/build-integrate-assets",component:f("/docs/build-integrate-assets","521"),exact:!0,sidebar:"docs"},{path:"/docs/build-integration",component:f("/docs/build-integration","0e9"),exact:!0,sidebar:"docs"},{path:"/docs/build-node-interaction",component:f("/docs/build-node-interaction","26d"),exact:!0,sidebar:"docs"},{path:"/docs/build-node-management",component:f("/docs/build-node-management","033"),exact:!0,sidebar:"docs"},{path:"/docs/build-open-source",component:f("/docs/build-open-source","d93"),exact:!0,sidebar:"docs"},{path:"/docs/build-oracle",component:f("/docs/build-oracle","66f"),exact:!0,sidebar:"docs"},{path:"/docs/build-pdk",component:f("/docs/build-pdk","841"),exact:!0,sidebar:"docs"},{path:"/docs/build-protocol-info",component:f("/docs/build-protocol-info","d4a"),exact:!0,sidebar:"docs"},{path:"/docs/build-smart-contracts",component:f("/docs/build-smart-contracts","4b8"),exact:!0,sidebar:"docs"},{path:"/docs/build-ss58-registry",component:f("/docs/build-ss58-registry","62f"),exact:!0,sidebar:"docs"},{path:"/docs/build-storage",component:f("/docs/build-storage","47b"),exact:!0,sidebar:"docs"},{path:"/docs/build-substrate",component:f("/docs/build-substrate","206"),exact:!0,sidebar:"docs"},{path:"/docs/build-tools-index",component:f("/docs/build-tools-index","410"),exact:!0,sidebar:"docs"},{path:"/docs/build-transaction-construction",component:f("/docs/build-transaction-construction","d68"),exact:!0,sidebar:"docs"},{path:"/docs/builders-program",component:f("/docs/builders-program","41f"),exact:!0,sidebar:"docs"},{path:"/docs/community",component:f("/docs/community","b89"),exact:!0,sidebar:"docs"},{path:"/docs/community-index",component:f("/docs/community-index","c5c"),exact:!0,sidebar:"docs"},{path:"/docs/contributing",component:f("/docs/contributing","677"),exact:!0,sidebar:"docs"},{path:"/docs/contributors",component:f("/docs/contributors","1e6"),exact:!0,sidebar:"docs"},{path:"/docs/dashboards-index",component:f("/docs/dashboards-index","d3f"),exact:!0,sidebar:"docs"},{path:"/docs/dev-heroes",component:f("/docs/dev-heroes","4e8"),exact:!0,sidebar:"docs"},{path:"/docs/faq",component:f("/docs/faq","e21"),exact:!0,sidebar:"docs"},{path:"/docs/general-index",component:f("/docs/general-index","84d"),exact:!0,sidebar:"docs"},{path:"/docs/getting-started",component:f("/docs/getting-started","6f8"),exact:!0,sidebar:"docs"},{path:"/docs/glossary",component:f("/docs/glossary","5f2"),exact:!0,sidebar:"docs"},{path:"/docs/grants",component:f("/docs/grants","240"),exact:!0,sidebar:"docs"},{path:"/docs/how-to-dyor",component:f("/docs/how-to-dyor","3d9"),exact:!0,sidebar:"docs"},{path:"/docs/kusama-adversarial-cheatsheet",component:f("/docs/kusama-adversarial-cheatsheet","ff3"),exact:!0},{path:"/docs/kusama-bug-bounty",component:f("/docs/kusama-bug-bounty","c07"),exact:!0},{path:"/docs/kusama-claims",component:f("/docs/kusama-claims","b28"),exact:!0},{path:"/docs/kusama-coc",component:f("/docs/kusama-coc","302"),exact:!0},{path:"/docs/kusama-community",component:f("/docs/kusama-community","c98"),exact:!0},{path:"/docs/kusama-getting-started",component:f("/docs/kusama-getting-started","bd7"),exact:!0},{path:"/docs/kusama-index",component:f("/docs/kusama-index","eeb"),exact:!0},{path:"/docs/kusama-parameters",component:f("/docs/kusama-parameters","a62"),exact:!0},{path:"/docs/kusama-social-recovery",component:f("/docs/kusama-social-recovery","62f"),exact:!0},{path:"/docs/kusama-timeline",component:f("/docs/kusama-timeline","288"),exact:!0},{path:"/docs/learn-account-abstraction",component:f("/docs/learn-account-abstraction","962"),exact:!0,sidebar:"docs"},{path:"/docs/learn-account-advanced",component:f("/docs/learn-account-advanced","c5d"),exact:!0,sidebar:"docs"},{path:"/docs/learn-account-generation",component:f("/docs/learn-account-generation","a11"),exact:!0,sidebar:"docs"},{path:"/docs/learn-account-multisig",component:f("/docs/learn-account-multisig","f7c"),exact:!0,sidebar:"docs"},{path:"/docs/learn-accounts",component:f("/docs/learn-accounts","9c2"),exact:!0,sidebar:"docs"},{path:"/docs/learn-accounts-index",component:f("/docs/learn-accounts-index","6b7"),exact:!0,sidebar:"docs"},{path:"/docs/learn-advanced-index",component:f("/docs/learn-advanced-index","66f"),exact:!0,sidebar:"docs"},{path:"/docs/learn-architecture",component:f("/docs/learn-architecture","fa2"),exact:!0,sidebar:"docs"},{path:"/docs/learn-architecture-index",component:f("/docs/learn-architecture-index","f6c"),exact:!0,sidebar:"docs"},{path:"/docs/learn-archive-index",component:f("/docs/learn-archive-index","130"),exact:!0,sidebar:"docs"},{path:"/docs/learn-assets",component:f("/docs/learn-assets","71c"),exact:!0,sidebar:"docs"},{path:"/docs/learn-assets-index",component:f("/docs/learn-assets-index","980"),exact:!0,sidebar:"docs"},{path:"/docs/learn-async-backing",component:f("/docs/learn-async-backing","8d8"),exact:!0,sidebar:"docs"},{path:"/docs/learn-auction",component:f("/docs/learn-auction","5f7"),exact:!0,sidebar:"docs"},{path:"/docs/learn-balance-transfers",component:f("/docs/learn-balance-transfers","48e"),exact:!0,sidebar:"docs"},{path:"/docs/learn-basics-index",component:f("/docs/learn-basics-index","90b"),exact:!0,sidebar:"docs"},{path:"/docs/learn-bridges",component:f("/docs/learn-bridges","fc1"),exact:!0,sidebar:"docs"},{path:"/docs/learn-collator",component:f("/docs/learn-collator","8d9"),exact:!0,sidebar:"docs"},{path:"/docs/learn-comparisons",component:f("/docs/learn-comparisons","ef1"),exact:!0,sidebar:"docs"},{path:"/docs/learn-comparisons-avalanche",component:f("/docs/learn-comparisons-avalanche","6f0"),exact:!0,sidebar:"docs"},{path:"/docs/learn-comparisons-cosmos",component:f("/docs/learn-comparisons-cosmos","72c"),exact:!0,sidebar:"docs"},{path:"/docs/learn-comparisons-ethereum-2",component:f("/docs/learn-comparisons-ethereum-2","af0"),exact:!0,sidebar:"docs"},{path:"/docs/learn-comparisons-index",component:f("/docs/learn-comparisons-index","3a8"),exact:!0,sidebar:"docs"},{path:"/docs/learn-comparisons-kusama",component:f("/docs/learn-comparisons-kusama","de0"),exact:!0,sidebar:"docs"},{path:"/docs/learn-comparisons-rollups",component:f("/docs/learn-comparisons-rollups","656"),exact:!0,sidebar:"docs"},{path:"/docs/learn-components-index",component:f("/docs/learn-components-index","565"),exact:!0,sidebar:"docs"},{path:"/docs/learn-consensus",component:f("/docs/learn-consensus","c72"),exact:!0,sidebar:"docs"},{path:"/docs/learn-controller",component:f("/docs/learn-controller","e68"),exact:!0,sidebar:"docs"},{path:"/docs/learn-crowdloans",component:f("/docs/learn-crowdloans","98f"),exact:!0,sidebar:"docs"},{path:"/docs/learn-cryptography",component:f("/docs/learn-cryptography","3de"),exact:!0,sidebar:"docs"},{path:"/docs/learn-DOT",component:f("/docs/learn-DOT","913"),exact:!0,sidebar:"docs"},{path:"/docs/learn-extrinsics",component:f("/docs/learn-extrinsics","950"),exact:!0,sidebar:"docs"},{path:"/docs/learn-future-implementations-index",component:f("/docs/learn-future-implementations-index","d18"),exact:!0,sidebar:"docs"},{path:"/docs/learn-governance",component:f("/docs/learn-governance","e59"),exact:!0,sidebar:"docs"},{path:"/docs/learn-guides-assets-create",component:f("/docs/learn-guides-assets-create","dd9"),exact:!0,sidebar:"docs"},{path:"/docs/learn-guides-assets-index",component:f("/docs/learn-guides-assets-index","525"),exact:!0,sidebar:"docs"},{path:"/docs/learn-guides-assets-ledger",component:f("/docs/learn-guides-assets-ledger","1f0"),exact:!0,sidebar:"docs"},{path:"/docs/learn-guides-identity",component:f("/docs/learn-guides-identity","9f1"),exact:!0,sidebar:"docs"},{path:"/docs/learn-guides-index",component:f("/docs/learn-guides-index","cb6"),exact:!0,sidebar:"docs"},{path:"/docs/learn-guides-polkadot-opengov",component:f("/docs/learn-guides-polkadot-opengov","097"),exact:!0,sidebar:"docs"},{path:"/docs/learn-guides-staking",component:f("/docs/learn-guides-staking","e1a"),exact:!0,sidebar:"docs"},{path:"/docs/learn-guides-staking-index",component:f("/docs/learn-guides-staking-index","934"),exact:!0,sidebar:"docs"},{path:"/docs/learn-guides-staking-pools",component:f("/docs/learn-guides-staking-pools","8e8"),exact:!0,sidebar:"docs"},{path:"/docs/learn-guides-treasury",component:f("/docs/learn-guides-treasury","45a"),exact:!0,sidebar:"docs"},{path:"/docs/learn-guides-vault",component:f("/docs/learn-guides-vault","407"),exact:!0,sidebar:"docs"},{path:"/docs/learn-identity",component:f("/docs/learn-identity","414"),exact:!0,sidebar:"docs"},{path:"/docs/learn-implementations",component:f("/docs/learn-implementations","a5b"),exact:!0},{path:"/docs/learn-index",component:f("/docs/learn-index","706"),exact:!0,sidebar:"docs"},{path:"/docs/learn-inflation",component:f("/docs/learn-inflation","5ea"),exact:!0,sidebar:"docs"},{path:"/docs/learn-launch",component:f("/docs/learn-launch","6e9"),exact:!0,sidebar:"docs"},{path:"/docs/learn-nft",component:f("/docs/learn-nft","4b1"),exact:!0,sidebar:"docs"},{path:"/docs/learn-nft-index",component:f("/docs/learn-nft-index","048"),exact:!0,sidebar:"docs"},{path:"/docs/learn-nft-pallets",component:f("/docs/learn-nft-pallets","8ea"),exact:!0,sidebar:"docs"},{path:"/docs/learn-nft-projects",component:f("/docs/learn-nft-projects","18f"),exact:!0,sidebar:"docs"},{path:"/docs/learn-nomination-pools",component:f("/docs/learn-nomination-pools","964"),exact:!0,sidebar:"docs"},{path:"/docs/learn-nominator",component:f("/docs/learn-nominator","5fc"),exact:!0,sidebar:"docs"},{path:"/docs/learn-parachains",component:f("/docs/learn-parachains","0d1"),exact:!0,sidebar:"docs"},{path:"/docs/learn-parachains-faq",component:f("/docs/learn-parachains-faq","eed"),exact:!0,sidebar:"docs"},{path:"/docs/learn-parachains-index",component:f("/docs/learn-parachains-index","4e5"),exact:!0,sidebar:"docs"},{path:"/docs/learn-parachains-protocol",component:f("/docs/learn-parachains-protocol","f2b"),exact:!0,sidebar:"docs"},{path:"/docs/learn-parathreads",component:f("/docs/learn-parathreads","03d"),exact:!0,sidebar:"docs"},{path:"/docs/learn-participants-index",component:f("/docs/learn-participants-index","b1a"),exact:!0,sidebar:"docs"},{path:"/docs/learn-phragmen",component:f("/docs/learn-phragmen","c5c"),exact:!0,sidebar:"docs"},{path:"/docs/learn-polkadot-host",component:f("/docs/learn-polkadot-host","48e"),exact:!0,sidebar:"docs"},{path:"/docs/learn-polkadot-opengov",component:f("/docs/learn-polkadot-opengov","ecc"),exact:!0,sidebar:"docs"},{path:"/docs/learn-polkadot-opengov-treasury",component:f("/docs/learn-polkadot-opengov-treasury","582"),exact:!0,sidebar:"docs"},{path:"/docs/learn-proxies",component:f("/docs/learn-proxies","92e"),exact:!0,sidebar:"docs"},{path:"/docs/learn-proxies-pure",component:f("/docs/learn-proxies-pure","b02"),exact:!0,sidebar:"docs"},{path:"/docs/learn-redenomination",component:f("/docs/learn-redenomination","0ff"),exact:!0,sidebar:"docs"},{path:"/docs/learn-runtime-upgrades",component:f("/docs/learn-runtime-upgrades","8e7"),exact:!0,sidebar:"docs"},{path:"/docs/learn-sassafras",component:f("/docs/learn-sassafras","11d"),exact:!0,sidebar:"docs"},{path:"/docs/learn-scams",component:f("/docs/learn-scams","f1c"),exact:!0,sidebar:"docs"},{path:"/docs/learn-spree",component:f("/docs/learn-spree","14e"),exact:!0,sidebar:"docs"},{path:"/docs/learn-staking",component:f("/docs/learn-staking","183"),exact:!0,sidebar:"docs"},{path:"/docs/learn-staking-advanced",component:f("/docs/learn-staking-advanced","089"),exact:!0,sidebar:"docs"},{path:"/docs/learn-staking-index",component:f("/docs/learn-staking-index","cfb"),exact:!0,sidebar:"docs"},{path:"/docs/learn-system-chains",component:f("/docs/learn-system-chains","29d"),exact:!0,sidebar:"docs"},{path:"/docs/learn-teleport",component:f("/docs/learn-teleport","814"),exact:!0,sidebar:"docs"},{path:"/docs/learn-transaction-fees",component:f("/docs/learn-transaction-fees","42e"),exact:!0,sidebar:"docs"},{path:"/docs/learn-transactions-index",component:f("/docs/learn-transactions-index","a4f"),exact:!0,sidebar:"docs"},{path:"/docs/learn-treasury",component:f("/docs/learn-treasury","ba6"),exact:!0,sidebar:"docs"},{path:"/docs/learn-validator",component:f("/docs/learn-validator","cae"),exact:!0,sidebar:"docs"},{path:"/docs/learn-video-tutorials",component:f("/docs/learn-video-tutorials","a9e"),exact:!0,sidebar:"docs"},{path:"/docs/learn-wasm",component:f("/docs/learn-wasm","16e"),exact:!0,sidebar:"docs"},{path:"/docs/learn-xcm",component:f("/docs/learn-xcm","f30"),exact:!0,sidebar:"docs"},{path:"/docs/learn-xcm-index",component:f("/docs/learn-xcm-index","90a"),exact:!0,sidebar:"docs"},{path:"/docs/learn-xcm-instructions",component:f("/docs/learn-xcm-instructions","82b"),exact:!0,sidebar:"docs"},{path:"/docs/learn-xcm-pallet",component:f("/docs/learn-xcm-pallet","c28"),exact:!0,sidebar:"docs"},{path:"/docs/learn-xcm-transport",component:f("/docs/learn-xcm-transport","b2a"),exact:!0,sidebar:"docs"},{path:"/docs/learn-xcm-usecases",component:f("/docs/learn-xcm-usecases","4fd"),exact:!0,sidebar:"docs"},{path:"/docs/learn-xcvm",component:f("/docs/learn-xcvm","db4"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm",component:f("/docs/learn/xcm","b7a"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/config-deep-dive",component:f("/docs/learn/xcm/config-deep-dive","e68"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/fundamentals",component:f("/docs/learn/xcm/fundamentals","e35"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/fundamentals-fees",component:f("/docs/learn/xcm/fundamentals-fees","80a"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/fundamentals-multiasset",component:f("/docs/learn/xcm/fundamentals-multiasset","ead"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/fundamentals-summary",component:f("/docs/learn/xcm/fundamentals-summary","1e3"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/fundamentals-xcvm",component:f("/docs/learn/xcm/fundamentals-xcvm","752"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/fundamentals/multilocation",component:f("/docs/learn/xcm/fundamentals/multilocation","f7c"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/fundamentals/multilocation-example",component:f("/docs/learn/xcm/fundamentals/multilocation-example","9c5"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/fundamentals/multilocation-junctions",component:f("/docs/learn/xcm/fundamentals/multilocation-junctions","776"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/fundamentals/multilocation-summary",component:f("/docs/learn/xcm/fundamentals/multilocation-summary","6f7"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/introduction",component:f("/docs/learn/xcm/introduction","e34"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/journey",component:f("/docs/learn/xcm/journey","ac5"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/journey-assets",component:f("/docs/learn/xcm/journey-assets","f26"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/journey-channels",component:f("/docs/learn/xcm/journey-channels","ae8"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/journey-expectations",component:f("/docs/learn/xcm/journey-expectations","a11"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/journey-fees",component:f("/docs/learn/xcm/journey-fees","1e0"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/journey-holding",component:f("/docs/learn/xcm/journey-holding","914"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/journey-locks",component:f("/docs/learn/xcm/journey-locks","f94"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/journey-origin",component:f("/docs/learn/xcm/journey-origin","4f3"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/journey-queries",component:f("/docs/learn/xcm/journey-queries","3fb"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/journey-register",component:f("/docs/learn/xcm/journey-register","e9c"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/journey-summary",component:f("/docs/learn/xcm/journey-summary","2a4"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/journey-transact",component:f("/docs/learn/xcm/journey-transact","283"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/journey-version",component:f("/docs/learn/xcm/journey-version","c0d"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/journey/transfers",component:f("/docs/learn/xcm/journey/transfers","454"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/journey/transfers-reserve",component:f("/docs/learn/xcm/journey/transfers-reserve","5ce"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/journey/transfers-summary",component:f("/docs/learn/xcm/journey/transfers-summary","e08"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/journey/transfers-teleport",component:f("/docs/learn/xcm/journey/transfers-teleport","85b"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/overview",component:f("/docs/learn/xcm/overview","c0f"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/overview-architecture",component:f("/docs/learn/xcm/overview-architecture","7ec"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/overview-format",component:f("/docs/learn/xcm/overview-format","d5c"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/overview-intro",component:f("/docs/learn/xcm/overview-intro","529"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/overview-summary",component:f("/docs/learn/xcm/overview-summary","ffd"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/overview-xcvm",component:f("/docs/learn/xcm/overview-xcvm","9ad"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/quickstart",component:f("/docs/learn/xcm/quickstart","c96"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/quickstart-first-look",component:f("/docs/learn/xcm/quickstart-first-look","c89"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/quickstart-simulator",component:f("/docs/learn/xcm/quickstart-simulator","d3a"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/quickstart-summary",component:f("/docs/learn/xcm/quickstart-summary","e79"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/reference-glossary",component:f("/docs/learn/xcm/reference-glossary","e83"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/reference-xcvm-registers",component:f("/docs/learn/xcm/reference-xcvm-registers","ceb"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/references",component:f("/docs/learn/xcm/references","103"),exact:!0,sidebar:"docs"},{path:"/docs/learn/xcm/testing",component:f("/docs/learn/xcm/testing","0a7"),exact:!0,sidebar:"docs"},{path:"/docs/ledger",component:f("/docs/ledger","50e"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-bootnode",component:f("/docs/maintain-bootnode","294"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-endpoints",component:f("/docs/maintain-endpoints","31b"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-errors",component:f("/docs/maintain-errors","92e"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-guides-avoid-slashing",component:f("/docs/maintain-guides-avoid-slashing","578"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-guides-democracy",component:f("/docs/maintain-guides-democracy","740"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-guides-how-to-chill",component:f("/docs/maintain-guides-how-to-chill","668"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-guides-how-to-join-council",component:f("/docs/maintain-guides-how-to-join-council","9c3"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-guides-how-to-monitor-your-node",component:f("/docs/maintain-guides-how-to-monitor-your-node","bdd"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-guides-how-to-nominate-kusama",component:f("/docs/maintain-guides-how-to-nominate-kusama","f8d"),exact:!0},{path:"/docs/maintain-guides-how-to-nominate-polkadot",component:f("/docs/maintain-guides-how-to-nominate-polkadot","52a"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-guides-how-to-stop-validating",component:f("/docs/maintain-guides-how-to-stop-validating","993"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-guides-how-to-systemd",component:f("/docs/maintain-guides-how-to-systemd","3e8"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-guides-how-to-upgrade",component:f("/docs/maintain-guides-how-to-upgrade","f9d"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-guides-how-to-validate-kusama",component:f("/docs/maintain-guides-how-to-validate-kusama","eb0"),exact:!0},{path:"/docs/maintain-guides-how-to-validate-polkadot",component:f("/docs/maintain-guides-how-to-validate-polkadot","e43"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-guides-how-to-vote-councillor",component:f("/docs/maintain-guides-how-to-vote-councillor","050"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-guides-polkadot-opengov",component:f("/docs/maintain-guides-polkadot-opengov","751"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-guides-secure-validator",component:f("/docs/maintain-guides-secure-validator","310"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-guides-society-kusama",component:f("/docs/maintain-guides-society-kusama","6d3"),exact:!0},{path:"/docs/maintain-guides-validator-community",component:f("/docs/maintain-guides-validator-community","18d"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-guides-validator-payout",component:f("/docs/maintain-guides-validator-payout","712"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-index",component:f("/docs/maintain-index","d6e"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-networks",component:f("/docs/maintain-networks","234"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-polkadot-parameters",component:f("/docs/maintain-polkadot-parameters","5d7"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-rpc",component:f("/docs/maintain-rpc","f10"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-sync",component:f("/docs/maintain-sync","fd0"),exact:!0,sidebar:"docs"},{path:"/docs/maintain-wss",component:f("/docs/maintain-wss","7f4"),exact:!0,sidebar:"docs"},{path:"/docs/metadata",component:f("/docs/metadata","ba9"),exact:!0,sidebar:"docs"},{path:"/docs/polkadot-direction",component:f("/docs/polkadot-direction","2f6"),exact:!0,sidebar:"docs"},{path:"/docs/polkadot-v1",component:f("/docs/polkadot-v1","770"),exact:!0,sidebar:"docs"},{path:"/docs/polkadot-vault",component:f("/docs/polkadot-vault","d52"),exact:!0,sidebar:"docs"},{path:"/docs/polkadot-vision-index",component:f("/docs/polkadot-vision-index","3c3"),exact:!0,sidebar:"docs"},{path:"/docs/polkadotjs",component:f("/docs/polkadotjs","516"),exact:!0,sidebar:"docs"},{path:"/docs/polkadotjs-ui",component:f("/docs/polkadotjs-ui","884"),exact:!0,sidebar:"docs"},{path:"/docs/programmes-index",component:f("/docs/programmes-index","233"),exact:!0,sidebar:"docs"},{path:"/docs/research",component:f("/docs/research","5f7"),exact:!0,sidebar:"docs"},{path:"/docs/staking-dashboard",component:f("/docs/staking-dashboard","a9a"),exact:!0,sidebar:"docs"},{path:"/docs/start-building",component:f("/docs/start-building","16a"),exact:!0,sidebar:"docs"},{path:"/docs/stay-safe-index",component:f("/docs/stay-safe-index","580"),exact:!0,sidebar:"docs"},{path:"/docs/thousand-contributors",component:f("/docs/thousand-contributors","9ba"),exact:!0,sidebar:"docs"},{path:"/docs/thousand-validators",component:f("/docs/thousand-validators","053"),exact:!0,sidebar:"docs"},{path:"/docs/wallets-and-extensions",component:f("/docs/wallets-and-extensions","e5f"),exact:!0,sidebar:"docs"},{path:"/docs/wallets-index",component:f("/docs/wallets-index","656"),exact:!0,sidebar:"docs"},{path:"/docs/web3-and-polkadot",component:f("/docs/web3-and-polkadot","85e"),exact:!0,sidebar:"docs"}]},{path:"/",component:f("/","7cb"),exact:!0},{path:"*",component:f("*")}]},94184:(e,t)=>{var n;!function(){"use strict";var r={}.hasOwnProperty;function a(){for(var e=[],t=0;t{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>x,q_:()=>C,ob:()=>p,PP:()=>A,Ep:()=>f});var r=n(87462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!l)for(;d--;d)i.unshift("..");!l||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var s=n(38776);function c(e){return"/"===e.charAt(0)?e:"/"+e}function l(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,h(),x.location);u.confirmTransitionTo(a,r,n,(function(e){e&&(x.entries[x.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=x.index+e;return t>=0&&t{"use strict";var r=n(59864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function c(e){return r.isMemo(e)?i:s[e.$$typeof]||a}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var l=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=c(t),h=c(n),g=0;g{"use strict";e.exports=function(e,t,n,r,a,o,i,s){if(!e){var c;if(void 0===t)c=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var l=[n,r,a,o,i,s],u=0;(c=new Error(t.replace(/%s/g,(function(){return l[u++]})))).name="Invariant Violation"}throw c.framesToPop=1,c}}},32497:(e,t,n)=>{"use strict";n.r(t)},32104:(e,t,n)=>{"use strict";n.r(t)},39604:(e,t,n)=>{"use strict";n.r(t)},70378:(e,t,n)=>{"use strict";n.r(t)},74865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),l=o.querySelector(r.barSelector),u=r.speed,d=r.easing;return o.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),c(l,i(e,u,d)),1===e?(c(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){c(o,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),s=e?"-100":o(n.status||0),l=document.querySelector(r.parent);return c(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),l!=document.body&&u(l,"nprogress-custom-parent"),l.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),c=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function l(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=f(e),r=n+t;l(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);l(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},27418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,a){for(var o,i,s=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),c=1;c{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);E+=w.value.length,w=w.next){var _=w.value;if(t.length>e.length)return;if(!(_ instanceof a)){var S,C=1;if(v){if(!(S=o(k,E,e,b))||S.index>=e.length)break;var T=S.index,A=S.index+S[0].length,P=E;for(P+=w.value.length;T>=P;)P+=(w=w.next).value.length;if(E=P-=w.value.length,w.value instanceof a)continue;for(var O=w;O!==t.tail&&(Pd.reach&&(d.reach=R);var j=w.prev;if(N&&(j=c(t,j,N),E+=N.length),l(t,j,C),w=c(t,j,new a(f,g?r.tokenize(L,g):L,y,L)),I&&c(t,w,I),C>1){var M={cause:f+","+m,reach:R};i(e,t,n,w.prev,E,M),d&&M.reach>d.reach&&(d.reach=M.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function c(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function l(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},c=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var s=f(/^\{$/,/^\}$/);if(-1===s)continue;for(var c=n;c=0&&p(l,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function c(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function l(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,c(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function u(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,u={},d=c(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=s(i++,r)););return u[n]=a,n})).join(""),n,r),f=Object.keys(u);return i=0,function e(t){for(var n=0;n=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,s=o.indexOf(a);if(-1!==s){++i;var c=o.substring(0,s),d=l(u[a]),p=o.substring(s+a.length),m=[];if(c&&m.push(c),m.push(d),p){var h=[p];e(h),m.push.apply(m,h)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},s=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var c=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(c=i(t[r-1])+c,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",c,null,c)}a.content&&"string"!=typeof a.content&&s(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||s(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,s=i.length;-1!==n.code.indexOf(a=t(r,s));)++s;return i[s]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(s){for(var c=0;c=o.length);c++){var l=s[c];if("string"==typeof l||l.content&&"string"==typeof l.content){var u=o[a],d=n.tokenStack[u],f="string"==typeof l?l:l.content,p=t(r,u),m=f.indexOf(p);if(m>-1){++a;var h=f.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(m+p.length),v=[];h&&v.push.apply(v,i([h])),v.push(g),b&&v.push.apply(v,i([b])),"string"==typeof l?s.splice.apply(s,[c,1].concat(v)):l.content=v}}else l.content&&i(l.content)}return s}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},70767:()=>{!function(e){for(var t=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|)*\*\//.source,n=0;n<2;n++)t=t.replace(//g,(function(){return t}));t=t.replace(//g,(function(){return/[^\s\S]/.source})),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism)},54294:(e,t,n)=>{var r={"./prism-rust":70767};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=54294},92703:(e,t,n)=>{"use strict";var r=n(50414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},45697:(e,t,n)=>{e.exports=n(92703)()},50414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},31555:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l});var r=n(94184),a=n.n(r),o=n(67294),i=n(76792),s=n(85893);const c=o.forwardRef(((e,t)=>{const[{className:n,...r},{as:o="div",bsPrefix:c,spans:l}]=function({as:e,bsPrefix:t,className:n,...r}){t=(0,i.vE)(t,"col");const o=(0,i.pi)(),s=(0,i.zG)(),c=[],l=[];return o.forEach((e=>{const n=r[e];let a,o,i;delete r[e],"object"==typeof n&&null!=n?({span:a,offset:o,order:i}=n):a=n;const u=e!==s?`-${e}`:"";a&&c.push(!0===a?`${t}${u}`:`${t}${u}-${a}`),null!=i&&l.push(`order${u}-${i}`),null!=o&&l.push(`offset${u}-${o}`)})),[{...r,className:a()(n,...c,...l)},{as:e,bsPrefix:t,spans:c}]}(e);return(0,s.jsx)(o,{...r,ref:t,className:a()(n,!l.length&&c)})}));c.displayName="Col";const l=c},10682:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l});var r=n(94184),a=n.n(r),o=n(67294),i=n(76792),s=n(85893);const c=o.forwardRef((({bsPrefix:e,fluid:t=!1,as:n="div",className:r,...o},c)=>{const l=(0,i.vE)(e,"container"),u="string"==typeof t?`-${t}`:"-fluid";return(0,s.jsx)(n,{ref:c,...o,className:a()(r,t?`${l}${u}`:l)})}));c.displayName="Container";const l=c},34051:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l});var r=n(94184),a=n.n(r),o=n(67294),i=n(76792),s=n(85893);const c=o.forwardRef((({bsPrefix:e,className:t,as:n="div",...r},o)=>{const c=(0,i.vE)(e,"row"),l=(0,i.pi)(),u=(0,i.zG)(),d=`${c}-cols`,f=[];return l.forEach((e=>{const t=r[e];let n;delete r[e],null!=t&&"object"==typeof t?({cols:n}=t):n=t;const a=e!==u?`-${e}`:"";null!=n&&f.push(`${d}${a}-${n}`)})),(0,s.jsx)(n,{ref:o,...r,className:a()(t,c,...f)})}));c.displayName="Row";const l=c},76792:(e,t,n)=>{"use strict";n.d(t,{pi:()=>l,vE:()=>c,zG:()=>u});var r=n(67294);n(85893);const a=["xxl","xl","lg","md","sm","xs"],o=r.createContext({prefixes:{},breakpoints:a,minBreakpoint:"xs"}),{Consumer:i,Provider:s}=o;function c(e,t){const{prefixes:n}=(0,r.useContext)(o);return e||n[t]||t}function l(){const{breakpoints:e}=(0,r.useContext)(o);return e}function u(){const{minBreakpoint:e}=(0,r.useContext)(o);return e}},64448:(e,t,n)=>{"use strict";var r=n(67294),a=n(27418),o=n(63840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n