Portaldot · error reference
Every Portaldot error, explained.
When a Portaldot transaction fails, the node returns a raw code like Module error: 0x0600… — no message. This is the verified knowledge base behind pdk's FailLens: what each error means and how to fix it. No install required — search below.
Want the same answers in your terminal, live against your own failed transactions?
pip install portaldot-pdk →
pdk debug <txhash>. Spot a missing or better fix? Every entry is community-owned —
add one in a five-line PR.
29 errors · all verified against the live runtime
balancesInsufficientBalance
You tried to transfer more POT than the sending account holds.
How to fix
- Check the sender balance via the Portaldot explorer (portalscan.portaldot.io) or pdk doctor.
- Lower the transfer amount, or fund the account first (dev accounts are pre-funded on a --dev chain).
balancesExistentialDeposit
The transfer would leave an account below the Existential Deposit, so it was rejected.
How to fix
- Leave at least the Existential Deposit in both the sender and receiver.
- Or move the whole balance with transfer (allow death) instead of transfer_keep_alive.
balancesKeepAlive
The transfer would kill the sender account, but a keep-alive call was used.
How to fix
- Reduce the amount so the sender keeps at least the Existential Deposit.
- Use transfer if you intend to empty the account.
balancesLiquidityRestrictions
The funds are locked or frozen (e.g. by staking or vesting) and cannot be moved.
How to fix
- Unlock the funds first — unbond from staking or wait for vesting to release.
balancesDeadAccount
The target account does not exist on-chain (it was reaped below the Existential Deposit).
How to fix
- Send at least the Existential Deposit to create the account before further calls.
balancesVestingBalance
The balance is still locked by a vesting schedule and cannot be spent yet.
How to fix
- Wait for the vesting schedule to release, or call vesting.vest to unlock vested funds.
assetsBalanceLow
The account does not hold enough of this asset for the operation.
How to fix
- Mint or transfer more of the asset to the account before retrying.
assetsNoPermission
The signer is not the issuer/admin/freezer of this asset.
How to fix
- Sign with the asset's admin account, or transfer the relevant role first.
assetsUnknown
The referenced asset id does not exist.
How to fix
- Create the asset with assets.create, or correct the asset id.
assetsFrozen
The asset or the account's holding of it is frozen.
How to fix
- Thaw the asset/account with the freezer role before transferring.
assetsWouldDie
The operation would drop the account's asset balance below the minimum, killing it.
How to fix
- Leave at least the asset's minimum balance, or transfer the whole holding at once.
assetsUnapproved
No approved allowance exists for this delegated transfer.
How to fix
- Call assets.approve_transfer from the owner before a transfer_approved.
contractsContractNotFound
No contract exists at the supplied address.
How to fix
- Verify the address; ensure the contract was instantiated, not merely uploaded.
contractsContractTrapped
The contract panicked or hit a trap during execution.
How to fix
- Check the contract logic and the message arguments; inspect debug output.
contractsCodeNotFound
No uploaded code matches the given code hash.
How to fix
- Upload the contract Wasm first, then instantiate with the resulting code hash.
contractsCodeTooLarge
The uploaded contract Wasm exceeds the runtime size limit.
How to fix
- Build with --release and optimise the Wasm (e.g. wasm-opt) to shrink it.
contractsOutOfGas
Execution ran out of the supplied gas (weight) budget.
How to fix
- Increase gasLimit. A dry-run call returns a realistic estimate to use.
contractsStorageExhausted
The contract has no storage budget left for this operation.
How to fix
- Fund the contract account so it can pay for additional storage.
contractsMaxCallDepthReached
Cross-contract calls nested deeper than the runtime call-depth limit.
How to fix
- Flatten the call graph so contracts do not call each other too deeply.
identityNotFound
No identity is registered for this account.
How to fix
- Register an identity with identity.set_identity before reading or judging it.
identityTooManyRegistrars
The registrar set is already at its maximum size.
How to fix
- No client-side fix — the runtime caps the number of registrars.
multisigNotFound
No matching multisig operation was found to approve or cancel.
How to fix
- Confirm the call hash, timepoint, and signatory set match the original proposal exactly.
multisigNotOwner
Only the account that opened the multisig call may cancel it.
How to fix
- Cancel from the original creator account, or approve instead of cancelling.
proxyNotProxy
The signer is not registered as a proxy for the target account.
How to fix
- Add the proxy relationship with proxy.add_proxy from the target account first.
stakingInsufficientBond
The bonded amount is below the minimum required to stake.
How to fix
- Bond more POT so the stake meets the minimum bond threshold.
stakingNotController
The signing account is not the controller for this stash.
How to fix
- Sign with the stash's controller account for staking operations.
schedulerTargetBlockNumberInPast
The scheduled call's target block is already in the past.
How to fix
- Schedule for a block number greater than the current chain head.
dispatchBadOrigin
The call requires a different origin (e.g. Root or a specific owner) than the signer used.
How to fix
- Sign with an account authorised for this call.
- Root-only calls must be routed through the sudo pallet on a dev node.
dispatchCannotLookup
An address lookup failed — e.g. an account index that does not resolve to an account.
How to fix
- Pass a full account address instead of an index, or check the index exists.