# Stake calculation (https://docs-kyrm16yq7-ton-core-docs.vercel.app/llms/ecosystem/staking/stake-calculation/content.md)



<Callout type="caution" title="Stake affects locked funds">
  Stake configuration directly controls how much TON is locked in the elector contract for a full validation round. Misconfiguration can lock the entire balance, leaving no funds for the next election. Review each setting carefully before applying changes on TON Mainnet.
</Callout>

MyTonCtrl automatically calculates the stake amount before submitting an election entry. The calculation balances operator preferences, staking mode, network-imposed limits, and fee reserves to produce a single integer value (in TON) sent to the [elector contract](/llms/foundations/system/content.md).

## Inputs [#inputs]

The calculation draws on several sources:

| Source                                                           | Parameter              | Role                                                                                                              |
| ---------------------------------------------------------------- | ---------------------- | ----------------------------------------------------------------------------------------------------------------- |
| Operator setting                                                 | `stake`                | Fixed stake amount (TON). When set, overrides percentage-based calculation.                                       |
| Operator setting                                                 | `stakePercent`         | Percentage of balance to stake. Defaults to `100` when unset.                                                     |
| Wallet state                                                     | `balance`              | Current TON balance of the staking account (validator wallet, pool, or controller).                               |
| Validator console                                                | Active validator count | Number of validators currently running on this node. Determines whether the node is new or already participating. |
| [On-chain config #17](/llms/foundations/config/content.md) | `minStake`             | Network minimum stake. Submissions below this value are rejected by the elector.                                  |
| [On-chain config #17](/llms/foundations/config/content.md) | `maxStake`             | Network maximum stake. Submissions above this value are clamped.                                                  |
| Node configuration                                               | Staking mode           | Whether the node uses a nominator pool, single nominator pool, liquid staking controller, or direct staking.      |

Configure `stake` and `stakePercent` with the [`set`](/llms/ecosystem/nodes/cpp/mytonctrl/core/content.md) command:

```mytonctrl
set stake 500000
```

```mytonctrl
set stakePercent 99
```

Retrieve current values with `get stake` or `get stakePercent`.

## How the priority cascade works [#how-the-priority-cascade-works]

MyTonCtrl evaluates stake sources in a fixed priority order. The first rule that produces a value wins; later rules are skipped.

### Priority 1: Saved fixed stake [#priority-1-saved-fixed-stake]

If the operator previously ran `set stake <VALUE>`, MyTonCtrl uses that stored amount directly. No additional fee reserve is subtracted at this stage; the value passes straight to the validation guards.

### Priority 2: Nominator pool mode [#priority-2-nominator-pool-mode]

When the node operates through a standard nominator pool (not a single nominator pool), MyTonCtrl sets:

```text
stake = balance - 20
```

The 20 TON reserve covers the higher fee overhead of pool operations (deploy, process, and distribute messages).

<Callout type="note">
  Single nominator pools are excluded from this rule. They fall through to the percentage-based calculation (Priority 4) because single nominator pools behave like direct staking economically.
</Callout>

### Priority 3: Liquid staking controller mode [#priority-3-liquid-staking-controller-mode]

When the node uses a liquid staking controller, MyTonCtrl sets:

```text
stake = balance - 50
```

The 50 TON reserve is the largest of all modes. Liquid staking controllers perform complex multi-step transactions (minting, burning, and balance adjustments), requiring a bigger fee cushion.

### Priority 4: Percentage-based calculation (default) [#priority-4-percentage-based-calculation-default]

If none of the above rules produce a value, MyTonCtrl falls back to percentage-based calculation using `stakePercent`. This is the most common path for single nominator pools and direct staking.

The logic depends on whether the node already has active validators:

* **New validator** (no active validators):

  ```text
  stake = balance * stakePercent / 100 / 2
  ```

  The balance is halved. This solves a cold-start problem: on the first election, the elector locks the entire stake for a full validation round. By staking only half, the node keeps the other half available for the next election, which opens before the current round ends. Without halving, a new validator would be locked out of alternating rounds.

  **Exception:** if halving produces a value below `minStake`, MyTonCtrl abandons the halving and stakes the full percentage instead. Participating in one round is better than being rejected by the elector for staking too little.

* **Existing validator** (active validators present):

  ```text
  stake = balance * stakePercent / 100
  ```

  No halving is needed. The returning stake from the previous round replenishes the balance in time for the next election.

  **Fee deduction at 100%:** when `stakePercent` is exactly `100`, MyTonCtrl subtracts 20 TON from the result to prevent draining the wallet completely. At lower percentages, the non-staked remainder covers fees implicitly.

## Validation guards [#validation-guards]

After the stake amount is determined, three sequential checks run regardless of which priority rule produced the value:

| Check                | Condition          | Action                                                                     |
| -------------------- | ------------------ | -------------------------------------------------------------------------- |
| Maximum stake        | `stake > maxStake` | Clamps stake down to `maxStake`. Logs a warning. Election entry continues. |
| Minimum stake        | `stake < minStake` | Raises an error. Election entry is aborted.                                |
| Insufficient balance | `stake > balance`  | Raises an error. Election entry is aborted.                                |

The asymmetry is intentional. Exceeding the maximum is recoverable — MyTonCtrl clamps and continues. Falling below the minimum or exceeding the available balance would waste transaction fees on a doomed submission, so MyTonCtrl aborts instead.

## Safety reserves by mode [#safety-reserves-by-mode]

Each staking mode reserves a different amount for transaction fees:

| Mode                              | Reserve (TON) | Reason                                                        |
| --------------------------------- | ------------- | ------------------------------------------------------------- |
| Saved fixed stake                 | 0             | The stored value is used as-is; only validation guards apply. |
| Nominator pool                    | 20            | Multiple messages for pool lifecycle operations.              |
| Liquid staking controller         | 50            | Complex multi-step DeFi transactions.                         |
| Percentage at 100% (default mode) | 20            | General safety margin when no non-staked remainder exists.    |

## Examples [#examples]

### New validator with 800,000 TON balance [#new-validator-with-800000-ton-balance]

Settings: `stakePercent = 99`, no fixed `stake`, single nominator pool mode.

1. No saved fixed stake, not a standard nominator pool, not a controller.
2. Falls through to percentage-based calculation (Priority 4).
3. No active validators detected (new node): halving applies.
4. `stake = 800,000 * 99 / 100 / 2 = 396,000`.
5. `396,000 > minStake` (300,000): halving is kept.
6. Result: **396,000 TON** is submitted. The remaining balance covers the next election.

### Returning validator with 1,600,000 TON balance [#returning-validator-with-1600000-ton-balance]

Settings: `stakePercent = 99`, single nominator pool mode, already validating.

1. Falls through to percentage-based calculation.
2. Active validators present: no halving.
3. `stake = 1,600,000 * 99 / 100 = 1,584,000`.
4. Result: **1,584,000 TON** is submitted.

### New validator with exactly 600,100 TON (near minimum) [#new-validator-with-exactly-600100-ton-near-minimum]

Settings: `stakePercent = 100`, single nominator pool mode.

1. Falls through to percentage-based calculation.
2. No active validators: halving would give `600,100 / 2 = 300,050`.
3. `300,050 > minStake` (300,000): halving is kept.
4. `stakePercent == 100`: 20 TON fee deduction applies: `300,050 - 20 = 300,030`.
5. Result: **300,030 TON** is submitted.

### New validator with exactly 500,000 TON (halving would go below minimum) [#new-validator-with-exactly-500000-ton-halving-would-go-below-minimum]

Settings: `stakePercent = 100`, single nominator pool mode.

1. Falls through to percentage-based calculation.
2. No active validators: halving would give `500,000 / 2 = 250,000`.
3. `250,000 < minStake` (300,000): halving is abandoned.
4. Full percentage is used: `500,000`.
5. `stakePercent == 100`: 20 TON fee deduction: `500,000 - 20 = 499,980`.
6. Result: **499,980 TON** is submitted.

<Callout type="note">
  When halving is abandoned due to minimum stake constraints, the node participates only in every second validation round until the balance grows enough to cover both rounds.
</Callout>

### Nominator pool with 2,000,000 TON balance [#nominator-pool-with-2000000-ton-balance]

Settings: standard nominator pool mode (not single nominator).

1. Pool mode detected (Priority 2).
2. `stake = 2,000,000 - 20 = 1,999,980`.
3. Result: **1,999,980 TON** is submitted.

## See also [#see-also]

* [Staking overview](/llms/ecosystem/staking/overview/content.md) — comparison of staking solutions and minimum requirements.
* [Run a validator](/llms/ecosystem/nodes/cpp/run-validator/content.md) — step-by-step guide for setting optimal stake.
* [MyTonCtrl settings](/llms/ecosystem/nodes/cpp/mytonctrl/core/content.md) — full list of configurable parameters including `stake` and `stakePercent`.
* [Single nominator pools](/llms/ecosystem/staking/single-nominator/content.md) — recommended staking contract for large holders.
