@@ -288,14 +288,16 @@ func decode(handle codec.Handle, data []byte, v interface{}) error {
288288 return nil
289289}
290290
291- // Helper to convert basics.StateDelta -> *model.StateDelta
292- func stateDeltaToStateDelta (d basics.StateDelta ) * model.StateDelta {
293- if len (d ) == 0 {
291+ // globalDeltaToStateDelta converts basics.StateDelta -> model.StateDelta. It
292+ // should only be used on globals, because locals require extra context to
293+ // translate account indexes.
294+ func globalDeltaToStateDelta (bsd basics.StateDelta ) model.StateDelta {
295+ if len (bsd ) == 0 {
294296 return nil
295297 }
296- var delta model.StateDelta
297- for k , v := range d {
298- delta = append (delta , model.EvalDeltaKeyValue {
298+ msd := make ( model.StateDelta , 0 , len ( bsd ))
299+ for k , v := range bsd {
300+ msd = append (msd , model.EvalDeltaKeyValue {
299301 Key : base64 .StdEncoding .EncodeToString ([]byte (k )),
300302 Value : model.EvalDelta {
301303 Action : uint64 (v .Action ),
@@ -304,7 +306,7 @@ func stateDeltaToStateDelta(d basics.StateDelta) *model.StateDelta {
304306 },
305307 })
306308 }
307- return & delta
309+ return msd
308310}
309311
310312func edIndexToAddress (index uint64 , txn * transactions.Transaction , shared []basics.Address ) string {
@@ -321,23 +323,21 @@ func edIndexToAddress(index uint64, txn *transactions.Transaction, shared []basi
321323 }
322324}
323325
324- func convertToDeltas (txn node.TxnWithStatus ) (* []model.AccountStateDelta , * model.StateDelta ) {
325- var localStateDelta * []model.AccountStateDelta
326- if len (txn .ApplyData .EvalDelta .LocalDeltas ) > 0 {
327- d := make ([]model.AccountStateDelta , 0 )
328- shared := txn .ApplyData .EvalDelta .SharedAccts
329-
330- for k , v := range txn .ApplyData .EvalDelta .LocalDeltas {
331- d = append (d , model.AccountStateDelta {
332- Address : edIndexToAddress (k , & txn .Txn .Txn , shared ),
333- Delta : * (stateDeltaToStateDelta (v )),
334- })
335- }
326+ func localDeltasToLocalDeltas (ed transactions.EvalDelta , txn * transactions.Transaction ) []model.AccountStateDelta {
327+ if len (ed .LocalDeltas ) == 0 {
328+ return nil
329+ }
330+ lsd := make ([]model.AccountStateDelta , 0 , len (ed .LocalDeltas ))
331+ shared := ed .SharedAccts
336332
337- localStateDelta = & d
333+ for k , v := range ed .LocalDeltas {
334+ lsd = append (lsd , model.AccountStateDelta {
335+ Address : edIndexToAddress (k , txn , shared ),
336+ Delta : globalDeltaToStateDelta (v ),
337+ })
338338 }
339339
340- return localStateDelta , stateDeltaToStateDelta ( txn . ApplyData . EvalDelta . GlobalDelta )
340+ return lsd
341341}
342342
343343func convertLogs (txn node.TxnWithStatus ) * [][]byte {
@@ -381,11 +381,12 @@ func ConvertInnerTxn(txn *transactions.SignedTxnWithAD) PreEncodedTxInfo {
381381 response .AssetIndex = omitEmpty (uint64 (txn .ApplyData .ConfigAsset ))
382382 response .ApplicationIndex = omitEmpty (uint64 (txn .ApplyData .ApplicationID ))
383383
384+ response .LocalStateDelta = sliceOrNil (localDeltasToLocalDeltas (txn .ApplyData .EvalDelta , & txn .Txn ))
385+ response .GlobalStateDelta = sliceOrNil (globalDeltaToStateDelta (txn .ApplyData .EvalDelta .GlobalDelta ))
384386 withStatus := node.TxnWithStatus {
385387 Txn : txn .SignedTxn ,
386388 ApplyData : txn .ApplyData ,
387389 }
388- response .LocalStateDelta , response .GlobalStateDelta = convertToDeltas (withStatus )
389390 response .Logs = convertLogs (withStatus )
390391 response .Inners = convertInners (& withStatus )
391392 return response
0 commit comments