From bc627b18cd0cdf273e913b7d77d5982418ac486f Mon Sep 17 00:00:00 2001 From: Gary <982483+gmalouf@users.noreply.github.com> Date: Sat, 30 Dec 2023 22:30:52 -0500 Subject: [PATCH] Merge pull request #1590 from gmalouf/resource-shared-accounts-indexing Patch: Potential fix for panic on call to block w/ group resource sharing. --- api/converter_utils.go | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/api/converter_utils.go b/api/converter_utils.go index 23eae4fd4..4bc704115 100644 --- a/api/converter_utils.go +++ b/api/converter_utils.go @@ -518,20 +518,16 @@ func signedTxnWithAdToTransaction(stxn *sdk.SignedTxnWithAD, extra rowData) (gen } if len(stxn.ApplyData.EvalDelta.LocalDeltas) > 0 { keys := make([]tuple, 0) + for k := range stxn.ApplyData.EvalDelta.LocalDeltas { - if k == 0 { - keys = append(keys, tuple{ - key: 0, - address: stxn.Txn.Sender, - }) - } else { - addr := sdk.Address{} - copy(addr[:], stxn.Txn.Accounts[k-1][:]) - keys = append(keys, tuple{ - key: k, - address: addr, - }) + addr, err := edIndexToAddress(k, stxn.Txn, stxn.ApplyData.EvalDelta.SharedAccts) + if err != nil { + return generated.Transaction{}, err } + keys = append(keys, tuple{ + key: k, + address: addr, + }) } sort.Slice(keys, func(i, j int) bool { return keys[i].key < keys[j].key }) d := make([]generated.AccountStateDelta, 0) @@ -629,6 +625,20 @@ func signedTxnWithAdToTransaction(stxn *sdk.SignedTxnWithAD, extra rowData) (gen return txn, nil } +func edIndexToAddress(index uint64, txn sdk.Transaction, shared []sdk.Address) (sdk.Address, error) { + // index into [Sender, txn.Accounts[0], txn.Accounts[1], ..., shared[0], shared[1], ...] + switch { + case index == 0: + return txn.Sender, nil + case int(index-1) < len(txn.Accounts): + return txn.Accounts[index-1], nil + case int(index-1)-len(txn.Accounts) < len(shared): + return shared[int(index-1)-len(txn.Accounts)], nil + default: + return sdk.Address{}, fmt.Errorf("invalid Account Index %d in LocalDelta", index) + } +} + func (si *ServerImplementation) assetParamsToAssetQuery(params generated.SearchForAssetsParams) (idb.AssetsQuery, error) { creator, errorArr := decodeAddress(params.Creator, "creator", make([]string, 0)) if len(errorArr) != 0 {