# too_early (/docs/errors/too-early)

The call arrived before its window opened: a reveal before the reveal period, a coldkey swap before its delay elapsed, a start\_call before enough blocks passed, or a finalization before the period ended.

Unlike rate\_limited this is not about calling too often — the flow has a built-in waiting period that has not elapsed yet. wait the required blocks and retry; the chain state (announcement block, commit block) tells you how long is left.

## Remediation [#remediation]

The required window has not opened yet; wait some blocks and retry

## Chain errors [#chain-errors]

The exact chain error names (from the extrinsic receipt) that classify to `too_early`; the description says what triggered the failure and where to check. Each name has its own page:

| Chain error                                                                                               | Description                                                                                                                                                                                                                                                                        |
| --------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [`AdminActionProhibitedDuringWeightsWindow`](/docs/errors/chain/AdminActionProhibitedDuringWeightsWindow) | An owner or admin hyperparameter change was attempted inside the protected freeze window just before the subnet's epoch runs. Check `AdminFreezeWindow` and the blocks remaining until the next epoch (subnet tempo), then retry after the epoch fires.                            |
| [`AllNetworksInImmunity`](/docs/errors/chain/AllNetworksInImmunity)                                       | Creating a new subnet required pruning an existing one, but every candidate subnet is still inside its network immunity period so none can be dissolved. Check `NetworkImmunityPeriod` and each subnet's `NetworkRegisteredAt`, and retry once a subnet leaves immunity.           |
| [`CannotReleaseYet`](/docs/errors/chain/CannotReleaseYet)                                                 | `release_deposit` was called too early: the current block must exceed the deposit's block plus `ReleaseDelay`, and safe-mode must be exited. Check the block key of the entry in `Deposits` against the `ReleaseDelay` config.                                                     |
| [`CapNotRaised`](/docs/errors/chain/CapNotRaised)                                                         | `finalize` was called before the crowdloan's `raised` amount equals its `cap`. Compare the `raised` and `cap` fields of the `Crowdloans` entry; contribute the remainder or lower the cap with `update_cap` before finalizing.                                                     |
| [`ColdkeySwapClearTooEarly`](/docs/errors/chain/ColdkeySwapClearTooEarly)                                 | The swap announcement cannot be cleared until the reannouncement delay after the announcement's execution block has passed. Compare the current block with the `when` stored in `ColdkeySwapAnnouncements` plus `ColdkeySwapReannouncementDelay` and retry later.                  |
| [`ColdkeySwapReannouncedTooEarly`](/docs/errors/chain/ColdkeySwapReannouncedTooEarly)                     | `announce_coldkey_swap` was called again before the reannouncement delay after the previous announcement's execution block elapsed. Compare the current block with the stored announcement time plus `ColdkeySwapReannouncementDelay` and retry later.                             |
| [`ColdkeySwapTooEarly`](/docs/errors/chain/ColdkeySwapTooEarly)                                           | `coldkey_swap` was executed before the announcement delay had elapsed since `announce_coldkey_swap`. Check the execution block stored in `ColdkeySwapAnnouncements` (announcement time plus `ColdkeySwapAnnouncementDelay`) and wait until then.                                   |
| [`ContributionPeriodNotEnded`](/docs/errors/chain/ContributionPeriodNotEnded)                             | The operation requires the crowdloan's contribution period to be over, but the current block is still before the crowdloan's `end` block. Compare the `end` field of the `Crowdloans` entry for the `crowdloan_id` with the current block number.                                  |
| [`LeaseHasNotEnded`](/docs/errors/chain/LeaseHasNotEnded)                                                 | The lease termination was attempted before the lease's `end_block` was reached. Compare the current block height with the `end_block` stored in `SubnetLeases` for the lease id and retry after it passes.                                                                         |
| [`MigrationInProgress`](/docs/errors/chain/MigrationInProgress)                                           | A multi-block storage migration of the contracts pallet is still running, so other extrinsics of the pallet are rejected until it completes. Check the migration status in storage and retry once done, or submit `migrate` calls to advance it.                                   |
| [`MultiBlockMigrationsOngoing`](/docs/errors/chain/MultiBlockMigrationsOngoing)                           | Runtime code replacement is blocked while a multi-block migration is still executing. Wait for the ongoing migrations to complete (check the multi-block migrations cursor) before retrying `set_code` or the authorized upgrade.                                                  |
| [`NeedWaitingMoreBlocksToStarCall`](/docs/errors/chain/NeedWaitingMoreBlocksToStarCall)                   | The subnet owner called start\_call before enough blocks had passed since the subnet was registered. Compare the current block with `NetworkRegisteredAt` for the netuid plus the start-call delay and retry once the window opens.                                                |
| [`NotReadyToDissolve`](/docs/errors/chain/NotReadyToDissolve)                                             | `dissolve` was called while outside contributions remain: the crowdloan's `raised` amount still exceeds the creator's own contribution. Call `refund` until only the creator's `Contributions` entry remains and equals `raised` in the `Crowdloans` record.                       |
| [`PriceConditionNotMet`](/docs/errors/chain/PriceConditionNotMet)                                         | The subnet's current alpha price does not satisfy the order's trigger: buys and stop-losses require price at or below `limit_price`, take-profits at or above it. Compare `current_alpha_price` for the order's `netuid`, scaled by 1e9, with the `limit_price` field.             |
| [`RevealTooEarly`](/docs/errors/chain/RevealTooEarly)                                                     | A weight reveal was submitted before the commit's reveal window: the current epoch must equal the commit epoch plus the reveal period. Check the commit in `WeightCommits` and the subnet's `RevealPeriodEpochs`, then wait for the reveal epoch.                                  |
| [`StartCallNotReady`](/docs/errors/chain/StartCallNotReady)                                               | `start_call` was made before `StartCallDelay` blocks elapsed since the subnet was registered. Compare the current block against `NetworkRegisteredAt` for the netuid plus `StartCallDelay`, and wait for the remainder.                                                            |
| [`Unannounced`](/docs/errors/chain/Unannounced)                                                           | The proxied call was executed before its announcement matured, or no matching announcement exists at all. Check the proxy's `Announcements` entry for the call hash and the `delay` on the proxy registration; enough blocks must elapse between `announce` and `proxy_announced`. |
| [`WaitingForDissolvedSubnetCleanup`](/docs/errors/chain/WaitingForDissolvedSubnetCleanup)                 | The operation is blocked while a dissolved subnet's storage is still being torn down in the background. Check the `DissolveCleanupQueue` and retry after the on-idle cleanup for that netuid completes.                                                                            |

The same explanation is available in the terminal: `btcli explain too_early` (or `btcli explain <ChainErrorName>` for one exact chain error).
