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:: * } ;
3
4
4
5
use fil_actor_account:: Method as AccountMethod ;
5
6
use fil_actor_miner:: {
6
7
Actor , Deadline , Deadlines , Method , MinerConstructorParams as ConstructorParams , State ,
7
8
} ;
9
+ use fil_actor_power:: { CurrentTotalPowerReturn , Method as PowerMethod } ;
10
+ use fil_actor_reward:: { Method as RewardMethod , ThisEpochRewardReturn } ;
8
11
9
12
use fvm_ipld_encoding:: { BytesDe , CborStore } ;
10
13
use fvm_shared:: address:: Address ;
14
+ use fvm_shared:: bigint:: BigInt ;
11
15
use fvm_shared:: econ:: TokenAmount ;
12
16
use fvm_shared:: error:: ExitCode ;
13
- use fvm_shared:: sector:: { RegisteredPoStProof , SectorSize } ;
17
+ use fvm_shared:: sector:: { RegisteredPoStProof , SectorSize , StoragePower } ;
14
18
15
19
use cid:: Cid ;
16
20
use fvm_ipld_encoding:: ipld_block:: IpldBlock ;
17
- use num_traits:: Zero ;
21
+ use num_traits:: { FromPrimitive , Zero } ;
18
22
19
23
mod util;
24
+ use util:: create_miner_deposit_for_test;
20
25
21
26
#[ allow( dead_code) ]
22
27
struct TestEnv {
@@ -27,10 +32,16 @@ struct TestEnv {
27
32
control_addrs : Vec < Address > ,
28
33
peer_id : Vec < u8 > ,
29
34
multiaddrs : Vec < BytesDe > ,
35
+ power : StoragePower ,
36
+ reward : TokenAmount ,
37
+ epoch_reward_smooth : FilterEstimate ,
30
38
rt : MockRuntime ,
31
39
}
32
40
33
41
fn 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 ) ) ;
34
45
let mut env = TestEnv {
35
46
receiver : Address :: new_id ( 1000 ) ,
36
47
owner : Address :: new_id ( 100 ) ,
@@ -39,6 +50,9 @@ fn prepare_env() -> TestEnv {
39
50
control_addrs : vec ! [ Address :: new_id( 999 ) , Address :: new_id( 998 ) ] ,
40
51
peer_id : vec ! [ 1 , 2 , 3 ] ,
41
52
multiaddrs : vec ! [ BytesDe ( vec![ 1 , 2 , 3 ] ) ] ,
53
+ power,
54
+ reward,
55
+ epoch_reward_smooth,
42
56
rt : MockRuntime :: default ( ) ,
43
57
} ;
44
58
@@ -50,6 +64,12 @@ fn prepare_env() -> TestEnv {
50
64
env. rt . hash_func = Box :: new ( hash) ;
51
65
env. rt . caller . replace ( INIT_ACTOR_ADDR ) ;
52
66
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
+ ) ) ;
53
73
env
54
74
}
55
75
@@ -67,10 +87,32 @@ fn constructor_params(env: &TestEnv) -> ConstructorParams {
67
87
#[ test]
68
88
fn simple_construction ( ) {
69
89
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
+
70
96
let params = constructor_params ( & env) ;
71
97
72
98
env. rt . set_caller ( * INIT_ACTOR_CODE_ID , INIT_ACTOR_ADDR ) ;
73
99
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
+ ) ;
74
116
env. rt . expect_send_simple (
75
117
env. worker ,
76
118
AccountMethod :: PubkeyAddress as u64 ,
@@ -87,7 +129,7 @@ fn simple_construction() {
87
129
expect_empty ( result) ;
88
130
env. rt . verify ( ) ;
89
131
90
- let state = env. rt . get_state :: < State > ( ) ;
132
+ let mut state = env. rt . get_state :: < State > ( ) ;
91
133
92
134
let info = state. get_info ( & env. rt . store ) . unwrap ( ) ;
93
135
assert_eq ! ( env. owner, info. owner) ;
@@ -100,10 +142,24 @@ fn simple_construction() {
100
142
assert_eq ! ( 2349 , info. window_post_partition_sectors) ;
101
143
102
144
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( ) ) ;
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. 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
+
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,53 @@ 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 :: 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
+
131
226
#[ test]
132
227
fn control_addresses_are_resolved_during_construction ( ) {
133
228
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 ( ) ;
134
234
135
235
let control1 = new_bls_addr ( 1 ) ;
136
236
let control1id = Address :: new_id ( 555 ) ;
@@ -146,6 +246,22 @@ fn control_addresses_are_resolved_during_construction() {
146
246
let params = constructor_params ( & env) ;
147
247
env. rt . set_caller ( * INIT_ACTOR_CODE_ID , INIT_ACTOR_ADDR ) ;
148
248
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
+ ) ;
149
265
env. rt . expect_send_simple (
150
266
env. worker ,
151
267
AccountMethod :: PubkeyAddress as u64 ,
0 commit comments