From 41dd6e3018a9ec25ff2637f9ef57b4522c847c5d Mon Sep 17 00:00:00 2001
From: lei shi <lei.shi@smartcontract.com>
Date: Mon, 15 Jul 2024 11:32:09 -0700
Subject: [PATCH] updates for reorg test

---
 .../actions/automation_ocr_helpers.go         | 82 ++++++++-----------
 .../actions/automationv2/actions.go           |  1 -
 integration-tests/actions/keeper_helpers.go   |  9 +-
 .../chaos/automation_chaos_test.go            |  8 +-
 .../contracts/ethereum_contracts.go           |  2 +-
 .../reorg/automation_reorg_test.go            | 17 ++--
 .../testsetups/keeper_benchmark.go            |  7 +-
 .../universal/log_poller/helpers.go           | 14 ++--
 8 files changed, 68 insertions(+), 72 deletions(-)

diff --git a/integration-tests/actions/automation_ocr_helpers.go b/integration-tests/actions/automation_ocr_helpers.go
index 95c92041cbf..05c4501fbe6 100644
--- a/integration-tests/actions/automation_ocr_helpers.go
+++ b/integration-tests/actions/automation_ocr_helpers.go
@@ -12,6 +12,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/smartcontractkit/seth"
 
+	"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/i_automation_registry_master_wrapper_2_3"
+
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/lib/pq"
 	"github.com/stretchr/testify/require"
@@ -41,8 +43,12 @@ func BuildAutoOCR2ConfigVars(
 	deltaStage time.Duration,
 	chainModuleAddress common.Address,
 	reorgProtectionEnabled bool,
+	linkToken contracts.LinkToken,
+	wethToken contracts.WETHToken,
+	ethUSDFeed contracts.MockETHUSDFeed,
+
 ) (contracts.OCRv2Config, error) {
-	return BuildAutoOCR2ConfigVarsWithKeyIndex(t, chainlinkNodes, registryConfig, registrar, deltaStage, 0, common.Address{}, chainModuleAddress, reorgProtectionEnabled)
+	return BuildAutoOCR2ConfigVarsWithKeyIndex(t, chainlinkNodes, registryConfig, registrar, deltaStage, 0, common.Address{}, chainModuleAddress, reorgProtectionEnabled, linkToken, wethToken, ethUSDFeed)
 }
 
 func BuildAutoOCR2ConfigVarsWithKeyIndex(
@@ -55,6 +61,9 @@ func BuildAutoOCR2ConfigVarsWithKeyIndex(
 	registryOwnerAddress common.Address,
 	chainModuleAddress common.Address,
 	reorgProtectionEnabled bool,
+	linkToken contracts.LinkToken,
+	wethToken contracts.WETHToken,
+	ethUSDFeed contracts.MockETHUSDFeed,
 ) (contracts.OCRv2Config, error) {
 	l := logging.GetTestLogger(t)
 	S, oracleIdentities, err := GetOracleIdentitiesWithKeyIndex(chainlinkNodes, keyIndex)
@@ -170,8 +179,30 @@ func BuildAutoOCR2ConfigVarsWithKeyIndex(
 	} else if registryConfig.RegistryVersion == ethereum.RegistryVersion_2_2 {
 		ocrConfig.TypedOnchainConfig22 = registryConfig.Create22OnchainConfig(registrar, registryOwnerAddress, chainModuleAddress, reorgProtectionEnabled)
 	} else if registryConfig.RegistryVersion == ethereum.RegistryVersion_2_3 {
-		l.Info().Msg("=====================Done building OCR v23 config")
 		ocrConfig.TypedOnchainConfig23 = registryConfig.Create23OnchainConfig(registrar, registryOwnerAddress, chainModuleAddress, reorgProtectionEnabled)
+		ocrConfig.BillingTokens = []common.Address{
+			common.HexToAddress(linkToken.Address()),
+			common.HexToAddress(wethToken.Address()),
+		}
+
+		ocrConfig.BillingConfigs = []i_automation_registry_master_wrapper_2_3.AutomationRegistryBase23BillingConfig{
+			{
+				GasFeePPB:         100,
+				FlatFeeMilliCents: big.NewInt(500),
+				PriceFeed:         common.HexToAddress(ethUSDFeed.Address()), // ETH/USD feed and LINK/USD feed are the same
+				Decimals:          18,
+				FallbackPrice:     big.NewInt(1000),
+				MinSpend:          big.NewInt(200),
+			},
+			{
+				GasFeePPB:         100,
+				FlatFeeMilliCents: big.NewInt(500),
+				PriceFeed:         common.HexToAddress(ethUSDFeed.Address()), // ETH/USD feed and LINK/USD feed are the same
+				Decimals:          18,
+				FallbackPrice:     big.NewInt(1000),
+				MinSpend:          big.NewInt(200),
+			},
+		}
 	}
 
 	l.Info().Msg("Done building OCR config")
@@ -269,8 +300,9 @@ func DeployAutoOCRRegistryAndRegistrar(
 	registrySettings contracts.KeeperRegistrySettings,
 	linkToken contracts.LinkToken,
 	wethToken contracts.WETHToken,
+	ethUSDFeed contracts.MockETHUSDFeed,
 ) (contracts.KeeperRegistry, contracts.KeeperRegistrar) {
-	registry := deployRegistry(t, client, registryVersion, registrySettings, linkToken, wethToken)
+	registry := deployRegistry(t, client, registryVersion, registrySettings, linkToken, wethToken, ethUSDFeed)
 	registrar := deployRegistrar(t, client, registryVersion, registry, linkToken, wethToken)
 
 	return registry, registrar
@@ -377,7 +409,6 @@ func DeployMultiCallAndFundDeploymentAddresses(
 	return SendLinkFundsToDeploymentAddresses(chainClient, concurrency, numberOfUpkeeps, operationsPerAddress, multicallAddress, linkFundsForEachUpkeep, linkToken)
 }
 
-// TODO reorg
 func deployRegistrar(
 	t *testing.T,
 	client *seth.Client,
@@ -398,43 +429,6 @@ func deployRegistrar(
 	return registrar
 }
 
-//func (a *AutomationTest) DeployRegistrar() error {
-//	if a.Registry == nil {
-//		return fmt.Errorf("registry must be deployed or loaded before registrar")
-//	}
-//	a.RegistrarSettings.RegistryAddr = a.Registry.Address()
-//	a.RegistrarSettings.WETHTokenAddr = a.WETHToken.Address()
-//	registrar, err := contracts.DeployKeeperRegistrar(a.ChainClient, a.RegistrySettings.RegistryVersion, a.LinkToken.Address(), a.RegistrarSettings)
-//	if err != nil {
-//		return err
-//	}
-//	a.Registrar = registrar
-//	return nil
-//}
-
-// TODO remove
-//func (a *AutomationTest) DeployRegistry() error {
-//	registryOpts := &contracts.KeeperRegistryOpts{
-//		RegistryVersion:   a.RegistrySettings.RegistryVersion,
-//		LinkAddr:          a.LinkToken.Address(),
-//		ETHFeedAddr:       a.EthLinkFeed.Address(),
-//		GasFeedAddr:       a.GasFeed.Address(),
-//		TranscoderAddr:    a.Transcoder.Address(),
-//		RegistrarAddr:     utils.ZeroAddress.Hex(),
-//		Settings:          a.RegistrySettings,
-//		LinkUSDFeedAddr:   a.EthUSDFeed.Address(),
-//		NativeUSDFeedAddr: a.EthUSDFeed.Address(),
-//		WrappedNativeAddr: a.WETHToken.Address(),
-//	}
-//	registry, err := contracts.DeployKeeperRegistry(a.ChainClient, registryOpts)
-//	if err != nil {
-//		return err
-//	}
-//	a.Registry = registry
-//	return nil
-//}
-
-// TODO
 func deployRegistry(
 	t *testing.T,
 	client *seth.Client,
@@ -442,17 +436,13 @@ func deployRegistry(
 	registrySettings contracts.KeeperRegistrySettings,
 	linkToken contracts.LinkToken,
 	wethToken contracts.WETHToken,
+	ethUSDFeed contracts.MockETHUSDFeed,
 ) contracts.KeeperRegistry {
 	ef, err := contracts.DeployMockETHLINKFeed(client, big.NewInt(2e18))
 	require.NoError(t, err, "Deploying mock ETH-Link feed shouldn't fail")
 	gf, err := contracts.DeployMockGASFeed(client, big.NewInt(2e11))
 	require.NoError(t, err, "Deploying mock gas feed shouldn't fail")
 
-	//l := logging.GetTestLogger(t)
-	// This feed is used for both eth/usd and link/usd
-	ethUSDFeed, err := contracts.DeployMockETHUSDFeed(client, registrySettings.FallbackLinkPrice)
-	require.NoError(t, err, "Error deploying eth usd feed contract")
-
 	// Deploy the transcoder here, and then set it to the registry
 	transcoder, err := contracts.DeployUpkeepTranscoder(client)
 	require.NoError(t, err, "Deploying upkeep transcoder shouldn't fail")
diff --git a/integration-tests/actions/automationv2/actions.go b/integration-tests/actions/automationv2/actions.go
index e53bb5c332b..f7d495bda5a 100644
--- a/integration-tests/actions/automationv2/actions.go
+++ b/integration-tests/actions/automationv2/actions.go
@@ -660,7 +660,6 @@ func (r registrationResult) GetResult() common.Hash {
 }
 
 func (a *AutomationTest) RegisterUpkeeps(upkeepConfigs []UpkeepConfig, maxConcurrency int) ([]common.Hash, error) {
-	a.Logger.Info().Msg("=======do you ever come to this RegisterUpkeeps in actions.go, no")
 	concurrency, err := actions.GetAndAssertCorrectConcurrency(a.ChainClient, 1)
 	if err != nil {
 		return nil, err
diff --git a/integration-tests/actions/keeper_helpers.go b/integration-tests/actions/keeper_helpers.go
index 11d20637cb6..ee1662cc180 100644
--- a/integration-tests/actions/keeper_helpers.go
+++ b/integration-tests/actions/keeper_helpers.go
@@ -356,16 +356,9 @@ func RegisterUpkeepContractsWithCheckData(t *testing.T, client *seth.Client, lin
 				return
 			}
 
-			l.Info().
-				Str("registrar.Address()", registrar.Address()).
-				Str("fundsForEachUpkeep", fundsForEachUpkeep.String()).
-				Msg("Found upkeepId in tx hash")
-			l.Info().Msg("=======do you ever come to this keeper_helpers.go,yes")
-
 			tx, err = linkToken.TransferAndCallFromKey(registrar.Address(), fundsForEachUpkeep, req, keyNum)
-			// TODO this is the error
 			if err != nil {
-				errorCh <- errors.Wrapf(err, "[id: %s] Failed to register upkeep at@@ %s", id, config.address)
+				errorCh <- errors.Wrapf(err, "[id: %s] Failed to register upkeep at %s", id, config.address)
 				return
 			}
 		}
diff --git a/integration-tests/chaos/automation_chaos_test.go b/integration-tests/chaos/automation_chaos_test.go
index cb77a4f20ad..79513b2e8fb 100644
--- a/integration-tests/chaos/automation_chaos_test.go
+++ b/integration-tests/chaos/automation_chaos_test.go
@@ -127,7 +127,6 @@ func TestAutomationChaos(t *testing.T) {
 		"registry_2_0": eth_contracts.RegistryVersion_2_0,
 		"registry_2_1": eth_contracts.RegistryVersion_2_1,
 		"registry_2_2": eth_contracts.RegistryVersion_2_2,
-		"registry_2_3": eth_contracts.RegistryVersion_2_3,
 	}
 
 	for name, registryVersion := range registryVersions {
@@ -265,6 +264,10 @@ func TestAutomationChaos(t *testing.T) {
 					wethToken, err := contracts.DeployWETHTokenContract(l, chainClient)
 					require.NoError(t, err, "Error deploying weth token contract")
 
+					// This feed is used for both eth/usd and link/usd
+					ethUSDFeed, err := contracts.DeployMockETHUSDFeed(chainClient, defaultOCRRegistryConfig.FallbackLinkPrice)
+					require.NoError(t, err, "Error deploying eth usd feed contract")
+
 					registry, registrar := actions.DeployAutoOCRRegistryAndRegistrar(
 						t,
 						chainClient,
@@ -272,6 +275,7 @@ func TestAutomationChaos(t *testing.T) {
 						defaultOCRRegistryConfig,
 						linkToken,
 						wethToken,
+						ethUSDFeed,
 					)
 
 					// Fund the registry with LINK
@@ -281,7 +285,7 @@ func TestAutomationChaos(t *testing.T) {
 					actions.CreateOCRKeeperJobs(t, chainlinkNodes, registry.Address(), network.ChainID, 0, rv)
 					nodesWithoutBootstrap := chainlinkNodes[1:]
 					defaultOCRRegistryConfig.RegistryVersion = rv
-					ocrConfig, err := actions.BuildAutoOCR2ConfigVars(t, nodesWithoutBootstrap, defaultOCRRegistryConfig, registrar.Address(), 30*time.Second, registry.ChainModuleAddress(), registry.ReorgProtectionEnabled())
+					ocrConfig, err := actions.BuildAutoOCR2ConfigVars(t, nodesWithoutBootstrap, defaultOCRRegistryConfig, registrar.Address(), 30*time.Second, registry.ChainModuleAddress(), registry.ReorgProtectionEnabled(), linkToken, wethToken, ethUSDFeed)
 					require.NoError(t, err, "Error building OCR config vars")
 
 					if rv == eth_contracts.RegistryVersion_2_0 {
diff --git a/integration-tests/contracts/ethereum_contracts.go b/integration-tests/contracts/ethereum_contracts.go
index d67ace14093..2db6aeb4637 100644
--- a/integration-tests/contracts/ethereum_contracts.go
+++ b/integration-tests/contracts/ethereum_contracts.go
@@ -854,7 +854,7 @@ func (l *EthereumLinkToken) TransferAndCallFromKey(to string, amount *big.Int, d
 		Str("From", l.client.Addresses[keyNum].Hex()).
 		Str("To", to).
 		Str("Amount", amount.String()).
-		Msg("Transferring and Calling LINK@@ yes")
+		Msg("Transferring and Calling LINK")
 	decodedTx, err := l.client.Decode(l.instance.TransferAndCall(l.client.NewTXKeyOpts(keyNum), common.HexToAddress(to), amount, data))
 	if err != nil {
 		return nil, err
diff --git a/integration-tests/reorg/automation_reorg_test.go b/integration-tests/reorg/automation_reorg_test.go
index 80635cdec7c..a393513ac49 100644
--- a/integration-tests/reorg/automation_reorg_test.go
+++ b/integration-tests/reorg/automation_reorg_test.go
@@ -115,13 +115,13 @@ func TestAutomationReorg(t *testing.T) {
 	l := logging.GetTestLogger(t)
 
 	registryVersions := map[string]ethereum.KeeperRegistryVersion{
-		//"registry_2_0":             ethereum.RegistryVersion_2_0,
-		//"registry_2_1_conditional": ethereum.RegistryVersion_2_1,
-		//"registry_2_1_logtrigger":  ethereum.RegistryVersion_2_1,
+		"registry_2_0":             ethereum.RegistryVersion_2_0,
+		"registry_2_1_conditional": ethereum.RegistryVersion_2_1,
+		"registry_2_1_logtrigger":  ethereum.RegistryVersion_2_1,
 		"registry_2_2_conditional": ethereum.RegistryVersion_2_2, // Works only on Chainlink Node v2.10.0 or greater
-		//"registry_2_2_logtrigger":  ethereum.RegistryVersion_2_2, // Works only on Chainlink Node v2.10.0 or greater
+		"registry_2_2_logtrigger":  ethereum.RegistryVersion_2_2, // Works only on Chainlink Node v2.10.0 or greater
 		"registry_2_3_conditional": ethereum.RegistryVersion_2_3,
-		//"registry_2_3_logtrigger":  ethereum.RegistryVersion_2_3,
+		"registry_2_3_logtrigger":  ethereum.RegistryVersion_2_3,
 	}
 
 	for n, rv := range registryVersions {
@@ -198,6 +198,10 @@ func TestAutomationReorg(t *testing.T) {
 			wethToken, err := contracts.DeployWETHTokenContract(l, chainClient)
 			require.NoError(t, err, "Error deploying weth token contract")
 
+			// This feed is used for both eth/usd and link/usd
+			ethUSDFeed, err := contracts.DeployMockETHUSDFeed(chainClient, defaultOCRRegistryConfig.FallbackLinkPrice)
+			require.NoError(t, err, "Error deploying eth usd feed contract")
+
 			defaultOCRRegistryConfig.RegistryVersion = registryVersion
 			registry, registrar := actions.DeployAutoOCRRegistryAndRegistrar(
 				t,
@@ -206,6 +210,7 @@ func TestAutomationReorg(t *testing.T) {
 				defaultOCRRegistryConfig,
 				linkToken,
 				wethToken,
+				ethUSDFeed,
 			)
 
 			// Fund the registry with LINK
@@ -215,7 +220,7 @@ func TestAutomationReorg(t *testing.T) {
 			actions.CreateOCRKeeperJobs(t, chainlinkNodes, registry.Address(), network.ChainID, 0, registryVersion)
 			nodesWithoutBootstrap := chainlinkNodes[1:]
 
-			ocrConfig, err := actions.BuildAutoOCR2ConfigVars(t, nodesWithoutBootstrap, defaultOCRRegistryConfig, registrar.Address(), 5*time.Second, registry.ChainModuleAddress(), registry.ReorgProtectionEnabled())
+			ocrConfig, err := actions.BuildAutoOCR2ConfigVars(t, nodesWithoutBootstrap, defaultOCRRegistryConfig, registrar.Address(), 5*time.Second, registry.ChainModuleAddress(), registry.ReorgProtectionEnabled(), linkToken, wethToken, ethUSDFeed)
 			require.NoError(t, err, "OCR2 config should be built successfully")
 			if registryVersion == ethereum.RegistryVersion_2_0 {
 				err = registry.SetConfig(defaultOCRRegistryConfig, ocrConfig)
diff --git a/integration-tests/testsetups/keeper_benchmark.go b/integration-tests/testsetups/keeper_benchmark.go
index e9a1ce79eeb..4803a5249f0 100644
--- a/integration-tests/testsetups/keeper_benchmark.go
+++ b/integration-tests/testsetups/keeper_benchmark.go
@@ -240,8 +240,9 @@ func (k *KeeperBenchmarkTest) Run() {
 			txKeyId = 0
 		}
 		kr := k.keeperRegistries[rIndex]
+		// TODO: need to add the LINK, WETH and WETH/USD feed to support v23
 		ocrConfig, err := actions.BuildAutoOCR2ConfigVarsWithKeyIndex(
-			k.t, nodesWithoutBootstrap, *inputs.KeeperRegistrySettings, kr.Address(), k.Inputs.DeltaStage, txKeyId, common.Address{}, kr.ChainModuleAddress(), kr.ReorgProtectionEnabled(),
+			k.t, nodesWithoutBootstrap, *inputs.KeeperRegistrySettings, kr.Address(), k.Inputs.DeltaStage, txKeyId, common.Address{}, kr.ChainModuleAddress(), kr.ReorgProtectionEnabled(), nil, nil, nil,
 		)
 		require.NoError(k.t, err, "Building OCR config shouldn't fail")
 
@@ -730,13 +731,13 @@ func (k *KeeperBenchmarkTest) DeployBenchmarkKeeperContracts(index int) {
 		require.NoError(k.t, err, "Funding keeper registrar contract shouldn't fail")
 	} else { // OCR automation - v2.X
 		registry, registrar = actions.DeployAutoOCRRegistryAndRegistrar(
-			k.t, k.chainClient, registryVersion, *k.Inputs.KeeperRegistrySettings, k.linkToken, nil,
+			k.t, k.chainClient, registryVersion, *k.Inputs.KeeperRegistrySettings, k.linkToken, nil, nil,
 		)
 
 		// Fund the registry with LINK
 		err := k.linkToken.Transfer(registry.Address(), big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(int64(k.Inputs.Upkeeps.NumberOfUpkeeps))))
 		require.NoError(k.t, err, "Funding keeper registry contract shouldn't fail")
-		ocrConfig, err := actions.BuildAutoOCR2ConfigVars(k.t, k.chainlinkNodes[1:], *k.Inputs.KeeperRegistrySettings, registrar.Address(), k.Inputs.DeltaStage, registry.ChainModuleAddress(), registry.ReorgProtectionEnabled())
+		ocrConfig, err := actions.BuildAutoOCR2ConfigVars(k.t, k.chainlinkNodes[1:], *k.Inputs.KeeperRegistrySettings, registrar.Address(), k.Inputs.DeltaStage, registry.ChainModuleAddress(), registry.ReorgProtectionEnabled(), nil, nil, nil)
 		require.NoError(k.t, err, "Building OCR config shouldn't fail")
 		k.log.Debug().Interface("KeeperRegistrySettings", *k.Inputs.KeeperRegistrySettings).Interface("OCRConfig", ocrConfig).Msg("Config")
 		require.NoError(k.t, err, "Error building OCR config vars")
diff --git a/integration-tests/universal/log_poller/helpers.go b/integration-tests/universal/log_poller/helpers.go
index bcfe13e336a..daa4784ec16 100644
--- a/integration-tests/universal/log_poller/helpers.go
+++ b/integration-tests/universal/log_poller/helpers.go
@@ -13,25 +13,24 @@ import (
 	"testing"
 	"time"
 
+	"github.com/jmoiron/sqlx"
+	"github.com/smartcontractkit/seth"
+	"github.com/smartcontractkit/wasp"
+
 	geth "github.com/ethereum/go-ethereum"
 	"github.com/ethereum/go-ethereum/accounts/abi"
 	"github.com/ethereum/go-ethereum/common"
 	geth_types "github.com/ethereum/go-ethereum/core/types"
-	"github.com/jmoiron/sqlx"
 	"github.com/rs/zerolog"
 	"github.com/scylladb/go-reflectx"
 	"github.com/stretchr/testify/require"
 
-	"github.com/smartcontractkit/seth"
-	"github.com/smartcontractkit/wasp"
-
 	"github.com/smartcontractkit/chainlink-testing-framework/blockchain"
 	ctf_concurrency "github.com/smartcontractkit/chainlink-testing-framework/concurrency"
 	ctf_test_env "github.com/smartcontractkit/chainlink-testing-framework/docker/test_env"
 	"github.com/smartcontractkit/chainlink-testing-framework/logging"
 	"github.com/smartcontractkit/chainlink-testing-framework/networks"
 	seth_utils "github.com/smartcontractkit/chainlink-testing-framework/utils/seth"
-
 	"github.com/smartcontractkit/chainlink/integration-tests/actions"
 	"github.com/smartcontractkit/chainlink/integration-tests/client"
 	"github.com/smartcontractkit/chainlink/integration-tests/contracts"
@@ -1075,6 +1074,10 @@ func SetupLogPollerTestDocker(
 	wethToken, err := contracts.DeployWETHTokenContract(l, chainClient)
 	require.NoError(t, err, "Error deploying weth token contract")
 
+	// This feed is used for both eth/usd and link/usd
+	ethUSDFeed, err := contracts.DeployMockETHUSDFeed(chainClient, registryConfig.FallbackLinkPrice)
+	require.NoError(t, err, "Error deploying eth usd feed contract")
+
 	linkBalance, err := linkToken.BalanceOf(context.Background(), chainClient.MustGetRootKeyAddress().Hex())
 	require.NoError(t, err, "Error getting LINK balance")
 
@@ -1092,6 +1095,7 @@ func SetupLogPollerTestDocker(
 		registryConfig,
 		linkToken,
 		wethToken,
+		ethUSDFeed,
 	)
 
 	// Fund the registry with LINK