feat(platform): add GetShieldedNotesCount query for sync progress#3769
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughAdds Platform gRPC RPC getShieldedNotesCount with versioned request/response messages, implements server query (proof and non-proof paths), Drive-side proof verification, proof-to-type conversion, multi-language client artifacts, and SDK fetch helpers with platform-version bookkeeping. ChangesShielded Notes Count Query Implementation
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
✅ Review complete (commit 30d3da0) |
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## v3.1-dev #3769 +/- ##
============================================
+ Coverage 87.17% 87.33% +0.15%
============================================
Files 2607 2594 -13
Lines 319589 317375 -2214
============================================
- Hits 278614 277164 -1450
+ Misses 40975 40211 -764
🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
🧹 Nitpick comments (1)
packages/rs-sdk/src/platform/query.rs (1)
1183-1202: 💤 Low valueMinor grammar issue in panic message.
Line 1193: "query with proof are not supported" should be "query with proof is not supported" (singular verb agreement).
📝 Suggested grammar fix
- unimplemented!("query with proof are not supported for GetShieldedNotesCountRequest"); + unimplemented!("query with proof is not supported for GetShieldedNotesCountRequest");🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/rs-sdk/src/platform/query.rs` around lines 1183 - 1202, The panic message in the Query<GetShieldedNotesCountRequest> impl for NoParamQuery is grammatically incorrect; update the unimplemented! invocation that triggers when settings.prove is true to use the singular verb form, e.g. change "query with proof are not supported for GetShieldedNotesCountRequest" to "query with proof is not supported for GetShieldedNotesCountRequest" so the message reads correctly when settings.prove causes the unimplemented! panic.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@packages/rs-sdk/src/platform/query.rs`:
- Around line 1183-1202: The panic message in the
Query<GetShieldedNotesCountRequest> impl for NoParamQuery is grammatically
incorrect; update the unimplemented! invocation that triggers when
settings.prove is true to use the singular verb form, e.g. change "query with
proof are not supported for GetShieldedNotesCountRequest" to "query with proof
is not supported for GetShieldedNotesCountRequest" so the message reads
correctly when settings.prove causes the unimplemented! panic.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: c83c3a6f-053e-441b-9c1a-c39b2d069c2e
📒 Files selected for processing (19)
packages/dapi-grpc/build.rspackages/dapi-grpc/protos/platform/v0/platform.protopackages/rs-dapi-client/src/transport/grpc.rspackages/rs-dapi/src/services/platform_service/mod.rspackages/rs-drive-abci/src/query/service.rspackages/rs-drive-abci/src/query/shielded/mod.rspackages/rs-drive-abci/src/query/shielded/notes_count/mod.rspackages/rs-drive-abci/src/query/shielded/notes_count/v0/mod.rspackages/rs-drive-proof-verifier/src/types.rspackages/rs-drive-proof-verifier/src/unproved.rspackages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/mod.rspackages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/v0.rspackages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/v1.rspackages/rs-platform-version/src/version/mocks/v2_test.rspackages/rs-sdk/src/mock/requests.rspackages/rs-sdk/src/platform/fetch_unproved.rspackages/rs-sdk/src/platform/query.rspackages/rs-sdk/src/platform/types.rspackages/rs-sdk/src/platform/types/shielded.rs
thepastaclaw
left a comment
There was a problem hiding this comment.
Code Review
Verified the PR end-to-end: GetShieldedNotesCount is wired consistently from proto → drive-abci → version slots → verifier → SDK, mirroring the existing unproved GetCurrentQuorumsInfoRequest pattern. No blocking issues. A few nitpicks remain: a doc comment mismatch ("MMR" vs the actual CommitmentTree), an unreachable error fallback in the SDK helper, a grammar slip in the unimplemented! message, and a missing unit test for the new parser branch. The unimplemented!() panic intentionally mirrors prior art in the same file.
🟡 1 suggestion(s) | 💬 4 nitpick(s)
🤖 Prompt for all review comments with AI agents
These findings are from an automated code review. Verify each finding against the current code and only fix it if needed.
In `packages/rs-drive-proof-verifier/src/unproved.rs`:
- [SUGGESTION] packages/rs-drive-proof-verifier/src/unproved.rs:299-319: New `FromUnproved` impl for `ShieldedNotesCount` lacks parser-level tests
Neighboring unproved decoders in this file (e.g., `CurrentQuorumsInfo`, `EvoNodeStatus`) carry unit tests covering happy paths and malformed/missing-field cases. Because `GetShieldedNotesCount` has no proved alternative, the SDK fully depends on this parser to correctly reject missing `version` (`Error::EmptyVersion`) and missing `metadata` (`Error::EmptyResponseMetadata`). Adding a small test matrix here would catch future proto/codegen regressions before they reach shielded-sync flows.
New query returning the current leaf count of the shielded notes
commitment tree (= total notes). Wallets call it once at the start of
a shielded sync to seed a determinate progress-bar denominator
(notes_total → mmr_chunks_total → percentage), instead of having to
fetch every note to learn the total.
The count IS cryptographically provable. The on-chain notes tree is an
`Element::CommitmentTree(total_count, chunk_power, flags)`; `total_count`
is the element's first field and its serialized bytes are hashed into
the Merk value hash, so the app/root hash binds it (grovedb's own
comment: "total_count and height ... are already authenticated by the
Merk value hash"). The query therefore supports a proof, mirroring its
sibling GetShieldedPoolState:
- request carries `prove: bool`; response is
`oneof result { uint64 total_notes_count; Proof proof }`.
- proved path issues a single-key PathQuery at the shielded pool path
(`[ShieldedBalances, "M"]`, key `[SHIELDED_NOTES_KEY]`) with no
subquery, so GroveDB returns the serialized CommitmentTree element;
the verifier decodes `total_count` (field 0) from the proved element.
Wired end-to-end (mirrors GetShieldedPoolState):
- proto + dapi-grpc codegen registration (now in VERSIONED_RESPONSES;
regenerated JS/web/nodejs/java/objc/python clients).
- drive-abci handler at query::shielded::notes_count (+ v0) with
prove/unproved branches + tests (unproved, proved, none-version).
- drive verifier `verify_shielded_notes_count` (+ round-trip tests) and
its `verify_shielded_notes_count` FeatureVersion slot.
- notes_count FeatureVersionBounds query slot (v0/v1/v2_test all 0,0,0).
- rs-dapi-client transport route + rs-dapi drive_method! arm.
- drive-proof-verifier `ShieldedNotesCount(pub u64)` + FromProof.
- rs-sdk Fetch + FetchCurrent (proved) + Query honoring `prove`;
helper `platform::types::shielded::fetch_shielded_notes_count(&sdk)`.
- `platform::types::shielded` made `pub` so the helper is reachable.
No protocol-version bump (new slots initialized to 0 / (0,0,0)).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
d8bf39c to
4e6b4ef
Compare
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/rs-sdk/src/platform/query.rs`:
- Around line 1183-1199: The current Query<GetShieldedNotesCountRequest> impl
for NoParamQuery panics when settings.prove is false; remove the
unimplemented!() branch and always construct and return a
GetShieldedNotesCountRequest populated with the appropriate Version::V0 payload
where get_shielded_notes_count_request::GetShieldedNotesCountRequestV0.prove is
set to the incoming settings.prove value (so both proved and unproved requests
are supported), leaving the surrounding function signature (fn query for
NoParamQuery) unchanged.
In `@packages/rs-sdk/src/platform/types/shielded.rs`:
- Around line 66-72: The helper fetch_shielded_notes_count currently calls the
proof-verified path ShieldedNotesCount::fetch_current which forces expensive
proof work; change it to use the lightweight, non‑proved fetch path (e.g.
ShieldedNotesCount::fetch_lightweight or the SDK's equivalent short/pathless
fetch method) and return that value instead of using fetch_current so the wallet
sync-progress query is cheap; update the call in fetch_shielded_notes_count to
the lightweight variant and keep the rest of the function signature/return
handling the same.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: cd26666b-c7e2-4f56-ad03-9f38911bf154
📒 Files selected for processing (38)
packages/dapi-grpc/build.rspackages/dapi-grpc/clients/drive/v0/nodejs/drive_pbjs.jspackages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.javapackages/dapi-grpc/clients/platform/v0/nodejs/platform_pbjs.jspackages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.jspackages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.hpackages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.mpackages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.hpackages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.mpackages/dapi-grpc/clients/platform/v0/python/platform_pb2.pypackages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.pypackages/dapi-grpc/clients/platform/v0/web/platform_pb.d.tspackages/dapi-grpc/clients/platform/v0/web/platform_pb.jspackages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.tspackages/dapi-grpc/clients/platform/v0/web/platform_pb_service.jspackages/dapi-grpc/protos/platform/v0/platform.protopackages/rs-dapi-client/src/transport/grpc.rspackages/rs-dapi/src/services/platform_service/mod.rspackages/rs-drive-abci/src/query/service.rspackages/rs-drive-abci/src/query/shielded/mod.rspackages/rs-drive-abci/src/query/shielded/notes_count/mod.rspackages/rs-drive-abci/src/query/shielded/notes_count/v0/mod.rspackages/rs-drive-proof-verifier/src/proof.rspackages/rs-drive-proof-verifier/src/types.rspackages/rs-drive/src/verify/shielded/mod.rspackages/rs-drive/src/verify/shielded/verify_shielded_notes_count/mod.rspackages/rs-drive/src/verify/shielded/verify_shielded_notes_count/v0/mod.rspackages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/mod.rspackages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/v0.rspackages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/v1.rspackages/rs-platform-version/src/version/drive_versions/drive_verify_method_versions/mod.rspackages/rs-platform-version/src/version/drive_versions/drive_verify_method_versions/v1.rspackages/rs-platform-version/src/version/mocks/v2_test.rspackages/rs-sdk/src/mock/requests.rspackages/rs-sdk/src/platform/fetch.rspackages/rs-sdk/src/platform/query.rspackages/rs-sdk/src/platform/types.rspackages/rs-sdk/src/platform/types/shielded.rs
✅ Files skipped from review due to trivial changes (10)
- packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.m
- packages/dapi-grpc/clients/platform/v0/web/platform_pb.d.ts
- packages/dapi-grpc/clients/platform/v0/web/platform_pb_service.d.ts
- packages/dapi-grpc/clients/platform/v0/python/platform_pb2_grpc.py
- packages/rs-sdk/src/mock/requests.rs
- packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbrpc.h
- packages/dapi-grpc/clients/platform/v0/nodejs/platform_protoc.js
- packages/dapi-grpc/clients/platform/v0/objective-c/Platform.pbobjc.h
- packages/dapi-grpc/clients/platform/v0/java/org/dash/platform/dapi/v0/PlatformGrpc.java
- packages/dapi-grpc/clients/platform/v0/web/platform_pb.js
🚧 Files skipped from review as they are similar to previous changes (11)
- packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/mod.rs
- packages/rs-drive-abci/src/query/shielded/mod.rs
- packages/rs-dapi-client/src/transport/grpc.rs
- packages/rs-platform-version/src/version/mocks/v2_test.rs
- packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/v0.rs
- packages/rs-sdk/src/platform/types.rs
- packages/rs-dapi/src/services/platform_service/mod.rs
- packages/rs-drive-abci/src/query/service.rs
- packages/rs-drive-proof-verifier/src/types.rs
- packages/rs-platform-version/src/version/drive_abci_versions/drive_abci_query_versions/v1.rs
- packages/rs-drive-abci/src/query/shielded/notes_count/mod.rs
thepastaclaw
left a comment
There was a problem hiding this comment.
Code Review
Prior finding reconciliation for 4e6b4ef: carried forward STILL VALID prior findings: none; fixed/outdated prior findings: #1:unproved-shielded-notes-count-parser-tests, #2:shielded-notes-count-doc-mmr-vs-commitment-tree, #3:fetch-shielded-notes-count-unreachable-ok-or, #4:get-shielded-notes-count-prove-true-unimplemented, #5:get-shielded-notes-count-unimplemented-grammar; intentionally deferred prior findings: none. Latest-delta findings are listed separately when present.
Verified the d8bf39c..4e6b4ef delta and cumulative PR. The PR now adds a fully proved variant of GetShieldedNotesCount (proto prove/oneof result, drive-abci proved branch, new verify_shielded_notes_count in drive with v0 + round-trip tests, SDK Fetch/FetchCurrent/FromProof); the old FromUnproved impl is removed. Four prior findings are FIXED, one is OUTDATED. The lone carried-forward nit (panic on prove=false) is a module-wide convention shared by every shielded query in query.rs (GetShieldedPoolStateRequest, GetShieldedAnchorsRequest, GetMostRecentShieldedAnchorRequest) — out of scope for this PR. No new blocking issues in the delta.
No in-scope findings remain after re-validating the prior review against this head.
|
✅ DashSDKFFI.xcframework built for this PR.
SwiftPM (host the zip at a stable URL, then use): .binaryTarget(
name: "DashSDKFFI",
url: "https://your.cdn.example/DashSDKFFI.xcframework.zip",
checksum: "438e04cb0d78bd43bc1018ae4b5c66d66852eafd21758d0c668ad56c3d5e4810"
)Xcode manual integration:
|
The shielded progress-bar denominator now comes "for free" from the
proof that already delivers each note chunk — no separate RPC, no
server change, no proof-size change, and crucially no dependency on
GetShieldedNotesCount being deployed (so the bars work against
currently-deployed nodes).
The note-fetch proof is a GroveDB layered proof that subqueries INTO
the shielded notes CommitmentTree, so the parent
`Element::CommitmentTree(total_count, ..)` is necessarily present in
the proof bytes (it chains to the root hash and feeds total_count into
the inner CommitmentTree subquery verification — the
`add_parent_tree_on_subquery: false` flag only suppresses sibling
subtree walks, not the queried tree's own element). We were simply
discarding it.
`verify_shielded_encrypted_notes` now extracts it by running an
additional `verify_subset_query` against the SAME proof bytes with a
single-key PathQuery for the CommitmentTree element (no subquery), then
decoding `total_count` (field 0). A round-trip test inserts N notes,
builds a real note-fetch proof via the server-side PathQuery, and
asserts the extracted count == N — proving the parent element is in the
proof.
Plumbing:
- verifier returns `(root_hash, notes, total_count)`.
- `ShieldedEncryptedNotes` becomes `{ notes, total_count }`; `FromProof`
threads it and now yields `Some(..)` on empty chunks so the count
still flows on the final empty chunk.
- `fetch_chunk` returns `total_count`; `ShieldedChunkBatch` and
`ShieldedSyncResult` carry it.
- wallet `sync_notes_across` sources `total_target` from
`batch.total_count` (max-seen) instead of calling
`fetch_shielded_notes_count` — that up-front RPC is removed.
The standalone GetShieldedNotesCount query (PR #3769) stays as the
primitive for showing the total WITHOUT syncing; the sync path no
longer needs it.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…Count GetShieldedNotesCount is proved-only (the count is bound by the Merk value hash, so it is always returned inside a verifiable proof). The Query impl previously hit `unimplemented!()` — a process-aborting panic — when a caller explicitly disabled proofs on this public request type. Return a recoverable `Error::Generic` instead. Addresses review feedback on the panic; the proved-only design is intentional (the cheap, non-binding progress denominator is sourced from the note-fetch proof's total_count, so this standalone query stays the cryptographically-verified primitive). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
Reviewed |
thepastaclaw
left a comment
There was a problem hiding this comment.
Code Review
Single-commit delta at 30d3da0 cleanly replaces a process-aborting unimplemented!() with a typed Err(Error::Generic(...)) in the Query<GetShieldedNotesCountRequest>::query impl for prove=false. The change is correctly scoped, the Error::Generic variant exists, and the proved happy-path is untouched. One suggestion-level test-coverage gap remains for the new error branch.
🟡 1 suggestion(s)
🤖 Prompt for all review comments with AI agents
These findings are from an automated code review. Verify each finding against the current code and only fix it if needed.
In `packages/rs-sdk/src/platform/query.rs`:
- [SUGGESTION] packages/rs-sdk/src/platform/query.rs:1194-1199: Add a unit test pinning the new `prove=false` error path for `GetShieldedNotesCount`
This PR's only behavioral change is replacing `unimplemented!()` with `Err(Error::Generic(...))` when callers build `GetShieldedNotesCountRequest` with `QuerySettings { prove: false, .. }`. That branch is part of the public `Query` surface but is unreachable through the standard `FetchCurrent` flow (which forces `prove=true`), so without a focused unit test exercising `NoParamQuery::query` directly with `prove=false`, a future refactor could silently regress this back to a panic or change the error shape without any signal. The module-level docs already endorse direct `QuerySettings` use for encoder-level unit tests, making this the appropriate place to lock in the intended non-panicking behavior.
| if !prove { | ||
| return Err(Error::Generic( | ||
| "GetShieldedNotesCount requires proofs; unproved queries are not supported" | ||
| .to_string(), | ||
| )); | ||
| } |
There was a problem hiding this comment.
🟡 Suggestion: Add a unit test pinning the new prove=false error path for GetShieldedNotesCount
This PR's only behavioral change is replacing unimplemented!() with Err(Error::Generic(...)) when callers build GetShieldedNotesCountRequest with QuerySettings { prove: false, .. }. That branch is part of the public Query surface but is unreachable through the standard FetchCurrent flow (which forces prove=true), so without a focused unit test exercising NoParamQuery::query directly with prove=false, a future refactor could silently regress this back to a panic or change the error shape without any signal. The module-level docs already endorse direct QuerySettings use for encoder-level unit tests, making this the appropriate place to lock in the intended non-panicking behavior.
source: ['codex']
Resolves conflicts created when #3769 (GetShieldedNotesCount) merged to v3.1-dev as the PROVED query, superseding this branch's earlier UNPROVED version (eabb145). Conflict resolution: - All GetShieldedNotesCount surface (proto, notes_count handler, types.rs ShieldedNotesCount doc, query.rs Query impl, and the SDK unproved/fetch surface) taken from v3.1-dev — the proved version is authoritative. The branch's stale unproved impls (FromUnproved, FetchUnproved) are dropped; query.rs keeps the proved-only recoverable error on prove=false. - proto + regenerated gRPC clients now match v3.1-dev exactly. - Kept this branch's separate note-fetch total_count work: the ShieldedEncryptedNotes { notes, total_count } struct and the verify_shielded_encrypted_notes extraction are preserved (they don't conflict with the proved standalone query). Verified: dapi-grpc, drive-proof-verifier, dash-sdk, drive-abci, platform-wallet (--features shielded), and wasm-sdk all check clean.
Issue being fixed or feature implemented
Wallets have no cheap way to learn the total number of notes in the
shielded pool. During a shielded sync the client streams note chunks
but can't show a determinate progress bar because it doesn't know the
denominator (total notes) until it has fetched everything.
This adds a query returning the current leaf count of the shielded
notes commitment tree (= total notes). A wallet calls it once at the
start of a sync to seed a progress-bar denominator
(
notes_total → mmr_chunks_total → percentage).Extracted as a standalone PR from the broader shielded-sync work so it
can land and deploy independently — the interleaved-streaming and
dual-progress-bar changes depend on this query existing on-chain.
What was done?
GetShieldedNotesCount, wired end-to-end and proved (mirrors itssibling
GetShieldedPoolState):platform.proto): request carriesprove: bool; responseis
oneof result { uint64 total_notes_count; Proof proof }. Plusdapi-grpc codegen registration (added to
VERSIONED_RESPONSES) andregenerated JS/web/nodejs/java/objc/python clients.
query::shielded::notes_count(+ v0) withproved/unproved branches and tests; gRPC route in
service.rs.verify_shielded_notes_count(+ round-trip tests)and its
verify_shielded_notes_countFeatureVersion slot.notes_countquery slot (v0/v1/v2_test all(0,0,0)); no protocol bump.drive_method!arm.ShieldedNotesCount(pub u64)+FromProof.Fetch+FetchCurrent(proved),Queryhonoringprove, and helperplatform::types::shielded::fetch_shielded_notes_count(&sdk).Why it's provable
The on-chain notes tree is an
Element::CommitmentTree(total_count, chunk_power, flags).total_countis the element's first field and its serialized bytes are hashed into
the Merk value hash, so the app/root hash binds it — grovedb's own
comment: "total_count and height … are already authenticated by the
Merk value hash." The proved path issues a single-key PathQuery at the
shielded pool path (no subquery), so GroveDB returns the serialized
CommitmentTreeelement and the verifier decodestotal_count(field0) against the verified root. Same mechanism
GetShieldedPoolStateusesfor its stored balance.
How Has This Been Tested?
cargo check -p drive -p drive-abci -p dash-sdk -p drive-proof-verifier— clean.cargo test -p drive-abci --lib query::shielded::notes_count— 3 passed(none-version → decoding error; unproved → value; proved → proof).
cargo test -p drive --lib verify::shielded::verify_shielded_notes_count— 3 passed (round-trip: 0 on fresh state, N after inserts).cargo test -p drive-proof-verifier --lib shielded_notes_count— 1 passed.cargo fmt --all --check— clean.yarn workspace @dashevo/dapi-grpc build.Breaking Changes
None. Additive query; new version slots initialized to
0/(0,0,0),no protocol-version bump. Existing clients unaffected; nodes must deploy
this build to answer the new query.
Checklist:
For repository code-owners and collaborators only
🤖 Generated with Claude Code
Summary by CodeRabbit
getShieldedNotesCountendpoint to query the total count of shielded notes in the platform.