Liquid Staking via Polkadot.js

This section provides step-by-step instructions for staking and unstaking $EWT through the Liquid Staking Pallet using the Polkadot.js β€œExtrinsics” tab.

Liquid staking allows users to deposit $EWT into a pooled staking system and receive stEWT, a liquid, transferable voucher token that grows in value as staking rewards accumulate. The pallet manages all collator nominations automatically, no manual delegation is required.

Prerequisites

Before interacting with the liquid staking pallet, ensure:

  • You have a funded EWX account with enough $EWT to cover:

    • Your stake amount

    • Transaction fees

  • You have installed the Polkadot.js browser extension, or are using SubWallet / Nova Wallet / Ledger connected to Polkadot.js explorer.

  • You meet the minimum staking requirement (MinStakingAmount).

Liquid Staking

  1. Open Polkadot.js Apps connected to EWX

    1. Open Polkadot JS App and navigate to EWX, or click here to open the URL with the public EWX endpoint.

    2. In the Polkadot JS App go to Developer β†’ Extrinsics.

    3. Click Accounts β†’ Accounts and confirm your account appears and shows your EWT balance.

  2. Submit the Stake Extrinsic

    1. In β€œsubmit the following extrinsic”, select the pallet liquidStaking and select the call stake(amount)

    2. Enter the amount of EWT to stake

      1. Must be β‰₯ MinStakingAmount

      2. The amount should be in Wei (1 EWT = 1 Γ— 10^18 wei = 1000000000000000000)

    3. Submit Transaction β†’ Sign with your wallet

Unstaking

Unstaking via the Liquid Staking Pallet consits of two separate actions:

  1. requestUnstake β†’ burns stEWT and queues your unstake.

  2. claimUnstake β†’ withdraws matured $EWT after the unbonding delay.

Note that the unstaking delay is dynamic. It is determined by both the queue length within the Liquid Staking Pallet and the unstaking delay enforced by the Parachain Staking Pallet, which serves as the minimum delay.

Request Unstake

  1. Go to Developer β†’ Extrinsics

  2. Select the account holding stEWT

  3. Select pallet β†’ liquidStaking

  4. Select extrinsic β†’ requestUnstake(voucherAmount)

  5. Enter the amount of stEWT to redeem.

    1. β‰₯ MinUnstakingAmount

  6. Submit Transaction β†’ Sign

Behind the scenes, the pallet burns stEWT and determines the amount of stEWT owed to the user via the stEWT : EWT exchange rate.

This $EWT amount is then added to the unstake queue to be processed during a later phase in the era, and an Unlock Chunk is created for the user. An Unlock Chunk records the amount of $EWT the user is owed and the era in which it will become claimable, it can be seen as an IOU mapped to each user.

Processing the Request

Towards the end of each era, the pallet batches unstake requests from the queue, selects a collator to unbond from, and submits a single unbond request to that collator. Each batched request updates the corresponding Unlock Chunks, assigning them a future era when the $EWT will become available after the unstaking delay.

After this unstaking delay has passed, the matured $EWT corresponding to these Unlock Chunks is transferred into the Unstaking Pot, where it becomes available for users to claim.

To query the Unstake Request:

  1. Go to Developer β†’ ChainState β†’ Storage

  2. Ensure "Include Option" is toggled on

  3. Select the account holding stEWT

  4. Select pallet β†’ liquidStaking

  5. Select extrinsic β†’ claimableAmount(AccoundId32)

  6. Click "+" icon

  7. Note the $EWT amount and era in which it can be claimed

Claim Unstake

Once an unstake request has been fully processed, matured, and funded in the Unstaking Pot, users can withdraw their $EWT.

  1. Go to Developer β†’ Extrinsics

  2. Select the account holding stEWT

  3. Select pallet β†’ liquidStaking

  4. Select extrinsic β†’ claimUnstake()

  5. Submit Transaction β†’ Sign

The pallet aggregates all Unlock Chunks for the account, the unstake fee is deducted from the balance and the remaining $EWT is transferred from the Unstaking Pot to the user's account and available as free balance, fully liquid.

Viewing Account Balances

Account balances of stEWT and other non-native assets cannot be viewed directly through the Accounts tab in Polkadot.js. Instead the user must query the chain state.

  1. Go to Network β†’ Assets

  2. Take note of the MultiLocation for the stEWT asset

    1. {"parents":0,"interior":{"x2":[{"palletInstance":60},{"generalIndex":1}]}}

  1. Go to Developer β†’ Chain state

  2. Select pallet β†’ assets

  3. Select state query β†’ account(XcmV3MultiLocation, AccountId32)

  4. Input the MultiLocation details for stEWT

    1. parents: 0

    2. Interior: X2

      1. Select PalletInstance

      2. PalletInstance: 60

      3. Select GeneralIndex

      4. GeneralIndex: 1

    3. Select the address of the account

      1. Or, toggle "include option" off to query the balance of all accounts holding the asset.

Transfering stEWT Between Accounts

Transferring stEWT between EWX accounts can be acheived simply through most wallet providers which support the stEWT asset, as one would transfer native $EWT.

Transferring can also be achieved via Polkadot.js, although requires several more steps.

Transferring stEWT via Polkadot.js

  1. Go to Network β†’ Assets

  2. Take note of the MultiLocation for the stEWT asset

    1. {"parents":0,"interior":{"x2":[{"palletInstance":60},{"generalIndex":1}]}}

  3. Go to Developer β†’ Extrinsics

  4. Select pallet β†’ assets

  5. Select extrinsic β†’ approveTransfer(id, delegate, amount)

  6. Input the MultiLocation details for stEWT

    1. parents: 0

    2. Interior: X2

      1. Select PalletInstance

      2. PalletInstance: 60

      3. Select GeneralIndex

      4. GeneralIndex: 1

    3. Select the recipient address

    4. Enter the amount of stEWT to transfer (in wei)

  7. Submit Transaction β†’ Sign

  1. Go to Network β†’ Explorer

  2. Expand the assets.ApprovedTransfer event to find the submitted transfer

Last updated