lotus/chain/actors/builtin/market/market.go

265 lines
6.6 KiB
Go
Raw Normal View History

package market
import (
2022-03-12 18:07:35 +00:00
"unicode/utf8"
2022-09-07 23:30:55 +00:00
cbg "github.com/whyrusleeping/cbor-gen"
2020-09-14 11:14:06 +00:00
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
2022-09-07 23:30:55 +00:00
actorstypes "github.com/filecoin-project/go-state-types/actors"
2021-04-30 15:51:24 +00:00
"github.com/filecoin-project/go-state-types/big"
2022-09-07 23:30:55 +00:00
builtintypes "github.com/filecoin-project/go-state-types/builtin"
2022-09-06 15:49:29 +00:00
markettypes "github.com/filecoin-project/go-state-types/builtin/v8/market"
2022-09-07 23:30:55 +00:00
"github.com/filecoin-project/go-state-types/cbor"
"github.com/filecoin-project/go-state-types/network"
builtin0 "github.com/filecoin-project/specs-actors/actors/builtin"
builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin"
2021-01-16 04:58:18 +00:00
builtin3 "github.com/filecoin-project/specs-actors/v3/actors/builtin"
builtin4 "github.com/filecoin-project/specs-actors/v4/actors/builtin"
2021-05-06 05:44:11 +00:00
builtin5 "github.com/filecoin-project/specs-actors/v5/actors/builtin"
2021-09-15 15:22:25 +00:00
builtin6 "github.com/filecoin-project/specs-actors/v6/actors/builtin"
2021-11-04 15:59:29 +00:00
builtin7 "github.com/filecoin-project/specs-actors/v7/actors/builtin"
2022-04-04 11:25:03 +00:00
"github.com/filecoin-project/lotus/chain/actors"
2022-04-04 11:30:42 +00:00
"github.com/filecoin-project/lotus/chain/actors/adt"
2020-09-14 11:14:06 +00:00
"github.com/filecoin-project/lotus/chain/types"
)
var (
2022-09-06 15:49:29 +00:00
Address = builtintypes.StorageMarketActorAddr
Methods = builtintypes.MethodsMarket
)
2020-09-15 23:47:58 +00:00
func Load(store adt.Store, act *types.Actor) (State, error) {
2022-04-04 11:25:03 +00:00
if name, av, ok := actors.GetActorMetaByCode(act.Code); ok {
2022-04-20 21:34:28 +00:00
if name != actors.MarketKey {
return nil, xerrors.Errorf("actor code is not market: %s", name)
2022-04-04 11:30:42 +00:00
}
switch av {
2022-09-06 15:49:29 +00:00
case actorstypes.Version8:
2022-04-04 11:30:42 +00:00
return load8(store, act.Head)
2022-09-06 15:49:29 +00:00
case actorstypes.Version9:
return load9(store, act.Head)
2022-04-04 11:30:42 +00:00
}
2022-04-04 11:25:03 +00:00
}
switch act.Code {
case builtin0.StorageMarketActorCodeID:
return load0(store, act.Head)
case builtin2.StorageMarketActorCodeID:
return load2(store, act.Head)
2021-01-16 04:58:18 +00:00
case builtin3.StorageMarketActorCodeID:
return load3(store, act.Head)
case builtin4.StorageMarketActorCodeID:
return load4(store, act.Head)
2021-05-06 05:44:11 +00:00
case builtin5.StorageMarketActorCodeID:
return load5(store, act.Head)
2021-09-15 15:22:25 +00:00
case builtin6.StorageMarketActorCodeID:
return load6(store, act.Head)
2021-11-04 15:59:29 +00:00
case builtin7.StorageMarketActorCodeID:
return load7(store, act.Head)
}
2022-04-20 21:34:28 +00:00
return nil, xerrors.Errorf("unknown actor code %s", act.Code)
}
2022-09-06 15:49:29 +00:00
func MakeState(store adt.Store, av actorstypes.Version) (State, error) {
switch av {
2022-09-06 15:49:29 +00:00
case actorstypes.Version0:
return make0(store)
2022-09-06 15:49:29 +00:00
case actorstypes.Version2:
return make2(store)
2022-09-06 15:49:29 +00:00
case actorstypes.Version3:
return make3(store)
2022-09-06 15:49:29 +00:00
case actorstypes.Version4:
return make4(store)
2022-09-06 15:49:29 +00:00
case actorstypes.Version5:
2021-05-27 10:27:47 +00:00
return make5(store)
2022-09-06 15:49:29 +00:00
case actorstypes.Version6:
2021-09-15 15:22:25 +00:00
return make6(store)
2022-09-06 15:49:29 +00:00
case actorstypes.Version7:
2021-11-04 15:59:29 +00:00
return make7(store)
2022-09-06 15:49:29 +00:00
case actorstypes.Version8:
2022-03-01 03:57:40 +00:00
return make8(store)
2022-09-06 15:49:29 +00:00
case actorstypes.Version9:
return make9(store)
2022-04-04 11:30:42 +00:00
}
return nil, xerrors.Errorf("unknown actor version %d", av)
}
type State interface {
cbor.Marshaler
BalancesChanged(State) (bool, error)
EscrowTable() (BalanceTable, error)
LockedTable() (BalanceTable, error)
TotalLocked() (abi.TokenAmount, error)
StatesChanged(State) (bool, error)
States() (DealStates, error)
ProposalsChanged(State) (bool, error)
Proposals() (DealProposals, error)
2020-09-15 23:47:58 +00:00
VerifyDealsForActivation(
minerAddr address.Address, deals []abi.DealID, currEpoch, sectorExpiry abi.ChainEpoch,
) (weight, verifiedWeight abi.DealWeight, err error)
NextID() (abi.DealID, error)
GetState() interface{}
}
type BalanceTable interface {
ForEach(cb func(address.Address, abi.TokenAmount) error) error
Get(key address.Address) (abi.TokenAmount, error)
}
type DealStates interface {
2020-09-22 21:09:33 +00:00
ForEach(cb func(id abi.DealID, ds DealState) error) error
Get(id abi.DealID) (*DealState, bool, error)
array() adt.Array
decode(*cbg.Deferred) (*DealState, error)
}
type DealProposals interface {
2022-09-06 15:49:29 +00:00
ForEach(cb func(id abi.DealID, dp markettypes.DealProposal) error) error
Get(id abi.DealID) (*markettypes.DealProposal, bool, error)
array() adt.Array
2022-09-06 15:49:29 +00:00
decode(*cbg.Deferred) (*markettypes.DealProposal, error)
}
type PublishStorageDealsReturn interface {
2022-04-04 11:30:42 +00:00
DealIDs() ([]abi.DealID, error)
// Note that this index is based on the batch of deals that were published, NOT the DealID
2022-04-12 19:34:45 +00:00
IsDealValid(index uint64) (bool, int, error)
}
func DecodePublishStorageDealsReturn(b []byte, nv network.Version) (PublishStorageDealsReturn, error) {
2022-09-06 15:49:29 +00:00
av, err := actorstypes.VersionForNetwork(nv)
if err != nil {
return nil, err
}
switch av {
2022-09-06 15:49:29 +00:00
case actorstypes.Version0:
return decodePublishStorageDealsReturn0(b)
2022-09-06 15:49:29 +00:00
case actorstypes.Version2:
return decodePublishStorageDealsReturn2(b)
2022-09-06 15:49:29 +00:00
case actorstypes.Version3:
return decodePublishStorageDealsReturn3(b)
2022-09-06 15:49:29 +00:00
case actorstypes.Version4:
return decodePublishStorageDealsReturn4(b)
2022-09-06 15:49:29 +00:00
case actorstypes.Version5:
return decodePublishStorageDealsReturn5(b)
2022-09-06 15:49:29 +00:00
case actorstypes.Version6:
return decodePublishStorageDealsReturn6(b)
2022-09-06 15:49:29 +00:00
case actorstypes.Version7:
2021-11-04 15:59:29 +00:00
return decodePublishStorageDealsReturn7(b)
2022-09-06 15:49:29 +00:00
case actorstypes.Version8:
2022-03-01 03:57:40 +00:00
return decodePublishStorageDealsReturn8(b)
2022-09-06 15:49:29 +00:00
case actorstypes.Version9:
return decodePublishStorageDealsReturn9(b)
2022-04-04 11:30:42 +00:00
}
return nil, xerrors.Errorf("unknown actor version %d", av)
}
2022-09-06 15:49:29 +00:00
type DealProposal = markettypes.DealProposal
type DealLabel = markettypes.DealLabel
2020-09-23 06:18:52 +00:00
2022-09-06 15:49:29 +00:00
type DealState = markettypes.DealState
type DealStateChanges struct {
2022-04-04 11:30:42 +00:00
Added []DealIDState
Modified []DealStateChange
2022-04-04 11:30:42 +00:00
Removed []DealIDState
}
type DealIDState struct {
2022-04-04 11:30:42 +00:00
ID abi.DealID
Deal DealState
}
// DealStateChange is a change in deal state from -> to
type DealStateChange struct {
2022-04-04 11:30:42 +00:00
ID abi.DealID
From *DealState
2022-04-04 11:30:42 +00:00
To *DealState
}
type DealProposalChanges struct {
2022-04-04 11:30:42 +00:00
Added []ProposalIDState
Removed []ProposalIDState
}
type ProposalIDState struct {
2022-04-04 11:30:42 +00:00
ID abi.DealID
2022-09-06 15:49:29 +00:00
Proposal markettypes.DealProposal
}
func EmptyDealState() *DealState {
return &DealState{
SectorStartEpoch: -1,
2022-04-04 11:30:42 +00:00
SlashEpoch: -1,
LastUpdatedEpoch: -1,
}
}
// returns the earned fees and pending fees for a given deal
2022-09-06 15:49:29 +00:00
func GetDealFees(deal markettypes.DealProposal, height abi.ChainEpoch) (abi.TokenAmount, abi.TokenAmount) {
2022-04-04 11:30:42 +00:00
tf := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(deal.EndEpoch-deal.StartEpoch)))
2022-04-04 11:30:42 +00:00
ef := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(height-deal.StartEpoch)))
if ef.LessThan(big.Zero()) {
ef = big.Zero()
}
2022-04-04 11:30:42 +00:00
if ef.GreaterThan(tf) {
ef = tf
}
2022-04-04 11:30:42 +00:00
return ef, big.Sub(tf, ef)
}
2022-03-12 18:07:35 +00:00
2022-09-06 15:49:29 +00:00
func IsDealActive(state markettypes.DealState) bool {
return state.SectorStartEpoch > -1 && state.SlashEpoch == -1
}
2022-09-06 15:49:29 +00:00
func labelFromGoString(s string) (markettypes.DealLabel, error) {
2022-03-12 18:07:35 +00:00
if utf8.ValidString(s) {
2022-09-06 15:49:29 +00:00
return markettypes.NewLabelFromString(s)
2022-03-12 18:07:35 +00:00
} else {
2022-09-06 15:49:29 +00:00
return markettypes.NewLabelFromBytes([]byte(s))
2022-03-12 18:07:35 +00:00
}
}