@@ -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 ,
@@ -155,7 +155,6 @@ pub enum Method {
155155 GetVestingFundsExported = frc42_dispatch:: method_hash!( "GetVestingFunds" ) ,
156156 GetPeerIDExported = frc42_dispatch:: method_hash!( "GetPeerID" ) ,
157157 GetMultiaddrsExported = frc42_dispatch:: method_hash!( "GetMultiaddrs" ) ,
158- LockCreateMinerDepositExported = frc42_dispatch:: method_hash!( "LockCreateMinerDeposit" ) ,
159158}
160159
161160pub const SECTOR_CONTENT_CHANGED : MethodNum = frc42_dispatch:: method_hash!( "SectorContentChanged" ) ;
@@ -181,6 +180,14 @@ impl Actor {
181180 check_peer_info ( rt. policy ( ) , & params. peer_id , & params. multi_addresses ) ?;
182181 check_valid_post_proof_type ( rt. policy ( ) , params. window_post_proof_type ) ?;
183182
183+ let balance = rt. current_balance ( ) ;
184+ let deposit = calculate_create_miner_deposit ( rt, params. network_qap ) ?;
185+ if balance < deposit {
186+ return Err ( actor_error ! ( insufficient_funds;
187+ "not enough balance to lock for create miner deposit: \
188+ sent balance {} < deposit {}", balance. atto( ) , deposit. atto( ) ) ) ;
189+ }
190+
184191 let owner = rt. resolve_address ( & params. owner ) . ok_or_else ( || {
185192 actor_error ! ( illegal_argument, "unable to resolve owner address: {}" , params. owner)
186193 } ) ?;
@@ -239,7 +246,10 @@ impl Actor {
239246 e. downcast_default ( ExitCode :: USR_ILLEGAL_STATE , "failed to construct illegal state" )
240247 } ) ?;
241248
242- let st = State :: new ( policy, rt. store ( ) , info_cid, period_start, deadline_idx) ?;
249+ let store = rt. store ( ) ;
250+ let mut st = State :: new ( policy, store, info_cid, period_start, deadline_idx) ?;
251+ st. add_locked_funds ( store, rt. curr_epoch ( ) , & deposit, & REWARD_VESTING_SPEC )
252+ . map_err ( |e| actor_error ! ( illegal_state, e) ) ?;
243253 rt. create ( & st) ?;
244254 Ok ( ( ) )
245255 }
@@ -311,12 +321,7 @@ impl Actor {
311321 let vesting_funds = state
312322 . load_vesting_funds ( rt. store ( ) )
313323 . map_err ( |e| actor_error ! ( illegal_state, "failed to load vesting funds: {}" , e) ) ?;
314- let mut ret = vesting_funds. funds . into_iter ( ) . map ( |v| ( v. epoch , v. amount ) ) . collect_vec ( ) ;
315-
316- // add create miner deposit into vest table
317- if let Some ( CreateMinerDeposit { amount, epoch } ) = & state. create_miner_deposit {
318- ret. push ( ( * epoch, amount. clone ( ) ) ) ;
319- }
324+ let ret = vesting_funds. funds . into_iter ( ) . map ( |v| ( v. epoch , v. amount ) ) . collect_vec ( ) ;
320325
321326 Ok ( GetVestingFundsReturn { vesting_funds : ret } )
322327 }
@@ -3425,20 +3430,6 @@ impl Actor {
34253430 state. check_balance_invariants ( & rt. current_balance ( ) ) . map_err ( balance_invariants_broken) ?;
34263431 Ok ( ( ) )
34273432 }
3428-
3429- /// Lock the create miner deposit for 180 days.
3430- /// See FIP-0077, https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0077.md
3431- fn lock_create_miner_deposit (
3432- rt : & impl Runtime ,
3433- params : LockCreateMinerDepositParams ,
3434- ) -> Result < ( ) , ActorError > {
3435- rt. validate_immediate_caller_is ( std:: iter:: once ( & STORAGE_POWER_ACTOR_ADDR ) ) ?;
3436- rt. transaction ( |st : & mut State , rt| {
3437- st. add_create_miner_deposit ( params. amount , rt. curr_epoch ( ) ) ;
3438-
3439- Ok ( ( ) )
3440- } )
3441- }
34423433}
34433434
34443435#[ derive( Debug , PartialEq , Clone ) ]
@@ -4973,7 +4964,6 @@ fn resolve_worker_address(rt: &impl Runtime, raw: Address) -> Result<ActorID, Ac
49734964}
49744965
49754966fn burn_funds ( rt : & impl Runtime , amount : TokenAmount ) -> Result < ( ) , ActorError > {
4976- log:: debug!( "storage provder {} burning {}" , rt. message( ) . receiver( ) , amount) ;
49774967 if amount. is_positive ( ) {
49784968 extract_send_result ( rt. send_simple ( & BURNT_FUNDS_ACTOR_ADDR , METHOD_SEND , None , amount) ) ?;
49794969 }
@@ -5378,6 +5368,49 @@ fn activate_new_sector_infos(
53785368 Ok ( ( ) )
53795369}
53805370
5371+ /// Calculate create miner deposit by MINIMUM_CONSENSUS_POWER x StateMinerInitialPledgeCollateral
5372+ /// See FIP-0077, https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0077.md
5373+ pub fn calculate_create_miner_deposit (
5374+ rt : & impl Runtime ,
5375+ network_qap : FilterEstimate ,
5376+ ) -> Result < TokenAmount , ActorError > {
5377+ // set network pledge inputs
5378+ let rew = request_current_epoch_block_reward ( rt) ?;
5379+ let circulating_supply = rt. total_fil_circ_supply ( ) ;
5380+ let pledge_inputs = NetworkPledgeInputs {
5381+ network_qap,
5382+ network_baseline : rew. this_epoch_baseline_power ,
5383+ circulating_supply,
5384+ epoch_reward : rew. this_epoch_reward_smoothed ,
5385+ } ;
5386+
5387+ /// set sector size with min power
5388+ #[ cfg( feature = "min-power-2k" ) ]
5389+ let sector_size = SectorSize :: _2KiB;
5390+ #[ cfg( feature = "min-power-2g" ) ]
5391+ let sector_size = SectorSize :: _8MiB;
5392+ #[ cfg( feature = "min-power-32g" ) ]
5393+ let sector_size = SectorSize :: _512MiB;
5394+ #[ cfg( not( any(
5395+ feature = "min-power-2k" ,
5396+ feature = "min-power-2g" ,
5397+ feature = "min-power-32g"
5398+ ) ) ) ]
5399+ let sector_size = SectorSize :: _32GiB;
5400+
5401+ let sector_number = MINIMUM_CONSENSUS_POWER / sector_size as i64 ;
5402+ let power =
5403+ qa_power_for_weight ( sector_size, MIN_SECTOR_EXPIRATION , & BigInt :: zero ( ) , & BigInt :: zero ( ) ) ;
5404+ let sector_initial_pledge = initial_pledge_for_power (
5405+ & power,
5406+ & pledge_inputs. network_baseline ,
5407+ & pledge_inputs. epoch_reward ,
5408+ & pledge_inputs. network_qap ,
5409+ & pledge_inputs. circulating_supply ,
5410+ ) ;
5411+ Ok ( sector_initial_pledge * sector_number)
5412+ }
5413+
53815414pub struct SectorPiecesActivationInput {
53825415 pub piece_manifests : Vec < PieceActivationManifest > ,
53835416 pub sector_expiry : ChainEpoch ,
@@ -5766,7 +5799,6 @@ impl ActorCode for Actor {
57665799 GetMultiaddrsExported => get_multiaddresses,
57675800 ProveCommitSectors3 => prove_commit_sectors3,
57685801 ProveReplicaUpdates3 => prove_replica_updates3,
5769- LockCreateMinerDepositExported => lock_create_miner_deposit,
57705802 }
57715803}
57725804
0 commit comments