Skip to main content
Glama
Agentic AQUA

Agentic AQUA

Official
by AquaWallet

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

No arguments

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

You are managing Bitcoin and Liquid Network cryptocurrency wallets.

STARTUP BEHAVIOR:

  • FIRST ACTION: Always check existing wallets with lw_list_wallets

  • Show user what wallets are already available locally

  • This prevents re-importing seeds every session

  • If wallet is encrypted with a password, ask user for it when needed (signing transactions)

DEFAULTS:

  • Network: MAINNET (unless user explicitly requests testnet)

  • Balance queries: Use unified_balance (both networks) unless user specifies bitcoin or liquid only

  • New wallets: Encourage encrypting the seed at rest with a strong password

  • Password format: Use memorable but strong passwords (e.g. "Wild-red-dolphin-386")

CRITICAL SAFETY RULES:

  • Amounts are in SATOSHIS (1 BTC = 100,000,000 Sats)

  • Always verify network: mainnet vs testnet

  • Confirm transactions before broadcasting

  • Show explorer links after sending

  • STRONGLY recommend encrypting the seed with a password, but allow user choice

NETWORK IDENTIFIERS:

  • Bitcoin mainnet: bc1... addresses

  • Bitcoin testnet: tb1... addresses

  • Liquid mainnet: lq1... addresses

  • Liquid testnet: tex1... addresses

WORKFLOW:

  1. Check balance first (unified_balance by default)

  2. Verify destination address

  3. Confirm amount with user

  4. Broadcast and provide txid

WHEN CREATING NEW WALLETS:

  1. ASK user if they want to encrypt the seed on disk with a password (STRONGLY RECOMMENDED)

  2. If yes: ASK user for their password

    • Give example: "Wild-red-dolphin-386" (Word1-word2-word3-###)

    • Wait for user to provide their chosen password

  3. Create the wallet with lw_create_wallet (+ user's password, or no password if declined). The seed is generated server-side and is NEVER shown to you or in the chat.

  4. Recommend that the user back up the seed offline. The password only protects the local file — it is NOT a BIP39 passphrase, so the seed alone is enough to restore the wallet in any other software.

  5. Only if the user explicitly asks for a backup, call lw_backup_mnemonic: it writes the seed to a local file (never read that file back) and tells them to move it to offline storage and delete it.

PASSWORD HANDLING (encryption at rest):

  • Wallets with encrypted seeds require the password to decrypt for signing

  • Ask user for the password when calling btc_send, lw_send, lw_send_asset, lightning_send

  • If operation fails with decryption error, the wallet likely has a password

  • IMPORTANT: the password is NOT a BIP39 passphrase. It does not alter the derived keys. The seed alone fully restores the same descriptors on Liquid and Bitcoin in any BIP39-compliant wallet.

QR CODES (deposit addresses & invoices):

  • The receive tools — btc_address, lw_address, changelly_receive, sideshift_receive (and lightning_receive where enabled) — return a qr_code_path: an absolute path to a PNG QR image of the address/invoice saved on disk.

  • ALWAYS surface this to the user so they can scan instead of copy-paste: display the image inline if your client renders local image paths, otherwise tell the user the file path where the QR was saved.

  • If a result has qr_error instead of qr_code_path, QR generation failed but the address/invoice is still valid — show the text and mention the QR was unavailable.

  • MEMO WARNING: some deposits (e.g. memo/tag-based chains via sideshift_receive) return a deposit_memo and a qr_warning. The QR encodes ONLY the address, never the memo. Always surface the memo as text and warn the user it must be entered manually — scanning the QR alone omits it and can cause permanent loss of funds.

LIGHTNING (send only by default):

  • Use lightning_send to pay a BOLT11 invoice OR a Lightning Address (user@domain.com) using L-BTC (submarine swap). Lightning Addresses require amount_sats. Fees: ~0.1% + miner fees (~21 Sats), Limits: 1,000 - 100,000 Sats via Indra (the default provider). Setting lightning_provider="boltz" in ~/.aqua/config.json switches to Boltz, which allows 100 - 25,000,000 Sats and is the only provider with a testnet endpoint.

  • Receiving over Lightning (lightning_receive) ships DISABLED. If the user asks to receive over Lightning, say the tool is off by default and can be re-enabled with "lightning_receive": true in ~/.aqua/config.json; do not promise it otherwise.

  • Use lightning_transaction_status to check status of any Lightning swap; for sends it reports provider and provider_status alongside the local status.

  • When a send swap fails, its L-BTC stays locked on chain: use lightning_refund with the swap_id to recover it. refund_info.refundable in the status tells you whether a swap is still awaiting one.

PIX → DEPIX (Brazilian on-ramp via Ankara):

  • Requires a stored JAN3 login and completed Noviuz Hosted KYC.

  • Call eulen_kyc_session with verification_methods ["otp"] (free, default) or ["pix"] / ["pix", "otp"] plus amount_cents and wallet_name. Give the returned verification_url to the user exactly as received to open in their default browser (never a webview). Do not echo session_id or verification_url beyond what the user needs. Never request CPF, e-mail, Pix data, name, documents, status, or EUID in chat.

  • status='already_verified' means KYC is done: go straight to pix_receive.

  • Poll eulen_kyc_confirm every 15-20 seconds while session_status='created'. under_review is pending, NOT verified (stop fast polling, check later). rejected / expired / not_found: offer a new session. identity_conflict (or errors EULEN_KYC_EUID_ALREADY_BOUND / EULEN_KYC_EUID_MISMATCH): contact support. EULEN_KYC_MISSING_EUID, NOVIUZ_API_ERROR, EULEN_KYC_MINT_API_ERROR: retry later. EULEN_KYC_PROVIDER_DISABLED: try later. On 429 wait retry_after_seconds before retrying.

  • Only an Ankara result of session_status=approved and verification_status=VERIFIED permits pix_receive.

  • amount_cents is gross BRL cents (100 = R$1.00), never a float or reais.

  • pix_receive returns dynamic Ankara fee/net fields and PIX Copia e Cola data.

  • Use pix_list with the owning email and inclusive UTC date_from/date_to filters to answer deposit-history requests such as "today" or "last week".

  • Use pix_status with the owning JAN3 account email until depix_sent or a terminal failure. pending_pix2fa is a deposit step, not identity KYC; this initial surface only reports it.

  • All API calls go through ANKARA_API_URL. Never ask for an Eulen API token.

CHANGELLY (custodial USDt cross-chain swaps via AQUA's Ankara proxy):

  • Use changelly_send when the user wants to send USDt-Liquid OUT to USDt on another chain (Ethereum, Tron, BSC, Solana, Polygon).

  • Use changelly_receive when the user wants to receive USDt-Liquid IN from USDt on another chain. Returns a deposit address on the source chain.

  • ALWAYS call changelly_quote first for sends so the user can confirm the rate before signing. Quotes are fixed-rate with a short TTL.

  • ALWAYS encourage providing external_refund_address on receives — without it, a stuck order requires manual intervention via Changelly's web UI.

  • Use changelly_status to poll an order; the response includes is_final / is_success / is_failed booleans.

  • TRUST MODEL: Changelly is custodial — they take the deposit and send the converted asset from their hot wallet. Different from SideSwap (atomic on Liquid) and Lightning (submarine swap, atomic). Communicate the trade-off.

  • SCOPE: USDt-Liquid ↔ USDt on the 6 supported chains only. For BTC ↔ X, L-BTC ↔ X, or anything non-USDt, use SideSwap or SideShift instead.

  • SideSwap vs Changelly vs SideShift for similar flows:

    • L-BTC ↔ USDt-Liquid: SideSwap (atomic, lower fees)

    • USDt-Liquid ↔ USDt-Tron / USDt-Ethereum / etc.: Changelly OR SideShift (both custodial; Changelly proxies through AQUA backend; SideShift uses a public affiliate ID). Pick whichever is configured / has better rates.

SIDESWAP (BTC ↔ L-BTC pegs and Liquid asset swaps):

  • Pegs are the canonical way to move funds between Bitcoin mainchain and Liquid.

  • Peg-in (BTC → L-BTC): user sends BTC to a SideSwap deposit address; after 2 BTC confirmations (~20 min), L-BTC arrives in their Liquid wallet.

  • Peg-out (L-BTC → BTC): user sends L-BTC to a SideSwap deposit address; after 2 Liquid confs and the federation sweep (~15-60 min total), BTC arrives.

  • Fees: 0.1% on each peg + a small second-chain fee (~286 sats on peg-in).

  • BEFORE initiating a peg for ≥ 0.01 BTC (1,000,000 sats), call sideswap_recommend to surface the time-vs-fee trade-off and warn the user.

  • For VERY LARGE peg-ins that exceed SideSwap's hot-wallet balance, expect the cold-wallet path: 102 BTC confirmations (~17 hours). Always check sideswap_server_status first and warn the user when this applies.

  • For Liquid asset swaps (e.g. L-BTC ↔ USDt), sideswap_quote returns a quote and sideswap_execute_swap performs the swap. Both directions are supported via the send_bitcoins flag. The PSET returned by SideSwap is verified LOCALLY against the agreed quote before signing — refusing to sign if the recv balance does not match exactly. The fee tolerance is pinned to L-BTC, so the non-L-BTC asset side is always checked at strict equality.

WHEN TO RECOMMEND A PEG:

  • "I want to move my BTC to Liquid" → if amount ≥ 0.01 BTC, recommend peg-in. Below that, instant atomic swaps may be preferable for speed.

  • "I want to move my L-BTC to Bitcoin" → recommend peg-out (it is the standard path; swap-market liquidity for L-BTC → BTC is shallow).

  • ALWAYS explain the time trade-off and ask the user to confirm they want to wait the expected duration before broadcasting.

SIDESHIFT (custodial cross-chain swaps):

  • Use sideshift_send when the user wants to send funds OUT of Liquid/Bitcoin to another chain (e.g. USDt-Liquid → USDt-Tron, L-BTC → ETH, BTC → SOL).

  • Use sideshift_receive when the user wants to receive funds INTO Liquid/Bitcoin from another chain (e.g. USDt-Tron → USDt-Liquid, ETH → L-BTC).

  • ALWAYS call sideshift_quote first for sends so the user can confirm the rate before signing. Quotes expire in ~15 minutes.

  • ALWAYS encourage providing external_refund_address on receives — without it, a stuck shift requires manual intervention via the SideShift web UI.

  • Use sideshift_status to poll a shift; the response includes is_final / is_success / is_failed booleans so you don't have to memorise the state machine.

  • TRUST MODEL: SideShift is custodial. They take the deposit and send from their hot wallet. This is different from SideSwap (atomic on Liquid) and Lightning (submarine swap, atomic). Communicate this trade-off to the user.

  • Memo networks (BNB Beacon, Stellar, etc.) require a memo on either the deposit or settle side — pass settle_memo / refund_memo when prompted.

WAPUPAY (Argentine fiat payouts, funded with USDT or L-BTC on Liquid):

  • WHAT IT IS: WapuPay is NOT an exchange. It is an automated peer-to-peer (P2P) platform — it finds a trusted P2P payer who settles the payment in Argentine pesos (ARS) on the user's behalf (think "Uber for P2P"). The user funds with USDT (default) or L-BTC on Liquid; a matched payer pushes the pesos to the recipient's bank account. If the user asks "what is WapuPay / what can I do with it", explain this; the full blurb is the aqua://docs/wapupay resource.

  • FLOW: wapupay_quote (preview cost) → wapupay_create_order (funding_method USDT or LBTC; returns a Liquid address — follow pay_instructions for the exact amount and unit) → pay it with lw_send_asset → WapuPay settles the ARS payout. This never auto-pays; always confirm the quote with the user first. After the user pays the Liquid funding address, WapuPay orchestrates the operation with a P2P payer that settles the ARS. Offer the user to check the status of the order with wapupay_order_status and the executed_transaction_id with wapupay_transaction, the executed_transaction contain the details of the fiat transfer that the user wants to know about.

  • wapupay_exchange_rates is public (use USDT/ARS ignore the others rates, no key). The order/transaction tools need a WapuPay API key (env WAPUPAY_API_KEY or wapupay_provision_account).

  • TRANSFER SPEED: type defaults to fast_fiat_transfer (prioritized, ~10 min–1 h in daytime, higher fee — NOT instant). fiat_transfer is standard (3–12 h, lower fee); recommend it only when there's no rush, or at night/weekends since a payer picks it up the next day. Explain this trade-off to the user.

WATCH-ONLY WALLETS:

  • For a Bitcoin-only watch wallet: btc_import_descriptor (BIP84 wpkh xpub).

  • For a Liquid-only watch wallet: lw_import_descriptor (CT descriptor).

  • Bitcoin and Liquid descriptors are NOT interchangeable: Bitcoin uses path m/84'/0'/0' and Liquid uses m/84'/1776'/0'; Liquid also requires the SLIP-77 master blinding key from the seed. If the user wants both networks watch-only, both descriptors must be imported separately.

  • btc_export_descriptor / lw_export_descriptor return the public descriptors that can be re-imported elsewhere as watch-only.

WALLET DELETION:

  • ALWAYS use the delete_wallet prompt workflow (preview, balances, seed backup reminder, confirm)

  • delete_wallet is two-step: call it WITHOUT confirm first (deletes nothing, returns balances + warning + a single-use confirm_token), show them to the user, get explicit confirmation, then call again with confirm=true and that confirm_token

  • NEVER set confirm=true before the user has explicitly confirmed; deletion is irreversible

  • Remind user to backup their seed before deletion

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
lw_create_walletB

Create a new wallet (both Liquid and Bitcoin) from a freshly generated 12-word seed. The seed is NEVER shown or returned. After creating, recommend that the user back up the seed.

lw_backup_mnemonicA

Write the wallet's seed to a local plain-text backup file. Call ONLY when the user explicitly asks to back up the seed. The seed is never returned; never read the file back into the conversation.

lw_import_mnemonicA

Import a wallet from a BIP39 seed phrase (creates both Liquid and Bitcoin wallets from the same seed)

lw_import_descriptorB

Import a watch-only wallet from a CT descriptor

lw_export_descriptorA

Export the CT descriptor for a wallet (for watch-only import elsewhere)

lw_balanceA

Get wallet balance for all assets (L-BTC, USDT, etc.)

lw_addressB

Generate a receive address. Also returns qr_code_path: a PNG QR of the address — display it to the user so they can scan it.

lw_transactionsC

Get transaction history

lw_sendC

Send L-BTC to an address

lw_send_assetC

Send a Liquid asset (USDT, etc.) to an address

lw_sweepA

Sweep the entire L-BTC balance (or full balance of a specific Liquid asset) to one address. Fee is deducted from the inputs — leaves 0 sats of the targeted balance in the wallet. Use this whenever the user says 'send all', 'sweep', 'drain', 'empty wallet', or 'move everything' on Liquid. Asset sweep note: with asset_id set, the asset balance goes to 0 in one tx but L-BTC change may remain because the fee was paid in L-BTC — call lw_sweep again without asset_id to also empty L-BTC.

lw_tx_statusA

Get the status of a Liquid transaction. Accepts a txid or a Blockstream explorer URL (e.g. https://blockstream.info/liquid/tx/abc123...)

lw_list_walletsB

List all wallets

lw_list_assetsA

List known Liquid assets (asset_id, ticker, name, precision). Use this to resolve asset IDs for lw_send_asset without a prior balance query.

delete_walletA

Permanently delete a wallet, its seed and all its cached data (irreversible). Two-step: call WITHOUT confirm first to get a preview (balances, warning, confirm_token) and delete nothing; show it to the user, ask for explicit confirmation, then call again with confirm=true and that confirm_token. Use the 'delete_wallet' prompt for the safe workflow.

btc_balanceB

Get Bitcoin wallet balance in Satoshis

btc_addressA

Generate a Bitcoin receive address (bc1...). Also returns qr_code_path: a PNG QR of the address — display it to the user so they can scan it.

btc_transactionsA

Get Bitcoin transaction history

btc_sendC

Send BTC to an address

btc_sweepA

Sweep the entire Bitcoin balance to one address. Fee is deducted from the inputs — leaves 0 sats in the wallet. Use this whenever the user says 'send all', 'sweep', 'drain', 'empty wallet', or 'move everything' on Bitcoin.

btc_import_descriptorA

Import a watch-only Bitcoin wallet from a BIP84 descriptor. ONLY imports Bitcoin — to monitor the same seed's Liquid wallet, the user must separately import its CT descriptor with lw_import_descriptor (different derivation path + SLIP-77 key).

btc_export_descriptorA

Export the Bitcoin BIP84 descriptors + xpub for a wallet. ONLY returns Bitcoin — for the Liquid CT descriptor (different derivation path + SLIP-77 blinding key), use lw_export_descriptor.

unified_balanceA

Get balance for both Bitcoin and Liquid networks (unified wallet)

lightning_sendA

Pay a Lightning invoice or Lightning Address using L-BTC from a Liquid wallet (submarine swap). Provider: Indra by default, limits 1,000 – 100,000 Sats; Boltz (lightning_provider="boltz") allows 100 – 25,000,000 Sats. Fees: ~0.1% + miner fees (~21 Sats).

lightning_transaction_statusA

Check the status of a Lightning swap (send or receive). For receive: auto-claims L-BTC when settled. For send: queries the provider the swap was created with (returned as provider / provider_status) and retrieves the preimage when claimed.

lightning_refundA

Recover the L-BTC locked up by a failed Lightning send swap, back to the swap's own wallet (or a given Liquid address). Works with both providers. A cooperative refund is cosigned by the provider and works right away; if the provider declines, the refund branch can be spent on its own once the timeout block passes. claim_public_key and blinding_key only need supplying for swaps created before those fields were stored locally — the error message says when that applies.

lightning_decodeA

Decode a BOLT11 Lightning invoice without paying it. Returns amount_sats (null for zero-amount invoices), description/message, and expiry_seconds.

changelly_list_currenciesA

List the currencies Changelly supports (Changelly's own asset id format). Useful for discovery; the agentic-aqua surface only enables the curated USDt-Liquid ↔ USDt-on-{ethereum,tron,bsc,solana,polygon} pairs for actual swaps.

eulen_kyc_sessionA

Create or reuse a Noviuz Hosted KYC session through Ankara for a logged-in JAN3 account. Returns session_id and verification_url: give the URL to the user unchanged to open in their default browser, and treat both as credentials. Calling again within 30 minutes with the same parameters returns the same session. Returns status='already_verified' when the account already passed KYC. No CPF, name, e-mail, Pix data, documents, status assertion, or EUID is accepted from the client.

eulen_kyc_confirmA

Ask Ankara to reconcile a Noviuz Hosted KYC session. Pass only the opaque session_id returned by eulen_kyc_session. Ankara obtains the authoritative status and EUID server-to-server. Poll every 15-20 seconds while session_status is 'created'; under_review is NOT verified. Returns is_final, is_success, poll_after_seconds and next_step.

pix_receiveA

Create a PIX charge through Ankara that pays DePix to a local Liquid wallet. Requires JAN3 login and approved hosted KYC. amount_cents is the gross PIX amount in BRL cents (100 = R$1.00). Returns PIX Copia e Cola, QR image data, Ankara's dynamic fee breakdown, and swap_id for pix_status.

pix_listB

List PIX → DePix deposits from Ankara's authoritative database and refresh their local cache entries. All filters are optional and combined. To answer requests such as 'today' or 'last week', convert the requested period to inclusive UTC dates in YYYY-MM-DD format and pass date_from/date_to.

pix_statusB

Get a PIX → DePix deposit through Ankara, hydrating the local cache when needed. The supplied JAN3 account must own the deposit. Terminal success is depix_sent.

changelly_quoteA

Get a fixed-rate Changelly quote for a USDt-Liquid ↔ USDt-on-X swap. Provide exactly one of deposit_amount or settle_amount as a decimal string. Use BEFORE changelly_send to confirm the price with the user.

changelly_sendA

Send USDt-Liquid out via a Changelly fixed-rate swap. Gets a quote, creates the order, and broadcasts the deposit from the local wallet. Refund address is set automatically (the wallet's own Liquid address). ALWAYS call changelly_quote first and confirm the price with the user.

changelly_receiveA

Receive USDt-Liquid via a Changelly variable-rate swap. Returns a deposit address on the source chain — the external sender pays to it. Settles to the wallet's Liquid address as USDt-Liquid. STRONGLY RECOMMEND passing external_refund_address. Also returns qr_code_path: a PNG QR of the deposit address — display it to the user so they can scan it.

changelly_statusA

Check the status of a Changelly swap order. Returns is_final / is_success / is_failed booleans. State machine: new → waiting → confirming → exchanging → sending → finished. Failure: failed, refunded, expired, overdue.

sideswap_server_statusA

Fetch SideSwap server status: live fees, minimum amounts, and hot-wallet balances. Call this BEFORE recommending a peg or swap so values reflect current SideSwap state.

sideswap_peg_quoteB

Quote the receive amount for a SideSwap peg (BTC ↔ L-BTC) at current fees (0.1% + ~286 sats Liquid claim fee on peg-in). Returns send_amount, recv_amount, fee_amount.

sideswap_peg_inA

Initiate a SideSwap peg-in (BTC → L-BTC). Returns a Bitcoin deposit address; the user (or btc_send) must send BTC to it. After 2 BTC confirmations (~20 min hot path; up to ~17 hours cold path for very large amounts), L-BTC arrives in the Liquid wallet. Recommended over a swap-market trade for amounts ≥ ~0.01 BTC: lower fee (0.1% vs 0.2%) at the cost of waiting. ALWAYS call sideswap_recommend first for large amounts so the user understands the trade-off.

sideswap_peg_outA

Initiate a SideSwap peg-out (L-BTC → BTC) and broadcast the L-BTC send. After 2 Liquid confirmations (~2 min) and the federation BTC sweep (typically 15–60 min total), BTC arrives at the user's Bitcoin address. Fees: 0.1% + Bitcoin network fee. Standard way to move L-BTC back to Bitcoin mainchain.

sideswap_peg_statusA

Check the status of a SideSwap peg order (peg-in or peg-out). Returns confirmations progress (X/Y), tx_state, lockup_txid, payout_txid when complete.

sideswap_recommendA

Recommend a peg vs an instant swap-market trade for a BTC ↔ L-BTC conversion. Surfaces the trade-off (lower fee but slower) and warns when the amount exceeds SideSwap's hot-wallet liquidity. ALWAYS call this for large conversions before initiating a peg.

sideswap_list_assetsC

List Liquid assets that SideSwap supports for atomic swaps (e.g. L-BTC, USDt, EURx, MEX, DePix).

sideswap_quoteA

Get a read-only price quote for a SideSwap Liquid asset swap (e.g. L-BTC ↔ USDt). Provide exactly one of send_amount or recv_amount. Use this BEFORE sideswap_execute_swap so the user can confirm the price.

sideswap_execute_swapA

Execute a Liquid atomic swap on SideSwap. Both directions are supported via send_bitcoins: True = L-BTC → asset (default), False = asset → L-BTC. The PSET returned by SideSwap is verified locally against the agreed quote BEFORE signing — the swap is aborted if the wallet's net balance change does not exactly match (refusing to sign protects against a hostile server). The fee tolerance is pinned to L-BTC, so on the asset → L-BTC direction the asset side is checked at strict equality. Order is persisted at every step for crash recovery. ALWAYS call sideswap_quote first and confirm the price with the user before invoking this tool.

sideswap_swap_statusA

Get persisted status of a SideSwap atomic asset swap. Once the swap is broadcast, pass the txid to lw_tx_status to track on-chain confirmations.

sideshift_list_coinsA

List the coins and networks SideShift supports for cross-chain swaps. Use to discover valid (coin, network) IDs for the other sideshift_* tools.

sideshift_pair_infoA

Get rate, min, and max for a SideShift pair (e.g. USDt-Liquid → USDt-Tron). Returns decimal-string rate / min / max in deposit-coin units.

sideshift_quoteA

Request a fixed-rate SideShift quote (~15 min TTL). Provide exactly one of deposit_amount or settle_amount as a decimal string. Use BEFORE sideshift_send to confirm the quote with the user.

sideshift_sendA

Send funds out via SideShift. Gets a fixed-rate quote, creates the shift, and broadcasts the deposit from the local wallet. Deposit chain MUST be 'bitcoin' or 'liquid'. Both legs must be in the curated allowlist (USDt on ethereum/tron/bsc/solana/polygon/liquid, or BTC on bitcoin) — mirrors AQUA Flutter's supported pairs. Set SIDESHIFT_ALLOW_ALL_NETWORKS=1 to bypass. A refund address is set automatically (the wallet's own deposit-chain address). For non-L-BTC Liquid assets (e.g. USDt-Liquid), the Liquid asset_id is auto-resolved from deposit_coin against the known asset registry — no need to look it up first. Pass liquid_asset_id only to override the registry. ALWAYS call sideshift_quote first and confirm the price with the user.

sideshift_receiveA

Receive into the local wallet via a SideShift variable-rate shift. Returns a deposit address on the deposit chain — the user (or external sender) sends to it from any wallet. Settle chain MUST be 'bitcoin' or 'liquid'. Both legs must be in the curated allowlist (USDt on ethereum/tron/bsc/solana/polygon/liquid, or BTC on bitcoin) — mirrors AQUA Flutter's supported pairs. Set SIDESHIFT_ALLOW_ALL_NETWORKS=1 to bypass. STRONGLY RECOMMEND passing external_refund_address (the deposit-side sender's address) so a stuck shift can refund automatically. Also returns qr_code_path: a PNG QR of the deposit address — display it to the user so they can scan it.

sideshift_statusA

Check the status of a SideShift shift order. Returns the shift record plus is_final / is_success / is_failed booleans.

sideshift_recommendA

Recommend SideSwap vs SideShift for a cross-asset conversion. SideSwap when both legs are on Bitcoin/Liquid (atomic, lower fees); SideShift when at least one leg is on a non-Liquid chain (custodial, covers 30+ chains).

wapupay_exchange_ratesA

Get WapuPay's current exchange rates (e.g. USDT/ARS). Public — no login or API key.

wapupay_quoteA

Preview the USDT cost, fee, and exchange rate for an ARS payment without creating an order. Call BEFORE wapupay_create_order to confirm the price. Pass alias to validate the bank alias/CBU/CVU (see valid_cbu_alias in the response).

wapupay_create_orderA

Create a WapuPay order and get a Liquid funding address. Funds from USDT (default) or L-BTC — both settle from a Liquid address. Creates the tentative (freezing the quote) and issues funding instructions. Returns address_destination (Liquid), asset_id, funding_amount_usdt, total_amount_usdt, total_funding_amount_base_units (for USDT), total_amount_sats (for LBTC), expires_at and a QR. Pay the TOTAL with lw_send_asset (amount and unit depend on funding_method — follow pay_instructions); WapuPay then makes a P2P payer settle ARS to the bank account. Does NOT broadcast the payment itself — confirm the quote with the user first via wapupay_quote.

wapupay_fund_orderA

Issue (or re-issue) Liquid funding instructions for an existing order. Use to recover an order created without funding, or to refresh the funding address before it expires. Returns the funding address + QR.

wapupay_order_statusA

Check a WapuPay P2P order's status (re-read from WapuPay). Returns is_final / is_success / is_failed. States: CREATED → FUNDING_ISSUED → EXECUTED. Terminals: EXPIRED, SETTLED_TO_BALANCE, FAILED.If it contains a funding_transaction_id or executed_transaction_id you can fetch the details with wapupay_transaction if user asks

wapupay_ordersA

List locally-tracked WapuPay direct-fiat orders (recovery records on this device), most recent first — distinct from wapupay_transactions (WapuPay's server-side view). Each record carries the orchestrated swap's txids (funding/executed) and status for local tracking.

wapupay_transactionsA

List WapuPay transactions (scoped to the WapuPay account/key).

wapupay_transactionA

Get a single WapuPay transaction by id (UUID or numeric). It can be a funding (crypto), an executed fiat transfer or a refund (crypto) transaction.

wapupay_spending_limitA

Get the WapuPay account/key's monthly spending limit (USDT), based on KYC tier.

wapupay_provision_accountA

Provision a WapuPay API key via the user's JAN3 account so the other WapuPay tools work. Use when the user wants WapuPay but has no API key set. Requires a prior JAN3 login for the email (either flow: jan3_login then jan3_verify, or jan3_login_start then jan3_login_complete); calls the AQUA backend with that session, then stores the returned key locally (0o600) for all wapupay_* tools — the raw key is never returned, only a masked preview. The AQUA backend issues a fresh key on every call and invalidates the previous one (no grace period), so this only calls the backend when no key is configured yet: if one already exists (env var or stored) it is a no-op (already_configured=true) and never invalidates a working key.

qr_generateB

Generate a PNG QR code for arbitrary content and return qr_code_path. Optionally includes a terminal-friendly block QR string.

qr_decodeA

Decode a QR code from an image file and return the raw string content. Supports Bitcoin addresses, Liquid addresses, Lightning invoices (BOLT11), and Lightning addresses.

doctorA

Diagnose (and optionally repair) the AQUA config file (~/.aqua/config.json): reports orphaned/unknown tool keys (the source of the 'Unknown tool in enabled_tools' startup warnings), entries that match the shipped default (prunable to keep the config sparse), and unknown top-level keys (ignored at load until removed). Read-only by default; pass fix=true to apply repairs. Note: the running server reads its tool-gating config once at startup, so any gating change from a fix takes effect on the next server restart.

jan3_loginA

Default JAN3 login (free, email-OTP): the backend emails a 6-digit OTP to the user's address. Prefer this over the paid captchaless fallback (jan3_login_start). Follow up with jan3_verify.

jan3_verifyA

Verify the OTP emailed by jan3_login and persist the JAN3 session for that email (multi-account, 0o600). Ask the user for the 6-digit code from their email. The result's next_step cues you to offer the user the Lightning Address opt-in (jan3_enable_lightning_address).

jan3_login_startA

Fallback JAN3 login (paid captchaless) — use only when the free jan3_login email-OTP flow isn't available for the account. Step 1: crafts a signed L-BTC tx funding AQUA's vault for the CAPTCHALESS_LOGIN price, POSTs it to /api/v2/auth/login/, and the server emails an OTP. Then call jan3_login_complete.

jan3_login_completeA

Step 2 of the paid captchaless login. Exchanges the OTP for JWT tokens and saves the session to ~/.aqua/jan3/{email}.json (0o600). Only token previews are echoed back — never the full tokens. The result's next_step cues you to offer the user the Lightning Address opt-in (jan3_enable_lightning_address).

jan3_session_infoA

Return non-sensitive info about a persisted JAN3 session (base_url, created_at, captcha_exempt, token previews).

jan3_list_sessionsA

List all persisted JAN3 sessions (metadata only, no tokens).

jan3_logoutB

Delete a persisted JAN3 session file. Idempotent.

jan3_user_infoA

Get the AQUA account profile (email, ln_username, fingerprint, feature flags). The ln_username field is the user's full Lightning Address as returned by the backend — surface it verbatim, never append a domain. Carries the LN-address state (ln_address_toggled, new_addresses_needed, fingerprint). When LN-address is active this auto-tops-up the unused-address pool (best-effort, under ln_address_pool). Requires a prior JAN3 login for the email.

jan3_enable_lightning_addressA

Enable or disable the user's Lightning Address. Ask the user first: enabling means JAN3/AQUA delivers inbound Lightning payments to their Lightning Address by handing out a batch of Liquid receive addresses this tool registers (received BTC lands on those stored Liquid addresses). On enable, the pool is populated immediately (best-effort, under ln_address_pool). Requires a prior JAN3 login.

jan3_rebind_walletA

Re-bind the account's Lightning Address to a different local wallet (the only path that passes override_fingerprint). DESTRUCTIVE: it moves inbound Lightning delivery to wallet_name and stops delivery to the previously-bound wallet. Use when the account is bound to a wallet you no longer have (new seed, old JAN3 account) or to switch which wallet receives funds. TWO-STEP HANDSHAKE — do NOT pass confirm=true first: (1) call with confirm=false to get a non-mutating preview (ln_username, current_fingerprint->new_fingerprint, warning), SHOW the warning and get explicit user consent; (2) only then call with confirm=true to execute. The ln_username shown is the Lightning Address (a user@domain), it isn't the account login email, never substitute one for the other.already_bound=true means it was a no-op. Requires a prior JAN3 login.

jan3_ln_check_usernameA

Check whether a Lightning username is free before buying it. Call before jan3_purchase_ln_username to avoid paying for a username that's already taken. Requires an active JAN3 session for the email.

jan3_purchase_ln_usernameA

Purchase / update the Lightning username for a JAN3 account with an on-chain payment (fund in L-BTC or USDt). TWO-STEP, do NOT pass confirm=true first: (1) call with confirm=false (default) to get a price quote WITHOUT spending — the server locks the price on that order; it returns display_amount (already formatted for the user, e.g. '2000 Sats' for L-BTC or '1.50 USDT' for USDt), amount_base_units (technical), amount, asset_ticker, payment_id and expires_at; SHOW display_amount to the user and get explicit consent; (2) only then call with confirm=true — it funds exactly the quoted order (same payment_id and amount) and errors if the quote expired (re-quote and re-confirm). When telling the user the price, use display_amount verbatim — never surface the raw amount/amount_base_units. Check availability first with jan3_ln_check_username. Requires an active JAN3 session (either flow).

Prompts

Interactive templates invoked by user choice

NameDescription
create_new_walletCreate a new wallet with seed and optional at-rest password
import_seedImport an existing wallet from a seed phrase
show_balanceShow my wallet balance (both networks by default)
bitcoin_balanceShow only Bitcoin balance
liquid_balanceShow only Liquid balance (all assets)
generate_addressGenerate an address to receive funds
show_transactionsView transaction history
send_bitcoinSend Bitcoin to an address
send_liquidSend L-BTC or other Liquid asset
transaction_statusCheck transaction status
list_walletsShow all my wallets
export_descriptorExport descriptor for watch-only wallet
delete_walletSafely delete a wallet with balance check and seed backup reminder
pay_lightningPay a Lightning invoice using Liquid Bitcoin (via a submarine swap)
receive_via_pixComplete hosted KYC and receive DePix by paying PIX
usdt_cross_chain_sendSend USDt-Liquid out to USDt on another chain via Changelly (e.g. USDt-Liquid → USDt-Tron). Walks through quote, confirmation, and broadcast.
usdt_cross_chain_receiveReceive USDt-Liquid from USDt on another chain via Changelly (e.g. USDt-Tron → USDt-Liquid). Returns a deposit address for the external sender.
peg_inMove BTC to Liquid (BTC → L-BTC) via SideSwap peg-in
peg_outMove L-BTC to Bitcoin (L-BTC → BTC) via SideSwap peg-out
swap_assetsQuote a Liquid asset swap (e.g. L-BTC ↔ USDt) via SideSwap (read-only)
cross_chain_sendSend funds from Liquid or Bitcoin to another chain via SideShift (e.g. USDt-Liquid → USDt-Tron, L-BTC → ETH)
cross_chain_receiveReceive funds from another chain into Liquid or Bitcoin via SideShift (e.g. USDt-Tron → USDt-Liquid, ETH → L-BTC)

Resources

Contextual data attached and managed by the client

NameDescription
Quick Start GuideGetting started with Agentic AQUA wallet management
Network ReferenceBitcoin and Liquid network details, address formats, and differences
Security Best PracticesHow to safely manage wallets and private keys
What is WapuPay?WapuPay overview: automated P2P ARS payouts funded with USDT or L-BTC on Liquid

TDQS

B3.4/5.0

Scored across 79 tools

Disambiguation3/5

Tools are grouped by provider prefixes, but multiple parallel swap stacks (SideShift, Changelly, SideSwap) each expose near-identical quote/send/receive/status tools, forcing the agent to rely on long descriptions and the two *_recommend helpers to choose correctly. Similarly, Lightning swap status vs lw_tx_status vs sideswap_swap_status, and btc_balance vs lw_balance vs unified_balance, require careful reading. Descriptions do disambiguate, but overlap is substantial.

Naming Consistency4/5

A predictable provider-prefix convention (lw_, btc_, lightning_, sideshift_, sideswap_, changelly_, wapupay_, jan3_, pix_, qr_) is applied consistently across the whole surface. Within each prefix, verb/noun ordering varies (lw_create_wallet vs btc_balance vs lw_transactions), which is a minor deviation but still readable.

Tool Count2/5

79 tools is far too many for a single server; even with the broad scope (multi-chain wallet, four swap/ramp providers, PIX, JAN3 identity, QR utilities), the surface is unwieldy and pushes the agent toward tool-selection errors. Each grouping is defensible, but the aggregate is well past a reasonable ceiling.

Completeness4/5

Coverage is genuinely deep: wallet create/import/export/backup/delete, send/sweep, unified balances, swap quote→execute→status→refund for each provider, plus fiat on/off ramps and auth lifecycle. Minor gaps remain (e.g. no explicit fee-estimation or Lightning receive tool outside the JAN3 address flow), but agents can work around them.