1
- use fil_actors_runtime:: test_utils:: * ;
2
- use fil_actors_runtime:: INIT_ACTOR_ADDR ;
3
-
4
1
use fil_actor_account:: Method as AccountMethod ;
5
2
use fil_actor_miner:: {
6
3
Actor , Deadline , Deadlines , Method , MinerConstructorParams as ConstructorParams , State ,
7
4
} ;
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 } ;
8
10
9
11
use fvm_ipld_encoding:: { BytesDe , CborStore } ;
10
12
use fvm_shared:: address:: Address ;
13
+ use fvm_shared:: bigint:: BigInt ;
11
14
use fvm_shared:: econ:: TokenAmount ;
12
15
use fvm_shared:: error:: ExitCode ;
13
- use fvm_shared:: sector:: { RegisteredPoStProof , SectorSize } ;
16
+ use fvm_shared:: sector:: { RegisteredPoStProof , SectorSize , StoragePower } ;
14
17
15
18
use cid:: Cid ;
16
19
use fvm_ipld_encoding:: ipld_block:: IpldBlock ;
17
- use num_traits:: Zero ;
20
+ use num_traits:: { FromPrimitive , Zero } ;
18
21
19
22
mod util;
20
23
@@ -27,10 +30,17 @@ struct TestEnv {
27
30
control_addrs : Vec < Address > ,
28
31
peer_id : Vec < u8 > ,
29
32
multiaddrs : Vec < BytesDe > ,
33
+ power : StoragePower ,
34
+ reward : TokenAmount ,
35
+ epoch_reward_smooth : FilterEstimate ,
30
36
rt : MockRuntime ,
31
37
}
32
38
33
39
fn 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
+
34
44
let mut env = TestEnv {
35
45
receiver : Address :: new_id ( 1000 ) ,
36
46
owner : Address :: new_id ( 100 ) ,
@@ -39,6 +49,9 @@ fn prepare_env() -> TestEnv {
39
49
control_addrs : vec ! [ Address :: new_id( 999 ) , Address :: new_id( 998 ) ] ,
40
50
peer_id : vec ! [ 1 , 2 , 3 ] ,
41
51
multiaddrs : vec ! [ BytesDe ( vec![ 1 , 2 , 3 ] ) ] ,
52
+ power,
53
+ reward,
54
+ epoch_reward_smooth,
42
55
rt : MockRuntime :: default ( ) ,
43
56
} ;
44
57
@@ -50,6 +63,8 @@ fn prepare_env() -> TestEnv {
50
63
env. rt . hash_func = Box :: new ( hash) ;
51
64
env. rt . caller . replace ( INIT_ACTOR_ADDR ) ;
52
65
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 ) ) ;
53
68
env
54
69
}
55
70
@@ -61,16 +76,46 @@ fn constructor_params(env: &TestEnv) -> ConstructorParams {
61
76
window_post_proof_type : RegisteredPoStProof :: StackedDRGWindow32GiBV1P1 ,
62
77
peer_id : env. peer_id . clone ( ) ,
63
78
multi_addresses : env. multiaddrs . clone ( ) ,
79
+ network_qap : env. epoch_reward_smooth . clone ( ) ,
64
80
}
65
81
}
66
82
67
83
#[ test]
68
84
fn simple_construction ( ) {
69
85
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
+
70
99
let params = constructor_params ( & env) ;
71
100
72
101
env. rt . set_caller ( * INIT_ACTOR_CODE_ID , INIT_ACTOR_ADDR ) ;
73
102
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
+ ) ;
74
119
env. rt . expect_send_simple (
75
120
env. worker ,
76
121
AccountMethod :: PubkeyAddress as u64 ,
@@ -87,7 +132,7 @@ fn simple_construction() {
87
132
expect_empty ( result) ;
88
133
env. rt . verify ( ) ;
89
134
90
- let state = env. rt . get_state :: < State > ( ) ;
135
+ let mut state = env. rt . get_state :: < State > ( ) ;
91
136
92
137
let info = state. get_info ( & env. rt . store ) . unwrap ( ) ;
93
138
assert_eq ! ( env. owner, info. owner) ;
@@ -100,10 +145,21 @@ fn simple_construction() {
100
145
assert_eq ! ( 2349 , info. window_post_partition_sectors) ;
101
146
102
147
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( ) ) ;
104
150
assert_ne ! ( Cid :: default ( ) , state. pre_committed_sectors) ;
105
151
assert_ne ! ( Cid :: default ( ) , state. sectors) ;
106
152
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
+
107
163
// according to original specs-actors test, this is set by running the code; magic...
108
164
let proving_period_start = -2222 ;
109
165
assert_eq ! ( proving_period_start, state. proving_period_start) ;
@@ -128,9 +184,67 @@ fn simple_construction() {
128
184
util:: check_state_invariants_from_mock_runtime ( & env. rt ) ;
129
185
}
130
186
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
+
131
233
#[ test]
132
234
fn control_addresses_are_resolved_during_construction ( ) {
133
235
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
+ } ;
134
248
135
249
let control1 = new_bls_addr ( 1 ) ;
136
250
let control1id = Address :: new_id ( 555 ) ;
@@ -146,6 +260,22 @@ fn control_addresses_are_resolved_during_construction() {
146
260
let params = constructor_params ( & env) ;
147
261
env. rt . set_caller ( * INIT_ACTOR_CODE_ID , INIT_ACTOR_ADDR ) ;
148
262
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
+ ) ;
149
279
env. rt . expect_send_simple (
150
280
env. worker ,
151
281
AccountMethod :: PubkeyAddress as u64 ,
0 commit comments