Skip to content

Commit d1008ac

Browse files
committed
Potential fix for panic on call to block w/ group resource sharing.
1 parent 9ef21ad commit d1008ac

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

api/converter_utils.go

+22-12
Original file line numberDiff line numberDiff line change
@@ -518,20 +518,16 @@ func signedTxnWithAdToTransaction(stxn *sdk.SignedTxnWithAD, extra rowData) (gen
518518
}
519519
if len(stxn.ApplyData.EvalDelta.LocalDeltas) > 0 {
520520
keys := make([]tuple, 0)
521+
521522
for k := range stxn.ApplyData.EvalDelta.LocalDeltas {
522-
if k == 0 {
523-
keys = append(keys, tuple{
524-
key: 0,
525-
address: stxn.Txn.Sender,
526-
})
527-
} else {
528-
addr := sdk.Address{}
529-
copy(addr[:], stxn.Txn.Accounts[k-1][:])
530-
keys = append(keys, tuple{
531-
key: k,
532-
address: addr,
533-
})
523+
addr, err := edIndexToAddress(k, stxn.Txn, stxn.ApplyData.EvalDelta.SharedAccounts)
524+
if err != nil {
525+
return generated.Transaction{}, err
534526
}
527+
keys = append(keys, tuple{
528+
key: k,
529+
address: addr,
530+
})
535531
}
536532
sort.Slice(keys, func(i, j int) bool { return keys[i].key < keys[j].key })
537533
d := make([]generated.AccountStateDelta, 0)
@@ -629,6 +625,20 @@ func signedTxnWithAdToTransaction(stxn *sdk.SignedTxnWithAD, extra rowData) (gen
629625
return txn, nil
630626
}
631627

628+
func edIndexToAddress(index uint64, txn sdk.Transaction, shared []sdk.Address) (sdk.Address, error) {
629+
// index into [Sender, txn.Accounts[0], txn.Accounts[1], ..., shared[0], shared[1], ...]
630+
switch {
631+
case index == 0:
632+
return txn.Sender, nil
633+
case int(index-1) < len(txn.Accounts):
634+
return txn.Accounts[index-1], nil
635+
case int(index-1)-len(txn.Accounts) < len(shared):
636+
return shared[int(index-1)-len(txn.Accounts)], nil
637+
default:
638+
return sdk.Address{}, fmt.Errorf("invalid Account Index %d in LocalDelta", index)
639+
}
640+
}
641+
632642
func (si *ServerImplementation) assetParamsToAssetQuery(params generated.SearchForAssetsParams) (idb.AssetsQuery, error) {
633643
creator, errorArr := decodeAddress(params.Creator, "creator", make([]string, 0))
634644
if len(errorArr) != 0 {

0 commit comments

Comments
 (0)