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 }