Logos DEX UX review

Hands-on test of the AMM app (“Logos DEX App”) inside Logos Basecamp v0.3.1 · lez-programs main @ 64c0121 · 5 Oct 2026

The trading engine is solid; getting to it is the problem. Against a working deployment, every flow I tried landed on-chain exactly as the app quoted it: swap, add liquidity, remove liquidity, and creating a pool. But a user who installs the app from the Basecamp catalog today can't trade at all.

Four things stand in the way, before any interaction problem:

Once past those, the biggest everyday problem is that amounts are raw base units: you can't type 0.5.

4blockers before a first trade
8major UX issues
4 / 4core flows land exactly as quoted (local chain)

How I tested

Blockers: a new user can't reach a working DEX

BlockerThe testnet deployment the app points to is gone

Testnet has been reset and upgraded since 10 Sep. The AMM config, both token definitions, the vaults and the TKA/TKB pool now all return empty accounts. The v0.2.4 CLI can't even decode the sequencer's responses any more.

Yet DEPLOYMENTS.md, artifacts/amm-registry.testnet.json and the module's network config still describe the v0.2.4 deployment. The app turns this into the raw error amm_not_initialized plus “No pool / no liquidity”.

Swap card showing amm_not_initialized and No pool / no liquidity
What a user sees on testnet today: a raw error code, “No funds” on both sides, and “No pool / no liquidity” for a pool that was live in September.

Fix: redeploy to the current testnet and update the registry and DEPLOYMENTS.md. Add a smoke check (CI or a cron job) that reads the registry's config account, so a reset is noticed the same day.

BlockerThe Basecamp catalog ships an outdated, incompatible build

The catalog's “Logos DEX App” installs DEX App v0.1.0 + DEX Core v0.1.0 (published 3 Sep), while the repo is at v0.3.0. It pairs them with LEZ Core v0.5.0.

The install itself is smooth: one button installs all three packages.

Catalog entry listing v0.1.0 app and core with LEZ Core v0.5.0
The catalog entry: v0.1.0 packages with LEZ Core v0.5.0.
Catalog install, from browsing to first launch (condensed).

Fix: publish v0.3.0 to the catalog together with a compatible LEZ Core, and declare version constraints between the DEX Core and LEZ Core.

BlockerThe app starts with no tokens and no pools

Out of the box the registry URL in Settings is empty (“Leave empty to load none”). The token picker says “No tokens found”, Explore is empty, and nothing hints that a URL is needed or where to find one.

Pasting a token's definition ID into the swap picker's search doesn't help either. The Settings field also stays blank when a registry is active via AMM_REGISTRY_URL, so it never shows what's in use.

Token picker showing No tokens found
A fresh catalog install: no tokens.
Settings modal with empty registry URL
Settings: the registry URL is empty, with no default. The Network dropdown is an unstyled native widget.

Fix: ship the official registry URL as the default; show the active source in Settings; add an empty-state message pointing to Settings.

BlockerWallet module version changes strand the user

Wallet error dialog: Wallet could not be opened
A dead end with no way forward.
Header shows Connect again after wallet creation
After creating a wallet the header says “Connect” again: the sync failed and the UI said nothing.

Fix: surface the real error and offer restore-from-phrase or create-new; tell the user when sync fails; migrate or version-check wallet storage.

Major UX issues: once it works

MajorAmounts are raw base units, and decimals are swallowed

Swap field shows 15 after typing 1.5
Typed 1.5, got 15; the quote treats it as 15.
Liquidity form error: whole raw units
Liquidity form: an explicit rejection.
Basecamp search box showing 1.5 2,5
Control test: the same keys work in Basecamp's search box.

Fix: take human amounts everywhere. Add a decimals field to the registry and token metadata, convert at the boundary, and accept the locale's decimal separator.

MajorBalances are unformatted 21-digit strings, truncated in the middle

The holding selectors run an account ID straight into a raw balance (3b11459.....999990000). The truncation hides exactly the digits that change after a trade.

The Liquidity form shows Balance 999999999999999999990000, and LP amounts appear as “raw LP”. The same token is “TKA” in one place and “TOKEN A” in the next.

Swap card holding selectors with raw truncated balances
Swap card holding selectors.

MajorThe add-liquidity summary implies spending your whole balance

Open “Add liquidity” with both amount fields at 0, and the summary reads “Expected spend 999999999999999990000 TOKEN A + 980396039603960386235 TOKEN B”, which is essentially the entire balance.

It corrects itself once you type an amount (100 → “99 TOKEN A + 98 TOKEN B”, which is what landed on-chain). The first impression is alarming, though.

Add liquidity summary showing full-balance spend with zero inputs
Fields at 0; summary says “spend everything”.
Add liquidity summary correct with 100 entered
After typing 100: correct.

MajorNo “confirmed” state, stale data afterwards, and forms that aren't reset

Swap submitted toast
A transient toast with the tx hash; nothing afterwards.
Pool detail with stale pre-removal reserves
25 s after removing 50%: stale reserves, no message.

Fix: poll the tx or the account until it's included, then show success or failure and refresh balances, the pool and positions.

MajorA pool you create is invisible in the app

I created a TKA/TKC pool through the app (it landed; the wallet holds 9,000 LP). It appears in neither Explore nor Positions, because both lists come only from the registry file. The only way to see the position again is to edit a JSON file.

Explore page listing only TKA/TKB after creating TKA/TKC
Right after creating TKA/TKC: only TKA/TKB is listed.

MajorError messages blame the wrong thing

Fix: map error codes to plain language and distinguish “disconnected”, “network/read error” and “pool doesn't exist”.

MajorCreating a pool defaults to locking 99.9% of the deposit

The form pre-fills the bare minimum (1,001 + 1,001). Its own summary then reads “Expected LP 1 raw LP”, “Locked LP 1000 raw LP”: the creator would permanently give up 99.9% of the deposit's value. Nothing warns about this, and the confirmation dialog doesn't mention the locked amount.

Rows like “Deposit multiplier 1x minimum” and “Deposit scale 10000 basis points” are internal jargon.

Create pool form with minimum default deposit
The default: 1 LP to you, 1,000 locked.
Create pool confirmation without locked LP
The confirmation omits the lock.

MajorThe wallet unlocks without a password

On every relaunch the existing wallet opened and connected straight away, with no password prompt. The README presents this as a feature, but it means anyone at the machine gets a signing-capable wallet.

Polish

Unstyled create wallet dialog
Unstyled wallet dialog.
Pool detail with mixed number formats
Pool detail: mixed 0,01% and 0.98 formats.

What works well

GoodWhen the chain is reachable, the numbers are right and the core screens are thoughtfully designed.

FlowApp showedOn-chain result
Swap 100 TKA → TKB98 out, min 97reserves 10,100 / 9,902 ✓
Add liquidity (100 entered)99 A + 98 B → 98 LP10,199 / 10,000, LP 10,098 ✓
Remove 50%4,594 A + 4,504 B5,605 / 5,496, LP 5,549 ✓
Create TKA/TKC pool9,000 LP, 1,000 lockedincluded in block ✓
Swap quote 100 TKA to 98 TKB
An accurate quote (the 0.0100 TKA fee is right: this instance charges 1 bps).
Remove liquidity sheet
The remove sheet.

Developer notes (repo test tooling)

Local setup used for round 2: the v0.2.4 standalone sequencer built from the logos-execution-zone tag, the repo's release guest binaries (same AMM program ID as testnet, cf93244a…), and the deterministic test wallet. The local instance's swap fee is 1 bps.

Recordings

Condensed: frames where nothing changed are dropped, so waiting time is cut.

Creating a wallet from the swap screen (catalog build, testnet).
No registry: empty pickers, pasting an ID doesn't help.
A successful swap on the local chain.
Pool detail, add liquidity, positions, remove 50%.
Creating TKA/TKC, then it's missing from Explore.