@@ -4,27 +4,52 @@ use std::time::Duration;
44use http:: { HeaderName , HeaderValue } ;
55use sui_rpc:: field:: { FieldMask , FieldMaskUtil as _} ;
66use sui_rpc:: proto:: sui:: rpc:: v2:: {
7- GetCheckpointRequest , GetCheckpointResponse , GetServiceInfoRequest , GetServiceInfoResponse ,
8- GetTransactionRequest , GetTransactionResponse , get_checkpoint_request:: CheckpointId ,
7+ Checkpoint , ExecutedTransaction , GetCheckpointRequest , GetCheckpointResponse ,
8+ GetServiceInfoRequest , GetServiceInfoResponse , GetTransactionRequest , GetTransactionResponse ,
9+ get_checkpoint_request:: CheckpointId ,
910} ;
1011
1112pub use sui_rpc:: proto:: sui:: rpc:: v2 as proto;
1213pub use tonic:: { Code , Status } ;
1314
14- /// The exact fields the inspector verifies.
15- const TRANSACTION_READ_MASK : & [ & str ] = & [
16- "digest" ,
17- "checkpoint" ,
18- "effects.status" ,
19- "events.events.package_id" ,
20- "events.events.module" ,
21- "events.events.sender" ,
22- "events.events.event_type" ,
23- "events.events.contents" ,
24- ] ;
25-
26- /// Sections needed to pick a probe transaction from a checkpoint.
27- const CHECKPOINT_READ_MASK : & [ & str ] = & [ "sequence_number" , "transactions.digest" ] ;
15+ fn transaction_read_mask ( ) -> FieldMask {
16+ FieldMask :: from_paths ( [
17+ ExecutedTransaction :: path_builder ( ) . digest ( ) ,
18+ ExecutedTransaction :: path_builder ( ) . checkpoint ( ) ,
19+ ExecutedTransaction :: path_builder ( )
20+ . effects ( )
21+ . status ( )
22+ . finish ( ) ,
23+ ExecutedTransaction :: path_builder ( )
24+ . events ( )
25+ . events ( )
26+ . package_id ( ) ,
27+ ExecutedTransaction :: path_builder ( )
28+ . events ( )
29+ . events ( )
30+ . module ( ) ,
31+ ExecutedTransaction :: path_builder ( )
32+ . events ( )
33+ . events ( )
34+ . sender ( ) ,
35+ ExecutedTransaction :: path_builder ( )
36+ . events ( )
37+ . events ( )
38+ . event_type ( ) ,
39+ ExecutedTransaction :: path_builder ( )
40+ . events ( )
41+ . events ( )
42+ . contents ( )
43+ . finish ( ) ,
44+ ] )
45+ }
46+
47+ fn checkpoint_read_mask ( ) -> FieldMask {
48+ FieldMask :: from_paths ( [
49+ Checkpoint :: path_builder ( ) . sequence_number ( ) ,
50+ Checkpoint :: path_builder ( ) . transactions ( ) . digest ( ) ,
51+ ] )
52+ }
2853
2954/// Client interface for the Sui gRPC API (`sui.rpc.v2.LedgerService`).
3055pub trait SuiRpcClient : Send + Sync {
@@ -87,7 +112,7 @@ impl SuiRpcClient for GrpcSuiClient {
87112 let request = self . request_with_timeout (
88113 GetTransactionRequest :: default ( )
89114 . with_digest ( digest)
90- . with_read_mask ( FieldMask :: from_paths ( TRANSACTION_READ_MASK . iter ( ) . copied ( ) ) ) ,
115+ . with_read_mask ( transaction_read_mask ( ) ) ,
91116 ) ;
92117 async move {
93118 let response = client. ledger_client ( ) . get_transaction ( request) . await ?;
@@ -111,8 +136,7 @@ impl SuiRpcClient for GrpcSuiClient {
111136 sequence_number : u64 ,
112137 ) -> impl Future < Output = Result < GetCheckpointResponse , Status > > + Send {
113138 let mut client = self . client . clone ( ) ;
114- let mut message = GetCheckpointRequest :: default ( )
115- . with_read_mask ( FieldMask :: from_paths ( CHECKPOINT_READ_MASK . iter ( ) . copied ( ) ) ) ;
139+ let mut message = GetCheckpointRequest :: default ( ) . with_read_mask ( checkpoint_read_mask ( ) ) ;
116140 message. checkpoint_id = Some ( CheckpointId :: SequenceNumber ( sequence_number) ) ;
117141 let request = self . request_with_timeout ( message) ;
118142 async move {
@@ -166,13 +190,30 @@ mod tests {
166190
167191 #[ test]
168192 fn transaction_read_mask__should_request_only_verified_sections ( ) {
169- // Given / When
170- let request = GetTransactionRequest :: default ( )
171- . with_digest ( "digest" )
172- . with_read_mask ( FieldMask :: from_paths ( TRANSACTION_READ_MASK . iter ( ) . copied ( ) ) ) ;
193+ // Then — pins that the typed path builders produce exactly the wire paths the server
194+ // honors (the live manual test proves those paths return the expected fields), and that
195+ // the events' `json` rendering is not among them.
196+ assert_eq ! (
197+ transaction_read_mask( ) . paths,
198+ vec![
199+ "digest" ,
200+ "checkpoint" ,
201+ "effects.status" ,
202+ "events.events.package_id" ,
203+ "events.events.module" ,
204+ "events.events.sender" ,
205+ "events.events.event_type" ,
206+ "events.events.contents" ,
207+ ]
208+ ) ;
209+ }
173210
211+ #[ test]
212+ fn checkpoint_read_mask__should_request_only_probe_sections ( ) {
174213 // Then
175- assert_eq ! ( request. digest. as_deref( ) , Some ( "digest" ) ) ;
176- assert_eq ! ( request. read_mask. unwrap( ) . paths, TRANSACTION_READ_MASK ) ;
214+ assert_eq ! (
215+ checkpoint_read_mask( ) . paths,
216+ vec![ "sequence_number" , "transactions.digest" ]
217+ ) ;
177218 }
178219}
0 commit comments