> ## Documentation Index
> Fetch the complete documentation index at: https://ixoworld-mintlify-9a7944b6.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Manage liquid staking

> Stake and unstake IXO tokens through the liquid staking module to receive stIXO.

The IXO `liquidstake` module lets users stake `uixo` and receive a liquid representation (`stuixo`) that can be transferred and used in bonds, AMMs, and DeFi while underlying delegations earn validator rewards. The module routes stake to a whitelisted validator set with weights, distributes rewards through `weighted_rewards_receivers`, and supports a circuit-breaker pause and burn-to-unstake-instantly for the protocol.

## Before you start

You need:

* An IXO account funded with `uixo` for staking and fees on the network you target — see [Networks and endpoints](/reference/networks-and-endpoints).
* An offline signer — see the [SDK README](https://github.com/ixofoundation/ixo-multiclient-sdk#creating-signers).
* Awareness that governance changes (params, whitelisted validators, reward receivers, pause) require `cosmos.gov.v1.MsgSubmitProposal` wrapping the relevant `MsgUpdate*` message — they are not callable directly by users.

```bash theme={null}
npm install @ixo/impactxclient-sdk
```

```ts theme={null}
import { ixo, createSigningClient } from "@ixo/impactxclient-sdk";

const signingClient = await createSigningClient(RPC_ENDPOINT, offlineSigner);
```

## Stake `uixo` for `stuixo`

```ts theme={null}
const stakeMsg = {
  typeUrl: "/ixo.liquidstake.v1beta1.MsgLiquidStake",
  value: ixo.liquidstake.v1beta1.MsgLiquidStake.fromPartial({
    delegatorAddress: signerAddress,
    amount: { denom: "uixo", amount: "1000000" },
  }),
};

await signingClient.signAndBroadcast(signerAddress, [stakeMsg], "auto");
```

Stake is distributed across the active whitelisted validator set in proportion to their `target_weight`. The minted `stuixo` amount reflects the current `nav` (net asset value) of the staked pool.

## Unstake `stuixo` for `uixo`

```ts theme={null}
const unstakeMsg = {
  typeUrl: "/ixo.liquidstake.v1beta1.MsgLiquidUnstake",
  value: ixo.liquidstake.v1beta1.MsgLiquidUnstake.fromPartial({
    delegatorAddress: signerAddress,
    amount: { denom: "stuixo", amount: "1000000" },
  }),
};

await signingClient.signAndBroadcast(signerAddress, [unstakeMsg], "auto");
```

Unstaking enqueues an unbonding entry in the staking module — the underlying `uixo` is returned after the chain unbonding period.

## Governance-controlled operations

The following messages cannot be broadcast by ordinary users — they must be wrapped in a `cosmos.gov.v1.MsgSubmitProposal` with the `liquidstake` module's authority as the signer.

```ts theme={null}
const updateParamsMsg = ixo.liquidstake.v1beta1.MsgUpdateParams.fromPartial({
  authority: govAuthority,
  params: ixo.liquidstake.v1beta1.Params.fromPartial({
    liquidBondDenom: "stuixo",
  }),
});

const updateValidatorsMsg = ixo.liquidstake.v1beta1.MsgUpdateWhitelistedValidators.fromPartial({
  authority: govAuthority,
  whitelistedValidators: [
    ixo.liquidstake.v1beta1.WhitelistedValidator.fromPartial({
      validatorAddress: "ixovaloper1...",
      targetWeight: "1",
    }),
  ],
});

const updateReceiversMsg = ixo.liquidstake.v1beta1.MsgUpdateWeightedRewardsReceivers.fromPartial({
  authority: govAuthority,
  weightedRewardsReceivers: [
    ixo.liquidstake.v1beta1.WeightedAddress.fromPartial({
      address: "ixo1treasury...",
      weight: "1",
    }),
  ],
});

const pauseMsg = ixo.liquidstake.v1beta1.MsgSetModulePaused.fromPartial({
  authority: govAuthority,
  paused: true,
});
```

Wrap these as gov proposals using `cosmos.gov.v1.MsgSubmitProposal` (see the Cosmos SDK [gov module documentation](https://docs.cosmos.network/main/build/modules/gov)).

## Burn-to-unstake (admin)

```ts theme={null}
const burnMsg = {
  typeUrl: "/ixo.liquidstake.v1beta1.MsgBurn",
  value: ixo.liquidstake.v1beta1.MsgBurn.fromPartial({
    address: signerAddress,
    amount: { denom: "stuixo", amount: "1000000" },
  }),
};
```

`MsgBurn` removes `stuixo` from circulation without queuing an unbonding — used by the protocol to reconcile the supply.

## Verify the result

Query staked balances and `stuixo` supply through the [gRPC gateway API](/api-reference/grpc-gateway-api) and `ixo.liquidstake.v1beta1` endpoints. Underlying delegations and unbonding entries are visible through the standard `cosmos.staking.v1beta1` queries.

## Troubleshooting

<AccordionGroup>
  <Accordion title="no whitelisted validators" icon="circle-xmark">
    `MsgLiquidStake` fails when the whitelist is empty. Wait for a governance proposal to populate `whitelisted_validators` before staking.
  </Accordion>

  <Accordion title="module paused" icon="pause">
    When `MsgSetModulePaused` is `true`, all user-initiated stake/unstake messages are rejected. Check params via the gov query.
  </Accordion>

  <Accordion title="invalid denom" icon="coin">
    `MsgLiquidStake.amount.denom` must equal the chain `bond_denom` (typically `uixo`). `MsgLiquidUnstake.amount.denom` must equal `liquid_bond_denom` (typically `stuixo`).
  </Accordion>

  <Accordion title="invalid governance authority" icon="key">
    `MsgUpdateParams`, `MsgUpdateWhitelistedValidators`, `MsgUpdateWeightedRewardsReceivers`, and `MsgSetModulePaused` only accept the gov authority address as `authority`.
  </Accordion>
</AccordionGroup>

## Next steps

<CardGroup cols={2}>
  <Card title="IXO MultiClient SDK" icon="server" href="/sdk-reference/multiclient-sdk">
    Module-level features and types.
  </Card>

  <Card title="Liquid staking proto" icon="github" href="https://github.com/ixofoundation/ixo-blockchain/tree/main/proto/ixo/liquidstake/v1beta1">
    Source of truth for liquid staking messages.
  </Card>

  <Card title="Manage bonds" icon="chart-line" href="/guides/dev/bonds">
    Use `stuixo` as a reserve token in bonds.
  </Card>

  <Card title="Cosmos gov module" icon="building-columns" href="https://docs.cosmos.network/main/build/modules/gov">
    Submit governance proposals for `liquidstake` updates.
  </Card>
</CardGroup>
