on chain deals: More actor methods
This commit is contained in:
parent
c41dd4efeb
commit
6bade2eb23
@ -213,6 +213,14 @@ type CommitSectorParams struct {
|
|||||||
Proof []byte
|
Proof []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type OnChainSealVerifyInfo struct {
|
||||||
|
SealedCID cid.Cid // CommR .. TODO: spec says cid, but it feela weird
|
||||||
|
Epoch uint64
|
||||||
|
Proof []byte
|
||||||
|
DealIDs []uint64
|
||||||
|
SectorNumber uint64
|
||||||
|
}
|
||||||
|
|
||||||
func (sma StorageMinerActor) CommitSector(act *types.Actor, vmctx types.VMContext, params *CommitSectorParams) ([]byte, ActorError) {
|
func (sma StorageMinerActor) CommitSector(act *types.Actor, vmctx types.VMContext, params *CommitSectorParams) ([]byte, ActorError) {
|
||||||
ctx := context.TODO()
|
ctx := context.TODO()
|
||||||
oldstate, self, err := loadState(vmctx)
|
oldstate, self, err := loadState(vmctx)
|
||||||
|
@ -6,7 +6,9 @@ import (
|
|||||||
"github.com/filecoin-project/go-amt-ipld"
|
"github.com/filecoin-project/go-amt-ipld"
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
"github.com/ipfs/go-hamt-ipld"
|
"github.com/ipfs/go-hamt-ipld"
|
||||||
|
cbg "github.com/whyrusleeping/cbor-gen"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/go-lotus/build"
|
||||||
"github.com/filecoin-project/go-lotus/chain/actors/aerrors"
|
"github.com/filecoin-project/go-lotus/chain/actors/aerrors"
|
||||||
"github.com/filecoin-project/go-lotus/chain/address"
|
"github.com/filecoin-project/go-lotus/chain/address"
|
||||||
"github.com/filecoin-project/go-lotus/chain/types"
|
"github.com/filecoin-project/go-lotus/chain/types"
|
||||||
@ -25,9 +27,10 @@ type smaMethods struct {
|
|||||||
ProcessStorageDealsPayment uint64
|
ProcessStorageDealsPayment uint64
|
||||||
SlashStorageDealCollateral uint64
|
SlashStorageDealCollateral uint64
|
||||||
GetLastExpirationFromDealIDs uint64
|
GetLastExpirationFromDealIDs uint64
|
||||||
|
ActivateStorageDeals uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
var SMAMethods = smaMethods{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
|
var SMAMethods = smaMethods{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
|
||||||
|
|
||||||
func (sma StorageMarketActor) Exports() []interface{} {
|
func (sma StorageMarketActor) Exports() []interface{} {
|
||||||
return []interface{}{
|
return []interface{}{
|
||||||
@ -40,6 +43,7 @@ func (sma StorageMarketActor) Exports() []interface{} {
|
|||||||
// 8: sma.ProcessStorageDealsPayment,
|
// 8: sma.ProcessStorageDealsPayment,
|
||||||
// 9: sma.SlashStorageDealCollateral,
|
// 9: sma.SlashStorageDealCollateral,
|
||||||
// 10: sma.GetLastExpirationFromDealIDs,
|
// 10: sma.GetLastExpirationFromDealIDs,
|
||||||
|
11: sma.ActivateStorageDeals, // TODO: move under PublishStorageDeals after specs team approves
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,9 +53,10 @@ type StorageParticipantBalance struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type StorageMarketState struct {
|
type StorageMarketState struct {
|
||||||
Balances cid.Cid // hamt<StorageParticipantBalance>
|
Balances cid.Cid // hamt<addr, StorageParticipantBalance>
|
||||||
Deals cid.Cid // amt
|
Deals cid.Cid // amt<StorageDeal>
|
||||||
NextDealID uint64 // TODO: amt.LastIndex()
|
|
||||||
|
NextDealID uint64 // TODO: amt.LastIndex()
|
||||||
}
|
}
|
||||||
|
|
||||||
type StorageDealProposal struct {
|
type StorageDealProposal struct {
|
||||||
@ -71,6 +76,11 @@ type StorageDeal struct {
|
|||||||
CounterSignature types.Signature
|
CounterSignature types.Signature
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type OnChainDeal struct {
|
||||||
|
Deal StorageDeal
|
||||||
|
ActivationEpoch uint64 // 0 = inactive
|
||||||
|
}
|
||||||
|
|
||||||
type WithdrawBalanceParams struct {
|
type WithdrawBalanceParams struct {
|
||||||
Balance types.BigInt
|
Balance types.BigInt
|
||||||
}
|
}
|
||||||
@ -209,6 +219,9 @@ type PublishStorageDealResponse struct {
|
|||||||
DealIDs []uint64
|
DealIDs []uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: spec says 'call by CommitSector in StorageMiningSubsystem', and then
|
||||||
|
// says that this should be called before CommitSector. For now assuming that
|
||||||
|
// they meant 2 separate methods, See 'ActivateStorageDeals' below
|
||||||
func (sma StorageMarketActor) PublishStorageDeals(act *types.Actor, vmctx types.VMContext, params *PublishStorageDealsParams) ([]byte, ActorError) {
|
func (sma StorageMarketActor) PublishStorageDeals(act *types.Actor, vmctx types.VMContext, params *PublishStorageDealsParams) ([]byte, ActorError) {
|
||||||
var self StorageMarketState
|
var self StorageMarketState
|
||||||
old := vmctx.Storage().GetHead()
|
old := vmctx.Storage().GetHead()
|
||||||
@ -233,7 +246,7 @@ func (sma StorageMarketActor) PublishStorageDeals(act *types.Actor, vmctx types.
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
err := deals.Set(self.NextDealID, deal)
|
err := deals.Set(self.NextDealID, OnChainDeal{Deal: deal})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, aerrors.HandleExternalError(err, "setting deal in deal AMT")
|
return nil, aerrors.HandleExternalError(err, "setting deal in deal AMT")
|
||||||
}
|
}
|
||||||
@ -275,6 +288,9 @@ func (self *StorageMarketState) validateDeal(vmctx types.VMContext, deal Storage
|
|||||||
if vmctx.BlockHeight() >= deal.Proposal.DealExpiration {
|
if vmctx.BlockHeight() >= deal.Proposal.DealExpiration {
|
||||||
return aerrors.New(2, "deal proposal already expired")
|
return aerrors.New(2, "deal proposal already expired")
|
||||||
}
|
}
|
||||||
|
if deal.Proposal.ProposalExpiration > deal.Proposal.DealExpiration {
|
||||||
|
return aerrors.New(3, "ProposalExpiration > DealExpiration")
|
||||||
|
}
|
||||||
|
|
||||||
var proposalBuf bytes.Buffer
|
var proposalBuf bytes.Buffer
|
||||||
err := deal.Proposal.MarshalCBOR(&proposalBuf)
|
err := deal.Proposal.MarshalCBOR(&proposalBuf)
|
||||||
@ -300,7 +316,7 @@ func (self *StorageMarketState) validateDeal(vmctx types.VMContext, deal Storage
|
|||||||
|
|
||||||
// TODO: maybe this is actually fine
|
// TODO: maybe this is actually fine
|
||||||
if vmctx.Message().From != deal.Proposal.Provider && vmctx.Message().From != deal.Proposal.Client {
|
if vmctx.Message().From != deal.Proposal.Provider && vmctx.Message().From != deal.Proposal.Client {
|
||||||
return aerrors.New(3, "message not sent by deal participant")
|
return aerrors.New(4, "message not sent by deal participant")
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: REVIEW: Do we want to check if provider exists in the power actor?
|
// TODO: REVIEW: Do we want to check if provider exists in the power actor?
|
||||||
@ -317,14 +333,14 @@ func (self *StorageMarketState) validateDeal(vmctx types.VMContext, deal Storage
|
|||||||
providerBalance := b[1]
|
providerBalance := b[1]
|
||||||
|
|
||||||
if clientBalance.Available.LessThan(deal.Proposal.StoragePrice) {
|
if clientBalance.Available.LessThan(deal.Proposal.StoragePrice) {
|
||||||
return aerrors.Newf(4, "client doesn't have enough available funds to cover StoragePrice; %d < %d", clientBalance.Available, deal.Proposal.StoragePrice)
|
return aerrors.Newf(5, "client doesn't have enough available funds to cover StoragePrice; %d < %d", clientBalance.Available, deal.Proposal.StoragePrice)
|
||||||
}
|
}
|
||||||
|
|
||||||
clientBalance = lockFunds(clientBalance, deal.Proposal.StoragePrice)
|
clientBalance = lockFunds(clientBalance, deal.Proposal.StoragePrice)
|
||||||
|
|
||||||
// TODO: REVIEW: Not clear who pays for this
|
// TODO: REVIEW: Not clear who pays for this
|
||||||
if providerBalance.Available.LessThan(deal.Proposal.StorageCollateral) {
|
if providerBalance.Available.LessThan(deal.Proposal.StorageCollateral) {
|
||||||
return aerrors.Newf(5, "provider doesn't have enough available funds to cover StorageCollateral; %d < %d", providerBalance.Available, deal.Proposal.StorageCollateral)
|
return aerrors.Newf(6, "provider doesn't have enough available funds to cover StorageCollateral; %d < %d", providerBalance.Available, deal.Proposal.StorageCollateral)
|
||||||
}
|
}
|
||||||
|
|
||||||
providerBalance = lockFunds(providerBalance, deal.Proposal.StorageCollateral)
|
providerBalance = lockFunds(providerBalance, deal.Proposal.StorageCollateral)
|
||||||
@ -344,12 +360,161 @@ func (self *StorageMarketState) validateDeal(vmctx types.VMContext, deal Storage
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ActivateStorageDealsParams struct {
|
||||||
|
Deals []uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sma StorageMarketActor) ActivateStorageDeals(act *types.Actor, vmctx types.VMContext, params *ActivateStorageDealsParams) ([]byte, ActorError) {
|
||||||
|
var self StorageMarketState
|
||||||
|
old := vmctx.Storage().GetHead()
|
||||||
|
if err := vmctx.Storage().Get(old, &self); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
deals, err := amt.LoadAMT(types.WrapStorage(vmctx.Storage()), self.Deals)
|
||||||
|
if err != nil {
|
||||||
|
// TODO: kind of annoying that this can be caused by gas, otherwise could be fatal
|
||||||
|
return nil, aerrors.HandleExternalError(err, "loading deals amt")
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, deal := range params.Deals {
|
||||||
|
var dealInfo OnChainDeal
|
||||||
|
if err := deals.Get(deal, &dealInfo); err != nil {
|
||||||
|
return nil, aerrors.HandleExternalError(err, "getting del info failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
if vmctx.Message().From != dealInfo.Deal.Proposal.Provider {
|
||||||
|
return nil, aerrors.New(1, "ActivateStorageDeals can only be called by deal provider")
|
||||||
|
}
|
||||||
|
|
||||||
|
if vmctx.BlockHeight() > dealInfo.Deal.Proposal.ProposalExpiration {
|
||||||
|
return nil, aerrors.New(2, "deal cannot be activated: proposal expired")
|
||||||
|
}
|
||||||
|
|
||||||
|
if dealInfo.ActivationEpoch > 0 {
|
||||||
|
// this probably can't happen in practice
|
||||||
|
return nil, aerrors.New(3, "deal already active")
|
||||||
|
}
|
||||||
|
|
||||||
|
dealInfo.ActivationEpoch = vmctx.BlockHeight()
|
||||||
|
|
||||||
|
if err := deals.Set(deal, dealInfo); err != nil {
|
||||||
|
return nil, aerrors.HandleExternalError(err, "setting deal info in AMT failed")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dealsCid, err := deals.Flush()
|
||||||
|
if err != nil {
|
||||||
|
return nil, aerrors.HandleExternalError(err, "saving deals AMT")
|
||||||
|
}
|
||||||
|
|
||||||
|
self.Deals = dealsCid
|
||||||
|
|
||||||
|
nroot, err := vmctx.Storage().Put(&self)
|
||||||
|
if err != nil {
|
||||||
|
return nil, aerrors.HandleExternalError(err, "storing state failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
aerr := vmctx.Storage().Commit(old, nroot)
|
||||||
|
if aerr != nil {
|
||||||
|
return nil, aerr
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type ProcessStorageDealsPaymentParams struct {
|
||||||
|
DealIDs []uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sma StorageMarketActor) ProcessStorageDealsPayment(act *types.Actor, vmctx types.VMContext, params *ProcessStorageDealsPaymentParams) ([]byte, ActorError) {
|
||||||
|
var self StorageMarketState
|
||||||
|
old := vmctx.Storage().GetHead()
|
||||||
|
if err := vmctx.Storage().Get(old, &self); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
deals, err := amt.LoadAMT(types.WrapStorage(vmctx.Storage()), self.Deals)
|
||||||
|
if err != nil {
|
||||||
|
// TODO: kind of annoying that this can be caused by gas, otherwise could be fatal
|
||||||
|
return nil, aerrors.HandleExternalError(err, "loading deals amt")
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, deal := range params.DealIDs {
|
||||||
|
var dealInfo OnChainDeal
|
||||||
|
if err := deals.Get(deal, &dealInfo); err != nil {
|
||||||
|
return nil, aerrors.HandleExternalError(err, "getting del info failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
encoded, err := CreateExecParams(StorageMinerCodeCid, &IsMinerParam{
|
||||||
|
Addr: vmctx.Message().From,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ret, err := vmctx.Send(StoragePowerAddress, SPAMethods.IsMiner, types.NewInt(0), encoded)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if bytes.Equal(ret, cbg.CborBoolTrue) {
|
||||||
|
return nil, aerrors.New(1, "ProcessStorageDealsPayment can only be called by storage miner actors")
|
||||||
|
}
|
||||||
|
|
||||||
|
if vmctx.BlockHeight() > dealInfo.Deal.Proposal.ProposalExpiration {
|
||||||
|
// TODO: ???
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: clients probably want this to be fixed
|
||||||
|
dealDuration := dealInfo.Deal.Proposal.DealExpiration - dealInfo.ActivationEpoch
|
||||||
|
|
||||||
|
// todo: check math (written on a plane, also tired)
|
||||||
|
// TODO: division is hard, this more than likely has some off-by-one issue
|
||||||
|
toPay := types.BigDiv(types.BigMul(dealInfo.Deal.Proposal.StoragePrice, types.NewInt(build.ProvingPeriodDuration)), types.NewInt(dealDuration))
|
||||||
|
|
||||||
|
b, bnd, err := getMarketBalances(vmctx, self.Balances, []address.Address{
|
||||||
|
dealInfo.Deal.Proposal.Client,
|
||||||
|
dealInfo.Deal.Proposal.Provider,
|
||||||
|
})
|
||||||
|
clientBal := b[0]
|
||||||
|
providerBal := b[1]
|
||||||
|
|
||||||
|
clientBal.Locked, providerBal.Available = transferFunds(clientBal.Locked, providerBal.Available, toPay)
|
||||||
|
|
||||||
|
// TODO: call set once
|
||||||
|
bcid, aerr := setMarketBalances(vmctx, bnd, map[address.Address]StorageParticipantBalance{
|
||||||
|
dealInfo.Deal.Proposal.Client: clientBal,
|
||||||
|
dealInfo.Deal.Proposal.Provider: providerBal,
|
||||||
|
})
|
||||||
|
if aerr != nil {
|
||||||
|
return nil, aerr
|
||||||
|
}
|
||||||
|
|
||||||
|
self.Balances = bcid
|
||||||
|
}
|
||||||
|
|
||||||
|
nroot, err := vmctx.Storage().Put(&self)
|
||||||
|
if err != nil {
|
||||||
|
return nil, aerrors.HandleExternalError(err, "storing state failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
aerr := vmctx.Storage().Commit(old, nroot)
|
||||||
|
if aerr != nil {
|
||||||
|
return nil, aerr
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
func lockFunds(p StorageParticipantBalance, amt types.BigInt) StorageParticipantBalance {
|
func lockFunds(p StorageParticipantBalance, amt types.BigInt) StorageParticipantBalance {
|
||||||
p.Available, p.Locked = transferFunds(p.Available, p.Locked, amt)
|
p.Available, p.Locked = transferFunds(p.Available, p.Locked, amt)
|
||||||
return p
|
return p
|
||||||
}
|
}
|
||||||
|
|
||||||
func transferFunds(from, to, amt types.BigInt) (types.BigInt, types.BigInt) {
|
func transferFunds(from, to, amt types.BigInt) (types.BigInt, types.BigInt) {
|
||||||
|
// TODO: some asserts
|
||||||
return types.BigSub(from, amt), types.BigAdd(to, amt)
|
return types.BigSub(from, amt), types.BigAdd(to, amt)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3401,3 +3401,141 @@ func (t *PublishStorageDealResponse) UnmarshalCBOR(r io.Reader) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *ActivateStorageDealsParams) MarshalCBOR(w io.Writer) error {
|
||||||
|
if t == nil {
|
||||||
|
_, err := w.Write(cbg.CborNull)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := w.Write([]byte{129}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// t.t.Deals ([]uint64)
|
||||||
|
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajArray, uint64(len(t.Deals)))); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, v := range t.Deals {
|
||||||
|
if err := cbg.CborWriteHeader(w, cbg.MajUnsignedInt, v); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *ActivateStorageDealsParams) UnmarshalCBOR(r io.Reader) error {
|
||||||
|
br := cbg.GetPeeker(r)
|
||||||
|
|
||||||
|
maj, extra, err := cbg.CborReadHeader(br)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if maj != cbg.MajArray {
|
||||||
|
return fmt.Errorf("cbor input should be of type array")
|
||||||
|
}
|
||||||
|
|
||||||
|
if extra != 1 {
|
||||||
|
return fmt.Errorf("cbor input had wrong number of fields")
|
||||||
|
}
|
||||||
|
|
||||||
|
// t.t.Deals ([]uint64)
|
||||||
|
|
||||||
|
maj, extra, err = cbg.CborReadHeader(br)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if extra > 8192 {
|
||||||
|
return fmt.Errorf("t.Deals: array too large (%d)", extra)
|
||||||
|
}
|
||||||
|
|
||||||
|
if maj != cbg.MajArray {
|
||||||
|
return fmt.Errorf("expected cbor array")
|
||||||
|
}
|
||||||
|
if extra > 0 {
|
||||||
|
t.Deals = make([]uint64, extra)
|
||||||
|
}
|
||||||
|
for i := 0; i < int(extra); i++ {
|
||||||
|
|
||||||
|
maj, val, err := cbg.CborReadHeader(br)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("failed to read uint64 for t.Deals slice: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if maj != cbg.MajUnsignedInt {
|
||||||
|
return xerrors.Errorf("value read for array t.Deals was not a uint, instead got %d", maj)
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Deals[i] = val
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *ProcessStorageDealsPaymentParams) MarshalCBOR(w io.Writer) error {
|
||||||
|
if t == nil {
|
||||||
|
_, err := w.Write(cbg.CborNull)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := w.Write([]byte{129}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// t.t.DealIDs ([]uint64)
|
||||||
|
if _, err := w.Write(cbg.CborEncodeMajorType(cbg.MajArray, uint64(len(t.DealIDs)))); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, v := range t.DealIDs {
|
||||||
|
if err := cbg.CborWriteHeader(w, cbg.MajUnsignedInt, v); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *ProcessStorageDealsPaymentParams) UnmarshalCBOR(r io.Reader) error {
|
||||||
|
br := cbg.GetPeeker(r)
|
||||||
|
|
||||||
|
maj, extra, err := cbg.CborReadHeader(br)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if maj != cbg.MajArray {
|
||||||
|
return fmt.Errorf("cbor input should be of type array")
|
||||||
|
}
|
||||||
|
|
||||||
|
if extra != 1 {
|
||||||
|
return fmt.Errorf("cbor input had wrong number of fields")
|
||||||
|
}
|
||||||
|
|
||||||
|
// t.t.DealIDs ([]uint64)
|
||||||
|
|
||||||
|
maj, extra, err = cbg.CborReadHeader(br)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if extra > 8192 {
|
||||||
|
return fmt.Errorf("t.DealIDs: array too large (%d)", extra)
|
||||||
|
}
|
||||||
|
|
||||||
|
if maj != cbg.MajArray {
|
||||||
|
return fmt.Errorf("expected cbor array")
|
||||||
|
}
|
||||||
|
if extra > 0 {
|
||||||
|
t.DealIDs = make([]uint64, extra)
|
||||||
|
}
|
||||||
|
for i := 0; i < int(extra); i++ {
|
||||||
|
|
||||||
|
maj, val, err := cbg.CborReadHeader(br)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("failed to read uint64 for t.DealIDs slice: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if maj != cbg.MajUnsignedInt {
|
||||||
|
return xerrors.Errorf("value read for array t.DealIDs was not a uint, instead got %d", maj)
|
||||||
|
}
|
||||||
|
|
||||||
|
t.DealIDs[i] = val
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
@ -82,6 +82,8 @@ func main() {
|
|||||||
actors.StorageDeal{},
|
actors.StorageDeal{},
|
||||||
actors.PublishStorageDealsParams{},
|
actors.PublishStorageDealsParams{},
|
||||||
actors.PublishStorageDealResponse{},
|
actors.PublishStorageDealResponse{},
|
||||||
|
actors.ActivateStorageDealsParams{},
|
||||||
|
actors.ProcessStorageDealsPaymentParams{},
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
|
Loading…
Reference in New Issue
Block a user