mirror of
https://github.com/logos-blockchain/lez-programs.git
synced 2026-07-04 05:59:33 +00:00
150 lines
5.3 KiB
Markdown
150 lines
5.3 KiB
Markdown
# AMM UI
|
|
|
|
A QML UI application for the Automated Market Maker (AMM) program.
|
|
|
|
See the [Logos QML UI App Tutorial](https://github.com/logos-co/logos-tutorial/blob/master/tutorial-qml-ui-app.md) for more information.
|
|
|
|
## Wallet / chain integration
|
|
|
|
This app is a `ui_qml` module with a hand-written C++ backend
|
|
(`src/AmmUiBackend.*`, plugin in `src/AmmUiPlugin.*`) that depends on the core
|
|
**`logos_execution_zone`** wallet module. The backend calls the core module's
|
|
wallet FFI through `m_logos->logos_execution_zone.*` and exposes an async QtRO
|
|
surface (`src/AmmUiBackend.rep`) plus an account list model to the QML view.
|
|
|
|
**Onboarding is non-invasive.** The app opens straight to the Trade screen; the
|
|
navbar shows **Connect** (opens a password-only modal) or **Connected** + the
|
|
account selector. There is no path picking — the wallet uses LEZ's canonical
|
|
home, `~/.lee/wallet/` (override with `LEE_WALLET_HOME_DIR`, the same var LEZ
|
|
honors), and its config (`wallet_config.json`) self-initializes.
|
|
|
|
Account/keystore sharing follows the runtime:
|
|
|
|
- **Standalone** (`nix run .`): own core-module instance, but the canonical
|
|
`~/.lee/wallet` keystore is shared with the LEZ wallet UI and any other LEZ
|
|
app on the machine. A previously-created wallet auto-opens on launch.
|
|
- **Inside Basecamp**: the core wallet module is a single shared instance, so on
|
|
startup the backend **adopts** the already-open wallet (see
|
|
`openOrAdoptWallet()`), surfacing **shared** accounts across apps.
|
|
|
|
> Follow-up: the wallet FFI requires explicit `config_path`/`storage_path` even
|
|
> though the wallet crate already defines defaults (`~/.lee/wallet`,
|
|
> `from_path_or_initialize_default`). A `wallet_ffi_create_new_default()` /
|
|
> `_open_default()` upstream would let the app drop its path handling entirely.
|
|
|
|
## Setup
|
|
|
|
This project requires Nix with experimental features enabled. If you haven't already, enable them permanently:
|
|
|
|
```bash
|
|
mkdir -p ~/.config/nix && echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf
|
|
```
|
|
|
|
Install the Logos package manager CLI globally (one-time):
|
|
|
|
```bash
|
|
nix profile install 'github:logos-co/logos-package-manager#cli'
|
|
```
|
|
|
|
This makes `lgpm` available as a global command.
|
|
|
|
## Running the UI standalone
|
|
|
|
Start the UI with:
|
|
|
|
```bash
|
|
nix run .
|
|
```
|
|
|
|
This builds and runs the application in development mode. The Logos bridge is unavailable in standalone mode, but the UI layout and mock data are fully functional.
|
|
|
|
## Running inside Logos Basecamp
|
|
|
|
This app is a UI plugin that depends on the **core wallet module**
|
|
`logos_execution_zone` (see the Wallet / chain integration section above). Both
|
|
have to be installed into Basecamp — the UI plugin alone will show the AMM tab
|
|
but fail to open it with `Failed to load core dependencies for amm_ui`.
|
|
|
|
### 1. Build the LGX packages
|
|
|
|
```bash
|
|
# The AMM UI plugin — development variant (requires nix store at runtime)
|
|
nix build '.#lgx' --out-link result-lgx
|
|
|
|
# Portable variant (self-contained, works without nix)
|
|
nix build '.#lgx-portable' --out-link result-lgx-portable
|
|
|
|
# The core wallet module it depends on. Use the same rev this app pins as the
|
|
# `logos_execution_zone` input in flake.nix so the ImageID/ABI match.
|
|
nix build 'github:logos-blockchain/logos-execution-zone-module?rev=d2e9400ac06c3cdbfc2405b4f153fff9841a453c#lgx' \
|
|
--out-link result-core
|
|
```
|
|
|
|
### 2. Install into Basecamp
|
|
|
|
```bash
|
|
# Launch Basecamp once to initialise its data directory, then quit (see below)
|
|
|
|
# Set the data directory path
|
|
# macOS:
|
|
BASECAMP_DIR="$HOME/Library/Application Support/Logos/LogosBasecampDev"
|
|
# Linux:
|
|
# BASECAMP_DIR="$HOME/.local/share/Logos/LogosBasecampDev"
|
|
|
|
# Install the core wallet module first (into the modules dir), then the UI plugin
|
|
lgpm --modules-dir "$BASECAMP_DIR/modules" \
|
|
install --file result-core/*.lgx
|
|
lgpm --ui-plugins-dir "$BASECAMP_DIR/plugins" \
|
|
install --file result-lgx/*.lgx
|
|
```
|
|
|
|
> **Note:** Use matching variants throughout — dev with dev, portable with portable. Mixing variants causes loading failures. The portable build uses the `LogosBasecamp` data directory instead of `LogosBasecampDev`.
|
|
|
|
### 3. Launch Basecamp
|
|
|
|
```bash
|
|
nix build 'github:logos-co/logos-basecamp' --accept-flake-config -o ~/.basecamp-result
|
|
~/.basecamp-result/bin/LogosBasecamp
|
|
```
|
|
|
|
The AMM UI appears as a new tab in the Basecamp sidebar.
|
|
|
|
> **Note:** `nix run 'github:logos-co/logos-basecamp'` currently fails with
|
|
> `unable to execute ... No such file or directory` — the flake's default app
|
|
> is named `logos-basecamp` but the packaged binary is `LogosBasecamp`. Build
|
|
> the package and run the `bin/LogosBasecamp` wrapper directly, as above.
|
|
|
|
### Installing via the Basecamp UI
|
|
|
|
Alternatively, use the built-in package manager. Install both packages — the
|
|
core module from `result-core/` and the UI plugin from `result-lgx/`:
|
|
|
|
1. Launch Basecamp
|
|
2. Open Package Manager
|
|
3. Select "Install from file"
|
|
4. Choose the core module `.lgx` from `result-core/`, then the UI plugin `.lgx`
|
|
from `result-lgx/`
|
|
|
|
## Updating Dependencies
|
|
|
|
To update the pinned versions of dependencies in `flake.lock`:
|
|
|
|
```bash
|
|
nix flake update
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
**Stale QML cache after rebuild:**
|
|
```bash
|
|
QML_DISABLE_DISK_CACHE=1 ~/.basecamp-result/bin/LogosBasecamp
|
|
```
|
|
|
|
**Reset Basecamp data directory:**
|
|
```bash
|
|
# macOS
|
|
rm -rf ~/Library/Application\ Support/Logos/LogosBasecampDev
|
|
# Linux
|
|
rm -rf ~/.local/share/Logos/LogosBasecampDev
|
|
```
|