@@ -10,14 +10,14 @@ pub mod types;
10
10
pub use types:: {
11
11
Balance , BuildAndSignUserOperationForPaymentRequest , BuildAndSignUserOperationResponse ,
12
12
ChainId , CheckTbaOwnershipResponse , CreateNoteResponse , CreateWalletRequest ,
13
- CreateWalletResponse , DeleteWalletRequest , DeleteWalletResponse , ErrorCode ,
13
+ CreateWalletResponse , DeleteWalletRequest , DeleteWalletResponse , Eip712Data , ErrorCode ,
14
14
ExecuteViaTbaResponse , ExportWalletRequest , ExportWalletResponse , GetBalanceRequest ,
15
15
GetBalanceResponse , GetTokenBalanceRequest , GetTokenBalanceResponse , GetWalletInfoRequest ,
16
16
GetWalletInfoResponse , HandshakeConfig , HandshakeStep , HyperwalletMessage , HyperwalletRequest ,
17
17
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 ,
21
21
SubmitUserOperationResponse , TxReceipt , UnlockWalletResponse , UpdatableSetting ,
22
22
UserOperationHash , UserOperationReceiptResponse , WalletAddress ,
23
23
} ;
@@ -47,10 +47,11 @@ pub enum HyperwalletClientError {
47
47
48
48
/// Performs the full handshake and registration protocol with the Hyperwallet service.
49
49
pub fn initialize ( config : HandshakeConfig ) -> Result < SessionInfo , HyperwalletClientError > {
50
+ const CLIENT_PROTOCOL_VERSION : & str = "0.1.0" ;
50
51
let client_name = config. client_name . expect ( "Client name is required" ) ;
51
52
52
53
let hello_step = types:: HandshakeStep :: ClientHello ( types:: ClientHello {
53
- client_version : "0.1.0" . to_string ( ) ,
54
+ client_version : CLIENT_PROTOCOL_VERSION . to_string ( ) ,
54
55
client_name,
55
56
} ) ;
56
57
let hello_message = types:: HyperwalletMessage {
@@ -71,8 +72,11 @@ pub fn initialize(config: HandshakeConfig) -> Result<SessionInfo, HyperwalletCli
71
72
}
72
73
} ;
73
74
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
+ ) ,
76
80
_ => {
77
81
return Err ( HyperwalletClientError :: ServerError (
78
82
types:: OperationError :: internal_error (
@@ -82,6 +86,19 @@ pub fn initialize(config: HandshakeConfig) -> Result<SessionInfo, HyperwalletCli
82
86
}
83
87
} ;
84
88
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
+
85
102
for required_op in & config. required_operations {
86
103
if !supported_operations. contains ( required_op) {
87
104
return Err ( HyperwalletClientError :: ServerError ( types:: OperationError {
@@ -120,14 +137,12 @@ pub fn initialize(config: HandshakeConfig) -> Result<SessionInfo, HyperwalletCli
120
137
121
138
// Extract SessionInfo using pattern matching
122
139
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
+ } ) ,
131
146
_ => Err ( HyperwalletClientError :: ServerError (
132
147
types:: OperationError :: internal_error (
133
148
"Expected Complete handshake step, received different step" ,
0 commit comments