github.com/filecoin-project/specs-actors/v4@v4.0.2/actors/builtin/paych/testing.go (about)

     1  package paych
     2  
     3  import (
     4  	"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  	"github.com/filecoin-project/specs-actors/v4/actors/builtin"
     8  	"github.com/filecoin-project/specs-actors/v4/actors/util/adt"
     9  )
    10  
    11  type StateSummary struct {
    12  	Redeemed abi.TokenAmount
    13  }
    14  
    15  // Checks internal invariants of paych state.
    16  func CheckStateInvariants(st *State, store adt.Store, balance abi.TokenAmount) (*StateSummary, *builtin.MessageAccumulator) {
    17  	acc := &builtin.MessageAccumulator{}
    18  	paychSummary := &StateSummary{
    19  		Redeemed: big.Zero(),
    20  	}
    21  
    22  	acc.Require(st.From.Protocol() == address.ID, "from address is not ID address %v", st.From)
    23  	acc.Require(st.To.Protocol() == address.ID, "to address is not ID address %v", st.To)
    24  	acc.Require(st.SettlingAt >= st.MinSettleHeight,
    25  		"channel is setting at epoch %d before min settle height %d", st.SettlingAt, st.MinSettleHeight)
    26  
    27  	if lanes, err := adt.AsArray(store, st.LaneStates, LaneStatesAmtBitwidth); err != nil {
    28  		acc.Addf("error loading lanes: %v", err)
    29  	} else {
    30  		var lane LaneState
    31  		err = lanes.ForEach(&lane, func(i int64) error {
    32  			acc.Require(lane.Redeemed.GreaterThan(big.Zero()), "land %d redeemed is not greater than zero %v", i, lane.Redeemed)
    33  			paychSummary.Redeemed = big.Add(paychSummary.Redeemed, lane.Redeemed)
    34  			return nil
    35  		})
    36  		acc.RequireNoError(err, "error iterating lanes")
    37  	}
    38  
    39  	acc.Require(balance.GreaterThanEqual(st.ToSend),
    40  		"channel has insufficient funds to send (%v < %v)", balance, st.ToSend)
    41  
    42  	return paychSummary, acc
    43  }