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 }