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

201 lines
5.1 KiB
Plaintext
Raw Normal View History

package market
import (
2022-09-06 15:49:29 +00:00
actorstypes "github.com/filecoin-project/go-state-types/actors"
"unicode/utf8"
2022-03-12 18:07:35 +00:00
"github.com/filecoin-project/go-state-types/network"
"golang.org/x/xerrors"
"github.com/filecoin-project/go-address"
"github.com/filecoin-project/go-state-types/abi"
2021-04-30 15:51:24 +00:00
"github.com/filecoin-project/go-state-types/big"
"github.com/filecoin-project/go-state-types/cbor"
cbg "github.com/whyrusleeping/cbor-gen"
2022-09-26 16:47:48 +00:00
markettypes "github.com/filecoin-project/go-state-types/builtin/v9/market"
{{range .versions}}
2022-04-20 21:34:28 +00:00
{{if (le . 7)}}
builtin{{.}} "github.com/filecoin-project/specs-actors{{import .}}actors/builtin"
{{end}}
{{end}}
2022-09-06 15:49:29 +00:00
builtintypes "github.com/filecoin-project/go-state-types/builtin"
"github.com/filecoin-project/lotus/chain/actors/adt"
"github.com/filecoin-project/lotus/chain/actors"
"github.com/filecoin-project/lotus/chain/types"
)
var (
2022-09-06 15:49:29 +00:00
Address = builtintypes.StorageMarketActorAddr
Methods = builtintypes.MethodsMarket
)
func Load(store adt.Store, act *types.Actor) (State, error) {
2022-04-04 11:23:13 +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:23:13 +00:00
}
switch av {
{{range .versions}}
2022-04-20 21:34:28 +00:00
{{if (ge . 8)}}
2022-09-06 15:49:29 +00:00
case actorstypes.Version{{.}}:
2022-04-20 21:34:28 +00:00
return load{{.}}(store, act.Head)
{{end}}
2022-04-04 11:23:13 +00:00
{{end}}
}
}
switch act.Code {
{{range .versions}}
2022-04-20 21:34:28 +00:00
{{if (le . 7)}}
case builtin{{.}}.StorageMarketActorCodeID:
return load{{.}}(store, act.Head)
{{end}}
{{end}}
}
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 {
{{range .versions}}
2022-09-06 15:49:29 +00:00
case actorstypes.Version{{.}}:
return make{{.}}(store)
{{end}}
}
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)
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 {
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 {
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 {
{{range .versions}}
2022-09-06 15:49:29 +00:00
case actorstypes.Version{{.}}:
return decodePublishStorageDealsReturn{{.}}(b)
{{end}}
}
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
2022-09-06 15:49:29 +00:00
type DealState = markettypes.DealState
type DealStateChanges struct {
Added []DealIDState
Modified []DealStateChange
Removed []DealIDState
}
type DealIDState struct {
ID abi.DealID
Deal DealState
}
// DealStateChange is a change in deal state from -> to
type DealStateChange struct {
ID abi.DealID
From *DealState
To *DealState
}
type DealProposalChanges struct {
Added []ProposalIDState
Removed []ProposalIDState
}
type ProposalIDState struct {
ID abi.DealID
2022-09-06 15:49:29 +00:00
Proposal markettypes.DealProposal
}
func EmptyDealState() *DealState {
return &DealState{
SectorStartEpoch: -1,
SlashEpoch: -1,
LastUpdatedEpoch: -1,
}
}
2021-04-30 15:51:24 +00:00
// 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) {
tf := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(deal.EndEpoch-deal.StartEpoch)))
2021-04-30 15:51:24 +00:00
ef := big.Mul(deal.StoragePricePerEpoch, big.NewInt(int64(height-deal.StartEpoch)))
if ef.LessThan(big.Zero()) {
ef = big.Zero()
}
2021-04-30 15:51:24 +00:00
if ef.GreaterThan(tf) {
ef = tf
}
2021-04-30 15:51:24 +00:00
return ef, big.Sub(tf, ef)
2021-04-30 15:51:24 +00:00
}
2022-03-12 18:07:35 +00:00
2022-09-06 15:49:29 +00:00
func IsDealActive(state markettypes.DealState) bool {
2022-08-02 22:54:42 +00:00
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
}
}