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

308 lines
7.6 KiB
Go
Raw Normal View History

package market
import (
2022-03-12 18:07:35 +00:00
"unicode/utf8"
"github.com/ipfs/go-cid"
2022-11-08 05:53:13 +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-11-08 05:53:13 +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-11-08 05:53:13 +00:00
builtintypes "github.com/filecoin-project/go-state-types/builtin"
2022-09-26 16:47:48 +00:00
markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
2022-10-03 05:51:30 +00:00
verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg"
2022-11-08 05:53:13 +00:00
"github.com/filecoin-project/go-state-types/cbor"
"github.com/filecoin-project/go-state-types/manifest"
2022-11-08 05:53:13 +00:00
"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 {
if name != manifest.MarketKey {
2022-04-20 21:34:28 +00:00
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-11-08 04:55:56 +00:00
case actorstypes.Version10:
return load10(store, act.Head)
case actorstypes.Version11:
return load11(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-11-08 04:55:56 +00:00
case actorstypes.Version10:
return make10(store)
case actorstypes.Version11:
return make11(store)
2022-04-04 11:30:42 +00:00
}
return nil, xerrors.Errorf("unknown actor version %d", av)
}
type State interface {
cbor.Marshaler
Code() cid.Cid
ActorKey() string
ActorVersion() actorstypes.Version
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{}
2022-10-05 18:43:16 +00:00
GetAllocationIdForPendingDeal(dealId abi.DealID) (verifregtypes.AllocationId, error)
}
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-11-08 04:55:56 +00:00
case actorstypes.Version10:
return decodePublishStorageDealsReturn10(b)
case actorstypes.Version11:
return decodePublishStorageDealsReturn11(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
}
}
func AllCodes() []cid.Cid {
return []cid.Cid{
(&state0{}).Code(),
(&state2{}).Code(),
(&state3{}).Code(),
(&state4{}).Code(),
(&state5{}).Code(),
(&state6{}).Code(),
(&state7{}).Code(),
(&state8{}).Code(),
(&state9{}).Code(),
2022-11-22 18:03:02 +00:00
(&state10{}).Code(),
(&state11{}).Code(),
}
}