Skip to main content
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.
  • An offline signer — see the SDK README.
  • 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.
npm install @ixo/impactxclient-sdk
import { ixo, createSigningClient } from "@ixo/impactxclient-sdk";

const signingClient = await createSigningClient(RPC_ENDPOINT, offlineSigner);

Stake uixo for stuixo

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

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.
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).

Burn-to-unstake (admin)

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 and ixo.liquidstake.v1beta1 endpoints. Underlying delegations and unbonding entries are visible through the standard cosmos.staking.v1beta1 queries.

Troubleshooting

MsgLiquidStake fails when the whitelist is empty. Wait for a governance proposal to populate whitelisted_validators before staking.
When MsgSetModulePaused is true, all user-initiated stake/unstake messages are rejected. Check params via the gov query.
MsgLiquidStake.amount.denom must equal the chain bond_denom (typically uixo). MsgLiquidUnstake.amount.denom must equal liquid_bond_denom (typically stuixo).
MsgUpdateParams, MsgUpdateWhitelistedValidators, MsgUpdateWeightedRewardsReceivers, and MsgSetModulePaused only accept the gov authority address as authority.

Next steps

IXO MultiClient SDK

Module-level features and types.

Liquid staking proto

Source of truth for liquid staking messages.

Manage bonds

Use stuixo as a reserve token in bonds.

Cosmos gov module

Submit governance proposals for liquidstake updates.