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 }