lotus/paych/state.go
2019-11-16 17:41:14 -06:00

74 lines
1.7 KiB
Go

package paych
import (
"context"
"fmt"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/address"
"github.com/filecoin-project/lotus/chain/types"
xerrors "golang.org/x/xerrors"
)
func (pm *Manager) loadPaychState(ctx context.Context, ch address.Address) (*types.Actor, *actors.PaymentChannelActorState, error) {
var pcast actors.PaymentChannelActorState
act, err := pm.sm.LoadActorState(ctx, ch, &pcast, nil)
if err != nil {
return nil, nil, err
}
return act, &pcast, nil
}
func (pm *Manager) laneState(ctx context.Context, ch address.Address, lane uint64) (actors.LaneState, error) {
_, state, err := pm.loadPaychState(ctx, ch)
if err != nil {
return actors.LaneState{}, err
}
// TODO: we probably want to call UpdateChannelState with all vouchers to be fully correct
// (but technically dont't need to)
// TODO: make sure this is correct
ls, ok := state.LaneStates[fmt.Sprintf("%d", lane)]
if !ok {
ls = &actors.LaneState{
Closed: false,
Redeemed: types.NewInt(0),
Nonce: 0,
}
}
if ls.Closed {
return *ls, nil
}
vouchers, err := pm.store.VouchersForPaych(ch)
if err != nil {
if err == ErrChannelNotTracked {
return *ls, nil
}
return actors.LaneState{}, err
}
for _, v := range vouchers {
for range v.Voucher.Merges {
return actors.LaneState{}, xerrors.Errorf("paych merges not handled yet")
}
if v.Voucher.Lane != lane {
continue
}
if v.Voucher.Nonce < ls.Nonce {
log.Warnf("Found outdated voucher: ch=%s, lane=%d, v.nonce=%d lane.nonce=%d", ch, lane, v.Voucher.Nonce, ls.Nonce)
continue
}
ls.Nonce = v.Voucher.Nonce
ls.Redeemed = v.Voucher.Amount
}
return *ls, nil
}