@@ -46,7 +46,7 @@ pub use expiration_queue::*;
4646use fil_actors_runtime:: cbor:: { serialize, serialize_vec} ;
4747use fil_actors_runtime:: reward:: { FilterEstimate , ThisEpochRewardReturn } ;
4848use fil_actors_runtime:: runtime:: builtins:: Type ;
49- use fil_actors_runtime:: runtime:: policy_constants:: MAX_SECTOR_NUMBER ;
49+ use fil_actors_runtime:: runtime:: policy_constants:: { MAX_SECTOR_NUMBER , MINIMUM_CONSENSUS_POWER } ;
5050use fil_actors_runtime:: runtime:: { ActorCode , DomainSeparationTag , Policy , Runtime } ;
5151use fil_actors_runtime:: {
5252 actor_dispatch, actor_error, deserialize_block, extract_send_result, util, ActorContext ,
@@ -181,6 +181,14 @@ impl Actor {
181181 check_peer_info ( rt. policy ( ) , & params. peer_id , & params. multi_addresses ) ?;
182182 check_valid_post_proof_type ( rt. policy ( ) , params. window_post_proof_type ) ?;
183183
184+ let balance = rt. current_balance ( ) ;
185+ let deposit = calculate_create_miner_deposit ( rt, params. network_qap ) ?;
186+ if balance < deposit {
187+ return Err ( actor_error ! ( insufficient_funds;
188+ "not enough balance to lock for create miner deposit: \
189+ sent balance {} < deposit {}", balance. atto( ) , deposit. atto( ) ) ) ;
190+ }
191+
184192 let owner = rt. resolve_address ( & params. owner ) . ok_or_else ( || {
185193 actor_error ! ( illegal_argument, "unable to resolve owner address: {}" , params. owner)
186194 } ) ?;
@@ -239,7 +247,10 @@ impl Actor {
239247 e. downcast_default ( ExitCode :: USR_ILLEGAL_STATE , "failed to construct illegal state" )
240248 } ) ?;
241249
242- let st = State :: new ( policy, rt. store ( ) , info_cid, period_start, deadline_idx) ?;
250+ let store = rt. store ( ) ;
251+ let mut st = State :: new ( policy, store, info_cid, period_start, deadline_idx) ?;
252+ st. add_locked_funds ( store, rt. curr_epoch ( ) , & deposit, & REWARD_VESTING_SPEC )
253+ . map_err ( |e| actor_error ! ( illegal_state, e) ) ?;
243254 rt. create ( & st) ?;
244255 Ok ( ( ) )
245256 }
@@ -312,6 +323,7 @@ impl Actor {
312323 . load_vesting_funds ( rt. store ( ) )
313324 . map_err ( |e| actor_error ! ( illegal_state, "failed to load vesting funds: {}" , e) ) ?;
314325 let ret = vesting_funds. funds . into_iter ( ) . map ( |v| ( v. epoch , v. amount ) ) . collect_vec ( ) ;
326+
315327 Ok ( GetVestingFundsReturn { vesting_funds : ret } )
316328 }
317329
@@ -756,6 +768,7 @@ impl Actor {
756768
757769 Ok ( ( ) )
758770 }
771+
759772 /// Checks state of the corresponding sector pre-commitments and verifies aggregate proof of replication
760773 /// of these sectors. If valid, the sectors' deals are activated, sectors are assigned a deadline and charged pledge
761774 /// and precommit state is removed.
@@ -5240,7 +5253,6 @@ fn resolve_worker_address(rt: &impl Runtime, raw: Address) -> Result<ActorID, Ac
52405253}
52415254
52425255fn burn_funds ( rt : & impl Runtime , amount : TokenAmount ) -> Result < ( ) , ActorError > {
5243- log:: debug!( "storage provder {} burning {}" , rt. message( ) . receiver( ) , amount) ;
52445256 if amount. is_positive ( ) {
52455257 extract_send_result ( rt. send_simple ( & BURNT_FUNDS_ACTOR_ADDR , METHOD_SEND , None , amount) ) ?;
52465258 }
@@ -5642,6 +5654,53 @@ fn activate_new_sector_infos(
56425654 Ok ( ( ) )
56435655}
56445656
5657+ /// Calculate create miner deposit by MINIMUM_CONSENSUS_POWER x StateMinerInitialPledgeCollateral
5658+ /// See FIP-0077, https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0077.md
5659+ pub fn calculate_create_miner_deposit (
5660+ rt : & impl Runtime ,
5661+ network_qap : FilterEstimate ,
5662+ ) -> Result < TokenAmount , ActorError > {
5663+ // set network pledge inputs
5664+ let rew = request_current_epoch_block_reward ( rt) ?;
5665+ let pwr = request_current_total_power ( rt) ?;
5666+ let circulating_supply = rt. total_fil_circ_supply ( ) ;
5667+ let pledge_inputs = NetworkPledgeInputs {
5668+ network_qap,
5669+ network_baseline : rew. this_epoch_baseline_power ,
5670+ circulating_supply,
5671+ epoch_reward : rew. this_epoch_reward_smoothed ,
5672+ epochs_since_ramp_start : rt. curr_epoch ( ) - pwr. ramp_start_epoch ,
5673+ ramp_duration_epochs : pwr. ramp_duration_epochs ,
5674+ } ;
5675+
5676+ /// set sector size with min power
5677+ #[ cfg( feature = "min-power-2k" ) ]
5678+ let sector_size = SectorSize :: _2KiB;
5679+ #[ cfg( feature = "min-power-2g" ) ]
5680+ let sector_size = SectorSize :: _8MiB;
5681+ #[ cfg( feature = "min-power-32g" ) ]
5682+ let sector_size = SectorSize :: _512MiB;
5683+ #[ cfg( not( any(
5684+ feature = "min-power-2k" ,
5685+ feature = "min-power-2g" ,
5686+ feature = "min-power-32g"
5687+ ) ) ) ]
5688+ let sector_size = SectorSize :: _32GiB;
5689+
5690+ let sector_number = MINIMUM_CONSENSUS_POWER / sector_size as i64 ;
5691+ let power = qa_power_for_weight ( sector_size, MIN_SECTOR_EXPIRATION , & BigInt :: zero ( ) ) ;
5692+ let sector_initial_pledge = initial_pledge_for_power (
5693+ & power,
5694+ & pledge_inputs. network_baseline ,
5695+ & pledge_inputs. epoch_reward ,
5696+ & pledge_inputs. network_qap ,
5697+ & pledge_inputs. circulating_supply ,
5698+ pledge_inputs. epochs_since_ramp_start ,
5699+ pledge_inputs. ramp_duration_epochs ,
5700+ ) ;
5701+ Ok ( sector_initial_pledge * sector_number)
5702+ }
5703+
56455704pub struct SectorPiecesActivationInput {
56465705 pub piece_manifests : Vec < PieceActivationManifest > ,
56475706 pub sector_expiry : ChainEpoch ,
0 commit comments