mirror of
https://github.com/logos-blockchain/lez-programs.git
synced 2026-08-25 14:11:09 +00:00
Both liquidity branches now quote through the lean ops (liquidityQuote /
addLiquidityQuote), so quoteNewPosition and the heavy amm_quote machinery it
drove are unreachable. Remove them end to end.
FFI (modules/amm/ffi):
- Drop the amm_quote entry point and the whole quote-evaluation graph:
api/{accounts,commitment,funding,position}.rs, the QuoteRequest /
PositionRequest / PairSnapshot request types, quote_error::fatal_quote, and
api/clock.rs (its decode_clock was quote-only). quote.rs keeps only the shared
opening-deposit math (minimum_opening_pair + helpers) that liquidity_quote
reuses.
- Trim the fields the quote path was the sole reader of: SelectedHolding.account
and PairIds.{token_program,twap_program}.
- Drop the quote-path unit tests; keep the math / pair / context / holding /
swap ones (37 pass, clippy clean).
Module (modules/amm/src):
- Remove AmmModuleImpl::quoteNewPosition and its buildQuoteInput snapshot helper.
App (apps/amm):
- Remove the AmmUiBackend quoteNewPosition slot (.rep/.h/.cpp) and the dead QML
backend mock + obsolete fresh-quote test.
- finishSubmitFailure no longer keeps a submit-returned re-quote (the lean submit
ops never return one); it always re-quotes on failure.
- submissionSnapshot drops the always-empty quoteHash and derives the confirm
dialog's action from the resolved pool state instead of the dead
quotePayload.instruction (restores the "Create pool" / "Add liquidity" label).
AMM UI tests
UI-driven tests for the AMM app, driving the running app through the QML
inspector (framework from
logos-co/logos-qt-mcp):
swap.mjsselects two tokens, enters an amount, submits a swap, and verifies the A/B pool reserves changed on-chain.create-pool.mjsselects the A/C pair (which the setup script leaves unseeded — only A/B is created), submits a pool creation, and verifies the A/C pool now exists on-chain.add-liquidity.mjsselects the seeded A/B pair, asserts the CTA stays disabled until deposit amounts are entered, submits an add, and verifies the A/B pool reserves grew on-chain.
Isolation
Test runs never touch your personal setup. Everything test-related lives under
apps/amm/tests/testnet/ and is git-ignored:
| Concern | Test (isolated) | Your local dev |
|---|---|---|
| Wallet home | apps/amm/tests/testnet/.wallet/ |
~/.lee/wallet/ |
| Token config | apps/amm/tests/testnet/amm-tokens.json |
apps/amm/amm-tokens.json |
testnet/setup-amm-testnet.sh bootstraps an isolated wallet from a fixed
mnemonic (test test … junk) so the token/holding account ids are
deterministic and reproducible across machines, then deploys the programs,
creates a seeded pool, and writes the test token config.
Full isolated run
From the repo root, with wallet / spel / cargo / nix on PATH, a
local sequencer running, and the guest binaries built (make build-programs):
# 0. Once: build the JS test framework (symlinked where swap.mjs expects it)
nix build .#test-framework -o apps/amm/result-mcp
# 1. Bootstrap the isolated wallet + deploy programs + create the pool.
# Writes apps/amm/tests/testnet/{.wallet, amm-tokens.json}. Nothing else is touched.
TEST_SEQUENCER_ADDR=http://127.0.0.1:3040 apps/amm/tests/testnet/setup-amm-testnet.sh
# 2. Terminal 1 — launch the UI against ONLY the isolated wallet + test tokens.
LEE_WALLET_HOME_DIR=$(pwd)/apps/amm/tests/testnet/.wallet \
AMM_PROGRAM_BIN=$(pwd)/programs/amm/methods/guest/target/riscv32im-risc0-zkvm-elf/docker/amm.bin \
TOKENS_CONFIG=$(pwd)/apps/amm/tests/testnet/amm-tokens.json \
nix run .#amm-ui
# 3. Terminal 2 — drive a test; watch it click through the live UI.
node apps/amm/tests/swap.mjs # swap against the seeded A/B pool
node apps/amm/tests/create-pool.mjs # create the (unseeded) A/C pool
node apps/amm/tests/add-liquidity.mjs # add liquidity to the seeded A/B pool
Headless CI variant (no window, launches the app itself, pass/fail only):
nix build .#integration-test -L
Notes
- Wallet password. The wallet's key storage is encrypted with a password —
the one you enter to unlock it (the UI's Connect modal) so the app can
sign transactions. First-time setup reads a throwaway password (the script
feeds it via stdin, so it doesn't block), then
restore-keysrebuilds the wallet from the test mnemonic and sets the real password toTEST_WALLET_PASSWORD(defaulttest). So unlock the UI withtest. Prefer no password? Run withTEST_WALLET_PASSWORD=""and unlock with an empty password. - Re-bootstrap.
FORCE_BOOTSTRAP=1 apps/amm/tests/testnet/setup-amm-testnet.shre-restores the isolated.wallet(rewrites only that directory). - Overrides.
TEST_WALLET_HOME,TEST_MNEMONIC,TEST_WALLET_PASSWORD,TEST_WALLET_DEPTH,TEST_SEQUENCER_ADDR— see the script header. - Framework location.
swap.mjsloads../result-mcpby default; override withLOGOS_QT_MCP=/abs/path/to/result-mcp. - Artifacts. On failure
swap.mjsprints theSwapCardstate and savesapps/amm/tests/swap-*.png(git-ignored) for inspection.
Files
swap.mjs— the end-to-end swap UI test (A/B pool).create-pool.mjs— the end-to-end create-pool UI test (creates the A/C pool).add-liquidity.mjs— the end-to-end add-liquidity UI test (adds to the A/B pool).testnet/setup-amm-testnet.sh— isolated testnet + wallet bootstrap (TKA/TKB/TKC, seeds the A/B pool only).qml/,cpp/— the module's own QML/C++ unit tests.