From b3a31d8823b84b26f727b5e591ff107d4ad940c6 Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Wed, 12 Aug 2020 15:20:32 -0700 Subject: [PATCH] add function to check entire state tree balance --- chain/state/statetree.go | 12 ++++++++++++ chain/stmgr/utils.go | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/chain/state/statetree.go b/chain/state/statetree.go index 5bac856b7..d2a98b1e4 100644 --- a/chain/state/statetree.go +++ b/chain/state/statetree.go @@ -336,3 +336,15 @@ func (st *StateTree) MutateActor(addr address.Address, f func(*types.Actor) erro return st.SetActor(addr, act) } + +func (st *StateTree) ForEach(f func(address.Address, *types.Actor) error) error { + var act types.Actor + return st.root.ForEach(&act, func(k string) error { + addr, err := address.NewFromBytes([]byte(k)) + if err != nil { + return xerrors.Errorf("invalid address (%x) found in state tree key: %w", []byte(k), err) + } + + return f(addr, &act) + }) +} diff --git a/chain/stmgr/utils.go b/chain/stmgr/utils.go index 1e86b5150..42ba1d4de 100644 --- a/chain/stmgr/utils.go +++ b/chain/stmgr/utils.go @@ -658,3 +658,21 @@ func MinerHasMinPower(ctx context.Context, sm *StateManager, addr address.Addres return ps.MinerNominalPowerMeetsConsensusMinimum(sm.ChainStore().Store(ctx), addr) } + +func CheckTotalFIL(ctx context.Context, sm *StateManager, ts *types.TipSet) (abi.TokenAmount, error) { + str, err := state.LoadStateTree(sm.ChainStore().Store(ctx), ts.ParentState()) + if err != nil { + return abi.TokenAmount{}, err + } + + sum := types.NewInt(0) + err = str.ForEach(func(a address.Address, act *types.Actor) error { + sum = types.BigAdd(sum, act.Balance) + return nil + }) + if err != nil { + return abi.TokenAmount{}, err + } + + return sum, nil +}