basecamp: match install, module and swap docs to the shipped apps

Verified against Basecamp 0.2.3 and the ETH<->LEZ swap app 0.4.4 on Linux.

- install: the released AppImage is named LogosBasecamp-Desktop-<version>-<commit>-<arch>,
  so the literal launch command in the doc matched no file; use the downloaded name.
  Mounting the .dmg is a separate step from dragging the app.
- install-and-load-a-module: there is no Modules view. The sidebar is Applications,
  Package Manager and Settings; module status/CPU/memory and Load/Unload live in
  Settings > Module Inspector. The local-package button is Install Local Package, and
  installs go through an Install Package? confirmation listing dependency changes.
- swap: the app is 0.4.4 and has six tabs (Market, Swap, History, Sell, Refund, Setup).
  There is no Config tab, so Step 3 is rewritten as a check against the Market detail
  pane. Setup has four cards with different button labels, the LEZ HTLC program ID was
  stale, the Market column is SELLER, and the toolbar button is Manage Repositories.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sasha
2026-08-20 17:36:54 +00:00
co-authored by Claude Opus 5
parent 63d4ddc578
commit d8ce180ca7
3 changed files with 59 additions and 63 deletions
@@ -37,8 +37,8 @@ There are two types of modules in Logos Basecamp. [Core modules](../get-started/
## What to expect
- You can install a [module](../get-started/glossary.md#module) from the online catalogue or from a local `.lgx` file.
- You can load or unload a module from the **Modules** view.
- You can read a loading module's status, CPU, and memory in the **Modules** view.
- You can load or unload a core module from **Settings > Module Inspector**.
- You can read a loaded module's status, CPU, and memory in **Settings > Module Inspector**.
:::tip
An introduction to modules in Logos Basecamp is available in video form:
@@ -52,34 +52,34 @@ When installing a module, Logos Basecamp extracts the variant for your platform
### Install from the online catalogue
1. In the sidebar, click **Package Manager** ![](./assets/install-and-load-a-module-in-logos-basecamp/package-manager-icon.png).
2. Browse and locate the module you want. You can click the module to view more details in the content area below.
3. Select the module to install and click **Install**.
4. At the bottom of the sidebar, click the **Modules** ![](./assets/install-and-load-a-module-in-logos-basecamp/modules-icon.png). The newly installed module appears under **UI Modules** or **Core Modules** depending on its type.
2. Browse and locate the module you want. Use the **Categories** and **Types** filters in the left panel, or the search box. The **Type** column shows `core` for core modules and `ui_qml` for UI modules.
3. Click **INSTALL** on the module's row. An **Install Package?** dialogue opens listing any dependency changes; click **Install** to confirm.
4. Wait until the module's **Action** column reads **INSTALLED**. Core modules then appear in **Settings > Module Inspector**, and UI apps appear in the **Applications** view and, after a restart, in the sidebar.
### Install from a local `.lgx` file
1. At the bottom of the sidebar, click **Modules** ![](./assets/install-and-load-a-module-in-logos-basecamp/modules-icon.png).
2. Click **Install LGX Package**.
3. Select the `.lgx` file and confirm.
4. The newly installed module appears under **UI Modules** or **Core Modules** depending on its type.
1. In the sidebar, click **Package Manager** ![](./assets/install-and-load-a-module-in-logos-basecamp/package-manager-icon.png).
2. Click **Install Local Package** in the toolbar.
3. Select the `.lgx` file and click **Open**, then confirm the **Install Package?** dialogue.
4. Core modules appear in **Settings > Module Inspector**; UI apps appear in the **Applications** view and, after a restart, in the sidebar.
## Step 2: Load the module
Loading a module turns an installed module into a running service you can actually use. Each loaded Logos module runs in its own `logos_host` process, so memory usage increases with the number of loaded modules.
1. At the bottom of the sidebar, click **Modules** ![](./assets/install-and-load-a-module-in-logos-basecamp/modules-icon.png).
2. Find the module to load under **UI Modules** or **Core Modules** depending on its type.
3. Click **Load** next to the module.
1. In the sidebar, click **Settings** (the gear icon at the bottom), then open the **Module Inspector** section.
2. Find the module in the list. Its **Status** column reads `NOT LOADED`.
3. Click **Load** next to the module. The status changes to `LOADED` and the CPU and memory columns start reporting.
:::info
You can click **Unload** in the Modules view or close the tab of a module to unload it. Unloading stops the module's host process but not its dependencies, which may still be in use by other modules or UI Apps.
You can click **Unload** in **Settings > Module Inspector**, or close the tab of a module, to unload it. Unloading stops the module's host process but not its dependencies, which may still be in use by other modules or UI Apps.
:::
## Troubleshooting
### The installed module doesn't appear in the Modules view
### The installed module doesn't appear in the Module Inspector
The `.lgx` file probably does not contain a variant for your platform, or it was copied to a directory that Logos Basecamp doesn't scan. Confirm the archive includes a variant matching your platform (`linux-x86_64`, `linux-aarch64`, `darwin-x86_64`, or `darwin-arm64`), then reinstall using **Install LGX Package** in the **Modules** view rather than copying files manually so the package manager copies the files to the correct user modules directory.
The `.lgx` file probably does not contain a variant for your platform, or it was copied to a directory that Logos Basecamp doesn't scan. Confirm the archive includes a variant matching your platform (`linux-x86_64`, `linux-aarch64`, `darwin-x86_64`, or `darwin-arm64`), then reinstall using **Install Local Package** in **Package Manager** rather than copying files manually so the package manager copies the files to the correct user modules directory.
### A QML-based UI App cannot reach the network
+6 -2
View File
@@ -59,7 +59,7 @@ This tutorial is also available in video form:
1. Depending on your OS, install and launch Basecamp as follows:
- On macOS, drag the `.dmg` file into `/Applications`. Then launch Basecamp from `/Applications`.
- On macOS, open the `.dmg` file and drag the Logos Basecamp app inside it into `/Applications`. Then launch Basecamp from `/Applications`.
- On Linux and WSL, install some prerequisites, then grant execute permission to the downloaded AppImage and launch it:
```bash
@@ -68,9 +68,13 @@ This tutorial is also available in video form:
# On Ubuntu 22.04 and earlier, use libfuse2 instead of libfuse2t64
chmod +x LogosBasecamp-Desktop-*.AppImage
./LogosBasecamp-Desktop-x86_64.AppImage # or logos-basecamp-aarch64.AppImage
./LogosBasecamp-Desktop-*-x86_64.AppImage # or ./LogosBasecamp-Desktop-*-aarch64.AppImage
```
Release artifacts carry the version and commit in their name, for example
`LogosBasecamp-Desktop-v0.2.3-aa2377-x86_64.AppImage`, so run the file you actually
downloaded rather than a fixed name.
## Build and run Logos Basecamp from source
1. Clone the repository and enter it:
@@ -21,7 +21,7 @@ This document is accurate for **Testnet v0.2.1**.
The atomic swap app is a Logos [Basecamp](../get-started/glossary.md#basecamp) app that trades tokens across two unrelated chains without an exchange, a bridge, or an escrow agent. This procedure takes you from a fresh Basecamp install to a completed swap against a live counterparty that Logos operates, ending with a receipt you can check on both chains' block explorers.
You install this app from a [catalogue](../get-started/glossary.md#catalogue) URL rather than building it. There's no repository to clone, no Nix, and no local chain. Version `0.4.3` also sets up both of your accounts inside the app: a guided **Setup** tab generates your Ethereum key, then creates, initialises, and funds your [LEZ](../get-started/glossary.md#lez) [account](../get-started/glossary.md#account) in [Step 2](#step-2-set-up-your-accounts). Nothing in this journey needs a command line.
You install this app from a [catalogue](../get-started/glossary.md#catalogue) URL rather than building it. There's no repository to clone, no Nix, and no local chain. Version `0.4.4` also sets up both of your accounts inside the app: a guided **Setup** tab generates your Ethereum key, then creates, initialises, and funds your [LEZ](../get-started/glossary.md#lez) [account](../get-started/glossary.md#account) in [Step 2](#step-2-set-up-your-accounts). Nothing in this journey needs a command line.
## Networks and addresses
@@ -33,7 +33,7 @@ The app ships with these values already filled in. They're listed here so you ca
| Ethereum RPC | `wss://ethereum-sepolia-rpc.publicnode.com` |
| Ethereum HTLC contract, on Sepolia | `0x351B0EA07739FA9F6769213927D7836a790A5FAF` |
| LEZ sequencer | `https://testnet.lez.logos.co` |
| LEZ HTLC program | `27720b5b0345135d8e684eb172c27f5fb237548cc891a3ec889d0ed340504070` |
| LEZ HTLC program | `9eb88f51aae87a58fb74b8d2dc7327b39333585e63280e3f9cf8d86dac0ed702` |
| Ethereum explorer | `https://sepolia.etherscan.io/tx/<TX_HASH>` |
| LEZ explorer | `https://explorer.testnet.lez.logos.co/transaction/<TX_HASH>` |
@@ -68,7 +68,7 @@ The time locks make the failure case safe. Each lock carries a deadline, and you
Basecamp arrives with the official Logos catalogue configured, and it merges that built-in catalogue with any you add yourself. The atomic swap app is published from its own repository, so you add its catalogue first. A catalogue is a small JSON file naming an index of packages, and Basecamp re-reads it whenever the index changes.
1. In the sidebar, click **Package Manager**, then click **Repositories** in the toolbar.
1. In the sidebar, click **Package Manager**, then click **Manage Repositories** in the toolbar.
This opens **Settings** at the **Package Repositories** page, which lists the repositories you're drawing packages from.
@@ -86,11 +86,11 @@ Basecamp arrives with the official Logos catalogue configured, and it merges tha
1. Go back to **Package Manager** and search for `swap`.
**Expected:** two packages from the new repository, `swap` and `swap_ui`, both shown as **ETH ↔ LEZ Atomic Swap** at version `0.4.3`.
**Expected:** two packages from the new repository, `swap` and `swap_ui`, both shown as **ETH ↔ LEZ Atomic Swap**, one of type `core` and one of type `ui_qml`.
1. Install `swap` first, then install `swap_ui`.
Each opens an **Add Application** window listing **Required Packages**. Confirm with **Install** and wait for the stage label to reach `Installed`.
Each opens an **Install Package?** dialogue listing any dependency changes. Confirm with **Install** and wait for the row's **Action** column to read **INSTALLED**.
:::warning
Install `swap` before `swap_ui`. The UI package declares a dependency on the backend, and taking them the other way round leaves the interface with no backend to talk to.
@@ -98,7 +98,7 @@ Basecamp arrives with the official Logos catalogue configured, and it merges tha
1. Restart Basecamp, then open **ETH ↔ LEZ Atomic Swap** from the sidebar.
**Expected:** a row of seven tabs across the top: **Market**, **Config**, **Maker**, **Taker**, **Refund**, **History**, and **Setup**. Along the top you also get live `ETH` and `LEZ` balances with a **Refresh** button, and a status line that settles on `Delivery connected` once the app finds a peer.
**Expected:** a row of six tabs across the top: **Market**, **Swap**, **History**, **Sell**, **Refund**, and **Setup**. Along the top you also get live `ETH` and `LEZ` balances and a status chip that settles on `Connected · <n> peers` once the app finds peers.
On a fresh install, with nothing configured yet, the app opens on the **Setup** tab for you. That's the next step.
@@ -108,7 +108,7 @@ The catalogue is saved in your Basecamp settings and survives restarts. You add
## Step 2: Set up your accounts
A swap needs two identities: an Ethereum key to sign your Sepolia transactions, and an initialised LEZ account to receive your tokens. Version `0.4.3` builds both for you in the **Setup** tab—no command line, and no copying a raw private key between apps. Every field the tab fills is an ordinary **Config** field underneath, so nothing here is hidden from you.
A swap needs two identities: an Ethereum key to sign your Sepolia transactions, and an initialised LEZ account to receive your tokens. Version `0.4.4` builds both for you in the **Setup** tab—no command line, and no copying a raw private key between apps. Every field the tab fills is an ordinary **Config** field underneath, so nothing here is hidden from you.
On a fresh install the app opens on the **Setup** tab automatically. You can also reach it any time from the **Setup** tab at the right-hand end of the tab row.
@@ -118,58 +118,50 @@ The Ethereum key the app generates is a fresh, throwaway key. Fund it with Sepol
1. Open the **Setup** tab.
**Expected:** a page headed **Get set up** with three numbered cards—**1. Ethereum key**, **2. LEZ account**, and **3. Fund it**. Each card's border turns green as you complete it, and a **4. Done** card appears once funding finishes.
**Expected:** a page headed **Get set up**, subtitled `Four steps. No keys to type.`, with four numbered cards—**1. Ethereum key**, **2. LEZ account**, **3. Fund LEZ**, and **4. Get test ETH**. Each card's border turns green and its header gains a `done` label as you complete it.
1. Under **1. Ethereum key**, click **Generate new key**.
1. Under **1. Ethereum key**, click **Generate a key**.
**Expected:** the card shows `done` and displays **Address:** followed by a new `0x…` address. The app writes the matching private key straight into **Config** for you; you never see or paste it.
**Expected:** the card shows `done` and displays **Your address** followed by a new `0x…` address, with a copy button beside it. The app stores the matching private key for you; you never see or paste it.
1. Send Sepolia ETH to that address from a public faucet.
This is the one part that has to happen outside the app, because only you can fund your Ethereum address. It's the LEZ side, not this one, that the app funds for you in the next two cards, so you can send the Sepolia ETH now or while the LEZ funding runs. You'll need it before you take an offer in [Step 4](#step-4-take-a-live-offer).
:::info
The card shows the address but has no copy button. To copy it exactly, open the **Config** tab and copy **Recipient Address** under **Ethereum**, which the app filled with the same address.
Use the copy button beside the address to copy it exactly. Card **4. Get test ETH** also links a
public Sepolia faucet and offers a **Copy faucet link** button.
:::
1. Under **2. LEZ account**, click **Create LEZ account**.
1. Under **2. LEZ account**, click **Create an account**.
**Expected:** the card shows `done` and displays **Account:** followed by your new [account](../get-started/glossary.md#account) ID. Nothing is on-chain yet—creating the account is local, and the next card is what puts it on-chain.
**Expected:** the card shows `done` and displays **Your account** followed by your new [account](../get-started/glossary.md#account) ID. Nothing is on-chain yet—creating the account is local, and the next card is what puts it on-chain.
1. Under **3. Fund it**, click **Fund my account**.
1. Under **3. Fund LEZ**, click **Add funds**.
**Expected:** the button changes to **Setting up…** and a status line appears with a live seconds counter. It initialises your account on-chain, then claims `150` LEZ from the [Piñata](../get-started/glossary.md#piñata) faucet—each phase needs a proof-of-work solve and an on-chain commit, and testnet blocks can be a minute or more apart, so the counter keeps moving to show it isn't stuck. When it finishes, the card shows `done`, the status reads **Funded and ready**, and a **4. Done** card appears with a **Go to Market** button.
**Expected:** a status line appears with a live seconds counter. It initialises your account on-chain, then claims `150` LEZ from the [Piñata](../get-started/glossary.md#piñata) faucet. Each phase needs a proof-of-work solve and an on-chain commit, and testnet blocks can be a minute or more apart, so the counter keeps moving to show it isn't stuck. When it finishes, the card shows `done`, the button becomes **Add more**, and the status reads `LEZ funded - 150 LEZ - 1 claim confirmed`.
:::info
The **Fund my account** button initialises the account for you, so you can't forget to. That matters because an uninitialised LEZ account is the most confusing failure in this app: the sequencer silently discards transactions that reference an account it has never seen initialised, so a swap simply stalls rather than failing. If a swap ever does nothing at all, re-running **Fund my account** re-checks the initialisation.
The **Add funds** button initialises the account for you, so you can't forget to. That matters because an uninitialised LEZ account is the most confusing failure in this app: the sequencer silently discards transactions that reference an account it has never seen initialised, so a swap simply stalls rather than failing. If a swap ever does nothing at all, re-running **Add funds** re-checks the initialisation.
:::
## Step 3: Confirm your configuration
The **Config** tab holds every endpoint, address, and key the app uses, grouped under **Ethereum**, **LEZ**, and **Swap parameters**. After the **Setup** tab, the key fields are already filled and the network values ship pre-filled, so this step is a check rather than a data-entry exercise. You can skip it and still complete a swap; it's here so you can see what **Setup** did and confirm nothing is off.
Version `0.4.4` has no **Config** tab: the network endpoints ship pre-filled and the **Setup** tab
writes your keys for you, so there is nothing to enter by hand. Use the values in
[Networks and addresses](#networks-and-addresses) to check what the app is using.
1. Open the **Config** tab.
1. Open the **Market** tab and click any offer.
1. Under **Ethereum**, confirm **RPC URL** is `wss://ethereum-sepolia-rpc.publicnode.com` and **HTLC Contract Address** is `0x351B0EA07739FA9F6769213927D7836a790A5FAF`.
1. In the detail pane on the right, confirm **ETH contract** reads `0x351B0E…0A5FAF` and
**LEZ program** reads `9eb88f5…0ed702`. Both rows have copy buttons if you want to compare them
in full.
1. Still under **Ethereum**, confirm **Private Key** and **Recipient Address** are populated. **Setup** filled both from the key it generated in [Step 2](#step-2-set-up-your-accounts). **Recipient Address** is where your bought tokens' counterpart settles, so it's the address belonging to that same key.
1. Under **LEZ**, confirm **Sequencer URL** is `https://testnet.lez.logos.co` and **HTLC Program ID** is `27720b5b0345135d8e684eb172c27f5fb237548cc891a3ec889d0ed340504070`.
1. Still under **LEZ**, confirm **Signing Key** is populated. **Setup** filled it from the LEZ account it created in [Step 2](#step-2-set-up-your-accounts).
Leave **Wallet Home**, **Wallet Account ID**, and **Taker Account ID** empty. The app authenticates to the LEZ with the signing key, so the wallet fields aren't needed. **Taker Account ID** is an optional maker-side setting—a list of counterparties you'd allow to take your offers—and taking an offer doesn't need it. **Wallet Home**'s placeholder, `.scaffold/wallet`, is a path from the app's development setup that doesn't exist on a machine that installed from the catalogue.
1. Leave **Swap parameters** alone.
These set the terms of offers you'd publish as a maker. When you take someone else's offer, the amounts and time locks come from that offer instead.
**Expected:** no red text under any field, and the **Market** tab's status chip reads `Config ready`. There's no save button. The app validates and saves as you type, roughly half a second after you stop.
If a field is wrong, the app says so directly underneath it, with messages like `Required`, `Must be a 20-byte ETH address`, or `Must be a 32-byte hex program ID`. Fix those before continuing, because the app refuses to start a swap while any remain.
1. Confirm the header shows your `ETH` and `LEZ` balances and the status chip reads
`Connected · <n> peers`, and that the board's own chip reads `Ready to trade`.
:::info
The contract at `0x351B0EA07739FA9F6769213927D7836a790A5FAF` is version 2 of the Ethereum HTLC. Earlier builds of this app pointed at a version 1 contract at `0x8636Fe66DFee166589a913140f14d5F57394834A`, which is still deployed and still responds. It's written out in full here so you can check character by character that you aren't on it, because the two are easy to confuse and the failure is unhelpful. Version 1 has no `INTERFACE_VERSION` function, so the app's compatibility check reverts against it and swaps don't start. If you've used this app before, replace the address with the one above.
The contract at `0x351B0EA07739FA9F6769213927D7836a790A5FAF` is version 2 of the Ethereum HTLC. Earlier builds of this app pointed at a version 1 contract at `0x8636Fe66DFee166589a913140f14d5F57394834A`, which is still deployed and still responds. It's written out in full here so you can check character by character that you aren't on it, because the two are easy to confuse and the failure is unhelpful. Version 1 has no `INTERFACE_VERSION` function, so the app's compatibility check reverts against it and swaps don't start.
:::
## Step 4: Take a live offer
@@ -178,7 +170,7 @@ Logos runs a maker on this testnet. It publishes offers and waits for someone to
1. Open the **Market** tab.
**Expected:** a live tape with the columns `OFFER`, `RATE LEZ/ETH`, `MAKER`, `AGE`, and `EXPIRES`. The board rescans every five seconds.
**Expected:** a live tape with the columns `OFFER`, `RATE LEZ/ETH`, `SELLER`, `AGE`, and `EXPIRES`, and a `next scan` progress bar that rescans every few seconds.
When our maker is online, it advertises `10 LEZ` for `0.00001 ETH`, and that's the offer the rest of this step follows. The board can also be legitimately empty, because offers are live broadcasts rather than stored listings. If you see no offers, work through [The Market tab is empty](#the-market-tab-is-empty) and come back.
@@ -188,16 +180,16 @@ Logos runs a maker on this testnet. It publishes offers and waits for someone to
1. Click **Accept—buy 10 LEZ**.
If the button is disabled, the app shows why immediately beneath it, such as `Complete configuration first → Config` or `This offer has expired`.
If the button is disabled, the app shows why immediately beneath it, for example that the offer has expired.
1. Switch to the **Taker** tab and watch it run.
1. Switch to the **Swap** tab and watch it run.
**Expected:** the progress stepper ticks through `Generate Preimage`, `Lock ETH`, `ETH Locked`, `Wait for LEZ Lock`, `LEZ Lock Detected`, `Verify LEZ Escrow`, `LEZ Escrow Verified`, `Claim LEZ`, and `LEZ Claimed`. It usually takes one to three minutes, most of it waiting on Sepolia confirmations.
1. Click **Refresh** in the header and confirm your `LEZ` balance rose by `10`.
:::info
Offers are live announcements, not stored listings. Nothing retains them, so the **Market** tab can only show what a maker is broadcasting at that moment. The board says as much under the tape: `Offers are advertisements — a swap completes only if the maker is live.`
Offers are live announcements, not stored listings. Nothing retains them, so the **Market** tab can only show what a maker is broadcasting at that moment. The board says as much under the tape: `Offers are advertisements — a swap completes only if the seller is still online.`
:::
## Step 5: Read your receipt and verify it
@@ -242,27 +234,27 @@ Restart Basecamp. A newly installed app reaches the sidebar only after a restart
### The Market tab is empty
Read the empty state, because it names the cause. `Finish network setup to browse` means your configuration isn't valid yet, so the app never subscribed to anything. `Connecting to the swap network…` means the app hasn't found a delivery peer yet, which usually resolves on its own within a minute. `No offers on the board yet` means you're connected and configured, and the maker is simply offline for the moment. Wait a few minutes and let the board rescan. Because nothing retains offers, the tab can only ever show what's being broadcast right now.
Read the empty state, because it names the cause. A message about finishing setup means the **Setup** tab has not completed, so the app never subscribed to anything. `Connecting to the swap network…` means the app hasn't found a delivery peer yet, which usually resolves on its own within a minute. `No offers on the board yet` means you're connected and configured, and the maker is simply offline for the moment. Wait a few minutes and let the board rescan. Because nothing retains offers, the tab can only ever show what's being broadcast right now.
### The app can't connect to Ethereum
Check **RPC URL** begins with `wss://` and not `https://`. The app opens a WebSocket subscription to watch for lock and claim events, and an `https://` endpoint fails at that point even though it's perfectly valid for ordinary calls. The field's own hint says the same thing.
The bundled **RPC URL** begins with `wss://`, not `https://`. The app opens a WebSocket subscription to watch for lock and claim events, and an `https://` endpoint fails at that point even though it's perfectly valid for ordinary calls. The field's own hint says the same thing.
### The swap does nothing and no error appears
Your LEZ account is almost certainly uninitialised. The sequencer discards transactions for an account it has never seen initialised and returns no error, so the app has nothing to report. Open the **Setup** tab from [Step 2](#step-2-set-up-your-accounts) and click **Fund my account** again—it re-checks the on-chain initialisation and tops the balance back up. Confirm the balance is genuinely positive before retrying.
Your LEZ account is almost certainly uninitialised. The sequencer discards transactions for an account it has never seen initialised and returns no error, so the app has nothing to report. Open the **Setup** tab from [Step 2](#step-2-set-up-your-accounts) and click **Add more** again—it re-checks the on-chain initialisation and tops the balance back up. Confirm the balance is genuinely positive before retrying.
### The Taker tab reports `ETH lock rejected`
### The Swap tab reports `ETH lock rejected`
The maker refuses a lock that doesn't leave it enough time to respond, and the Ethereum contract enforces its own floor of 300 seconds. Your Ethereum deadline has to sit comfortably beyond the LEZ one, not just after it. This shows up when a swap is started against an offer that's nearly expired, so take a freshly published one. The maker keeps waiting rather than failing, so your **Taker** tab appears to stall.
The maker refuses a lock that doesn't leave it enough time to respond, and the Ethereum contract enforces its own floor of 300 seconds. Your Ethereum deadline has to sit comfortably beyond the LEZ one, not just after it. This shows up when a swap is started against an offer that's nearly expired, so take a freshly published one. The maker keeps waiting rather than failing, so your **Swap** tab appears to stall.
### There isn't enough LEZ in the account
Open the **Setup** tab from [Step 2](#step-2-set-up-your-accounts) and click **Fund my account** again. Each run claims `150` LEZ from the Piñata faucet, so repeat it until the balance covers what you need.
Open the **Setup** tab from [Step 2](#step-2-set-up-your-accounts) and click **Add more** again. Each run claims `150` LEZ from the Piñata faucet, so repeat it until the balance covers what you need.
### A swap stopped halfway and the funds are still locked
This is the case the time locks exist for, and no funds are at risk. Copy **ETH swap ID (lock)** from the receipt in the **History** tab, open the **Refund** tab, paste it into **Swap ID** under **ETH refund**, and click **Refund ETH** once your deadline has passed. The contract enforces that deadline, so an early attempt fails outright rather than passing silently. Reclaiming returns your ETH in full, less gas.
This is the case the time locks exist for, and no funds are at risk. Copy **ETH swap ID (lock)** from the receipt in the **History** tab, open the **Refund** tab, paste it into the **Swap ID** field under **ETH refund**, and click **Refund ETH** once your deadline has passed. The contract enforces that deadline, so an early attempt fails outright rather than passing silently. Reclaiming returns your ETH in full, less gas.
## Next steps