From 8a658de0b28835fcf55a7c611eed497dd1e253ee Mon Sep 17 00:00:00 2001
From: Evgenii Stratonikov <e.stratonikov@yadro.com>
Date: Fri, 20 Dec 2024 11:40:34 +0300
Subject: [PATCH] [#1506] ape: Do not create cosigners slice on each contract
 invocation

Signed-off-by: Evgenii Stratonikov <e.stratonikov@yadro.com>
---
 pkg/ape/contract_storage/proxy.go | 47 +++++++++++++------------------
 1 file changed, 20 insertions(+), 27 deletions(-)

diff --git a/pkg/ape/contract_storage/proxy.go b/pkg/ape/contract_storage/proxy.go
index 953b91a79..8ae3f5203 100644
--- a/pkg/ape/contract_storage/proxy.go
+++ b/pkg/ape/contract_storage/proxy.go
@@ -31,9 +31,7 @@ type RPCActorProvider interface {
 type ProxyVerificationContractStorage struct {
 	rpcActorProvider RPCActorProvider
 
-	acc *wallet.Account
-
-	proxyScriptHash util.Uint160
+	cosigners []actor.SignerAccount
 
 	policyScriptHash util.Uint160
 }
@@ -41,12 +39,27 @@ type ProxyVerificationContractStorage struct {
 var _ ProxyAdaptedContractStorage = (*ProxyVerificationContractStorage)(nil)
 
 func NewProxyVerificationContractStorage(rpcActorProvider RPCActorProvider, key *keys.PrivateKey, proxyScriptHash, policyScriptHash util.Uint160) *ProxyVerificationContractStorage {
+	acc := wallet.NewAccountFromPrivateKey(key)
 	return &ProxyVerificationContractStorage{
 		rpcActorProvider: rpcActorProvider,
 
-		acc: wallet.NewAccountFromPrivateKey(key),
-
-		proxyScriptHash: proxyScriptHash,
+		cosigners: []actor.SignerAccount{
+			{
+				Signer: transaction.Signer{
+					Account:          proxyScriptHash,
+					Scopes:           transaction.CustomContracts,
+					AllowedContracts: []util.Uint160{policyScriptHash},
+				},
+				Account: notary.FakeContractAccount(proxyScriptHash),
+			},
+			{
+				Signer: transaction.Signer{
+					Account: acc.Contract.ScriptHash(),
+					Scopes:  transaction.CalledByEntry,
+				},
+				Account: acc,
+			},
+		},
 
 		policyScriptHash: policyScriptHash,
 	}
@@ -64,7 +77,7 @@ func (n *contractStorageActorAdapter) GetRPCInvoker() invoker.RPCInvoke {
 
 func (contractStorage *ProxyVerificationContractStorage) newContractStorageActor() (policy_morph.ContractStorageActor, error) {
 	rpcActor := contractStorage.rpcActorProvider.GetRPCActor()
-	act, err := actor.New(rpcActor, cosigners(contractStorage.acc, contractStorage.proxyScriptHash, contractStorage.policyScriptHash))
+	act, err := actor.New(rpcActor, contractStorage.cosigners)
 	if err != nil {
 		return nil, err
 	}
@@ -106,23 +119,3 @@ func (contractStorage *ProxyVerificationContractStorage) ListMorphRuleChains(nam
 	}
 	return policy_morph.NewContractStorage(contractStorageActor, contractStorage.policyScriptHash).ListMorphRuleChains(name, target)
 }
-
-func cosigners(acc *wallet.Account, proxyScriptHash, policyScriptHash util.Uint160) []actor.SignerAccount {
-	return []actor.SignerAccount{
-		{
-			Signer: transaction.Signer{
-				Account:          proxyScriptHash,
-				Scopes:           transaction.CustomContracts,
-				AllowedContracts: []util.Uint160{policyScriptHash},
-			},
-			Account: notary.FakeContractAccount(proxyScriptHash),
-		},
-		{
-			Signer: transaction.Signer{
-				Account: acc.Contract.ScriptHash(),
-				Scopes:  transaction.CalledByEntry,
-			},
-			Account: acc,
-		},
-	}
-}