1
1
// Copyright 2019-2022 ChainSafe Systems
2
2
// SPDX-License-Identifier: Apache-2.0, MIT
3
- use cid:: Cid ;
3
+ use cid:: { multihash , Cid } ;
4
4
use fvm_shared:: blockstore:: { Blockstore , CborStore } ;
5
+ use fvm_shared:: encoding:: tuple:: * ;
5
6
use fvm_shared:: encoding:: { Cbor , RawBytes } ;
7
+ use fvm_shared:: error:: ExitCode ;
6
8
use fvm_shared:: { MethodNum , METHOD_CONSTRUCTOR } ;
7
9
use num_derive:: FromPrimitive ;
8
10
use num_traits:: FromPrimitive ;
9
- use serde:: { Deserialize , Serialize } ;
10
11
11
12
use fil_actors_runtime:: runtime:: { ActorCode , Runtime } ;
12
- use fil_actors_runtime:: { actor_error, ActorError , SYSTEM_ACTOR_ADDR } ;
13
+ use fil_actors_runtime:: { actor_error, ActorDowncast , ActorError , SYSTEM_ACTOR_ADDR } ;
13
14
14
15
#[ cfg( feature = "fil-actor" ) ]
15
16
fil_actors_runtime:: wasm_trampoline!( Actor ) ;
@@ -24,11 +25,10 @@ pub enum Method {
24
25
}
25
26
26
27
/// System actor state.
27
- #[ derive( Default , Deserialize , Serialize ) ]
28
- #[ serde( transparent) ]
28
+ #[ derive( Default , Deserialize_tuple , Serialize_tuple ) ]
29
29
pub struct State {
30
30
// builtin actor registry: Vec<(String, Cid)>
31
- builtin_actors : Cid ,
31
+ pub builtin_actors : Cid ,
32
32
}
33
33
impl Cbor for State { }
34
34
@@ -56,7 +56,14 @@ impl Actor {
56
56
{
57
57
rt. validate_immediate_caller_is ( std:: iter:: once ( & * SYSTEM_ACTOR_ADDR ) ) ?;
58
58
59
- rt. create ( & State :: default ( ) ) ?;
59
+ let c = rt
60
+ . store ( )
61
+ . put_cbor ( & Vec :: < ( String , Cid ) > :: new ( ) , multihash:: Code :: Blake2b256 )
62
+ . map_err ( |e| {
63
+ e. downcast_default ( ExitCode :: ErrIllegalState , "failed to construct state" )
64
+ } ) ?;
65
+
66
+ rt. create ( & State { builtin_actors : c } ) ?;
60
67
Ok ( ( ) )
61
68
}
62
69
}
@@ -89,7 +96,7 @@ mod tests {
89
96
use fil_actors_runtime:: test_utils:: { MockRuntime , SYSTEM_ACTOR_CODE_ID } ;
90
97
use fil_actors_runtime:: SYSTEM_ACTOR_ADDR ;
91
98
92
- use crate :: { Actor , Cid , Method , State } ;
99
+ use crate :: { Actor , Method , State } ;
93
100
94
101
pub fn new_runtime ( ) -> MockRuntime {
95
102
MockRuntime {
@@ -108,6 +115,7 @@ mod tests {
108
115
rt. call :: < Actor > ( Method :: Constructor as MethodNum , & RawBytes :: default ( ) ) . unwrap ( ) ;
109
116
110
117
let state: State = rt. get_state ( ) . unwrap ( ) ;
111
- assert_eq ! ( state. builtin_actors, Cid :: default ( ) ) ;
118
+ let builtin_actors = state. get_builtin_actors ( & rt. store ) . unwrap ( ) ;
119
+ assert ! ( builtin_actors. is_empty( ) ) ;
112
120
}
113
121
}
0 commit comments