mirror of
https://github.com/Such-Software/smirk-backend-core.git
synced 2026-10-17 07:21:32 +02:00
feat: XMR/WOW wallet handlers (LWS proxy, stateless-forward)
Second wallet-handler slice. Authenticated, non-custodial, stateless-forward proxies over the LwsClient: the wallet sends its private view key per request, the backend forwards it (never stores it; the LWS holds it for scanning), and the wallet constructs + signs spends locally. Endpoints (POST, under /api/v1/wallet/lws, asset = xmr|wow in body): - register -> add/import account (view key) for LWS scanning (+start_height) - balance -> total_received / unlocked / locked + scan state - history -> txs incl. mempool pending + candidate spent_outputs - unspent_outs -> outputs + fee params for client-side spend construction - random_outs -> ring decoys (count clamped + fan-out capped in the client) - submit_tx -> broadcast a finalized signed tx - height -> daemon chain height - confirmations-> tx confirmation count - JWT-gated; the view key is skipped from every tracing span (never logged) and never stored. Feature-gated dispatch; unknown/disabled asset -> 400. - Boundary validation: view_key (64 hex), address (bounded), txid (64 hex), tx_hex (even hex, <=2 MiB) — all before any LWS call. - Shared validators in wallet/mod.rs (validate_hex/view_key/cn_address). - Colliding DTO names disambiguated (Lws-prefixed) so the openapi schema registry stays correct; 8 paths + schemas + xmr_wow tag registered; spec regenerated, drift-clean. 6 L1 integration tests (auth gate on balance/register; unknown-asset, bad-view-key, malformed-tx-hex, malformed-txid 400s) + validator unit tests.
This commit is contained in:
+28
-1
@@ -38,6 +38,14 @@ use utoipa::OpenApi;
|
||||
crate::api::wallet::btc_ltc::tip,
|
||||
crate::api::wallet::btc_ltc::fee,
|
||||
crate::api::wallet::btc_ltc::broadcast,
|
||||
crate::api::wallet::xmr_wow::register,
|
||||
crate::api::wallet::xmr_wow::balance,
|
||||
crate::api::wallet::xmr_wow::history,
|
||||
crate::api::wallet::xmr_wow::unspent_outs,
|
||||
crate::api::wallet::xmr_wow::random_outs,
|
||||
crate::api::wallet::xmr_wow::submit_tx,
|
||||
crate::api::wallet::xmr_wow::height,
|
||||
crate::api::wallet::xmr_wow::confirmations,
|
||||
crate::api::nip05::well_known_nostr,
|
||||
),
|
||||
components(schemas(
|
||||
@@ -77,12 +85,31 @@ use utoipa::OpenApi;
|
||||
crate::api::wallet::btc_ltc::FeeResponse,
|
||||
crate::api::wallet::btc_ltc::BroadcastRequest,
|
||||
crate::api::wallet::btc_ltc::BroadcastResponse,
|
||||
crate::api::wallet::xmr_wow::ViewRequest,
|
||||
crate::api::wallet::xmr_wow::RegisterRequest,
|
||||
crate::api::wallet::xmr_wow::RandomOutsRequest,
|
||||
crate::api::wallet::xmr_wow::SubmitRequest,
|
||||
crate::api::wallet::xmr_wow::LwsAssetRequest,
|
||||
crate::api::wallet::xmr_wow::ConfirmationsRequest,
|
||||
crate::api::wallet::xmr_wow::LwsBalanceResponse,
|
||||
crate::api::wallet::xmr_wow::SpentOutputDto,
|
||||
crate::api::wallet::xmr_wow::TxDto,
|
||||
crate::api::wallet::xmr_wow::LwsHistoryResponse,
|
||||
crate::api::wallet::xmr_wow::UnspentOutputDto,
|
||||
crate::api::wallet::xmr_wow::UnspentOutsResponse,
|
||||
crate::api::wallet::xmr_wow::RandomOutputDto,
|
||||
crate::api::wallet::xmr_wow::AmountOutsDto,
|
||||
crate::api::wallet::xmr_wow::RandomOutsResponse,
|
||||
crate::api::wallet::xmr_wow::HeightResponse,
|
||||
crate::api::wallet::xmr_wow::ConfirmationsResponse,
|
||||
crate::api::wallet::xmr_wow::OkResponse,
|
||||
crate::api::nip05::WellKnownResponse,
|
||||
)),
|
||||
tags(
|
||||
(name = "system", description = "Service health and metadata."),
|
||||
(name = "auth", description = "Wallet authentication: registration, restore, refresh, sessions, Nostr identity."),
|
||||
(name = "btc_ltc", description = "Bitcoin/Litecoin chain access via Electrum (balance, UTXOs, history, tip, fee, broadcast).")
|
||||
(name = "btc_ltc", description = "Bitcoin/Litecoin chain access via Electrum (balance, UTXOs, history, tip, fee, broadcast)."),
|
||||
(name = "xmr_wow", description = "Monero/Wownero chain access via LWS (register, balance, history, unspent/random outs, submit, height, confirmations).")
|
||||
)
|
||||
)]
|
||||
pub struct ApiDoc;
|
||||
|
||||
Reference in New Issue
Block a user