22// SPDX-License-Identifier: Apache-2.0, MIT
33
44use crate :: lotus_json:: HasLotusJson ;
5+ use crate :: rpc:: registry:: actors:: system;
6+ use crate :: rpc:: registry:: actors_reg:: { ACTOR_REGISTRY , ActorRegistry } ;
57use crate :: shim:: machine:: BuiltinActor ;
68use crate :: shim:: message:: MethodNum ;
79use ahash:: { HashMap , HashMapExt } ;
@@ -11,8 +13,6 @@ use serde::de::DeserializeOwned;
1113use serde_json:: Value ;
1214use std:: sync:: LazyLock ;
1315
14- use crate :: rpc:: registry:: actors_reg:: { ACTOR_REGISTRY , get_actor_type_from_code} ;
15-
1616// Global registry for method parameter deserialization
1717static METHOD_REGISTRY : LazyLock < MethodRegistry > =
1818 LazyLock :: new ( MethodRegistry :: with_known_methods) ;
@@ -63,7 +63,7 @@ impl MethodRegistry {
6363 return Ok ( Some ( deserializer ( params_bytes) ?) ) ;
6464 }
6565
66- let ( actor_type, version) = get_actor_type_from_code ( code_cid) ?;
66+ let ( actor_type, version) = ActorRegistry :: get_actor_details_from_code ( code_cid) ?;
6767
6868 bail ! (
6969 "No deserializer registered for actor type {:?} (v{}), method {}" ,
@@ -82,6 +82,7 @@ impl MethodRegistry {
8282 BuiltinActor :: Miner => miner:: register_miner_actor_methods ( self , cid) ,
8383 BuiltinActor :: EVM => evm:: register_evm_actor_methods ( self , cid) ,
8484 BuiltinActor :: Init => init:: register_actor_methods ( self , cid) ,
85+ BuiltinActor :: System => system:: register_actor_methods ( self , cid) ,
8586 _ => { }
8687 }
8788 }
@@ -97,6 +98,25 @@ pub fn deserialize_params(
9798}
9899
99100macro_rules! register_actor_methods {
101+ // Handle empty params case
102+ ( $registry: expr, $code_cid: expr, [
103+ $( ( $method: expr, empty) ) ,* $( , ) ?
104+ ] ) => {
105+ $(
106+ $registry. register_method(
107+ $code_cid,
108+ $method as MethodNum ,
109+ |bytes| -> anyhow:: Result <( ) > {
110+ if bytes. is_empty( ) {
111+ Ok ( ( ) )
112+ } else {
113+ Ok ( fvm_ipld_encoding:: from_slice( bytes) ?)
114+ }
115+ } ,
116+ ) ;
117+ ) *
118+ } ;
119+
100120 ( $registry: expr, $code_cid: expr, [
101121 $( ( $method: expr, $param_type: ty) ) ,* $( , ) ?
102122 ] ) => {
@@ -250,21 +270,6 @@ mod test {
250270 }
251271 }
252272
253- #[ test]
254- fn test_unsupported_actor_types ( ) {
255- // Test actors that are not registered in the method registry
256- if let Some ( system_cid) = get_real_actor_cid ( BuiltinActor :: System ) {
257- let method_num = 1 ;
258-
259- let result = deserialize_params ( & system_cid, method_num, & [ ] ) ;
260- assert ! ( result. is_err( ) ) ;
261-
262- let error_msg = result. unwrap_err ( ) . to_string ( ) ;
263- assert ! ( error_msg. contains( "No deserializer registered for actor type" ) ) ;
264- assert ! ( error_msg. contains( "System" ) ) ;
265- }
266- }
267-
268273 #[ test]
269274 fn test_register_actor_methods_macro ( ) {
270275 let mut registry = MethodRegistry :: new ( ) ;
@@ -292,4 +297,15 @@ mod test {
292297 let result3 = registry. deserialize_params ( & test_cid, 3 , & encoded) ;
293298 assert ! ( result3. is_err( ) ) ;
294299 }
300+
301+ #[ test]
302+ fn test_system_actor_deserialize_params_cbor_null ( ) {
303+ let system_cid = get_real_actor_cid ( BuiltinActor :: System )
304+ . expect ( "Should have System actor CID in registry" ) ;
305+
306+ // Test with null data
307+ let result = deserialize_params ( & system_cid, 1 , & [ ] ) ;
308+
309+ assert ! ( result. is_ok( ) , "Should handle CBOR null: {result:?}" ) ;
310+ }
295311}
0 commit comments