1- use fil_actors_runtime:: INIT_ACTOR_ADDR ;
2- use fil_actors_runtime:: test_utils:: * ;
1+ use fil_actors_runtime:: reward:: FilterEstimate ;
2+ use fil_actors_runtime:: { INIT_ACTOR_ADDR , REWARD_ACTOR_ADDR } ;
3+ use fil_actors_runtime:: { STORAGE_POWER_ACTOR_ADDR , test_utils:: * } ;
34
45use fil_actor_account:: Method as AccountMethod ;
56use fil_actor_miner:: {
67 Actor , Deadline , Deadlines , Method , MinerConstructorParams as ConstructorParams , State ,
78} ;
9+ use fil_actor_power:: { CurrentTotalPowerReturn , Method as PowerMethod } ;
10+ use fil_actor_reward:: { Method as RewardMethod , ThisEpochRewardReturn } ;
811
912use fvm_ipld_encoding:: { BytesDe , CborStore } ;
1013use fvm_shared:: address:: Address ;
14+ use fvm_shared:: bigint:: BigInt ;
1115use fvm_shared:: econ:: TokenAmount ;
1216use fvm_shared:: error:: ExitCode ;
13- use fvm_shared:: sector:: { RegisteredPoStProof , SectorSize } ;
17+ use fvm_shared:: sector:: { RegisteredPoStProof , SectorSize , StoragePower } ;
1418
1519use cid:: Cid ;
1620use fvm_ipld_encoding:: ipld_block:: IpldBlock ;
17- use num_traits:: Zero ;
21+ use num_traits:: { FromPrimitive , Zero } ;
1822
1923mod util;
24+ use util:: create_miner_deposit_for_test;
2025
2126#[ allow( dead_code) ]
2227struct TestEnv {
@@ -27,10 +32,16 @@ struct TestEnv {
2732 control_addrs : Vec < Address > ,
2833 peer_id : Vec < u8 > ,
2934 multiaddrs : Vec < BytesDe > ,
35+ power : StoragePower ,
36+ reward : TokenAmount ,
37+ epoch_reward_smooth : FilterEstimate ,
3038 rt : MockRuntime ,
3139}
3240
3341fn prepare_env ( ) -> TestEnv {
42+ let reward = TokenAmount :: from_whole ( 10 ) ;
43+ let power = StoragePower :: from_i128 ( 1 << 50 ) . unwrap ( ) ;
44+ let epoch_reward_smooth = FilterEstimate :: new ( reward. atto ( ) . clone ( ) , BigInt :: from ( 0u8 ) ) ;
3445 let mut env = TestEnv {
3546 receiver : Address :: new_id ( 1000 ) ,
3647 owner : Address :: new_id ( 100 ) ,
@@ -39,6 +50,9 @@ fn prepare_env() -> TestEnv {
3950 control_addrs : vec ! [ Address :: new_id( 999 ) , Address :: new_id( 998 ) ] ,
4051 peer_id : vec ! [ 1 , 2 , 3 ] ,
4152 multiaddrs : vec ! [ BytesDe ( vec![ 1 , 2 , 3 ] ) ] ,
53+ power,
54+ reward,
55+ epoch_reward_smooth,
4256 rt : MockRuntime :: default ( ) ,
4357 } ;
4458
@@ -50,6 +64,12 @@ fn prepare_env() -> TestEnv {
5064 env. rt . hash_func = Box :: new ( hash) ;
5165 env. rt . caller . replace ( INIT_ACTOR_ADDR ) ;
5266 env. rt . caller_type . replace ( * INIT_ACTOR_CODE_ID ) ;
67+ // add balance for create miner deposit
68+ env. rt . add_balance ( create_miner_deposit_for_test (
69+ & env. rt ,
70+ & env. power ,
71+ & env. epoch_reward_smooth ,
72+ ) ) ;
5373 env
5474}
5575
@@ -67,10 +87,32 @@ fn constructor_params(env: &TestEnv) -> ConstructorParams {
6787#[ test]
6888fn simple_construction ( ) {
6989 let env = prepare_env ( ) ;
90+ let current_reward = ThisEpochRewardReturn {
91+ this_epoch_baseline_power : env. power . clone ( ) ,
92+ this_epoch_reward_smoothed : env. epoch_reward_smooth . clone ( ) ,
93+ } ;
94+ let current_total_power = CurrentTotalPowerReturn :: default ( ) ;
95+
7096 let params = constructor_params ( & env) ;
7197
7298 env. rt . set_caller ( * INIT_ACTOR_CODE_ID , INIT_ACTOR_ADDR ) ;
7399 env. rt . expect_validate_caller_addr ( vec ! [ INIT_ACTOR_ADDR ] ) ;
100+ env. rt . expect_send_simple (
101+ REWARD_ACTOR_ADDR ,
102+ RewardMethod :: ThisEpochReward as u64 ,
103+ None ,
104+ TokenAmount :: zero ( ) ,
105+ IpldBlock :: serialize_cbor ( & current_reward) . unwrap ( ) ,
106+ ExitCode :: OK ,
107+ ) ;
108+ env. rt . expect_send_simple (
109+ STORAGE_POWER_ACTOR_ADDR ,
110+ PowerMethod :: CurrentTotalPower as u64 ,
111+ Default :: default ( ) ,
112+ TokenAmount :: zero ( ) ,
113+ IpldBlock :: serialize_cbor ( & current_total_power) . unwrap ( ) ,
114+ ExitCode :: OK ,
115+ ) ;
74116 env. rt . expect_send_simple (
75117 env. worker ,
76118 AccountMethod :: PubkeyAddress as u64 ,
@@ -87,7 +129,7 @@ fn simple_construction() {
87129 expect_empty ( result) ;
88130 env. rt . verify ( ) ;
89131
90- let state = env. rt . get_state :: < State > ( ) ;
132+ let mut state = env. rt . get_state :: < State > ( ) ;
91133
92134 let info = state. get_info ( & env. rt . store ) . unwrap ( ) ;
93135 assert_eq ! ( env. owner, info. owner) ;
@@ -100,10 +142,24 @@ fn simple_construction() {
100142 assert_eq ! ( 2349 , info. window_post_partition_sectors) ;
101143
102144 assert_eq ! ( TokenAmount :: zero( ) , state. pre_commit_deposits) ;
103- assert_eq ! ( TokenAmount :: zero( ) , state. locked_funds) ;
145+ assert_eq ! (
146+ create_miner_deposit_for_test( & env. rt, & env. power, & env. epoch_reward_smooth) ,
147+ state. locked_funds
148+ ) ;
149+ assert_eq ! ( 180 , state. vesting_funds. load( & env. rt. store) . unwrap( ) . len( ) ) ;
104150 assert_ne ! ( Cid :: default ( ) , state. pre_committed_sectors) ;
105151 assert_ne ! ( Cid :: default ( ) , state. sectors) ;
106152
153+ // reset create miner deposit vesting funds
154+ state. vesting_funds = Default :: default ( ) ;
155+ state. locked_funds = TokenAmount :: zero ( ) ;
156+ env. rt . replace_state ( & state) ;
157+
158+ let state = env. rt . get_state :: < State > ( ) ;
159+ let create_deposit_vesting_funds = state. vesting_funds . load ( & env. rt . store ) . unwrap ( ) ;
160+ assert ! ( create_deposit_vesting_funds. is_empty( ) ) ;
161+ assert ! ( state. locked_funds. is_zero( ) ) ;
162+
107163 // according to original specs-actors test, this is set by running the code; magic...
108164 let proving_period_start = -2222 ;
109165 assert_eq ! ( proving_period_start, state. proving_period_start) ;
@@ -128,9 +184,53 @@ fn simple_construction() {
128184 util:: check_state_invariants_from_mock_runtime ( & env. rt ) ;
129185}
130186
187+ #[ test]
188+ fn fails_if_insufficient_to_cover_the_miner_creation_deposit ( ) {
189+ let env = prepare_env ( ) ;
190+ env. rt . set_balance ( TokenAmount :: zero ( ) ) ;
191+ let current_reward = ThisEpochRewardReturn {
192+ this_epoch_baseline_power : env. power . clone ( ) ,
193+ this_epoch_reward_smoothed : env. epoch_reward_smooth . clone ( ) ,
194+ } ;
195+ let current_total_power = CurrentTotalPowerReturn :: default ( ) ;
196+
197+ let params = constructor_params ( & env) ;
198+
199+ env. rt . set_caller ( * INIT_ACTOR_CODE_ID , INIT_ACTOR_ADDR ) ;
200+ env. rt . expect_validate_caller_addr ( vec ! [ INIT_ACTOR_ADDR ] ) ;
201+ env. rt . expect_send_simple (
202+ REWARD_ACTOR_ADDR ,
203+ RewardMethod :: ThisEpochReward as u64 ,
204+ None ,
205+ TokenAmount :: zero ( ) ,
206+ IpldBlock :: serialize_cbor ( & current_reward) . unwrap ( ) ,
207+ ExitCode :: OK ,
208+ ) ;
209+ env. rt . expect_send_simple (
210+ STORAGE_POWER_ACTOR_ADDR ,
211+ PowerMethod :: CurrentTotalPower as u64 ,
212+ Default :: default ( ) ,
213+ TokenAmount :: zero ( ) ,
214+ IpldBlock :: serialize_cbor ( & current_total_power) . unwrap ( ) ,
215+ ExitCode :: OK ,
216+ ) ;
217+
218+ expect_abort (
219+ ExitCode :: USR_INSUFFICIENT_FUNDS ,
220+ env. rt
221+ . call :: < Actor > ( Method :: Constructor as u64 , IpldBlock :: serialize_cbor ( & params) . unwrap ( ) ) ,
222+ ) ;
223+ env. rt . verify ( ) ;
224+ }
225+
131226#[ test]
132227fn control_addresses_are_resolved_during_construction ( ) {
133228 let mut env = prepare_env ( ) ;
229+ let current_reward = ThisEpochRewardReturn {
230+ this_epoch_baseline_power : env. power . clone ( ) ,
231+ this_epoch_reward_smoothed : env. epoch_reward_smooth . clone ( ) ,
232+ } ;
233+ let current_total_power = CurrentTotalPowerReturn :: default ( ) ;
134234
135235 let control1 = new_bls_addr ( 1 ) ;
136236 let control1id = Address :: new_id ( 555 ) ;
@@ -146,6 +246,22 @@ fn control_addresses_are_resolved_during_construction() {
146246 let params = constructor_params ( & env) ;
147247 env. rt . set_caller ( * INIT_ACTOR_CODE_ID , INIT_ACTOR_ADDR ) ;
148248 env. rt . expect_validate_caller_addr ( vec ! [ INIT_ACTOR_ADDR ] ) ;
249+ env. rt . expect_send_simple (
250+ REWARD_ACTOR_ADDR ,
251+ RewardMethod :: ThisEpochReward as u64 ,
252+ None ,
253+ TokenAmount :: zero ( ) ,
254+ IpldBlock :: serialize_cbor ( & current_reward) . unwrap ( ) ,
255+ ExitCode :: OK ,
256+ ) ;
257+ env. rt . expect_send_simple (
258+ STORAGE_POWER_ACTOR_ADDR ,
259+ PowerMethod :: CurrentTotalPower as u64 ,
260+ Default :: default ( ) ,
261+ TokenAmount :: zero ( ) ,
262+ IpldBlock :: serialize_cbor ( & current_total_power) . unwrap ( ) ,
263+ ExitCode :: OK ,
264+ ) ;
149265 env. rt . expect_send_simple (
150266 env. worker ,
151267 AccountMethod :: PubkeyAddress as u64 ,
0 commit comments