Go to file
Carter Jernigan c0a2c11418
[#615] Refactor lightwalletd client
* [#615] Refactor lightwalletd client

This moves the lightwalletd client code to a separate Gradle module, but does not yet do much clean up the public API (e.g. hiding generated GRPC objects).  That will be a followon change via #673

I’ve prototyped a safer version of the API that would be implemented for #673 for two specific calls: obtaining the current block height and obtaining the light wallet info.  These were the easiest endpoints to update and they provide a useful exploration for the future changes needed.

* Fix benchmarking for networking module

- Moved to fixture and build type check components to the new networking module, so it's accessible from all needed parts of the projects
- Changed fixture return type to fit to all needed usages

* Align with previous review comment

* Fix wrong merge

* Add basic sanity test

- To satisfy tests requirements on emulators.wtf service

* Remove grpc dependency from sdk-lib module

* Repackage cash.z.wallet.sdk.rpc to cash.z.wallet.sdk.internal.rpc

* Fix BuildConfig path

* Update demo-app paths to rpc

* Fix broken grpc services locations

- Our aim here is to change only the local services location (package name), the server location can't be changed due to backward compatibility.

* Enhance GRPC Response model

* Adopt enhanced GRPC response model

- Adopted in a few endpoints

* Enhance Connection failure type

* Add simple fixture test

* Refactor fetchTransaction() to work with Response

- Refactored this server call to adopt our new Response mechanism
- GrpsStatusResolver.resolveFailureFromStatus() now accepts Throwable input
- Added Response.Failure.toThrowable() to satisfy subsequent server calls results processing
- A few other minor refactoring changes

* Remove commented out log

* Unify return type of collection returning methods

- Switched fetchUtxos() to return Sequence instead of List
- Added a check on empty tAddress input

* fetchUtxos returns flow

- Switched fetchUtxos() to return Flow of Service.GetAddressUtxosReply
- Internally it calls getAddressUtxosStream() instead of getAddressUtxos() from GRPC layer

* Update unsafe suffix documentation

* Address several minor change requests

* Remove code parameter

- Removed from the locally triggered failures with default codes.

* Rename local variable

* Switch from empty response to exception

- Our server calls now rather throw IllegalArgumentException than return an empty response
- Removed commented out log message
- Updated javadocs

* Update proto files

- Plus related api changes adoption

* Unify new clients instances name

* AGP 7.4.0 changes

-  packagingOptions -> androidComponents in sdk-lib and lightwallet-client-lib modules

* SDK version bump

* Response resolver tests

* Release build upload timeout increase

* Release build upload timeout increase fix

* Revert timeout

- As Github has some infrastructure troubles and we need to wait

* Add migrations documentation

* Sort packaging filters

* Remove private field from public documentation

* Hide private variables

* Remove package from Android Manifest

* Throw exception instead of custom error

- This step unify our approach to validation on client side across all server calls

* Replace setAddresses index const with number

* Fix indentation in proto file

---------

Co-authored-by: Honza <rychnovsky.honza@gmail.com>
2023-02-01 11:14:55 +01:00
.github Bump actions/cache from 3.2.3 to 3.2.4 in /.github/actions/setup (#899) 2023-01-31 08:52:27 +01:00
.idea [#631] Improve demo app compose UI for testing 2023-01-09 10:42:38 -05:00
.run [#615] Refactor lightwalletd client 2023-02-01 11:14:55 +01:00
build-conventions [#892] Emulator.wtf Gradle Plugin 0.0.15 2023-01-24 06:22:27 -05:00
darkside-test-lib [#615] Refactor lightwalletd client 2023-02-01 11:14:55 +01:00
demo-app [#615] Refactor lightwalletd client 2023-02-01 11:14:55 +01:00
demo-app-benchmark-test [#789] Benchmarking Demo-app 2022-12-13 14:25:09 +01:00
docs [#615] Refactor lightwalletd client 2023-02-01 11:14:55 +01:00
gradle/wrapper [#796] Gradle 7.6 2022-12-15 16:17:28 +01:00
lightwallet-client-lib [#615] Refactor lightwalletd client 2023-02-01 11:14:55 +01:00
sdk-lib [#615] Refactor lightwalletd client 2023-02-01 11:14:55 +01:00
tools [#631] Initial Compose scaffolding for demo app 2022-12-23 11:00:37 +01:00
.gitignore [#615] Refactor lightwalletd client 2023-02-01 11:14:55 +01:00
CHANGELOG.md [#615] Refactor lightwalletd client 2023-02-01 11:14:55 +01:00
CONTRIBUTING.md [#495] Update Contributing Guidelines "Commit Messages" (#496) 2022-04-28 14:31:49 -04:00
LICENSE Correct LICENSE file 2021-08-25 06:48:13 -04:00
MIGRATIONS.md [#615] Refactor lightwalletd client 2023-02-01 11:14:55 +01:00
README.md Improve readme documentation (#667) 2022-08-12 06:57:27 -04:00
build.gradle.kts [#882] Check properties on CI 2023-01-25 15:10:05 -05:00
gradle.properties [#615] Refactor lightwalletd client 2023-02-01 11:14:55 +01:00
gradlew [#796] Gradle 7.6 2022-12-15 16:17:28 +01:00
gradlew.bat [#796] Gradle 7.6 2022-12-15 16:17:28 +01:00
responsible_disclosure.md Added gmale suggestion of hyphentation. 2021-01-26 15:12:53 -08:00
settings.gradle.kts [#615] Refactor lightwalletd client 2023-02-01 11:14:55 +01:00

README.md

license Maven Central

This is a beta build and is currently under active development. Please be advised of the following:

  • This code currently is not audited by an external security auditor, use it at your own risk
  • The code has not been subjected to thorough review by engineers at the Electric Coin Company
  • We are actively changing the codebase and adding features where/when needed

🔒 Security Warnings

  • The Zcash Android Wallet SDK is experimental and a work in progress. Use it at your own risk.
  • Developers using this SDK must familiarize themselves with the current threat model, especially the known weaknesses described there.

Zcash Android SDK

This lightweight SDK connects Android to Zcash, allowing third-party Android apps to send and receive shielded transactions easily, securely and privately.

Different sections of this repository documentation are oriented to different roles, specifically Consumers (you want to use the SDK) and Maintainers (you want to modify the SDK).

Note: This SDK is designed to work with lightwalletd. As either a consumer of the SDK or developer, you'll need a lightwalletd instance to connect to. These servers are maintained by the Zcash community.

Note: Because we have not deployed a non-beta release of the SDK yet, version numbers currently follow a variation of semantic versioning. Generally a non-breaking change will increment the beta number while a breaking change will increment the minor number. 1.0.0-beta01 -> 1.0.0-beta02 is non-breaking, while 1.0.0-beta01 -> 1.1.0-beta01 is breaking. This is subject to change.

Zcash Networks

"mainnet" (main network) and "testnet" (test network) are terms used in the blockchain ecosystem to describe different blockchain networks. Mainnet is responsible for executing actual transactions within the network and storing them on the blockchain. In contrast, the testnet provides an alternative environment that mimics the mainnet's functionality to allow developers to build and test projects without needing to facilitate live transactions or the use of cryptocurrencies, for example.

The Zcash testnet is an alternative blockchain that attempts to mimic the mainnet (main Zcash network) for testing purposes. Testnet coins are distinct from actual ZEC and do not have value. Developers and users can experiment with the testnet without having to use valuable currency. The testnet is also used to test network upgrades and their activation before committing to the upgrade on the main Zcash network. For more information on how to add testnet funds visit Testnet Guide or go right to the Testnet Faucet.

This SDK supports both mainnet and testnet. Further details on switching networks are covered in the remaining documentation.

Consumers

If you're a developer consuming this SDK in your own app, see Consumers.md for a discussion of setting up your app to consume the SDK and leverage the public APIs.

A primitive example to exercise the SDK exists in this repo, under Demo App.

There are also more comprehensive sample walletes:

  • ECC Sample Wallet — A basic sample application.
  • Secant Sample Wallet — A more modern codebase written in Compose. This repository is a work-in-progress and is not fully functional yet as of August 2022, although it will be our primary sample application in the future.

Maintainers and Contributors

If you're building the SDK from source or modifying the SDK:

  • Setup.md to configure building from source
  • Architecture.md to understand the high level architecture of the code
  • CI.md to understand the Continuous Integration build scripts
  • PUBLISHING.md to understand our deployment process

Note that we aim for the main branch of this repository to be stable and releasable. We continuously deploy snapshot builds after a merge to the main branch, then manually deploy release builds. Our continuous deployment of snapshots implies two things:

  • A pull request containing API changes should also bump the version
  • Each pull request should be stable and ready to be consumed, to the best of your knowledge. Gating unstable functionality behind a flag is perfectly acceptable

Known Issues

  1. Intel-based machines may have trouble building in Android Studio. The workaround is to add the following line to ~/.gradle/gradle.properties: ZCASH_IS_DEPENDENCY_LOCKING_ENABLED=false
  2. During builds, a warning will be printed that says "Unable to detect AGP versions for included builds. All projects in the build should use the same AGP version." This can be safely ignored. The version under build-conventions is the same as the version used elsewhere in the application.
  3. Android Studio will warn about the Gradle checksum. This is a known issue and can be safely ignored.