github.com/filecoin-project/specs-actors/v4@v4.0.2/actors/states/election.go (about)

     1  package states
     2  
     3  import (
     4  	addr "github.com/filecoin-project/go-address"
     5  	"github.com/filecoin-project/go-state-types/abi"
     6  	"github.com/filecoin-project/go-state-types/big"
     7  
     8  	"github.com/filecoin-project/specs-actors/v4/actors/builtin/miner"
     9  	"github.com/filecoin-project/specs-actors/v4/actors/builtin/power"
    10  	"github.com/filecoin-project/specs-actors/v4/actors/util/adt"
    11  )
    12  
    13  // Checks for miner election eligibility.
    14  // A miner must satisfy conditions on both the immediate parent state, as well as state at the
    15  // Winning PoSt election lookback.
    16  
    17  // Tests whether a miner is eligible to win an election given the immediately prior state of the
    18  // miner and system actors.
    19  func MinerEligibleForElection(store adt.Store, mstate *miner.State, pstate *power.State, maddr addr.Address, currEpoch abi.ChainEpoch) (bool, error) {
    20  	// Non-empty power claim.
    21  	if claim, found, err := pstate.GetClaim(store, maddr); err != nil {
    22  		return false, err
    23  	} else if !found {
    24  		return false, err
    25  	} else if claim.QualityAdjPower.LessThanEqual(big.Zero()) {
    26  		return false, err
    27  	}
    28  
    29  	// No fee debt.
    30  	if !mstate.IsDebtFree() {
    31  		return false, nil
    32  	}
    33  
    34  	// No active consensus faults.
    35  	if mInfo, err := mstate.GetInfo(store); err != nil {
    36  		return false, err
    37  	} else if miner.ConsensusFaultActive(mInfo, currEpoch) {
    38  		return false, nil
    39  	}
    40  
    41  	return true, nil
    42  }
    43  
    44  // Tests whether a miner is eligible for election given a Winning PoSt lookback state.
    45  // The power state must be the state of the power actor at Winning PoSt lookback epoch.
    46  func MinerPoStLookbackEligibleForElection(store adt.Store, pstate *power.State, mAddr addr.Address) (bool, error) {
    47  	// Minimum power requirements.
    48  	return pstate.MinerNominalPowerMeetsConsensusMinimum(store, mAddr)
    49  }