Skip to main content

bsv/wallet/substrates/
wallet_wire_transceiver.rs

1//! WalletWireTransceiver: implements WalletInterface by serializing calls
2//! and transmitting them over a WalletWire transport.
3//!
4//! This is the client-side half of the wire protocol. Each wallet method
5//! serializes its arguments, builds a request frame, transmits via the
6//! WalletWire, reads the result frame, and deserializes the result.
7//!
8//! Translated from Go SDK wallet/substrates/wallet_wire_transceiver.go.
9
10use crate::wallet::error::WalletError;
11use crate::wallet::interfaces::*;
12use crate::wallet::serializer::frame::{read_result_frame, write_request_frame, RequestFrame};
13use crate::wallet::substrates::wallet_wire_calls::WalletWireCall;
14use crate::wallet::substrates::WalletWire;
15
16/// Implements WalletInterface by serializing each call and sending it over
17/// a WalletWire transport. Pairs with WalletWireProcessor on the server side.
18pub struct WalletWireTransceiver<W: WalletWire> {
19    wire: W,
20}
21
22impl<W: WalletWire> WalletWireTransceiver<W> {
23    /// Create a new transceiver wrapping the given wire transport.
24    pub fn new(wire: W) -> Self {
25        Self { wire }
26    }
27
28    /// Transmit a call: build frame, send over wire, read result.
29    async fn transmit(
30        &self,
31        call: WalletWireCall,
32        originator: Option<&str>,
33        params: Vec<u8>,
34    ) -> Result<Vec<u8>, WalletError> {
35        let frame = write_request_frame(&RequestFrame {
36            call: call as u8,
37            originator: originator.unwrap_or("").to_string(),
38            params,
39        });
40
41        let result = self.wire.transmit_to_wallet(&frame).await?;
42        read_result_frame(&result)
43    }
44}
45
46/// Macro to reduce boilerplate for the 28 method implementations.
47/// Pattern: serialize args -> transmit -> deserialize result.
48macro_rules! impl_wire_method {
49    // Methods with args
50    ($method:ident, $call:ident, $args_type:ty, $result_type:ty,
51     $serialize:path, $deserialize:path) => {
52        async fn $method(
53            &self,
54            args: $args_type,
55            originator: Option<&str>,
56        ) -> Result<$result_type, WalletError> {
57            let data = $serialize(&args)?;
58            let resp = self
59                .transmit(WalletWireCall::$call, originator, data)
60                .await?;
61            $deserialize(&resp)
62        }
63    };
64    // Methods without args (only originator)
65    (no_args $method:ident, $call:ident, $result_type:ty, $deserialize:path) => {
66        async fn $method(&self, originator: Option<&str>) -> Result<$result_type, WalletError> {
67            let resp = self
68                .transmit(WalletWireCall::$call, originator, Vec::new())
69                .await?;
70            $deserialize(&resp)
71        }
72    };
73}
74
75use crate::wallet::serializer::{
76    abort_action, acquire_certificate, authenticated, certificate_ser, create_action, create_hmac,
77    create_signature, decrypt, discover_by_attributes, discover_by_identity_key,
78    discover_certificates_result, encrypt, get_header, get_height, get_network, get_public_key,
79    get_version, internalize_action, list_actions, list_certificates, list_outputs,
80    prove_certificate, relinquish_certificate, relinquish_output, reveal_counterparty_key_linkage,
81    reveal_specific_key_linkage, sign_action, verify_hmac, verify_signature,
82};
83
84#[allow(async_fn_in_trait)]
85impl<W: WalletWire> WalletInterface for WalletWireTransceiver<W> {
86    impl_wire_method!(
87        create_action,
88        CreateAction,
89        CreateActionArgs,
90        CreateActionResult,
91        create_action::serialize_create_action_args,
92        create_action::deserialize_create_action_result
93    );
94
95    impl_wire_method!(
96        sign_action,
97        SignAction,
98        SignActionArgs,
99        SignActionResult,
100        sign_action::serialize_sign_action_args,
101        sign_action::deserialize_sign_action_result
102    );
103
104    impl_wire_method!(
105        abort_action,
106        AbortAction,
107        AbortActionArgs,
108        AbortActionResult,
109        abort_action::serialize_abort_action_args,
110        abort_action::deserialize_abort_action_result
111    );
112
113    impl_wire_method!(
114        list_actions,
115        ListActions,
116        ListActionsArgs,
117        ListActionsResult,
118        list_actions::serialize_list_actions_args,
119        list_actions::deserialize_list_actions_result
120    );
121
122    impl_wire_method!(
123        internalize_action,
124        InternalizeAction,
125        InternalizeActionArgs,
126        InternalizeActionResult,
127        internalize_action::serialize_internalize_action_args,
128        internalize_action::deserialize_internalize_action_result
129    );
130
131    impl_wire_method!(
132        list_outputs,
133        ListOutputs,
134        ListOutputsArgs,
135        ListOutputsResult,
136        list_outputs::serialize_list_outputs_args,
137        list_outputs::deserialize_list_outputs_result
138    );
139
140    impl_wire_method!(
141        relinquish_output,
142        RelinquishOutput,
143        RelinquishOutputArgs,
144        RelinquishOutputResult,
145        relinquish_output::serialize_relinquish_output_args,
146        relinquish_output::deserialize_relinquish_output_result
147    );
148
149    impl_wire_method!(
150        get_public_key,
151        GetPublicKey,
152        GetPublicKeyArgs,
153        GetPublicKeyResult,
154        get_public_key::serialize_get_public_key_args,
155        get_public_key::deserialize_get_public_key_result
156    );
157
158    impl_wire_method!(
159        reveal_counterparty_key_linkage,
160        RevealCounterpartyKeyLinkage,
161        RevealCounterpartyKeyLinkageArgs,
162        RevealCounterpartyKeyLinkageResult,
163        reveal_counterparty_key_linkage::serialize_reveal_counterparty_key_linkage_args,
164        reveal_counterparty_key_linkage::deserialize_reveal_counterparty_key_linkage_result
165    );
166
167    impl_wire_method!(
168        reveal_specific_key_linkage,
169        RevealSpecificKeyLinkage,
170        RevealSpecificKeyLinkageArgs,
171        RevealSpecificKeyLinkageResult,
172        reveal_specific_key_linkage::serialize_reveal_specific_key_linkage_args,
173        reveal_specific_key_linkage::deserialize_reveal_specific_key_linkage_result
174    );
175
176    impl_wire_method!(
177        encrypt,
178        Encrypt,
179        EncryptArgs,
180        EncryptResult,
181        encrypt::serialize_encrypt_args,
182        encrypt::deserialize_encrypt_result
183    );
184
185    impl_wire_method!(
186        decrypt,
187        Decrypt,
188        DecryptArgs,
189        DecryptResult,
190        decrypt::serialize_decrypt_args,
191        decrypt::deserialize_decrypt_result
192    );
193
194    impl_wire_method!(
195        create_hmac,
196        CreateHmac,
197        CreateHmacArgs,
198        CreateHmacResult,
199        create_hmac::serialize_create_hmac_args,
200        create_hmac::deserialize_create_hmac_result
201    );
202
203    impl_wire_method!(
204        verify_hmac,
205        VerifyHmac,
206        VerifyHmacArgs,
207        VerifyHmacResult,
208        verify_hmac::serialize_verify_hmac_args,
209        verify_hmac::deserialize_verify_hmac_result
210    );
211
212    impl_wire_method!(
213        create_signature,
214        CreateSignature,
215        CreateSignatureArgs,
216        CreateSignatureResult,
217        create_signature::serialize_create_signature_args,
218        create_signature::deserialize_create_signature_result
219    );
220
221    impl_wire_method!(
222        verify_signature,
223        VerifySignature,
224        VerifySignatureArgs,
225        VerifySignatureResult,
226        verify_signature::serialize_verify_signature_args,
227        verify_signature::deserialize_verify_signature_result
228    );
229
230    impl_wire_method!(
231        acquire_certificate,
232        AcquireCertificate,
233        AcquireCertificateArgs,
234        Certificate,
235        acquire_certificate::serialize_acquire_certificate_args,
236        certificate_ser::deserialize_certificate
237    );
238
239    impl_wire_method!(
240        list_certificates,
241        ListCertificates,
242        ListCertificatesArgs,
243        ListCertificatesResult,
244        list_certificates::serialize_list_certificates_args,
245        list_certificates::deserialize_list_certificates_result
246    );
247
248    impl_wire_method!(
249        prove_certificate,
250        ProveCertificate,
251        ProveCertificateArgs,
252        ProveCertificateResult,
253        prove_certificate::serialize_prove_certificate_args,
254        prove_certificate::deserialize_prove_certificate_result
255    );
256
257    impl_wire_method!(
258        relinquish_certificate,
259        RelinquishCertificate,
260        RelinquishCertificateArgs,
261        RelinquishCertificateResult,
262        relinquish_certificate::serialize_relinquish_certificate_args,
263        relinquish_certificate::deserialize_relinquish_certificate_result
264    );
265
266    impl_wire_method!(
267        discover_by_identity_key,
268        DiscoverByIdentityKey,
269        DiscoverByIdentityKeyArgs,
270        DiscoverCertificatesResult,
271        discover_by_identity_key::serialize_discover_by_identity_key_args,
272        discover_certificates_result::deserialize_discover_certificates_result
273    );
274
275    impl_wire_method!(
276        discover_by_attributes,
277        DiscoverByAttributes,
278        DiscoverByAttributesArgs,
279        DiscoverCertificatesResult,
280        discover_by_attributes::serialize_discover_by_attributes_args,
281        discover_certificates_result::deserialize_discover_certificates_result
282    );
283
284    impl_wire_method!(no_args
285        is_authenticated, IsAuthenticated, AuthenticatedResult,
286        authenticated::deserialize_is_authenticated_result
287    );
288
289    impl_wire_method!(no_args
290        wait_for_authentication, WaitForAuthentication, AuthenticatedResult,
291        authenticated::deserialize_wait_authenticated_result
292    );
293
294    impl_wire_method!(no_args
295        get_height, GetHeight, GetHeightResult,
296        get_height::deserialize_get_height_result
297    );
298
299    impl_wire_method!(
300        get_header_for_height,
301        GetHeaderForHeight,
302        GetHeaderArgs,
303        GetHeaderResult,
304        get_header::serialize_get_header_args,
305        get_header::deserialize_get_header_result
306    );
307
308    impl_wire_method!(no_args
309        get_network, GetNetwork, GetNetworkResult,
310        get_network::deserialize_get_network_result
311    );
312
313    impl_wire_method!(no_args
314        get_version, GetVersion, GetVersionResult,
315        get_version::deserialize_get_version_result
316    );
317}