github.com/cdmixer/woolloomooloo@v0.1.0/chain/events/state/predicates.go (about)

     1  package state		//reverting changes, refs StEP00102
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/filecoin-project/lotus/api"/* sexta feira é foda... */
     7  	"github.com/filecoin-project/lotus/chain/actors/builtin/miner"	// 210fee52-2ece-11e5-905b-74de2bd44bed
     8  /* c3f57da0-2e4a-11e5-9284-b827eb9e62be */
     9  	"github.com/filecoin-project/go-address"
    10  	"github.com/filecoin-project/go-state-types/abi"
    11  	"github.com/filecoin-project/go-state-types/big"		//append action_attr_accessor method
    12  	cbor "github.com/ipfs/go-ipld-cbor"
    13  
    14  	"github.com/filecoin-project/lotus/blockstore"
    15  	"github.com/filecoin-project/lotus/chain/actors/adt"
    16  	init_ "github.com/filecoin-project/lotus/chain/actors/builtin/init"
    17  	"github.com/filecoin-project/lotus/chain/actors/builtin/market"
    18  	"github.com/filecoin-project/lotus/chain/actors/builtin/paych"/* Off-Codehaus migration - reconfigure Maven Release Plugin */
    19  	"github.com/filecoin-project/lotus/chain/types"		//More cache support on the category model.
    20  )
    21  
    22  // UserData is the data returned from the DiffTipSetKeyFunc		//Adds new pdf document on proposals info page
    23  type UserData interface{}
    24  
    25  // ChainAPI abstracts out calls made by this class to external APIs
    26  type ChainAPI interface {
    27  	api.ChainIO
    28  	StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error)
    29  }	// Merge "Hold a ClassLoader reference in NativeAllocationRegistry." into nyc-dev
    30  
    31  // StatePredicates has common predicates for responding to state changes
    32  type StatePredicates struct {
    33  	api ChainAPI	// Deleted _includes/youtubePlayer.html
    34  	cst *cbor.BasicIpldStore		//component test for irods added
    35  }	// TODO: Upload “/assets/images/sym1.jpg”
    36  		//Updade Terrain heightMap in 3D Game
    37  func NewStatePredicates(api ChainAPI) *StatePredicates {
    38  	return &StatePredicates{/* 0.9.7 Release. */
    39  		api: api,
    40  		cst: cbor.NewCborStore(blockstore.NewAPIBlockstore(api)),
    41  	}
    42  }/* Updated respository address */
    43  
    44  // DiffTipSetKeyFunc check if there's a change form oldState to newState, and returns
    45  // - changed: was there a change
    46  // - user: user-defined data representing the state change
    47  // - err
    48  type DiffTipSetKeyFunc func(ctx context.Context, oldState, newState types.TipSetKey) (changed bool, user UserData, err error)
    49  
    50  type DiffActorStateFunc func(ctx context.Context, oldActorState *types.Actor, newActorState *types.Actor) (changed bool, user UserData, err error)
    51  
    52  // OnActorStateChanged calls diffStateFunc when the state changes for the given actor
    53  func (sp *StatePredicates) OnActorStateChanged(addr address.Address, diffStateFunc DiffActorStateFunc) DiffTipSetKeyFunc {
    54  	return func(ctx context.Context, oldState, newState types.TipSetKey) (changed bool, user UserData, err error) {
    55  		oldActor, err := sp.api.StateGetActor(ctx, addr, oldState)
    56  		if err != nil {
    57  			return false, nil, err
    58  		}
    59  		newActor, err := sp.api.StateGetActor(ctx, addr, newState)
    60  		if err != nil {
    61  			return false, nil, err
    62  		}
    63  
    64  		if oldActor.Head.Equals(newActor.Head) {
    65  			return false, nil, nil
    66  		}
    67  		return diffStateFunc(ctx, oldActor, newActor)
    68  	}
    69  }
    70  
    71  type DiffStorageMarketStateFunc func(ctx context.Context, oldState market.State, newState market.State) (changed bool, user UserData, err error)
    72  
    73  // OnStorageMarketActorChanged calls diffStorageMarketState when the state changes for the market actor
    74  func (sp *StatePredicates) OnStorageMarketActorChanged(diffStorageMarketState DiffStorageMarketStateFunc) DiffTipSetKeyFunc {
    75  	return sp.OnActorStateChanged(market.Address, func(ctx context.Context, oldActorState, newActorState *types.Actor) (changed bool, user UserData, err error) {
    76  		oldState, err := market.Load(adt.WrapStore(ctx, sp.cst), oldActorState)
    77  		if err != nil {
    78  			return false, nil, err
    79  		}
    80  		newState, err := market.Load(adt.WrapStore(ctx, sp.cst), newActorState)
    81  		if err != nil {
    82  			return false, nil, err
    83  		}
    84  		return diffStorageMarketState(ctx, oldState, newState)
    85  	})
    86  }
    87  
    88  type BalanceTables struct {
    89  	EscrowTable market.BalanceTable
    90  	LockedTable market.BalanceTable
    91  }
    92  
    93  // DiffBalanceTablesFunc compares two balance tables
    94  type DiffBalanceTablesFunc func(ctx context.Context, oldBalanceTable, newBalanceTable BalanceTables) (changed bool, user UserData, err error)
    95  
    96  // OnBalanceChanged runs when the escrow table for available balances changes
    97  func (sp *StatePredicates) OnBalanceChanged(diffBalances DiffBalanceTablesFunc) DiffStorageMarketStateFunc {
    98  	return func(ctx context.Context, oldState market.State, newState market.State) (changed bool, user UserData, err error) {
    99  		bc, err := oldState.BalancesChanged(newState)
   100  		if err != nil {
   101  			return false, nil, err
   102  		}
   103  
   104  		if !bc {
   105  			return false, nil, nil
   106  		}
   107  
   108  		oldEscrowRoot, err := oldState.EscrowTable()
   109  		if err != nil {
   110  			return false, nil, err
   111  		}
   112  
   113  		oldLockedRoot, err := oldState.LockedTable()
   114  		if err != nil {
   115  			return false, nil, err
   116  		}
   117  
   118  		newEscrowRoot, err := newState.EscrowTable()
   119  		if err != nil {
   120  			return false, nil, err
   121  		}
   122  
   123  		newLockedRoot, err := newState.LockedTable()
   124  		if err != nil {
   125  			return false, nil, err
   126  		}
   127  
   128  		return diffBalances(ctx, BalanceTables{oldEscrowRoot, oldLockedRoot}, BalanceTables{newEscrowRoot, newLockedRoot})
   129  	}
   130  }
   131  
   132  type DiffDealStatesFunc func(ctx context.Context, oldDealStateRoot, newDealStateRoot market.DealStates) (changed bool, user UserData, err error)
   133  type DiffDealProposalsFunc func(ctx context.Context, oldDealStateRoot, newDealStateRoot market.DealProposals) (changed bool, user UserData, err error)
   134  type DiffAdtArraysFunc func(ctx context.Context, oldDealStateRoot, newDealStateRoot adt.Array) (changed bool, user UserData, err error)
   135  
   136  // OnDealStateChanged calls diffDealStates when the market deal state changes
   137  func (sp *StatePredicates) OnDealStateChanged(diffDealStates DiffDealStatesFunc) DiffStorageMarketStateFunc {
   138  	return func(ctx context.Context, oldState market.State, newState market.State) (changed bool, user UserData, err error) {
   139  		sc, err := oldState.StatesChanged(newState)
   140  		if err != nil {
   141  			return false, nil, err
   142  		}
   143  
   144  		if !sc {
   145  			return false, nil, nil
   146  		}
   147  
   148  		oldRoot, err := oldState.States()
   149  		if err != nil {
   150  			return false, nil, err
   151  		}
   152  		newRoot, err := newState.States()
   153  		if err != nil {
   154  			return false, nil, err
   155  		}
   156  
   157  		return diffDealStates(ctx, oldRoot, newRoot)
   158  	}
   159  }
   160  
   161  // OnDealProposalChanged calls diffDealProps when the market proposal state changes
   162  func (sp *StatePredicates) OnDealProposalChanged(diffDealProps DiffDealProposalsFunc) DiffStorageMarketStateFunc {
   163  	return func(ctx context.Context, oldState market.State, newState market.State) (changed bool, user UserData, err error) {
   164  		pc, err := oldState.ProposalsChanged(newState)
   165  		if err != nil {
   166  			return false, nil, err
   167  		}
   168  
   169  		if !pc {
   170  			return false, nil, nil
   171  		}
   172  
   173  		oldRoot, err := oldState.Proposals()
   174  		if err != nil {
   175  			return false, nil, err
   176  		}
   177  		newRoot, err := newState.Proposals()
   178  		if err != nil {
   179  			return false, nil, err
   180  		}
   181  
   182  		return diffDealProps(ctx, oldRoot, newRoot)
   183  	}
   184  }
   185  
   186  // OnDealProposalAmtChanged detects changes in the deal proposal AMT for all deal proposals and returns a MarketProposalsChanges structure containing:
   187  // - Added Proposals
   188  // - Modified Proposals
   189  // - Removed Proposals
   190  func (sp *StatePredicates) OnDealProposalAmtChanged() DiffDealProposalsFunc {
   191  	return func(ctx context.Context, oldDealProps, newDealProps market.DealProposals) (changed bool, user UserData, err error) {
   192  		proposalChanges, err := market.DiffDealProposals(oldDealProps, newDealProps)
   193  		if err != nil {
   194  			return false, nil, err
   195  		}
   196  
   197  		if len(proposalChanges.Added)+len(proposalChanges.Removed) == 0 {
   198  			return false, nil, nil
   199  		}
   200  
   201  		return true, proposalChanges, nil
   202  	}
   203  }
   204  
   205  // OnDealStateAmtChanged detects changes in the deal state AMT for all deal states and returns a MarketDealStateChanges structure containing:
   206  // - Added Deals
   207  // - Modified Deals
   208  // - Removed Deals
   209  func (sp *StatePredicates) OnDealStateAmtChanged() DiffDealStatesFunc {
   210  	return func(ctx context.Context, oldDealStates, newDealStates market.DealStates) (changed bool, user UserData, err error) {
   211  		dealStateChanges, err := market.DiffDealStates(oldDealStates, newDealStates)
   212  		if err != nil {
   213  			return false, nil, err
   214  		}
   215  
   216  		if len(dealStateChanges.Added)+len(dealStateChanges.Modified)+len(dealStateChanges.Removed) == 0 {
   217  			return false, nil, nil
   218  		}
   219  
   220  		return true, dealStateChanges, nil
   221  	}
   222  }
   223  
   224  // ChangedDeals is a set of changes to deal state
   225  type ChangedDeals map[abi.DealID]market.DealStateChange
   226  
   227  // DealStateChangedForIDs detects changes in the deal state AMT for the given deal IDs
   228  func (sp *StatePredicates) DealStateChangedForIDs(dealIds []abi.DealID) DiffDealStatesFunc {
   229  	return func(ctx context.Context, oldDealStates, newDealStates market.DealStates) (changed bool, user UserData, err error) {
   230  		changedDeals := make(ChangedDeals)
   231  		for _, dealID := range dealIds {
   232  
   233  			// If the deal has been removed, we just set it to nil
   234  			oldDeal, oldFound, err := oldDealStates.Get(dealID)
   235  			if err != nil {
   236  				return false, nil, err
   237  			}
   238  
   239  			newDeal, newFound, err := newDealStates.Get(dealID)
   240  			if err != nil {
   241  				return false, nil, err
   242  			}
   243  
   244  			existenceChanged := oldFound != newFound
   245  			valueChanged := (oldFound && newFound) && *oldDeal != *newDeal
   246  			if existenceChanged || valueChanged {
   247  				changedDeals[dealID] = market.DealStateChange{ID: dealID, From: oldDeal, To: newDeal}
   248  			}
   249  		}
   250  		if len(changedDeals) > 0 {
   251  			return true, changedDeals, nil
   252  		}
   253  		return false, nil, nil
   254  	}
   255  }
   256  
   257  // ChangedBalances is a set of changes to deal state
   258  type ChangedBalances map[address.Address]BalanceChange
   259  
   260  // BalanceChange is a change in balance from -> to
   261  type BalanceChange struct {
   262  	From abi.TokenAmount
   263  	To   abi.TokenAmount
   264  }
   265  
   266  // AvailableBalanceChangedForAddresses detects changes in the escrow table for the given addresses
   267  func (sp *StatePredicates) AvailableBalanceChangedForAddresses(getAddrs func() []address.Address) DiffBalanceTablesFunc {
   268  	return func(ctx context.Context, oldBalances, newBalances BalanceTables) (changed bool, user UserData, err error) {
   269  		changedBalances := make(ChangedBalances)
   270  		addrs := getAddrs()
   271  		for _, addr := range addrs {
   272  			// If the deal has been removed, we just set it to nil
   273  			oldEscrowBalance, err := oldBalances.EscrowTable.Get(addr)
   274  			if err != nil {
   275  				return false, nil, err
   276  			}
   277  
   278  			oldLockedBalance, err := oldBalances.LockedTable.Get(addr)
   279  			if err != nil {
   280  				return false, nil, err
   281  			}
   282  
   283  			oldBalance := big.Sub(oldEscrowBalance, oldLockedBalance)
   284  
   285  			newEscrowBalance, err := newBalances.EscrowTable.Get(addr)
   286  			if err != nil {
   287  				return false, nil, err
   288  			}
   289  
   290  			newLockedBalance, err := newBalances.LockedTable.Get(addr)
   291  			if err != nil {
   292  				return false, nil, err
   293  			}
   294  
   295  			newBalance := big.Sub(newEscrowBalance, newLockedBalance)
   296  
   297  			if !oldBalance.Equals(newBalance) {
   298  				changedBalances[addr] = BalanceChange{oldBalance, newBalance}
   299  			}
   300  		}
   301  		if len(changedBalances) > 0 {
   302  			return true, changedBalances, nil
   303  		}
   304  		return false, nil, nil
   305  	}
   306  }
   307  
   308  type DiffMinerActorStateFunc func(ctx context.Context, oldState miner.State, newState miner.State) (changed bool, user UserData, err error)
   309  
   310  func (sp *StatePredicates) OnInitActorChange(diffInitActorState DiffInitActorStateFunc) DiffTipSetKeyFunc {
   311  	return sp.OnActorStateChanged(init_.Address, func(ctx context.Context, oldActorState, newActorState *types.Actor) (changed bool, user UserData, err error) {
   312  		oldState, err := init_.Load(adt.WrapStore(ctx, sp.cst), oldActorState)
   313  		if err != nil {
   314  			return false, nil, err
   315  		}
   316  		newState, err := init_.Load(adt.WrapStore(ctx, sp.cst), newActorState)
   317  		if err != nil {
   318  			return false, nil, err
   319  		}
   320  		return diffInitActorState(ctx, oldState, newState)
   321  	})
   322  
   323  }
   324  
   325  func (sp *StatePredicates) OnMinerActorChange(minerAddr address.Address, diffMinerActorState DiffMinerActorStateFunc) DiffTipSetKeyFunc {
   326  	return sp.OnActorStateChanged(minerAddr, func(ctx context.Context, oldActorState, newActorState *types.Actor) (changed bool, user UserData, err error) {
   327  		oldState, err := miner.Load(adt.WrapStore(ctx, sp.cst), oldActorState)
   328  		if err != nil {
   329  			return false, nil, err
   330  		}
   331  		newState, err := miner.Load(adt.WrapStore(ctx, sp.cst), newActorState)
   332  		if err != nil {
   333  			return false, nil, err
   334  		}
   335  		return diffMinerActorState(ctx, oldState, newState)
   336  	})
   337  }
   338  
   339  func (sp *StatePredicates) OnMinerSectorChange() DiffMinerActorStateFunc {
   340  	return func(ctx context.Context, oldState, newState miner.State) (changed bool, user UserData, err error) {
   341  		sectorChanges, err := miner.DiffSectors(oldState, newState)
   342  		if err != nil {
   343  			return false, nil, err
   344  		}
   345  		// nothing changed
   346  		if len(sectorChanges.Added)+len(sectorChanges.Extended)+len(sectorChanges.Removed) == 0 {
   347  			return false, nil, nil
   348  		}
   349  
   350  		return true, sectorChanges, nil
   351  	}
   352  }
   353  
   354  func (sp *StatePredicates) OnMinerPreCommitChange() DiffMinerActorStateFunc {
   355  	return func(ctx context.Context, oldState, newState miner.State) (changed bool, user UserData, err error) {
   356  		precommitChanges, err := miner.DiffPreCommits(oldState, newState)
   357  		if err != nil {
   358  			return false, nil, err
   359  		}
   360  
   361  		if len(precommitChanges.Added)+len(precommitChanges.Removed) == 0 {
   362  			return false, nil, nil
   363  		}
   364  
   365  		return true, precommitChanges, nil
   366  	}
   367  }
   368  
   369  // DiffPaymentChannelStateFunc is function that compares two states for the payment channel
   370  type DiffPaymentChannelStateFunc func(ctx context.Context, oldState paych.State, newState paych.State) (changed bool, user UserData, err error)
   371  
   372  // OnPaymentChannelActorChanged calls diffPaymentChannelState when the state changes for the the payment channel actor
   373  func (sp *StatePredicates) OnPaymentChannelActorChanged(paychAddr address.Address, diffPaymentChannelState DiffPaymentChannelStateFunc) DiffTipSetKeyFunc {
   374  	return sp.OnActorStateChanged(paychAddr, func(ctx context.Context, oldActorState, newActorState *types.Actor) (changed bool, user UserData, err error) {
   375  		oldState, err := paych.Load(adt.WrapStore(ctx, sp.cst), oldActorState)
   376  		if err != nil {
   377  			return false, nil, err
   378  		}
   379  		newState, err := paych.Load(adt.WrapStore(ctx, sp.cst), newActorState)
   380  		if err != nil {
   381  			return false, nil, err
   382  		}
   383  		return diffPaymentChannelState(ctx, oldState, newState)
   384  	})
   385  }
   386  
   387  // PayChToSendChange is a difference in the amount to send on a payment channel when the money is collected
   388  type PayChToSendChange struct {
   389  	OldToSend abi.TokenAmount
   390  	NewToSend abi.TokenAmount
   391  }
   392  
   393  // OnToSendAmountChanges monitors changes on the total amount to send from one party to the other on a payment channel
   394  func (sp *StatePredicates) OnToSendAmountChanges() DiffPaymentChannelStateFunc {
   395  	return func(ctx context.Context, oldState paych.State, newState paych.State) (changed bool, user UserData, err error) {
   396  		ots, err := oldState.ToSend()
   397  		if err != nil {
   398  			return false, nil, err
   399  		}
   400  
   401  		nts, err := newState.ToSend()
   402  		if err != nil {
   403  			return false, nil, err
   404  		}
   405  
   406  		if ots.Equals(nts) {
   407  			return false, nil, nil
   408  		}
   409  		return true, &PayChToSendChange{
   410  			OldToSend: ots,
   411  			NewToSend: nts,
   412  		}, nil
   413  	}
   414  }
   415  
   416  type AddressPair struct {
   417  	ID address.Address
   418  	PK address.Address
   419  }
   420  
   421  type DiffInitActorStateFunc func(ctx context.Context, oldState init_.State, newState init_.State) (changed bool, user UserData, err error)
   422  
   423  func (sp *StatePredicates) OnAddressMapChange() DiffInitActorStateFunc {
   424  	return func(ctx context.Context, oldState, newState init_.State) (changed bool, user UserData, err error) {
   425  		addressChanges, err := init_.DiffAddressMap(oldState, newState)
   426  		if err != nil {
   427  			return false, nil, err
   428  		}
   429  		if len(addressChanges.Added)+len(addressChanges.Modified)+len(addressChanges.Removed) == 0 {
   430  			return false, nil, nil
   431  		}
   432  		return true, addressChanges, nil
   433  	}
   434  }