From 43dfccd9b3d4b6f30dbe42241e97370bd39b3dc6 Mon Sep 17 00:00:00 2001 From: Alex Vanin Date: Thu, 5 Aug 2021 17:17:54 +0300 Subject: [PATCH] [#751] morph/client: Add custom signer scope support Signed-off-by: Alex Vanin --- pkg/morph/client/client.go | 8 ++++++-- pkg/morph/client/constructor.go | 21 +++++++++++++++++++++ pkg/morph/client/notary.go | 6 ++++-- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/pkg/morph/client/client.go b/pkg/morph/client/client.go index 46c8d639b..73915c1ff 100644 --- a/pkg/morph/client/client.go +++ b/pkg/morph/client/client.go @@ -41,6 +41,8 @@ type Client struct { waitInterval time.Duration + signer *transaction.Signer + notary *notary } @@ -83,8 +85,10 @@ func (c *Client) Invoke(contract util.Uint160, fee fixedn.Fixed8, method string, cosigner := []transaction.Signer{ { - Account: c.acc.PrivateKey().PublicKey().GetScriptHash(), - Scopes: transaction.Global, + Account: c.acc.PrivateKey().PublicKey().GetScriptHash(), + Scopes: c.signer.Scopes, + AllowedContracts: c.signer.AllowedContracts, + AllowedGroups: c.signer.AllowedGroups, }, } diff --git a/pkg/morph/client/constructor.go b/pkg/morph/client/constructor.go index e3a7ed542..4a8583d45 100644 --- a/pkg/morph/client/constructor.go +++ b/pkg/morph/client/constructor.go @@ -5,6 +5,7 @@ import ( "time" "github.com/nspcc-dev/neo-go/pkg/core/native/nativenames" + "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/rpc/client" "github.com/nspcc-dev/neo-go/pkg/util" @@ -27,6 +28,8 @@ type cfg struct { gas util.Uint160 // native gas script-hash waitInterval time.Duration + + signer *transaction.Signer } const ( @@ -40,6 +43,9 @@ func defaultConfig() *cfg { dialTimeout: defaultDialTimeout, logger: zap.L(), waitInterval: defaultWaitInterval, + signer: &transaction.Signer{ + Scopes: transaction.Global, + }, } } @@ -102,6 +108,7 @@ func New(key *keys.PrivateKey, endpoint string, opts ...Option) (*Client, error) gas: gas, designate: designate, waitInterval: cfg.waitInterval, + signer: cfg.signer, } return c, nil @@ -148,3 +155,17 @@ func WithLogger(logger *logger.Logger) Option { } } } + +// WithSigner returns a client constructor option +// that specifies the signer and the scope of the transaction. +// +// Ignores nil value. +// +// If option not provided, signer with global scope is used. +func WithSigner(signer *transaction.Signer) Option { + return func(c *cfg) { + if signer != nil { + c.signer = signer + } + } +} diff --git a/pkg/morph/client/notary.go b/pkg/morph/client/notary.go index cd63a8d8e..db89d6c6d 100644 --- a/pkg/morph/client/notary.go +++ b/pkg/morph/client/notary.go @@ -342,8 +342,10 @@ func (c *Client) notaryCosigners(ir []*keys.PublicKey, committee bool) ([]transa } s = append(s, transaction.Signer{ - Account: hash.Hash160(multisigScript), - Scopes: transaction.Global, + Account: hash.Hash160(multisigScript), + Scopes: c.signer.Scopes, + AllowedContracts: c.signer.AllowedContracts, + AllowedGroups: c.signer.AllowedGroups, }) // last one is a placeholder for notary contract signature