BasicSwap v0.19.0: Smart Buy, Nostr Messaging, and More Reliable Swap Accepts
BasicSwap v0.19.0 adds Smart Buy in beta, batched swap funding, Nostr messaging and a Networks settings tab, updates SimpleX Chat and Firo, and fixes repeated swap accepts.

BasicSwap v0.19.0 begins the 0.19 series with a substantial update to how you plan and fund swaps and how peers communicate. Smart Buy arrives in beta to handle the offer-by-offer calculations for you, so you can enter how much you want to pay or receive and review the proposed bids before placing them. Corrected redeem fee estimates for Monero-family coins and reverse offers also give you a more accurate view of the expected cost when planning a buy spread across several offers.
On the messaging side, the new Networks tab brings SMSG, SimpleX, and the newly added Nostr transport into one settings page, while the default SimpleX Chat version moves to v7.0.0. Alongside these network changes, the release fixes how adaptor-signature swaps handle repeated accepts and assemble the separate messages that carry their proofs.
For existing installations, the release also updates Firo to v0.14.18.1 and upgrades a v0.18.10 installation's database from schema v38 to v40 on first startup.
Most notable updates
Smart Buy works through the offers for you
To start a Smart Buy, choose the coins you want to pay and receive, enter an amount on either side, and set the maximum number of bids you are willing to place. BasicSwap then compares eligible offers using their rates, minimum amounts, and estimated redeem fees, giving you a preview of the proposed bids and the estimated net amount you would receive (PR #728).

The price ceiling can follow the market rate or the best eligible offer, with defaults of up to 15 bids and a ceiling 5% above the market rate. If no market rate is available, that planning mode stops with an error, so you will need to use the best-offer anchor or pick offers manually to continue. Picking offers yourself bypasses the automatic price ceiling, so review their rates and the total before confirming (backend commit 8449a18, interface commit bf7f6ce).
After you place the bids, the bids page groups them under the same buy, while Smart Buy's History tab lets you return to earlier buys and retry a shortfall. Each bid still depends on its own counterparty and swap progress, so a failed bid does not roll back bids that were placed successfully (PR #728).
Funding several bids together
Placing several bids together also means preparing their funding without having them compete for the same wallet outputs. For a reverse adaptor-signature buy where the buyer funds separate chain-A locks, BasicSwap reserves distinct inputs for each bid where the coin supports input selection, splitting wallet outputs first if needed so the locks can be prepared together (commit f580f33).
On supported coins, ready adaptor-signature bids in the same placement group can share one chain-B funding transaction, while secret-hash bids can share one participate transaction with a separate lock output for each swap. Since the bids will not necessarily become ready together, BasicSwap waits within bounded deadlines before allowing the ready bids to proceed, leaving slower bids to fund separately when needed. Where it can measure a lock's remaining window, it also checks that window before extending the wait (commits 8449a18, 98d0661).
Scripts can use the same planning and placement functions through POST /json/bids/plan, which returns a preview without placing bids, and POST /json/bids/bulk, which places the supplied bids and reports successes and failures separately. Bid listings include a plan_id for grouped bids and their stored plan_target, allowing a client to track a buy across retries (API documentation).
Nostr joins the message networks
Nostr can now carry BasicSwap offers, bids, and swap messages, either alongside the existing message networks or as your selected transport. Add it under Settings > Networks, or run basicswap-prepare --datadir="$SWAP_DATADIR" --addnetwork=nostr with your installation's data directory, then restart BasicSwap. The prepare command accepts NOSTR_RELAYS and NOSTR_POW_TARGET environment variables when you want to change its relay list or outgoing proof-of-work target (PR #754, Nostr guide).
Bid and swap payloads retain BasicSwap's SMSG encryption, while each newly negotiated direct Nostr route gets its own signing key pair, separate from wallet keys and the persistent key used for broadcasts. Those separate keys reduce linkage between routes, but relays can still observe the outer signing key, message timing, and event size, and public offers remain readable to anyone with the shared BasicSwap network key. If you enable Tor in BasicSwap, Nostr uses the configured Tor proxy for its relay connections (commit 669e182).
The Networks tab lets you enable or disable the configured transports, adjust Nostr and SimpleX settings, and enable optional network bridging for nodes that need to communicate across different transports. Adding a network through prepare keeps the others enabled, and the disable command refuses to remove the last enabled network; /json/networks also reports which networks are enabled and active (PR #754).
SimpleX Chat v7 and group changes
The SimpleX Chat default moves from v6.3.5 to v7.0.0, and newly prepared SimpleX configurations use the official BasicSwap group link unless you supply another one. Changing a recorded group link now causes BasicSwap to leave the existing groups and join the replacement on restart, while keeping direct contacts used for bid messages; if the node owns an existing group, it refuses the switch until you resolve that group in SimpleX Chat (PR #753).
Existing installations need one restart before changing groups, because the first startup records the configured link if there is no joined link on file. The release also makes temporary send failures retryable when the simplex-chat client is unreachable, and corrects prepare's server-address setting to read SIMPLEX_SERVER_ADDRESS, which the older code mistakenly took from SIMPLEX_CHAT_VERSION (commit ed63285).
Repeated accepts keep the same swap transactions
An adaptor-signature accept contains the lock transaction, refund transactions, and proof material that both peers need to agree on before the swap proceeds. BasicSwap now saves that prepared accept before sending it and reuses the saved contents on a retry, including for reverse bids, so a retry does not create a different lock transaction and proof for the same bid (PR #749).
The separate proof messages now identify the parent message they complete when both peers support the updated protocol, so proof parts that name a different accept are excluded during assembly. While a bidder is still receiving an accept, it can replace that accept with a later one; for older peers whose proof messages lack a parent ID, BasicSwap uses send timestamps and requires the replacement to have been sent at least one second later. Once the bid advances beyond receiving the accept, this replacement rule no longer applies (PR #746, PR #757).
Redeem fees and Firo Core
Monero and Wownero redeem estimates now follow the configured wallet priority, using a tier-two estimate when the priority is automatic, since the wallet chooses its own rate for a sweep. Reverse offers also use the correct side of the offer when estimating the received coin's redeem fee, bringing that correction into both the offer page and Smart Buy's comparisons (commit 36a1d82).
Firo Core moves from v0.14.18.0 to v0.14.18.1, so include the core update step when upgrading an installation that uses BasicSwap-managed Firo binaries (PR #756).
Install the latest BasicSwap update
To install, update BasicSwap through the usual process and relaunch.
Docker
If you installed BasicSwap with Docker:
- From your BasicSwap repository's
dockerfolder, stop the running container withdocker-compose stop. - From that same folder, run
git pull. - Run
docker-compose build --no-cache. - Run
docker-compose run --rm swapclient basicswap-prepare --datadir=/coindata --upgradecores. - When the core update finishes, launch BasicSwap again with
docker-compose up.
Depending on your Docker version, the command may be docker compose without the dash.
Non-Docker
If you installed BasicSwap without Docker, use the steps below and replace $HOME/coinswaps with your installation directory if it differs:
- Shut down BasicSwap properly.
- Run
export SWAP_DATADIR="$HOME/coinswaps". - Run
source "$SWAP_DATADIR/venv/bin/activate". - From
$SWAP_DATADIR/basicswap, rungit pull. - Run
pip3 install --require-hashes -r requirements.txt. - Run
pip3 install .. - Run
basicswap-prepare --datadir="$SWAP_DATADIR" --upgradecores. - Launch BasicSwap as usual.
Updating the SimpleX client
If you use SimpleX, stop BasicSwap and run basicswap-prepare --datadir="$SWAP_DATADIR" --addnetwork=simplex to prepare the v7.0.0 client; for Docker, run docker-compose run --rm swapclient basicswap-prepare --datadir=/coindata --addnetwork=simplex from the docker folder instead. Re-adding SimpleX applies the preparation defaults and any environment overrides, so set SIMPLEX_GROUP_LINK, SIMPLEX_SERVER_ADDRESS, and SIMPLEX_WS_PORT to your intended values if you use a custom configuration (SimpleX guide).
Install script
If you installed BasicSwap with Nahuhh's GitHub installation script, run bsx-update, then check the SimpleX client steps above if you use that network.
Changelog
The v0.19.0 changelog, grouped by area.
Smart Buy and batched funding
- Add the buy planner, bulk-bid API, and grouped chain-B funding [
8449a18] / PR #728 - Reserve distinct inputs for reverse-bid locks and split wallet outputs when needed [
f580f33] - Batch ready secret-hash participate outputs in one funding transaction [
98d0661] - Add the Smart Buy page, grouped bids, and buy history [
bf7f6ce]
Message networks
- Add Nostr transport, route signing keys, relay controls, and the Networks settings tab [
669e182] / PR #754 - Update SimpleX Chat defaults to v7.0.0, handle group-link changes, retry temporary client send failures, and correct the server-address environment variable [
ed63285] / PR #753 - Refactor release preparation into reusable coin and network modules [
d1853b0] / PR #752
Swap accepts and fee estimates
- Save prepared adaptor-signature accepts before sending and reuse them on retries [
93ff612] / PR #749 - Associate split proof messages with their parent message while keeping older-protocol compatibility [
6ad36ee] [1ec8939] / PR #746 - Accept a later adaptor-signature accept while still receiving the earlier one, with timestamp rules for older peers [
087ce4c] [331e89f] / PR #757 - Correct Monero-family and reverse-offer redeem fee estimates [
36a1d82]
Versions and tests
- Update Firo Core to v0.14.18.1 [
fe1353c] / PR #756 - Raise the GUI version to v4.1.0 [
f74be67] - Add tests for repeated accepts, batched bids, partial in-flight funding, and mixed message networks [
b930849] [6f5d21e] [ddce922] [535ba40] [669e182]
You can inspect every change on the v0.18.10 to v0.19.0 comparison page.
Stay connected
Keep up with BasicSwap on social media:
- Twitter: @basicswapdex
- Matrix: BasicSwap channel
- GitHub: BasicSwap repositories
- Support the project: Donation page


