All notable changes to this library will be documented in this file.
The format is based on Keep a Changelog, and this library adheres to Semantic Versioning.
- Fixed a bug that could cause transactions shielding more than 150 transparent P2PKH inputs to fail due to incorrect fee computation.
-
SDKSynchronizer.rescanFrom(height:): Rescans the chain from the given BlockHeight. -
SynchronizerState.fullyScannedHeight: Contiguous-from-birthday scan high-water mark published onstateStream/latestState. Callers that need an authoritative view of the wallet's note and nullifier state at a specific height (for example, balance anchored at a poll snapshot) should gate on this rather thanlatestBlockHeight(chain tip) ormaxScannedHeight(head-first scan progress, which can race ahead under Spend-before-Sync). -
Synchronizer.getTreeState(height:): Fetches the commitment tree state at the given block height from lightwalletd and returns the protobuf-serializedTreeStatebytes, for app-layer consumers that need to hand tree state to an external component (for example, witness generation via FFI). A throwing default implementation keeps the addition source-compatible for downstreamSynchronizerconformers. -
zcash_votingdependency foundation: SDK Rust crate now depends onzcash_voting 0.5.7(default-features = false,client-pir,client-tree-sync) and exposes pure-function FFI symbols for share-nullifier computation and PIR proof validation. -
PirSnapshotResolver,PirSnapshotResolverError,PirSnapshotProbeOutcome,PirSnapshotProbing, andHTTPPirSnapshotProbe: Select a vote-nullifier PIR endpoint whose/rootmetadata exactly matches a voting round's expected snapshot height. -
Voting*Swift types: public type contract for the shielded voting FFI boundary, inSources/ZcashLightClientKit/Rust/Voting/VotingTypes.swift. -
VotingRustBackend: Swift wrapper for the votinglibzcashlcsurface. Afinal classthat owns an opaqueVotingDatabaseHandlefor the duration of a voting session. Exposes:- Database lifecycle:
init(),open(path:),close()(idempotent), anddeinitcleanup, overzcashlc_voting_db_open/zcashlc_voting_db_free. setWalletId(_:)overzcashlc_voting_set_wallet_id.precomputeDelegationPir(roundId:bundleIndex:notes:pirEndpoints:expectedSnapshotHeight:networkId:pirResolver:)overzcashlc_voting_precompute_delegation_pir, withPirSnapshotResolver-driven endpoint selection.generateNoteWitnesses(roundId:bundleIndex:walletDbPath:notes:networkId:)overzcashlc_voting_generate_note_witnesses.- Vote-tree sync:
syncVoteTree(roundId:nodeUrl:),generateVanWitness(roundId:bundleIndex:anchorHeight:), andresetTreeClient(roundId:)over the correspondingzcashlc_voting_sync_vote_tree/_generate_van_witness/_reset_tree_clientFFI. - Vote casting:
encryptShares(roundId:shares:),buildVoteCommitment(roundId:bundleIndex:hotkeySeed:networkId:proposalId:choice:numOptions:vanWitness:singleShare:progress:),buildSharePayloads(commitment:voteDecision:numOptions:voteCommitmentTreePosition:singleShare:),markVoteSubmitted(roundId:bundleIndex:proposalId:), andsignCastVote(hotkeySeed:networkId:commitment:). - The static
computeShareNullifier(voteCommitment:shareIndex:primaryBlind:)overzcashlc_voting_compute_share_nullifier, with 32-byte input validation. VotingRustBackendErrorcasesdatabaseAlreadyOpen/databaseNotOpenfor handle-state errors, alongside the existingrustErrorandinvalidData.
- Database lifecycle:
-
Extends
VotingRustBackendwith additional FFI wrappers and their FFI mappings:Foundation helpers (static)
warmProvingCaches()→zcashlc_voting_warm_proving_cachesdecomposeWeight(_:)→zcashlc_voting_decompose_weightgenerateDelegationInputs(senderSeed:hotkeySeed:networkId:accountIndex:)→zcashlc_voting_generate_delegation_inputsgenerateDelegationInputs(senderFvk:hotkeySeed:networkId:seedFingerprint:)→zcashlc_voting_generate_delegation_inputs_with_fvkextractPcztSighash(pczt:)→zcashlc_voting_extract_pczt_sighashextractSpendAuthSig(signedPczt:actionIndex:)→zcashlc_voting_extract_spend_auth_sigextractOrchardFvk(ufvk:networkId:)→zcashlc_voting_extract_orchard_fvk_from_ufvkextractNcRoot(treeState:)→zcashlc_voting_extract_nc_rootverifyWitness(_:)→zcashlc_voting_verify_witnessvalidatePirProof(_:)→zcashlc_voting_validate_pir_proof(takesVotingPirProof)
Round lifecycle
initRound(roundId:snapshotHeight:eaPublicKey:ncRoot:nullifierImtRoot:sessionJson:)→zcashlc_voting_init_roundgetRoundState(roundId:)→zcashlc_voting_get_round_state(freesFfiRoundStateviazcashlc_voting_free_round_state)listRounds()→zcashlc_voting_list_rounds(freesFfiRoundSummariesviazcashlc_voting_free_round_summaries)getVotes(roundId:)→zcashlc_voting_get_votes(freesFfiVoteRecordsviazcashlc_voting_free_vote_records)clearRound(roundId:)→zcashlc_voting_clear_rounddeleteSkippedBundles(roundId:keepCount:)→zcashlc_voting_delete_skipped_bundles
Wallet notes
getWalletNotes(accountUuidBytes:dataDbPath:snapshotHeight:networkId:)→zcashlc_voting_get_wallet_notes
Recovery state
storeDelegationTxHash(roundId:bundleIndex:txHash:)→zcashlc_voting_store_delegation_tx_hashgetDelegationTxHash(roundId:bundleIndex:)→zcashlc_voting_get_delegation_tx_hashstoreVoteTxHash(roundId:bundleIndex:proposalId:txHash:)→zcashlc_voting_store_vote_tx_hashgetVoteTxHash(roundId:bundleIndex:proposalId:)→zcashlc_voting_get_vote_tx_hashstoreCommitmentBundle(roundId:bundleIndex:proposalId:bundleJson:voteCommitmentTreePosition:)→zcashlc_voting_store_commitment_bundlegetCommitmentBundle(roundId:bundleIndex:proposalId:)→zcashlc_voting_get_commitment_bundlestoreKeystoneSignature(roundId:bundleIndex:sig:sighash:randomizedKey:)→zcashlc_voting_store_keystone_signaturegetKeystoneSignatures(roundId:)→zcashlc_voting_get_keystone_signaturesclearRecoveryState(roundId:)→zcashlc_voting_clear_recovery_state
Share delegation tracking
recordShareDelegation(roundId:bundleIndex:proposalId:shareIndex:sentToURLs:nullifier:submitAt:)→zcashlc_voting_record_share_delegationgetShareDelegations(roundId:)→zcashlc_voting_get_share_delegationsgetUnconfirmedDelegations(roundId:)→zcashlc_voting_get_unconfirmed_delegationsmarkShareConfirmed(roundId:bundleIndex:proposalId:shareIndex:)→zcashlc_voting_mark_share_confirmedaddSentServers(roundId:bundleIndex:proposalId:shareIndex:newURLs:)→zcashlc_voting_add_sent_servers
Delegation workflow
generateHotkey(seed:)→zcashlc_voting_generate_hotkey(freesFfiVotingHotkeyviazcashlc_voting_free_hotkey)setupBundles(roundId:notes:)→zcashlc_voting_setup_bundles(freesFfiBundleSetupResultviazcashlc_voting_free_bundle_setup_result)getBundleCount(roundId:)→zcashlc_voting_get_bundle_countbuildPczt(_:)→zcashlc_voting_build_pczt(takesVotingBuildPcztParams)storeTreeState(roundId:treeState:)→zcashlc_voting_store_tree_stategetDelegationSubmission(roundId:bundleIndex:senderSeed:networkId:accountIndex:)→zcashlc_voting_get_delegation_submissiongetDelegationSubmission(roundId:bundleIndex:keystoneSig:sighash:)→zcashlc_voting_get_delegation_submission_with_keystone_sigstoreVanPosition(roundId:bundleIndex:position:)→zcashlc_voting_store_van_positionbuildAndProveDelegation(roundId:bundleIndex:notes:hotkeyRawAddress:pirEndpoints:expectedSnapshotHeight:networkId:pirResolver:progress:)(async, resolves the PIR snapshot endpoint, then runs proving on a detachedTask) →zcashlc_voting_build_and_prove_delegation(with progress callback bridge)
-
Broadcasterprotocol — separates transaction creation from submission, enabling custom broadcast strategies (e.g. submitting to multiple lightwalletd servers in parallel).Broadcaster.createProposedTransactions(proposal:spendingKey:)— creates transactions locally without broadcasting, returning[ZcashTransaction.Overview]with raw bytes.Broadcaster.createTransactionFromPCZT(pcztWithProofs:pcztWithSigs:)— extracts and stores a transaction from PCZT data without submitting.Broadcaster.submit(_:to:)— submits raw transaction bytes to a specificLightWalletEndpoint. Respects Tor configuration.
-
Synchronizer.broadcasterproperty, also exposed through the closure and Combine synchronizer facades, to access theBroadcasterfrom SDK synchronizer instances. -
libzcashlcvoting tree-sync FFI:zcashlc_voting_sync_vote_tree,zcashlc_voting_generate_van_witness, andzcashlc_voting_reset_tree_client. Operate on the existingVotingDatabaseHandle, which also carries azcash_voting::tree_sync::VoteTreeSyncconstructed inzcashlc_voting_db_open. -
libzcashlcvoting wallet-notes FFI:zcashlc_voting_get_wallet_notes. Loads unspent Orchard notes for a wallet account at a snapshot height and returns them as a JSON-encodedVec<NoteInfo>, suitable as thenotesinput tozcashlc_voting_precompute_delegation_pir.account_uuidmust be a non-null pointer to exactly 16 bytes; otherwise the call fails (returns null). -
libzcashlcvoting key-utility FFI:zcashlc_voting_extract_orchard_fvk_from_ufvk. Decodes a UFVK string and returns the raw 96-byte Orchard FVK. Returns null on missing Orchard component, malformed UFVK, or invalidnetwork_id. -
libzcashlcvoting utility FFI:zcashlc_voting_warm_proving_caches,zcashlc_voting_decompose_weight,zcashlc_voting_generate_delegation_inputs,zcashlc_voting_generate_delegation_inputs_with_fvk,zcashlc_voting_extract_pczt_sighash,zcashlc_voting_extract_spend_auth_sig,zcashlc_voting_extract_nc_root, andzcashlc_voting_verify_witness. These cover voting proof setup, PCZT/signature extraction, note-commitment root extraction, and witness verification. -
libzcashlcvoting witness FFI:zcashlc_voting_generate_note_witnesses. Generates Orchard Merkle inclusion witnesses for a bundle's notes anchored at the round's snapshot height. Addsincrementalmerkletree 0.8as a direct Rust dependency. -
libzcashlcvoting round, recovery, and delegation workflow FFI: adds C-compatible return structs and free helpers, persisted round-state APIs, crash-recovery metadata helpers, share-delegation tracking, hotkey and bundle setup, delegation PCZT/proof generation, delegation submission payloads, and VAN position persistence. -
libzcashlcvote-casting FFI: encrypts vote shares, builds vote commitments and share payloads, marks submitted votes, and signs cast-vote transactions.
- Bumped Rust dependencies to current crates.io releases (
zcash_address0.10→0.11,zcash_client_backend0.21→0.22,zcash_client_sqlite0.19→0.20,zcash_primitives/zcash_proofs0.26→0.27,zcash_protocol0.7→0.8,zcash_transparent0.6→0.7,sapling-crypto0.6→0.7,orchard0.12→0.13,pczt0.5→0.6) and removed the[patch.crates-io]git-rev overrides. No public Swift API changes. - Pinned
orchardto=0.13.1and enabled itsunstable-voting-circuitsfeature, required transitively byzcash_voting. No public Swift API changes. SDKSyncrhonizer.importAccountextended withbirthday: BlockHeight?. Leaving the defaultnilvalue sets the chain tip, otherwise givenbirthdayheight is used.- Enabled the
client-tree-syncfeature onzcash_voting, required by the new voting tree-sync FFI listed above. - Added
zcash_keys 0.13(orchardfeature) as a Rust dependency, used by the new voting wallet-notes, key-utility, and utility FFI to decode UFVKs and derive Orchard FVKs. No public Swift API changes. - Bumped
zcash_votingto0.5.7sonetwork_idmatches the SDK (0= testnet,1= mainnet) end-to-end for wallet-notes JSON consumed by delegation PIR, and submitted-vote marking fails when no persisted vote row matches. No public Swift API changes.
Transport became inactiveconnectivity issue.NIOHTTP2connectivity issues.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3297500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3337500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3940000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/4000000.json
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3285000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3295000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3920000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3930000.json
- Networking connections are closed properly, resetting the state and letting the next re-run to properly initialize. This fixes the issues with restore after reset and also server switch issues.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3280000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3282500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3910000.json
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3265000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3277500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3890000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3900000.json
switchToserver updatesTransactionEncoder. It was missing and submission of the transactions went through the previous server instead of a current one.
- Fix for a long-standing note commitment tree corruption error.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3252500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3262500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3870000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3880000.json
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3220000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3250000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3810000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3860000.json
- LightWalletGRPCServiceOverTor.submit now throws ZcashError.serviceSubmitFailed instead of a generic error. This fix mirrors LightWalletGRPCService’s error reporting and resolves the discrepancy between the Tor and non-Tor submit APIs.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3172500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3217500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3740000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3800000.json
SDKSynchronizer.deleteAccount(AccountUUID): Deletes the specified account, and all transactions that exclusively involve it, from the wallet database.
downloadParamsIfnotPresentnow retries up to three times on sync pipeline failure.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3157500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3170000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3720000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3730000.json
-
Custom SQL functions to
Synchronizer.debugDatabase:txid(Blob) -> String: converts a transaction ID from its byte form to a user-facing string.memo(Blob?) -> String?: prints the given blob as a string if it is a text memo, and as hex-encoded bytes otherwise.
-
SDKSynchronizer.estimateTimestamp(for height: Blockheight): Get an estimated timestamp for a given block height. -
SDKSynchronizer.enhanceTransactionBy(txId)Calls an enhance action for a given txId.
- The Sapling parameter files download logic replaces the files atomically rather than moving them into the final destination. This prevents errors caused by partially downloaded files.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3130000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3155000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3680000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3710000.json
SDKSynchronizer.getSingleUseTransparentAddressGet an ephemeral single use transparent address.SDKSynchronizer.checkSingleUseTransparentAddressesChecks to find any single-use ephemeral addresses exposed in the past day that have not yet received funds, excluding any whose next check time is in the future. This will then choose the address that is most overdue for checking, retrieve any UTXOs for that address over Tor, and add them to the wallet database.SDKSynchronizer.updateTransparentAddressTransactionsFinds all transactions associated with the given transparent address.SDKSynchronizer.fetchUTXOsBy(address)Checks to find any UTXOs associated with the given transparent address. This check will cover the block range starting at the exposure height for that address, if known, or otherwise at the birthday height of the specified account.
- [2.3.6 change] Transparent funds are now reported after
UpdateChainTipActionis processed. Attempt to shield before this action has been failing otherwise. Update: the solution handled only cold start of a client, now it resets the logic with each stop() call of the SDK. - Updated to zcash_client_sqlite-0.18.9 to fix problems in transparent UTXO selection for shielding, including incorrect handling of outputs received at ephemeral addresses and selection of dust transparent outputs for shielding.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3107500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3127500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3640000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3670000.json
- New public API
func debugDatabase(sql: String) -> Stringfor querying the database from the client. Usa cautiously, ideally for debugging purposes only. A However note, the connection to the database is created in a read-only mode.
- Updated FFI 0.18.4 with fixes for the transaction states alongside changes in the enhancement logic for handling not found transactions.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3095000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3105000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3620000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3630000.json
- Transparent funds are now reported after
UpdateChainTipActionis processed. Attempt to shield before this action has been failing otherwise.
- FFI bumped to 0.18.3 with sqp fixes for balances.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3090000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3092500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3610000.json
- Zero confirmation shielding error. With mempool detection a new scenario appeared - clients could make an attempt to shield while the transparents funds haven't been confirmed (it's associated receiving transaction). [2nd fix for this issue alongside 2.3.4]
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3082500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3087500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3600000.json
- Zero confirmation shielding error. With mempool detection a new scenario appeared - clients could make an attempt to shield while the transparents funds haven't been confirmed (it's associated receiving transaction).
- Mempool detection support: see
CompactBlockProcessor.{watchMempool,consumeMempoolStream,resolveMempools}.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3052500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3080000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3570000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3590000.json
- This release fixes a potential false-positive in the
expired_unminedcolumn of thev_transactionsview.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3040000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3050000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3560000.json
SDKSynchronizer.httpRequestOverTor(for request: URLRequest, retryLimit: UInt8)New public API for http requests done via Tor.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3020000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3037500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3530000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3550000.json
latencyThresholdMillisparameter was removed fromSynchronizer.evaluateBestOf()method. The algorithm of servers evaluation was changed to always requirekServersto be returned.
Initializer.init(..., isTorEnabled: Bool, isExchangeRateEnabled: Bool)The initializer has been updated to include flags that control Tor setup.
func tor(enabled: Bool)A function that allows clients to configure Tor usage for lwd and http calls.func exchangeRateOverTor(enabled: Bool)A function that allows clients to configure Tor usage for exchange rate.func isTorSuccessfullyInitialized() async -> Bool?A function that returns the result of the TorClient initialization. A nil value indicates that initialization has not been initiated. True/false represents success or failure, respectively.ZcashTransaction.Overview statethat holds information whether the transaction has been confirmed or expired or is still pending.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2962500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/3017500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3440000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3520000.json
- FFI 0.17.0 introduces retry logic for Tor, significantly improving the reliability of currency conversion fetches.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2925000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2960000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3400000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3430000.json
- BlockEnhancer has got stuck in a while loop due to a missing break (retry = false)
SDKSynchronizer.getCustomUnifiedAddress: Obtain a newly-generated Unified Address with the specified receiver types.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2907500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2922500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3380000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3390000.json
- An occasional error occurred after the wipe function was called due to a missing termination of the timer. The next trigger caused the compact block processor to run again, but without any database in place, resulting in a “no such table: accounts” error.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2902500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2905000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3370000.json
- The base sapling params download URL has been changed to
https://download.z.cash/downloads/
SDKSynchronizer.estimateBirthdayHeight(for date: Date): Get an estimated height for a given date, typically used for estimating birthday.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2877500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2900000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3330000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3360000.json
transparent_gap_limit_handlingmigration, whereby wallets having received transparent outputs at child indices below the index of the default address could cause the migration to fail.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2870000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2875000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3320000.json
- Adopted
zcashlc_fix_witnessesfor the note commitment tree fix. - Transparent gap limit handling. SDK can find all transparent funds and shield them. This has been tested to successfully recover Ledger funds.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2842500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2867500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3280000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3310000.json
SDKSynchronizer.redactPCZTForSigner: Decrease the size of a PCZT for sending to a signer.SDKSynchronizer.PCZTRequiresSaplingProofs: Check whether the Sapling parameters are required for a given PCZT.
- Methods returning an array of
ZcashTransaction.Overviewtry to evaluate transaction's missing blockTime. This typically applies to an expired transaction.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2782500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2840000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3180000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3270000.json
SDKSynchronizer.listAccountsReturns a list of the accounts in the wallet.SDKSynchronizer.importAccountImports a new account for unified full viewing key.SDKSynchronizer.createPCZTFromProposalCreates a partially-created (unsigned without proofs) transaction from the given proposal.SDKSynchronizer.addProofsToPCZTAdds proofs to the given PCZTSDKSynchronizer.createTransactionFromPCZTTakes a PCZT that has been separately proven and signed, finalizes it, and stores it in the wallet. Internally, this logic also submits and checks the newly stored and encoded transaction.
zcashlc_propose_transfer,zcashlc_propose_transfer_from_uriandzcashlc_propose_shieldingno longer accpt ause_zip317_feesparameter; ZIP 317 standard fees are now always used and are not configurable.- The SDK no longer assumes a default account. All business logic with instances of Zip32AccountIndex() has been refactored.
SDKSynchronizer.getAccountBalance -> AccountBalance?intoSDKSynchronizer.getAccountsBalances -> [AccountUUID: AccountBalance]
SDKSynchronizer.sendToAddress, deprecated in 2.1SDKSynchronizer.shieldFunds, deprecated in 2.1
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2675000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2780000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3010000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3170000.json
DerivationTool.deriveArbitraryWalletKeyDerivationTool.deriveArbitraryAccountKeyDerivationTool.deriveUnifiedAddressFrom(ufvk)
- This release fixes a bug in wallet reorg handling that could result in a crash under certain circumstances.
- This release fixes a bug in scan progress calculation that could result in occasionally reporting scan progress values greater than 100%.
- This release fixes a potential source of corruption in wallet note commitment trees related to incorrect handling of chain reorgs. It includes a database migration that will repair the corrupted database state of any wallet affected by this corner case.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2650000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2672500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2800000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/3000000.json
- SQLight's
Expressionis no longer a unique identifier, namespace needed to be added as a prefix to it. Buildability solved withSQLight.Expressioninstead.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2637500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2647500.json
-
Synchronizer's
evaluateBestOf(endpoints: [], ...) async -> [LightWalletEndpoint]method takes a list of endpoints and evaluates top k best performant servers. -
TransactionEntityextended to accessis_shieldingfrom the DB and provides the value to the clients.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2620000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2635000.json
- This release fixes an error in database migration logic that could cause problems when upgrading certain wallets from versions in the 2.1.x range.
Synchronizer.exchangeRateUSDStream: AnyPublisher<FiatCurrencyResult?, Never>, which returns the currently-cached USD/ZEC exchange rate, ornilif it has not yet been fetched.Synchronizer.refreshExchangeRateUSD(), which refreshes the rate returned bySynchronizer.exchangeRateUSDStream. Prices are queried over Tor (to hide the wallet's IP address).
- The transaction history is now processed using
transaction data requests, which are fetched every 1,000 blocks during longer syncs or with each sync loop when a new block is mined.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2562500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2617500.json
The CompactBlockProcessor's state machine got stuck in some cases at the updateChainTip action.
The Compact block processor's state machine has been extended to check whether there are any unmined and unexpired transactions, and it attempts to resubmit such transactions every 5 minutes.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2542500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2560000.json
- Further changes for compatibility with Xcode 15.3 and above.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2532500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2540000.json
- Synchronizer's'
prepare()method passes even if server is down and not providing chan tip.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2522500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2530000.json
- New API
getMemos(for rawID: Data) -> [Memos]to load memos for a certain transaction (ZcashTransaction.Overview) defined by its rawID.
- Swiftlint issues have been addressed.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2475000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2520000.json
minimumShieldingConfirmationsset to 1 instead of 10. This should fasten the time it takes to swap transparent funds to shielded ones.
- The backend method proposeShielding checks the pointer for a null value before attempting to construct the Data with it. Without this check, proposeShielding would crash when there were either zero funds to shield or when the amount was less than the threshold defined by the client.
- Updated to
zcash-light-client-ffiversion 0.8.0. This includes a migration to ensure that the default Unified Address for existing wallets contains an Orchard receiver. - This release includes a workaround for build and deployment issues related to a bug in XCode 15.3.
- The database locking mechanism has been changed to use async/await concurrency approach - the DBActor.
- Call of wipe() resets local (in memory) values.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2450000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2472500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2780000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2790000.json
- Orchard subtree roots are now fetched alongside Sapling subtree roots.
- Bug in note selection when sending to a transparent recipient.
- Bug in an SQL query that prevented shielding of transparent funds.
New API implemented that allows clients to use a ZIP-321 Payment URI to create transaction.
func fulfillPaymentURI(
_ uri: String,
spendingKey: UnifiedSpendingKey
) async throws -> ZcashTransaction.Overview
Possible errors:
ZcashError.rustProposeTransferFromURI- Other errors that
sentToAddresscan throw
SDKSynchronizer.latestUTXOs
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2430000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2447500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2750000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2770000.json
- Migrated to
zcash-light-client-ffi 0.6.0.
- The SDK now generates transactions using ZIP 317 fees,
instead of a fixed fee of 10,000 Zatoshi. Use
Proposal.totalFeeRequiredto check the total fee for a transfer before creating it.
New Synchronizer APIs that enable constructing a proposal for transferring or
shielding funds, and then creating transactions from a proposal. The intermediate
proposal can be used to determine the required fee, before committing to producing
transactions.
The old Synchronizer.sendToAddress and Synchronizer.shieldFunds APIs have been
deprecated, and will be removed in 2.1.0 (which will create multiple transactions
at once for some recipients).
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2402500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2427500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2690000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2740000.json
New API implemented that allows clients to change the mainnet endpoint. Use func switchTo(endpoint: LightWalletEndpoint) async throws.
Possible errors:
ZcashError.synchronizerServerSwitchwill perform a check to ensure that it's possible to communicate with the specified lightwalletd server, which may result in an an error. If this check fails, the user should be prompted to check the address, port and verify that theaddress:portformat is respected.- Switching endpoints causes a call to
synchronizer.Start(), which may throw aZcashError.
SynchronizerState cleaned up and changed to provide only AccountBalance. This struct holds saplingBalance: PoolBalance which represents shielded balance for both total and spendable. Also holds unshielded: Zatoshi which represents transparent balance.
WalletBalancehas been removed from the SDK, replaced withAccountBalance.getTransparentBalance(accountIndex: Int), usegetAccountBalance(accountIndex: Int = 0)insteadgetShieldedBalance(accountIndex: Int), usegetAccountBalance(accountIndex: Int = 0)insteadgetShieldedVerifiedBalance(accountIndex: Int), usegetAccountBalance(accountIndex: Int = 0)instead
shieldedBalance: WalletBalance has been replaced with accountBalances: AccountBalance. AccountBalance provides the same values as shieldedBalance but adds up a pending changes. Under the hood this calls rust's getWalletSummary which improved also the syncing initial values of % and balances.
New API implemented that allows clients to change the mainnet endpoint. Use func switchTo(endpoint: LightWalletEndpoint) async throws.
Possible errors:
ZcashError.synchronizerServerSwitch: endpoint fails, check the address, port and format address:port,- Some
ZcashErrorrelated tosynchronizer.Start(): the switch callsstart()at the end and that is the only throwing function except the validation.
Adopt zcash-light-client-ffi 0.5.1. This fixes a serialization problem
broke shielding.
Model.ScanSummaryModel.WalletSummary.{PoolBalance, AccountBalance, WalletSummary}
- The
ZcashErrortype has changed.- Added variant
rustGetWalletSummary - Removed variants:
rustGetVerifiedBalance(expectrustGetWalletSummaryinstead)rustGetScanProgress(expectrustGetWalletSummaryinstead)rustGetBalance(expectrustGetWalletSummaryinstead)
- Added variant
- The performance of
getWalletSummaryandscanBlockshave been improved.
We focused on performance of the synchronization and found out a root cause in progress reporting. Simple change reduced the synchronization significantly by reporting less frequently. This affect the UX a bit because the % of the sync is updated only every 500 scanned blocks instead of every 100. Proper solution is going to be handled in #1353.
Async block stream grpc calls sometimes fail with unknown error 14, most of the times represented as Transport became inactive or NIOHTTP2.StreamClosed. Unless the service is truly down, these errors are usually false positive ones. The SDK was able to recover from this error with the next sync triggered but it takes 10-30s to happen. This delay is unnecessary so we made 2 changes. When these errors are caught the next sync is triggered immediately (at most 3 times) + the error state is not passed to the clients.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2332500.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2382500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2640000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2690000.json
Shielded verified and total balances are logged for every sync of SDKMetrics.
Mainnet Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2330000.json
Testnet Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2630000.json
The SDKMetrics logs data using os_log. The public API enableMetrics() and disableMetrics() no longer exist. All metrics are automatically logged for every sync run. Extraction of the metrics is up to the client/dev - done by using OSLogStore.
The sync process is measured and detailed metrics are logged for every sync run. The data are logged using os_log so any client can export it. Verbose logs are under sdkLogs_default category, default level. Sync specific logs use error level.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2270000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2327500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2560000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2620000.json
The enhancing of the transactions now processes all the blocks suggested by scan ranges. The issue was that when new scan ranges were suggested the value that drives the enhancing range computation wasn't reset, so when higher ranges were processed, the lower ranges were skipped. This fix ensures all transaction data are properly set, as well as fixing eventStream .foundTransaction reporting.
This is a fix in the rust layer. The amount sent in the transaction was incorrectly reported even though the actual amount was sent properly. Now clients should see the amount they expect to see in the UI.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2250000.json
...
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2267500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2540000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2550000.json
The SDK has some simple logic of retrying when some erros occurs. There were 5 attempts of retry until the SDK stopped the synchronization process completely. (The timer is not restarted after those). That approach led to some annoying UX issue of manually starting the SDKSynchronizer from the client, shifting the responsibility to the devs/clients. This has been changed, the SDK never stops the timer unless synchronizer.stop() is called.
The .foundTransactions observed on eventStream worked well during the sync until the rewind was called. That API missed reset of the ActionContext in the CompactBlockProcesser and that led to never observing the same transactions again. This ticket fixed the problem, reset is called in the rewind and new sync passes the transactions to the stream.
The 1000 Zatoshi fee proposed in ZIP-313 is deprecated now and so the minimum is 10k Zatoshi, defined in ZIP-317.
The SDK has been cleaned up from deprecated fee but note, real fee is handled in a rust layer.
The public API NetworkConstants.defaultFee(for: BlockHeight) has been refactored to NetworkConstants.defaultFee().
This release updates ZcashLightClientKit to implement the Spend-Before-Sync fast
synchronization algorithm.
Updated dependencies:
zcash-light-client-ffi 0.4.0
CompactBlockProcessor now processes compact blocks from the lightwalletd server with Spend-before-Sync algorithm (i.e. non-linear order). This feature shortens the time after which a wallet's spendable balance can be used.
The levels for logging have been updated according to Log Levels in Swift. (https://www.swift.org/server/guides/libraries/log-levels.html).
There's one naming difference, instead of notice we use event. So the order is debug, info, event, warning, error.
Initializer has now a new parameter called generalStorageURL. This URL is the location of the directory
where the SDK can store any information it needs. A directory doesn't have to exist. But the SDK must
be able to write to this location after it creates this directory. It is suggested that this directory is
a subdirectory of the Documents directory. If this information is stored in Documents then the
system itself won't remove these data.
Synchronizer's prepare(...) public API changed: viewingKeys: [UnifiedFullViewingKey] has been removed and for walletMode: WalletInitMode
added. WalletInitMode is an enum with 3 cases: .newWallet, .restoreWallet and
.existingWallet. Use .newWallet when preparing the SDKSynchronizer for a
brand new wallet that has been generated. Use .restoreWallet when wallet is
about to be restored from a seed and .existingWallet for all other scenarios.
latestScannedHeight and latestScannedTime have been removed from SynchronizerState. With multiple algorithms
of syncing the amount of data provided is reduced so it's consistent. Spend before Sync is done in non-linear order
so both Height and Time don't make sense anymore.
latestScannedHeightandlatestScannedTimehave been removed from the SynchronizerState.- The concept of pending transaction has changed:
func allPendingTransactions()is no longer available. Usepublic func allTransactions()instead.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2057500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2060000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2062500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2065000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2067500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2070000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2072500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2075000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2077500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2080000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2082500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2085000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2087500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2090000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2320000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2330000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2340000.json
- [#1037] Empty string memo throws
ZcashError.memoTextInputEndsWithNullBytes - [#1016] Rebuild download stream periodically while downloading This fixes a memory consumption issue coming from GRPC-Swift.
- [#1019] Memo has trailing garbled text
Initializer has now a new parameter called generalStorageURL. This URL is the location of the directory
where the SDK can store any information it needs. A directory doesn't have to exist. But the SDK must
be able to write to this location after it creates this directory. It is suggested that this directory is
a subdirectory of the Documents directory. If this information is stored in Documents then the
system itself won't remove these data.
Changes the way unpadded bytes are turned into a UTF-8 Swift String without using cString assuming APIs that would overflow memory and add garbled trailing bytes.
- [#781] This fixes test
testMaxAmountMinusOneSendby creating two separate tests:- testMaxAmountMinusOneSendFails
- testMaxAmountSend
Also includes new functionality that tracks sent transactions so that users can be notified specifically when they are mined and uses "idea B" of issue #1033.
closes #1033 closes #781
-
WalletTransactionEncodernow uses aLightWalletServiceto submit the encoded transactions. -
Functions returning or receiving
ZcashTransaction.SentorZcashTransaction.Receivednow will be simplified by returningZcashTransaction.Overviewor be replaced by their Overview counterparts
-
ZcashTransaction.Overviewcan be checked for "pending-ness" by calling.isPending(latestHeight:)latest height must be provided so that minedHeight can be compared with the lastest and thedefaultStaleToleranceconstant. -
TransactionRecipientis now a public type. -
ZcashTransaction.Outputcan be queried to know the inner details of aZcashTransaction.Overview. It will return an array with all the tracked outputs for that transaction so that they can be shown to users who request them -
ZcashTransaction.Overview.Stateis introduced to representconfirmed,pendingorexpiredstates. This State is relative to the current height of the chain that is passed to the functiongetState(for currentHeight: BlockHeight).
State should be a transient value and it's not adviced to store it unless
transactions have stale values such as confirmed or expired.
-
public func getTransactionOutputs(transaction) async -> [ZcashTransaction.Output]is added to get the outputs related to the given transaction. You can use this to know every detail of the transaction Overview and show it in a more fine-grained UI. -
TransactionRecipientis returned ongetRecipients(for:).
AccountEntitycalledAccountis nowDbAccount
ZcashTransaction.ReceivedandZcashTransaction.Sentare removed and replaced byOverviewsince the notion of Sent and received is not entirely applicable to Zcash transactions where value can be sent and received at the same time. Transactions with negative value will be considered as "sent" but that won't be enforced with a type anymorecancelSpend(): support for cancel spend was removed since its completion was not guaranteedPendingTransactionEntityand all of its related components. Pending items are still tracked and visualized by the existing APIs but they are retrieved from theTransactionRepositoryinstead by returningZcashTransaction.Overviewinstead.pendingDbURLis removed from every place it was required. Its deletion is responsibility of wallet developers.ClearedTransactionsare now justtransactions.MigrationManageris deleted. Now all migrations are in charge of the rust welding layer.PendingTransactionDao.swiftis removed.PendingTransactionRepositoryprotocol is removed.TransactionManagerErrorPersistentTransactionManagerOutboundTransactionManageris deleted and replaced byTransactionEncoderwhich now incorporatessubmit(encoded:)functionalityDatabaseMigrationManageris remove since it's no longer needed all Database migrations shall be hanlded by the rust layer.ZcashSDK.defaultPendingDbNamealong with any sibling membersTransactionRepositoryfindMemos(for receivedTransaction: ZcashTransaction.Received)findMemos(for sentTransaction: ZcashTransaction.Sent)
Now the SDK allows for more fine-tuning of its logging behavior. The LoggingPolicy enum
provides for three options: .default(OSLogger.LogLevel) wherein the SDK will use its own logger, with the option
to customize the log level by passing an OSLogger.LogLevel to the enum case.
custom allows one to pass a custom Logger implementation for completely customized logging.
Lastly, noLogging disables logging entirely.
To utilize this new configuration option, pass a loggingPolicy into the Initializer. If unspecified, the SDK
will utilize an internal Logger implementation with an OSLogger.LogLevel of .debug
The SDK now parallelizes the download and scanning of blocks. If the network connection of the client device is fast enough then the scanning process doesn't have to wait for blocks to be downloaded. This makes the whole sync process faster.
Synchronizer.stop() method is not async anymore.
Now the SDK uses only one error type - ZcashError. Each method that throws now throws only ZcashError.
Each publisher (or stream) that can emit error now emitts only ZcashError.
Each symbol in ZcashError enum represents one error. Each error is used only in one place
inside the SDK. Each error has assigned unique error code (ZcashErrorCode) which can be used in logs.
Mainnet:
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2032500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2035000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2037500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2040000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2042500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2045000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2047500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2050000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2052500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2055000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2290000.json
This change drops the file-system cache whenever an error occurs when storing blocks
so that there is not a discontinuity in the cached block range that could cause a
discontinuity error on libzcashlc when calling scan_blocks. This will have a setback of
at most 100 blocks that would have to be re-downloaded when resuming sync.
This change switches to a new (future) version of the rust crates that will get rid of the sent and received transactions Views in favor of a v_transaction view that will do better accounting of outgoing and incoming funds. Additionally it will support an outputs view for seeing the inner details of transactions enabling the SDKs tell the users the precise movement of value that a tx causes in its multiple possible ways according to the protocol.
the v_tx_outputs view is not yet implemented.
Sent and Received transaction sub-types are kept for compatibility purposes but they are generated from Overviews instead of queried from a specific view.
In the transaction Overview the value represents the whole value transfer for the transaction from the point of view of a given account including fees. This means that the value for a single transaction Overview struct represents the addition or subtraction of ZEC value to the account's balance.
Future updates will give clients the possibility to drill into the inner workings of those value changes in a per-output basis for each transaction.
Also, the field pending_unmined field was added to v_transactions so that wallets can query DataDb for pending but yet unmined txs
This will prepare the field for removing the notion of a "PendingDb" and its nuances.
This is mostly internal change. But it also touches the public API.
KeyDeriving protocol is changed. And therefore DerivationTool is changed. deriveUnifiedSpendingKey(seed:accountIndex:) and
deriveUnifiedFullViewingKey(from:) methods are now async. DerivationTool offers alternatives for these methods. Alternatives are using either
closures or Combine.
This is mostly internal change. But it also touches the public API.
These methods previously returned Optional and now those methods return non-optional value and those methods can an throw error:
getSaplingAddress(accountIndex: Int) async throws -> SaplingAddressfunc getUnifiedAddress(accountIndex: Int) async throws -> UnifiedAddressfunc getTransparentAddress(accountIndex: Int) async throws -> TransparentAddress
These methods are now async:
func getShieldedBalance(accountIndex: Int) async throws -> Zatoshifunc getShieldedVerifiedBalance(accountIndex: Int) async throws -> Zatoshi
Initializer no longer have methods to get balance. Use SDKSynchronizer (or it's alternative APIs) to get balance.
Mainnet:
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2012500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2015000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2017500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2020000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2022500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2025000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2027500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2030000.json
Testnet:
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2260000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2270000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2280000.json
Synchronizer:
func getShieldedBalance(accountIndex: Int) -> Int64func getShieldedVerifiedBalance(accountIndex: Int) -> Int64use the API retuning Zatoshi instead. If neededzatoshi.amountwould return an Int64 value.
Initializer:
func getBalance(account index: Int = 0) -> Int64use the API retuning Zatoshi instead. If neededzatoshi.amountwould return an Int64 value.func getVerifiedBalance(account index: Int = 0) -> Int64use the API retuning Zatoshi instead. If neededzatoshi.amountwould return an Int64 value.
ZcashSDK.NetworkConstants:
func defaultFee(for height: BlockHeight) -> Int64use the API retuning Zatoshi instead. If neededzatoshi.amountwould return an Int64 value.
ZcashRustBackendWelding:
func getReceivedMemoAsUTF8(dbData:idNote:networkType:) -> String?UsegetReceivedMemo(dbData:idNote:networkType)insteadfunc getSentMemoAsUTF8(dbData:idNote:networkType:) -> String?UsegetSentMemo(dbData:idNote:networkType)instead
Added ZcashSynchronizerAlias enum which is used to identify an instance of the SDKSynchronizer. All the paths
to all resources (databases, filesystem block storage...) are updated automatically inside the SDK according to the
alias. So it's safe to create multiple instances of the SDKSynchronizer. Each instance must have unique Alias. If
the default alias is used then the SDK works the same as before this change was introduced.
The SDK now also checks which aliases are used and it prevents situations when two instances of the SDKSynchronizer
has the same alias. Methods prepare() and wipe() do checks for used alias. And those methods fail
with InitializerError.aliasAlreadyInUse if the alias is already used.
If the alias check fails in the prepare() method then the status of the SDKSynchronizer isn't switched from unprepared.
These methods newly throw SynchronizerError.notPrepared error when the status is unprepared:
sendToAddress(spendingKey:zatoshi:toAddress:memo:) async throws -> PendingTransactionEntityshieldFundsspendingKey:memo:shieldingThreshold:) async throws -> PendingTransactionEntitylatestUTXOs(address:) async throws -> [UnspentTransactionOutputEntity]refreshUTXOs(address:from:) async throws -> RefreshedUTXOsrewind(policy:) -> AnyPublisher<Void, Error>
Provided file URLs to resources (databases, filesystem block storage...) are now parsed inside the SDK and updated
according to the alias. If some error during this happens then SDKSynchronzer.prepare() method throws
InitializerError.cantUpdateURLWithAlias error.
There are two new protocols (ClosureSynchronizer and CombineSynchronizer). And there are two new
objects which conform to respective protocols (ClosureSDKSynchronizer and CombineSDKSynchronizer). These
new objects offer alternative API for the SDKSynchronizer. Now the client app can choose which technology
it wants to use to communicate with Zcash SDK and it isn't forced to use async.
These methods in the SDKSynchronizer are now async:
prepare(with:viewingKeys:walletBirthday:)start(retry:)stop()cancelSpend(transaction:)- All the variants of the
getMemos(for:)method. - All the variants fo the
getRecipients(for:)method. allConfirmedTransactions(from:limit:)
These properties in the SDKSynchronizer are now async:
pendingTransactionsclearedTransactionssentTransactionsreceivedTransactions
Non async SDKsynchronizer.latestHeight(result:) were moved to ClosureSDKSynchronizer.
The SDKSynchronizer no longer uses NotificationCenter to send notifications.
Notifications are replaced with Combine publishers. Check the migrating document and
documentation in the code to get more information.
viewingKeysandwalletBirthdayare removed fromInitializerconstuctor. These parameters moved toSDKSynchronizer.preparefunction.- Constructor of the
SDKSynchronizerno longer throws exception. - Any value emitted from
lastStatestream beforeSDKSynchronizer.prepareis called haslatestScannedHeightset to 0. Initializer.initializefunction isn't public anymore. To initialize SDK callSDKSynchronizer.prepareinstead.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2002500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2005000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2007500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2010000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2250000.json
No public API changes.
Adds func shouldClearBlockCacheAndUpdateInternalState() -> BlockHeight? to SyncRanges
so that the compact block processor can advert internal states that are not consistent and
recover from such state.
For concrete examples check out the tests in:
Tests/NetworkTests/CompactBlockProcessorTests.swift
Removed linter binary from repository
SDKSynchronizer.rewind(policy:) function can be now called anytime. It returns AnyPublisher which
completes or fails when the rewind is done. For more details read the documentation for this method
in the code.
SDKSynchronizer.wipe() function can be now called anytime. It returns AnyPublisher which
completes or fails when the wipe is done. For more details read the documentation for this method
in the code.
synchronizerStopped notification is now sent after the sync process stops. It's
not sent right when stop() method is called.
This is only an internal change and doesn't change the behavior of the SDK. Initializer's
constructor has a new parameter saplingParamsSourceURL. Use SaplingParamsSourceURL.default
value for this parameter.
This is mostly an internal change. A consequence of this change is that all the notifications
delivered via NotificationCenter with the prefix blockProcessor are now gone. If affected
notifications were used in your code use notifications with the prefix synchronizer now.
These notifications are defined in SDKSynchronizer.swift.
We remove these documents since they are outdated and we rely on the docs in the code itself.
This is mostly internal change. LightWalletService is no longer public. If it
is used in your code replace it by using SDKSynchronizer API.
This updates to GRPC-Swift 1.14.0.
Mainnet:
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1965000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1967500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1970000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1972500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1975000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1977500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1980000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1982500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1985000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1987500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1990000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1992500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1995000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1997500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/2000000.json
Testnet:
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2210000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2220000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2230000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2240000.json
File system based block cache. Compact blocks will now be stored
on the file system. Caller must provide a URL pointing to the
filesystem root directory where the fsBlock cache is. this directory
is expected to contain a /blocks sub-directory with the blocks stored
in the convened filename format {height}-{hash}-compactblock. This directory
must be granted both read and write permissions.
the file system cache will have a "bookkeeping" database that the rust welding layer will use to know the state of the cache and locate the cached compact blocks. This directory can be deleted provided that the Compactblock processor or Synchronizer are not running. Upon deletion caller is responsible for initializing these objects for the cache to be created.
Implementation notes: Users of the SDK will know the path they will provide but must assume no behavior whatsoever or rely on the cached information in any way, since it is an internal state of the SDK. Maintainers might provide no support for problems related to speculative use of the file system cache. If you consider your application needs any other information than the one available through public APIs, please file the corresponding feature request.
Synchronizer.shieldFunds(spendingKey:memo:shieldingThreshold)shieldingThreshold was added allowing wallets to manage their own shielding policies.
InitializerError.cacheDbMigrationFailed
CacheDb references that were deprecated instead of deleted are pointing out that they should be useful for you to migrate from using cacheDb.
-
ResourceProvider.cacheDbURLdeprecated but left for one release cycle for clients to move away from cacheDb. -
NetworkConstants.defaultCacheDbNamedeprecated but left for one release cycle for clients to move away from cacheDb.
Closes https://github.com/zcash/ZcashLightClientKit/issues/443
Closes https://github.com/zcash/ZcashLightClientKit/issues/754
This implements getRecipients() function which retrieves the possible
recipients from a sent transaction. These can either be addresses or
internal accounts depending on the transaction being a shielding tx
or a regular outgoing transaction.
Other changes:
- Fix version of zcash-light-client-ffi to 0.1.1
- Enhance error reporting on a test make Mock comply with protocol
It wouldn't have been possible to release an SDK without you, pal.
We are moving away from Cocoapods since our main dependencies, SwiftGRPC and SWIFT-NIO are. We don't have much of a choice.
We've been communicating this for a long time. Although, if you really need Cocoapods, please let us know by opening an issue in our repo and we'll talk about it.
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1937500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1940000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1942500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1945000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1947500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1950000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1952500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1955000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1957500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1960000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1962500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2180000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2190000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2200000.json
This fixes an issue where the default reorg was 20 blocks rewind instead of 10. The reorg count was incremented before calling the rewind height computing function.
These data types are gone: Transaction, TransactionEntity, ConfirmedTransaction,
ConfirmedTransactionEntity. And these data types were added: ZcashTransaction.Overview,
ZcashTransaction.Received, ZcashTransaction.Sent.
New data structures are very similar to the old ones. Although there many breaking changes.
The APIs of the SDKSynchronizer remain unchanged in their behavior. They return different
data types. When adopting this change, you should check which data types are used by methods
of the SDKSynchronizer in your code and change them accordingly.
New transaction structures no longer have a memo property. This responds to the fact that
Zcash transactions can have either none or multiple memos. To get memos for the transaction
the SDKSynchronizer has now new methods to fetch those:
func getMemos(for transaction: ZcashTransaction.Overview) throws -> [Memo],func getMemos(for receivedTransaction: ZcashTransaction.Received) throws -> [Memo]func getMemos(for sentTransaction: ZcashTransaction.Sent) throws -> [Memo]
The CompactBlockProcessor is no longer a public class/API. Any direct access will
end up as a compiler error. Recommended way how to handle things is via SDKSynchronizer
from now on. The Demo app has been updated accordingly as well.
In previous versions, the SDK first downloaded all the blocks and then it scanned all the blocks. This approach requires a lot of disk space. The SDK now behaves differently. It downloads a batch of blocks (100 by default), scans those, and removes those blocks from the disk. And repeats this until all the blocks are processed.
SyncStatus was changed. .downloading, .validating, and .scanning symbols
were removed. And the .scanning symbol was added. The removed phases of the sync
process are now reported as one phase.
Notifications were also changed similarly. These notifications were
removed: SDKSynchronizerDownloading, SDKSyncronizerValidating, and SDKSyncronizerScanning.
And the SDKSynchronizerSyncing notification was added. The added notification replaces
the removed notifications.
This change presents 2 building blocks for the future automated tests, consisting of a new SDKMetrics interface to control flow of the data in the SDK and new performance (unit) test measuring synchronization of 100 mainnet blocks.
Updated checkpoints to the ones present in 0.18.0-beta
Update checkpoints
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1912500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1915000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1917500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1920000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1922500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1925000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1927500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1930000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1932500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1935000.json
Tesnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2150000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2160000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2170000.json
updates libzcashlc to 0.1.1 to fix an error where getting a
transparent balance on an empty database would fail.
This change adds an internal storage test on UserDefaults that tells the SDK where sync was left off when cancelled whatever the reason for it to restart on a later attempt. This fixes some issues around syncing long block ranges in several attempts not enhancing the right transactions because the enhancing phase would only consider the last range scanned. This only fixes the situation where rewinding the SDK would cause the whole database to be cleared instead and syncing to be restarted from scratch (issue [#660]).
- commit
3b7202cFixtestShieldFunds()dataset loading issue. (#659)
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1897500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1900000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1902500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1905000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1907500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1910000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2140000.json
New Checkpoint for testShieldFunds()
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1631000.json
- [#660] Fix the situation when any rewind causes full rescan
- [#651] Change the rewind behavior. Now if the rewind is used while the sync process is in progress then an exception is thrown.
- [#616] Download Stream generates too many updates on the main thread WARNING: Notifications from SDK are no longer delivered on main thread.
- [#585] Fix RewindRescanTests (#656)
- Cleanup warnings (#655)
- [#637] Make sapling parameter download part of processing blocks (#650)
- [#631] Verify SHA1 correctness of Sapling files after downloading (#643)
- Add benchmarking info to SyncBlocksViewController (#649)
- [#639] Provide an API to estimate TextMemo length limit correctly (#640)
- [#597] Bump up SQLite Swift to 0.14.1 (#638)
- [#488] Delete cache db when sync ends
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1882500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1885000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1887500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1890000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1892500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1895000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2120000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2130000.json
- [#321] Validate UA
- [#384] Adopt Type Safe Memos in the FFI and SDK
- [#355] Update lib.rs to lastest librustzcash master
- [#373] Demo App shows ZEC balances in scientific notation
- [#380] One of the initAccountsTable() is dead code (except for tests)
- [#374] XCTest don't load Resources from the module's bundle
- [#375] User can't go twice in a row to SendFundsViewController
- [#490] Rebase long dated PRs on top of the feature branches
- [#510] Change references of Shielded address to Sapling Address
- [#511] Derivation functions should only return a single resul
- [#512] Remove derivation of t-address from pubkey
- [#520] Use UA Test Vector for Recipient Test
- [#544] Change Demo App to use USK and new rolling addresses
- [#602] Improve error logging for InitializerError and RustWeldingError
- [#579] Fix database lock
- [#595] Update Travis to use Xcode 14
- [#592] Fix various tests and deleted some that are not useful anymore
- [#523] Make a CompactBlockProcessor an Actor
- [#593] Fix testSmallDownloadAsync test
- [#577] Fix: reduce batch size when reaching increased load part of the chain
- [#575] make Memo and MemoBytes parameters nullable so they can be omitted when sending to transparent receivers.
- commit
1979e41Fix pre populated Db to have transactions from darksidewalletd seed - commit
a483537Ensure that the persisted test database has had migrations applied. - commit
1273d30Clarify & make regular how migrations are applied. - commit
78856c6Fix: successive launches of the application fail because the closed range of the migrations to apply would be invalid (lower range > that upper range) - commit
7847a71Fix incorrect encoding of optional strings in PendingTransaction. - commit
789cf01Add Fee field to Transaction, ConfirmedTransaction, ReceivedTransactions and Pen dingTransactions. Update Notes DAOs with new fields - commit
849083fFix UInt32 conversions to SQL in PendingTransactionDao - commit
fae15ceFix sent_notes.to_address column reference. - commit
23f1f5dMerge pull request #562 from zcash/fix_UnifiedTypecodesTests - commit
30a9c06Replacedb.runwithdb.executeto fix migration issues - commit
0fbf90dAdd migration to re-create pending_transactions table with nullable columns. - commit
36932a2Use PendingTransactionEntity.internalAccount for shielding. - commit
f5d7aa0Modify PendingTransactionEntity to be able to represent internal shielding tx. - [#561] Fix unified typecodes tests
- [#530] Implement ability to extract available typecodes from UA
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1872500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1875000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1877500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1880000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2110000.json
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1852500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1855000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1857500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1860000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1862500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1865000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1867500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1870000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2020000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2030000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2040000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2050000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2060000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2070000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2080000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2090000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2100000.json
- update to libzcashlc 0.1.0-beta.3. This fixes an issue spending change notes
- update to libzcashlc 0.1.0-beta.2
- [#602] Improve error logging for InitializerError and RustWeldingError
- [#579] Fix database lock
- [#592] Fix various tests and deleted some that are not useful anymore
- [#581] getTransparentBalanceForAccount error not handled
See MIGRATING.md
- [#597] SDK does not build with SQLite 0.14
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1832500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1835000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1837500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1840000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1842500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1845000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1847500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1850000.json
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1812500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1815000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1817500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1820000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1822500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1825000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1827500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1830000.json
-
[#532] [0.16.x-beta] Download does not stop correctly
Issue Reported:
When the synchronizer is stopped, the processor does not cancel the download correctly. Then when attempting to resume sync, the synchronizer is not on
.stoppedand can't be resumedthis doesn't appear to happen in
masterbranch that uses structured concurrency for operations.Fix:
This commit makes sure that the download streamer checks cancelation before processing any block, or getting called back to report progress
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1807500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1810000.json
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1787500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1790000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1792500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1795000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1797500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1800000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1802500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1805000.json
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1775000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1777500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1780000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1782500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1785000.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2000000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/2010000.json
- [#455] revert queue priority downgrade changes from [#435] (#456)
This reverts queue priority changes from commit
a5d0e447748257d2af5c9101391dd05a5ce929a2since we detected it might prevent downloads to be scheduled in a timely fashion
Mainnet
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1757500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1760000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1762500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1765000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1767500.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1770000.json
Sources/ZcashLightClientKit/Resources/checkpoints/mainnet/1772500.json
Testnet
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/1980000.json
Sources/ZcashLightClientKit/Resources/checkpoints/testnet/1990000.json
- There's a problem with 0.16.5-beta hash. Re-releasing
-
[#449] Use CompactBlock Streamer download instead of batch downloads (#451) This increases the speed of downloads significantly while reducing the memory footprint.
-
[#435] thread sanitizer issues (#448) Issues related to Thread Sanitizer warnings
-
Adds new Checkpoint for 1755000 on mainnet
- [#444] Syncing Restarts to zero when the wallet is wiped and synced from zero in one go. (#445)
- [#440] Split constants for Download Batches and Scanning Batches (#441)
This change was done to aleviate memory load when downloading large blocks.
Default download batch constant is deprecated in favor of
DefaultDownloadBatchandDefaultScanningBatch
- [#436] Add checkpoint with a lower interval on mainnet (#437) This adds checkpoint at a 2500 block interval to help reduce scan times on new wallets
-
[#418] "Swift.EncodingError.InvalidValue Encoding an Int64 is not supported" (#430) This fixes Cocoapods clients pointing to SQLite 0.12.2 instead of using 0.13 the former does not support custom encoding of Int64 and makes Zatoshi break
-
[#428] make some helpers publicly accessible (#429)
-
[#422] Make Zatoshi extensions of
NSDecimalNumberpublic (#423) -
[#419] Fix Unavailable Transport 14 when attempting to sync (#426) this changes timeout settings and Keepalive changes. Recommended settings for lightwalletd.com are 60000ms singleCallTimeout on
LightWalletEndpoint -
[#416] Update GRPC to 1.8.2 (#421)
This version changes the way wallet birthdays are handled. WalletBirthday
struct is not longer public and has been renamed to Checkpoint.
SynchronizerError has a default LocalizedError compliance to
help debug errors and display them to the user. This is a workaround
to get rid of cryptic errors that are being reported to maintainers and
are subject to change in future versions.
- [#392] Synchronizer error 8. when syncing. (#413)
- [#398] Make WalletBirthday an internal type (#414)
- [#411] add Fresh checkpoints for release 0.16.0-beta (#412)
- [#406] some BirthdayTests fail for MacOS target (#410)
- [#404] Configure GRPC KeepAlive according to docs (#409)
- [#432] create 0.15.1-beta with SQLite 0.13 this build is a hotfix for cocoapods. which has the wront SQLite dependency It moves it from 0.12.2 to 0.13
** IMPORTANT ** This version no longer supports iOS 12 We've made a decision to make iOS 13 the minimum deployment target in order to adopt and support Structured Concurrency and other important features of the Swift language like Combine.
-
[#363] bump iOS minimum deployment target to iOS 13.0 (#407)
-
[#381] Move Zatoshi and Amount Types to the SDK (#396) This deprecates many methods on
SDKSynchronizerusing Zatoshi for amounts instead ofInt64. This exposes number formatters that conveniently provide decimal conversion fromZatoshito "human-readable" ZEC decimal numbers. -
[#397] Checkpoint format that supports NU5 TreeStates (#399)
WalletBirthdaynow have bothsaplingTreeandorchardTreevalues. The latter being Optional for checkpoints prior to Orchard activation height. -
[#401] DecodingError when refreshing pending transactions (#402)
-
[#394] Update swift-grpc to 1.8.0 (#395)
- [#388] Integrate libzcashlc 0.0.3 to support v5 transaction parsing on NU5 activation
-
[#326] Load Checkpoint files from bundle. This is great news! now checkpoints are loaded from files on the bundle instead of hardcoding them on source files. This will make updates easier, less error prone, and mostly automatable.
-
PR #356 Adds a caveat to SPM / Xcode integration in Readme
-
[#367] Darksidewalletd for testing
shield_funds -
[#351] Write a Commit message Section for CONTRIBUTING.md
- [Enhancement] Fix: make BlockProgress
.nullProgressstatic property public for ECC Reference Wallet CombineSynchonizer
- [Enhancement] PR #338. Rust-less build. Check for new documentation on how to benefit from this huge change
- [Enhancement] Swift Package Manager Support!
- [Enhancement] Fresh checkpoints
- FIX fixes to Apple Silicon M1 builds
- Fix: add parameter to ensure 10 confs when shielding.
- [Fix] Issue #293 MaxAttemptsReached error surfaces when it's actually dismissable and the wallet is working fine
- [Enhancement] Add test to verify that a checksum invalid t-address fails to validate.
- [Enhancement] Network Agnostic build
- Fix: UNIQUE Constraint bug when coming from background. fixed and logged warning to keep investigating
- [New] latestScannedHeight added to SDKSynchronizer
- CompactBlockProcessor states don't propagate correctly
- target height reporting enhancements
- improve status publishing for SDKSynchronizer
- [FIX] missingStartHeight error when scanning from sapling activation
- Make sapling parameters default url public
- add output files to build phase to avoid CI failures
- fix lint warnings
- Tests
- [Fix] Issue #289 main thread lock when validating the server
- [Fix] info single call times out all the time
- make sure operations cancel in a timely manner
- FigureNextBatchOperation.swift tests
- make range function static
- getInfo service times out too soon
- FIX: processor stalls on reconnection
- Fix warnings
- Replace Status for SyncStatus
- fix tests
- Fix Demo App
- fetch operation does not cancel when the previous operations do
- Fix: operations start when they have been canceled already
- fix progress being > 1
- Synchronizing by phases, preview
- Add fetch UTXO operation to compact block processor
- CompactBlock batch download and stream download operation tests pass.
- [FIX] Fix build for Apple Silicon (M1) #285 by @ealymbaev
- [Enhancement] Rewind API has a
.quickoption
- [New] Shield Funds Feature
- [New] Get Transparent Balance for account
- [New] Z -> T Restore: transactions to transparent addresses are now restored when the user restores from seed or re-scans the wallet
- [New] [Preview] Unified Viewing Key Structure
- [New] Abstractions over Transparent Address and ShieldedAddress
- [FIX]
CompactBlockProcessorvalidates LightdInfo from Lightwalletd - [Enhancement] Add BlockTime to SDKSynchronizer updates
- [New] Db Migration for UVKs
- [FIX] Rewind API breaks on quick re-scan
- [Update] 37f2232: Update to gRPC-Swift 1.0.0
- Adds Mainnet and Testnet Checkpoints
- Adds Mainnet Checkpoints
- [critical] Fix #255 #261 outgoing no-change transactions not reported as mined
- [NEW] Rewind API. Allow Wallet developers to rewind synchronizer and (eventually) rescan
- [NEW] Rust Welding 0.0.6 - using rust crates 0.5 and Data Access API
- [NEW] updated Logger API to use StaticString on line and function as many logging libraries do
- [FIX] Mac OS BIG SUR build fixed
- New: added viewing key derivation to Derivation Tool
- Issue #252 - blockheight progress is latest height instead of upperbound of last scanned range
- added new checkpoints for mainnet
- Fix: memo string handling
- Fix: issue #240 reorg not catched because of ARC dealloc
- implement ZIP-313 reducing fees to 1000 zatoshi
- [IMPORTANT] Issue #237 Untie SDKSynchronizer from UIApplication Events
- Fix #236 fix CI problem
- Issue #176 operation gets cancelled when backgrounding
- Issue #136 on https://github.com/zcash/zcash-ios-wallet
- Issue #123 on https://github.com/zcash/zcash-ios-wallet
- PR from @ant013: Forcibly change the state to stopped when the handle cancels any task in OperationQueue
- Checkpoint for Mainnet
- Issue 208 - Improve API method to request transaction history
- Added Found transaction notification to SDK Synchronizer
- Add darksidewalletd tests for foundTransactions notifications
- [CRITICAL] Fix sqlite crate canopy issue. Add a new checkpoint to aid testing
- FIX - UNIQUE constraint violation when an operation failed
- #22 Sapling parameter downloader
- #201 Throw exception when seed can't be provided
- #204 Add DerivationTool to Initializer
- #205 Add IVK initialization capabilities to Initializer
- #206 [community request @esengulov] add extension function to identify inbound v. outbound txs on a client side
- #207 [community request @esengulov] Add extension function for timestamps on transactions
- FIX: transaction details listing duplicate transactions on certain transactions with several outputs and inputs
- added checkpoints
- updated to gRPC-Swift 1.0.0-alpha19
- readme warning on issues with rustc 1.46.0
- improvement on build system to help switch network environment faster
- added new checkpoints for testnet and mainnet
- Updated librustzcash to support Canopy on testnet
- Error handling improvements (breaks API)
- Fixes #158 #132 #134 #135 #133
- update Librustzcash to point to master repo!
- enhance pending transaction handling (#160)
- Added memo demo!
- automation!
- remove MnemonicKit dependency from tests
- Enable heartwood. (#138)
- Update LICENSE
- Switch to MnemonicSwift (#142)
- Issue 136 Null bytes in strings effectively truncate the string from … (#140)
- Fixes issue 136 - expiry height -1 on pending transactions (#139)
- Advanced Re Org tests + Balance tests (#137)
- CI doc mods (#116)
- Update issue templates
- Replace the threat model with the one on readthedocs (#131)
- Add bug report and feature request issue templates
- remove commit lock from podfile
- Canonical empty memo test (#112)
- Memo tests (#111)
- Decrypt transactions. Full wallet restore (#110)
- Updated GRPC dependency to Swift GRPC NIO. this change does not break any public interfaces
- reorg testing (#104)
- Docs - Fix typos and cleanup (#103)
- ZcashRustBackend.decryptAndStoreTransaction()
- Enhance logging on compact block processor
- parameterize helper method with constant
- Reverted -> update librustzcash to commit 52d8b436300724bc4b83aa4a0c659ab34c3dbce7
- testing: fix test crash
- fix: updated sample code where interface changed
- ENHANCEMENT: Retry support + error management
- FIX: processor crashes when lightwalletd has not caught up with latest height
- Better error handing when scanning fails
- [IMPORTANT] update librustzcash to commit 52d8b436300724bc4b83aa4a0c659ab34c3dbce7
- improved docs Move read.me up a directory
- NEW: Integrate logging capabilities
- FIX: account initialization error
- ENHANCEMENT: Mainnet checkpoints (#88)
IMPORTANT: this version contains a critical fix, upgrade to it as soon as possible
- [CRITICAL] Fixed a hardcoded COIN_TYPE on lib.rs
- added mainnet checkpoints
Warning: These changes might break interfaces in your project.
- upgraded to note-spending-v7
- fixed memory leak and blockrange error
- fixed memory cycles and leaks
- Fixed capture blocks retaining references
- fixed bug where compact block processor wouldn't reschedule
- add address validation functionality to Initializer
- Fixes to initializer, added v7 methods, documented API. Fixed compact block processor not initializing correctly upon new wallets.
- use "zip32 compliant" seed on demo app
Changes to createToAddress function to fix issues with paths that have spaces
Synchronizer:
change from computed variables to functions to allow throwing errors to clients