github.com/jimpick/sp-kyc-checks@v0.0.0-20230201194251-fa84fca72da8/checks/minpower/check_power.go (about)

     1  package minpower
     2  
     3  import (
     4  	"context"
     5  	"log"
     6  	"math/big"
     7  	"net/http"
     8  
     9  	"github.com/filecoin-project/go-address"
    10  	jsonrpc "github.com/filecoin-project/go-jsonrpc"
    11  	lotusapi "github.com/filecoin-project/lotus/api"
    12  	"github.com/filecoin-project/lotus/chain/types"
    13  )
    14  
    15  // LookupPower gets the power for the miner from the Lotus API
    16  func LookupPower(ctx context.Context, miner string) (*lotusapi.MinerPower, error) {
    17  	headers := http.Header{}
    18  	api_addr := "api.chain.love"
    19  
    20  	var api lotusapi.FullNodeStruct
    21  	closer, err := jsonrpc.NewMergeClient(ctx,
    22  		"wss://"+api_addr+"/rpc/v0", "Filecoin",
    23  		[]interface{}{&api.Internal, &api.CommonStruct.Internal}, headers)
    24  	if err != nil {
    25  		log.Fatalf("connecting with lotus failed: %s", err)
    26  	}
    27  	defer closer()
    28  
    29  	addr, err := address.NewFromString(miner)
    30  	if err != nil {
    31  		return nil, err
    32  	}
    33  
    34  	power, err := api.StateMinerPower(ctx, addr, types.EmptyTSK)
    35  	if err != nil {
    36  		return nil, err
    37  	}
    38  	log.Printf("Miner power %s: %v\n", miner, power)
    39  	return power, nil
    40  }
    41  
    42  // MinQualityPowerOk compares the power from the API for miner against a minimum
    43  func MinQualityPowerOk(ctx context.Context, miner string, min *big.Int) (bool, error) {
    44  	power, err := LookupPower(ctx, miner)
    45  	if err != nil {
    46  		return false, err
    47  	}
    48  	if power.MinerPower.QualityAdjPower.Cmp(min) < 0 {
    49  		log.Printf("Insufficient power %s: %v < %v\n", miner,
    50  			power.MinerPower.QualityAdjPower, min)
    51  		return false, nil
    52  	}
    53  	return true, nil
    54  }