# Language Bindings for BDK
The code in this repository creates a library ready for export to other languages using [uniffi-rs] for the Rust-based [bdk_wallet] library from the [Bitcoin Dev Kit] project. Each supported language (Kotlin for Android and Swift for iOS) and the platforms it's packaged for has its own directory. The Rust code in this project is in the bdk-ffi directory and is a wrapper around the [bdk_wallet] library to expose its APIs in a uniform way using the [mozilla/uniffi-rs] bindings generator for each supported target language. ## Supported target languages and platforms The below directories include instructions for building and using the language binding for [bdk_wallet] supported by this project. | Language | Platform | Published Package | Building Documentation | API Docs | | -------- |-----------------------|-------------------|------------------------|-----------------------| | Kotlin | Android | [bdk-android] | [Readme bdk-android] | [Android API Docs] | | Swift | iOS, macOS | [bdk-swift] | [Readme bdk-swift] | | ## Other supported languages maintained in separate repositories The `bdk-ffi` codebase in this repository can be used to produce language bindings for more than Swift and Kotlin. Some of these require the use of uniffi 3rd party plugins and some not. Below are some of the libraries that use the bdk-ffi API, but are maintained separately. Refer to their individual READMEs for information on their state of production-readiness. | Language | Platform | Published Package | Repository | API Docs | | -------- |-----------------------|---------------------------|--------------|-----------------------| | Kotlin | JVM | [bdk-jvm (Maven Central)] | [bdk-jvm] | | | Python | Linux, macOS, Windows | [bdk-python (PyPI)] | [bdk-python] | | | Dart | Android, iOS, macOS, Linux, Windows | | [bdk-dart] | | | TypeScript | React Native (Android, iOS) | | [bdk-rn] | | ## Building and testing the libraries If you are familiar with the build tools for the specific languages you wish to build the libraries for, you can use their normal build/test workflows. We also include some [just](https://just.systems/) files to simplify the work across different languages. If you have the `just` tool installed on your system, you can simply call the commands defined in the justfiles, for example: ```sh cd bdk-android just build just test just publish-local ``` ## Contributing To add new structs and functions, see the [UniFFI User Guide](https://mozilla.github.io/uniffi-rs/) and the [uniffi-examples](https://thunderbiscuit.github.io/uniffi-examples/) repository. ## Goals 1. Language bindings should feel idiomatic in target languages/platforms 2. Adding new targets should be easy 3. Getting up and running should be easy 4. Contributing should be easy 5. Get it right, then automate ## Verifying Signatures Both libraries and all their corresponding artifacts are signed with a PGP key you can find in the root of this repository. To verify the signatures follow the below steps: 1. Import the PGP key in your keyring. ```shell # Navigate to the root of the repository and import the ./PGP-BDK-BINDINGS.asc public key gpg --import ./PGP-BDK-BINDINGS.asc # Alternatively, you can import the key directly from a public key server gpg --keyserver keyserver.ubuntu.com --receive-key 2768C43E8803C6A3 # Verify that the correct key was imported gpg --list-keys # You should see the below output pub ed25519 2022-08-31 [SC] 88AD93AC4589FD090FF3B8D12768C43E8803C6A3 uid [ unknown] bitcoindevkit-bindings