Debugging And Help
Most Frontier debugging failures come from mixing environments, package ids, object ids, display names and wallet state.
Start by proving the boundary that failed.
First Triage
Section titled “First Triage”| Symptom | First Check |
|---|---|
| Object not found | Wrong network, stale object id or wrong package lineage. |
| Transaction fails | Re-read object version, owner capability and package target. |
| Wallet connects but character is missing | Check PlayerProfile lookup and EVE Vault connection state. |
| Name is unresolved | Check whether the value is static-client, World API or Registry-derived. |
| Route looks wrong | Check system ids, route edges and coordinates separately. |
| Event index misses rows | Check package id, module filter, cursor and provider retention. |
| dApp works outside game but not in-game | Check tenant, itemId, frame context and extension availability. |
Do not debug from a display name first. Debug from object id, type id, system id, transaction digest or event id.
Minimum Debug Record
Section titled “Minimum Debug Record”When asking for help, collect:
- environment
- Sui network
- world package id
- function target or event type
- object id
- transaction digest
- expected behaviour
- actual error
- whether it fails before signing, during signing, after submission or during indexing
Redact private keys, session tokens, cookies and private operational data.
Environment Drift
Section titled “Environment Drift”Many failures are caused by environment drift:
- Utopia vs Stillness
- old package id vs current package id
- localnet object id copied into testnet
- testnet GraphQL endpoint used with a mainnet object
- World API current state compared with historical chain data
- old static-client extraction used after a patch
Keep an environment block in each project:
environment = stillnesssui_network = testnetworld_package = 0x...current_cycle = 6static_client_build = ...Do not keep those values only in screenshots or chat.
Transaction Debugging
Section titled “Transaction Debugging”Before changing code, answer these questions:
- did the wallet connect to the expected address?
- does that address resolve to the expected character?
- does the character hold the required
OwnerCap? - is the target object current?
- is the target package id current?
- are all item type ids correct?
- does the transaction use the right gas owner or sponsor path?
- does a dry-run or dev-inspect fail earlier than the live submission?
If the failure is a Move abort, inspect the module and function that aborted. Do not paper over it with a generic UI message.
Indexer Debugging
Section titled “Indexer Debugging”For indexers:
- log package id, module and event type
- persist cursor after successful writes
- make writes idempotent
- handle empty pages
- store raw event payloads before normalising
- track provider range errors separately from parser errors
- expose freshness and cursor lag
- replay from a known checkpoint in a test database before rewriting production state
If you cannot prove that a row came from a public source, do not publish it as verified Registry data.
UI Debugging
Section titled “UI Debugging”For public explorers and dApps:
- show unresolved values as unresolved
- keep IDs copyable on detail views
- keep raw source links reachable
- display freshness near operational data
- do not hide source gaps by filling with guesses
- do not use a stale export to decide whether to move assets
Use Black Relay for source-labelled display values. Use direct Sui reads for final transaction state.
Where To Look Next
Section titled “Where To Look Next”| Problem | Page |
|---|---|
| Toolchain setup | Environment And Identity |
| Direct reads | Sui CLI And GraphQL |
| Package ids | World Upgrades |
| Assembly extensions | Smart Assemblies |
| Storage logic | Programmable SSUs |
| Static-client fields | Static Client Data |
| Data boundaries | Source Map |