1- use fil_actors_runtime:: test_utils:: * ;
2- use fil_actors_runtime:: INIT_ACTOR_ADDR ;
3-
41use fil_actor_account:: Method as AccountMethod ;
52use fil_actor_miner:: {
63 Actor , Deadline , Deadlines , Method , MinerConstructorParams as ConstructorParams , State ,
74} ;
5+ use fil_actor_power:: { CurrentTotalPowerReturn , Method as PowerMethod } ;
6+ use fil_actor_reward:: { Method as RewardMethod , ThisEpochRewardReturn } ;
7+ use fil_actors_runtime:: reward:: FilterEstimate ;
8+ use fil_actors_runtime:: { test_utils:: * , STORAGE_POWER_ACTOR_ADDR } ;
9+ use fil_actors_runtime:: { INIT_ACTOR_ADDR , REWARD_ACTOR_ADDR } ;
810
911use fvm_ipld_encoding:: { BytesDe , CborStore } ;
1012use fvm_shared:: address:: Address ;
13+ use fvm_shared:: bigint:: BigInt ;
1114use fvm_shared:: econ:: TokenAmount ;
1215use fvm_shared:: error:: ExitCode ;
13- use fvm_shared:: sector:: { RegisteredPoStProof , SectorSize } ;
16+ use fvm_shared:: sector:: { RegisteredPoStProof , SectorSize , StoragePower } ;
1417
1518use cid:: Cid ;
1619use fvm_ipld_encoding:: ipld_block:: IpldBlock ;
17- use num_traits:: Zero ;
20+ use num_traits:: { FromPrimitive , Zero } ;
1821
1922mod util;
2023
@@ -27,10 +30,17 @@ struct TestEnv {
2730 control_addrs : Vec < Address > ,
2831 peer_id : Vec < u8 > ,
2932 multiaddrs : Vec < BytesDe > ,
33+ power : StoragePower ,
34+ reward : TokenAmount ,
35+ epoch_reward_smooth : FilterEstimate ,
3036 rt : MockRuntime ,
3137}
3238
3339fn prepare_env ( ) -> TestEnv {
40+ let reward = TokenAmount :: from_whole ( 10 ) ;
41+ let power = StoragePower :: from_i128 ( 1 << 50 ) . unwrap ( ) ;
42+ let epoch_reward_smooth = FilterEstimate :: new ( reward. atto ( ) . clone ( ) , BigInt :: from ( 0u8 ) ) ;
43+
3444 let mut env = TestEnv {
3545 receiver : Address :: new_id ( 1000 ) ,
3646 owner : Address :: new_id ( 100 ) ,
@@ -39,6 +49,9 @@ fn prepare_env() -> TestEnv {
3949 control_addrs : vec ! [ Address :: new_id( 999 ) , Address :: new_id( 998 ) ] ,
4050 peer_id : vec ! [ 1 , 2 , 3 ] ,
4151 multiaddrs : vec ! [ BytesDe ( vec![ 1 , 2 , 3 ] ) ] ,
52+ power,
53+ reward,
54+ epoch_reward_smooth,
4255 rt : MockRuntime :: default ( ) ,
4356 } ;
4457
@@ -50,6 +63,8 @@ fn prepare_env() -> TestEnv {
5063 env. rt . hash_func = Box :: new ( hash) ;
5164 env. rt . caller . replace ( INIT_ACTOR_ADDR ) ;
5265 env. rt . caller_type . replace ( * INIT_ACTOR_CODE_ID ) ;
66+ // add balance for create miner deposit
67+ env. rt . add_balance ( TokenAmount :: from_atto ( 633318697598976000u64 ) ) ;
5368 env
5469}
5570
@@ -61,16 +76,46 @@ fn constructor_params(env: &TestEnv) -> ConstructorParams {
6176 window_post_proof_type : RegisteredPoStProof :: StackedDRGWindow32GiBV1P1 ,
6277 peer_id : env. peer_id . clone ( ) ,
6378 multi_addresses : env. multiaddrs . clone ( ) ,
79+ network_qap : env. epoch_reward_smooth . clone ( ) ,
6480 }
6581}
6682
6783#[ test]
6884fn simple_construction ( ) {
6985 let env = prepare_env ( ) ;
86+ let current_reward = ThisEpochRewardReturn {
87+ this_epoch_baseline_power : env. power . clone ( ) ,
88+ this_epoch_reward_smoothed : env. epoch_reward_smooth . clone ( ) ,
89+ } ;
90+ let current_total_power = CurrentTotalPowerReturn {
91+ raw_byte_power : Default :: default ( ) ,
92+ quality_adj_power : Default :: default ( ) ,
93+ pledge_collateral : Default :: default ( ) ,
94+ quality_adj_power_smoothed : Default :: default ( ) ,
95+ ramp_start_epoch : Default :: default ( ) ,
96+ ramp_duration_epochs : Default :: default ( ) ,
97+ } ;
98+
7099 let params = constructor_params ( & env) ;
71100
72101 env. rt . set_caller ( * INIT_ACTOR_CODE_ID , INIT_ACTOR_ADDR ) ;
73102 env. rt . expect_validate_caller_addr ( vec ! [ INIT_ACTOR_ADDR ] ) ;
103+ env. rt . expect_send_simple (
104+ REWARD_ACTOR_ADDR ,
105+ RewardMethod :: ThisEpochReward as u64 ,
106+ None ,
107+ TokenAmount :: zero ( ) ,
108+ IpldBlock :: serialize_cbor ( & current_reward) . unwrap ( ) ,
109+ ExitCode :: OK ,
110+ ) ;
111+ env. rt . expect_send_simple (
112+ STORAGE_POWER_ACTOR_ADDR ,
113+ PowerMethod :: CurrentTotalPower as u64 ,
114+ Default :: default ( ) ,
115+ TokenAmount :: zero ( ) ,
116+ IpldBlock :: serialize_cbor ( & current_total_power) . unwrap ( ) ,
117+ ExitCode :: OK ,
118+ ) ;
74119 env. rt . expect_send_simple (
75120 env. worker ,
76121 AccountMethod :: PubkeyAddress as u64 ,
@@ -87,7 +132,7 @@ fn simple_construction() {
87132 expect_empty ( result) ;
88133 env. rt . verify ( ) ;
89134
90- let state = env. rt . get_state :: < State > ( ) ;
135+ let mut state = env. rt . get_state :: < State > ( ) ;
91136
92137 let info = state. get_info ( & env. rt . store ) . unwrap ( ) ;
93138 assert_eq ! ( env. owner, info. owner) ;
@@ -100,10 +145,21 @@ fn simple_construction() {
100145 assert_eq ! ( 2349 , info. window_post_partition_sectors) ;
101146
102147 assert_eq ! ( TokenAmount :: zero( ) , state. pre_commit_deposits) ;
103- assert_eq ! ( TokenAmount :: zero( ) , state. locked_funds) ;
148+ assert_eq ! ( TokenAmount :: from_atto( 633318697598976000u64 ) , state. locked_funds) ;
149+ assert_eq ! ( 180 , state. load_vesting_funds( & env. rt. store) . unwrap( ) . funds. 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. save_vesting_funds ( & env. rt . store , & fil_actor_miner:: VestingFunds :: new ( ) ) . unwrap ( ) ;
155+ state. locked_funds = TokenAmount :: zero ( ) ;
156+ env. rt . replace_state ( & state) ;
157+
158+ let state = env. rt . get_state :: < State > ( ) ;
159+ let create_depost_vesting_funds = state. load_vesting_funds ( & env. rt . store ) . unwrap ( ) ;
160+ assert ! ( create_depost_vesting_funds. 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,67 @@ 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 {
196+ raw_byte_power : Default :: default ( ) ,
197+ quality_adj_power : Default :: default ( ) ,
198+ pledge_collateral : Default :: default ( ) ,
199+ quality_adj_power_smoothed : Default :: default ( ) ,
200+ ramp_start_epoch : Default :: default ( ) ,
201+ ramp_duration_epochs : Default :: default ( ) ,
202+ } ;
203+
204+ let params = constructor_params ( & env) ;
205+
206+ env. rt . set_caller ( * INIT_ACTOR_CODE_ID , INIT_ACTOR_ADDR ) ;
207+ env. rt . expect_validate_caller_addr ( vec ! [ INIT_ACTOR_ADDR ] ) ;
208+ env. rt . expect_send_simple (
209+ REWARD_ACTOR_ADDR ,
210+ RewardMethod :: ThisEpochReward as u64 ,
211+ None ,
212+ TokenAmount :: zero ( ) ,
213+ IpldBlock :: serialize_cbor ( & current_reward) . unwrap ( ) ,
214+ ExitCode :: OK ,
215+ ) ;
216+ env. rt . expect_send_simple (
217+ STORAGE_POWER_ACTOR_ADDR ,
218+ PowerMethod :: CurrentTotalPower as u64 ,
219+ Default :: default ( ) ,
220+ TokenAmount :: zero ( ) ,
221+ IpldBlock :: serialize_cbor ( & current_total_power) . unwrap ( ) ,
222+ ExitCode :: OK ,
223+ ) ;
224+
225+ expect_abort (
226+ ExitCode :: USR_INSUFFICIENT_FUNDS ,
227+ env. rt
228+ . call :: < Actor > ( Method :: Constructor as u64 , IpldBlock :: serialize_cbor ( & params) . unwrap ( ) ) ,
229+ ) ;
230+ env. rt . verify ( ) ;
231+ }
232+
131233#[ test]
132234fn control_addresses_are_resolved_during_construction ( ) {
133235 let mut env = prepare_env ( ) ;
236+ let current_reward = ThisEpochRewardReturn {
237+ this_epoch_baseline_power : env. power . clone ( ) ,
238+ this_epoch_reward_smoothed : env. epoch_reward_smooth . clone ( ) ,
239+ } ;
240+ let current_total_power = CurrentTotalPowerReturn {
241+ raw_byte_power : Default :: default ( ) ,
242+ quality_adj_power : Default :: default ( ) ,
243+ pledge_collateral : Default :: default ( ) ,
244+ quality_adj_power_smoothed : Default :: default ( ) ,
245+ ramp_start_epoch : Default :: default ( ) ,
246+ ramp_duration_epochs : Default :: default ( ) ,
247+ } ;
134248
135249 let control1 = new_bls_addr ( 1 ) ;
136250 let control1id = Address :: new_id ( 555 ) ;
@@ -146,6 +260,22 @@ fn control_addresses_are_resolved_during_construction() {
146260 let params = constructor_params ( & env) ;
147261 env. rt . set_caller ( * INIT_ACTOR_CODE_ID , INIT_ACTOR_ADDR ) ;
148262 env. rt . expect_validate_caller_addr ( vec ! [ INIT_ACTOR_ADDR ] ) ;
263+ env. rt . expect_send_simple (
264+ REWARD_ACTOR_ADDR ,
265+ RewardMethod :: ThisEpochReward as u64 ,
266+ None ,
267+ TokenAmount :: zero ( ) ,
268+ IpldBlock :: serialize_cbor ( & current_reward) . unwrap ( ) ,
269+ ExitCode :: OK ,
270+ ) ;
271+ env. rt . expect_send_simple (
272+ STORAGE_POWER_ACTOR_ADDR ,
273+ PowerMethod :: CurrentTotalPower as u64 ,
274+ Default :: default ( ) ,
275+ TokenAmount :: zero ( ) ,
276+ IpldBlock :: serialize_cbor ( & current_total_power) . unwrap ( ) ,
277+ ExitCode :: OK ,
278+ ) ;
149279 env. rt . expect_send_simple (
150280 env. worker ,
151281 AccountMethod :: PubkeyAddress as u64 ,
0 commit comments