KaleidoSwap SDK Python Bindings
Python bindings for the KaleidoSwap SDK: atomic swaps (Boltz protocol) between Bitcoin, Lightning, and Liquid.
Installation
python -m pip install kaleidorg_swap_sdk
Python 3.10+ is supported. Prebuilt wheels cover Linux x86_64/aarch64, macOS x86_64/arm64, and Windows x86_64; other platforms build the published source distribution and need a Rust 1.88+ toolchain.
Quick Start
⚠️ WARNING: All examples are only to be used in REGTEST.
import kaleidorg_swap_sdk
import asyncio
async def main():
# Initialize for regtest (do NOT use this example in production)
network = kaleidorg_swap_sdk.Network.REGTEST
boltz_api = kaleidorg_swap_sdk.SwapClient.default(network)
# Example: Create a submarine swap (Lightning → Bitcoin)
key_pair = kaleidorg_swap_sdk.KeyPair()
btc_chain = kaleidorg_swap_sdk.btc_chain_from_network(network)
invoice = "lightning-invoice-to-pay"
request = kaleidorg_swap_sdk.CreateSubmarineRequest(
_from=btc_chain,
to=btc_chain,
invoice=invoice,
refund_public_key=key_pair.public(),
)
swap = await boltz_api.create_swap(request)
print(f"Send {swap.expected_amount} sats to {swap.address}")
asyncio.run(main())
Partner attribution (organization API keys)
A partner organization can have the swaps it originates attributed to it. That
needs an organization API key from the KaleidoSwap partner panel — a
kld_test_… key for signet and staging, kld_live_… for mainnet and
production. Without one, SwapClient behaves exactly as before and
creates unattributed swaps.
import os
import kaleidorg_swap_sdk
client = kaleidorg_swap_sdk.SwapClient.kaleido_maker(
"https://maker.signet.kaleidoswap.com/v2",
os.environ["KALEIDOSWAP_API_KEY"],
None, # timeout in seconds
)
client.api_key_environment() # "test"
client.api_key_id() # the key id the partner panel shows
Scrub the key in error reporters that capture locals. It crosses the binding as a plain
str, so it is a function argument on a stack frame for the length of the call. The SDK keeps it out of its own errors, logs andrepr, but anything that renders frame locals —pytest --showlocals, Sentry'swith_locals, some logging formatters — reads it off the frame regardless. Scrub it in your reporter's before-send hook.
The result is an ordinary client — every swap route works the same way — that
sends the key as Authorization: Bearer … to that maker URL, and only to that
maker URL. The key answers which partner organization created this swap? and
nothing else: it authorizes no claim, no refund, no fund movement and no panel
access. The per-swap swap_auth credential the maker returns on create stays
separate and unchanged.
The URL must be https unless it is a loopback address, since a bearer
credential over plain HTTP is readable by anything on the path. A value that
cannot be a key is rejected here rather than reaching the maker as a 401 —
which is the same answer a revoked key gets. There is no accessor for the secret
half: api_key_id() and api_key_environment() are all the client will tell
you, and UniFFI renders no string form of the object at all.
Keep the key in server-side configuration. It is permanent until revoked, so never ship it inside a mobile or desktop application, where every user holds it.
Swap Types
- Submarine swaps - Lightning → On-chain Bitcoin/Liquid
- Reverse swaps - On-chain Bitcoin/Liquid → Lightning
- Chain swaps - Bitcoin ↔ Liquid atomic swaps
Examples
Complete working examples are available in the examples/ directory:
reverse.py- Lightning to Bitcoinsubmarine.py- Bitcoin to Lightningchain.py- Bitcoin to Liquid (and vice versa)
USDT-RGB swaps
Set rgb_contract_id on CreateSubmarineRequest or CreateReverseRequest and
select Currency.USDT_RGB for the on-chain side. The pin is required before the
POST and checked against the returned contract. It stays local; the maker wire
request is unchanged. RGB chain swaps are unsupported. Other currencies retain
the existing create defaults.
The caller's rgb-lib wallet funds submarine locks and validates reverse lock consignments. The SDK validates the HTLC, builds the claim/refund PSBT and signs its script path. RGB proof validation and wallet state remain in rgb-lib.
SwapScript.prepare_rgb_claim / prepare_rgb_refund take RgbPsbtParams:
output_address, funding, max_fee (sats), swap_id, chain_client,
boltz_api, and optional lockup_tx. Parse a lock transaction with
BtcLikeTransaction.from_hex_bitcoin(hex). Use the original lock transaction
for refunds. The payout address must come from an RGB wallet witness receive.
RgbSpendFunding.HTLC_VALUE(fee_rate_sat_vb=rate)uses the HTLC's sats. Reverse locks are sized for the advertisedrgb.claim_fee_rate.RgbSpendFunding.CALLER_INPUTS()requires BTC funding. Add wallet inputs/change without coloring or signing, then retainspend.fund(funded_psbt). Itstemplate()returns the frozen PSBT and current HTLC input index.
Color that PSBT with rgb-lib's psbt_op_prepare_with_expiry, assigning the full
RGB amount to the template's payment output. Return the actual RGB allocations
in ColoredRgbPsbt to finalize_claim(colored, keys, preimage) or
finalize_refund(colored, keys). FinalizedRgbSpend contains psbt,
swap_input_index and optional transaction. Sign/finalize remaining wallet
inputs while preserving the SDK's HTLC witness. Error.RgbFeeInputRequired
means the HTLC cannot pay the fee while keeping the minimum payout; prepare with
caller inputs instead.
Keep the rgb-lib operation ID and complete psbt_op_mark_broadcast, broadcast,
psbt_op_apply and psbt_op_provide_receive_consignment. Enforce reverse lock
confirmations using the chain and rgb-lib: there is no reverse
transaction.confirmed event. Refunds wait for the timeout; claims must confirm
before it. Asset amounts use contract units; htlc_sat and fees use sats.
Submarine BTC collateral is capped at 1000 sats by default, independently of
maxFee/max_fee. The maker receives all of it on a successful claim. Choose
any larger cap locally before reading the response: set rgb_max_htlc_sat on CreateSubmarineRequest.
The cap is never sent to the maker. RGB spend preparation requires the actual
colored lock transaction; address discovery can select unrelated BTC outputs.
Before paying a reverse invoice, compare its claimFeeRate with your current
fee estimates and remaining timeout; reject an inadequate quote. If fees rise,
use a higher spend rate and wallet BTC inputs when needed. A maker fee quote
does not guarantee confirmation before the timeout. Contract-id chunk dashes
are cosmetic; pin a valid id from your trusted wallet or asset registry.
The adapter example demonstrates both spend directions. It requires an application-provided RGB wallet adapter. Actual RGB wallet validation is recorded in the native regtest example.
Metadata
Release files for kaleidorg-swap-sdk 0.11.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| kaleidorg_swap_sdk-0.11.0.tar.gz | 334.1 kB | Without provenance | Details for kaleidorg_swap_sdk-0.11.0.tar.gz |
Built distributions (wheels)
| File | Actions Reset | |||
|---|---|---|---|---|
| kaleidorg_swap_sdk-0.11.0-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details for kaleidorg_swap_sdk-0.11.0-py3-none-win_amd64.whl |
| kaleidorg_swap_sdk-0.11.0-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details for kaleidorg_swap_sdk-0.11.0-py3-none-manylinux_2_28_x86_64.whl |
| kaleidorg_swap_sdk-0.11.0-py3-none-manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64 | Details for kaleidorg_swap_sdk-0.11.0-py3-none-manylinux_2_28_aarch64.whl |
| kaleidorg_swap_sdk-0.11.0-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details for kaleidorg_swap_sdk-0.11.0-py3-none-macosx_11_0_arm64.whl |
| kaleidorg_swap_sdk-0.11.0-py3-none-macosx_10_12_x86_64.whl | Python 3 | none | macOS 10.12+ x86-64 | Details for kaleidorg_swap_sdk-0.11.0-py3-none-macosx_10_12_x86_64.whl |
Total release size: 27.8 MB
Release files / kaleidorg_swap_sdk-0.11.0.tar.gz
| Download URL | kaleidorg_swap_sdk-0.11.0.tar.gz |
|---|---|
| Size | 334.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c42fc25636109d2c79b94f2499c83dcbefe24c14fc2319d6f05d0bf85a41a29a
|
|
BLAKE2b-256 checksum How to use checksums |
0ecfa2121303cb4efc372d8461053d37da485ab9aa94c7be4e70ed00c30313e6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Release files / kaleidorg_swap_sdk-0.11.0-py3-none-win_amd64.whl
| Download URL | kaleidorg_swap_sdk-0.11.0-py3-none-win_amd64.whl |
|---|---|
| Size | 5.4 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
e88ef7225a977ffaca0c32db6adcc2b4e44f044e64337ac3c87af5c30308f6d7
|
|
BLAKE2b-256 checksum How to use checksums |
170ba0c4ce53bac9f0aa6d6c0417eac131cf2ff64d4ba8d6e06c89437ee130f8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Release files / kaleidorg_swap_sdk-0.11.0-py3-none-manylinux_2_28_x86_64.whl
| Download URL | kaleidorg_swap_sdk-0.11.0-py3-none-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 5.6 MB |
| Tags | Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
aaf3e41d1bff3263fbc2947427fe00bbec66173e305862e00c3dda74ed57754e
|
|
BLAKE2b-256 checksum How to use checksums |
958d4d3ad8926449c03c059c3545164e63659afaee4ace99b7c1175a03d539c9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Release files / kaleidorg_swap_sdk-0.11.0-py3-none-manylinux_2_28_aarch64.whl
| Download URL | kaleidorg_swap_sdk-0.11.0-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 5.6 MB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
4381e9987327b398c7f12f273ca1fc0c5a8b12b9364c6196352ea05fc3f02921
|
|
BLAKE2b-256 checksum How to use checksums |
9548d4504da2d070ade83c7371a3ef5e68cfe7dfbfcbc496a46d40c11ce85c41
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Release files / kaleidorg_swap_sdk-0.11.0-py3-none-macosx_11_0_arm64.whl
| Download URL | kaleidorg_swap_sdk-0.11.0-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 5.4 MB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
a0ae464f5cd57abb8d50571d5af635550363c0c89d35f3ed76b47a033a3e7978
|
|
BLAKE2b-256 checksum How to use checksums |
1e6d946439fa9d02b7a98c45988bcfaf9d42d99192679d5cd216c71449523159
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Release files / kaleidorg_swap_sdk-0.11.0-py3-none-macosx_10_12_x86_64.whl
| Download URL | kaleidorg_swap_sdk-0.11.0-py3-none-macosx_10_12_x86_64.whl |
|---|---|
| Size | 5.5 MB |
| Tags | Python 3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
245ef1911966b84f70b11ad063066c253b520b93a4cb3ceb7afbb5a8a4c5bbeb
|
|
BLAKE2b-256 checksum How to use checksums |
66a35a983e00753140c0e26d4689840908b292f463f1d723a413d0e61d9a4563
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.14
|
Security for kaleidorg-swap-sdk 0.11.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.