diff --git a/pkg/morph/client/neofsid/wrapper/client.go b/pkg/morph/client/neofsid/wrapper/client.go new file mode 100644 index 000000000..720e51e05 --- /dev/null +++ b/pkg/morph/client/neofsid/wrapper/client.go @@ -0,0 +1,23 @@ +package neofsid + +import ( + "github.com/nspcc-dev/neofs-node/pkg/morph/client/neofsid" +) + +// ClientWrapper is a wrapper over NeoFS ID contract +// client which provides convenient methods for +// working with a contract. +// +// Working ClientWrapper must be created via Wrap. +type ClientWrapper neofsid.Client + +// Wrap creates, initializes and returns the ClientWrapper instance. +// +// If c is nil, panic occurs. +func Wrap(c *neofsid.Client) *ClientWrapper { + if c == nil { + panic("neofs ID client is nil") + } + + return (*ClientWrapper)(c) +} diff --git a/pkg/morph/client/neofsid/wrapper/keys.go b/pkg/morph/client/neofsid/wrapper/keys.go new file mode 100644 index 000000000..4604e7645 --- /dev/null +++ b/pkg/morph/client/neofsid/wrapper/keys.go @@ -0,0 +1,38 @@ +package neofsid + +import ( + "crypto/elliptic" + "fmt" + + "github.com/nspcc-dev/neo-go/pkg/crypto/keys" + "github.com/nspcc-dev/neofs-api-go/pkg/owner" + "github.com/nspcc-dev/neofs-node/pkg/morph/client/neofsid" +) + +// AccountKeys requests public keys of NeoFS account from NeoFS ID contract. +func (x *ClientWrapper) AccountKeys(id *owner.ID) (keys.PublicKeys, error) { + var args neofsid.KeyListingArgs + + args.SetOwnerID(id.ToV2().GetValue()) + + res, err := (*neofsid.Client)(x).AccountKeys(args) + if err != nil { + return nil, err + } + + binKeys := res.Keys() + ks := make(keys.PublicKeys, 0, len(binKeys)) + + curve := elliptic.P256() + + for i := range binKeys { + k, err := keys.NewPublicKeyFromBytes(binKeys[i], curve) + if err != nil { + return nil, fmt.Errorf("received invalid key: %w", err) + } + + ks = append(ks, k) + } + + return ks, nil +}