From f58d424c6d50d7641eb092b9497e8232d23b8b12 Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Mon, 22 Nov 2021 12:44:42 +0300 Subject: [PATCH] rpc/client: fix custom* scope processing in CreateTxFromScript Copying just the scope doesn't work for CustomContracts, CustomGroups and Rules because they all contain additional metadata. Thanks @mialbu for reporting this. --- pkg/rpc/client/rpc.go | 2 +- pkg/rpc/server/client_test.go | 40 +++++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/pkg/rpc/client/rpc.go b/pkg/rpc/client/rpc.go index fbf26ca4d..2f43dd8e4 100644 --- a/pkg/rpc/client/rpc.go +++ b/pkg/rpc/client/rpc.go @@ -714,7 +714,7 @@ func getSigners(sender *wallet.Account, cosigners []SignerAccount) ([]transactio } for _, c := range cosigners { if c.Signer.Account == from { - s.Scopes = c.Signer.Scopes + s = c.Signer continue } signers = append(signers, c.Signer) diff --git a/pkg/rpc/server/client_test.go b/pkg/rpc/server/client_test.go index cd3b3a291..e24647cfe 100644 --- a/pkg/rpc/server/client_test.go +++ b/pkg/rpc/server/client_test.go @@ -710,13 +710,39 @@ func TestCreateNEP17TransferTx(t *testing.T) { gasContractHash, err := c.GetNativeContractHash(nativenames.Gas) require.NoError(t, err) - tx, err := c.CreateNEP17TransferTx(acc, util.Uint160{}, gasContractHash, 1000, 0, nil, nil) - require.NoError(t, err) - require.NoError(t, acc.SignTx(testchain.Network(), tx)) - require.NoError(t, chain.VerifyTx(tx)) - v, _ := chain.GetTestVM(trigger.Application, tx, nil) - v.LoadScriptWithFlags(tx.Script, callflag.All) - require.NoError(t, v.Run()) + t.Run("default scope", func(t *testing.T) { + tx, err := c.CreateNEP17TransferTx(acc, util.Uint160{}, gasContractHash, 1000, 0, nil, nil) + require.NoError(t, err) + require.NoError(t, acc.SignTx(testchain.Network(), tx)) + require.NoError(t, chain.VerifyTx(tx)) + v, _ := chain.GetTestVM(trigger.Application, tx, nil) + v.LoadScriptWithFlags(tx.Script, callflag.All) + require.NoError(t, v.Run()) + }) + t.Run("none scope", func(t *testing.T) { + _, err := c.CreateNEP17TransferTx(acc, util.Uint160{}, gasContractHash, 1000, 0, nil, []client.SignerAccount{{ + Signer: transaction.Signer{ + Account: priv.PublicKey().GetScriptHash(), + Scopes: transaction.None, + }, + }}) + require.Error(t, err) + }) + t.Run("customcontracts scope", func(t *testing.T) { + tx, err := c.CreateNEP17TransferTx(acc, util.Uint160{}, gasContractHash, 1000, 0, nil, []client.SignerAccount{{ + Signer: transaction.Signer{ + Account: priv.PublicKey().GetScriptHash(), + Scopes: transaction.CustomContracts, + AllowedContracts: []util.Uint160{gasContractHash}, + }, + }}) + require.NoError(t, err) + require.NoError(t, acc.SignTx(testchain.Network(), tx)) + require.NoError(t, chain.VerifyTx(tx)) + v, _ := chain.GetTestVM(trigger.Application, tx, nil) + v.LoadScriptWithFlags(tx.Script, callflag.All) + require.NoError(t, v.Run()) + }) } func TestInvokeVerify(t *testing.T) {