core: make GetUnspentCoins interop return array, fix #978.

This commit is contained in:
Evgenii Stratonikov 2020-05-22 11:49:36 +03:00 committed by Roman Khimov
parent f8093e415e
commit 44709cf6fe

View file

@ -9,6 +9,7 @@ import (
"github.com/nspcc-dev/neo-go/pkg/core/interop" "github.com/nspcc-dev/neo-go/pkg/core/interop"
"github.com/nspcc-dev/neo-go/pkg/core/interop/runtime" "github.com/nspcc-dev/neo-go/pkg/core/interop/runtime"
"github.com/nspcc-dev/neo-go/pkg/core/state" "github.com/nspcc-dev/neo-go/pkg/core/state"
"github.com/nspcc-dev/neo-go/pkg/core/storage"
"github.com/nspcc-dev/neo-go/pkg/core/transaction" "github.com/nspcc-dev/neo-go/pkg/core/transaction"
"github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neo-go/pkg/crypto/keys"
"github.com/nspcc-dev/neo-go/pkg/smartcontract" "github.com/nspcc-dev/neo-go/pkg/smartcontract"
@ -169,10 +170,20 @@ func txGetUnspentCoins(ic *interop.Context, v *vm.VM) error {
return errors.New("value is not a transaction") return errors.New("value is not a transaction")
} }
ucs, err := ic.DAO.GetUnspentCoinState(tx.Hash()) ucs, err := ic.DAO.GetUnspentCoinState(tx.Hash())
if err != nil { if err == storage.ErrKeyNotFound {
v.Estack().PushVal([]vm.StackItem{})
return nil
} else if err != nil {
return errors.New("no unspent coin state found") return errors.New("no unspent coin state found")
} }
v.Estack().PushVal(vm.NewInteropItem(ucs))
items := make([]vm.StackItem, 0, len(ucs.States))
for i := range items {
if ucs.States[i].State&state.CoinSpent == 0 {
items = append(items, vm.NewInteropItem(&ucs.States[i].Output))
}
}
v.Estack().PushVal(items)
return nil return nil
} }