> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ton.org/llms.txt
> Use this file to discover all available pages before exploring further.

<AgentInstructions>

## Submitting Feedback

If you encounter incorrect, outdated, or confusing documentation on this page, submit feedback:

POST https://docs.ton.org/feedback

```json
{
  "path": "/ecosystem/staking/overview",
  "feedback": "Description of the issue"
}
```

Only submit feedback when you have something specific and actionable to report.

</AgentInstructions>

# Staking overview

export const Image = ({src, darkSrc, alt = '', darkAlt, href, target, height = 342, width = 608, noZoom = false, center = false}) => {
  const isSVG = src.match(/\.svg(?:[#?].*?)?$/i) !== null;
  const shouldInvert = isSVG && !darkSrc;
  const shouldCreateLink = href !== undefined;
  const minPx = 9;
  const maxPx = 608;
  const expectedPx = `a number or a string with a number that is greater than ${minPx - 1} and less than or equal to ${maxPx}`;
  const createInvalidPropCallout = (title, received, expected) => {
    return <Danger>
        <span className="font-bold">
          Invalid <code>{title.toString()}</code> passed!
        </span>
        <br />
        <span className="font-bold">Received: </span>
        {received.toString()}
        <br />
        <span className="font-bold">Expected: </span>
        {expected.toString()}
        {}
      </Danger>;
  };
  const checkValidDimensionValue = value => {
    switch (typeof value) {
      case "string":
      case "number":
        const num = Number(value);
        return Number.isSafeInteger(num) && num >= minPx && num <= maxPx;
      default:
        return false;
    }
  };
  let callouts = [];
  if (height && !checkValidDimensionValue(height)) {
    callouts.push(createInvalidPropCallout("height", height, expectedPx));
  }
  if (width && !checkValidDimensionValue(width)) {
    callouts.push(createInvalidPropCallout("width", width, expectedPx));
  }
  if (callouts.length !== 0) {
    return callouts;
  }
  const heightPx = Number(height);
  const widthPx = Number(width);
  const shouldCenter = center === "true" || center === true ? true : false;
  const shouldNotZoom = noZoom === "true" || noZoom === true ? true : false;
  const images = <>
      <img className="block dark:hidden" src={src} alt={alt} {...height && ({
    height: heightPx
  })} {...width && ({
    width: widthPx
  })} {...(shouldCreateLink || shouldInvert || shouldNotZoom) && ({
    noZoom: "true"
  })} />
      <img className={`hidden dark:block ${shouldInvert ? "invert" : ""}`} src={darkSrc ?? src} alt={darkAlt ?? alt} {...height && ({
    height: heightPx
  })} {...width && ({
    width: widthPx
  })} {...(shouldCreateLink || shouldInvert || shouldNotZoom) && ({
    noZoom: "true"
  })} />
    </>;
  if (shouldCreateLink) {
    if (shouldCenter) {
      return <div style={{
        display: "flex",
        justifyContent: "center"
      }}>
          <a href={href} target={target ?? "_self"}>
            {images}
          </a>
        </div>;
    }
    return <a href={href} target={target ?? "_self"}>
        {images}
      </a>;
  }
  if (shouldCenter) {
    return <div style={{
      display: "flex",
      justifyContent: "center"
    }}>{images}</div>;
  }
  return images;
};

export const Aside = ({type = "note", title = "", icon = "", iconType = "regular", children}) => {
  const asideVariants = ["note", "tip", "caution", "danger"];
  const asideComponents = {
    note: {
      outerStyle: "border-sky-500/20 bg-sky-50/50 dark:border-sky-500/30 dark:bg-sky-500/10",
      innerStyle: "text-sky-900 dark:text-sky-200",
      calloutType: "note",
      icon: <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg" className="w-4 h-4 text-sky-500" aria-label="Note">
          <path fill-rule="evenodd" clip-rule="evenodd" d="M7 1.3C10.14 1.3 12.7 3.86 12.7 7C12.7 10.14 10.14 12.7 7 12.7C5.48908 12.6974 4.0408 12.096 2.97241 11.0276C1.90403 9.9592 1.30264 8.51092 1.3 7C1.3 3.86 3.86 1.3 7 1.3ZM7 0C3.14 0 0 3.14 0 7C0 10.86 3.14 14 7 14C10.86 14 14 10.86 14 7C14 3.14 10.86 0 7 0ZM8 3H6V8H8V3ZM8 9H6V11H8V9Z"></path>
        </svg>
    },
    tip: {
      outerStyle: "border-emerald-500/20 bg-emerald-50/50 dark:border-emerald-500/30 dark:bg-emerald-500/10",
      innerStyle: "text-emerald-900 dark:text-emerald-200",
      calloutType: "tip",
      icon: <svg width="11" height="14" viewBox="0 0 11 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg" className="text-emerald-600 dark:text-emerald-400/80 w-3.5 h-auto" aria-label="Tip">
          <path d="M3.12794 12.4232C3.12794 12.5954 3.1776 12.7634 3.27244 12.907L3.74114 13.6095C3.88471 13.8248 4.21067 14 4.46964 14H6.15606C6.41415 14 6.74017 13.825 6.88373 13.6095L7.3508 12.9073C7.43114 12.7859 7.49705 12.569 7.49705 12.4232L7.50055 11.3513H3.12521L3.12794 12.4232ZM5.31288 0C2.52414 0.00875889 0.5 2.26889 0.5 4.78826C0.5 6.00188 0.949566 7.10829 1.69119 7.95492C2.14321 8.47011 2.84901 9.54727 3.11919 10.4557C3.12005 10.4625 3.12175 10.4698 3.12261 10.4771H7.50342C7.50427 10.4698 7.50598 10.463 7.50684 10.4557C7.77688 9.54727 8.48281 8.47011 8.93484 7.95492C9.67728 7.13181 10.1258 6.02703 10.1258 4.78826C10.1258 2.15486 7.9709 0.000106649 5.31288 0ZM7.94902 7.11267C7.52078 7.60079 6.99082 8.37878 6.6077 9.18794H4.02051C3.63739 8.37878 3.10743 7.60079 2.67947 7.11294C2.11997 6.47551 1.8126 5.63599 1.8126 4.78826C1.8126 3.09829 3.12794 1.31944 5.28827 1.3126C7.2435 1.3126 8.81315 2.88226 8.81315 4.78826C8.81315 5.63599 8.50688 6.47551 7.94902 7.11267ZM4.87534 2.18767C3.66939 2.18767 2.68767 3.16939 2.68767 4.37534C2.68767 4.61719 2.88336 4.81288 3.12521 4.81288C3.36705 4.81288 3.56274 4.61599 3.56274 4.37534C3.56274 3.6515 4.1515 3.06274 4.87534 3.06274C5.11719 3.06274 5.31288 2.86727 5.31288 2.62548C5.31288 2.38369 5.11599 2.18767 4.87534 2.18767Z"></path>
        </svg>
    },
    caution: {
      outerStyle: "border-amber-500/20 bg-amber-50/50 dark:border-amber-500/30 dark:bg-amber-500/10",
      innerStyle: "text-amber-900 dark:text-amber-200",
      calloutType: "warning",
      icon: <svg className="flex-none w-5 h-5 text-amber-400 dark:text-amber-300/80" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" aria-label="Warning">
          <path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path>
        </svg>
    },
    danger: {
      outerStyle: "border-red-500/20 bg-red-50/50 dark:border-red-500/30 dark:bg-red-500/10",
      innerStyle: "text-red-900 dark:text-red-200",
      calloutType: "danger",
      icon: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" className="text-red-600 dark:text-red-400/80 w-4 h-4" aria-label="Danger">
          <path d="M17.1 292c-12.9-22.3-12.9-49.7 0-72L105.4 67.1c12.9-22.3 36.6-36 62.4-36l176.6 0c25.7 0 49.5 13.7 62.4 36L494.9 220c12.9 22.3 12.9 49.7 0 72L406.6 444.9c-12.9 22.3-36.6 36-62.4 36l-176.6 0c-25.7 0-49.5-13.7-62.4-36L17.1 292zm41.6-48c-4.3 7.4-4.3 16.6 0 24l88.3 152.9c4.3 7.4 12.2 12 20.8 12l176.6 0c8.6 0 16.5-4.6 20.8-12L453.4 268c4.3-7.4 4.3-16.6 0-24L365.1 91.1c-4.3-7.4-12.2-12-20.8-12l-176.6 0c-8.6 0-16.5 4.6-20.8 12L58.6 244zM256 128c13.3 0 24 10.7 24 24l0 112c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-112c0-13.3 10.7-24 24-24zM224 352a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z"></path>
        </svg>
    }
  };
  let variant = type;
  let gotInvalidVariant = false;
  if (!asideVariants.includes(type)) {
    gotInvalidVariant = true;
    variant = "danger";
  }
  const iconVariants = ["regular", "solid", "light", "thin", "sharp-solid", "duotone", "brands"];
  if (!iconVariants.includes(iconType)) {
    iconType = "regular";
  }
  return <>
      <div className={`callout my-4 px-5 py-4 overflow-hidden rounded-2xl flex gap-3 border ${asideComponents[variant].outerStyle}`} data-callout-type={asideComponents[variant].calloutType}>
        <div className="mt-0.5 w-4" data-component-part="callout-icon">
          {}
          {icon === "" ? asideComponents[variant].icon : <Icon icon={icon} iconType={iconType} size={14} />}
        </div>
        <div className={`text-sm prose min-w-0 w-full ${asideComponents[variant].innerStyle}`} data-component-part="callout-content">
          {gotInvalidVariant ? <p>
              <span className="font-bold">
                Invalid <code>type</code> passed!
              </span>
              <br />
              <span className="font-bold">Received: </span>
              {type}
              <br />
              <span className="font-bold">Expected one of: </span>
              {asideVariants.join(", ")}
            </p> : <>
              {title && <p className="font-bold">{title}</p>}
              {children}
            </>}
        </div>
      </div>
    </>;
};

[Staking in TON](https://ton.org/en/stake) enables earning rewards by locking Toncoin to support network security and validation. TON supports several staking solutions, each designed for different use cases and operational models.

Staking secures the network through [proof-of-stake](https://en.wikipedia.org/wiki/Proof_of_stake). Depending on technical ability, stake size, and participation goals, users may choose between single nominator, nominator pools, or liquid staking. Some solutions are suitable only for technically experienced operators, while others are intended for businesses providing staking as a service. However, all solutions require non-trivial setup, and there are limited number of support tools.

## Overview of staking solutions

The following smart contracts are commonly used in the TON ecosystem:

|                                    Option                                   |                        Intention                       |                           Features                           |
| :-------------------------------------------------------------------------: | :----------------------------------------------------: | :----------------------------------------------------------: |
| [Liquid staking](https://github.com/ton-blockchain/liquid-staking-contract) |        Staking providers servicing retail users.       |  Liquidity and DeFi integration via wrapped staking tokens.  |
|    [Single nominator](https://github.com/ton-blockchain/single-nominator)   |       Large holders staking only their own funds.      | Secure, contract-based self-staking; simple ownership model. |
|      [Nominator pool](https://github.com/ton-blockchain/nominator-pool)     | Small group of nominators delegating to one validator. |    Has significant limitations; generally not recommended.   |

<Aside type="caution" title="Stake requirements">
  The technical minimum stake required to participate in validation is 300,000 TON. However, the actual minimum stake is typically higher, approximately 1,000,000 TON.

  Validator stakes can be viewed on [tonscan.org/validators](https://tonscan.org/validators). Scroll to the bottom of the list to see the validator with the lowest stake included in the current round.
</Aside>

## Liquid staking

The [liquid staking contract](/ecosystem/staking/liquid-staking) enables staking services to issue liquid staking tokens (LSTs) that represent the underlying staking position. LSTs can be used in DeFi while the underlying TON earns rewards.

### Key characteristics

* Users deposit TON and receive wrapped tokens, e.g. tsTON, that can be used in DeFi.
* Liquidity remains accessible even when underlying funds are staked.
* Flexible staker-validator connections without centralized pools.
* Low minimum deposits for broader participation.
* Some protocols allow governance influence.
* Reduced slashing risks using diversification.
* Easy fund spreading across validators.

### Recommended use

* Staking providers serving retail users.
* Projects building liquid staking products or yield-bearing tokens.
* Operators who want to run staking services without committing significant personal funds.

## Single nominator pools

[Single nominator pool contract](/ecosystem/staking/single-nominator) is the standard solution designed for large holders who want to stake their own funds while delegating validator operations to a trusted operator.

<Aside type="note">
  The single nominator pool contract is the recommended staking solution.
</Aside>

### Key characteristics

* Supports exactly one nominator.
* Separates the owner's cold wallet from the validator's hot wallet to prevent theft if the validator node is compromised.
* The owner can recover stakes even in extreme scenarios, such as elector contract upgrades.
* Any modification would require a professional audit, which is costly and time-consuming; therefore, the contract remains intentionally unchanged.

### Recommended use

This solution is suitable for:

* Large TON holders who stake only their own funds.
* Setups that require separation between fund custody (owner wallet) and validator node operations.

## Nominator pools

[Nominator pools](/ecosystem/staking/nominator-pools) are smart contracts that allow a small group of nominators to combine their funds and delegate to a validator for staking collectively. However, it has limitations and safety concerns.

<Aside type="caution">
  The nominator pool is deprecated and is not recommended for use.
</Aside>

### Limitations

* Only the owner can withdraw funds from the pool.
* Supports up to approximately 40 nominators, which is not suitable for large pools.
* Not designed for small deposits or retail participation.
* Sending a message to the pool without a bounce flag may result in funds becoming locked.

### Notes

* The contract is not deprecated, but it is rarely an appropriate choice in practice.
* For large holders, the single nominator contract is preferred.
* This solution is not recommended for new staking services.

## Differences from standard nominator pools

* Lower minimum stake of 50 TON, compared to 10,000 TON in standard pools.
* Custom contract architecture with separate owner, controller, proxy, and pool contracts.
* Fee model where deposit and withdrawal fees vary by pool; users should check pool details before staking.

## Recommendations for staking solutions

For large holders staking only their own funds:

* Use a single nominator contract for direct self-staking, or
* Stake through a reputable third-party staking provider.

For operators intending to run staking services for others:

* Use liquid staking contracts, which are appropriate when accepting deposits from retail users or when building DeFi-compatible staking tokens.

For small holders:

* Use a third-party staking service rather than running contracts directly.

The following recommendations are mapped onto the Cartesian plane below. The horizontal axis represents legal restrictions and setup complexity, while the vertical axis represents the operational model.

<div style={{ display: "flex", justifyContent: "center" }}>
  <Image src="/resources/images/staking-cartesian-light.png" darkSrc="/resources/images/staking-cartesian-dark.png" width={500} height={500} alt="Recommendations" />
</div>

## Staking providers

Third-party staking providers who use a liquidity pool for staking:

|                   Protocol                   | Min deposit |  Liquidity  | Voting |          Withdrawal          | Decentralized validation |
| :------------------------------------------: | :---------: | :---------: | :----: | :--------------------------: | :----------------------: |
|     [Tonstakers](https://tonstakers.com)     |    1 TON    | Yes (tsTON) |   Yes  | Up to 18h (instant possible) |            Yes           |
|         [Bemo](https://bemo.finance)         |    1 TON    | Yes (bmTON) |   No   |        36-72h cooldown       |            No            |
|         [Hipo](https://hipo.finance)         |    Varies   |  Yes (hTON) |   No   |  Avg 30h (instant possible)  |            No            |
| [TON Nominators](https://tonvalidators.org/) |  10,000 TON |      No     |   Yes  |           Up to 18h          |            No            |

Tonstakers offers automated compounding and decentralized validation.

All validators participating in these third-party protocols use MyTonCtrl for validation. For validator setup instructions, see:

* [Tonstakers setup](/ecosystem/node/mytonctrl/liquid-staking)
* [Nominator pool setup](/ecosystem/node/mytonctrl/pools#nominator-pool-operations-nominator-pool-mode)
* [Single nominator pool setup](/ecosystem/node/mytonctrl/pools#single-nominator-pool-operations-single-nominator-mode)
