0.14.2 (2026-11-10)
Fixed
- Submarine swaps that fund an asset (USDT-RGB or L-USDT to Lightning) no longer reject the maker’s quote: the amount to lock is checked with the pair card’s fees converted together with the payout. On chain swaps the bound is in the lockup’s units.
0.14.1 (2026-11-09)
Recommended for every 0.14.0 user of theKaleidoSwap API.
Security
- A reverse swap’s claim is followed on chain from the moment it starts, until it confirms or something else spends the lockup, whatever the maker reports and while the maker cannot be reached. The swap is
settledwhen its own claim confirms. - A claim falls back to the script path on any failure of the cooperative claim.
FileStorenever hands out the same swap index to two instances or processes that share a directory.
0.14.0 (2026-11-08)
Breaking changes
- TypeScript:
PayThroughClientrequireslightningNetworkand refuses an invoice for another network. See Pay an address from Lightning. - Rust:
RfqQuote::verify_receive_invoicetakes the Lightning network the client pays on. - Create calls that pass a
pairHashare checked against that pair card. The reverse payout, the chain swap’s computed leg, and the submarineexpectedAmountmust stay within what the card’s rate and fees imply. A card the maker has since replaced is refused: read the card again and retry.
Added
- The
KaleidoSwapAPI, in the Rust core with TypeScript, Python, and React Native bindings:quote,start, andresume, one phase machine for every swap, and a store and signer you provide. It persists each swap before you fund it and claims or refunds on its own. It serves Lightning ↔ on-chain BTC and L-BTC. See The KaleidoSwap API. simple/examples on theKaleidoSwapAPI beside theadvanced/examples on the swap engine, in every binding. See Examples.- Submarine create responses check a non-empty
bip21against the response’s address, amount, and asset.
Changed
- The atomic pair constants use the maker’s canonical pair ids (
BTC@L1/USDT-RGB@L1,USDT-RGB@L1/BTC@L1). - Python:
str()on a generated record printsswap_authandblinding_keyas<redacted>. The attributes stay readable.
0.13.0 (2026-10-28)
Breaking changes
- Claims check the chain before revealing the preimage.
constructClaimandprepareLiquidClaimrefuse to build a claim unless your chain backend shows the lockup confirmed and unspent, with the tip outside the safety margin (6 blocks on Bitcoin, 60 on Liquid). The maker’s status is never used for this. A zero-conf claim needsallowZeroConf: true. The policy fields areminConfirmations,allowZeroConf,claimSafetyMarginBlocks, andallowConflictingSpend(snake_case onTransactionOptionsin Python). See Claims and refunds. - L-USDT on testnet and regtest requires a pinned asset id. The create calls take
lusdtAssetId(lusdt_asset_idon the request in Python). An L-USDT create without it is refused before any request is sent. On mainnet the SDK pins the canonical Liquid USDt itself. - React Native:
SwapClient.kaleidoMakerrefuses to run in an app unless you pass{ allowMobile: true }, likeallowBrowserin TypeScript. Create attributed swaps from a server, or use an organization key. - Rust: implementors of
BitcoinClientandLiquidClientaddget_tip_heightandget_output_status.
Added
- Timeout headroom checks at creation:
validateReverseTimeoutHeadroomandvalidateChainTimeoutHeadroomrefuse a response whose timeout is already too close to a tip you trust. checkMrh(invoice, chain, network)returns a magic routing hint’s destination only after bounding its amount by the invoice.LnurlOptions { allow_private_hosts }for development setups (Rust and Python).
Security
- Create responses are bound to the amounts you requested: a reverse swap’s invoice must equal
invoiceAmount, and a chain swap’s lockup and claim amounts must equal the request. - Browser requests to the maker refuse redirects, so a swap’s
swapAuthnever leaves the maker’s origin. - LNURL requests refuse non-public destinations, and LNURL-withdraw uses the same hardened transport as LNURL-pay.
- Rust
Debugand Pythonstr()redact per-swap secrets.
Fixed
- The React Native package loads the SDK again on Android.
0.12.0 (2026-10-19)
Breaking changes
- TypeScript:
createKaleidoMakerClientrefuses workers and extensions. It already refused a page; it now also refuses Web, shared, and service workers and browser extension contexts. PassallowBrowser: trueto build it there on purpose. Plain Node is unaffected. - Rust and TypeScript: typed swap DTOs. Create, status, and restore methods return types generated from the Rust definitions instead of
any. Response amounts and heights arebigint; request literals reject unmodeled keys (includingpairId);RgbLock.cooperativeRefundisstring | undefined. Rust struct literals forClaimDetails,RefundDetails,SwapRestoreResponse,GetSwapResponse, andSwapEventmust set the new optional fields.
Added
- Atomic BTC ↔ USDT-RGB swaps on L1:
AtomicSwapsin TypeScript andatomic_*methods in Rust and Python. See Swap BTC and USDT on RGB. - Organization keys for client-side partner attribution:
createKaleidoOrgClient,SwapClient.kaleido_org,KaleidoOrgClient. See Attribute swaps to your organization. - Pay-through idempotency keys:
create(request, { idempotencyKey })andsupportsIdempotency(). - Stateless claim and refund helpers in TypeScript with confirmation and timeout checks. See Claims and refunds.
SwapScript.fromRestoredrebuilds scripts from restore entries.- Lightning address and LNURL-pay lookup:
resolveLightningAddress/resolve_lightning_address. - Corridor discovery card:
corridorCard()andcorridorCardRaw(). - Esplora chain-data helpers in
@kaleidorg/swap-sdk/chain-data. - Transaction recovery from saved hex:
BtcLikeTransaction.fromHex. SwapWsApi.close()(TypeScript) andshutdown()(Python) stop a status stream.
Security
- Claims require trusted chain evidence and pin the lockup transaction before revealing a preimage; automatic claims fall back to the script path after a failed cooperative claim.
- Esplora broadcasts check the HTTP status and parse the returned txid.
- LNURL-pay resolution requires HTTPS on clearnet, rejects redirects, and verifies the invoice description hash.
0.11.0 (2026-10-12)
Breaking changes
- Rust core: RGB-aware Bitcoin swap scripts. Rust struct literals for
Cooperative,TransactionOptions,BtcSwapScript, and the submarine and reverse create responses gain optional fields (swap_auth,rgb); addNonewhere you build them.CurrencygainsUsdtRgb. Python defaults the new fields; TypeScript is unchanged.
Added
- USDT-RGB submarine and reverse swaps in Rust, Python, and TypeScript, with rgb-lib wallet integration. See Swap BTC and USDT on RGB.
- RGB cooperative submarine refunds (
rgb-coop-refund-v1). - Cooperative refund authorization with
swapAuth, and signed credential recovery withrecoverSwapAuth.
0.10.0 (2026-09-24)
Breaking changes
- Rust core: chain-swap validation takes the preimage hash. TypeScript and Python call sites are unchanged.
Added
- Swap responses are checked on every route: hashlock, timeout height and encoding, lockup txid, claim preimage, counterparty key, and dust.
- Multi-output claims and refunds.
@kaleidorg/swap-sdk/pay-through, a client for the maker’s pay-through API.
0.9.0 (2026-09-23)
Breaking changes
- The binding surfaces stop saying Boltz. There are no aliases; rename on upgrade:
Added
- Versioning and security policies, and runnable TypeScript examples.