diff --git a/frostfsid/client/client.go b/frostfsid/client/client.go index 3db4d83..efc44c1 100644 --- a/frostfsid/client/client.go +++ b/frostfsid/client/client.go @@ -7,11 +7,16 @@ import ( "github.com/nspcc-dev/neo-go/pkg/core/state" "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/io" "github.com/nspcc-dev/neo-go/pkg/rpcclient/actor" "github.com/nspcc-dev/neo-go/pkg/rpcclient/notary" "github.com/nspcc-dev/neo-go/pkg/rpcclient/unwrap" "github.com/nspcc-dev/neo-go/pkg/rpcclient/waiter" + "github.com/nspcc-dev/neo-go/pkg/smartcontract/callflag" "github.com/nspcc-dev/neo-go/pkg/util" + "github.com/nspcc-dev/neo-go/pkg/vm/emit" + "github.com/nspcc-dev/neo-go/pkg/vm/stackitem" + "github.com/nspcc-dev/neo-go/pkg/vm/vmstate" "github.com/nspcc-dev/neo-go/pkg/wallet" ) @@ -260,6 +265,39 @@ func (c Client) ListSubjects() ([]util.Uint160, error) { return UnwrapArrayOfUint160(commonclient.ReadIteratorItems(c.act, iteratorBatchSize, c.contract, listSubjectsMethod)) } +// ListFullSubjects gets list of subjects. +func (c Client) ListFullSubjects(hashes []util.Uint160) ([]*Subject, error) { + w := io.NewBufBinWriter() + + for _, hash := range hashes { + emit.AppCall(w.BinWriter, c.contract, getSubjectMethod, callflag.All, hash) + } + + invoker, err := c.act.Run(w.Bytes()) + if err != nil { + return nil, err + } + if invoker.State != vmstate.Halt.String() { + return nil, fmt.Errorf("invocation failed: %s", invoker.FaultException) + } + subjects := make([]*Subject, 0, len(invoker.Stack)) + + for _, item := range invoker.Stack { + arr, ok := item.Value().([]stackitem.Item) + if !ok { + return nil, fmt.Errorf("invalid subject") + } + + subject, err := ParseSubject(arr) + if err != nil { + return nil, err + } + subjects = append(subjects, subject) + } + + return subjects, nil +} + // AddSubjectKey adds extra public key to subject. // Must be invoked by contract owner. func (c Client) AddSubjectKey(addr util.Uint160, key *keys.PublicKey) (tx util.Uint256, vub uint32, err error) {