Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
5a92f1e
feat: dynamic DAPI node discovery and config migration
lklimek Mar 25, 2026
d1834b0
Merge remote-tracking branch 'origin/v1.0-dev' into chore/update-dash…
lklimek Mar 30, 2026
4b9dab0
chore: update Cargo.lock after merge
lklimek Mar 30, 2026
ea1066e
fix(config): restore 0o600 permissions on .env after migration rename
lklimek Mar 30, 2026
1aa09d7
docs(dapi_discovery): document trust model for DAPI node discovery
lklimek Mar 30, 2026
eb90389
perf(app): defer non-active network context creation until switch
lklimek Mar 30, 2026
b305ad5
refactor(dapi_discovery): replace String errors with typed DapiDiscov…
lklimek Mar 30, 2026
7b25938
style: format dapi_discovery.rs
lklimek Mar 30, 2026
2504126
fix(dapi_discovery): fall back to seed nodes when dynamic discovery f…
lklimek Mar 30, 2026
9dc7b30
fix(config): use stderr for migration logging before logger init
lklimek Mar 30, 2026
3d3847c
refactor(app): make mainnet_app_context optional like other networks
lklimek Mar 30, 2026
40df7e8
refactor(app): simplify network context management and reduce boilerp…
lklimek Mar 30, 2026
4fa63ef
style: format dapi_discovery.rs
lklimek Mar 30, 2026
e72c687
fix(config): use stderr for migration logging before logger init
lklimek Mar 30, 2026
f81e45a
Merge branch 'chore/update-dash-sdk-b70f39dc' into refactor/lazy-acti…
lklimek Mar 30, 2026
24213d7
Merge branch 'chore/update-dash-sdk-b70f39dc' of https://github.com/d…
lklimek Mar 30, 2026
8eac7ff
fix(config): address PR review comments — docs, dead code, migration …
lklimek Mar 30, 2026
112c873
revert(app): remove deferred network context — moved to PR #803
lklimek Mar 30, 2026
5664812
refactor(app): move network switch context creation to background task
lklimek Mar 30, 2026
825981c
fix(ui): always show mainnet/testnet in network chooser, devnet/local…
lklimek Mar 30, 2026
eb78d8b
Merge remote-tracking branch 'origin/chore/update-dash-sdk-b70f39dc' …
lklimek Mar 30, 2026
b66c48e
Merge remote-tracking branch 'origin/chore/update-dash-sdk-b70f39dc' …
lklimek Mar 30, 2026
46e094e
fix(review): address PR #767 review comments in #803
lklimek Mar 30, 2026
6f3c027
fix(config): update testnet seed nodes to 68.67.122.1-29
lklimek Mar 30, 2026
dd5fe9f
fix(config): use network-aware default RPC ports and remove error lea…
lklimek Mar 30, 2026
5b99de3
refactor(dapi): replace auto-discovery with manual fetch button
lklimek Mar 30, 2026
54ee77b
Merge branch 'v1.0-dev' into chore/update-dash-sdk-b70f39dc
lklimek Mar 30, 2026
ee523f8
fix(app): gracefully handle missing DAPI addresses at startup
lklimek Mar 30, 2026
344183a
fix(ui): move fetch button to Connection Status, unify 3-line display
lklimek Mar 30, 2026
9ad0076
fix(shielded): gate shielded wallet init on protocol version support
lklimek Mar 30, 2026
6b83b8a
chore: rename button to Refresh DAPI endpoints
lklimek Mar 30, 2026
1ffc6d2
refactor: move dapi_discovery.rs to backend_task module
lklimek Mar 30, 2026
494053b
chore: update dapi addresses
lklimek Mar 30, 2026
39a2011
chore: fmt
lklimek Mar 30, 2026
137b987
fix(review): address PR #767 Copilot review comments
lklimek Mar 30, 2026
08a9961
chore: minor fix in the msg
lklimek Mar 30, 2026
861c19a
Merge branch 'chore/update-dash-sdk-b70f39dc' of https://github.com/d…
lklimek Mar 30, 2026
af87737
Merge remote-tracking branch 'origin/chore/update-dash-sdk-b70f39dc' …
lklimek Mar 30, 2026
5824850
feat(mcp): add network_refresh_endpoints and network_reinit_sdk tools
lklimek Mar 30, 2026
444b7c1
feat(mcp): add network_switch tool, simplify SwitchNetwork flow
lklimek Mar 30, 2026
259236c
chore(mcp): remove network_refresh_endpoints tool
lklimek Mar 30, 2026
a7508d0
refactor(mcp): unify context storage so network_switch works in all m…
lklimek Mar 30, 2026
25b9748
fix(mcp): persist network choice in network_switch tool
lklimek Mar 30, 2026
6b84317
refactor: move network persist into BackendTask::SwitchNetwork handler
lklimek Mar 30, 2026
45a7d54
feat(mcp): force SPV backend in headless mode
lklimek Mar 30, 2026
145f9fd
feat: add user-friendly messages for token validation errors
lklimek Mar 31, 2026
7e9cec8
chore: show details to everyone
lklimek Mar 31, 2026
9957513
chore: relabel "import tokens"
lklimek Mar 31, 2026
bc9792a
fix(spv): auto-start SPV on network switch via start_spv flag
lklimek Mar 31, 2026
86a8154
fix(shielded): init shielded wallets when protocol version arrives fr…
lklimek Mar 31, 2026
a4aff7b
fix(spv): fall back to tempdir when SPV data directory is locked
lklimek Mar 31, 2026
569c3c4
fix(mcp): remove unnecessary SPV gate from platform_addresses_list
lklimek Mar 31, 2026
5e5ca48
docs: rename EXPOSING_BACKEND_TASKS.md to MCP_TOOL_DEVELOPMENT.md
lklimek Mar 31, 2026
73f6ac6
fix(mcp): restore SPV gate on platform_addresses_list
lklimek Mar 31, 2026
8f21506
fix(mcp): include error details in TaskFailed MCP responses
lklimek Mar 31, 2026
6be5388
fix(mcp): use PlatformAddress in PlatformAddressBalances backend task…
lklimek Mar 31, 2026
425393d
Merge remote-tracking branch 'origin/fix/mcp-platform-addresses-bech3…
lklimek Mar 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
# linux: ~/.config/dash-evo-tool/.env
# Mac: ~/Library/ApplicationSupport/Dash-Evo-Tool/.env

MAINNET_dapi_addresses=https://104.200.24.196:443,https://134.255.182.185:443,https://134.255.182.186:443,https://134.255.182.187:443,https://134.255.183.247:443,https://134.255.183.248:443,https://134.255.183.250:443,https://135.181.110.216:443,https://146.59.4.9:443,https://147.135.199.138:443,https://149.28.241.190:443,https://149.28.247.165:443,https://157.10.199.125:443,https://157.10.199.77:443,https://157.10.199.79:443,https://157.10.199.82:443,https://157.66.81.130:443,https://157.66.81.162:443,https://157.66.81.218:443,https://157.90.238.161:443,https://159.69.204.162:443,https://167.179.90.255:443,https://167.88.169.16:443,https://168.119.102.10:443,https://172.104.90.249:443,https://173.212.239.124:443,https://173.249.53.139:443,https://178.157.91.184:443,https://185.158.107.124:443,https://185.192.96.70:443,https://185.194.216.84:443,https://185.197.250.227:443,https://185.198.234.17:443,https://185.215.166.126:443,https://188.208.196.183:443,https://188.245.90.255:443,https://192.248.178.237:443,https://193.203.15.209:443,https://194.146.13.7:443,https://194.195.87.34:443,https://198.7.115.43:443,https://207.244.247.40:443,https://213.199.34.248:443,https://213.199.34.250:443,https://213.199.34.251:443,https://213.199.35.15:443,https://213.199.35.18:443,https://213.199.35.6:443,https://213.199.44.112:443,https://2.58.82.231:443,https://31.220.84.93:443,https://31.220.85.180:443,https://31.220.88.116:443,https://37.27.83.17:443,https://37.60.236.151:443,https://37.60.236.161:443,https://37.60.236.201:443,https://37.60.236.212:443,https://37.60.236.247:443,https://37.60.236.249:443,https://37.60.243.119:443,https://37.60.243.59:443,https://37.60.244.220:443,https://44.240.99.214:443,https://49.12.102.105:443,https://49.13.154.121:443,https://49.13.193.251:443,https://49.13.237.193:443,https://49.13.28.255:443,https://51.195.118.43:443,https://51.83.191.208:443,https://5.189.186.78:443,https://52.10.213.198:443,https://52.33.9.172:443,https://54.69.95.118:443,https://5.75.133.148:443,https://64.23.134.67:443,https://65.108.246.145:443,https://65.109.65.126:443,https://65.21.145.147:443,https://79.137.71.84:443,https://81.17.101.141:443,https://91.107.204.136:443,https://91.107.226.241:443,https://93.190.140.101:443,https://93.190.140.111:443,https://93.190.140.112:443,https://93.190.140.114:443,https://93.190.140.162:443,https://95.216.146.18:443
MAINNET_dapi_addresses=https://45.135.180.114/,https://194.163.159.171/,https://84.247.180.190/,https://173.212.251.130/,https://75.119.153.10/,https://89.125.209.106/,https://216.238.75.46/,https://5.75.133.148/,https://185.239.208.110/,https://135.181.110.216/,https://157.173.122.25/,https://45.94.58.58/,https://109.199.119.192/,https://31.220.77.84/,https://75.119.137.66/,https://89.35.131.218/,https://167.114.153.110/,https://5.189.145.80/,https://143.198.145.184/,https://195.26.254.228/,https://161.97.83.102/,https://167.88.169.16/,https://139.180.143.115/,https://45.135.180.70/,https://37.60.254.205/,https://89.35.131.39/,https://37.60.235.89/,https://185.202.236.58/,https://85.190.243.3/,https://84.247.180.201/,https://54.69.95.118/,https://161.97.91.217/,https://37.60.235.205/,https://157.173.122.26/,https://161.97.75.36/,https://95.111.233.139/,https://192.248.175.198/,https://172.238.7.25/,https://89.23.117.144/,https://185.209.230.13/,https://155.133.26.122/,https://161.97.179.214/,https://37.60.235.224/,https://103.214.68.30/,https://161.97.88.199/,https://185.119.57.243/,https://77.42.74.68/,https://65.108.246.145/,https://45.153.70.126/,https://82.208.20.153/,https://89.23.112.100/,https://132.243.197.251/,https://132.243.197.250/,https://207.244.247.40/,https://92.63.176.202/,https://109.123.244.131/,https://83.222.9.253/,https://45.76.141.74/,https://38.242.206.56/,https://62.171.144.192/,https://43.167.239.145/,https://46.62.250.247/,https://213.199.54.35/,https://164.68.118.37/,https://62.171.138.186/,https://109.199.124.30/,https://5.189.151.7/,https://91.198.108.37/,https://139.84.137.143/,https://95.111.241.20/,https://158.220.101.28/,https://144.91.87.82/,https://206.245.167.74/,https://192.248.178.237/,https://157.90.238.161/,https://207.180.233.6/,https://77.221.148.204/,https://134.255.182.185/,https://80.240.19.200/,https://37.60.235.24/,https://188.245.90.255/,https://185.215.164.186/,https://185.166.217.154/,https://84.247.180.198/,https://161.97.104.37/,https://178.253.42.64/,https://52.10.213.198/,https://37.60.235.39/,https://49.13.28.255/,https://92.53.120.89/,https://51.158.169.237/,https://188.225.39.14/,https://139.84.231.221/,https://156.67.29.45/,https://75.119.156.254/,https://147.45.183.128/,https://75.119.128.71/,https://37.60.244.253/,https://139.99.201.103/,https://161.97.117.125/,https://52.33.9.172/,https://207.180.224.96/,https://193.70.43.172/,https://147.45.103.99/,https://37.60.235.218/,https://207.180.241.242/,https://84.247.180.205/,https://202.71.14.79/,https://31.220.91.60/,https://37.60.234.205/,https://213.199.53.161/,https://37.60.244.87/,https://38.242.197.189/,https://95.216.146.18/,https://213.171.12.108/,https://75.119.138.9/,https://193.168.3.82/,https://161.97.153.122/,https://37.27.83.17/,https://43.133.171.101/,https://178.18.254.136/,https://84.247.180.200/,https://161.97.180.182/,https://93.115.172.39/,https://49.12.102.105/,https://49.13.237.193/,https://23.88.63.58/,https://195.201.238.55/,https://213.159.77.221/,https://132.243.197.252/,https://161.97.106.14/,https://82.97.240.124/,https://161.97.159.172/,https://185.198.234.17/,https://167.86.77.58/,https://109.199.97.144/,https://37.60.244.35/,https://132.243.197.18/,https://173.212.196.214/,https://217.25.89.156/,https://85.92.111.111/,https://173.249.21.12/,https://114.132.172.215/,https://37.60.254.211/,https://89.125.209.133/,https://168.119.102.10/,https://45.135.180.130/,https://37.60.254.213/,https://217.76.54.175/,https://176.57.213.170/,https://109.199.120.79/,https://81.200.152.144/,https://161.97.85.182/,https://31.220.91.43/,https://108.61.165.170/,https://45.77.129.235/,https://149.102.140.101/,https://158.247.208.247/,https://37.60.236.41/,https://45.85.147.192/,https://89.35.131.149/,https://37.60.234.168/,https://213.199.54.171/,https://91.222.237.98/,https://57.131.28.197/,https://38.242.218.26/,https://89.125.209.195/,https://93.115.172.37/,https://5.189.164.253/,https://91.198.108.36/,https://161.97.175.233/,https://161.97.102.156/,https://89.125.209.110/,https://95.179.241.182/,https://207.180.218.245/,https://157.173.122.20/,https://161.97.88.219/,https://213.199.54.37/,https://31.220.84.93/,https://89.125.209.27/,https://161.97.106.164/,https://95.179.159.65/,https://72.60.38.160/,https://38.242.145.178/,https://51.195.47.118/,https://84.247.187.76/,https://89.35.131.23/,https://52.36.102.91/,https://185.215.166.126/,https://104.156.154.179/,https://173.212.232.90/,https://185.215.164.84/,https://167.86.94.138/,https://38.242.206.103/,https://161.97.91.68/,https://43.167.244.109/,https://87.228.24.64/,https://89.125.50.206/,https://136.244.99.17/,https://161.97.96.120/,https://103.214.68.131/,https://213.199.54.34/,https://109.199.124.135/,https://37.60.254.201/,https://173.199.71.83/,https://44.240.99.214/,https://132.243.197.40/,https://62.171.170.14/,https://45.76.36.241/,https://161.97.142.210/,https://85.193.90.107/,https://45.77.11.194/,https://91.198.108.35/,https://132.243.197.249/,https://157.173.122.21/,https://193.168.3.112/,https://173.212.245.118/,https://216.238.99.9/,https://147.45.236.121/,https://37.60.236.230/,https://89.125.209.152/,https://38.242.200.227/,https://89.125.209.234/,https://144.91.106.188/,https://51.195.235.166/,https://185.252.234.238/,https://158.247.247.241/,https://64.176.10.71/,https://207.180.213.141/,https://66.245.196.52/,https://144.126.141.62/,https://45.135.180.79/,https://194.163.166.76/,https://139.84.236.208/,https://37.60.254.202/,https://172.236.244.81/,https://66.29.147.83/,https://70.34.206.123/,https://77.232.129.86/,https://95.111.239.54/,https://167.235.102.194/,https://207.180.233.246/,https://89.125.50.14/,https://37.60.246.228/,https://139.84.232.129/,https://72.62.58.108/,https://89.125.209.156/,https://161.97.180.105/,https://132.243.197.16/,https://62.171.170.222/,https://149.28.223.171/,https://162.212.35.100/,https://185.239.209.6/,https://161.97.163.75/,https://213.199.44.112/,https://89.223.120.216/,https://89.125.209.120/,https://206.245.167.76/,https://92.255.76.59/,https://37.60.243.59/,https://89.125.209.178/,https://93.115.172.38/,https://194.163.156.190/,https://93.115.172.36/,https://89.35.131.219/,https://91.198.108.38/,https://89.125.209.69/,https://139.84.170.10/,https://45.32.70.131/,https://161.97.74.173/,https://62.171.136.245/,https://178.18.244.255/,https://89.35.131.158/,https://134.255.182.186/,https://158.220.101.10/,https://167.86.93.21/,https://49.13.193.251/,https://164.68.114.36/,https://161.97.66.31/,https://75.119.152.219/,https://64.176.35.235/,https://78.141.225.100/
MAINNET_core_host=127.0.0.1
MAINNET_core_rpc_port=9998
MAINNET_core_rpc_user=dashrpc
MAINNET_core_rpc_password=password
MAINNET_core_zmq_endpoint=tcp://127.0.0.1:23708

TESTNET_dapi_addresses=https://34.214.48.68:1443,https://52.12.176.90:1443,https://52.34.144.50:1443,https://44.240.98.102:1443,https://54.201.32.131:1443,https://52.10.229.11:1443,https://52.13.132.146:1443,https://52.40.219.41:1443,https://54.149.33.167:1443,https://35.164.23.245:1443,https://52.33.28.47:1443,https://52.43.13.92:1443,https://52.89.154.48:1443,https://52.24.124.162:1443,https://35.85.21.179:1443,https://54.187.14.232:1443,https://54.68.235.201:1443,https://52.13.250.182:1443
TESTNET_dapi_addresses=https://68.67.122.1:1443,https://68.67.122.2:1443,https://68.67.122.3:1443,https://68.67.122.4:1443,https://68.67.122.5:1443,https://68.67.122.6:1443,https://68.67.122.7:1443,https://68.67.122.8:1443,https://68.67.122.9:1443,https://68.67.122.10:1443,https://68.67.122.11:1443,https://68.67.122.12:1443,https://68.67.122.13:1443,https://68.67.122.14:1443,https://68.67.122.15:1443,https://68.67.122.16:1443,https://68.67.122.17:1443,https://68.67.122.18:1443,https://68.67.122.19:1443,https://68.67.122.20:1443,https://68.67.122.21:1443,https://68.67.122.22:1443,https://68.67.122.23:1443,https://68.67.122.24:1443,https://68.67.122.25:1443,https://68.67.122.26:1443,https://68.67.122.27:1443,https://68.67.122.28:1443,https://68.67.122.29:1443
TESTNET_core_host=127.0.0.1
TESTNET_core_rpc_port=19998
TESTNET_core_rpc_user=dashrpc
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ User-facing error messages (shown in `MessageBanner` via `Display`) must follow
- **Backend dispatch**: tools reuse the app's `BackendTask` system via `dispatch::dispatch_task()` — creates a throwaway channel, calls `app_context.run_backend_task()`.
- **Schema quirk**: `schemars` v1 derives bare `true` for `serde_json::Value` fields — some MCP clients reject this. Use `#[schemars(transform)]` to override.
- **Error type**: `McpToolError` enum (InvalidParam, WalletNotFound, SpvSyncFailed, TaskFailed, Internal) converts to `rmcp::ErrorData` via `From`.
- **Docs**: `docs/MCP.md` (server config, tool reference), `docs/CLI.md` (usage, examples), `docs/EXPOSING_BACKEND_TASKS.md` (checklist for adding new MCP tools).
- **Docs**: `docs/MCP.md` (server config, tool reference), `docs/CLI.md` (usage, examples), `docs/MCP_TOOL_DEVELOPMENT.md` (checklist for adding new MCP tools).

### Key Dependencies

Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ The default `cargo build` produces only the `dash-evo-tool` GUI binary. Optional

### Adding MCP tools

To expose a `BackendTask` as a new MCP/CLI tool, follow the step-by-step checklist in [docs/EXPOSING_BACKEND_TASKS.md](docs/EXPOSING_BACKEND_TASKS.md). It covers architecture rules, the standard invocation pattern, registration, and common pitfalls.
To expose a `BackendTask` as a new MCP/CLI tool, follow the step-by-step checklist in [docs/MCP_TOOL_DEVELOPMENT.md](docs/MCP_TOOL_DEVELOPMENT.md). It covers architecture rules, the standard invocation pattern, registration, and common pitfalls.

## Code quality

Expand Down
46 changes: 29 additions & 17 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ dash-sdk = { git = "https://github.com/dashpay/platform", rev = "94cefb30d9d8ad8
"core_spv",
"shielded",
] }
rs-sdk-trusted-context-provider = { git = "https://github.com/dashpay/platform", rev = "94cefb30d9d8ad84b1d45e0a152341a2425f920b" }
zip32 = "0.2.0"
grovestark = { git = "https://www.github.com/dashpay/grovestark", rev = "5b9e289cca54c79b1305d5f4f40bf1148f1eb0e3" }
rayon = "1.8"
Expand Down
8 changes: 8 additions & 0 deletions docs/MCP.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ Set these in the app's `.env` file (see `.env.example`) or as environment variab
| Tool | Parameters | det-cli command | Description |
|---|---|---|---|
| `network_info` | — | `det-cli network-info` | Show active network and available configured networks |
| `network_reinit_sdk` | `network` | `det-cli network-reinit-sdk` | Rebuild Core RPC client and Platform SDK with current config (use after changing credentials) |
| `network_switch` | `network` | `det-cli network-switch` | Switch the active network (creates context if needed, may take a few seconds) |
| `core_wallets_list` | `network`? | `det-cli core-wallets-list` | List wallets loaded in the app (alias + seed hash) |
| `core_address_create` | `wallet_id`, `network`? | `det-cli core-address-create` | Generate a new receive address for a wallet |
| `core_balances_get` | `wallet_id`, `network`? | `det-cli core-balances-get` | Show wallet balances (total, confirmed, unconfirmed) in duffs |
Expand All @@ -88,6 +90,12 @@ Set these in the app's `.env` file (see `.env.example`) or as environment variab

Parameters marked `?` are optional. The `det-cli` column shows the equivalent CLI command (underscores become hyphens).

### SPV requirements

All wallet-facing tools wait for SPV to fully sync before executing. This includes both core-chain tools (`core_address_create`, `core_balances_get`, `core_funds_send`) and platform tools (`platform_addresses_list`, `identity_credits_topup`, `shielded_shield_from_core`). Even DAPI-only operations need SPV because the SDK verifies DAPI proofs against quorum and masternode list data from the synced chain. When another DET instance is already running, SPV falls back to a temporary directory and must sync from scratch.

Only metadata tools that make no network calls (`core_wallets_list`, `network_info`, `tool_describe`) skip the SPV gate.

## CLI interface (det-cli)

`det-cli` is the command-line interface for interacting with MCP tools. It can operate in two modes:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ impl AsyncTool<DashMcpService> for MyNewTool {
// 3. Resolve wallet if needed
let seed_hash = resolve::wallet(&ctx, &param.wallet_id)?;

// 4. Wait for SPV sync if tool needs wallet/chain data
// 4. Wait for SPV sync (see SPV gate rule below)
resolve::ensure_spv_synced(&ctx).await?;

// 5. Build and dispatch the backend task
Expand All @@ -97,7 +97,7 @@ impl AsyncTool<DashMcpService> for MyNewTool {
- Skip `verify_network` only for `network_info` and `tool_describe`.
- For destructive tools (`read_only: false`), the `network` parameter **must be required** (not optional with `#[serde(default)]`). Use `resolve::require_network()` instead of `resolve::verify_network()` to prevent accidental cross-network operations that could spend funds on the wrong network.
- Skip wallet resolution if the tool doesn't operate on a wallet.
- Skip `ensure_spv_synced` if the tool reads only from the database or Platform SDK (no SPV-dependent data). For tools that only dispatch Platform state transitions (not Core UTXO spends), add an `// INTENTIONAL: no SPV sync needed` comment explaining why.
- **SPV gate rule**: Call `ensure_spv_synced` for **all wallet-facing tools** — both core-chain and platform/DAPI. The SDK verifies DAPI proofs against quorum and masternode list data from the synced SPV chain, so even platform-only queries fail without it. Skip only for metadata tools that make no network calls (`core_wallets_list`, `network_info`, `tool_describe`).

### 6. Register in `tool_router()`

Expand Down
Loading