From becb1af1c6443ed325d8f22930532809d4b9e6df Mon Sep 17 00:00:00 2001
From: Evgenii Stratonikov <e.stratonikov@yadro.com>
Date: Fri, 20 Dec 2024 11:47:28 +0300
Subject: [PATCH] [#1506] ape: Use contract reader in ListMorphRuleChains()

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

diff --git a/pkg/ape/contract_storage/proxy.go b/pkg/ape/contract_storage/proxy.go
index 8ae3f5203..8cbb1cce9 100644
--- a/pkg/ape/contract_storage/proxy.go
+++ b/pkg/ape/contract_storage/proxy.go
@@ -111,11 +111,16 @@ func (contractStorage *ProxyVerificationContractStorage) RemoveMorphRuleChain(na
 
 // ListMorphRuleChains lists morph rule chains from Policy contract using both Proxy contract and storage account as consigners.
 func (contractStorage *ProxyVerificationContractStorage) ListMorphRuleChains(name chain.Name, target engine.Target) ([]*chain.Chain, error) {
-	// contractStorageActor is reconstructed per each method invocation because RPCActor's (that is, basically, WSClient) connection may get invalidated, but
-	// ProxyVerificationContractStorage does not manage reconnections.
-	contractStorageActor, err := contractStorage.newContractStorageActor()
-	if err != nil {
-		return nil, err
-	}
-	return policy_morph.NewContractStorage(contractStorageActor, contractStorage.policyScriptHash).ListMorphRuleChains(name, target)
+	rpcActor := contractStorage.rpcActorProvider.GetRPCActor()
+	inv := &invokerAdapter{Invoker: invoker.New(rpcActor, nil), rpcInvoker: rpcActor}
+	return policy_morph.NewContractStorageReader(inv, contractStorage.policyScriptHash).ListMorphRuleChains(name, target)
+}
+
+type invokerAdapter struct {
+	*invoker.Invoker
+	rpcInvoker invoker.RPCInvoke
+}
+
+func (n *invokerAdapter) GetRPCInvoker() invoker.RPCInvoke {
+	return n.rpcInvoker
 }