pdk.
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-pdkpdk 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
  1. Check the sender balance via the Portaldot explorer (portalscan.portaldot.io) or pdk doctor.
  2. 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
  1. Leave at least the Existential Deposit in both the sender and receiver.
  2. 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
  1. Reduce the amount so the sender keeps at least the Existential Deposit.
  2. 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
  1. 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
  1. 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
  1. 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
  1. 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
  1. Sign with the asset's admin account, or transfer the relevant role first.

assetsUnknown

The referenced asset id does not exist.

How to fix
  1. 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
  1. 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
  1. 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
  1. Call assets.approve_transfer from the owner before a transfer_approved.

contractsContractNotFound

No contract exists at the supplied address.

How to fix
  1. Verify the address; ensure the contract was instantiated, not merely uploaded.

contractsContractTrapped

The contract panicked or hit a trap during execution.

How to fix
  1. Check the contract logic and the message arguments; inspect debug output.

contractsCodeNotFound

No uploaded code matches the given code hash.

How to fix
  1. 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
  1. 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
  1. 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
  1. 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
  1. Flatten the call graph so contracts do not call each other too deeply.

identityNotFound

No identity is registered for this account.

How to fix
  1. 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
  1. 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
  1. 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
  1. 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
  1. 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
  1. 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
  1. 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
  1. 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
  1. Sign with an account authorised for this call.
  2. 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
  1. Pass a full account address instead of an index, or check the index exists.