@@ -70,15 +70,7 @@ func (accounting *AccountingState) commitRound() error {
7070 if err != nil {
7171 return err
7272 }
73- accounting .AlgoUpdates = nil
74- accounting .AccountTypes = nil
75- accounting .AccountDataUpdates = nil
76- accounting .AssetUpdates = nil
77- accounting .AcfgUpdates = nil
78- accounting .TxnAssetUpdates = nil
79- accounting .FreezeUpdates = nil
80- accounting .AssetCloses = nil
81- accounting .AssetDestroys = nil
73+ accounting .RoundUpdates .Clear ()
8274 accounting .dirty = false
8375 return nil
8476}
@@ -203,7 +195,10 @@ func blankLsig(lsig atypes.LogicSig) bool {
203195 return len (lsig .Logic ) == 0
204196}
205197
206- func (accounting * AccountingState ) AddTransaction (round uint64 , intra int , txnbytes []byte ) (err error ) {
198+ func (accounting * AccountingState ) AddTransaction (txnr * idb.TxnRow ) (err error ) {
199+ round := txnr .Round
200+ intra := txnr .Intra
201+ txnbytes := txnr .TxnBytes
207202 var stxn types.SignedTxnWithAD
208203 err = msgpack .Decode (txnbytes , & stxn )
209204 if err != nil {
@@ -295,19 +290,14 @@ func (accounting *AccountingState) AddTransaction(round uint64, intra int, txnby
295290 }
296291 } else if stxn .Txn .Type == "acfg" {
297292 assetId := uint64 (stxn .Txn .ConfigAsset )
298- if assetId == 0 {
299- // create an asset
300- txnCounter , err := accounting .getTxnCounter (round - 1 )
301- if err != nil {
302- return fmt .Errorf ("acfg get TxnCounter round %d, %v" , round , err )
303- }
304- assetId = txnCounter + uint64 (intra ) + 1
305- accounting .updateTxnAsset (round , intra , assetId )
293+ isNew := assetId == 0
294+ if isNew {
295+ assetId = txnr .AssetId
306296 }
307297 if stxn .Txn .AssetParams .IsZero () {
308298 accounting .destroyAsset (assetId )
309299 } else {
310- accounting .AcfgUpdates = append (accounting .AcfgUpdates , idb.AcfgUpdate {AssetId : assetId , Creator : stxn .Txn .Sender , Params : stxn .Txn .AssetParams })
300+ accounting .AcfgUpdates = append (accounting .AcfgUpdates , idb.AcfgUpdate {AssetId : assetId , IsNew : isNew , Creator : stxn .Txn .Sender , Params : stxn .Txn .AssetParams })
311301 accounting .defaultFrozen [assetId ] = stxn .Txn .AssetParams .DefaultFrozen
312302 if stxn .Txn .ConfigAsset == 0 {
313303 // initial creation, give all initial value to creator
@@ -333,6 +323,69 @@ func (accounting *AccountingState) AddTransaction(round uint64, intra int, txnby
333323 }
334324 } else if stxn .Txn .Type == "afrz" {
335325 accounting .freezeAsset (stxn .Txn .FreezeAccount , uint64 (stxn .Txn .FreezeAsset ), stxn .Txn .AssetFrozen )
326+ } else if stxn .Txn .Type == "appl" {
327+ hasGlobal := (len (stxn .EvalDelta .GlobalDelta ) > 0 ) || (len (stxn .Txn .ApprovalProgram ) > 0 ) || (len (stxn .Txn .ClearStateProgram ) > 0 ) || stxn .Txn .OnCompletion == atypes .DeleteApplicationOC
328+ appid := uint64 (stxn .Txn .ApplicationID )
329+ if appid == 0 {
330+ // creation
331+ appid = txnr .AssetId
332+ }
333+ if hasGlobal {
334+ agd := idb.AppDelta {
335+ AppIndex : int64 (appid ),
336+ Round : round ,
337+ Intra : intra ,
338+ //Address: nil,
339+ Delta : stxn .EvalDelta .GlobalDelta ,
340+ OnCompletion : stxn .Txn .OnCompletion ,
341+ ApprovalProgram : stxn .Txn .ApprovalProgram ,
342+ ClearStateProgram : stxn .Txn .ClearStateProgram ,
343+ LocalStateSchema : stxn .Txn .LocalStateSchema ,
344+ GlobalStateSchema : stxn .Txn .GlobalStateSchema ,
345+ }
346+ if stxn .Txn .ApplicationID == 0 {
347+ // app creation
348+ agd .Creator = stxn .Txn .Sender [:]
349+ }
350+ //fmt.Printf("agset %d %s\n", appid, agd.String())
351+ accounting .AppGlobalDeltas = append (
352+ accounting .AppGlobalDeltas ,
353+ agd ,
354+ )
355+ }
356+ for accountIndex , ldelts := range stxn .EvalDelta .LocalDeltas {
357+ var addr []byte
358+ if accountIndex == 0 {
359+ addr = stxn .Txn .Sender [:]
360+ } else {
361+ addr = stxn .Txn .Accounts [accountIndex - 1 ][:]
362+ }
363+ accounting .AppLocalDeltas = append (
364+ accounting .AppLocalDeltas ,
365+ idb.AppDelta {
366+ AppIndex : int64 (appid ),
367+ Round : round ,
368+ Intra : intra ,
369+ Address : addr ,
370+ AddrIndex : accountIndex ,
371+ Delta : ldelts ,
372+ OnCompletion : stxn .Txn .OnCompletion ,
373+ },
374+ )
375+ }
376+ // if there's no other content change, but a state change of opt-in/close-out/clear-state, record that
377+ if len (stxn .EvalDelta .LocalDeltas ) == 0 && (stxn .Txn .OnCompletion == atypes .OptInOC || stxn .Txn .OnCompletion == atypes .CloseOutOC || stxn .Txn .OnCompletion == atypes .ClearStateOC ) {
378+ accounting .AppLocalDeltas = append (
379+ accounting .AppLocalDeltas ,
380+ idb.AppDelta {
381+ AppIndex : int64 (appid ),
382+ Address : stxn .Txn .Sender [:],
383+ Round : round ,
384+ Intra : intra ,
385+ OnCompletion : stxn .Txn .OnCompletion ,
386+ },
387+ )
388+ }
336389 } else {
337390 return fmt .Errorf ("txn r=%d i=%d UNKNOWN TYPE %#v\n " , round , intra , stxn .Txn .Type )
338391 }
0 commit comments