Errors

policy_violation

The action exceeds a configured safety policy

View as Markdown

The action was blocked by a policy: either a local SDK safety limit (spend caps, allowed operations) or an on-chain account/subnet policy (e.g. the destination rejects locked alpha).

For local policies, raise or remove the limit in your configuration. for on-chain policies, change the recipient/settings or ask the counterparty to opt in — the error name says which.

Remediation

The action exceeds a configured safety policy

Chain errors

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

Chain errorDescription
AccountRejectsLockedAlphaLocked alpha was being transferred to a coldkey whose AccountFlags do not have the accept-locked-alpha bit set, e.g. during a lock transfer or coldkey swap of locks. Check the destination coldkey's AccountFlags storage and have the recipient opt in to receiving locked alpha before retrying.
AccountRejectsStakingHotkeyGrowthThe receiving coldkey opted out of staking-list growth caused by other accounts. Transfer onto a hotkey the receiver already lists or owns, or have the receiver voluntarily establish the destination through its own staking action. Contracts can check getRejectStakingHotkeyGrowth before transferring to avoid a refused precompile call.
BurnEmissionMustBeZeroSlot 0 (burn) of the emission weight vector was set to a non-zero share. Burning alpha emission is reserved for a future runtime; in v1 the burn share must be 0 (or simply omitted).
FundsNotSettledfinalize ran the configured call, but the raised funds were still in the crowdloan's funds account afterwards, so finalization was refused. This happens when the call does not spend the raised amount, or when a wrapper such as Utility.batch returns Ok after its inner call failed. Fix the finalization call so it consumes the full raised amount, then finalize again.
KeepStakeBlockedByCollateralA hotkey swap with keep_stake=true was refused because the old hotkey still has standing miner registration collateral. keep_stake leaves stake on the old key while the UID moves, which would strand the bond. Retry with keep_stake=false so collateral migrates with the UID; on-chain hotkey lineage maps track the rename for blacklist continuity. Or drain the bond through earned emission first.
LeasedSubnetOwnerCutBelowMinimumThe subnet was created through a crowdloan lease, so slot 2 (owner) of its emission weight vector may not drop below the 18% launch default that lease contributors are paid from. Keep the owner share at or above 0.18 on lease-created subnets.
MinerEmissionBelowMinimumSlot 4 (miner) of the emission weight vector is below the 33% floor. Miner incentive must receive at least 0.33 of block emission; raise the miner share (or lower the owner/validator shares that crowd it out).
OwnerEmissionAboveMaximumSlot 2 (owner) of the emission weight vector exceeds the 33% ceiling. The subnet owner may take at most 0.33 of block emission; lower the owner share (0 disables the owner cut entirely on subnets that were not created through a lease).
RecycleEmissionMustBeZeroSlot 1 (recycle) of the emission weight vector was set to a non-zero share. Recycling alpha emission is reserved for a future runtime; in v1 the recycle share must be 0 (or simply omitted).
ValidatorEmissionAboveMaximumSlot 3 (validator) of the emission weight vector exceeds the 50% ceiling. Validator dividends may draw at most 0.50 of block emission; lower the validator share.
ValidatorEmissionTooLowToPreserveRootSlot 3 (validator) of the emission weight vector is at or below root's baseline share. Every block the chain pays root min(V, r) of the subnet's emission off the top of the validator slot, where r = V0 * x / (x + A) is what root would earn with the default validator share V0 (0.41) and the global TaoWeight (x = root TAO times that weight, A = the subnet's alpha issuance), recomputed from live state; alpha validators get V - min(V, r). A set with V <= r would leave validators nothing, so it is rejected. btcli subnets emission show --netuid <n> prints the baseline and the floor for this block. Raise the validator share above it and resubmit.

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