@@ -10,14 +10,14 @@ pub mod types;
1010pub use types:: {
1111 Balance , BuildAndSignUserOperationForPaymentRequest , BuildAndSignUserOperationResponse ,
1212 ChainId , CheckTbaOwnershipResponse , CreateNoteResponse , CreateWalletRequest ,
13- CreateWalletResponse , DeleteWalletRequest , DeleteWalletResponse , ErrorCode ,
13+ CreateWalletResponse , DeleteWalletRequest , DeleteWalletResponse , Eip712Data , ErrorCode ,
1414 ExecuteViaTbaResponse , ExportWalletRequest , ExportWalletResponse , GetBalanceRequest ,
1515 GetBalanceResponse , GetTokenBalanceRequest , GetTokenBalanceResponse , GetWalletInfoRequest ,
1616 GetWalletInfoResponse , HandshakeConfig , HandshakeStep , HyperwalletMessage , HyperwalletRequest ,
1717 HyperwalletResponse , HyperwalletResponseData , ImportWalletRequest , ImportWalletResponse ,
18- ListWalletsResponse , Operation , OperationCategory , OperationError , PaymasterConfig ,
19- ProcessAddress , ProcessPermissions , RenameWalletRequest , SendEthRequest , SendEthResponse ,
20- SendTokenRequest , SendTokenResponse , SessionId , SessionInfo , SpendingLimits ,
18+ ListWalletsResponse , MessageType , Operation , OperationCategory , OperationError ,
19+ PaymasterConfig , ProcessAddress , ProcessPermissions , RenameWalletRequest , SendEthRequest ,
20+ SendEthResponse , SendTokenRequest , SendTokenResponse , SessionId , SessionInfo , SpendingLimits ,
2121 SubmitUserOperationResponse , TxReceipt , UnlockWalletResponse , UpdatableSetting ,
2222 UserOperationHash , UserOperationReceiptResponse , WalletAddress ,
2323} ;
@@ -47,10 +47,11 @@ pub enum HyperwalletClientError {
4747
4848/// Performs the full handshake and registration protocol with the Hyperwallet service.
4949pub fn initialize ( config : HandshakeConfig ) -> Result < SessionInfo , HyperwalletClientError > {
50+ const CLIENT_PROTOCOL_VERSION : & str = "0.1.0" ;
5051 let client_name = config. client_name . expect ( "Client name is required" ) ;
5152
5253 let hello_step = types:: HandshakeStep :: ClientHello ( types:: ClientHello {
53- client_version : "0.1.0" . to_string ( ) ,
54+ client_version : CLIENT_PROTOCOL_VERSION . to_string ( ) ,
5455 client_name,
5556 } ) ;
5657 let hello_message = types:: HyperwalletMessage {
@@ -71,8 +72,11 @@ pub fn initialize(config: HandshakeConfig) -> Result<SessionInfo, HyperwalletCli
7172 }
7273 } ;
7374
74- let supported_operations = match welcome_step {
75- types:: HandshakeStep :: ServerWelcome ( server_welcome) => server_welcome. supported_operations ,
75+ let ( server_version, supported_operations) = match welcome_step {
76+ types:: HandshakeStep :: ServerWelcome ( server_welcome) => (
77+ server_welcome. server_version ,
78+ server_welcome. supported_operations ,
79+ ) ,
7680 _ => {
7781 return Err ( HyperwalletClientError :: ServerError (
7882 types:: OperationError :: internal_error (
@@ -82,6 +86,19 @@ pub fn initialize(config: HandshakeConfig) -> Result<SessionInfo, HyperwalletCli
8286 }
8387 } ;
8488
89+ // Basic protocol version negotiation: require matching major version
90+ let client_major = CLIENT_PROTOCOL_VERSION
91+ . split ( '.' )
92+ . next ( )
93+ . unwrap_or ( CLIENT_PROTOCOL_VERSION ) ;
94+ let server_major = server_version. split ( '.' ) . next ( ) . unwrap_or ( & server_version) ;
95+ if client_major != server_major {
96+ return Err ( HyperwalletClientError :: VersionMismatch {
97+ client : CLIENT_PROTOCOL_VERSION . to_string ( ) ,
98+ server : server_version,
99+ } ) ;
100+ }
101+
85102 for required_op in & config. required_operations {
86103 if !supported_operations. contains ( required_op) {
87104 return Err ( HyperwalletClientError :: ServerError ( types:: OperationError {
@@ -120,14 +137,12 @@ pub fn initialize(config: HandshakeConfig) -> Result<SessionInfo, HyperwalletCli
120137
121138 // Extract SessionInfo using pattern matching
122139 match complete_step {
123- types:: HandshakeStep :: Complete ( complete_handshake) => {
124- Ok ( types:: SessionInfo {
125- server_version : "0.1.0" . to_string ( ) , //lol, server should send it's version
126- session_id : complete_handshake. session_id ,
127- registered_permissions : complete_handshake. registered_permissions ,
128- initial_chain_id : config. initial_chain_id ,
129- } )
130- }
140+ types:: HandshakeStep :: Complete ( complete_handshake) => Ok ( types:: SessionInfo {
141+ server_version,
142+ session_id : complete_handshake. session_id ,
143+ registered_permissions : complete_handshake. registered_permissions ,
144+ initial_chain_id : config. initial_chain_id ,
145+ } ) ,
131146 _ => Err ( HyperwalletClientError :: ServerError (
132147 types:: OperationError :: internal_error (
133148 "Expected Complete handshake step, received different step" ,
0 commit comments