1. Docs
  2. Reference
  3. Limits and errors

Reference

Limits and errors

Product bounds and the Move abort codes surfaced by Trust Stack.

Revision 6152 abort codes · 12 modules6 new in rev. 6
On this page
  1. Common limits
  2. Reading an abort
  3. Core package abort codes
  4. Dexlyn adapter abort codes
  5. Handling a failure

Trust Stack validates user-facing bounds before the wallet opens. The Move modules repeat critical checks because the chain—not the browser—is the security boundary.

Common limits#

InputBoundEnforced by
Token name32 UTF-8 bytesSDK
Token symbol1–10 letters or numbersSDK
Token decimals0–18SDK
Token icon/project URI512 bytes; https:// or ipfs://SDK
Token maximum supplylifetime minted supply, including burned units, never exceeds itMoveRev. 6
Multi-send recipients1–100 unique addresses per transactionMove
Merkle root/nodeexactly 32 bytesMove
Merkle proof depthat most 64 nodesMove
Merkle campaign seedat most 64 bytesMove
Vesting stepsat most 10,000Move
Schedule horizonunlock, start, end, and reclaim times at most 3,153,600,000 seconds (about 100 years) after chain timeMove
Fee capstoken creation 25,000 SUPRA; fixed lock 10,000 SUPRA; vesting 100 bps (1%)Move
Governance delayat least 172,800 seconds (48 hours) outside test chains 6 and 4MoveRev. 6
Proposal acceptance window1,209,600 seconds (14 days, inclusive) after the effective timeMoveRev. 6
Digital Asset mediaat most 5 MiB per file (the API upload limit); PNG, JPEG, GIF, WebP, GLB, or glTFAPI
On-chain token amountspositive integer base units that fit u64SDKMove
Addressescanonicalizable, non-zero where ownership is assignedSDKMove

The revision-6 testnet package was initialized with 300-second governance delays, shortened for testing; chain 6 is allow-listed below the 48-hour floor. Mainnet payloads use 604,800 seconds (7 days).

Reading an abort#

Abort codes are module-local. Always interpret the code together with the package address and module name. The VM status shows the reason combined with a Move error category, for example 0x30009 is category 0x3 (invalid state) with reason 9, and 0x50005 is category 0x5 (permission denied) with reason 5. The tables list the reason.

Decode an abort code#

Category0x3INVALID_STATE
Reason5module-local
ConstantELOCKEDthe unlock time has not been reached

Hex or decimal. Runs in your browser; nothing is sent anywhere.

Core package abort codes#

Codes are identical across revisions unless marked. Codes marked rev. 6 exist only in the active revision-6 package, not in the retained claim-only revision-5 package or earlier revisions.

token_factory#

13 codes1 new in rev. 6Core package
CodeNameMeaning
1EZERO_SUPPLYinitial supply is zero
2EMAXIMUM_BELOW_INITIALmaximum supply is below the initial supply
3EINVALID_FIXED_SUPPLYa fixed-supply token has a maximum different from its initial supply
4ENOT_CREATORthe signer is not the token controller
5EMINT_DISABLEDminting is disabled for this token
6EBURN_DISABLEDburning is disabled for this token
7EZERO_RECIPIENTthe recipient is the zero address
8EZERO_CONTROLLERa proposed controller is the zero address
9ESAME_CONTROLLERthe proposed controller is the current controller
10EPENDING_CONTROLLERa controller rotation is already pending
11ENO_PENDING_CONTROLLERno controller rotation is pending
12ENOT_PENDING_CONTROLLERthe signer is not the pending controller
13EMAXIMUM_SUPPLY_EXCEEDEDthe mint would take lifetime minted supply above the maximum Rev. 6

fixed_lock#

9 codesCore package
CodeNameMeaning
1EZERO_AMOUNTthe amount is zero
2EUNLOCK_NOT_FUTUREthe unlock time is not in the future
3EZERO_BENEFICIARYthe beneficiary is the zero address
4ENOT_BENEFICIARYthe signer is not the beneficiary
5ELOCKEDthe unlock time has not been reached
6EALREADY_CLAIMEDthe lock was already claimed
7EDISPATCHABLE_ASSETthe asset is a dispatchable Fungible Asset
8ENO_SURPLUSthe vault holds no surplus above the recorded amount
9ESCHEDULE_TOO_FARthe unlock time exceeds the schedule horizon

vesting#

15 codesCore package
CodeNameMeaning
1EZERO_AMOUNTthe amount is zero
2EZERO_BENEFICIARYthe beneficiary is the zero address
3EINVALID_CURVEthe curve is not cliff, linear, or stepped
4EINVALID_SCHEDULEthe start is not in the future, or start, cliff, and end are out of order for the curve
5EINVALID_STEPSthe step count does not fit the curve: 1 for cliff, 0 for linear, 2–10,000 for stepped
6ENOT_BENEFICIARYthe signer is not the beneficiary
7ENOTHING_TO_CLAIMnothing is currently claimable
8EDISPATCHABLE_ASSETthe asset is a dispatchable Fungible Asset
9ENO_FEE_TO_SWEEPno accrued vesting fee is waiting to be swept
10ENO_SURPLUSthe vault holds no surplus
11ESCHEDULE_TOO_FARthe schedule exceeds the horizon
12ENOT_CREATORthe signer is not the creator
13ENOT_REVOCABLEthe schedule was created irrevocable
14EALREADY_REVOKEDthe schedule was already revoked
15ENOTHING_TO_REVOKEno unvested amount remains to revoke

batch_distribution#

8 codesCore package
CodeNameMeaning
1EEMPTY_BATCHno recipients
2ELENGTH_MISMATCHrecipient and amount lists differ in length
3EBATCH_TOO_LARGEmore than 100 recipients
4EZERO_RECIPIENTa recipient is the zero address
5EZERO_AMOUNTan amount is zero
6EDUPLICATE_RECIPIENTa recipient appears more than once
7ETOTAL_OVERFLOWthe total overflows u64
8EDISPATCHABLE_ASSETthe asset is a dispatchable Fungible Asset

merkle_airdrop#

16 codesCore package
CodeNameMeaning
1EZERO_AMOUNTthe funding or claim amount is zero
2EINVALID_ROOTthe root is not 32 bytes
3EINVALID_SEEDthe campaign seed is empty or longer than 64 bytes
4ESTART_IN_PASTthe claim start is in the past
5EINVALID_ENDthe claim end is not after the claim start
6EINVALID_RECLAIMthe reclaim time is not after the claim end
7EDISPATCHABLE_ASSETthe asset is a dispatchable Fungible Asset
8EPROOF_TOO_LONGthe proof has more than 64 nodes
9EINVALID_PROOF_NODEa proof node is not 32 bytes
10ECLAIM_NOT_ACTIVEthe claim window is not open
11EALREADY_CLAIMEDthe allocation was already claimed
12EINVALID_PROOFthe proof does not match the root
13EALLOCATION_EXCEEDS_REMAININGthe allocation exceeds the remaining campaign balance
14EALREADY_RECLAIMEDa repeated reclaim found an empty vault (see below)
15ERECLAIM_NOT_ACTIVEthe reclaim time has not been reached
16ESCHEDULE_TOO_FARa campaign time exceeds the schedule horizon

In revision 6, a later reclaim sweeps any balance deposited after the first reclaim to the creator and aborts with EALREADY_RECLAIMED only when the vault is empty.

digital_asset_factory#

5 codesCore package
CodeNameMeaning
1EZERO_RECIPIENTthe recipient is the zero address
2EEMPTY_ASSET_NAMEthe asset name is empty
3EEMPTY_COLLECTION_NAMEthe collection name is empty
4EEMPTY_METADATA_URIthe metadata URI is empty
5EOWNER_MISMATCHthe minted asset is not owned by the recipient

digital_asset_lock#

10 codesCore package
CodeNameMeaning
1EUNLOCK_NOT_FUTUREthe unlock time is not in the future
2EZERO_BENEFICIARYthe beneficiary is the zero address
3ENOT_OWNERthe signer does not own the Digital Asset
4ENOT_BENEFICIARYthe signer is not the beneficiary
5ELOCKEDthe unlock time has not been reached
6EALREADY_CLAIMEDthe lock was already claimed
7ENOT_TRANSFERABLEungated transfer is disabled for the Digital Asset
8ECUSTODY_LOSTthe lock no longer owns the Digital Asset
9EUNVERIFIED_ASSETthe Digital Asset was not created by the Trust Stack Digital Asset factory
10ESCHEDULE_TOO_FARthe unlock time exceeds the schedule horizon

payment_stream#

12 codesCore package
CodeNameMeaning
1EZERO_AMOUNTthe amount is zero
2EZERO_BENEFICIARYthe beneficiary is the zero address
3EINVALID_SCHEDULEthe start is not in the future or the end is not after the start
4ENOT_BENEFICIARYthe signer is not the beneficiary
5ENOTHING_TO_CLAIMnothing has accrued since the last claim
6ENOT_CREATORthe signer is not the creator
7ENOT_CANCELABLEthe stream was created non-cancelable
8EALREADY_CANCELEDthe stream was already canceled
9ESTREAM_COMPLETEDthe end time has passed, so the stream can no longer be canceled
10EDISPATCHABLE_ASSETthe asset is a dispatchable Fungible Asset
11ENO_SURPLUSthe vault holds no surplus
12ESCHEDULE_TOO_FARthe end time exceeds the schedule horizon

staking_pool#

13 codesCore package

Code 5 and code 10 are not used.

CodeNameMeaning
1EZERO_AMOUNTthe amount is zero
2EINVALID_SCHEDULEthe start is not in the future or the end is not after the start
3EDISPATCHABLE_ASSETa stake or reward asset is a dispatchable Fungible Asset
4EZERO_ADDRESSthe creator address is the zero address
6EPOOL_ENDEDthe pool reward period has ended
7ENOT_CREATORthe signer is not the pool creator
8ENOT_STAKERthe signer does not own the staking position
9EALREADY_WITHDRAWNthe position was already withdrawn
11ENOTHING_TO_CLAIMno reward is claimable
12EPOOL_ACTIVEthe pool reward period has not ended
13EREWARD_INSOLVENTthe reward vault cannot cover its protected reserve during recovery
14ENO_SURPLUSno surplus is available to recover
15ESCHEDULE_TOO_FARthe reward schedule exceeds the horizon

In revision 6, withdraw always returns principal: an unbacked settled reward is forfeited rather than aborting the withdrawal.

fee_config#

22 codes2 new in rev. 6Core package

Code 16 is not used.

CodeNameMeaning
1ENOT_BOOTSTRAP_AUTHORITYthe signer is not the recorded bootstrap authority
2EALREADY_INITIALIZEDfee configuration already exists
3ENOT_INITIALIZEDfee configuration does not exist
4EZERO_ROLEa role address is the zero address
5ENOT_GOVERNORthe signer is not the fee governor
6ENOT_TREASURY_ADMINthe signer is not the treasury administrator
7ENOT_PENDING_ROLEthe signer is not the pending role holder
8EFEE_ABOVE_CAPa fee exceeds its immutable cap
9ECHANGE_NOT_EFFECTIVEthe effective time has not been reached
10EPENDING_CHANGEa change is already pending
11ENO_PENDING_CHANGEno change is pending
12ERENOUNCEDfee governance was renounced
13ERENOUNCE_NOT_EFFECTIVEthe renunciation delay has not elapsed
14ENO_PENDING_RENOUNCEno renunciation is pending
15EFEE_EXCEEDS_SIGNED_MAXIMUMthe live fee exceeds the maximum fee signed by the user
17ESAME_ROLEthe proposed role holder is the current holder
18ECOLLECTOR_CANNOT_RECEIVEthe collector has no registered SUPRA coin store
19ETERMINAL_SCHEDULE_MISMATCHthe signed terminal schedule differs from the live schedule
20EIMMEDIATE_SCHEDULE_DISABLEDdirect set_schedule is disabled because the schedule delay is nonzero
21EDELAY_TOO_LARGEa governance delay exceeds the schedule horizon
22EDELAY_BELOW_PRODUCTION_MINIMUMa governance delay below 48 hours outside a test chain Rev. 6
23EPROPOSAL_EXPIREDa matured proposal executed more than 14 days after its effective time Rev. 6

asset_policy#

21 codes3 new in rev. 6Core package
CodeNameMeaning
1ENOT_BOOTSTRAP_AUTHORITYthe signer is not the recorded bootstrap authority
2EALREADY_INITIALIZEDthe asset policy already exists
3ENOT_INITIALIZEDthe asset policy does not exist
4EZERO_ROLEthe council address is the zero address
5ENOT_COUNCILthe signer is not the asset-policy council
6EINVALID_METADATAthe address is zero or not a Fungible Asset metadata object
7EPENDING_CHANGEa change is already pending
8ENO_PENDING_CHANGEno change is pending
9ECHANGE_NOT_EFFECTIVEthe effective time has not been reached
10EINVALID_EVIDENCEthe evidence digest is not 32 bytes
11EASSET_NOT_ADMITTEDthe asset has no active admission
12ESAME_ROLEthe proposed council is the current council
13ENOT_PENDING_COUNCILthe signer is not the pending council
14EINVALID_RISK_CLASSthe risk class is not recognised
15EINVALID_POLICY_VERSIONthe policy version is zero
16EFACTORY_ASSETthe asset was created by the Trust Stack token factory and cannot be admitted
17ESCHEDULE_TOO_FARthe effective time exceeds the schedule horizon
18EDELAY_TOO_LARGEa policy delay exceeds the schedule horizon
19EDELAY_BELOW_PRODUCTION_MINIMUMa policy delay below 48 hours outside a test chain Rev. 6
20EPROPOSAL_EXPIREDa council rotation or admission executed after its 14-day window Rev. 6
21ESTALE_COUNCIL_PROPOSALan admission proposed by a council that has since rotated Rev. 6

Dexlyn adapter abort codes#

The separately published dexlyn_lp_lock adapter has its own codes.

8 codesDexlyn adapter
CodeNameMeaning
1EZERO_AMOUNTthe LP amount is zero
2EZERO_BENEFICIARYthe beneficiary is the zero address
3EINVALID_UNLOCK_TIMEthe unlock time is not in the future
4EPOOL_NOT_REGISTEREDthe LP type has no registered Dexlyn pool
5ENOT_BENEFICIARYthe signer is not the beneficiary
6ENOT_UNLOCKEDthe unlock time has not been reached
7EALREADY_CLAIMEDthe lock was already claimed
8ESCHEDULE_TOO_FARthe unlock time exceeds the schedule horizon

Handling a failure#

  1. Preserve the transaction hash if one exists.
  2. Read the VM status and exact module/code in SupraScan.
  3. Re-read the current object and vault state.
  4. Correct the input or lifecycle condition only after determining whether the prior transaction finalized.
  5. Do not retry a claim solely because the UI lost its response.

The TypeScript client converts known validation failures into field-level guidance before signing. Unexpected execution failures retain the transaction hash for investigation.