Errors
policy_violation
The action exceeds a configured safety policy
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 error | Description |
|---|---|
AccountRejectsLockedAlpha | Locked 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. |
FundsNotSettled | finalize 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. |
KeepStakeBlockedByCollateral | A 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. |
The same explanation is available in the terminal: btcli explain policy_violation (or btcli explain <ChainErrorName> for one exact chain error).