Zingo Mobile is a shielded Zcash light-client wallet for Android and iOS, built with React Native and powered by the Zingolib Rust SDK.
App Store: https://apps.apple.com/app/zingo/id1668209531
Google Play: https://play.google.com/store/apps/details?id=org.ZingoLabs.Zingo
If you believe you have discovered a security issue, please contact us at:
Please see the platform specific iOS and Android "quickstart" documentation.
Integration tests and end-to-end tests require a regtest server. On linux hosts, these may be run
locally by installing the lightwalletd, zcashd and zcash-cli binaries
(https://github.com/zingolabs/zingolib#regtest). From the rust/android/regtest/bin/ directory run:
ln -s path/to/lightwalletd/binary path/to/zcashd/binary path/to/zcash-cli/binary ./
From the rust/android/lightwalletd_bin directory run:
ln -s path/to/lightwalletd/binary ./
Alternatively, integration tests and end-to-end tests can be run on non-linux hosts with Regchest
(https://github.com/zingolabs/zingo-regchest). Regchest manages the zcash/lightwalletd regtest
network in a docker container. Before running tests, pull the latest Regchest image from docker:
docker pull zingodevops/regchest:013
- From the root directory, run:
yarn test
These exercise the Rust ↔ Kotlin/Swift FFI boundary against a regtest network.
The Android suite (rust/android/tests/integration_tests.rs) runs on every PR
via the android-ubuntu-integration-test-ci workflow. The iOS suite
(rust/ios/tests/integration_tests.rs) exists but its cargo nextest run
invocation is currently commented out in ios-integration-test.yaml, so it
does not gate PRs — you can still run it locally with the same nextest
commands.
- Create quick-boot snapshots to speed up AVD launch times. From the root directory, run:
./scripts/android_integration_tests.sh -a x86_64 -s
./scripts/android_integration_tests.sh -a x86 -s
By default, this uses default API 29 system images. Other images may be used for testing by specifying the api level and target. However, using other images with the cargo test runner is still under development. - To run the integration tests. From the
rustdirectory, run:
cargo nextest run android_integration
Specify to run specific ABI:
cargo nextest run android_integration::x86_64
cargo nextest run android_integration::x86_32
cargo nextest run android_integration::arm64
cargo nextest run android_integration::arm32
Specify to run a specific test on all ABIs:
cargo nextest run test_name
Specify to run a specific ABI and test:
cargo nextest run android_integration::x86_64::test_name
To run tests with Regchest, add the --features regchest flag, for example:
cargo nextest run android_integration --features regchest
For more information on running integration tests on non-default AVDs, run:
./scripts/android_integration_tests.sh -h
Without the cargo test runner these emulated android devices will not be able to connect to a
lightwalletd/zcashd regtest network. Therefore, only tests in the "Offline Testsuite" may be tested.
Drives the Android app from Rust against a regtest network. Lives in
rust/android/tests/e2e_tests.rs. Currently Android-only.
- Note there needs to be a lightwalletd in rust/android/lightwalletd_bin
- Launch the emulated AVD by clicking the 'play' icon in Android Studio's
Device Manager. Alternatively, connect to a physical device. See previous section 'Launching the app' for more details. - In a terminal, run:
yarn start - Create quick-boot snapshots to speed up AVD launch times. From the root directory, run:
./scripts/e2e_tests.sh -a x86_64 -s
./scripts/e2e_tests.sh -a x86 -s
By default, this uses default API 29 system images. Other images may be used for testing by specifying the api level and target. However, using other images with the cargo test runner is still under development. - In a separate terminal, from the
rustdirectory, run all tests:
cargo nextest run e2eSpecify to run specific ABI:
cargo nextest run e2e::x86_64
cargo nextest run e2e::x86_32
cargo nextest run e2e::arm64
cargo nextest run e2e::arm32
Specify to run a specific ABI and test:
cargo nextest run e2e::x86_64::test_name
Maestro drives the released app from the
outside, asserting on the rendered UI. Flows live in .maestro/ as YAML
(01_basic_new_wallet.yaml, etc.). Runs nightly in CI via
.github/workflows/maestro-nightly.yaml against both Android and iOS;
this is the e2e suite that PR reviewers and releases lean on going
forward.
To run locally:
-
Install the Maestro CLI:
curl -Ls "https://get.maestro.mobile.dev" | bash(puts the binary in~/.maestro/bin) -
Boot an emulator/simulator and install the app you want to test against (debug or release). Maestro talks to whatever device is currently selected by
adb/xcrun simctl. -
From the repo root:
maestro test .maestro/Or run a single flow:
maestro test .maestro/01_basic_new_wallet.yaml
The legacy Detox suite under e2e/*.test.js is no longer wired to CI or
to any yarn script. It is being phased out in favour of Maestro and
should not be relied on; new e2e coverage should land as Maestro flows.
For notes on known issues and problems, see the trouble-shooting notes.