async_hwi/jade/
api.rs

1/// See https://github.com/Blockstream/Jade/blob/master/docs/index.rst
2use serde::{Deserialize, Serialize};
3use std::collections::BTreeMap;
4
5use super::{JadeError, TransportError};
6
7#[derive(Debug, Serialize, Deserialize)]
8pub struct Request<'a, T: Serialize> {
9    pub id: &'a str,
10    pub method: &'a str,
11    pub params: Option<T>,
12}
13
14#[derive(Debug, Serialize, Deserialize)]
15pub struct EmptyRequest;
16
17#[derive(Debug, Serialize, Deserialize)]
18pub struct Response<T> {
19    pub id: String,
20    pub seqlen: Option<u32>,
21    pub seqnum: Option<u32>,
22    pub result: Option<T>,
23    pub error: Option<Error>,
24}
25
26impl<T> Response<T> {
27    pub fn into_result(self) -> Result<T, JadeError> {
28        if let Some(e) = self.error {
29            return Err(JadeError::Rpc(e));
30        }
31
32        self.result
33            .ok_or_else(|| TransportError::NoErrorOrResult.into())
34    }
35}
36
37#[derive(Debug, PartialEq, Eq)]
38#[repr(i32)]
39pub enum ErrorCode {
40    InvalidRequest = -32600,
41    UnknownMethod = -32601,
42    BadParameters = -32602,
43    InternalError = -32603,
44    UserCancelled = -32000,
45    ProtocolError = -32001,
46    HwLocked = -32002,
47    NetworkMismatch = -32003,
48}
49
50#[derive(Debug, Serialize, Deserialize)]
51pub struct Error {
52    pub code: i32,
53    pub message: Option<String>,
54    pub data: Option<Vec<u8>>,
55}
56
57#[derive(Debug, Serialize, Deserialize)]
58pub struct GetXpubParams<'a> {
59    pub network: &'a str,
60    pub path: Vec<u32>,
61}
62
63#[derive(Debug, Serialize, Deserialize)]
64pub struct AuthUserParams<'a> {
65    pub network: &'a str,
66    pub epoch: u64,
67}
68
69#[derive(Debug, Serialize, Deserialize)]
70#[serde(untagged)]
71pub enum AuthUserResponse {
72    Authenticated(bool),
73    PinServerRequired { http_request: PinServerRequest },
74}
75
76#[derive(Debug, Serialize, Deserialize)]
77pub struct PinServerRequest {
78    pub params: PinServerRequestParams,
79    #[serde(alias = "on-reply")]
80    pub onreply: String,
81}
82
83#[derive(Debug, Serialize, Deserialize)]
84pub struct PinServerRequestParams {
85    pub urls: PinServerUrls,
86    pub method: String,
87    pub accept: String,
88    pub data: PinParams,
89}
90
91#[derive(Debug, Serialize, Deserialize)]
92#[serde(untagged)]
93pub enum PinServerUrls {
94    Array(Vec<String>),
95    Object { url: String, onion: String },
96}
97
98#[derive(Debug, Serialize, Deserialize)]
99pub struct PinParams {
100    pub data: String,
101}
102
103#[derive(Debug, Serialize, Deserialize)]
104pub struct GetInfoResponse {
105    #[serde(alias = "JADE_VERSION")]
106    pub jade_version: String,
107    #[serde(alias = "JADE_STATE")]
108    pub jade_state: JadeState,
109    #[serde(alias = "JADE_NETWORKS")]
110    pub jade_networks: JadeNetworks,
111}
112
113#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
114pub enum JadeState {
115    #[serde(alias = "UNINIT")]
116    Uninit,
117    #[serde(alias = "UNSAVED")]
118    Unsaved,
119    #[serde(alias = "LOCKED")]
120    Locked,
121    #[serde(alias = "READY")]
122    Ready,
123    #[serde(alias = "TEMP")]
124    Temp,
125}
126
127#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
128pub enum JadeNetworks {
129    #[serde(alias = "MAIN")]
130    Main,
131    #[serde(alias = "TEST")]
132    Test,
133    #[serde(alias = "ALL")]
134    All,
135}
136
137#[derive(Debug, Serialize, Deserialize)]
138pub struct DescriptorInfoResponse {
139    pub descriptor_len: u32,
140    pub num_datavalues: u32,
141}
142
143#[derive(Debug, Serialize, Deserialize)]
144pub struct GetRegisteredDescriptorParams<'a> {
145    pub descriptor_name: &'a str,
146}
147
148#[derive(Debug, Serialize, Deserialize)]
149pub struct GetRegisteredDescriptorResponse {
150    pub descriptor_name: String,
151    pub descriptor: String,
152    pub datavalues: BTreeMap<String, String>,
153}
154
155#[derive(Debug, Serialize, Deserialize)]
156pub struct RegisterDescriptorParams<'a> {
157    pub network: &'a str,
158    pub descriptor_name: &'a str,
159    pub descriptor: String,
160    pub datavalues: BTreeMap<String, String>,
161}
162
163#[derive(Debug, Serialize, Deserialize)]
164pub struct DescriptorAddressParams<'a> {
165    pub network: &'a str,
166    pub branch: u32,
167    pub pointer: u32,
168    pub descriptor_name: &'a str,
169}
170
171#[derive(Debug, Serialize, Deserialize)]
172pub struct SignPsbtParams<'a> {
173    pub network: &'a str,
174    #[serde(with = "serde_bytes")]
175    pub psbt: Vec<u8>,
176}
177
178#[derive(Debug, Serialize, Deserialize)]
179pub struct GetExtendedDataParams<'a> {
180    pub origid: &'a str,
181    pub orig: &'a str,
182    pub seqnum: u32,
183    pub seqlen: u32,
184}
185
186#[derive(Debug, Serialize, Deserialize)]
187pub struct ResponseBytes {
188    pub id: String,
189    pub seqlen: Option<u32>,
190    pub seqnum: Option<u32>,
191    #[serde(with = "serde_bytes")]
192    pub result: Option<Vec<u8>>,
193    pub error: Option<Error>,
194}