Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/bitboxswiss/bitbox-wallet-app
The BitBoxApp for desktop and mobile.
https://github.com/bitboxswiss/bitbox-wallet-app
bech32 bitcoin hardware-wallet litecoin segwit wallet
Last synced: 3 days ago
JSON representation
The BitBoxApp for desktop and mobile.
- Host: GitHub
- URL: https://github.com/bitboxswiss/bitbox-wallet-app
- Owner: BitBoxSwiss
- License: apache-2.0
- Created: 2018-08-02T11:17:59.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2024-12-23T00:56:08.000Z (17 days ago)
- Last Synced: 2025-01-03T04:39:45.740Z (6 days ago)
- Topics: bech32, bitcoin, hardware-wallet, litecoin, segwit, wallet
- Language: Go
- Homepage: https://bitbox.swiss/app
- Size: 783 MB
- Stars: 259
- Watchers: 19
- Forks: 89
- Open Issues: 84
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
# BitBoxApp
![BitBoxApp Screenshot](./docs/assets/app-screen.png)
This repo contains the source code for the BitBoxApp and related tools.
Contributions are very welcome.
Please see the [contribution guidelines](CONTRIBUTING.md).## Tech stack
The wallet UI is a [React](https://reactjs.org/) single page webapp. It sources its data from the
backend written in Go.The Desktop app is a C++ Qt program containing only a `WebEngineView`, displaying the UI.
Static assets are sourced from a Qt rcc file, and the dynamic data is bridged from Go with
WebChannels.The Go library is compiled as a C library which exposes two functions only: one to set up the
bridge, and one to invoke calls in the backend.Similarly to the Desktop variant, the Go library can be compiled and added to an Android Studio /
XCode project.## Directories (subject to change)
- `cmd/`: Go projects which generate binaries are here.
- `cmd/servewallet/`: a development aid which serves the static web ui and the http api it talks
to. See below.
- `vendor/`: Go dependencies, created by `make go-vendor` based on Go modules.
- `backend/coins/btc/electrum/`: A json rpc client library, talking to Electrum servers.
- `backend/devices/{bitbox,bitbox02}/`: Library to detect and talk to BitBoxes. High level API access.
- `backend/coins/btc/`: Local HD wallet, sourcing blockchain index from an arbitrary
backend. Manages addresses, outputs, tx creation, and everything else that a wallet needs to do.
- `backend/`: The library that ties it all together. Uses the above packages to create a wallet
talking Electrum using the BitBox for signing, and serve a high level HTTP API to control it.
- `frontends/qt/`: the C++/Qt app which builds the wallet app for the desktop.
- `frontends/android/`: Android target
- `frontends/web/`: home of the React UI.## Set up the development environment
The below instructions assume a unix environment.
### Requirements
To build the app or run the development workflow, the following dependencies need to be installed:
- [Go](https://golang.org/doc/install) version 1.23
- [Node.js](https://nodejs.org/) version 20.x
- [NPM](https://docs.npmjs.com/about-npm-versions) version 10.x or newer
- [Qt](https://www.qt.io) version 6.2.4
- install Qt for your platform, including the WebEngine component## Build the BitBoxApp
Clone this repository using `git clone --recursive`.
Please consult [docs/BUILD.md](./docs/BUILD.md) for platform specific instructions and further information.
## I18N translation workflow
Please consult [docs/i18n.md](./docs/i18n.md).
## Electrum server backend
The servers used are configurable in the app settings. Currently, when running the app in devmode
(`make servewallet`), the config is ignored and servers on Shift's devserver are used. The
hosts/ports/certs of those are currently hardcoded.Currently, [Electrs](https://github.com/romanz/electrs) and
[ElectrumX](https://github.com/spesmilo/electrumx/) are the recommended ways to connect your own
full node.## Development workflow
### Local development
Run `make envinit` to fetch golangci-lint and some other devtools.
Run `make servewallet` and `make webdev` in seperate terminals.
Before the first use of `make webdev`, you also need to run `make buildweb`, to install the dev
dependencies.#### Watch and build the UI
Run `make webdev` to develop the UI inside a web browser (for quick development, automatic rebuilds
and devtools). This serves the UI on [localhost:8080](http://localhost:8080). Changes to the web
code in `frontends/web/src` are automatically detected and rebuilt.#### UI testing
The tests are run using [jest](https://jestjs.io)
and [ts-jest](https://www.npmjs.com/package/ts-jest) preprocessor.Because the app is based on [preact](https://preactjs.com),
we use [preact-render-spy](https://www.npmjs.com/package/preact-render-spy) package
instead of [enzyme](https://airbnb.io/enzyme/) to test app components rendering
and their state.To run all test suites, execute `make webtest`.
If you plan on spending a lot of time in `frontends/web/src` space
or just keen on doing TDD, use jest's tests watcher:cd frontends/web/
make jstest-watchTo generate coverage report, execute `make jstest-cover` from `frontends/web` dir
and open `coverage/lcov-report/index.html` in a browser.#### Run the HTTP API
Run `make servewallet` to compile the code and run `servewallet`. `servewallet` is a devtool which
serves the HTTP API. Changes to the backend code are *not* automatically detected, so you need to
restart the server after changes.#### Go dependencies
Go dependencies are managed by `go mod`, and vendored using `make go-vendor`. The deps are vendored
so that- offline builds work
- dependency diffs are easier to inspect
- less reliance on remote systems
- because `gomobile bind` does not support Go modules yet#### NPM dependencies
All dependencies are locked in `package-lock.json` so that subsequent installs and different installations get the exact same dependency tree. To run any of the following npm commands run `cd frontends/web` first.
**Note:** Some devDependencies in `package.json` are specified with a semver range operator i.e. `"typescript": "^4.4.2"`. The main reason is that those dependencies can be **updated** anytime within the range by running `npm update`.
Check **outdated** dependencies: `npm outdated`.
**Update a specific dependency** with a fixed semver `npm install modulename@specificversion --save-exact`, and with `--save-dev` for devDependencies.
#### Qt WebEngine Debugging
Set the following environment variable to debug the Qt WebEngine with Chrome developer tools,
use a port_number of your choice, launch the following command and go to `http://localhost:`.```
QTWEBENGINE_REMOTE_DEBUGGING= ./frontends/qt/build/osx/BitBox.app/Contents/MacOS/BitBox
```see also https://doc.qt.io/qt-5/qtwebengine-debugging.html
### CI
Run `make ci` to run all static analysis tools and tests.
### Build the UI
To statically compile the UI, run `make buildweb` again, which compiles the web ui into a compact
bundle.## Develop using Docker
The Dockerfile provides a Ubuntu container with the whole environment preconfigured. To set it up,
run `make dockerinit`, which builds the Docker image (this takes a while).After that, `make dockerdev` enters the container (a shell inside an Ubuntu virtual machine), where
you can perform the same steps as in the previous section (`make servewallet` and `make
webdev`).Before the first use of `make webdev`, you also need to run `make buildweb`, to install the dev
dependencies.Running `make dockerdev` multiple times shares the same container. You can edit the code
in your usual editor in the host and compile inside the container.To execute `make servewallet` and `make webdev` insider the container, but from the host, use this:
`$ ./scripts/docker_exec.sh servewallet/webdev`
## Testnet coins
In development mode, any password entered derives a unique testnet wallet.
Get Bitcoin Testnet coins here: https://coinfaucet.eu/en/btc-testnet/
Get Litecoin Testnet coins here: https://tltc.bitaps.com/
Get Ethereum Sepolia coins here: https://faucet.sepolia.dev/
In case any of the Ethereum faucets are not working, you can try others from here: https://faucetlink.to (some require account creation)