github.com/filecoin-project/specs-actors/v4@v4.0.2/actors/migration/nv10/market.go (about)

     1  package nv10
     2  
     3  import (
     4  	"context"
     5  
     6  	cid "github.com/ipfs/go-cid"
     7  	cbor "github.com/ipfs/go-ipld-cbor"
     8  
     9  	market2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/market"
    10  	adt2 "github.com/filecoin-project/specs-actors/v2/actors/util/adt"
    11  
    12  	builtin3 "github.com/filecoin-project/specs-actors/v4/actors/builtin"
    13  	market3 "github.com/filecoin-project/specs-actors/v4/actors/builtin/market"
    14  	adt3 "github.com/filecoin-project/specs-actors/v4/actors/util/adt"
    15  )
    16  
    17  type marketMigrator struct{}
    18  
    19  func (m marketMigrator) migrateState(ctx context.Context, store cbor.IpldStore, in actorMigrationInput) (*actorMigrationResult, error) {
    20  	var inState market2.State
    21  	if err := store.Get(ctx, in.head, &inState); err != nil {
    22  		return nil, err
    23  	}
    24  
    25  	pendingProposalsCidOut, err := m.MapPendingProposals(ctx, store, inState.PendingProposals)
    26  	if err != nil {
    27  		return nil, err
    28  	}
    29  	proposalsCidOut, err := migrateAMTRaw(ctx, store, inState.Proposals, market3.ProposalsAmtBitwidth)
    30  	if err != nil {
    31  		return nil, err
    32  	}
    33  	statesCidOut, err := migrateAMTRaw(ctx, store, inState.States, market3.StatesAmtBitwidth)
    34  	if err != nil {
    35  		return nil, err
    36  	}
    37  	escrowTableCidOut, err := migrateHAMTRaw(ctx, store, inState.EscrowTable, adt3.BalanceTableBitwidth)
    38  	if err != nil {
    39  		return nil, err
    40  	}
    41  	lockedTableCidOut, err := migrateHAMTRaw(ctx, store, inState.LockedTable, adt3.BalanceTableBitwidth)
    42  	if err != nil {
    43  		return nil, err
    44  	}
    45  	dobeCidOut, err := migrateHAMTHAMTRaw(ctx, store, inState.DealOpsByEpoch, builtin3.DefaultHamtBitwidth, builtin3.DefaultHamtBitwidth)
    46  	if err != nil {
    47  		return nil, err
    48  	}
    49  
    50  	outState := market3.State{
    51  		Proposals:                     proposalsCidOut,
    52  		States:                        statesCidOut,
    53  		PendingProposals:              pendingProposalsCidOut,
    54  		EscrowTable:                   escrowTableCidOut,
    55  		LockedTable:                   lockedTableCidOut,
    56  		NextID:                        inState.NextID,
    57  		DealOpsByEpoch:                dobeCidOut,
    58  		LastCron:                      inState.LastCron,
    59  		TotalClientLockedCollateral:   inState.TotalClientLockedCollateral,
    60  		TotalProviderLockedCollateral: inState.TotalProviderLockedCollateral,
    61  		TotalClientStorageFee:         inState.TotalClientStorageFee,
    62  	}
    63  
    64  	newHead, err := store.Put(ctx, &outState)
    65  	return &actorMigrationResult{
    66  		newCodeCID: m.migratedCodeCID(),
    67  		newHead:    newHead,
    68  	}, err
    69  }
    70  
    71  func (m marketMigrator) migratedCodeCID() cid.Cid {
    72  	return builtin3.StorageMarketActorCodeID
    73  }
    74  
    75  func (a marketMigrator) MapPendingProposals(ctx context.Context, store cbor.IpldStore, pendingProposalsRoot cid.Cid) (cid.Cid, error) {
    76  	oldPendingProposals, err := adt2.AsMap(adt2.WrapStore(ctx, store), pendingProposalsRoot)
    77  	if err != nil {
    78  		return cid.Undef, err
    79  	}
    80  
    81  	newPendingProposals, err := adt3.MakeEmptySet(adt3.WrapStore(ctx, store), builtin3.DefaultHamtBitwidth)
    82  	if err != nil {
    83  		return cid.Undef, err
    84  	}
    85  
    86  	err = oldPendingProposals.ForEach(nil, func(key string) error {
    87  		return newPendingProposals.Put(StringKey(key))
    88  	})
    89  	if err != nil {
    90  		return cid.Undef, err
    91  	}
    92  
    93  	newPendingProposalsCid, err := newPendingProposals.Root()
    94  	if err != nil {
    95  		return cid.Undef, err
    96  	}
    97  
    98  	return newPendingProposalsCid, nil
    99  }
   100  
   101  // An adt.Map key that just preserves the underlying string.
   102  type StringKey string
   103  
   104  func (k StringKey) Key() string {
   105  	return string(k)
   106  }