@@ -383,7 +383,7 @@ fn encode_value(typ: &MemberType, value: &Value) -> Result<Vec<u8>, String> {
383383fn get_value (
384384 what : & pb:: EthTypedMessageValueResponse ,
385385 msg : & Eip712Message ,
386- ) -> Result < Vec < u8 > , String > {
386+ ) -> Result < ( Vec < u8 > , DataType ) , String > {
387387 enum Either < ' a > {
388388 HashMap ( & ' a HashMap < String , Value > ) ,
389389 JsonValue ( Value ) ,
@@ -446,8 +446,10 @@ fn get_value(
446446 _ => return Err ( "path element does not point to struct or array" . into ( ) ) ,
447447 }
448448 }
449+ let data_type =
450+ DataType :: try_from ( typ. r#type ) . map_err ( |_| format ! ( "invalid data type: {}" , typ. r#type) ) ?;
449451 if let Either :: JsonValue ( value) = & value {
450- encode_value ( & typ, value)
452+ encode_value ( & typ, value) . map ( |v| ( v , data_type ) )
451453 } else {
452454 Err ( "path points to struct or array; value expected" . to_string ( ) )
453455 }
@@ -700,12 +702,25 @@ impl<R: Runtime> PairedBitBox<R> {
700702 ) )
701703 . await ?;
702704 while let pb:: eth_response:: Response :: TypedMsgValue ( typed_msg_value) = & response {
703- let value = get_value ( typed_msg_value, & msg) . map_err ( Error :: EthTypedMessage ) ?;
705+ let ( value, data_type) =
706+ get_value ( typed_msg_value, & msg) . map_err ( Error :: EthTypedMessage ) ?;
707+ if data_type == DataType :: String && value. len ( ) > STREAMING_THRESHOLD {
708+ return Err ( Error :: EthTypedMessage (
709+ "string value exceeds maximum size" . into ( ) ,
710+ ) ) ;
711+ }
712+ let use_streaming = value. len ( ) > STREAMING_THRESHOLD ;
704713 response = self
705714 . query_proto_eth ( pb:: eth_request:: Request :: TypedMsgValue (
706- pb:: EthTypedMessageValueRequest { value } ,
715+ pb:: EthTypedMessageValueRequest {
716+ value : if use_streaming { vec ! [ ] } else { value. clone ( ) } ,
717+ data_length : if use_streaming { value. len ( ) as u32 } else { 0 } ,
718+ } ,
707719 ) )
708720 . await ?;
721+ if use_streaming {
722+ response = self . handle_eth_data_streaming ( & value, response) . await ?;
723+ }
709724 }
710725 let mut signature = if use_antiklepto {
711726 self . handle_antiklepto ( & response, host_nonce. unwrap ( ) )
@@ -1224,7 +1239,7 @@ mod tests {
12241239 . is_err( ) ) ;
12251240
12261241 // domain.name
1227- let value = get_value (
1242+ let ( value, _ ) = get_value (
12281243 & pb:: EthTypedMessageValueResponse {
12291244 root_object : RootObject :: Domain as _ ,
12301245 path : vec ! [ 0 ] ,
@@ -1235,7 +1250,7 @@ mod tests {
12351250 assert_eq ! ( value, b"Ether Mail" . to_vec( ) ) ;
12361251
12371252 // domain.version
1238- let value = get_value (
1253+ let ( value, _ ) = get_value (
12391254 & pb:: EthTypedMessageValueResponse {
12401255 root_object : RootObject :: Domain as _ ,
12411256 path : vec ! [ 1 ] ,
@@ -1246,7 +1261,7 @@ mod tests {
12461261 assert_eq ! ( value, b"1" . to_vec( ) ) ;
12471262
12481263 // domain.chainId
1249- let value = get_value (
1264+ let ( value, _ ) = get_value (
12501265 & pb:: EthTypedMessageValueResponse {
12511266 root_object : RootObject :: Domain as _ ,
12521267 path : vec ! [ 2 ] ,
@@ -1257,7 +1272,7 @@ mod tests {
12571272 assert_eq ! ( value, b"\x01 " . to_vec( ) ) ;
12581273
12591274 // domain.verifyingContract
1260- let value = get_value (
1275+ let ( value, _ ) = get_value (
12611276 & pb:: EthTypedMessageValueResponse {
12621277 root_object : RootObject :: Domain as _ ,
12631278 path : vec ! [ 3 ] ,
@@ -1282,7 +1297,7 @@ mod tests {
12821297 // MESSAGE
12831298
12841299 // message.from.name
1285- let value = get_value (
1300+ let ( value, _ ) = get_value (
12861301 & pb:: EthTypedMessageValueResponse {
12871302 root_object : RootObject :: Message as _ ,
12881303 path : vec ! [ 0 , 0 ] ,
@@ -1293,7 +1308,7 @@ mod tests {
12931308 assert_eq ! ( value, b"Cow" . to_vec( ) ) ;
12941309
12951310 // message.from.wallet
1296- let value = get_value (
1311+ let ( value, _ ) = get_value (
12971312 & pb:: EthTypedMessageValueResponse {
12981313 root_object : RootObject :: Message as _ ,
12991314 path : vec ! [ 0 , 1 ] ,
@@ -1307,7 +1322,7 @@ mod tests {
13071322 ) ;
13081323
13091324 // message.to.wallet
1310- let value = get_value (
1325+ let ( value, _ ) = get_value (
13111326 & pb:: EthTypedMessageValueResponse {
13121327 root_object : RootObject :: Message as _ ,
13131328 path : vec ! [ 1 , 1 ] ,
@@ -1321,7 +1336,7 @@ mod tests {
13211336 ) ;
13221337
13231338 // message.attachments.0.contents
1324- let value = get_value (
1339+ let ( value, _ ) = get_value (
13251340 & pb:: EthTypedMessageValueResponse {
13261341 root_object : RootObject :: Message as _ ,
13271342 path : vec ! [ 3 , 0 , 0 ] ,
@@ -1332,7 +1347,7 @@ mod tests {
13321347 assert_eq ! ( value, b"attachment1" . to_vec( ) ) ;
13331348
13341349 // message.attachments.1.contents
1335- let value = get_value (
1350+ let ( value, _ ) = get_value (
13361351 & pb:: EthTypedMessageValueResponse {
13371352 root_object : RootObject :: Message as _ ,
13381353 path : vec ! [ 3 , 1 , 0 ] ,
0 commit comments