diff --git a/_typos.toml b/_typos.toml index 683aabc2547..65b99f85a9a 100644 --- a/_typos.toml +++ b/_typos.toml @@ -188,4 +188,8 @@ BRIN = "BRIN" writeable = "writeable" transferrable = "transferrable" supercedes = "supercedes" +# Domain terms & identifiers +ot = "ot" +ba = "ba" +BA = "BA" unparseable = "unparseable" diff --git a/core/scripts/cre/environment/environment/environment.go b/core/scripts/cre/environment/environment/environment.go index 9846c3032dc..83e2037982a 100644 --- a/core/scripts/cre/environment/environment/environment.go +++ b/core/scripts/cre/environment/environment/environment.go @@ -31,11 +31,8 @@ import ( chipingressset "github.com/smartcontractkit/chainlink-testing-framework/framework/components/dockercompose/chip_ingress_set" "github.com/smartcontractkit/chainlink-testing-framework/framework/tracking" - keystone_changeset "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" cldlogger "github.com/smartcontractkit/chainlink/deployment/logger" - libc "github.com/smartcontractkit/chainlink/system-tests/lib/conversions" "github.com/smartcontractkit/chainlink/system-tests/lib/cre" - libcontracts "github.com/smartcontractkit/chainlink/system-tests/lib/cre/contracts" "github.com/smartcontractkit/chainlink/system-tests/lib/cre/don/gateway" creenv "github.com/smartcontractkit/chainlink/system-tests/lib/cre/environment" blockchains_sets "github.com/smartcontractkit/chainlink/system-tests/lib/cre/environment/blockchains/sets" @@ -205,8 +202,6 @@ var StartCmdRecoverHandlerFunc = func(p any, persistedChipIngressStackState *env func startCmd() *cobra.Command { var ( extraAllowedGatewayPorts []int - withExampleFlag bool - exampleWorkflowTimeout time.Duration withPluginsDockerImage string doSetup bool cleanupOnFailure bool @@ -403,8 +398,6 @@ func startCmd() *cobra.Command { } } - registryChainOut := output.CreEnvironment.Blockchains[0] - dxErr := trackStartup(true, hasBuiltDockerImage(in), output.CreEnvironment.Provider.Type, nil, nil, "") if dxErr != nil { fmt.Fprintf(os.Stderr, "failed to track startup: %s\n", dxErr) @@ -488,39 +481,6 @@ func startCmd() *cobra.Command { return errors.Wrap(startBillingErr, "failed to start Billing Platform Service") } } - - if withExampleFlag { - if output.GatewayConnectors == nil || len(output.GatewayConnectors.Configurations) == 0 { - return errors.New("no gateway connector configurations found") - } - - fmt.Print(libformat.PurpleText("\nRegistering and verifying example workflow\n\n")) - workflowRegistryAddress := libcontracts.MustGetAddressFromDataStore(output.CreEnvironment.CldfEnvironment.DataStore, output.CreEnvironment.Blockchains[0].ChainSelector(), keystone_changeset.WorkflowRegistry.String(), output.CreEnvironment.ContractVersions[keystone_changeset.WorkflowRegistry.String()], "") - - var workflowDonID uint32 - var donFamily string - for idx, don := range output.Dons.List() { - if don.HasFlag(cre.WorkflowDON) { - workflowDonID = libc.MustSafeUint32(idx + 1) - donFamily = don.DonFamily() - break - } - } - - if workflowDonID == 0 { - return errors.New("no workflow DON found") - } - - donFamily, familyErr := finalizeWorkflowDonFamily(donFamily) - if familyErr != nil { - return familyErr - } - - deployErr := deployAndVerifyExampleWorkflow(cmdContext, registryChainOut.CtfOutput().Nodes[0].ExternalHTTPUrl, workflowDonID, donFamily, exampleWorkflowTimeout, workflowRegistryAddress, output.CreEnvironment.ContractVersions[keystone_changeset.WorkflowRegistry.String()]) - if deployErr != nil { - fmt.Printf("Failed to deploy and verify example workflow: %s\n", deployErr) - } - } fmt.Print(libformat.PurpleText("\nEnvironment setup completed successfully in %.2f seconds\n\n", time.Since(provisioningStartTime).Seconds())) fmt.Print("To terminate execute:`go run . env stop`\n\n") @@ -549,8 +509,6 @@ func startCmd() *cobra.Command { cmd.Flags().DurationVarP(&cleanupWait, "wait-on-error-timeout", "w", 15*time.Second, "Time to wait before removing Docker containers if environment fails to start (e.g. 10s, 1m, 1h)") cmd.Flags().BoolVarP(&cleanupOnFailure, "cleanup-on-error", "l", false, "Whether to remove Docker containers if startup fails") cmd.Flags().IntSliceVarP(&extraAllowedGatewayPorts, "extra-allowed-gateway-ports", "e", []int{}, "Extra allowed ports for outgoing connections from the Gateway Connector (e.g. 8080,8081)") - cmd.Flags().BoolVarP(&withExampleFlag, "with-example", "x", false, "Deploys and registers example workflow") - cmd.Flags().DurationVarP(&exampleWorkflowTimeout, "example-workflow-timeout", "u", 5*time.Minute, "Time to wait until example workflow succeeds (e.g. 10s, 1m, 1h)") cmd.Flags().StringVarP(&withPluginsDockerImage, "with-plugins-docker-image", "p", "", "DEPRECATED:Docker image to use (set Docker image in TOML config instead)") cmd.Flags().BoolVar(&withChipIngressStack, "with-chip-ingress-stack", false, "Deploy Chip Ingress stack (Chip Ingress + Red Panda)") cmd.Flags().BoolVarP(&withChipIngressStack, "with-beholder", "b", false, "Deprecated: use --with-chip-ingress-stack. Deploy Chip Ingress stack (Chip Ingress + Red Panda)") diff --git a/core/scripts/cre/environment/environment/examples.go b/core/scripts/cre/environment/environment/examples.go deleted file mode 100644 index 58fb4d4e209..00000000000 --- a/core/scripts/cre/environment/environment/examples.go +++ /dev/null @@ -1,235 +0,0 @@ -package environment - -import ( - "context" - "fmt" - "math/big" - "os" - "path/filepath" - "time" - - "github.com/Masterminds/semver/v3" - "github.com/ethereum/go-ethereum/common" - "github.com/pkg/errors" - "github.com/spf13/cobra" - "gopkg.in/yaml.v3" - - corevm "github.com/smartcontractkit/chainlink-evm/pkg/relay" - "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" - "github.com/smartcontractkit/chainlink/core/scripts/cre/environment/examples/pkg/deploy" - "github.com/smartcontractkit/chainlink/core/scripts/cre/environment/examples/pkg/verify" - portypes "github.com/smartcontractkit/chainlink/core/scripts/cre/environment/examples/workflows/proof-of-reserve/cron-based/types" - keystone_changeset "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" - "github.com/smartcontractkit/chainlink/system-tests/lib/cre/environment" - creworkflow "github.com/smartcontractkit/chainlink/system-tests/lib/cre/workflow" - libformat "github.com/smartcontractkit/chainlink/system-tests/lib/format" -) - -func deployAndVerifyExampleWorkflowCmd() *cobra.Command { - var ( - rpcURLFlag string - workflowDonIDFlag uint32 - donFamilyFlag string - exampleWorkflowTimeoutFlag string - workflowRegistryAddressFlag string - ) - cmd := &cobra.Command{ - Use: "run-por-example", - Short: "Runs the PoR cron example workflow", - Long: `Deploys the PoR cron example workflow and waits until it succeeds`, - PersistentPreRun: globalPreRunFunc, - RunE: func(cmd *cobra.Command, args []string) error { - timeout, timeoutErr := time.ParseDuration(exampleWorkflowTimeoutFlag) - if timeoutErr != nil { - return errors.Wrapf(timeoutErr, "failed to parse %s to time.Duration", exampleWorkflowTimeoutFlag) - } - - resolver, resolverErr := TryLoadLocalCREStateResolver() - if resolverErr != nil { - return errors.Wrap(resolverErr, "failed to load local CRE state") - } - - rpcURL := rpcURLFlag - if !cmd.Flags().Changed("rpc-url") && resolver != nil { - if stateRPC, err := resolver.RegistryRPC(); err == nil { - rpcURL = stateRPC - } - } - - workflowDONID := workflowDonIDFlag - if !cmd.Flags().Changed("workflow-don-id") && resolver != nil { - if stateDONID, err := resolver.WorkflowDONID(); err == nil { - workflowDONID = stateDONID - } - } - - workflowRegistryAddress, contractsVersion, err := resolveRegistryContractAddressAndVersion(cmd, resolver, keystone_changeset.WorkflowRegistry, workflowRegistryAddressFlag, "workflow-registry-address") - if err != nil { - return errors.Wrap(err, "❌ failed to resolve workflow registry") - } - - donFamily := donFamilyFlag - if !cmd.Flags().Changed("don-family") && resolver != nil { - if stateFamily, familyErr := resolver.WorkflowDONFamily(); familyErr == nil { - donFamily = stateFamily - } - } - - donFamily, err = finalizeWorkflowDonFamily(donFamily) - if err != nil { - return err - } - - return deployAndVerifyExampleWorkflow(cmd.Context(), rpcURL, workflowDONID, donFamily, timeout, workflowRegistryAddress, contractsVersion) - }, - } - - cmd.Flags().StringVarP(&rpcURLFlag, "rpc-url", "r", "http://localhost:8545", "RPC URL") - cmd.Flags().StringVarP(&exampleWorkflowTimeoutFlag, "example-workflow-timeout", "u", "5m", "Time to wait until example workflow succeeds (e.g. 10s, 1m, 1h)") - cmd.Flags().Uint32VarP(&workflowDonIDFlag, "workflow-don-id", "d", 1, "DonID used in the workflow registry contract (integer starting with 1)") - cmd.Flags().StringVar(&donFamilyFlag, "don-family", "", "DON family for registry registration (defaults to workflow DON family from local CRE state)") - cmd.Flags().StringVarP(&workflowRegistryAddressFlag, "workflow-registry-address", "w", "", "Workflow registry address (if not provided, address from the state file will be used)") - - return cmd -} - -func executeCronBasedWorkflow(cmdContext context.Context, rpcURL string, consumerContractAddress common.Address, feedID string, waitTime time.Duration, startTime time.Time) error { - // we ignore return as if verification failed it will print that info - verifyErr := verify.ProofOfReserve(rpcURL, consumerContractAddress.Hex(), feedID, true, waitTime) - if verifyErr != nil { - fmt.Print(libformat.PurpleText("\n[Stage 4/4] Example workflow failed to execute successfully in %.2f seconds\n", time.Since(startTime).Seconds())) - return errors.Wrap(verifyErr, "failed to verify example workflow") - } - - if isBlockscoutRunning(cmdContext) { - fmt.Print(libformat.PurpleText("Open http://localhost/address/%s?tab=internal_txns to check consumer contract's transaction history\n", consumerContractAddress.Hex())) - } - - return nil -} - -func deployAndVerifyExampleWorkflow(cmdContext context.Context, rpcURL string, workflowDonID uint32, donFamily string, timeout time.Duration, workflowRegistryAddress string, contractsVersion *semver.Version) error { - totalStart := time.Now() - start := time.Now() - - if pkErr := environment.SetDefaultPrivateKeyIfEmpty(blockchain.DefaultAnvilPrivateKey); pkErr != nil { - return pkErr - } - - fmt.Print(libformat.PurpleText("[Stage 1/4] Deploying Permissionless Feeds Consumer\n\n")) - consumerContractAddress, consumerErr := deploy.PermissionlessFeedsConsumer(rpcURL) - if consumerErr != nil { - return errors.Wrap(consumerErr, "failed to deploy Permissionless Feeds Consumer contract") - } - - fmt.Print(libformat.PurpleText("\n[Stage 1/4] Deployed Permissionless Feeds Consumer in %.2f seconds\n", time.Since(start).Seconds())) - - fmt.Print(libformat.PurpleText("[Stage 2/4] Deploying Balance Reader\n\n")) - balanceReaderContractAddress, balanceReaderErr := deploy.BalanceReader(rpcURL) - if balanceReaderErr != nil { - return errors.Wrap(balanceReaderErr, "failed to deploy Balance Reader contract") - } - - fmt.Print(libformat.PurpleText("\n[Stage 2/4] Deployed Balance Reader in %.2f seconds\n", time.Since(start).Seconds())) - - start = time.Now() - fmt.Print(libformat.PurpleText("[Stage 3/4] Registering PoR cron example workflow\n\n")) - - workflowName := "por-cron-example" - workflowFilePath := "examples/workflows/proof-of-reserve/cron-based/main.go" - feedID := "0x018e16c39e0003200000000000000000" - chainID, chainSelector, chainErr := deploy.ChainMetadata(rpcURL) - if chainErr != nil { - return errors.Wrap(chainErr, "failed to resolve chain metadata for PoR config") - } - - addressesToRead, addressesErr := deploy.CreateAndFundAddresses(rpcURL, 2, big.NewInt(10)) - if addressesErr != nil { - return errors.Wrap(addressesErr, "failed to create and fund addresses for PoR config") - } - - configFilePath, configErr := buildAndSavePoRCronConfig( - consumerContractAddress.Hex(), - balanceReaderContractAddress.Hex(), - feedID, - chainSelector, - corevm.GenerateWriteTargetName(chainID), - addressesToRead, - filepath.Dir(workflowFilePath), - ) - if configErr != nil { - return errors.Wrap(configErr, "failed to build and save PoR config") - } - - defer func() { - _ = os.Remove(configFilePath) - }() - - deployErr := compileCopyAndRegisterWorkflow(cmdContext, workflowFilePath, workflowName, "", workflowRegistryAddress, "", creworkflow.DefaultWorkflowNodePattern, "", creworkflow.DefaultWorkflowTargetDir, configFilePath, "", "", rpcURL, "", contractsVersion, nil, workflowDonID, donFamily) - if deployErr != nil { - return errors.Wrap(deployErr, "failed to deploy example workflow") - } - - // Print workflow owner and name for debugging purposes - workflowOwner := common.HexToAddress("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266") // Default Anvil address - fmt.Printf("Workflow Owner: %s\n", workflowOwner.Hex()) - fmt.Printf("Workflow Name: %s\n", workflowName) - - fmt.Print(libformat.PurpleText("\n[Stage 3/4] Registered workflow in %.2f seconds\n", time.Since(start).Seconds())) - fmt.Print(libformat.PurpleText("[Stage 4/4] Waiting for %.2f seconds for workflow to execute successfully\n\n", timeout.Seconds())) - - var pauseWorkflow = func() { - fmt.Print(libformat.PurpleText("\n[Stage 4/4] Example workflow executed in %.2f seconds\n", time.Since(totalStart).Seconds())) - start = time.Now() - fmt.Print(libformat.PurpleText("\n[CLEANUP] Deleting example workflow\n\n")) - deleteErr := deleteAllWorkflows(cmdContext, rpcURL, workflowRegistryAddress, contractsVersion) - if deleteErr != nil { - fmt.Printf("Failed to delete example workflow: %s\nPlease delete it manually\n", deleteErr) - } - - fmt.Print(libformat.PurpleText("\n[CLEANUP] Deleted example workflow in %.2f seconds\n\n", time.Since(start).Seconds())) - } - defer pauseWorkflow() - - if pkErr := environment.SetDefaultPrivateKeyIfEmpty(blockchain.DefaultAnvilPrivateKey); pkErr != nil { - return pkErr - } - - return executeCronBasedWorkflow(cmdContext, rpcURL, *consumerContractAddress, feedID, timeout, totalStart) -} - -func buildAndSavePoRCronConfig(dataFeedsCacheAddress, balanceReaderAddress, feedID string, chainSelector uint64, writeTargetName string, addressesToRead []common.Address, folder string) (string, error) { - if feedID == "" { - return "", errors.New("feedID is empty") - } - if len(addressesToRead) < 2 { - return "", errors.New("at least two addresses are required for the PoR example") - } - - cfg := portypes.WorkflowConfig{ - ChainSelector: chainSelector, - ComputeConfig: portypes.ComputeConfig{ - DataFeedsCacheAddress: dataFeedsCacheAddress, - URL: "https://api.real-time-reserves.verinumus.io/v1/chainlink/proof-of-reserves/TrueUSD", - FeedID: feedID, - WriteTargetName: writeTargetName, - }, - BalanceReaderConfig: portypes.BalanceReaderConfig{ - BalanceReaderAddress: balanceReaderAddress, - AddressesToRead: addressesToRead, - }, - } - - yaml, yamlErr := yaml.Marshal(cfg) - if yamlErr != nil { - return "", errors.Wrap(yamlErr, "failed to marshal config to YAML") - } - - filePath := filepath.Join(folder, "config.yaml") - writeErr := os.WriteFile(filePath, yaml, 0644) //nolint:gosec // G306: we want it to be readable by everyone - if writeErr != nil { - return "", errors.Wrap(writeErr, "failed to write config to file") - } - - return filePath, nil -} diff --git a/core/scripts/cre/environment/environment/workflow.go b/core/scripts/cre/environment/environment/workflow.go index eeb09abc3e9..045ccd911ad 100644 --- a/core/scripts/cre/environment/environment/workflow.go +++ b/core/scripts/cre/environment/environment/workflow.go @@ -36,7 +36,6 @@ func workflowCmds() *cobra.Command { Long: `Commands to manage workflows`, } - workflowCmd.AddCommand(deployAndVerifyExampleWorkflowCmd()) workflowCmd.AddCommand(deleteWorkflowCmd()) workflowCmd.AddCommand(deleteAllWorkflowsCmd()) workflowCmd.AddCommand(compileWorkflowCmd()) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 7422ea0ed16..28228f3505f 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -38,16 +38,15 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chain-selectors v1.0.109 github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260908164107-3de1349d970b - github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d + github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049 github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d github.com/smartcontractkit/chainlink-deployments-framework v0.122.2 - github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab + github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260713161920-de075095648b github.com/smartcontractkit/chainlink-protos/job-distributor v0.20.1-0.20260701185448-696c075849ea github.com/smartcontractkit/chainlink-testing-framework/framework v0.16.8 github.com/smartcontractkit/chainlink-testing-framework/framework/components/dockercompose v0.1.23 github.com/smartcontractkit/chainlink-testing-framework/seth v1.51.5 - github.com/smartcontractkit/chainlink/core/scripts/cre/environment/examples/workflows/proof-of-reserve/cron-based v0.0.0-00010101000000-000000000000 github.com/smartcontractkit/chainlink/system-tests/lib v0.0.0-00010101000000-000000000000 github.com/spf13/cobra v1.10.2 github.com/spf13/pflag v1.0.10 @@ -58,7 +57,6 @@ require ( github.com/urfave/cli v1.22.17 golang.org/x/sync v0.22.0 golang.org/x/text v0.41.0 - gopkg.in/yaml.v3 v3.0.1 ) require ( @@ -516,12 +514,11 @@ require ( github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260908155618-50f521d70e62 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260908155618-50f521d70e62 // indirect github.com/smartcontractkit/chainlink-ccv v0.12.0 // indirect - github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72 // indirect + github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92 // indirect github.com/smartcontractkit/chainlink-confidential-compute v1.3.0 // indirect github.com/smartcontractkit/chainlink-data-streams v1.1.1 // indirect github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 // indirect - github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb // indirect github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20260723212800-b2f21d31b1d2 // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20260625152110-9afcf56e4053 // indirect @@ -673,6 +670,7 @@ require ( gopkg.in/ini.v1 v1.67.3 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect gotest.tools/v3 v3.5.2 // indirect k8s.io/api v0.36.4 // indirect k8s.io/apiextensions-apiserver v0.36.0 // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 1aea64f6e5d..b63f7ea0d9f 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1683,28 +1683,26 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260908155618-50f521d70e62/go.mod h1:c++Ed0jeYn4w8WIfiAboRwN6ClRRVGglL0qwB/QjJvM= github.com/smartcontractkit/chainlink-ccv v0.12.0 h1:/EbL7S96ItC3YF9pZ/fihbxugYxT1xxLSQSFJT4JQoQ= github.com/smartcontractkit/chainlink-ccv v0.12.0/go.mod h1:yijeTgli1K0e1noV/06/etKFxnYz8kBIe3IVXBaGnQw= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d h1:4heqJxOTXBHR3425SuXe9EzkZq+CqWOdKe4KWzAoGYA= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d/go.mod h1:ks0kniCCg8Siv2XflmwLOq5ib9Ifoh6VHXHwfEWIMQA= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049 h1:WebE9HTubitMC5xq+xCAArEI+oBLekVOoxYnCkB8whI= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049/go.mod h1:3CaCxSyZmgWl1PhxneFSZqOfN7DF2VnHML0bTfiDNIo= github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d h1:M9xuiIvdiHtim4nlxCVajyC/Mk63tAg9ESWb/biAhNA= github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d/go.mod h1:rI2njmTlyTvh+xhmORmK6qX3+V1ycDAqGJLu8LS8WpU= -github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72 h1:uWEwl7i2ryuRVoV4DmIKm6mqYevf1lH/8cQYhw/JXko= -github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72/go.mod h1:UYcRMb4dZcoaIPgZJ3hckCySTqtJc9K4Q+tOKErwTq0= +github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92 h1:Z1OIGukDhJD+Gknr5G07Vtml24E7BwKaIQoWzV/SdqA= +github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92/go.mod h1:Scyk7O80fde5rJF3Ty3fEE3xiS6j84eWbu8/2gl3pIY= github.com/smartcontractkit/chainlink-confidential-compute v1.3.0 h1:y64hOzM9H61E4EYRzQDtRwqunDBlKpsZc1SvFEUlSLE= github.com/smartcontractkit/chainlink-confidential-compute v1.3.0/go.mod h1:fq9n85XoREIUxgdXIX3RyDIRCRyxZKZ5NCBbFDfdySo= github.com/smartcontractkit/chainlink-data-streams v1.1.1 h1:WcNIy7fy/HVnjHKOm21pLwD7aMa0H6IY8mB3aJHKU4c= github.com/smartcontractkit/chainlink-data-streams v1.1.1/go.mod h1:3mVEtx2PceMRauxmK6SJqJA7JB6XHeqCJLs370nYXgI= github.com/smartcontractkit/chainlink-deployments-framework v0.122.2 h1:UtkIAbqWYtbExgCBEhQCJMEZpSrcAgPnk8GvFOGXuxA= github.com/smartcontractkit/chainlink-deployments-framework v0.122.2/go.mod h1:1fA5FLbgZlpC3OvLD/Nr86rgb4ZRI6MK0QEVVOIP1+o= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab h1:NWZzKhUqh56rmOMWMz9urvBm6jKKktdW3GBGFcJjNJE= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab/go.mod h1:XionVLmbYKsgR7Xi6hoC4D4c/uxhhBvNny8qgA39D4M= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744 h1:n+V23NCROMeWFHUyR78Z4dXkUnPV3K8RzOzJpnXuXV0= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744/go.mod h1:dEk48o9w++AyLCv12fNKIJf4Ko6iywWWJAGrjfS0vR8= github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501 h1:QJiXTG9CmaQAuMRn5JGi+Jhji7fSkehVnKpjc8oNJJY= github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501/go.mod h1:4cT1BeNF8DAn6In9zr3LayVCv1KzFeuxT7zcuNkfIb0= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260713161920-de075095648b h1:UdsGoTutNrzqQ23xA49U19lucVR98agzXRVPUPUf7eU= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260713161920-de075095648b/go.mod h1:lvYHbYNhFR2rrtwZ8NYw6dokZrX6/u9eWWJmP0Jg0y8= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 h1:8u9xUrC+yHrTDexOKDd+jrA6LCzFFHeX1G82oj2fsSI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135/go.mod h1:NkvE4iQgiT7dMCP6U3xPELHhWhN5Xr6rHC0axRebyMU= -github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c h1:AYRSQarVw1EJXUrGvHSwmRTtNHHww/i3xwLat5CshUE= -github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c/go.mod h1:HcwehCao5k5C2NGuKJUVoX/AYtoH6njGFiV44dBOcY4= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb h1:HQN56hEteWOBagVDCxV2Fn++frjRI7dfnozEQUq/5ok= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb/go.mod h1:kGprqyjsz6qFNVszOQoHc24wfvCjyipNZFste/3zcbs= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20260723212800-b2f21d31b1d2 h1:N1Q6NHuH+T2b6cst43LD2pnykNJSymP/szJJ7rrYY8I= diff --git a/core/scripts/vrfv2/genvrfnum/main.go b/core/scripts/vrfv2/genvrfnum/main.go index e149d2499cb..e8265449f9d 100644 --- a/core/scripts/vrfv2/genvrfnum/main.go +++ b/core/scripts/vrfv2/genvrfnum/main.go @@ -36,7 +36,7 @@ func main() { helpers.PanicErr(err) exportJSON, err := key.ToEncryptedJSON(*password, keystore.DefaultScryptParams) helpers.PanicErr(err) - err = os.WriteFile(*outfile, exportJSON, 0600) + err = os.WriteFile(*outfile, exportJSON, 0o600) helpers.PanicErr(err) fmt.Println("generated vrf key", key.PublicKey.String(), "and saved encrypted in", *outfile) case "gen-vrf-numbers": @@ -79,7 +79,8 @@ func main() { genProofs := func( nonceRange []uint64, - outChan chan []string) { + outChan chan []string, + ) { numIters := 0 for nonce := nonceRange[0]; nonce <= nonceRange[1]; nonce++ { var record []string @@ -96,7 +97,7 @@ func main() { PreSeed: preSeed, BlockHash: blockhash, BlockNum: *blockNum, - SubId: *subID, + SubID: *subID, CallbackGasLimit: uint32(*cbGasLimit), NumWords: uint32(*numWords), Sender: sender, @@ -152,7 +153,8 @@ func main() { for _, nonceRange := range ranges { go genProofs( nonceRange, - outC) + outC, + ) } gather(outC) @@ -235,7 +237,8 @@ func preseed(keyHash common.Hash, sender common.Address, subID, nonce uint64) [3 keyHash, sender, subID, - nonce) + nonce, + ) helpers.PanicErr(err) preSeed := crypto.Keccak256(encoded) var preSeedSized [32]byte @@ -250,5 +253,5 @@ func nonceRanges(start, end, numWorkers uint64) (ranges [][]uint64) { ranges = append(ranges, []uint64{i, j}) } - return + return ranges } diff --git a/core/scripts/vrfv2/testnet/main.go b/core/scripts/vrfv2/testnet/main.go index 18ac4e7aa83..8e60aa8b75c 100644 --- a/core/scripts/vrfv2/testnet/main.go +++ b/core/scripts/vrfv2/testnet/main.go @@ -46,9 +46,7 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/utils" ) -var ( - batchCoordinatorV2ABI = evmtypes.MustGetABI(batch_vrf_coordinator_v2.BatchVRFCoordinatorV2ABI) -) +var batchCoordinatorV2ABI = evmtypes.MustGetABI(batch_vrf_coordinator_v2.BatchVRFCoordinatorV2ABI) func main() { ctx := context.Background() @@ -109,11 +107,13 @@ func main() { reqIDs := helpers.ParseBigIntSlice(*requestIDs) bhs, err := blockhash_store.NewBlockhashStore( common.HexToAddress(*bhsAddress), - e.Ec) + e.Ec, + ) helpers.PanicErr(err) coordinator, err := vrf_coordinator_v2.NewVRFCoordinatorV2( common.HexToAddress(*coordinatorAddress), - e.Ec) + e.Ec, + ) helpers.PanicErr(err) if len(hashes) != len(reqIDs) { @@ -215,7 +215,7 @@ func main() { PreSeed: ps, BlockHash: bhSlice[i], BlockNum: blockNumSlice[i].Uint64(), - SubId: subIDSlice[i].Uint64(), + SubID: subIDSlice[i].Uint64(), CallbackGasLimit: uint32(cbLimitsSlice[i].Uint64()), NumWords: uint32(numWordsSlice[i].Uint64()), Sender: senderSlice[i], @@ -303,7 +303,7 @@ func main() { PreSeed: ps, BlockHash: common.HexToHash(*blockHash), BlockNum: *blockNum, - SubId: *subID, + SubID: *subID, CallbackGasLimit: uint32(*cbGasLimit), NumWords: uint32(*numWords), Sender: common.HexToAddress(*sender), @@ -588,7 +588,8 @@ func main() { uint32(1000000), // gas callback uint16(5), // confs uint32(1), // words - keyHashBytes) + keyHashBytes, + ) helpers.PanicErr(err) helpers.ConfirmContractDeployed(context.Background(), e.Ec, tx, e.ChainID) case "consumer-subscribe": @@ -686,7 +687,8 @@ func main() { e.Owner, e.Ec, common.HexToAddress(*consumerCoordinator), - common.HexToAddress(*consumerLinkAddress)) + common.HexToAddress(*consumerLinkAddress), + ) helpers.PanicErr(err) helpers.ConfirmContractDeployed(context.Background(), e.Ec, tx, e.ChainID) case "eoa-load-test-consumer-with-metrics-deploy": @@ -781,7 +783,8 @@ func main() { keyHashBytes := common.HexToHash(*keyHash) consumer, err := vrf_external_sub_owner_example.NewVRFExternalSubOwnerExample( common.HexToAddress(*consumerAddress), - e.Ec) + e.Ec, + ) helpers.PanicErr(err) tx, err := consumer.RequestRandomWords(e.Owner, *subID, uint32(*cbGasLimit), uint16(*requestConfirmations), uint32(*numWords), keyHashBytes) helpers.PanicErr(err) @@ -795,7 +798,8 @@ func main() { helpers.ParseArgs(cmd, os.Args[2:], "consumer-address") consumer, err := vrf_load_test_external_sub_owner.NewVRFLoadTestExternalSubOwner( common.HexToAddress(*consumerAddress), - e.Ec) + e.Ec, + ) helpers.PanicErr(err) rc, err := consumer.SResponseCount(nil) helpers.PanicErr(err) @@ -812,7 +816,8 @@ func main() { keyHashBytes := common.HexToHash(*keyHash) consumer, err := vrf_load_test_external_sub_owner.NewVRFLoadTestExternalSubOwner( common.HexToAddress(*consumerAddress), - e.Ec) + e.Ec, + ) helpers.PanicErr(err) var txes []*types.Transaction for i := 0; i < int(*runs); i++ { @@ -856,7 +861,8 @@ func main() { consumer, err := vrf_owner_test_consumer.NewVRFV2OwnerTestConsumer( common.HexToAddress(*consumerAddress), - e.Ec) + e.Ec, + ) helpers.PanicErr(err) var txes []*types.Transaction for i := 0; i < int(*runs); i++ { @@ -937,7 +943,8 @@ func main() { helpers.ParseArgs(request, os.Args[2:], "consumer-address") consumer, err := vrf_owner_test_consumer.NewVRFV2OwnerTestConsumer( common.HexToAddress(*consumerAddress), - e.Ec) + e.Ec, + ) helpers.PanicErr(err) _, err = consumer.Reset(e.Owner) helpers.PanicErr(err) @@ -956,7 +963,8 @@ func main() { keyHashBytes := common.HexToHash(*keyHash) consumer, err := vrf_load_test_with_metrics.NewVRFV2LoadTestWithMetrics( common.HexToAddress(*consumerAddress), - e.Ec) + e.Ec, + ) helpers.PanicErr(err) var txes []*types.Transaction for i := 0; i < int(*runs); i++ { @@ -984,7 +992,8 @@ func main() { helpers.ParseArgs(request, os.Args[2:], "consumer-address") consumer, err := vrf_load_test_with_metrics.NewVRFV2LoadTestWithMetrics( common.HexToAddress(*consumerAddress), - e.Ec) + e.Ec, + ) helpers.PanicErr(err) responseCount, err := consumer.SResponseCount(nil) helpers.PanicErr(err) @@ -1007,7 +1016,8 @@ func main() { helpers.ParseArgs(request, os.Args[2:], "consumer-address") consumer, err := vrf_load_test_with_metrics.NewVRFV2LoadTestWithMetrics( common.HexToAddress(*consumerAddress), - e.Ec) + e.Ec, + ) helpers.PanicErr(err) _, err = consumer.Reset(e.Owner) helpers.PanicErr(err) @@ -1313,7 +1323,8 @@ func main() { helpers.ParseArgs(cmd, os.Args[2:], "consumer-address") consumer, err := vrfv2_wrapper_consumer_example.NewVRFV2WrapperConsumerExample( - common.HexToAddress(*consumerAddress), e.Ec) + common.HexToAddress(*consumerAddress), e.Ec, + ) helpers.PanicErr(err) tx, err := consumer.MakeRequest(e.Owner, uint32(*cbGasLimit), uint16(*confirmations), uint32(*numWords)) @@ -1326,7 +1337,8 @@ func main() { helpers.ParseArgs(cmd, os.Args[2:], "consumer-address", "request-id") consumer, err := vrfv2_wrapper_consumer_example.NewVRFV2WrapperConsumerExample( - common.HexToAddress(*consumerAddress), e.Ec) + common.HexToAddress(*consumerAddress), e.Ec, + ) helpers.PanicErr(err) status, err := consumer.GetRequestStatus(nil, decimal.RequireFromString(*requestID).BigInt()) @@ -1346,7 +1358,8 @@ func main() { linkAddress := cmd.String("link-address", "", "address of link token") helpers.ParseArgs(cmd, os.Args[2:], "consumer-address") consumer, err := vrfv2_wrapper_consumer_example.NewVRFV2WrapperConsumerExample( - common.HexToAddress(*consumerAddress), e.Ec) + common.HexToAddress(*consumerAddress), e.Ec, + ) helpers.PanicErr(err) link, err := link_token_interface.NewLinkToken(common.HexToAddress(*linkAddress), e.Ec) helpers.PanicErr(err) @@ -1390,7 +1403,8 @@ func main() { func getVRFOwnerTestConsumerMetrics(consumerAddress string, e helpers.Environment) LoadTestMetrics { consumer, err := vrf_owner_test_consumer.NewVRFV2OwnerTestConsumer( common.HexToAddress(consumerAddress), - e.Ec) + e.Ec, + ) helpers.PanicErr(err) responseCount, err := consumer.SResponseCount(nil) helpers.PanicErr(err) diff --git a/core/scripts/vrfv2plus/testnet/main.go b/core/scripts/vrfv2plus/testnet/main.go index 9544e18d10d..071953c07b6 100644 --- a/core/scripts/vrfv2plus/testnet/main.go +++ b/core/scripts/vrfv2plus/testnet/main.go @@ -51,9 +51,7 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/services/vrf/proof" ) -var ( - batchCoordinatorV2PlusABI = evmtypes.MustGetABI(batch_vrf_coordinator_v2plus.BatchVRFCoordinatorV2PlusABI) -) +var batchCoordinatorV2PlusABI = evmtypes.MustGetABI(batch_vrf_coordinator_v2plus.BatchVRFCoordinatorV2PlusABI) func main() { ctx := context.Background() @@ -154,7 +152,8 @@ func main() { coordinatorAddr := cmd.String("coordinator-address", "", "address of the vrf coordinator v2 contract") helpers.ParseArgs(cmd, os.Args[2:], "coordinator-address") _, tx, _, err := batch_vrf_coordinator_v2plus.DeployBatchVRFCoordinatorV2Plus( - e.Owner, e.Ec, common.HexToAddress(*coordinatorAddr)) + e.Owner, e.Ec, common.HexToAddress(*coordinatorAddr), + ) helpers.PanicErr(err) helpers.ConfirmContractDeployed(context.Background(), e.Ec, tx, e.ChainID) case "batch-coordinatorv2plus-fulfill": @@ -216,7 +215,7 @@ func main() { PreSeed: ps, BlockHash: bhSlice[i], BlockNum: blockNumSlice[i].Uint64(), - SubId: subIDSlice[i], + SubID: subIDSlice[i], CallbackGasLimit: uint32(cbLimitsSlice[i].Uint64()), NumWords: uint32(numWordsSlice[i].Uint64()), Sender: senderSlice[i], @@ -310,7 +309,7 @@ func main() { PreSeed: ps, BlockHash: common.HexToHash(*blockHash), BlockNum: *blockNum, - SubId: parsedSubID, + SubID: parsedSubID, CallbackGasLimit: uint32(*cbGasLimit), NumWords: uint32(*numWords), Sender: common.HexToAddress(*sender), @@ -685,7 +684,8 @@ func main() { uint16(5), // confs uint32(1), // words keyHashBytes, - *nativePayment) + *nativePayment, + ) helpers.PanicErr(err) helpers.ConfirmContractDeployed(context.Background(), e.Ec, tx, e.ChainID) case "consumer-subscribe": @@ -785,7 +785,8 @@ func main() { e.Owner, e.Ec, common.HexToAddress(*consumerCoordinator), - common.HexToAddress(*consumerLinkAddress)) + common.HexToAddress(*consumerLinkAddress), + ) helpers.PanicErr(err) helpers.ConfirmContractDeployed(context.Background(), e.Ec, tx, e.ChainID) case "eoa-load-test-consumer-with-metrics-deploy": @@ -874,7 +875,8 @@ func main() { keyHashBytes := common.HexToHash(*keyHash) consumer, err := vrf_v2plus_sub_owner.NewVRFV2PlusExternalSubOwnerExample( common.HexToAddress(*consumerAddress), - e.Ec) + e.Ec, + ) helpers.PanicErr(err) tx, err := consumer.RequestRandomWords(e.Owner, parseUInt256String(*subID), uint32(*cbGasLimit), uint16(*requestConfirmations), uint32(*numWords), keyHashBytes, *nativePayment) helpers.PanicErr(err) @@ -888,7 +890,8 @@ func main() { helpers.ParseArgs(cmd, os.Args[2:], "consumer-address") consumer, err := vrf_load_test_external_sub_owner.NewVRFLoadTestExternalSubOwner( common.HexToAddress(*consumerAddress), - e.Ec) + e.Ec, + ) helpers.PanicErr(err) rc, err := consumer.SResponseCount(nil) helpers.PanicErr(err) @@ -905,7 +908,8 @@ func main() { keyHashBytes := common.HexToHash(*keyHash) consumer, err := vrf_load_test_external_sub_owner.NewVRFLoadTestExternalSubOwner( common.HexToAddress(*consumerAddress), - e.Ec) + e.Ec, + ) helpers.PanicErr(err) var txes []*types.Transaction for i := 0; i < int(*runs); i++ { @@ -935,7 +939,8 @@ func main() { keyHashBytes := common.HexToHash(*keyHash) consumer, err := vrf_v2plus_load_test_with_metrics.NewVRFV2PlusLoadTestWithMetrics( common.HexToAddress(*consumerAddress), - e.Ec) + e.Ec, + ) helpers.PanicErr(err) var txes []*types.Transaction for i := 0; i < int(*runs); i++ { @@ -964,7 +969,8 @@ func main() { helpers.ParseArgs(request, os.Args[2:], "consumer-address") consumer, err := vrf_v2plus_load_test_with_metrics.NewVRFV2PlusLoadTestWithMetrics( common.HexToAddress(*consumerAddress), - e.Ec) + e.Ec, + ) helpers.PanicErr(err) responseCount, err := consumer.SResponseCount(nil) helpers.PanicErr(err) @@ -1000,7 +1006,8 @@ func main() { helpers.ParseArgs(request, os.Args[2:], "consumer-address") consumer, err := vrf_v2plus_load_test_with_metrics.NewVRFV2PlusLoadTestWithMetrics( common.HexToAddress(*consumerAddress), - e.Ec) + e.Ec, + ) helpers.PanicErr(err) _, err = consumer.Reset(e.Owner) helpers.PanicErr(err) @@ -1338,7 +1345,8 @@ func main() { helpers.ParseArgs(cmd, os.Args[2:], "consumer-address") consumer, err := vrfv2plus_wrapper_consumer_example.NewVRFV2PlusWrapperConsumerExample( - common.HexToAddress(*consumerAddress), e.Ec) + common.HexToAddress(*consumerAddress), e.Ec, + ) helpers.PanicErr(err) var tx *types.Transaction @@ -1356,7 +1364,8 @@ func main() { helpers.ParseArgs(cmd, os.Args[2:], "consumer-address", "request-id") consumer, err := vrfv2plus_wrapper_consumer_example.NewVRFV2PlusWrapperConsumerExample( - common.HexToAddress(*consumerAddress), e.Ec) + common.HexToAddress(*consumerAddress), e.Ec, + ) helpers.PanicErr(err) status, err := consumer.GetRequestStatus(nil, decimal.RequireFromString(*requestID).BigInt()) @@ -1376,7 +1385,8 @@ func main() { linkAddress := cmd.String("link-address", "", "address of link token") helpers.ParseArgs(cmd, os.Args[2:], "consumer-address") consumer, err := vrfv2plus_wrapper_consumer_example.NewVRFV2PlusWrapperConsumerExample( - common.HexToAddress(*consumerAddress), e.Ec) + common.HexToAddress(*consumerAddress), e.Ec, + ) helpers.PanicErr(err) link, err := link_token_interface.NewLinkToken(common.HexToAddress(*linkAddress), e.Ec) helpers.PanicErr(err) diff --git a/core/scripts/vrfv2plus/testnet/proofs.go b/core/scripts/vrfv2plus/testnet/proofs.go index aeb7316ae73..ab584c95c80 100644 --- a/core/scripts/vrfv2plus/testnet/proofs.go +++ b/core/scripts/vrfv2plus/testnet/proofs.go @@ -111,7 +111,7 @@ func generateProofForV2Plus(e helpers.Environment) { PreSeed: preSeed, BlockHash: blockHash, BlockNum: *blockNum, - SubId: parsedSubId, + SubID: parsedSubId, CallbackGasLimit: uint32(*callbackGasLimit), NumWords: uint32(*numWords), Sender: sender, diff --git a/core/scripts/vrfv2plus/testnet/v2plusscripts/super_scripts.go b/core/scripts/vrfv2plus/testnet/v2plusscripts/super_scripts.go index da550b0506f..7f77c8a1ba2 100644 --- a/core/scripts/vrfv2plus/testnet/v2plusscripts/super_scripts.go +++ b/core/scripts/vrfv2plus/testnet/v2plusscripts/super_scripts.go @@ -308,7 +308,7 @@ func SmokeTestVRF(e helpers.Environment) { PreSeed: preSeed, BlockHash: rwrLog.Raw.BlockHash, BlockNum: rwrLog.Raw.BlockNumber, - SubId: rwrLog.SubId, + SubID: rwrLog.SubId, CallbackGasLimit: rwrLog.CallbackGasLimit, NumWords: rwrLog.NumWords, Sender: rwrLog.Sender, diff --git a/core/services/arbiter/arbiter.go b/core/services/arbiter/arbiter.go index b1509c798c6..ad83ddcd3ed 100644 --- a/core/services/arbiter/arbiter.go +++ b/core/services/arbiter/arbiter.go @@ -12,9 +12,9 @@ import ( healthgrpc "google.golang.org/grpc/health/grpc_health_v1" "google.golang.org/grpc/reflection" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" ringpb "github.com/smartcontractkit/chainlink-protos/ring/go" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) // Arbiter is the main service interface. @@ -54,7 +54,7 @@ func New( pollInterval time.Duration, retryInterval time.Duration, ) (Arbiter, error) { - lggr = lggr.Named("Arbiter") + lggr = logger.Named(lggr, "Arbiter") // Create state state := NewState() diff --git a/core/services/arbiter/grpc_server.go b/core/services/arbiter/grpc_server.go index 2dff888941b..e416ec886e2 100644 --- a/core/services/arbiter/grpc_server.go +++ b/core/services/arbiter/grpc_server.go @@ -7,8 +7,8 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "github.com/smartcontractkit/chainlink-common/pkg/logger" ringpb "github.com/smartcontractkit/chainlink-protos/ring/go" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) // GRPCServer implements the Arbiter gRPC interface from chainlink-common. @@ -24,7 +24,7 @@ func NewGRPCServer(shardConfig ShardConfigReader, state *State, lggr logger.Logg return &GRPCServer{ shardConfig: shardConfig, state: state, - lggr: lggr.Named("GRPCServer"), + lggr: logger.Named(lggr, "GRPCServer"), } } diff --git a/core/services/arbiter/shardconfig.go b/core/services/arbiter/shardconfig.go index 2ac5e8cd148..a853e9b38eb 100644 --- a/core/services/arbiter/shardconfig.go +++ b/core/services/arbiter/shardconfig.go @@ -9,12 +9,12 @@ import ( "sync" "time" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" "github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings/dev/generated/latest/shard_config" "github.com/smartcontractkit/chainlink-evm/pkg/config" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) const ( @@ -68,7 +68,7 @@ func NewShardConfigSyncer( lggr logger.Logger, ) ShardConfigReader { return &shardConfigSyncer{ - lggr: lggr.Named("ShardConfigSyncer"), + lggr: logger.Named(lggr, "ShardConfigSyncer"), shardConfigAddress: shardConfigAddress, contractReaderFactory: contractReaderFactory, pollInterval: pollInterval, diff --git a/core/services/beholder/config_recorder.go b/core/services/beholder/config_recorder.go index e13085c499a..8dddc348b86 100644 --- a/core/services/beholder/config_recorder.go +++ b/core/services/beholder/config_recorder.go @@ -5,8 +5,8 @@ import ( "time" "github.com/smartcontractkit/chainlink-common/pkg/beholder" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) // ConfigRecorder periodically records Beholder config info metric. @@ -17,14 +17,14 @@ type ConfigRecorder struct { interval time.Duration } -func NewConfigRecorder(logger logger.Logger, interval time.Duration) *ConfigRecorder { +func NewConfigRecorder(lggr logger.Logger, interval time.Duration) *ConfigRecorder { cr := &ConfigRecorder{ interval: interval, } cr.Service, cr.eng = services.Config{ Name: "BeholderConfigRecorder", Start: cr.start, - }.NewServiceEngine(logger) + }.NewServiceEngine(lggr) return cr } diff --git a/core/services/blockhashstore/bhs.go b/core/services/blockhashstore/bhs.go index 2e94168ecf3..0025d01ad00 100644 --- a/core/services/blockhashstore/bhs.go +++ b/core/services/blockhashstore/bhs.go @@ -118,7 +118,7 @@ func (c *BulletproofBHS) StoreTrusted( recentBlockhash common.Hash, ) error { // Convert and pack arguments for a "storeTrusted" function call to the trusted BHS. - var blockNumsBig []*big.Int + blockNumsBig := make([]*big.Int, 0, len(blockNums)) for _, b := range blockNums { blockNumsBig = append(blockNumsBig, new(big.Int).SetUint64(b)) } @@ -170,7 +170,7 @@ func (c *BulletproofBHS) IsStored(ctx context.Context, blockNum uint64) (bool, e } func (c *BulletproofBHS) sendingKeys() []common.Address { - var keys []common.Address + keys := make([]common.Address, 0, len(c.fromAddresses)) for _, a := range c.fromAddresses { keys = append(keys, a.Address()) } diff --git a/core/services/blockhashstore/common.go b/core/services/blockhashstore/common.go index 09f2c854015..d567113ef0d 100644 --- a/core/services/blockhashstore/common.go +++ b/core/services/blockhashstore/common.go @@ -8,15 +8,15 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/pkg/errors" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-evm/pkg/types" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) // Coordinator defines an interface for fetching request and fulfillment metadata from a VRF // coordinator. type Coordinator interface { // Requests fetches VRF requests that occurred within the specified blocks. - Requests(ctx context.Context, fromBlock uint64, toBlock uint64) ([]Event, error) + Requests(ctx context.Context, fromBlock, toBlock uint64) ([]Event, error) // Fulfillments fetches VRF fulfillments that occurred since the specified block. Fulfillments(ctx context.Context, fromBlock uint64) ([]Event, error) @@ -71,18 +71,18 @@ func GetUnfulfilledBlocksAndRequests( requestIDToBlock[req.ID] = req.Block } - fulfillments, err := coordinator.Fulfillments(ctx, fromBlock) + fuls, err := coordinator.Fulfillments(ctx, fromBlock) if err != nil { lggr.Errorw("Failed to fetch VRF fulfillments", "err", err) return nil, errors.Wrap(err, "fetching VRF fulfillments") } - for _, fulfillment := range fulfillments { - requestBlock, ok := requestIDToBlock[fulfillment.ID] + for _, full := range fuls { + requestBlock, ok := requestIDToBlock[full.ID] if !ok { continue } - delete(blockToRequests[requestBlock], fulfillment.ID) + delete(blockToRequests[requestBlock], full.ID) } return blockToRequests, nil @@ -110,7 +110,7 @@ func DecreasingBlockRange(start, end *big.Int) (ret []*big.Int, err error) { for i := new(big.Int).Set(start); i.Cmp(end) >= 0; i.Sub(i, big.NewInt(1)) { ret = append(ret, new(big.Int).Set(i)) } - return + return ret, err } // GetSearchWindow returns the search window (fromBlock, toBlock) given the latest block number, wait blocks and lookback blocks @@ -132,7 +132,7 @@ func GetSearchWindow(latestBlock, waitBlocks, lookbackBlocks int) (uint64, uint6 // SendingKeys returns a list of sending keys (common.Address) given EIP55 addresses func SendingKeys(fromAddresses []types.EIP55Address) []common.Address { - var keys []common.Address + keys := make([]common.Address, 0, len(fromAddresses)) for _, a := range fromAddresses { keys = append(keys, a.Address()) } diff --git a/core/services/blockhashstore/delegate.go b/core/services/blockhashstore/delegate.go index b2657776824..9952c1be9a0 100644 --- a/core/services/blockhashstore/delegate.go +++ b/core/services/blockhashstore/delegate.go @@ -10,6 +10,7 @@ import ( "github.com/pkg/errors" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-evm/gethwrappers/generated/blockhash_store" "github.com/smartcontractkit/chainlink-evm/gethwrappers/generated/trusted_blockhash_store" @@ -19,7 +20,6 @@ import ( "github.com/smartcontractkit/chainlink-evm/pkg/keys" "github.com/smartcontractkit/chainlink-evm/pkg/types" "github.com/smartcontractkit/chainlink/v2/core/config" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/keystore" ) @@ -62,8 +62,7 @@ func (d *Delegate) JobType() job.Type { // ServicesForSpec satisfies the job.Delegate interface. func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) ([]job.ServiceCtx, error) { if jb.BlockhashStoreSpec == nil { - return nil, errors.Errorf( - "blockhashstore.Delegate expects a BlockhashStoreSpec to be present, got %+v", jb) + return nil, errors.Errorf("blockhashstore.Delegate expects a BlockhashStoreSpec to be present, got %+v", jb) } marshalledJob, err := json.MarshalIndent(jb.BlockhashStoreSpec, "", " ") if err != nil { @@ -74,8 +73,7 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) ([]job.Servi cid := jb.BlockhashStoreSpec.EVMChainID.ToInt() chainService, err := d.legacyChains.Get(cid.String()) if err != nil { - return nil, fmt.Errorf( - "getting chain ID %s: %w", cid, err) + return nil, fmt.Errorf("getting chain ID %s: %w", cid, err) } chain, ok := chainService.(legacyevm.Chain) if !ok { @@ -100,8 +98,7 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) ([]job.Servi fromAddresses = jb.BlockhashStoreSpec.FromAddresses } - bhs, err := blockhash_store.NewBlockhashStore( - jb.BlockhashStoreSpec.BlockhashStoreAddress.Address(), chain.Client()) + bhs, err := blockhash_store.NewBlockhashStore(jb.BlockhashStoreSpec.BlockhashStoreAddress.Address(), chain.Client()) if err != nil { return nil, errors.Wrap(err, "building BHS") } @@ -121,8 +118,7 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) ([]job.Servi var coordinators []Coordinator if jb.BlockhashStoreSpec.CoordinatorV2Address != nil { var c *v2.VRFCoordinatorV2 - if c, err = v2.NewVRFCoordinatorV2( - jb.BlockhashStoreSpec.CoordinatorV2Address.Address(), chain.Client()); err != nil { + if c, err = v2.NewVRFCoordinatorV2(jb.BlockhashStoreSpec.CoordinatorV2Address.Address(), chain.Client()); err != nil { return nil, errors.Wrap(err, "building V2 coordinator") } @@ -135,8 +131,7 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) ([]job.Servi } if jb.BlockhashStoreSpec.CoordinatorV2PlusAddress != nil { var c v2plus.IVRFCoordinatorV2PlusInternalInterface - if c, err = v2plus.NewIVRFCoordinatorV2PlusInternal( - jb.BlockhashStoreSpec.CoordinatorV2PlusAddress.Address(), chain.Client()); err != nil { + if c, err = v2plus.NewIVRFCoordinatorV2PlusInternal(jb.BlockhashStoreSpec.CoordinatorV2PlusAddress.Address(), chain.Client()); err != nil { return nil, errors.Wrap(err, "building V2Plus coordinator") } @@ -161,7 +156,7 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) ([]job.Servi return nil, errors.Wrap(err, "building bulletproof bhs") } - log := d.logger.Named("BHSFeeder").With("jobID", jb.ID, "externalJobID", jb.ExternalJobID) + log := logger.With(logger.Named(d.logger, "BHSFeeder"), "jobID", jb.ID, "externalJobID", jb.ExternalJobID) feeder := NewFeeder( log, NewMultiCoordinator(coordinators...), @@ -177,7 +172,8 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) ([]job.Servi return 0, errors.Wrap(err, "getting chain head") } return uint64(head.BlockNumber), nil //nolint:gosec //G115 - }) + }, + ) return []job.ServiceCtx{&service{ feeder: feeder, diff --git a/core/services/blockhashstore/delegate_test.go b/core/services/blockhashstore/delegate_test.go index 351d4d23bc6..f01f1b335a5 100644 --- a/core/services/blockhashstore/delegate_test.go +++ b/core/services/blockhashstore/delegate_test.go @@ -96,7 +96,7 @@ func TestDelegate_ServicesForSpec(t *testing.T) { if finalityDepth > math.MaxInt32 { t.Fatalf("finality depth overflows int32: %d", finalityDepth) } - defaultWaitBlocks := (int32)(finalityDepth) + defaultWaitBlocks := int32(finalityDepth) //nolint:gosec // G115: guarded above by finalityDepth > math.MaxInt32 t.Run("happy", func(t *testing.T) { spec := job.Job{BlockhashStoreSpec: &job.BlockhashStoreSpec{WaitBlocks: defaultWaitBlocks, EVMChainID: (*sqlutil.Big)(testutils.FixtureChainID)}} @@ -162,7 +162,7 @@ func TestDelegate_StartStop(t *testing.T) { if finalityDepth > math.MaxInt32 { t.Fatalf("finality depth overflows int32: %d", finalityDepth) } - defaultWaitBlocks := (int32)(finalityDepth) + defaultWaitBlocks := int32(finalityDepth) //nolint:gosec // G115: guarded above by finalityDepth > math.MaxInt32 spec := job.Job{BlockhashStoreSpec: &job.BlockhashStoreSpec{ WaitBlocks: defaultWaitBlocks, PollPeriod: time.Second, diff --git a/core/services/blockhashstore/feeder.go b/core/services/blockhashstore/feeder.go index 2add02207ec..aad4d63a8bd 100644 --- a/core/services/blockhashstore/feeder.go +++ b/core/services/blockhashstore/feeder.go @@ -11,8 +11,8 @@ import ( "github.com/ethereum/go-ethereum/common" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-evm/pkg/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) const trustedTimeout = 1 * time.Second @@ -119,7 +119,7 @@ func (f *Feeder) Run(ctx context.Context) error { return nil } - lggr := f.lggr.With("latestBlock", latestBlock, "fromBlock", fromBlock, "toBlock", toBlock) + lggr := logger.With(f.lggr, "latestBlock", latestBlock, "fromBlock", fromBlock, "toBlock", toBlock) blockToRequests, err := GetUnfulfilledBlocksAndRequests(ctx, lggr, f.coordinator, fromBlock, toBlock) if err != nil { return err @@ -244,9 +244,7 @@ func (f *Feeder) runTrusted( // Get all logpoller blocks for the range including the batch and the latest block, // as to include the recent blockhash. - blocks := slices.AppendSeq(make([]uint64, 0, len(batch)+1), maps.Keys(batch)) - blocks = append(blocks, latestBlock) - lpBlocks, err := f.lp.GetBlocksRange(ctx, blocks) + lpBlocks, err := f.lp.GetBlocksRange(ctx, append(slices.Collect(maps.Keys(batch)), latestBlock)) if err != nil { f.lggr.Errorw("Failed to get blocks range", "err", err, diff --git a/core/services/blockhashstore/feeder_test.go b/core/services/blockhashstore/feeder_test.go index 571571d2eba..c30068368b0 100644 --- a/core/services/blockhashstore/feeder_test.go +++ b/core/services/blockhashstore/feeder_test.go @@ -399,7 +399,7 @@ func (test testCase) testFeeder(t *testing.T) { } require.ElementsMatch(t, test.expectedStored, test.bhs.Stored) - require.ElementsMatch(t, test.expectedStoredMapBlocks, slices.AppendSeq(make([]uint64, 0, len(feeder.stored)), maps.Keys(feeder.stored))) + require.ElementsMatch(t, test.expectedStoredMapBlocks, slices.Collect(maps.Keys(feeder.stored))) } func TestFeederWithLogPollerVRFv2(t *testing.T) { @@ -429,25 +429,25 @@ func (test testCase) testFeederWithLogPollerVRFv2(t *testing.T) { // Construct request logs. var requestLogs []logpoller.Log for _, r := range test.requests { - if r.Block < uint64(fromBlock) || r.Block > uint64(toBlock) { + if r.Block < uint64(fromBlock) || r.Block > uint64(toBlock) { //nolint:gosec // G115: fromBlock/toBlock are non-negative (clamped below) continue // do not include blocks outside our search window } - reqId, ok := big.NewInt(0).SetString(r.ID, 10) + reqID, ok := big.NewInt(0).SetString(r.ID, 10) require.True(t, ok) requestLogs = append( requestLogs, - newRandomnessRequestedLogV2(t, r.Block, reqId, coordinatorAddress), + newRandomnessRequestedLogV2(t, r.Block, reqID, coordinatorAddress), ) } // Construct fulfillment logs. - var fulfillmentLogs []logpoller.Log + fulfillmentLogs := make([]logpoller.Log, 0, len(test.fulfillments)) for _, r := range test.fulfillments { - reqId, ok := big.NewInt(0).SetString(r.ID, 10) + reqID, ok := big.NewInt(0).SetString(r.ID, 10) require.True(t, ok) fulfillmentLogs = append( fulfillmentLogs, - newRandomnessFulfilledLogV2(t, r.Block, reqId, coordinatorAddress), + newRandomnessFulfilledLogV2(t, r.Block, reqID, coordinatorAddress), ) } @@ -498,7 +498,7 @@ func (test testCase) testFeederWithLogPollerVRFv2(t *testing.T) { require.EqualError(t, err, test.expectedErrMsg) } require.ElementsMatch(t, test.expectedStored, test.bhs.Stored) - require.ElementsMatch(t, test.expectedStoredMapBlocks, slices.AppendSeq(make([]uint64, 0, len(feeder.stored)), maps.Keys(feeder.stored))) + require.ElementsMatch(t, test.expectedStoredMapBlocks, slices.Collect(maps.Keys(feeder.stored))) } func TestFeederWithLogPollerVRFv2Plus(t *testing.T) { @@ -531,22 +531,22 @@ func (test testCase) testFeederWithLogPollerVRFv2Plus(t *testing.T) { if r.Block < uint64(fromBlock) || r.Block > uint64(toBlock) { //nolint:gosec // G115 continue // do not include blocks outside our search window } - reqId, ok := big.NewInt(0).SetString(r.ID, 10) + reqID, ok := big.NewInt(0).SetString(r.ID, 10) require.True(t, ok) requestLogs = append( requestLogs, - newRandomnessRequestedLogV2Plus(t, r.Block, reqId, coordinatorAddress), + newRandomnessRequestedLogV2Plus(t, r.Block, reqID, coordinatorAddress), ) } // Construct fulfillment logs. - var fulfillmentLogs []logpoller.Log + fulfillmentLogs := make([]logpoller.Log, 0, len(test.fulfillments)) for _, r := range test.fulfillments { - reqId, ok := big.NewInt(0).SetString(r.ID, 10) + reqID, ok := big.NewInt(0).SetString(r.ID, 10) require.True(t, ok) fulfillmentLogs = append( fulfillmentLogs, - newRandomnessFulfilledLogV2Plus(t, r.Block, reqId, coordinatorAddress), + newRandomnessFulfilledLogV2Plus(t, r.Block, reqID, coordinatorAddress), ) } @@ -597,7 +597,7 @@ func (test testCase) testFeederWithLogPollerVRFv2Plus(t *testing.T) { require.EqualError(t, err, test.expectedErrMsg) } require.ElementsMatch(t, test.expectedStored, test.bhs.Stored) - require.ElementsMatch(t, test.expectedStoredMapBlocks, slices.AppendSeq(make([]uint64, 0, len(feeder.stored)), maps.Keys(feeder.stored))) + require.ElementsMatch(t, test.expectedStoredMapBlocks, slices.Collect(maps.Keys(feeder.stored))) } func TestFeeder_CachesStoredBlocks(t *testing.T) { @@ -675,7 +675,7 @@ func newRandomnessRequestedLogV2( keyHashType, err := abi.NewType("bytes32", "", nil) require.NoError(t, err) - subIdType, err := abi.NewType("uint64", "", nil) + subIDType, err := abi.NewType("uint64", "", nil) require.NoError(t, err) senderType, err := abi.NewType("address", "", nil) @@ -686,9 +686,9 @@ func newRandomnessRequestedLogV2( Type: keyHashType, Indexed: true, }} - subIdArg := abi.Arguments{abi.Argument{ + subIDArg := abi.Arguments{abi.Argument{ Name: "subId", - Type: subIdType, + Type: subIDType, Indexed: true, }} @@ -700,7 +700,7 @@ func newRandomnessRequestedLogV2( topic1, err := keyHashArg.Pack(e.KeyHash) require.NoError(t, err) - topic2, err := subIdArg.Pack(e.SubId) + topic2, err := subIDArg.Pack(e.SubId) require.NoError(t, err) topic3, err := senderArg.Pack(e.Sender) require.NoError(t, err) @@ -753,16 +753,16 @@ func newRandomnessFulfilledLogV2( ) require.NoError(t, err) - requestIdType, err := abi.NewType("uint256", "", nil) + requestIDType, err := abi.NewType("uint256", "", nil) require.NoError(t, err) - requestIdArg := abi.Arguments{abi.Argument{ + requestIDArg := abi.Arguments{abi.Argument{ Name: "requestId", - Type: requestIdType, + Type: requestIDType, Indexed: true, }} - topic1, err := requestIdArg.Pack(e.RequestId) + topic1, err := requestIDArg.Pack(e.RequestId) require.NoError(t, err) topic0 := vrfCoordinatorV2ABI.Events[randomWordsFulfilledV2].ID @@ -819,7 +819,7 @@ func newRandomnessRequestedLogV2Plus( keyHashType, err := abi.NewType("bytes32", "", nil) require.NoError(t, err) - subIdType, err := abi.NewType("uint256", "", nil) + subIDType, err := abi.NewType("uint256", "", nil) require.NoError(t, err) senderType, err := abi.NewType("address", "", nil) @@ -830,9 +830,9 @@ func newRandomnessRequestedLogV2Plus( Type: keyHashType, Indexed: true, }} - subIdArg := abi.Arguments{abi.Argument{ + subIDArg := abi.Arguments{abi.Argument{ Name: "subId", - Type: subIdType, + Type: subIDType, Indexed: true, }} @@ -844,7 +844,7 @@ func newRandomnessRequestedLogV2Plus( topic1, err := keyHashArg.Pack(e.KeyHash) require.NoError(t, err) - topic2, err := subIdArg.Pack(e.SubId) + topic2, err := subIDArg.Pack(e.SubId) require.NoError(t, err) topic3, err := senderArg.Pack(e.Sender) require.NoError(t, err) @@ -863,7 +863,7 @@ func newRandomnessRequestedLogV2Plus( // third topic is sender since it's indexed topic3, }, - BlockNumber: int64(requestBlock), + BlockNumber: int64(requestBlock), //nolint:gosec // G115: fixture block numbers fit int64 EventSig: topic0, } return lg @@ -899,25 +899,25 @@ func newRandomnessFulfilledLogV2Plus( ) require.NoError(t, err) - requestIdType, err := abi.NewType("uint256", "", nil) + requestIDType, err := abi.NewType("uint256", "", nil) require.NoError(t, err) - subIdType, err := abi.NewType("uint256", "", nil) + subIDType, err := abi.NewType("uint256", "", nil) require.NoError(t, err) - requestIdArg := abi.Arguments{abi.Argument{ + requestIDArg := abi.Arguments{abi.Argument{ Name: "requestId", - Type: requestIdType, + Type: requestIDType, Indexed: true, }} - subIdArg := abi.Arguments{abi.Argument{ + subIDArg := abi.Arguments{abi.Argument{ Name: "subID", - Type: subIdType, + Type: subIDType, Indexed: true, }} - topic1, err := requestIdArg.Pack(e.RequestId) + topic1, err := requestIDArg.Pack(e.RequestId) require.NoError(t, err) - topic2, err := subIdArg.Pack(e.SubId) + topic2, err := subIDArg.Pack(e.SubId) require.NoError(t, err) topic0 := vrfCoordinatorV2PlusABI.Events[randomWordsFulfilledV2Plus].ID @@ -931,7 +931,7 @@ func newRandomnessFulfilledLogV2Plus( topic1, topic2, }, - BlockNumber: int64(requestBlock), + BlockNumber: int64(requestBlock), //nolint:gosec // G115: fixture block numbers fit int64 EventSig: topic0, } return lg diff --git a/core/services/blockhashstore/test_util.go b/core/services/blockhashstore/test_util.go index 5ac95bffea5..6339daf0bc1 100644 --- a/core/services/blockhashstore/test_util.go +++ b/core/services/blockhashstore/test_util.go @@ -19,7 +19,7 @@ func (t *TestCoordinator) Addresses() []common.Address { return []common.Address{} } -func (t *TestCoordinator) Requests(_ context.Context, fromBlock uint64, toBlock uint64) ([]Event, error) { +func (t *TestCoordinator) Requests(_ context.Context, fromBlock, toBlock uint64) ([]Event, error) { var result []Event for _, req := range t.RequestEvents { if req.Block >= fromBlock && req.Block <= toBlock { @@ -31,9 +31,9 @@ func (t *TestCoordinator) Requests(_ context.Context, fromBlock uint64, toBlock func (t *TestCoordinator) Fulfillments(_ context.Context, fromBlock uint64) ([]Event, error) { var result []Event - for _, fulfilment := range t.FulfillmentEvents { - if fulfilment.Block >= fromBlock { - result = append(result, fulfilment) + for _, full := range t.FulfillmentEvents { + if full.Block >= fromBlock { + result = append(result, full) } } return result, nil @@ -129,8 +129,7 @@ func (t *TestBatchBHS) StoreVerifyHeader(ctx context.Context, blockNumbers []*bi return nil } -type TestBlockHeaderProvider struct { -} +type TestBlockHeaderProvider struct{} func (p *TestBlockHeaderProvider) RlpHeadersBatch(ctx context.Context, blockRange []*big.Int) ([][]byte, error) { var headers [][]byte diff --git a/core/services/blockheaderfeeder/block_header.go b/core/services/blockheaderfeeder/block_header.go index 0729b09dd80..ba87419af7b 100644 --- a/core/services/blockheaderfeeder/block_header.go +++ b/core/services/blockheaderfeeder/block_header.go @@ -30,7 +30,7 @@ func NewGethBlockHeaderProvider(client Client) *GethBlockHeaderProvider { // block header format is different from go-ethereum types.Header. // validation for invalid chain ID is done upstream in blockheaderfeeder.validate.go func (p *GethBlockHeaderProvider) RlpHeadersBatch(ctx context.Context, blockRange []*big.Int) ([][]byte, error) { - var reqs []rpc.BatchElem + reqs := make([]rpc.BatchElem, 0, len(blockRange)) for _, num := range blockRange { parentBlockNum := big.NewInt(num.Int64() + 1) req := rpc.BatchElem{ diff --git a/core/services/blockheaderfeeder/block_header_feeder.go b/core/services/blockheaderfeeder/block_header_feeder.go index 7e4edbd9286..4bdc92bb2d9 100644 --- a/core/services/blockheaderfeeder/block_header_feeder.go +++ b/core/services/blockheaderfeeder/block_header_feeder.go @@ -12,15 +12,13 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/pkg/errors" + "github.com/smartcontractkit/chainlink-common/pkg/logger" evmkeystore "github.com/smartcontractkit/chainlink-evm/pkg/keys" "github.com/smartcontractkit/chainlink-evm/pkg/types" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/blockhashstore" ) -var ( - zeroHash [32]byte -) +var zeroHash [32]byte type BlockHeaderProvider interface { RlpHeadersBatch(ctx context.Context, blockRange []*big.Int) ([][]byte, error) @@ -95,13 +93,13 @@ func (f *BlockHeaderFeeder) Run(ctx context.Context) error { return errors.Wrap(err, "fetching block number") } - fromBlock, toBlock := blockhashstore.GetSearchWindow(int(latestBlockNumber), f.waitBlocks, f.lookbackBlocks) + fromBlock, toBlock := blockhashstore.GetSearchWindow(int(latestBlockNumber), f.waitBlocks, f.lookbackBlocks) //nolint:gosec // G115 if toBlock == 0 { // Nothing to process, no blocks are in range. return nil } - lggr := f.lggr.With("latestBlock", latestBlockNumber, "fromBlock", fromBlock, "toBlock", toBlock) + lggr := logger.With(f.lggr, "latestBlock", latestBlockNumber, "fromBlock", fromBlock, "toBlock", toBlock) lggr.Debug("searching for unfulfilled blocks") blockToRequests, err := blockhashstore.GetUnfulfilledBlocksAndRequests(ctx, lggr, f.coordinator, fromBlock, toBlock) @@ -170,7 +168,7 @@ func (f *BlockHeaderFeeder) Run(ctx context.Context) error { if f.lastRunBlock != 0 { // Prune stored, anything older than fromBlock can be discarded - for block := f.lastRunBlock - uint64(f.lookbackBlocks); block < fromBlock; block++ { + for block := f.lastRunBlock - uint64(f.lookbackBlocks); block < fromBlock; block++ { //nolint:gosec // G115: lookbackBlocks is a small positive int if _, ok := f.stored[block]; ok { delete(f.stored, block) lggr.Debugw("Pruned block from stored cache", @@ -186,7 +184,7 @@ func (f *BlockHeaderFeeder) Run(ctx context.Context) error { } func (f *BlockHeaderFeeder) findLowestBlockNumberWithoutBlockhash(ctx context.Context, lggr logger.Logger, blockToRequests map[uint64]map[string]struct{}) *big.Int { - var min *big.Int + var minBlockNumber *big.Int for block, unfulfilledReqs := range blockToRequests { if len(unfulfilledReqs) == 0 { continue @@ -208,11 +206,11 @@ func (f *BlockHeaderFeeder) findLowestBlockNumberWithoutBlockhash(ctx context.Co continue } blockNumber := big.NewInt(0).SetUint64(block) - if min == nil || min.Cmp(blockNumber) >= 0 { - min = blockNumber + if minBlockNumber == nil || minBlockNumber.Cmp(blockNumber) >= 0 { + minBlockNumber = blockNumber } } - return min + return minBlockNumber } // findEarliestBlockNumberWithBlockhash searches [startBlock, toBlock) where startBlock is inclusive and toBlock is exclusive diff --git a/core/services/blockheaderfeeder/delegate.go b/core/services/blockheaderfeeder/delegate.go index de9273d2e74..36db484036f 100644 --- a/core/services/blockheaderfeeder/delegate.go +++ b/core/services/blockheaderfeeder/delegate.go @@ -5,12 +5,14 @@ import ( "encoding/json" stderrors "errors" "fmt" + "math" "slices" "time" "github.com/ethereum/go-ethereum/common" "github.com/pkg/errors" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-evm/gethwrappers/generated/batch_blockhash_store" "github.com/smartcontractkit/chainlink-evm/gethwrappers/generated/blockhash_store" @@ -19,7 +21,6 @@ import ( "github.com/smartcontractkit/chainlink-evm/pkg/chains/legacyevm" "github.com/smartcontractkit/chainlink-evm/pkg/keys" "github.com/smartcontractkit/chainlink/v2/core/config" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/blockhashstore" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/keystore" @@ -72,8 +73,7 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) ([]job.Servi cid := jb.BlockHeaderFeederSpec.EVMChainID.ToInt() chainService, err := d.legacyChains.Get(cid.String()) if err != nil { - return nil, fmt.Errorf( - "getting chain ID %s: %w", cid, err) + return nil, fmt.Errorf("getting chain ID %s: %w", cid, err) } chain, ok := chainService.(legacyevm.Chain) if !ok { @@ -84,10 +84,15 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) ([]job.Servi return nil, errors.New("log poller must be enabled to run blockheaderfeeder") } - if jb.BlockHeaderFeederSpec.LookbackBlocks < int32(chain.Config().EVM().FinalityDepth()) { + finalityDepth := chain.Config().EVM().FinalityDepth() + if finalityDepth > math.MaxInt32 { + return nil, fmt.Errorf("chain finality depth overflows int32: %d", finalityDepth) + } + if jb.BlockHeaderFeederSpec.LookbackBlocks < int32(finalityDepth) { return nil, fmt.Errorf( "lookbackBlocks must be greater than or equal to chain's finality depth (%d), currently %d", - chain.Config().EVM().FinalityDepth(), jb.BlockHeaderFeederSpec.LookbackBlocks) + finalityDepth, jb.BlockHeaderFeederSpec.LookbackBlocks, + ) } ks := keys.NewChainStore(keystore.NewEthSigner(d.ks, cid), cid) @@ -103,14 +108,12 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) ([]job.Servi } fromAddresses := jb.BlockHeaderFeederSpec.FromAddresses - bhs, err := blockhash_store.NewBlockhashStore( - jb.BlockHeaderFeederSpec.BlockhashStoreAddress.Address(), chain.Client()) + bhs, err := blockhash_store.NewBlockhashStore(jb.BlockHeaderFeederSpec.BlockhashStoreAddress.Address(), chain.Client()) if err != nil { return nil, errors.Wrap(err, "building BHS") } - batchBlockhashStore, err := batch_blockhash_store.NewBatchBlockhashStore( - jb.BlockHeaderFeederSpec.BatchBlockhashStoreAddress.Address(), chain.Client()) + batchBlockhashStore, err := batch_blockhash_store.NewBatchBlockhashStore(jb.BlockHeaderFeederSpec.BatchBlockhashStoreAddress.Address(), chain.Client()) if err != nil { return nil, errors.Wrap(err, "building batch BHS") } @@ -119,8 +122,7 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) ([]job.Servi var coordinators []blockhashstore.Coordinator if jb.BlockHeaderFeederSpec.CoordinatorV2Address != nil { var c *v2.VRFCoordinatorV2 - if c, err = v2.NewVRFCoordinatorV2( - jb.BlockHeaderFeederSpec.CoordinatorV2Address.Address(), chain.Client()); err != nil { + if c, err = v2.NewVRFCoordinatorV2(jb.BlockHeaderFeederSpec.CoordinatorV2Address.Address(), chain.Client()); err != nil { return nil, errors.Wrap(err, "building V2 coordinator") } var coord *blockhashstore.V2Coordinator @@ -132,8 +134,7 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) ([]job.Servi } if jb.BlockHeaderFeederSpec.CoordinatorV2PlusAddress != nil { var c v2plus.IVRFCoordinatorV2PlusInternalInterface - if c, err = v2plus.NewIVRFCoordinatorV2PlusInternal( - jb.BlockHeaderFeederSpec.CoordinatorV2PlusAddress.Address(), chain.Client()); err != nil { + if c, err = v2plus.NewIVRFCoordinatorV2PlusInternal(jb.BlockHeaderFeederSpec.CoordinatorV2PlusAddress.Address(), chain.Client()); err != nil { return nil, errors.Wrap(err, "building V2 plus coordinator") } var coord *blockhashstore.V2PlusCoordinator @@ -166,7 +167,7 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) ([]job.Servi return nil, errors.Wrap(err, "building batchBHS") } - log := d.logger.Named("BlockHeaderFeeder").With( + log := logger.With(logger.Named(d.logger, "BlockHeaderFeeder"), "jobID", jb.ID, "externalJobID", jb.ExternalJobID, "bhsAddress", bhs.Address(), @@ -188,7 +189,7 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) ([]job.Servi if err != nil { return 0, errors.Wrap(err, "getting chain head") } - return uint64(head.Number), nil + return uint64(head.Number), nil //nolint:gosec // G115 }, ks, jb.BlockHeaderFeederSpec.GetBlockhashesBatchSize, @@ -284,5 +285,5 @@ func CheckFromAddressesExist(jb job.Job, enabled []common.Address) (err error) { err = stderrors.Join(err, fmt.Errorf("address not enabled: %s", a.Hex())) } } - return + return err } diff --git a/core/services/ccv/ccvcommitteeverifier/delegate.go b/core/services/ccv/ccvcommitteeverifier/delegate.go index d1f17f16dd9..13c39aca7f9 100644 --- a/core/services/ccv/ccvcommitteeverifier/delegate.go +++ b/core/services/ccv/ccvcommitteeverifier/delegate.go @@ -19,10 +19,10 @@ import ( "github.com/smartcontractkit/chainlink-ccv/verifier/pkg/commit" "github.com/smartcontractkit/chainlink-common/keystore/corekeys" "github.com/smartcontractkit/chainlink-common/keystore/corekeys/ocr2key" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" commontypes "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink/v2/core/config" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/ccv/ccvcommon" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/keystore" @@ -44,7 +44,7 @@ type Delegate struct { func NewDelegate(lggr logger.Logger, ds sqlutil.DataSource, ccvConfig config.CCV, ocrKs keystore.OCR2, chainServices []commontypes.ChainService) *Delegate { return &Delegate{ - delegateLogger: lggr.Named("CCVCommitteeVerifierDelegate"), + delegateLogger: logger.Named(lggr, "CCVCommitteeVerifierDelegate"), lggr: lggr, ds: ds, ccvConfig: ccvConfig, @@ -83,7 +83,7 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, spec job.Job) (services } // Chains in the committee verifier configuration should dictate what we end up verifying for. - var chainsInConfig = make([]protocol.ChainSelector, 0, len(decodedCfg.CommitteeVerifierAddresses)) + chainsInConfig := make([]protocol.ChainSelector, 0, len(decodedCfg.CommitteeVerifierAddresses)) for chainSelStr := range decodedCfg.CommitteeVerifierAddresses { parsed, err2 := strconv.ParseUint(chainSelStr, 10, 64) if err2 != nil { @@ -144,9 +144,10 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, spec job.Job) (services } vc, err := constructors.NewVerificationCoordinator( - d.lggr. - Named("CCVCommitteeVerificationCoordinator"). - Named(decodedCfg.VerifierID), + logger.Named( + logger.Named(d.lggr, "CCVCommitteeVerificationCoordinator"), + decodedCfg.VerifierID, + ), decodedCfg, aggregatorSecrets, common.HexToAddress(decodedCfg.SignerAddress).Bytes(), diff --git a/core/services/ccv/ccvcommon/common.go b/core/services/ccv/ccvcommon/common.go index 229d0acd65e..c40c03d4a27 100644 --- a/core/services/ccv/ccvcommon/common.go +++ b/core/services/ccv/ccvcommon/common.go @@ -8,9 +8,9 @@ import ( chainselectors "github.com/smartcontractkit/chain-selectors" "github.com/smartcontractkit/chainlink-ccv/protocol" + "github.com/smartcontractkit/chainlink-common/pkg/logger" commontypes "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink-evm/pkg/chains/legacyevm" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) // GetLegacyChains maps the chain services of the node to the chain selectors in the job diff --git a/core/services/ccv/ccvcommon/missingchains.go b/core/services/ccv/ccvcommon/missingchains.go index 8af8e3c885f..ad0506ff645 100644 --- a/core/services/ccv/ccvcommon/missingchains.go +++ b/core/services/ccv/ccvcommon/missingchains.go @@ -12,8 +12,8 @@ import ( "github.com/smartcontractkit/chainlink-ccv/protocol" "github.com/smartcontractkit/chainlink-common/pkg/beholder" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) // DefaultMissingChainsReportInterval is the time between two reports of the same missing chain. @@ -45,7 +45,7 @@ func newMissingChainsMetrics() (*missingChainsMetrics, error) { // job. type MissingChainsMonitor struct { services.StateMachine - lggr logger.Logger + lggr logger.SugaredLogger name string metrics *missingChainsMetrics missing []protocol.ChainSelector @@ -74,7 +74,7 @@ func NewMissingChainsMonitor( return nil, err } return &MissingChainsMonitor{ - lggr: lggr.Named("MissingChainsMonitor"), + lggr: logger.Sugared(lggr).Named("MissingChainsMonitor"), name: name, metrics: m, missing: missing, diff --git a/core/services/ccv/ccvexecutor/delegate.go b/core/services/ccv/ccvexecutor/delegate.go index 1f6ded7f100..98e40f5f5de 100644 --- a/core/services/ccv/ccvexecutor/delegate.go +++ b/core/services/ccv/ccvexecutor/delegate.go @@ -14,10 +14,10 @@ import ( "github.com/smartcontractkit/chainlink-ccv/executor" "github.com/smartcontractkit/chainlink-ccv/integration/pkg/constructors" "github.com/smartcontractkit/chainlink-ccv/protocol" + "github.com/smartcontractkit/chainlink-common/pkg/logger" commontypes "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink-evm/pkg/keys" "github.com/smartcontractkit/chainlink/v2/core/config" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/ccv/ccvcommon" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/keystore" @@ -37,7 +37,7 @@ type Delegate struct { func NewDelegate(lggr logger.Logger, ccvConfig config.CCV, ethKs keystore.Eth, chainServices []commontypes.ChainService) *Delegate { return &Delegate{ - delegateLogger: lggr.Named("CCVExecutorDelegate"), + delegateLogger: logger.Named(lggr, "CCVExecutorDelegate"), lggr: lggr, ccvConfig: ccvConfig, chainServices: chainServices, @@ -73,7 +73,7 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, spec job.Job) (services } // Chains in the executor configuration should dictate what we end up verifying for. - var chainsInConfig = make([]protocol.ChainSelector, 0, len(decodedCfg.ChainConfiguration)) + chainsInConfig := make([]protocol.ChainSelector, 0, len(decodedCfg.ChainConfiguration)) for chainSelStr := range decodedCfg.ChainConfiguration { parsed, err2 := strconv.ParseUint(chainSelStr, 10, 64) if err2 != nil { @@ -87,8 +87,8 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, spec job.Job) (services return nil, fmt.Errorf("failed to get legacy chains: %w", err) } - var roundRobins = make(map[protocol.ChainSelector]keys.RoundRobin, len(legacyChains)) - var fromAddresses = make(map[protocol.ChainSelector][]common.Address, len(legacyChains)) + roundRobins := make(map[protocol.ChainSelector]keys.RoundRobin, len(legacyChains)) + fromAddresses := make(map[protocol.ChainSelector][]common.Address, len(legacyChains)) // A chain that the keystore cannot serve is unusable for the executor, because it cannot // transmit on it. Drop the chain and let the monitor report it, instead of stopping the job. @@ -149,9 +149,10 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, spec job.Job) (services // TODO: pass secrets as a separate param in the constructor. ec, err := constructors.NewExecutorCoordinator( - d.lggr. - Named("CCVExecutorCoordinator"). - Named(decodedCfg.ExecutorID), + logger.Named( + logger.Named(d.lggr, "CCVExecutorCoordinator"), + decodedCfg.ExecutorID, + ), decodedCfg, legacyChains, roundRobins, diff --git a/core/services/chainlink/application.go b/core/services/chainlink/application.go index e2c506700f4..efa992654a7 100644 --- a/core/services/chainlink/application.go +++ b/core/services/chainlink/application.go @@ -135,7 +135,7 @@ type Application interface { // ReplayFromBlock replays logs from on or after the given block number. If forceBroadcast (evm only) // is set to true, consumers will reprocess data even if it has already been processed. - ReplayFromBlock(ctx context.Context, chainFamily string, chainID string, number uint64, forceBroadcast bool) error + ReplayFromBlock(ctx context.Context, chainFamily, chainID string, number uint64, forceBroadcast bool) error // ID is unique to this particular application instance ID() uuid.UUID @@ -147,13 +147,13 @@ type Application interface { // DeleteLogPollerDataAfter - delete LogPoller state starting from the specified block DeleteLogPollerDataAfter(ctx context.Context, chainID *big.Int, start int64) error // LPSkipToBlock repositions the LogPoller to start processing from the given block number. - LPSkipToBlock(ctx context.Context, chainFamily string, chainID string, blockNumber int64) error + LPSkipToBlock(ctx context.Context, chainFamily, chainID string, blockNumber int64) error } -// ChainlinkApplication contains fields for the JobSubscriber, Scheduler, +// Node contains fields for the JobSubscriber, Scheduler, // and Store. The JobSubscriber and Scheduler are also available // in the services package, but the Store has its own package. -type ChainlinkApplication struct { +type Node struct { relayers *CoreRelayerChainInteroperators jobORM job.ORM jobSpawner job.Spawner @@ -185,6 +185,8 @@ type ChainlinkApplication struct { startStopMu sync.Mutex } +type ChainlinkApplication = Node //nolint:revive // alias needed for backward compatibility + type ApplicationOpts struct { // CREOpts is the options for the CRE services cre.Opts @@ -508,10 +510,10 @@ func NewApplication(ctx context.Context, opts ApplicationOpts) (Application, err var profiler *pyroscope.Profiler if cfg.Pyroscope().ServerAddress() != "" { globalLogger.Debug("Pyroscope (automatic pprof profiling) is enabled") - var err error - profiler, err = logger.StartPyroscope(cfg.Pyroscope(), cfg.AutoPprof()) - if err != nil { - return nil, errors.Wrap(err, "starting pyroscope (automatic pprof profiling) failed") + var err2 error + profiler, err2 = logger.StartPyroscope(cfg.Pyroscope(), cfg.AutoPprof()) + if err2 != nil { + return nil, errors.Wrap(err2, "starting pyroscope (automatic pprof profiling) failed") } if cfg.Pyroscope().LinkTracesToProfiles() && cfg.Tracing().Enabled() { @@ -544,9 +546,9 @@ func NewApplication(ctx context.Context, opts ApplicationOpts) (Application, err if backupCfg.Mode() != config.DatabaseBackupModeNone && backupCfg.Frequency() > 0 { globalLogger.Infow("DatabaseBackup: periodic database backups are enabled", "frequency", backupCfg.Frequency()) - databaseBackup, err := periodicbackup.NewDatabaseBackup(cfg.Database().URL(), cfg.RootDir(), backupCfg, globalLogger) - if err != nil { - return nil, errors.Wrap(err, "NewApplication: failed to initialize database backup") + databaseBackup, err2 := periodicbackup.NewDatabaseBackup(cfg.Database().URL(), cfg.RootDir(), backupCfg, globalLogger) + if err2 != nil { + return nil, errors.Wrap(err2, "NewApplication: failed to initialize database backup") } srvcs = append(srvcs, databaseBackup) } else { @@ -587,23 +589,23 @@ func NewApplication(ctx context.Context, opts ApplicationOpts) (Application, err switch sessions.AuthenticationProviderName(authMethod) { case sessions.LDAPAuth: - var err error - authenticationProvider, err = ldapauth.NewLDAPAuthenticator( + var err2 error + authenticationProvider, err2 = ldapauth.NewLDAPAuthenticator( opts.DS, cfg.WebServer().LDAP(), cfg.Insecure().DevWebServer(), globalLogger, auditLogger, ) - if err != nil { - return nil, errors.Wrap(err, "NewApplication: failed to initialize LDAP Authentication module") + if err2 != nil { + return nil, errors.Wrap(err2, "NewApplication: failed to initialize LDAP Authentication module") } syncer := ldapauth.NewLDAPServerStateSyncer(opts.DS, cfg.WebServer().LDAP(), globalLogger) srvcs = append(srvcs, syncer) sessionReaper = utils.NewSleeperTaskCtx(syncer) case sessions.OIDCAuth: - var err error - authenticationProvider, err = oidcauth.NewOIDCAuthenticator( + var err2 error + authenticationProvider, err2 = oidcauth.NewOIDCAuthenticator( opts.DS, cfg.WebServer().OIDC(), globalLogger, auditLogger, ) - if err != nil { - return nil, errors.Wrap(err, "NewApplication: failed to initialize OIDC Authentication module") + if err2 != nil { + return nil, errors.Wrap(err2, "NewApplication: failed to initialize OIDC Authentication module") } sessionReaper = oidcauth.NewSessionReaper(opts.DS, cfg.WebServer(), globalLogger) case sessions.LocalAuth: @@ -659,62 +661,64 @@ func NewApplication(ctx context.Context, opts ApplicationOpts) (Application, err loopRegistrarConfig := plugins.NewRegistrarConfig(opts.GRPCOpts, loopRegistry.Register, loopRegistry.Unregister) - var ( - delegates = map[job.Type]job.Delegate{ - job.DirectRequest: &job.DeprecatedDelegate{Type: job.DirectRequest}, - job.VRF: vrf.NewDelegate( - opts.DS, - keyStore, - pipelineRunner, - pipelineORM, - legacyEVMChains, - globalLogger, - mailMon), - job.Webhook: &job.DeprecatedDelegate{Type: job.Webhook}, - job.Cron: cron.NewDelegate( - pipelineRunner, - globalLogger), - job.BlockhashStore: blockhashstore.NewDelegate( - cfg, - globalLogger, - legacyEVMChains, - keyStore.Eth()), - job.BlockHeaderFeeder: blockheaderfeeder.NewDelegate( - cfg, - globalLogger, - legacyEVMChains, - keyStore.Eth()), - job.Gateway: gateway.NewDelegate( - legacyEVMChains, - keyStore.Eth(), - opts.DS, - opts.CapabilitiesRegistry, - creServices.WorkflowRegistrySyncer, - globalLogger, - limitsFactory, - creServices.OrgResolver, - ), - job.Stream: streams.NewDelegate( - globalLogger, - streamRegistry, - pipelineRunner, - cfg.JobPipeline(), - ), - job.CCVCommitteeVerifier: ccvcommitteeverifier.NewDelegate( - globalLogger, - opts.DS, - cfg.CCV(), - keyStore.OCR2(), - relayChainInterops.LegacyEVMChains().Slice(), - ), - job.CCVExecutor: ccvexecutor.NewDelegate( - globalLogger, - cfg.CCV(), - keyStore.Eth(), - relayChainInterops.LegacyEVMChains().Slice(), - ), - } - ) + delegates := map[job.Type]job.Delegate{ + job.DirectRequest: &job.DeprecatedDelegate{Type: job.DirectRequest}, + job.VRF: vrf.NewDelegate( + opts.DS, + keyStore, + pipelineRunner, + pipelineORM, + legacyEVMChains, + globalLogger, + mailMon, + ), + job.Webhook: &job.DeprecatedDelegate{Type: job.Webhook}, + job.Cron: cron.NewDelegate( + pipelineRunner, + globalLogger, + ), + job.BlockhashStore: blockhashstore.NewDelegate( + cfg, + globalLogger, + legacyEVMChains, + keyStore.Eth(), + ), + job.BlockHeaderFeeder: blockheaderfeeder.NewDelegate( + cfg, + globalLogger, + legacyEVMChains, + keyStore.Eth(), + ), + job.Gateway: gateway.NewDelegate( + legacyEVMChains, + keyStore.Eth(), + opts.DS, + opts.CapabilitiesRegistry, + creServices.WorkflowRegistrySyncer, + globalLogger, + limitsFactory, + creServices.OrgResolver, + ), + job.Stream: streams.NewDelegate( + globalLogger, + streamRegistry, + pipelineRunner, + cfg.JobPipeline(), + ), + job.CCVCommitteeVerifier: ccvcommitteeverifier.NewDelegate( + globalLogger, + opts.DS, + cfg.CCV(), + keyStore.OCR2(), + relayChainInterops.LegacyEVMChains().Slice(), + ), + job.CCVExecutor: ccvexecutor.NewDelegate( + globalLogger, + cfg.CCV(), + keyStore.Eth(), + relayChainInterops.LegacyEVMChains().Slice(), + ), + } // Workflow job type has been removed; use a deprecated delegate so existing jobs // surface a visible error in the UI rather than silently doing nothing. @@ -935,7 +939,7 @@ func NewApplication(ctx context.Context, opts ApplicationOpts) (Application, err } } - return &ChainlinkApplication{ + return &Node{ relayers: relayChainInterops, jobORM: jobORM, jobSpawner: jobSpawner, @@ -965,7 +969,7 @@ func NewApplication(ctx context.Context, opts ApplicationOpts) (Application, err }, nil } -func (app *ChainlinkApplication) SetLogLevel(lvl zapcore.Level) error { +func (app *Node) SetLogLevel(lvl zapcore.Level) error { if err := app.Config.SetLogLevel(lvl); err != nil { return err } @@ -975,7 +979,7 @@ func (app *ChainlinkApplication) SetLogLevel(lvl zapcore.Level) error { // Start all necessary services. If successful, nil will be returned. // Start sequence is aborted if the context gets cancelled. -func (app *ChainlinkApplication) Start(ctx context.Context) error { +func (app *Node) Start(ctx context.Context) error { app.startStopMu.Lock() defer app.startStopMu.Unlock() if app.started { @@ -1022,7 +1026,7 @@ func (app *ChainlinkApplication) Start(ctx context.Context) error { return nil } -func (app *ChainlinkApplication) StopIfStarted() error { +func (app *Node) StopIfStarted() error { app.startStopMu.Lock() defer app.startStopMu.Unlock() if app.started { @@ -1031,23 +1035,23 @@ func (app *ChainlinkApplication) StopIfStarted() error { return nil } -func (app *ChainlinkApplication) GetLoopRegistry() *plugins.LoopRegistry { +func (app *Node) GetLoopRegistry() *plugins.LoopRegistry { return app.loopRegistry } -func (app *ChainlinkApplication) GetLoopRegistrarConfig() plugins.RegistrarConfig { +func (app *Node) GetLoopRegistrarConfig() plugins.RegistrarConfig { return app.loopRegistrarConfig } // Stop allows the application to exit by halting schedules, closing // logs, and closing the DB connection. -func (app *ChainlinkApplication) Stop() error { +func (app *Node) Stop() error { app.startStopMu.Lock() defer app.startStopMu.Unlock() return app.stop() } -func (app *ChainlinkApplication) stop() (err error) { +func (app *Node) stop() (err error) { if !app.started { panic("application is already stopped") } @@ -1089,72 +1093,72 @@ func (app *ChainlinkApplication) stop() (err error) { return err } -func (app *ChainlinkApplication) GetConfig() GeneralConfig { +func (app *Node) GetConfig() GeneralConfig { return app.Config } -func (app *ChainlinkApplication) GetKeyStore() keystore.Master { +func (app *Node) GetKeyStore() keystore.Master { return app.KeyStore } -func (app *ChainlinkApplication) GetLogger() logger.SugaredLogger { +func (app *Node) GetLogger() logger.SugaredLogger { return app.logger } -func (app *ChainlinkApplication) GetAuditLogger() audit.AuditLogger { +func (app *Node) GetAuditLogger() audit.AuditLogger { return app.AuditLogger } -func (app *ChainlinkApplication) GetHealthChecker() services.Checker { +func (app *Node) GetHealthChecker() services.Checker { return app.HealthChecker } -func (app *ChainlinkApplication) JobSpawner() job.Spawner { +func (app *Node) JobSpawner() job.Spawner { return app.jobSpawner } -func (app *ChainlinkApplication) JobORM() job.ORM { +func (app *Node) JobORM() job.ORM { return app.jobORM } -func (app *ChainlinkApplication) BridgeORM() bridges.ORM { +func (app *Node) BridgeORM() bridges.ORM { return app.bridgeORM } -func (app *ChainlinkApplication) BasicAdminUsersORM() sessions.BasicAdminUsersORM { +func (app *Node) BasicAdminUsersORM() sessions.BasicAdminUsersORM { return app.localAdminUsersORM } -func (app *ChainlinkApplication) AuthenticationProvider() sessions.AuthenticationProvider { +func (app *Node) AuthenticationProvider() sessions.AuthenticationProvider { return app.authenticationProvider } -func (app *ChainlinkApplication) PipelineORM() pipeline.ORM { +func (app *Node) PipelineORM() pipeline.ORM { return app.pipelineORM } -func (app *ChainlinkApplication) TxmStorageService() txmgr.EvmTxStore { +func (app *Node) TxmStorageService() txmgr.EvmTxStore { return app.txmStorageService } -func (app *ChainlinkApplication) GetCapabilitiesRegistry() *registry.Registry { +func (app *Node) GetCapabilitiesRegistry() *registry.Registry { return app.capabilitiesRegistry } -func (app *ChainlinkApplication) SecretGenerator() SecretGenerator { +func (app *Node) SecretGenerator() SecretGenerator { return app.secretGenerator } // WakeSessionReaper wakes up the reaper to do its reaping. -func (app *ChainlinkApplication) WakeSessionReaper() { +func (app *Node) WakeSessionReaper() { app.SessionReaper.WakeUp() } -func (app *ChainlinkApplication) AddJobV2(ctx context.Context, j *job.Job) error { +func (app *Node) AddJobV2(ctx context.Context, j *job.Job) error { return app.jobSpawner.CreateJob(ctx, nil, j) } -func (app *ChainlinkApplication) DeleteJob(ctx context.Context, jobID int32) error { +func (app *Node) DeleteJob(ctx context.Context, jobID int32) error { // Do not allow the job to be deleted if it is managed by the Feeds Manager isManaged, err := app.FeedsService.IsJobManaged(ctx, int64(jobID)) if err != nil { @@ -1169,7 +1173,7 @@ func (app *ChainlinkApplication) DeleteJob(ctx context.Context, jobID int32) err } // Only used for local testing, not supported by the UI. -func (app *ChainlinkApplication) RunJobV2( +func (app *Node) RunJobV2( ctx context.Context, jobID int32, meta map[string]any, @@ -1234,7 +1238,7 @@ func (app *ChainlinkApplication) RunJobV2( return runID, err } -func (app *ChainlinkApplication) ResumeJobV2( +func (app *Node) ResumeJobV2( ctx context.Context, taskID uuid.UUID, result pipeline.Result, @@ -1242,12 +1246,12 @@ func (app *ChainlinkApplication) ResumeJobV2( return app.pipelineRunner.ResumeRun(ctx, taskID, result.Value, result.Error) } -func (app *ChainlinkApplication) GetFeedsService() feeds.Service { +func (app *Node) GetFeedsService() feeds.Service { return app.FeedsService } // ReplayFromBlock implements the Application interface. -func (app *ChainlinkApplication) ReplayFromBlock(ctx context.Context, chainFamily string, chainID string, number uint64, forceBroadcast bool) error { +func (app *Node) ReplayFromBlock(ctx context.Context, chainFamily, chainID string, number uint64, forceBroadcast bool) error { if chainFamily == relay.NetworkEVM { // TODO: Implement EVM Replay on Relayer instead of using LegacyChains - BCFR-1160 chain, err := app.GetRelayers().LegacyEVMChains().Get(chainID) @@ -1276,17 +1280,17 @@ func (app *ChainlinkApplication) ReplayFromBlock(ctx context.Context, chainFamil return relayer.Replay(ctx, strconv.FormatUint(number, 10), map[string]any{}) } -func (app *ChainlinkApplication) GetRelayers() RelayerChainInteroperators { +func (app *Node) GetRelayers() RelayerChainInteroperators { return app.relayers } -func (app *ChainlinkApplication) GetDB() sqlutil.DataSource { +func (app *Node) GetDB() sqlutil.DataSource { return app.ds } // Returns the configuration to use for creating and authenticating // new WebAuthn credentials -func (app *ChainlinkApplication) GetWebAuthnConfiguration() sessions.WebAuthnConfiguration { +func (app *Node) GetWebAuthnConfiguration() sessions.WebAuthnConfiguration { rpid := app.Config.WebServer().MFA().RPID() rporigin := app.Config.WebServer().MFA().RPOrigin() if rpid == "" { @@ -1303,14 +1307,14 @@ func (app *ChainlinkApplication) GetWebAuthnConfiguration() sessions.WebAuthnCon } } -func (app *ChainlinkApplication) ID() uuid.UUID { +func (app *Node) ID() uuid.UUID { return app.Config.AppID() } var ErrUnsupportedInLOOPPMode = fmt.Errorf("legacy command not available in LOOP Plugin mode: %w", stderrors.ErrUnsupported) // FindLCA - finds last common ancestor -func (app *ChainlinkApplication) FindLCA(ctx context.Context, chainID *big.Int) (*logpoller.Block, error) { +func (app *Node) FindLCA(ctx context.Context, chainID *big.Int) (*logpoller.Block, error) { chain, err := app.GetRelayers().LegacyEVMChains().Get(chainID.String()) if err != nil { return nil, err @@ -1333,7 +1337,7 @@ func (app *ChainlinkApplication) FindLCA(ctx context.Context, chainID *big.Int) } // LPSkipToBlock repositions the LogPoller to start processing from the given block number. -func (app *ChainlinkApplication) LPSkipToBlock(ctx context.Context, chainFamily string, chainID string, blockNumber int64) error { +func (app *Node) LPSkipToBlock(ctx context.Context, chainFamily, chainID string, blockNumber int64) error { if chainFamily != relay.NetworkEVM { return fmt.Errorf("LPSkipToBlock is only supported for %s chain family", relay.NetworkEVM) } @@ -1363,7 +1367,7 @@ func (app *ChainlinkApplication) LPSkipToBlock(ctx context.Context, chainFamily } // DeleteLogPollerDataAfter - delete LogPoller state starting from the specified block -func (app *ChainlinkApplication) DeleteLogPollerDataAfter(ctx context.Context, chainID *big.Int, start int64) error { +func (app *Node) DeleteLogPollerDataAfter(ctx context.Context, chainID *big.Int, start int64) error { chain, err := app.GetRelayers().LegacyEVMChains().Get(chainID.String()) if err != nil { return err diff --git a/core/services/chainlink/config.go b/core/services/chainlink/config.go index 6ace8b45509..65b38caa809 100644 --- a/core/services/chainlink/config.go +++ b/core/services/chainlink/config.go @@ -97,7 +97,7 @@ func (rs RawConfigs) validateKeys() (err error) { } } } - return + return err } func (rs RawConfigs) ValidateConfig() (err error) { @@ -251,7 +251,7 @@ func (c *RawConfig) SetFrom(config RawConfig) error { func (c RawConfig) NodeNames() []string { nodes, _ := c["Nodes"].([]any) - nodeNames := []string{} + nodeNames := make([]string, 0, len(nodes)) for _, node := range nodes { config, _ := node.(map[string]any) nodeName, _ := config["Name"].(string) @@ -295,7 +295,7 @@ func (c *Config) valueWarnings() (err error) { } } } - return + return err } // deprecationWarnings returns an error if the Config contains deprecated fields. @@ -504,9 +504,9 @@ func (s *Secrets) setEnv() error { return err } } - if dbBackupUrl := env.DatabaseBackupURL.Get(); dbBackupUrl != "" { + if dbBackupURL := env.DatabaseBackupURL.Get(); dbBackupURL != "" { s.Database.BackupURL = new(models.SecretURL) - if err := s.Database.BackupURL.UnmarshalText([]byte(dbBackupUrl)); err != nil { + if err := s.Database.BackupURL.UnmarshalText([]byte(dbBackupURL)); err != nil { return err } } diff --git a/core/services/chainlink/config_audit_logger.go b/core/services/chainlink/config_audit_logger.go index 5d8c00f771d..8843468264d 100644 --- a/core/services/chainlink/config_audit_logger.go +++ b/core/services/chainlink/config_audit_logger.go @@ -15,7 +15,7 @@ func (a auditLoggerConfig) Enabled() bool { return *a.c.Enabled } -func (a auditLoggerConfig) ForwardToUrl() (commonconfig.URL, error) { +func (a auditLoggerConfig) ForwardToUrl() (commonconfig.URL, error) { //nolint:revive // method name required by core/config.AuditLogger interface return *a.c.ForwardToUrl, nil } @@ -26,7 +26,7 @@ func (a auditLoggerConfig) Environment() string { return "production" } -func (a auditLoggerConfig) JsonWrapperKey() string { +func (a auditLoggerConfig) JsonWrapperKey() string { //nolint:revive // method name required by core/config.AuditLogger interface return *a.c.JsonWrapperKey } diff --git a/core/services/chainlink/config_audit_logger_test.go b/core/services/chainlink/config_audit_logger_test.go index 482968a14bc..91e5dced5c0 100644 --- a/core/services/chainlink/config_audit_logger_test.go +++ b/core/services/chainlink/config_audit_logger_test.go @@ -18,10 +18,10 @@ func TestAuditLoggerConfig(t *testing.T) { require.True(t, auditConfig.Enabled()) require.Equal(t, "event", auditConfig.JsonWrapperKey()) - fUrl, err := auditConfig.ForwardToUrl() + fURL, err := auditConfig.ForwardToUrl() require.NoError(t, err) - require.Equal(t, "http", fUrl.Scheme) - require.Equal(t, "localhost:9898", fUrl.Host) + require.Equal(t, "http", fURL.Scheme) + require.Equal(t, "localhost:9898", fURL.Host) headers, err := auditConfig.Headers() require.NoError(t, err) diff --git a/core/services/chainlink/config_general.go b/core/services/chainlink/config_general.go index 9f6ab5c8978..824519aa3b3 100644 --- a/core/services/chainlink/config_general.go +++ b/core/services/chainlink/config_general.go @@ -61,7 +61,7 @@ type GeneralConfigOpts struct { SkipEnv bool } -func (o *GeneralConfigOpts) Setup(configFiles []string, secretsFiles []string) error { +func (o *GeneralConfigOpts) Setup(configFiles, secretsFiles []string) error { configs := []string{} for _, fileName := range configFiles { b, err := os.ReadFile(fileName) @@ -172,21 +172,19 @@ func (o GeneralConfigOpts) New() (GeneralConfig, error) { func (o *GeneralConfigOpts) parse() (err error) { for _, c := range o.ConfigStrings { - err := o.parseConfig(c) - if err != nil { + if err = o.parseConfig(c); err != nil { return err } } for _, s := range o.SecretsStrings { - err := o.parseSecrets(s) - if err != nil { + if err = o.parseSecrets(s); err != nil { return err } } o.Secrets.setDefaults() - return + return err } func (g *generalConfig) EVMConfigs() evmcfg.EVMConfigs { @@ -268,7 +266,7 @@ func validateEnv() (err error) { err = stderrors.Join(err, fmt.Errorf("environment variable %s must not be set: %w", k, v2.ErrUnsupported)) } } - return + return err } func (g *generalConfig) LogConfiguration(log, warn coreconfig.LogfFn) { @@ -570,6 +568,7 @@ func (g *generalConfig) ImportedP2PKey() coreconfig.ImportableKey { func (g *generalConfig) Tracing() coreconfig.Tracing { return &tracingConfig{s: g.c.Tracing} } + func (g *generalConfig) Telemetry() coreconfig.Telemetry { return &telemetryConfig{s: g.c.Telemetry} } @@ -601,6 +600,7 @@ func (g *generalConfig) JobSpecReporter() coreconfig.JobSpecReporter { func (g *generalConfig) Sharding() coreconfig.Sharding { return &shardingConfig{s: g.c.Sharding} } + func (g *generalConfig) LOOPP() coreconfig.LOOPP { return &looppConfig{l: g.c.LOOPP} } diff --git a/core/services/chainlink/config_general_dev_test.go b/core/services/chainlink/config_general_dev_test.go index 7baa26529fa..75ebf5bfac1 100644 --- a/core/services/chainlink/config_general_dev_test.go +++ b/core/services/chainlink/config_general_dev_test.go @@ -32,7 +32,8 @@ func TestTOMLGeneralConfig_DevModeInsecureConfig(t *testing.T) { *c.Insecure.DisableRateLimiting = true *c.Insecure.InfiniteDepthQueries = true *c.Insecure.OCRDevelopmentMode = true - }}.New() + }, + }.New() require.NoError(t, err) assert.True(t, config.Insecure().DevWebServer()) @@ -43,7 +44,8 @@ func TestTOMLGeneralConfig_DevModeInsecureConfig(t *testing.T) { t.Run("ParseConfig accepts insecure values on dev builds", func(t *testing.T) { opts := GeneralConfigOpts{ - ConfigStrings: []string{` + ConfigStrings: []string{ + ` [insecure] DevWebServer = true `, diff --git a/core/services/chainlink/config_general_test.go b/core/services/chainlink/config_general_test.go index 20fbe8b6f3c..4a77968e227 100644 --- a/core/services/chainlink/config_general_test.go +++ b/core/services/chainlink/config_general_test.go @@ -15,6 +15,7 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-common/pkg/config" + "github.com/smartcontractkit/chainlink/v2/core/config/env" "github.com/smartcontractkit/chainlink/v2/core/config/toml" ) @@ -52,7 +53,8 @@ func TestTOMLGeneralConfig_InsecureConfig(t *testing.T) { *c.Insecure.DisableRateLimiting = true *c.Insecure.InfiniteDepthQueries = true *c.AuditLogger.Enabled = true - }}.New() + }, + }.New() require.NoError(t, err) // Just asserting that override logic work on a safe config @@ -199,11 +201,11 @@ func TestConfig_SecretsMerging(t *testing.T) { assert.Equal(t, databaseSecrets.Database.URL.URL().String(), opts.Secrets.Database.URL.URL().String()) assert.Equal(t, databaseSecrets.Database.BackupURL.URL().String(), opts.Secrets.Database.BackupURL.URL().String()) - assert.Equal(t, (string)(*passwordSecrets.Password.Keystore), (string)(*opts.Password.Keystore)) - assert.Equal(t, (string)(*passwordSecrets.Password.VRF), (string)(*opts.Password.VRF)) - assert.Equal(t, (string)(*pyroscopeSecrets.Pyroscope.AuthToken), (string)(*opts.Secrets.Pyroscope.AuthToken)) - assert.Equal(t, (string)(*prometheusSecrets.Prometheus.AuthToken), (string)(*opts.Prometheus.AuthToken)) - assert.Equal(t, (string)(*thresholdSecrets.Threshold.ThresholdKeyShare), (string)(*opts.Threshold.ThresholdKeyShare)) + assert.Equal(t, string(*passwordSecrets.Password.Keystore), string(*opts.Password.Keystore)) + assert.Equal(t, string(*passwordSecrets.Password.VRF), string(*opts.Password.VRF)) + assert.Equal(t, string(*pyroscopeSecrets.Pyroscope.AuthToken), string(*opts.Secrets.Pyroscope.AuthToken)) + assert.Equal(t, string(*prometheusSecrets.Prometheus.AuthToken), string(*opts.Prometheus.AuthToken)) + assert.Equal(t, string(*thresholdSecrets.Threshold.ThresholdKeyShare), string(*opts.Threshold.ThresholdKeyShare)) assert.Equal(t, webserverLDAPSecrets.WebServer.LDAP.ServerAddress.URL().String(), opts.Secrets.WebServer.LDAP.ServerAddress.URL().String()) assert.Equal(t, webserverLDAPSecrets.WebServer.LDAP.ReadOnlyUserLogin, opts.Secrets.WebServer.LDAP.ReadOnlyUserLogin) @@ -225,7 +227,7 @@ func parseSecrets(secrets string) (*Secrets, error) { return &s, nil } -func assertDeepEqualityMercurySecrets(expected toml.MercurySecrets, actual toml.MercurySecrets) error { +func assertDeepEqualityMercurySecrets(expected, actual toml.MercurySecrets) error { if len(expected.Credentials) != len(actual.Credentials) { return fmt.Errorf("maps are not equal in length: len(expected): %d, len(actual): %d", len(expected.Credentials), len(actual.Credentials)) } @@ -233,10 +235,10 @@ func assertDeepEqualityMercurySecrets(expected toml.MercurySecrets, actual toml. for key, value := range expected.Credentials { equal := true actualValue := actual.Credentials[key] - if (string)(*value.Username) != (string)(*actualValue.Username) { + if string(*value.Username) != string(*actualValue.Username) { equal = false } - if (string)(*value.Password) != (string)(*actualValue.Password) { + if string(*value.Password) != string(*actualValue.Password) { equal = false } if value.URL.URL().String() != actualValue.URL.URL().String() { @@ -244,14 +246,14 @@ func assertDeepEqualityMercurySecrets(expected toml.MercurySecrets, actual toml. } if !equal { return fmt.Errorf("maps are not equal: expected[%s] = {%s, %s, %s}, actual[%s] = {%s, %s, %s}", - key, (string)(*value.Username), (string)(*value.Password), value.URL.URL().String(), - key, (string)(*actualValue.Username), (string)(*actualValue.Password), actualValue.URL.URL().String()) + key, string(*value.Username), string(*value.Password), value.URL.URL().String(), + key, string(*actualValue.Username), string(*actualValue.Password), actualValue.URL.URL().String()) } } return nil } -func merge(map1 toml.MercurySecrets, map2 toml.MercurySecrets) *toml.MercurySecrets { +func merge(map1, map2 toml.MercurySecrets) *toml.MercurySecrets { combinedMap := make(map[string]toml.MercuryCredentials) maps.Copy(combinedMap, map1.Credentials) maps.Copy(combinedMap, map2.Credentials) diff --git a/core/services/chainlink/config_job_pipeline.go b/core/services/chainlink/config_job_pipeline.go index 8d9858d2a44..0d10f444c98 100644 --- a/core/services/chainlink/config_job_pipeline.go +++ b/core/services/chainlink/config_job_pipeline.go @@ -15,7 +15,7 @@ type jobPipelineConfig struct { } func (j *jobPipelineConfig) DefaultHTTPLimit() int64 { - return int64(*j.c.HTTPRequest.MaxSize) + return int64(*j.c.HTTPRequest.MaxSize) //nolint:gosec // G115: HTTP request size limit is far below math.MaxInt64 } func (j *jobPipelineConfig) DefaultHTTPTimeout() commonconfig.Duration { diff --git a/core/services/chainlink/config_ocr2.go b/core/services/chainlink/config_ocr2.go index fdc7bb32b06..b4a42ed84d8 100644 --- a/core/services/chainlink/config_ocr2.go +++ b/core/services/chainlink/config_ocr2.go @@ -18,7 +18,7 @@ func (o *ocr2Config) Enabled() bool { } func (o *ocr2Config) ContractConfirmations() uint16 { - return uint16(*o.c.ContractConfirmations) + return uint16(*o.c.ContractConfirmations) //nolint:gosec // G115: confirmation count is far below math.MaxUint16 } func (o *ocr2Config) ContractTransmitterTransmitTimeout() time.Duration { diff --git a/core/services/chainlink/config_telemetry_ingress.go b/core/services/chainlink/config_telemetry_ingress.go index 06a1cc7758e..21c50d967a0 100644 --- a/core/services/chainlink/config_telemetry_ingress.go +++ b/core/services/chainlink/config_telemetry_ingress.go @@ -47,7 +47,7 @@ func (t *telemetryIngressConfig) UseBatchSend() bool { } func (t *telemetryIngressConfig) Endpoints() []config.TelemetryIngressEndpoint { - var endpoints []config.TelemetryIngressEndpoint + endpoints := make([]config.TelemetryIngressEndpoint, 0, len(t.c.Endpoints)) for _, e := range t.c.Endpoints { endpoints = append(endpoints, &telemetryIngressEndpointConfig{ c: e, diff --git a/core/services/chainlink/config_test.go b/core/services/chainlink/config_test.go index f2e1b329187..125855c7f83 100644 --- a/core/services/chainlink/config_test.go +++ b/core/services/chainlink/config_test.go @@ -699,11 +699,11 @@ func TestConfig_Marshal(t *testing.T) { PriceMin: assets.NewWeiI(13), LimitJobType: evmcfg.GasLimitJobType{ - OCR: new(uint32(1001)), - DR: new(uint32(1002)), - VRF: new(uint32(1003)), - FM: new(uint32(1004)), - OCR2: new(uint32(1006)), + OCR: new(uint32(1001)), + DR: new(uint32(1002)), + VRF: new(uint32(1003)), + FM: new(uint32(1004)), + OCR2: new(uint32(1006)), }, BlockHistory: evmcfg.BlockHistoryEstimator{ @@ -1437,7 +1437,7 @@ func TestConfig_Validate(t *testing.T) { - Nodes: 2 errors: - 0.HTTPURL: missing: required for all nodes - 1.HTTPURL: missing: required for all nodes - - 1: 10 errors: + - 1: 9 errors: - ChainType: invalid value (Foo): must not be set with this chain id - Nodes: missing: must have at least one node - ChainType: invalid value (Foo): must be one of arbitrum, astar, celo, gnosis, hedera, kroma, mantle, metis, optimismBedrock, sei, scroll, wemix, xlayer, zkevm, zksync, zircuit, tron, rootstock, pharos, jovay or omitted @@ -1449,7 +1449,6 @@ func TestConfig_Validate(t *testing.T) { - FeeCapDefault: invalid value (101 wei): must be equal to PriceMax (99 wei) since you are using FixedPrice estimation with gas bumping disabled in EIP1559 mode - PriceMax will be used as the FeeCap for transactions instead of FeeCapDefault - PriceMax: invalid value (1 gwei): must be greater than or equal to PriceDefault - HeadTracker.MaxAllowedFinalityDepth: invalid value (0): must be greater than or equal to 1 - - KeySpecific.Key: invalid value (0xde709f2102306220921060314715629080e2fb77): duplicate - must be unique - 2: 5 errors: - ChainType: invalid value (Arbitrum): only "optimismBedrock" can be used with this chain id - Nodes: missing: must have at least one node @@ -1633,7 +1632,7 @@ func TestNewGeneralConfig_ParsingError_InvalidSyntax(t *testing.T) { SecretsStrings: []string{secretsFullTOML}, } _, err := opts.New() - assert.EqualError(t, err, "failed to decode config TOML: toml: invalid character at start of key: U+007B '{'") + assert.ErrorContains(t, err, "failed to decode config TOML: toml: invalid character at start of key:") } func TestNewGeneralConfig_ParsingError_DuplicateField(t *testing.T) { diff --git a/core/services/chainlink/config_tracing_test.go b/core/services/chainlink/config_tracing_test.go index 37653729cf3..f0bf4290907 100644 --- a/core/services/chainlink/config_tracing_test.go +++ b/core/services/chainlink/config_tracing_test.go @@ -31,7 +31,7 @@ func TestTracing_Config(t *testing.T) { assert.True(t, tConfig.Enabled()) assert.Equal(t, "http://localhost:9000", tConfig.CollectorTarget()) assert.Equal(t, "Node1", tConfig.NodeID()) - assert.Equal(t, 0.5, tConfig.SamplingRatio()) + assert.InEpsilon(t, 0.5, tConfig.SamplingRatio(), 1e-9) assert.Equal(t, "tls", tConfig.Mode()) assert.Equal(t, "/path/to/cert.pem", tConfig.TLSCertPath()) assert.Equal(t, map[string]string{"key": "value"}, tConfig.Attributes()) diff --git a/core/services/chainlink/config_web_server.go b/core/services/chainlink/config_web_server.go index e2ad52801bc..ad081365708 100644 --- a/core/services/chainlink/config_web_server.go +++ b/core/services/chainlink/config_web_server.go @@ -142,7 +142,7 @@ func (w *webServerConfig) BridgeCacheTTL() time.Duration { } func (w *webServerConfig) HTTPMaxSize() int64 { - return int64(*w.c.HTTPMaxSize) + return int64(*w.c.HTTPMaxSize) //nolint:gosec // G115: HTTP request size limit is far below math.MaxInt64 } func (w *webServerConfig) StartTimeout() time.Duration { @@ -297,7 +297,7 @@ func (l *ldapConfig) ReadUserGroupCN() string { return *l.c.ReadUserGroupCN } -func (l *ldapConfig) UserApiTokenEnabled() bool { +func (l *ldapConfig) UserApiTokenEnabled() bool { //nolint:revive // method name required by core/config.LDAP interface if l.c.UserApiTokenEnabled == nil { return false } diff --git a/core/services/chainlink/heartbeat.go b/core/services/chainlink/heartbeat.go index 65cd2119c5b..2e666cc13bb 100644 --- a/core/services/chainlink/heartbeat.go +++ b/core/services/chainlink/heartbeat.go @@ -9,9 +9,9 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/beholder" "github.com/smartcontractkit/chainlink-common/pkg/custmsg" + "github.com/smartcontractkit/chainlink-common/pkg/logger" commonservices "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-common/pkg/timeutil" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/static" ) diff --git a/core/services/chainlink/mocks/relayer_chain_interoperators.go b/core/services/chainlink/mocks/relayer_chain_interoperators.go index ced41a93ab8..b5150ad2d5e 100644 --- a/core/services/chainlink/mocks/relayer_chain_interoperators.go +++ b/core/services/chainlink/mocks/relayer_chain_interoperators.go @@ -49,7 +49,7 @@ func (f *FakeRelayerChainInteroperators) GetIDToRelayerMap() map[types.RelayID]l } func (f *FakeRelayerChainInteroperators) Slice() []loop.Relayer { - var relayers []loop.Relayer + relayers := make([]loop.Relayer, 0, len(f.Relayers)) for _, value := range f.Relayers { relayers = append(relayers, value) diff --git a/core/services/chainlink/node_platform.go b/core/services/chainlink/node_platform.go index 40fa8f4c28b..475e051b805 100644 --- a/core/services/chainlink/node_platform.go +++ b/core/services/chainlink/node_platform.go @@ -18,11 +18,11 @@ import ( chainsel "github.com/smartcontractkit/chain-selectors" "github.com/smartcontractkit/chainlink-common/pkg/beholder" + "github.com/smartcontractkit/chainlink-common/pkg/logger" commonservices "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-common/pkg/timeutil" commontypes "github.com/smartcontractkit/chainlink-common/pkg/types" commonv1 "github.com/smartcontractkit/chainlink-protos/node-platform/common/v1" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/keystore" "github.com/smartcontractkit/chainlink/v2/core/services/pipeline" diff --git a/core/services/chainlink/relayer_chain_interoperators.go b/core/services/chainlink/relayer_chain_interoperators.go index 489a25b265d..8554e612103 100644 --- a/core/services/chainlink/relayer_chain_interoperators.go +++ b/core/services/chainlink/relayer_chain_interoperators.go @@ -58,6 +58,7 @@ type NetworkChainStatus struct { types.ChainStatus } +// ChainStatusReader is an interface for reading chain statuses. type ChainStatusReader interface { ChainStatus(ctx context.Context, id types.RelayID) (types.ChainStatus, error) ChainStatuses(ctx context.Context, offset, limit int) ([]NetworkChainStatus, int, error) @@ -69,7 +70,7 @@ type NodeStatusReader interface { NodeStatuses(ctx context.Context, offset, limit int, relayIDs ...types.RelayID) (nodes []types.NodeStatus, count int, err error) } -// StatusReader report statuses about chains and nodes +// StatusReader reports statuses about chains and nodes type StatusReader interface { ChainStatusReader NodeStatusReader @@ -297,6 +298,7 @@ func (rs *CoreRelayerChainInteroperators) GetIDToRelayerMap() map[types.RelayID] // LegacyEVMChains returns a container with all the evm chains // TODO BCF-2511 +// // Deprecated: use the Relayer interface func (rs *CoreRelayerChainInteroperators) LegacyEVMChains() legacyevm.LegacyChainContainer { rs.mu.Lock() @@ -322,14 +324,14 @@ func (rs *CoreRelayerChainInteroperators) ChainStatuses(ctx context.Context, off rs.mu.Lock() defer rs.mu.Unlock() - relayerIds := make([]types.RelayID, 0) + relayerIDs := make([]types.RelayID, 0, len(rs.loopRelayers)) for rid := range rs.loopRelayers { - relayerIds = append(relayerIds, rid) + relayerIDs = append(relayerIDs, rid) } - sort.Slice(relayerIds, func(i, j int) bool { - return relayerIds[i].String() < relayerIds[j].String() + sort.Slice(relayerIDs, func(i, j int) bool { + return relayerIDs[i].String() < relayerIDs[j].String() }) - for _, rid := range relayerIds { + for _, rid := range relayerIDs { lr := rs.loopRelayers[rid] stat, err := lr.GetChainStatus(ctx) if err != nil { @@ -383,7 +385,7 @@ func (rs *CoreRelayerChainInteroperators) NodeStatuses(ctx context.Context, offs }) for _, key := range keys { lr := relayers[key] - stats, _, total, err := lr.ListNodeStatuses(ctx, int32(limit), "") + stats, _, total, err := lr.ListNodeStatuses(ctx, int32(limit), "") //nolint:gosec // G115: page size is far below math.MaxInt32 if err != nil { totalErr = errors.Join(totalErr, err) continue @@ -398,8 +400,7 @@ func (rs *CoreRelayerChainInteroperators) NodeStatuses(ctx context.Context, offs totalErr = errors.Join(totalErr, fmt.Errorf("relayer %s does not exist", rid.Name())) continue } - nodeStats, _, total, err := lr.ListNodeStatuses(ctx, int32(limit), "") - + nodeStats, _, total, err := lr.ListNodeStatuses(ctx, int32(limit), "") //nolint:gosec // G115: page size is far below math.MaxInt32 if err != nil { totalErr = errors.Join(totalErr, err) continue @@ -458,6 +459,7 @@ func (rs *CoreRelayerChainInteroperators) Slice() []loop.Relayer { defer rs.mu.Unlock() return slices.Collect(maps.Values(rs.loopRelayers)) } + func (rs *CoreRelayerChainInteroperators) Services() (s []services.ServiceCtx) { return rs.srvs } diff --git a/core/services/chainlink/relayer_chain_interoperators_test.go b/core/services/chainlink/relayer_chain_interoperators_test.go index fee6824bd62..ecee2e82501 100644 --- a/core/services/chainlink/relayer_chain_interoperators_test.go +++ b/core/services/chainlink/relayer_chain_interoperators_test.go @@ -93,14 +93,14 @@ func TestCoreRelayerChainInteroperators(t *testing.T) { expectedEVMChainCnt int expectedEVMNodeCnt int - expectedEVMRelayerIds []types.RelayID + expectedEVMRelayerIDs []types.RelayID expectedStarknetChainCnt int expectedStarknetNodeCnt int expectedDummyChainCnt int expectedDummyNodeCnt int - expectedDummyRelayerIds []types.RelayID + expectedDummyRelayerIDs []types.RelayID expectedCosmosChainCnt int expectedCosmosNodeCnt int @@ -108,8 +108,8 @@ func TestCoreRelayerChainInteroperators(t *testing.T) { expectedSolanaChainCnt int expectedSolanaNodeCnt int }{ - - {name: "2 evm chains with 3 nodes", + { + name: "2 evm chains with 3 nodes", initFuncs: []chainlink.CoreRelayerChainInitFunc{ chainlink.InitEVM(factory, chainlink.EVMFactoryConfig{ ChainOpts: legacyevm.ChainOpts{ @@ -126,14 +126,15 @@ func TestCoreRelayerChainInteroperators(t *testing.T) { }, expectedEVMChainCnt: 2, expectedEVMNodeCnt: 3, - expectedEVMRelayerIds: []types.RelayID{ + expectedEVMRelayerIDs: []types.RelayID{ {Network: relay.NetworkEVM, ChainID: evmChainID1.String()}, {Network: relay.NetworkEVM, ChainID: evmChainID2.String()}, }, expectedRelayerNetworks: map[string]struct{}{relay.NetworkEVM: {}}, }, - {name: "all chains", + { + name: "all chains", initFuncs: []chainlink.CoreRelayerChainInitFunc{ chainlink.InitEVM(factory, chainlink.EVMFactoryConfig{ ChainOpts: legacyevm.ChainOpts{ @@ -153,7 +154,7 @@ func TestCoreRelayerChainInteroperators(t *testing.T) { }, expectedEVMChainCnt: 2, expectedEVMNodeCnt: 3, - expectedEVMRelayerIds: []types.RelayID{ + expectedEVMRelayerIDs: []types.RelayID{ {Network: relay.NetworkEVM, ChainID: evmChainID1.String()}, {Network: relay.NetworkEVM, ChainID: evmChainID2.String()}, }, @@ -173,7 +174,7 @@ func TestCoreRelayerChainInteroperators(t *testing.T) { expectedChainCnt := tt.expectedEVMChainCnt + tt.expectedCosmosChainCnt + tt.expectedSolanaChainCnt + tt.expectedStarknetChainCnt allChainsStats, cnt, err := cr.ChainStatuses(testctx, 0, 0) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, allChainsStats, expectedChainCnt) assert.Len(t, allChainsStats, cnt) assert.Len(t, cr.Slice(), expectedChainCnt) @@ -184,7 +185,7 @@ func TestCoreRelayerChainInteroperators(t *testing.T) { expectedNodeCnt := tt.expectedEVMNodeCnt + tt.expectedCosmosNodeCnt + tt.expectedSolanaNodeCnt + tt.expectedStarknetNodeCnt allNodeStats, cnt, err := cr.NodeStatuses(testctx, 0, 0) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, allNodeStats, expectedNodeCnt) assert.Len(t, allNodeStats, cnt) } @@ -232,32 +233,32 @@ func TestCoreRelayerChainInteroperators(t *testing.T) { } nodesStats, cnt, err := interops.NodeStatuses(testctx, 0, 0) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, nodesStats, expectedNodeCnt) assert.Len(t, nodesStats, cnt) } assert.Equal(t, tt.expectedRelayerNetworks, gotRelayerNetworks) - allRelayerIds := [][]types.RelayID{ - tt.expectedEVMRelayerIds, + allRelayerIDs := [][]types.RelayID{ + tt.expectedEVMRelayerIDs, } - for _, chainSpecificRelayerIds := range allRelayerIds { - for _, wantId := range chainSpecificRelayerIds { - lr, err := cr.Get(wantId) + for _, chainSpecificRelayerIDs := range allRelayerIDs { + for _, wantID := range chainSpecificRelayerIDs { + lr, err := cr.Get(wantID) assert.NotNil(t, lr) - assert.NoError(t, err) - stat, err := cr.ChainStatus(testctx, wantId) - assert.NoError(t, err) - assert.Equal(t, wantId.ChainID, stat.ID) + require.NoError(t, err) + stat, err := cr.ChainStatus(testctx, wantID) + require.NoError(t, err) + assert.Equal(t, wantID.ChainID, stat.ID) // check legacy chains for evm and cosmos - if wantId.Network == relay.NetworkEVM { - cs, err := cr.LegacyEVMChains().Get(wantId.ChainID) - assert.NoError(t, err) + if wantID.Network == relay.NetworkEVM { + cs, err := cr.LegacyEVMChains().Get(wantID.ChainID) + require.NoError(t, err) c, ok := cs.(legacyevm.Chain) require.True(t, ok) assert.NotNil(t, c) - assert.Equal(t, wantId.ChainID, c.ID().String()) + assert.Equal(t, wantID.ChainID, c.ID().String()) } } } diff --git a/core/services/cron/cron.go b/core/services/cron/cron.go index 9b4783e757c..2cf53a07108 100644 --- a/core/services/cron/cron.go +++ b/core/services/cron/cron.go @@ -6,8 +6,8 @@ import ( "github.com/robfig/cron/v3" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/pipeline" ) @@ -25,14 +25,14 @@ type Cron struct { func NewCronFromJobSpec( jobSpec job.Job, pipelineRunner pipeline.Runner, - logger logger.Logger, + lggr logger.Logger, ) (*Cron, error) { - cronLogger := logger.Named("Cron").With( + cronLogger := logger.With(logger.Named(lggr, "Cron"), "jobID", jobSpec.ID, "schedule", jobSpec.CronSpec.CronSchedule, ) if id := jobSpec.CronSpec.EVMChainID; id != nil { - cronLogger = logger.With("evmChainID", id) + cronLogger = logger.With(cronLogger, "evmChainID", id) } return &Cron{ diff --git a/core/services/cron/delegate.go b/core/services/cron/delegate.go index d8a1390103e..1d6daab268a 100644 --- a/core/services/cron/delegate.go +++ b/core/services/cron/delegate.go @@ -5,7 +5,7 @@ import ( "github.com/pkg/errors" - "github.com/smartcontractkit/chainlink/v2/core/logger" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/pipeline" ) diff --git a/core/services/feeds/connection_manager.go b/core/services/feeds/connection_manager.go index 17471e7a140..6420b5c2126 100644 --- a/core/services/feeds/connection_manager.go +++ b/core/services/feeds/connection_manager.go @@ -9,9 +9,9 @@ import ( "github.com/smartcontractkit/wsrpc" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" pb "github.com/smartcontractkit/chainlink-protos/orchestrator/feedsmanager" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/recovery" ) diff --git a/core/services/feeds/models.go b/core/services/feeds/models.go index 1e40bcfede7..9789484f43e 100644 --- a/core/services/feeds/models.go +++ b/core/services/feeds/models.go @@ -122,7 +122,7 @@ func ChainTypeToProtoChainType(chainType ChainType) proto.ChainType { // FeedsManager defines a registered Feeds Manager Service and the connection // information. -type FeedsManager struct { +type FeedsManager struct { //nolint:revive // stutter is part of public API ID int64 Name string URI string @@ -133,6 +133,8 @@ type FeedsManager struct { DisabledAt *time.Time } +type Manager = FeedsManager + // ChainConfig defines the chain configuration for a Feeds Manager. type ChainConfig struct { ID int64 diff --git a/core/services/feeds/orm.go b/core/services/feeds/orm.go index 3dd9d48dd44..d6821e90cda 100644 --- a/core/services/feeds/orm.go +++ b/core/services/feeds/orm.go @@ -10,21 +10,21 @@ import ( "github.com/lib/pq" "github.com/pkg/errors" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/utils/crypto" ) type ORM interface { ManagerExists(ctx context.Context, publicKey crypto.PublicKey) (bool, error) CountManagers(ctx context.Context) (int64, error) - CreateManager(ctx context.Context, ms *FeedsManager) (int64, error) - GetManager(ctx context.Context, id int64) (*FeedsManager, error) - ListManagers(ctx context.Context) (mgrs []FeedsManager, err error) - ListManagersByIDs(ctx context.Context, ids []int64) ([]FeedsManager, error) - UpdateManager(ctx context.Context, mgr FeedsManager) error - EnableManager(ctx context.Context, id int64) (*FeedsManager, error) - DisableManager(ctx context.Context, id int64) (*FeedsManager, error) + CreateManager(ctx context.Context, ms *Manager) (int64, error) + GetManager(ctx context.Context, id int64) (*Manager, error) + ListManagers(ctx context.Context) (mgrs []Manager, err error) + ListManagersByIDs(ctx context.Context, ids []int64) ([]Manager, error) + UpdateManager(ctx context.Context, mgr Manager) error + EnableManager(ctx context.Context, id int64) (*Manager, error) + DisableManager(ctx context.Context, id int64) (*Manager, error) CreateBatchChainConfig(ctx context.Context, cfgs []ChainConfig) ([]int64, error) CreateChainConfig(ctx context.Context, cfg ChainConfig) (int64, error) @@ -71,7 +71,7 @@ type orm struct { } func NewORM(ds sqlutil.DataSource, lggr logger.Logger) *orm { - namedLogger := logger.Sugared(lggr.Named("FeedsORM")) + namedLogger := logger.Sugared(lggr).Named("FeedsORM") return &orm{ ds: ds, lggr: namedLogger, @@ -112,7 +112,7 @@ SELECT EXISTS ( } // CreateManager creates a feeds manager. -func (o *orm) CreateManager(ctx context.Context, ms *FeedsManager) (id int64, err error) { +func (o *orm) CreateManager(ctx context.Context, ms *Manager) (id int64, err error) { stmt := ` INSERT INTO feeds_managers (name, uri, public_key, created_at, updated_at) VALUES ($1,$2,$3,NOW(),NOW()) @@ -275,20 +275,20 @@ RETURNING id; } // GetManager gets a feeds manager by id. -func (o *orm) GetManager(ctx context.Context, id int64) (mgr *FeedsManager, err error) { +func (o *orm) GetManager(ctx context.Context, id int64) (mgr *Manager, err error) { stmt := ` SELECT id, name, uri, public_key, created_at, updated_at, disabled_at FROM feeds_managers WHERE id = $1 ` - mgr = new(FeedsManager) + mgr = new(Manager) err = o.ds.GetContext(ctx, mgr, stmt, id) return mgr, errors.Wrap(err, "GetManager failed") } // ListManager lists all feeds managers. -func (o *orm) ListManagers(ctx context.Context) (mgrs []FeedsManager, err error) { +func (o *orm) ListManagers(ctx context.Context) (mgrs []Manager, err error) { stmt := ` SELECT id, name, uri, public_key, created_at, updated_at, disabled_at FROM feeds_managers @@ -300,21 +300,21 @@ ORDER BY created_at; } // ListManagersByIDs gets feeds managers by ids. -func (o *orm) ListManagersByIDs(ctx context.Context, ids []int64) (managers []FeedsManager, err error) { +func (o *orm) ListManagersByIDs(ctx context.Context, ids []int64) (managers []Manager, err error) { stmt := ` SELECT id, name, uri, public_key, created_at, updated_at, disabled_at FROM feeds_managers WHERE id = ANY($1) ORDER BY created_at, id;` - mgrIds := pq.Array(ids) - err = o.ds.SelectContext(ctx, &managers, stmt, mgrIds) + mgrIDs := pq.Array(ids) + err = o.ds.SelectContext(ctx, &managers, stmt, mgrIDs) return managers, errors.Wrap(err, "GetManagers failed") } // UpdateManager updates the manager details. -func (o *orm) UpdateManager(ctx context.Context, mgr FeedsManager) (err error) { +func (o *orm) UpdateManager(ctx context.Context, mgr Manager) (err error) { stmt := ` UPDATE feeds_managers SET name = $1, uri = $2, public_key = $3, updated_at = NOW() @@ -335,14 +335,14 @@ WHERE id = $4; return nil } -func (o *orm) EnableManager(ctx context.Context, id int64) (*FeedsManager, error) { +func (o *orm) EnableManager(ctx context.Context, id int64) (*Manager, error) { stmt := ` UPDATE feeds_managers SET disabled_at = NULL WHERE id = $1 RETURNING *; ` - mgr := new(FeedsManager) + mgr := new(Manager) err := o.ds.GetContext(ctx, mgr, stmt, id) if err != nil { return nil, errors.Wrap(err, "EnableManager failed") @@ -350,14 +350,14 @@ func (o *orm) EnableManager(ctx context.Context, id int64) (*FeedsManager, error return mgr, nil } -func (o *orm) DisableManager(ctx context.Context, id int64) (*FeedsManager, error) { +func (o *orm) DisableManager(ctx context.Context, id int64) (*Manager, error) { stmt := ` UPDATE feeds_managers SET disabled_at = NOW() WHERE id = $1 RETURNING *; ` - mgr := new(FeedsManager) + mgr := new(Manager) err := o.ds.GetContext(ctx, mgr, stmt, id) if err != nil { return nil, errors.Wrap(err, "DisableManager failed") diff --git a/core/services/feeds/orm_test.go b/core/services/feeds/orm_test.go index 4ad8da39cd9..590f70c984e 100644 --- a/core/services/feeds/orm_test.go +++ b/core/services/feeds/orm_test.go @@ -58,7 +58,7 @@ func Test_ORM_CreateManager_CountManagers(t *testing.T) { var ( orm = setupORM(t) - mgr = &feeds.FeedsManager{ + mgr = &feeds.Manager{ URI: uri, Name: name, PublicKey: publicKey, @@ -85,7 +85,7 @@ func Test_ORM_CreateManager(t *testing.T) { var ( orm = setupORM(t) - mgr = &feeds.FeedsManager{ + mgr = &feeds.Manager{ URI: uri, Name: name, PublicKey: publicKey, @@ -112,7 +112,7 @@ func Test_ORM_GetManager(t *testing.T) { var ( orm = setupORM(t) - mgr = &feeds.FeedsManager{ + mgr = &feeds.Manager{ URI: uri, Name: name, PublicKey: publicKey, @@ -141,7 +141,7 @@ func Test_ORM_ListManagers(t *testing.T) { var ( orm = setupORM(t) - mgr = &feeds.FeedsManager{ + mgr = &feeds.Manager{ URI: uri, Name: name, PublicKey: publicKey, @@ -169,7 +169,7 @@ func Test_ORM_ListManagersByIDs(t *testing.T) { var ( orm = setupORM(t) - mgr = &feeds.FeedsManager{ + mgr = &feeds.Manager{ URI: uri, Name: name, PublicKey: publicKey, @@ -197,7 +197,7 @@ func Test_ORM_UpdateManager(t *testing.T) { var ( orm = setupORM(t) - mgr = &feeds.FeedsManager{ + mgr = &feeds.Manager{ URI: uri, Name: name, PublicKey: publicKey, @@ -207,7 +207,7 @@ func Test_ORM_UpdateManager(t *testing.T) { id, err := orm.CreateManager(ctx, mgr) require.NoError(t, err) - updatedMgr := feeds.FeedsManager{ + updatedMgr := feeds.Manager{ ID: id, URI: "127.0.0.1", Name: "New Name", @@ -231,7 +231,7 @@ func Test_ORM_EnableAndDisableManager(t *testing.T) { var ( orm = setupORM(t) - mgr = &feeds.FeedsManager{ + mgr = &feeds.Manager{ URI: uri, Name: name, PublicKey: publicKey, @@ -1714,7 +1714,7 @@ func Test_ORM_IsJobManagedByFeedsManager(t *testing.T) { fmID1 = createFeedsManager(t, orm) ) - mgr2 := &feeds.FeedsManager{ + mgr2 := &feeds.Manager{ URI: "http://192.168.0.2", Name: "Chainlink FMS 2", PublicKey: crypto.PublicKey([]byte("22222222222222222222222222222222")), @@ -1806,7 +1806,7 @@ func assertChainConfigEqual(t *testing.T, want map[string]any, actual feeds.Chai func createFeedsManager(t *testing.T, orm feeds.ORM) int64 { t.Helper() - mgr := &feeds.FeedsManager{ + mgr := &feeds.Manager{ URI: uri, Name: name, PublicKey: publicKey, diff --git a/core/services/feeds/rpc_handlers.go b/core/services/feeds/rpc_handlers.go index 867be0cdda0..9b701d8f1b5 100644 --- a/core/services/feeds/rpc_handlers.go +++ b/core/services/feeds/rpc_handlers.go @@ -3,11 +3,12 @@ package feeds import ( "context" "fmt" + "math" "github.com/google/uuid" + "github.com/smartcontractkit/chainlink-common/pkg/logger" pb "github.com/smartcontractkit/chainlink-protos/orchestrator/feedsmanager" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) const ( @@ -19,14 +20,14 @@ const ( type RPCHandlers struct { svc Service feedsManagerID int64 - lggr logger.Logger + lggr logger.SugaredLogger } func NewRPCHandlers(svc Service, feedsManagerID int64, lggr logger.Logger) *RPCHandlers { return &RPCHandlers{ svc: svc, feedsManagerID: feedsManagerID, - lggr: lggr.Named("RPCHandlers"), + lggr: logger.Sugared(lggr).Named("RPCHandlers"), } } @@ -37,11 +38,16 @@ func (h *RPCHandlers) ProposeJob(ctx context.Context, req *pb.ProposeJobRequest) return nil, err } + version := req.GetVersion() + if version > math.MaxInt32 || version < math.MinInt32 { + return nil, fmt.Errorf("job proposal version %d is out of int32 range", version) + } + _, err = h.svc.ProposeJob(ctx, &ProposeJobArgs{ Spec: req.GetSpec(), FeedsManagerID: h.feedsManagerID, RemoteUUID: remoteUUID, - Version: int32(req.GetVersion()), + Version: int32(version), Multiaddrs: req.GetMultiaddrs(), }) if err != nil { diff --git a/core/services/feeds/service.go b/core/services/feeds/service.go index b2dc4c8dab3..4d35f2c0ed3 100644 --- a/core/services/feeds/service.go +++ b/core/services/feeds/service.go @@ -24,6 +24,7 @@ import ( "github.com/smartcontractkit/chainlink-common/keystore/corekeys/ocr2key" "github.com/smartcontractkit/chainlink-common/keystore/corekeys/ocrkey" "github.com/smartcontractkit/chainlink-common/keystore/corekeys/p2pkey" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" "github.com/smartcontractkit/chainlink-common/pkg/types/core" @@ -31,7 +32,6 @@ import ( "github.com/smartcontractkit/chainlink-evm/pkg/types" pb "github.com/smartcontractkit/chainlink-protos/orchestrator/feedsmanager" ccip "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/validate" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/ccv/ccvcommitteeverifier" "github.com/smartcontractkit/chainlink/v2/core/services/ccv/ccvexecutor" "github.com/smartcontractkit/chainlink/v2/core/services/cresettings" @@ -123,13 +123,13 @@ type Service interface { Start(ctx context.Context) error Close() error - GetManager(ctx context.Context, id int64) (*FeedsManager, error) - ListManagers(ctx context.Context) ([]FeedsManager, error) - ListManagersByIDs(ctx context.Context, ids []int64) ([]FeedsManager, error) + GetManager(ctx context.Context, id int64) (*Manager, error) + ListManagers(ctx context.Context) ([]Manager, error) + ListManagersByIDs(ctx context.Context, ids []int64) ([]Manager, error) RegisterManager(ctx context.Context, params RegisterManagerParams) (int64, error) - UpdateManager(ctx context.Context, mgr FeedsManager) error - EnableManager(ctx context.Context, id int64) (*FeedsManager, error) - DisableManager(ctx context.Context, id int64) (*FeedsManager, error) + UpdateManager(ctx context.Context, mgr Manager) error + EnableManager(ctx context.Context, id int64) (*Manager, error) + DisableManager(ctx context.Context, id int64) (*Manager, error) CreateChainConfig(ctx context.Context, cfg ChainConfig) (int64, error) DeleteChainConfig(ctx context.Context, id int64) (int64, error) @@ -181,7 +181,7 @@ type service struct { ocr2cfg OCR2Config connMgr ConnectionsManager legacyChains legacyevm.LegacyChainContainer - lggr logger.Logger + lggr logger.SugaredLogger version string loopRegistrarConfig plugins.RegistrarConfig syncNodeInfoCancel atomicCancelFns @@ -210,7 +210,7 @@ func NewService( rc plugins.RegistrarConfig, opts ...ServiceOption, ) *service { - lggr = lggr.Named("Feeds") + sugaredLggr := logger.Sugared(lggr).Named("Feeds") svc := &service{ orm: orm, jobORM: jobORM, @@ -228,9 +228,9 @@ func NewService( jobCfg: jobCfg, ocrCfg: ocrCfg, ocr2cfg: ocr2Cfg, - connMgr: newConnectionsManager(lggr), + connMgr: newConnectionsManager(sugaredLggr), legacyChains: legacyChains, - lggr: lggr, + lggr: sugaredLggr, version: version, loopRegistrarConfig: rc, syncNodeInfoCancel: atomicCancelFns{fns: map[int64]context.CancelFunc{}}, @@ -274,7 +274,7 @@ func (s *service) RegisterManager(ctx context.Context, params RegisterManagerPar } } - mgr := FeedsManager{ + mgr := Manager{ Name: params.Name, URI: params.URI, PublicKey: params.PublicKey, @@ -407,7 +407,7 @@ func (s *service) SyncNodeInfo(ctx context.Context, id int64) error { // UpdateManager updates the feed manager details, takes down the // connection and reestablishes a new connection with the updated public key. -func (s *service) UpdateManager(ctx context.Context, mgr FeedsManager) error { +func (s *service) UpdateManager(ctx context.Context, mgr Manager) error { err := s.orm.UpdateManager(ctx, mgr) if err != nil { return errors.Wrap(err, "could not update manager") @@ -420,7 +420,7 @@ func (s *service) UpdateManager(ctx context.Context, mgr FeedsManager) error { return nil } -func (s *service) EnableManager(ctx context.Context, id int64) (*FeedsManager, error) { +func (s *service) EnableManager(ctx context.Context, id int64) (*Manager, error) { mgr, err := s.orm.EnableManager(ctx, id) if err != nil || mgr == nil { return nil, errors.Wrap(err, "could not enable manager") @@ -435,7 +435,7 @@ func (s *service) EnableManager(ctx context.Context, id int64) (*FeedsManager, e return mgr, nil } -func (s *service) DisableManager(ctx context.Context, id int64) (*FeedsManager, error) { +func (s *service) DisableManager(ctx context.Context, id int64) (*Manager, error) { mgr, err := s.orm.DisableManager(ctx, id) if err != nil || mgr == nil { return nil, errors.Wrap(err, "could not disable manager") @@ -451,7 +451,7 @@ func (s *service) DisableManager(ctx context.Context, id int64) (*FeedsManager, } // ListManagerServices lists all the manager services. -func (s *service) ListManagers(ctx context.Context) ([]FeedsManager, error) { +func (s *service) ListManagers(ctx context.Context) ([]Manager, error) { managers, err := s.orm.ListManagers(ctx) if err != nil { return nil, errors.Wrap(err, "failed to get a list of managers") @@ -465,7 +465,7 @@ func (s *service) ListManagers(ctx context.Context) ([]FeedsManager, error) { } // GetManager gets a manager service by id. -func (s *service) GetManager(ctx context.Context, id int64) (*FeedsManager, error) { +func (s *service) GetManager(ctx context.Context, id int64) (*Manager, error) { manager, err := s.orm.GetManager(ctx, id) if err != nil { return nil, errors.Wrap(err, "failed to get manager by ID") @@ -476,7 +476,7 @@ func (s *service) GetManager(ctx context.Context, id int64) (*FeedsManager, erro } // ListManagersByIDs get managers services by ids. -func (s *service) ListManagersByIDs(ctx context.Context, ids []int64) ([]FeedsManager, error) { +func (s *service) ListManagersByIDs(ctx context.Context, ids []int64) ([]Manager, error) { managers, err := s.orm.ListManagersByIDs(ctx, ids) if err != nil { return nil, errors.Wrap(err, "failed to list managers by IDs") @@ -613,7 +613,7 @@ func (s *service) DeleteJob(ctx context.Context, args *DeleteJobArgs) (int64, er return 0, fmt.Errorf("GetJobProposalByRemoteUUID did not find any proposals to delete: %w", err) } - logger := s.lggr.With( + lggr := s.lggr.With( "job_proposal_id", proposal.ID, ) @@ -624,13 +624,13 @@ func (s *service) DeleteJob(ctx context.Context, args *DeleteJobArgs) (int64, er } if err = s.orm.DeleteProposal(ctx, proposal.ID); err != nil { - logger.Errorw("Failed to delete the proposal", "err", err) + lggr.Errorw("Failed to delete the proposal", "err", err) return 0, fmt.Errorf("DeleteProposal failed: %w", err) } - logger.Infow("Successfully deleted job proposal", "jobProposalID", proposal.ID) + lggr.Infow("Successfully deleted job proposal", "jobProposalID", proposal.ID) if err = s.observeJobProposalCounts(ctx); err != nil { - logger.Errorw("Failed to push metrics for job proposal deletion", "err", err) + lggr.Errorw("Failed to push metrics for job proposal deletion", "err", err) } return proposal.ID, nil @@ -676,13 +676,13 @@ func (s *service) RevokeJob(ctx context.Context, args *RevokeJobArgs) (int64, er return 0, errors.Wrap(err, "RevokeSpec failed") } - logger := s.lggr.With( + lggr := s.lggr.With( "job_proposal_id", proposal.ID, "job_proposal_spec_id", latest.ID, ) if err = s.observeJobProposalCounts(ctx); err != nil { - logger.Errorw("Failed to push metrics for revoke job", "err", err) + lggr.Errorw("Failed to push metrics for revoke job", "err", err) } return proposal.ID, nil @@ -796,7 +796,7 @@ func (s *service) ProposeJob(ctx context.Context, args *ProposeJobArgs) (int64, } } - logger := s.lggr.With( + lggr := s.lggr.With( "job_proposal_remote_uuid", args.RemoteUUID, ) @@ -840,7 +840,7 @@ func (s *service) ProposeJob(ctx context.Context, args *ProposeJobArgs) (int64, jobType, err := getJobType(args.Spec) switch { case err != nil: - logger.Errorw("Failed to validate spec while checking for workflow", "err", err) + lggr.Errorw("Failed to validate spec while checking for workflow", "err", err) case jobType == job.CRESettings: promWorkflowRequests.Inc() promFeedsWorkflowRequests.Inc() @@ -848,10 +848,10 @@ func (s *service) ProposeJob(ctx context.Context, args *ProposeJobArgs) (int64, if err != nil { promWorkflowFailures.Inc() promFeedsWorkflowFailures.Inc() - logger.Errorw("Failed to auto approve "+jobType.String()+" spec", "id", id, "err", err) + lggr.Errorw("Failed to auto approve "+jobType.String()+" spec", "id", id, "err", err) return 0, fmt.Errorf("failed to approve %s spec %d: %w", jobType, id, err) } - logger.Infow("Successful "+jobType.String()+" spec auto approval", "id", id) + lggr.Infow("Successful "+jobType.String()+" spec auto approval", "id", id) promWorkflowApprovals.Inc() promFeedsWorkflowApprovals.Inc() default: @@ -860,7 +860,7 @@ func (s *service) ProposeJob(ctx context.Context, args *ProposeJobArgs) (int64, } if err = s.observeJobProposalCounts(ctx); err != nil { - logger.Errorw("Failed to push metrics for propose job", "err", err) + lggr.Errorw("Failed to push metrics for propose job", "err", err) } return id, nil @@ -906,7 +906,7 @@ func (s *service) RejectSpec(ctx context.Context, id int64) error { return errors.Wrap(err, "fms rpc client is not connected") } - logger := s.lggr.With( + lggr := s.lggr.With( "job_proposal_id", proposal.ID, "job_proposal_spec_id", id, ) @@ -930,7 +930,7 @@ func (s *service) RejectSpec(ctx context.Context, id int64) error { } if err = s.observeJobProposalCounts(ctx); err != nil { - logger.Errorw("Failed to push metrics for job rejection", "err", err) + lggr.Errorw("Failed to push metrics for job rejection", "err", err) } return nil @@ -958,14 +958,14 @@ func (s *service) ApproveSpec(ctx context.Context, id int64, force bool) error { return err } - logger := s.lggr.With( + lggr := s.lggr.With( "job_proposal_id", proposal.ID, "job_proposal_spec_id", id, ) fmsClient, err := s.connMgr.GetClient(proposal.FeedsManagerID) if err != nil { - logger.Errorw("Failed to get FMS Client", "err", err) + lggr.Errorw("Failed to get FMS Client", "err", err) return errors.Wrap(err, "fms rpc client") } @@ -982,7 +982,7 @@ func (s *service) ApproveSpec(ctx context.Context, id int64, force bool) error { // Check that the bridges exist if err = s.jobORM.AssertBridgesExist(ctx, j.Pipeline); err != nil { - logger.Errorw("Failed to approve job spec due to bridge check", "err", err.Error()) + lggr.Errorw("Failed to approve job spec due to bridge check", "err", err.Error()) return errors.Wrap(err, "failed to approve job spec due to bridge check") } @@ -1064,7 +1064,7 @@ func (s *service) ApproveSpec(ctx context.Context, id int64, force bool) error { approvedSpec, serr := tx.orm.GetApprovedSpec(ctx, proposal.ID) if serr != nil { if !errors.Is(serr, sql.ErrNoRows) { - logger.Errorw("Failed to get approved spec", "err", serr) + lggr.Errorw("Failed to get approved spec", "err", serr) // Return an error for any other errors fetching the // approved spec @@ -1075,7 +1075,7 @@ func (s *service) ApproveSpec(ctx context.Context, id int64, force bool) error { // If a spec is found, cancel the existing job spec if serr == nil { if cerr := tx.orm.CancelSpec(ctx, approvedSpec.ID); cerr != nil { - logger.Errorw("Failed to delete the cancel the spec", "err", cerr) + lggr.Errorw("Failed to delete the cancel the spec", "err", cerr) return cerr } @@ -1083,7 +1083,7 @@ func (s *service) ApproveSpec(ctx context.Context, id int64, force bool) error { // Delete the job if serr = s.jobSpawner.DeleteJob(ctx, tx.ds, existingJobID); serr != nil { - logger.Errorw("Failed to delete the job", "err", serr) + lggr.Errorw("Failed to delete the job", "err", serr) return errors.Wrap(serr, "DeleteJob failed") } @@ -1091,14 +1091,14 @@ func (s *service) ApproveSpec(ctx context.Context, id int64, force bool) error { // Create the job if txerr = s.jobSpawner.CreateJob(ctx, tx.ds, j); txerr != nil { - logger.Errorw("Failed to create job", "err", txerr) + lggr.Errorw("Failed to create job", "err", txerr) return txerr } // Approve the job proposal spec if txerr = tx.orm.ApproveSpec(ctx, id, j.ExternalJobID); txerr != nil { - logger.Errorw("Failed to approve spec", "err", txerr) + lggr.Errorw("Failed to approve spec", "err", txerr) return txerr } @@ -1108,7 +1108,7 @@ func (s *service) ApproveSpec(ctx context.Context, id int64, force bool) error { Uuid: proposal.RemoteUUID.String(), Version: int64(spec.Version), }); txerr != nil { - logger.Errorw("Failed to approve job to FMS", "err", txerr) + lggr.Errorw("Failed to approve job to FMS", "err", txerr) return txerr } @@ -1120,7 +1120,7 @@ func (s *service) ApproveSpec(ctx context.Context, id int64, force bool) error { } if err = s.observeJobProposalCounts(ctx); err != nil { - logger.Errorw("Failed to push metrics for job approval", "err", err) + lggr.Errorw("Failed to push metrics for job approval", "err", err) } return nil @@ -1163,7 +1163,7 @@ func (s *service) CancelSpec(ctx context.Context, id int64) error { return errors.Wrap(err, "fms rpc client") } - logger := s.lggr.With( + lggr := s.lggr.With( "job_proposal_id", jp.ID, "job_proposal_spec_id", id, ) @@ -1208,7 +1208,7 @@ func (s *service) CancelSpec(ctx context.Context, id int64) error { } if err = s.observeJobProposalCounts(ctx); err != nil { - logger.Errorw("Failed to push metrics for job cancellation", "err", err) + lggr.Errorw("Failed to push metrics for job cancellation", "err", err) } return nil @@ -1279,10 +1279,8 @@ func (s *service) Start(ctx context.Context) error { s.connectFeedManager(mgr) } } - } else { - if mgrs[0].DisabledAt == nil { - s.connectFeedManager(mgrs[0]) - } + } else if mgrs[0].DisabledAt == nil { + s.connectFeedManager(mgrs[0]) } if err = s.observeJobProposalCounts(ctx); err != nil { @@ -1305,7 +1303,7 @@ func (s *service) Close() error { } // connectFeedManager connects to a feeds manager -func (s *service) connectFeedManager(mgr FeedsManager) { +func (s *service) connectFeedManager(mgr Manager) { s.connMgr.Connect(ConnectOpts{ FeedsManagerID: mgr.ID, URI: mgr.URI, @@ -1359,7 +1357,7 @@ func (s *service) observeJobProposalCounts(ctx context.Context) error { // tests. // // ONLY TO BE USED FOR TESTING. -func (s *service) Unsafe_SetConnectionsManager(connMgr ConnectionsManager) { +func (s *service) Unsafe_SetConnectionsManager(connMgr ConnectionsManager) { //nolint:revive // naming preserved for mock compatibility s.connMgr = connMgr } @@ -1646,7 +1644,7 @@ func (s *service) validateProposeJobArgs(ctx context.Context, args ProposeJobArg return nil } -func (s *service) restartConnection(mgr FeedsManager) error { +func (s *service) restartConnection(mgr Manager) error { s.lggr.Infof("Restarting connection") if err := s.connMgr.Disconnect(mgr.ID); err != nil { @@ -1802,18 +1800,18 @@ func (ns NullService) ListSpecsByJobProposalIDs(ctx context.Context, ids []int64 return nil, ErrFeedsManagerDisabled } -func (ns NullService) GetManager(ctx context.Context, id int64) (*FeedsManager, error) { +func (ns NullService) GetManager(ctx context.Context, id int64) (*Manager, error) { return nil, ErrFeedsManagerDisabled } -func (ns NullService) ListManagersByIDs(ctx context.Context, ids []int64) ([]FeedsManager, error) { +func (ns NullService) ListManagersByIDs(ctx context.Context, ids []int64) ([]Manager, error) { return nil, ErrFeedsManagerDisabled } func (ns NullService) GetSpec(ctx context.Context, id int64) (*JobProposalSpec, error) { return nil, ErrFeedsManagerDisabled } -func (ns NullService) ListManagers(ctx context.Context) ([]FeedsManager, error) { return nil, nil } +func (ns NullService) ListManagers(ctx context.Context) ([]Manager, error) { return nil, nil } func (ns NullService) CreateChainConfig(ctx context.Context, cfg ChainConfig) (int64, error) { return 0, ErrFeedsManagerDisabled } @@ -1833,7 +1831,9 @@ func (ns NullService) ListChainConfigsByManagerIDs(ctx context.Context, mgrIDs [ func (ns NullService) UpdateChainConfig(ctx context.Context, cfg ChainConfig) (int64, error) { return 0, ErrFeedsManagerDisabled } + func (ns NullService) ListJobProposals(ctx context.Context) ([]JobProposal, error) { return nil, nil } + func (ns NullService) ListJobProposalsByManagersIDs(ctx context.Context, ids []int64) ([]JobProposal, error) { return nil, ErrFeedsManagerDisabled } @@ -1862,15 +1862,15 @@ func (ns NullService) RejectSpec(ctx context.Context, id int64) error { return ErrFeedsManagerDisabled } func (ns NullService) SyncNodeInfo(ctx context.Context, id int64) error { return nil } -func (ns NullService) UpdateManager(ctx context.Context, mgr FeedsManager) error { +func (ns NullService) UpdateManager(ctx context.Context, mgr Manager) error { return ErrFeedsManagerDisabled } -func (ns NullService) EnableManager(ctx context.Context, id int64) (*FeedsManager, error) { +func (ns NullService) EnableManager(ctx context.Context, id int64) (*Manager, error) { return nil, ErrFeedsManagerDisabled } -func (ns NullService) DisableManager(ctx context.Context, id int64) (*FeedsManager, error) { +func (ns NullService) DisableManager(ctx context.Context, id int64) (*Manager, error) { return nil, ErrFeedsManagerDisabled } diff --git a/core/services/feeds/service_test.go b/core/services/feeds/service_test.go index 1df02b60f2c..3dee1e43453 100644 --- a/core/services/feeds/service_test.go +++ b/core/services/feeds/service_test.go @@ -280,7 +280,7 @@ func Test_Service_RegisterManager(t *testing.T) { require.NoError(t, err) var ( - mgr = feeds.FeedsManager{ + mgr = feeds.Manager{ Name: "FMS", URI: "localhost:8080", PublicKey: pubKey, @@ -300,7 +300,7 @@ func Test_Service_RegisterManager(t *testing.T) { svc.orm.On("CreateBatchChainConfig", mock.Anything, params.ChainConfigs, mock.Anything). Return([]int64{}, nil) // ListManagers runs in a goroutine so it might be called. - svc.orm.On("ListManagers", t.Context()).Return([]feeds.FeedsManager{mgr}, nil).Maybe() + svc.orm.On("ListManagers", t.Context()).Return([]feeds.Manager{mgr}, nil).Maybe() transactCall := svc.orm.On("Transact", mock.Anything, mock.Anything) transactCall.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) @@ -327,7 +327,7 @@ func Test_Service_RegisterManager_MultiFeedsManager(t *testing.T) { require.NoError(t, err) var ( - mgr = feeds.FeedsManager{ + mgr = feeds.Manager{ Name: "FMS", URI: "localhost:8080", PublicKey: pubKey, @@ -351,7 +351,7 @@ func Test_Service_RegisterManager_MultiFeedsManager(t *testing.T) { svc.orm.On("CreateBatchChainConfig", mock.Anything, params.ChainConfigs, mock.Anything). Return([]int64{}, nil) // ListManagers runs in a goroutine so it might be called. - svc.orm.On("ListManagers", ctx).Return([]feeds.FeedsManager{mgr}, nil).Maybe() + svc.orm.On("ListManagers", ctx).Return([]feeds.Manager{mgr}, nil).Maybe() transactCall := svc.orm.On("Transact", mock.Anything, mock.Anything) transactCall.Run(func(args mock.Arguments) { fn := args[1].(func(orm feeds.ORM) error) @@ -378,7 +378,7 @@ func Test_Service_RegisterManager_InvalidCreateManager(t *testing.T) { require.NoError(t, err) var ( - mgr = feeds.FeedsManager{ + mgr = feeds.Manager{ Name: "FMS", URI: "localhost:8080", PublicKey: pubKey, @@ -396,7 +396,7 @@ func Test_Service_RegisterManager_InvalidCreateManager(t *testing.T) { svc.orm.On("CreateManager", mock.Anything, &mgr, mock.Anything). Return(id, errors.New("orm error")) // ListManagers runs in a goroutine so it might be called. - svc.orm.On("ListManagers", t.Context()).Return([]feeds.FeedsManager{mgr}, nil).Maybe() + svc.orm.On("ListManagers", t.Context()).Return([]feeds.Manager{mgr}, nil).Maybe() transactCall := svc.orm.On("Transact", mock.Anything, mock.Anything) transactCall.Run(func(args mock.Arguments) { @@ -417,7 +417,7 @@ func Test_Service_RegisterManager_DuplicateFeedsManager(t *testing.T) { require.NoError(t, err) var ( - mgr = feeds.FeedsManager{ + mgr = feeds.Manager{ Name: "FMS", URI: "localhost:8080", PublicKey: pubKey, @@ -437,7 +437,7 @@ func Test_Service_RegisterManager_DuplicateFeedsManager(t *testing.T) { svc.orm.On("ManagerExists", ctx, params.PublicKey).Return(true, nil) // ListManagers runs in a goroutine so it might be called. - svc.orm.On("ListManagers", ctx).Return([]feeds.FeedsManager{mgr}, nil).Maybe() + svc.orm.On("ListManagers", ctx).Return([]feeds.Manager{mgr}, nil).Maybe() _, err = svc.RegisterManager(ctx, params) require.Error(t, err) @@ -450,8 +450,8 @@ func Test_Service_ListManagers(t *testing.T) { ctx := t.Context() var ( - mgr = feeds.FeedsManager{} - mgrs = []feeds.FeedsManager{mgr} + mgr = feeds.Manager{} + mgrs = []feeds.Manager{mgr} ) svc := setupTestService(t) @@ -470,7 +470,7 @@ func Test_Service_GetManager(t *testing.T) { var ( id = int64(1) - mgr = feeds.FeedsManager{ID: id} + mgr = feeds.Manager{ID: id} ) svc := setupTestService(t) @@ -485,7 +485,7 @@ func Test_Service_GetManager(t *testing.T) { } func Test_Service_UpdateFeedsManager(t *testing.T) { - mgr := feeds.FeedsManager{ID: 1} + mgr := feeds.Manager{ID: 1} svc := setupTestService(t) @@ -498,7 +498,7 @@ func Test_Service_UpdateFeedsManager(t *testing.T) { } func Test_Service_EnableFeedsManager(t *testing.T) { - mgr := feeds.FeedsManager{ID: 1} + mgr := feeds.Manager{ID: 1} svc := setupTestService(t) @@ -513,7 +513,7 @@ func Test_Service_EnableFeedsManager(t *testing.T) { } func Test_Service_DisableFeedsManager(t *testing.T) { - mgr := feeds.FeedsManager{ID: 1} + mgr := feeds.Manager{ID: 1} svc := setupTestService(t) @@ -531,8 +531,8 @@ func Test_Service_ListManagersByIDs(t *testing.T) { ctx := t.Context() var ( - mgr = feeds.FeedsManager{} - mgrs = []feeds.FeedsManager{mgr} + mgr = feeds.Manager{} + mgrs = []feeds.Manager{mgr} ) svc := setupTestService(t) @@ -588,7 +588,7 @@ func Test_Service_CreateChainConfig(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { var ( - mgr = feeds.FeedsManager{ID: 1} + mgr = feeds.Manager{ID: 1} nodeVersion = &versioning.NodeVersion{ Version: "1.0.0", } @@ -658,7 +658,7 @@ func Test_Service_CreateChainConfig(t *testing.T) { func Test_Service_CreateChainConfig_InvalidAdminAddress(t *testing.T) { var ( - mgr = feeds.FeedsManager{ID: 1} + mgr = feeds.Manager{ID: 1} cfg = feeds.ChainConfig{ FeedsManagerID: mgr.ID, ChainID: "42", @@ -679,7 +679,7 @@ func Test_Service_CreateChainConfig_InvalidAdminAddress(t *testing.T) { func Test_Service_DeleteChainConfig(t *testing.T) { var ( - mgr = feeds.FeedsManager{ID: 1} + mgr = feeds.Manager{ID: 1} nodeVersion = &versioning.NodeVersion{ Version: "1.0.0", } @@ -720,7 +720,7 @@ func Test_Service_DeleteChainConfig(t *testing.T) { func Test_Service_ListChainConfigsByManagerIDs(t *testing.T) { ctx := t.Context() var ( - mgr = feeds.FeedsManager{ID: 1} + mgr = feeds.Manager{ID: 1} cfg = feeds.ChainConfig{ ID: 1, FeedsManagerID: mgr.ID, @@ -773,7 +773,7 @@ func Test_Service_UpdateChainConfig(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { var ( - mgr = feeds.FeedsManager{ID: 1} + mgr = feeds.Manager{ID: 1} nodeVersion = &versioning.NodeVersion{ Version: "1.0.0", } @@ -836,7 +836,7 @@ func Test_Service_UpdateChainConfig(t *testing.T) { func Test_Service_UpdateChainConfig_InvalidAdminAddress(t *testing.T) { var ( - mgr = feeds.FeedsManager{ID: 1} + mgr = feeds.Manager{ID: 1} cfg = feeds.ChainConfig{ FeedsManagerID: mgr.ID, ChainID: "42", @@ -1515,7 +1515,7 @@ func Test_Service_SyncNodeInfo(t *testing.T) { var ( multiaddr = "/dns4/chain.link/tcp/1234/p2p/16Uiu2HAm58SP7UL8zsnpeuwHfytLocaqgnyaYKP8wu7qRdrixLju" - mgr = &feeds.FeedsManager{ID: 1} + mgr = &feeds.Manager{ID: 1} forwarderAddr = "0x0002" ccfg = feeds.ChainConfig{ ID: 100, @@ -1622,7 +1622,7 @@ func Test_Service_SyncNodeInfo(t *testing.T) { func Test_Service_syncNodeInfoWithRetry(t *testing.T) { t.Parallel() - mgr := feeds.FeedsManager{ID: 1} + mgr := feeds.Manager{ID: 1} nodeVersion := &versioning.NodeVersion{Version: "1.0.0"} cfg := feeds.ChainConfig{ FeedsManagerID: mgr.ID, @@ -2439,12 +2439,12 @@ updateInterval = "30s" { name: "failed due to spec already approved", before: func(svc *TestService) { - aSpec := &feeds.JobProposalSpec{ + aspect := &feeds.JobProposalSpec{ ID: spec.ID, Status: feeds.SpecStatusApproved, JobProposalID: jp.ID, } - svc.orm.On("GetSpec", mock.Anything, aSpec.ID, mock.Anything).Return(aSpec, nil) + svc.orm.On("GetSpec", mock.Anything, aspect.ID, mock.Anything).Return(aspect, nil) svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil) }, id: spec.ID, @@ -3028,7 +3028,7 @@ updateInterval = "20m" force: false, }, { - name: "cancelled spec success when when no other spec is approved", + name: "cancelled spec success when no other spec is approved", httpTimeout: commonconfig.MustNewDuration(1 * time.Minute), before: func(svc *TestService) { otherSpec := feeds.JobProposalSpec{ @@ -3270,12 +3270,12 @@ updateInterval = "20m" { name: "cannot approve an approved spec", before: func(svc *TestService) { - aSpec := &feeds.JobProposalSpec{ + aspect := &feeds.JobProposalSpec{ ID: spec.ID, JobProposalID: jp.ID, Status: feeds.SpecStatusApproved, } - svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(aSpec, nil) + svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(aspect, nil) svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil) }, id: spec.ID, @@ -3674,12 +3674,12 @@ func Test_Service_ApproveSpec_Stream(t *testing.T) { { name: "cannot approve an approved spec", before: func(svc *TestService) { - aSpec := &feeds.JobProposalSpec{ + aspect := &feeds.JobProposalSpec{ ID: spec.ID, JobProposalID: jp.ID, Status: feeds.SpecStatusApproved, } - svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(aSpec, nil) + svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(aspect, nil) svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil) }, id: spec.ID, @@ -4216,12 +4216,12 @@ chainID = 0 { name: "cannot approve an approved spec", before: func(svc *TestService) { - aSpec := &feeds.JobProposalSpec{ + aspect := &feeds.JobProposalSpec{ ID: spec.ID, JobProposalID: jp.ID, Status: feeds.SpecStatusApproved, } - svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(aSpec, nil) + svc.orm.On("GetSpec", mock.Anything, spec.ID).Return(aspect, nil) svc.orm.On("GetJobProposal", mock.Anything, jp.ID).Return(jp, nil) }, id: spec.ID, @@ -4637,11 +4637,11 @@ func Test_Service_StartStop(t *testing.T) { key := cltest.DefaultCSAKey var ( - mgr = feeds.FeedsManager{ + mgr = feeds.Manager{ ID: 1, URI: "localhost:2000", } - mgr2 = feeds.FeedsManager{ + mgr2 = feeds.Manager{ ID: 2, URI: "localhost:2001", } @@ -4662,7 +4662,7 @@ func Test_Service_StartStop(t *testing.T) { beforeFunc: func(svc *TestService) { svc.csaKeystore.On("EnsureKey", mock.Anything).Return(nil) svc.csaKeystore.On("GetAll").Return([]csakey.KeyV2{key}, nil) - svc.orm.On("ListManagers", mock.Anything).Return([]feeds.FeedsManager{mgr}, nil) + svc.orm.On("ListManagers", mock.Anything).Return([]feeds.Manager{mgr}, nil) svc.connMgr.On("IsConnected", mgr.ID).Return(false) svc.connMgr.On("Connect", mock.IsType(feeds.ConnectOpts{})) svc.connMgr.On("Close") @@ -4675,7 +4675,7 @@ func Test_Service_StartStop(t *testing.T) { beforeFunc: func(svc *TestService) { svc.csaKeystore.On("EnsureKey", mock.Anything).Return(nil) svc.csaKeystore.On("GetAll").Return([]csakey.KeyV2{key}, nil) - svc.orm.On("ListManagers", mock.Anything).Return([]feeds.FeedsManager{mgr, mgr2}, nil) + svc.orm.On("ListManagers", mock.Anything).Return([]feeds.Manager{mgr, mgr2}, nil) svc.connMgr.On("IsConnected", mgr.ID).Return(false) svc.connMgr.On("IsConnected", mgr2.ID).Return(false) svc.connMgr.On("Connect", mock.IsType(feeds.ConnectOpts{})).Twice() @@ -4688,7 +4688,7 @@ func Test_Service_StartStop(t *testing.T) { beforeFunc: func(svc *TestService) { svc.csaKeystore.On("EnsureKey", mock.Anything).Return(nil) svc.csaKeystore.On("GetAll").Return([]csakey.KeyV2{key}, nil) - svc.orm.On("ListManagers", mock.Anything).Return([]feeds.FeedsManager{}, nil) + svc.orm.On("ListManagers", mock.Anything).Return([]feeds.Manager{}, nil) svc.connMgr.On("Close") }, }, diff --git a/core/services/headreporter/head_reporter.go b/core/services/headreporter/head_reporter.go index 9b85d547898..d601811f996 100644 --- a/core/services/headreporter/head_reporter.go +++ b/core/services/headreporter/head_reporter.go @@ -5,12 +5,12 @@ import ( "sync" "time" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox" "github.com/smartcontractkit/chainlink-evm/pkg/heads" "github.com/smartcontractkit/chainlink-evm/pkg/types" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) type ( @@ -19,7 +19,7 @@ type ( ReportPeriodic(ctx context.Context) error } - HeadReporterService struct { + Service struct { services.StateMachine ds sqlutil.DataSource lggr logger.Logger @@ -32,10 +32,10 @@ type ( } ) -func NewHeadReporterService(ds sqlutil.DataSource, lggr logger.Logger, reporters ...HeadReporter) *HeadReporterService { - return &HeadReporterService{ +func NewHeadReporterService(ds sqlutil.DataSource, lggr logger.Logger, reporters ...HeadReporter) *Service { + return &Service{ ds: ds, - lggr: lggr.Named("HeadReporter"), + lggr: logger.Named(lggr, "HeadReporter"), newHeads: mailbox.NewSingle[*types.Head](), chStop: make(chan struct{}), reporters: reporters, @@ -43,12 +43,12 @@ func NewHeadReporterService(ds sqlutil.DataSource, lggr logger.Logger, reporters } } -func (hrd *HeadReporterService) Subscribe(subFn func(heads.Trackable) (types.Head, func())) { +func (hrd *Service) Subscribe(subFn func(heads.Trackable) (types.Head, func())) { _, unsubscribe := subFn(hrd) hrd.unsubscribeFns = append(hrd.unsubscribeFns, unsubscribe) } -func (hrd *HeadReporterService) Start(context.Context) error { +func (hrd *Service) Start(context.Context) error { return hrd.StartOnce(hrd.Name(), func() error { hrd.wgDone.Add(1) go hrd.eventLoop() @@ -56,7 +56,7 @@ func (hrd *HeadReporterService) Start(context.Context) error { }) } -func (hrd *HeadReporterService) Close() error { +func (hrd *Service) Close() error { return hrd.StopOnce(hrd.Name(), func() error { close(hrd.chStop) hrd.wgDone.Wait() @@ -64,19 +64,19 @@ func (hrd *HeadReporterService) Close() error { }) } -func (hrd *HeadReporterService) Name() string { +func (hrd *Service) Name() string { return hrd.lggr.Name() } -func (hrd *HeadReporterService) HealthReport() map[string]error { +func (hrd *Service) HealthReport() map[string]error { return map[string]error{hrd.Name(): hrd.Healthy()} } -func (hrd *HeadReporterService) OnNewLongestChain(ctx context.Context, head *types.Head) { +func (hrd *Service) OnNewLongestChain(ctx context.Context, head *types.Head) { hrd.newHeads.Deliver(head) } -func (hrd *HeadReporterService) eventLoop() { +func (hrd *Service) eventLoop() { hrd.lggr.Debug("Starting event loop") defer hrd.wgDone.Done() ctx, cancel := hrd.chStop.NewCtx() diff --git a/core/services/headreporter/metrics_reporter.go b/core/services/headreporter/metrics_reporter.go index edbb9ee83c7..8d2d1e38d43 100644 --- a/core/services/headreporter/metrics_reporter.go +++ b/core/services/headreporter/metrics_reporter.go @@ -9,10 +9,10 @@ import ( chainselector "github.com/smartcontractkit/chain-selectors" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/loop" "github.com/smartcontractkit/chainlink-common/pkg/types" evmtypes "github.com/smartcontractkit/chainlink-evm/pkg/types" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/utils" ) @@ -49,7 +49,7 @@ type evmMetricsReporter struct { } func NewEVMMetricsReporter(metrics HeadMetrics, lggr logger.Logger, chainIDs ...*big.Int) HeadReporter { - lggr = lggr.Named("MetricsReporter") + lggr = logger.Named(lggr, "MetricsReporter") selectors := make(map[uint64]chainSelector, len(chainIDs)) for _, chainID := range chainIDs { selectors[chainID.Uint64()] = resolveChainSelector(lggr, chainID.String(), chainselector.FamilyEVM) @@ -98,7 +98,7 @@ func NewRelayerMetricsReporter(metrics HeadMetrics, lggr logger.Logger, relayers if relayers == nil { return nil } - lggr = lggr.Named("MetricsReporter") + lggr = logger.Named(lggr, "MetricsReporter") selectors := make(map[types.RelayID]chainSelector, len(relayers)) for relayID := range relayers { selectors[relayID] = resolveChainSelector(lggr, relayID.ChainID, relayID.Network) diff --git a/core/services/headreporter/telemetry_reporter.go b/core/services/headreporter/telemetry_reporter.go index 13f15883fe0..055f986da24 100644 --- a/core/services/headreporter/telemetry_reporter.go +++ b/core/services/headreporter/telemetry_reporter.go @@ -13,10 +13,10 @@ import ( "github.com/smartcontractkit/libocr/commontypes" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/loop" "github.com/smartcontractkit/chainlink-common/pkg/types" evmtypes "github.com/smartcontractkit/chainlink-evm/pkg/types" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/synchronization" "github.com/smartcontractkit/chainlink/v2/core/services/synchronization/telem" "github.com/smartcontractkit/chainlink/v2/core/services/telemetry" @@ -33,13 +33,13 @@ func NewLegacyEVMTelemetryReporter(monitoringEndpointGen telemetry.MonitoringEnd for _, chainID := range chainIDs { endpoints[chainID.Uint64()] = monitoringEndpointGen.GenMonitoringEndpoint("EVM", chainID.String(), "", synchronization.HeadReport) } - return &legacyEVMTelemetryReporter{lggr: lggr.Named("TelemetryReporter"), endpoints: endpoints} + return &legacyEVMTelemetryReporter{lggr: logger.Named(lggr, "TelemetryReporter"), endpoints: endpoints} } func (t *legacyEVMTelemetryReporter) ReportNewHead(ctx context.Context, head *evmtypes.Head) error { monitoringEndpoint := t.endpoints[head.EVMChainID.ToInt().Uint64()] if monitoringEndpoint == nil { - return fmt.Errorf("No monitoring endpoint provided chain_id=%d", head.EVMChainID.ToInt().Int64()) + return fmt.Errorf("no monitoring endpoint provided chain_id=%d", head.EVMChainID.ToInt().Int64()) } var finalized *telem.Block latestFinalizedHead := head.LatestFinalizedHead() @@ -90,7 +90,7 @@ func NewTelemetryReporter(monitoringEndpointGen telemetry.MonitoringEndpointGene for relayID := range relayers { endpoints[relayID] = monitoringEndpointGen.GenMonitoringEndpoint(relayID.Network, relayID.ChainID, "", synchronization.HeadReport) } - return &loopTelemetryReporter{lggr: lggr.Named("TelemetryReporter"), endpoints: endpoints, relays: relayers} + return &loopTelemetryReporter{lggr: logger.Named(lggr, "TelemetryReporter"), endpoints: endpoints, relays: relayers} } // ReportNewHead is unimplemented because there is no Headtracker to subscribe to diff --git a/core/services/headreporter/telemetry_reporter_test.go b/core/services/headreporter/telemetry_reporter_test.go index cca2f438a15..aefa0046ae0 100644 --- a/core/services/headreporter/telemetry_reporter_test.go +++ b/core/services/headreporter/telemetry_reporter_test.go @@ -113,7 +113,7 @@ func Test_EVMTelemetryReporter_NewHead_MissingEndpoint(t *testing.T) { head := evmtypes.Head{Number: 42, EVMChainID: sqlutil.NewI(100)} err := reporter.ReportNewHead(t.Context(), &head) - assert.Errorf(t, err, "No monitoring endpoint provided chain_id=100") + assert.Errorf(t, err, "no monitoring endpoint provided chain_id=100") } type mockRelayer struct { @@ -215,7 +215,7 @@ func Test_SolanaTelemetryReporter_ReportPeriodic_MissingEndpoint(t *testing.T) { reporter := headreporter.NewTelemetryReporter(monitoringEndpointGen, logger.TestLogger(t), solanaRelays) err := reporter.ReportPeriodic(t.Context()) - assert.Errorf(t, err, "No monitoring endpoint provided chain_id=testchain") + assert.Errorf(t, err, "no monitoring endpoint provided chain_id=testchain") } func Test_SolanaTelemetryReporter_ReportPeriodic_WithFinalizedHead(t *testing.T) { diff --git a/core/services/health.go b/core/services/health.go index a1defe270c5..f2b9f793e4e 100644 --- a/core/services/health.go +++ b/core/services/health.go @@ -8,8 +8,8 @@ import ( "github.com/pkg/errors" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) var _ Checker = (*services.HealthChecker)(nil) diff --git a/core/services/health_test.go b/core/services/health_test.go index 695b69492fd..68dfb2206f3 100644 --- a/core/services/health_test.go +++ b/core/services/health_test.go @@ -26,18 +26,21 @@ func TestNewStartUpHealthReport(t *testing.T) { require.NoError(t, err) res, err := http.DefaultClient.Do(req) require.NoError(t, err) + defer res.Body.Close() require.Equal(t, http.StatusNoContent, res.StatusCode) req, err = http.NewRequestWithContext(t.Context(), http.MethodGet, "http://localhost:1234/", nil) require.NoError(t, err) res, err = http.DefaultClient.Do(req) require.NoError(t, err) + defer res.Body.Close() require.Equal(t, http.StatusServiceUnavailable, res.StatusCode) req, err = http.NewRequestWithContext(t.Context(), http.MethodGet, "http://localhost:1234/unknown", nil) require.NoError(t, err) res, err = http.DefaultClient.Do(req) require.NoError(t, err) + defer res.Body.Close() require.Equal(t, http.StatusServiceUnavailable, res.StatusCode) }() diff --git a/core/services/llo/cleanup_test.go b/core/services/llo/cleanup_test.go index 8e69c6008ad..91382ddee9e 100644 --- a/core/services/llo/cleanup_test.go +++ b/core/services/llo/cleanup_test.go @@ -12,7 +12,6 @@ import ( "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3types" "github.com/smartcontractkit/libocr/offchainreporting2plus/types" - ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types" "github.com/smartcontractkit/chainlink-common/pkg/logger" llotypes "github.com/smartcontractkit/chainlink-common/pkg/types/llo" @@ -44,7 +43,7 @@ func makeSampleTransmission(seqNr uint64, sURL string) *mercurytransmitter.Trans ConfigDigest: types.ConfigDigest{0x0, 0x9, 0x57, 0xdd, 0x2f, 0x63, 0x56, 0x69, 0x34, 0xfd, 0xc2, 0xe1, 0xcd, 0xc1, 0xe, 0x3e, 0x25, 0xb9, 0x26, 0x5a, 0x16, 0x23, 0x91, 0xa6, 0x53, 0x16, 0x66, 0x59, 0x51, 0x0, 0x28, 0x7c}, SeqNr: seqNr, Report: ocr3types.ReportWithInfo[llotypes.ReportInfo]{ - Report: ocrtypes.Report{0x0, 0x3, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x66, 0xde, 0xf5, 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x66, 0xde, 0xf5, 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x8e, 0x95, 0xcf, 0xb5, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xd0, 0x1c, 0x67, 0xa9, 0xcf, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x66, 0xdf, 0x3, 0xca, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x1c, 0x93, 0x6d, 0xa4, 0xf2, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x14, 0x8d, 0x9a, 0xc1, 0xd9, 0x6f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x40, 0x5c, 0xcf, 0xa1, 0xbc, 0x63, 0xc0, 0x0}, + Report: types.Report{0x0, 0x3, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x66, 0xde, 0xf5, 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x66, 0xde, 0xf5, 0xba, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x8e, 0x95, 0xcf, 0xb5, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xd0, 0x1c, 0x67, 0xa9, 0xcf, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x66, 0xdf, 0x3, 0xca, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x1c, 0x93, 0x6d, 0xa4, 0xf2, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x14, 0x8d, 0x9a, 0xc1, 0xd9, 0x6f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0x40, 0x5c, 0xcf, 0xa1, 0xbc, 0x63, 0xc0, 0x0}, Info: llotypes.ReportInfo{ LifeCycleStage: llotypes.LifeCycleStage("production"), ReportFormat: llotypes.ReportFormatEVMPremiumLegacy, @@ -166,7 +165,6 @@ func Test_OrphanedTransmissionReaper(t *testing.T) { lggr := logger.Test(t) tr := &transmissionReaper{ds: ds, lggr: lggr, maxAge: 24 * time.Hour} ctx := t.Context() - const n = 13 pgtest.MustExec(t, ds, ` diff --git a/core/services/llo/delegate.go b/core/services/llo/delegate.go index 44374ef3768..14daafc4f53 100644 --- a/core/services/llo/delegate.go +++ b/core/services/llo/delegate.go @@ -26,7 +26,6 @@ import ( "github.com/smartcontractkit/chainlink-data-streams/llo/retirement" "github.com/smartcontractkit/chainlink-data-streams/llo/transmitter" llov30 "github.com/smartcontractkit/chainlink-data-streams/llo/v30" - corelogger "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/llo/observation" "github.com/smartcontractkit/chainlink/v2/core/services/llo/telem" @@ -113,10 +112,10 @@ func NewDelegate(cfg DelegateConfig) (job.ServiceCtx, error) { return nil, errors.New("DataSource must not be nil") } if cfg.Runner == nil { - return nil, errors.New("Runner must not be nil") + return nil, errors.New("runner must not be nil") } if cfg.Registry == nil { - return nil, errors.New("Registry must not be nil") + return nil, errors.New("registry must not be nil") } if cfg.RetirementReportCache == nil { return nil, errors.New("RetirementReportCache must not be nil") @@ -136,7 +135,7 @@ func NewDelegate(cfg DelegateConfig) (job.ServiceCtx, error) { if cfg.ReportingPluginConfig.VerboseLogging { codecLggr = logger.Named(lggr, "ReportCodecs") } else { - codecLggr = corelogger.NullLogger + codecLggr = logger.Nop() } reportCodecs := NewReportCodecs(codecLggr, cfg.DonID) diff --git a/core/services/llo/keyring.go b/core/services/llo/keyring.go index 85169e0a47c..3641707fbdd 100644 --- a/core/services/llo/keyring.go +++ b/core/services/llo/keyring.go @@ -9,7 +9,6 @@ import ( "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3types" "github.com/smartcontractkit/libocr/offchainreporting2plus/types" - ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types" "github.com/smartcontractkit/chainlink-common/pkg/logger" llotypes "github.com/smartcontractkit/chainlink-common/pkg/types/llo" @@ -17,21 +16,21 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/utils/crypto" ) -type LLOOnchainKeyring ocr3types.OnchainKeyring[llotypes.ReportInfo] +type OnchainKeyring ocr3types.OnchainKeyring[llotypes.ReportInfo] -var _ LLOOnchainKeyring = &onchainKeyring{} +var _ OnchainKeyring = &onchainKeyring{} type Key interface { // Legacy Sign/Verify methods needed for v0.3 report compatibility // New keys can leave these stubbed - Sign(reportCtx ocrtypes.ReportContext, report ocrtypes.Report) ([]byte, error) - Verify(publicKey ocrtypes.OnchainPublicKey, reportCtx ocrtypes.ReportContext, report ocrtypes.Report, signature []byte) bool + Sign(reportCtx types.ReportContext, report types.Report) ([]byte, error) + Verify(publicKey types.OnchainPublicKey, reportCtx types.ReportContext, report types.Report, signature []byte) bool - Sign3(digest ocrtypes.ConfigDigest, seqNr uint64, r ocrtypes.Report) (signature []byte, err error) - Verify3(publicKey ocrtypes.OnchainPublicKey, cd ocrtypes.ConfigDigest, seqNr uint64, r ocrtypes.Report, signature []byte) bool + Sign3(digest types.ConfigDigest, seqNr uint64, r types.Report) (signature []byte, err error) + Verify3(publicKey types.OnchainPublicKey, cd types.ConfigDigest, seqNr uint64, r types.Report, signature []byte) bool SignBlob(b []byte) (sig []byte, err error) - VerifyBlob(publicKey ocrtypes.OnchainPublicKey, b, sig []byte) bool - PublicKey() ocrtypes.OnchainPublicKey + VerifyBlob(publicKey types.OnchainPublicKey, b, sig []byte) bool + PublicKey() types.OnchainPublicKey MaxSignatureLength() int } @@ -41,7 +40,7 @@ type onchainKeyring struct { donID uint32 } -func NewOnchainKeyring(lggr logger.Logger, keys map[llotypes.ReportFormat]Key, donID uint32) LLOOnchainKeyring { +func NewOnchainKeyring(lggr logger.Logger, keys map[llotypes.ReportFormat]Key, donID uint32) OnchainKeyring { return &onchainKeyring{ logger.Sugared(lggr).Named("OnchainKeyring"), keys, donID, } @@ -52,7 +51,7 @@ func (okr *onchainKeyring) PublicKey() types.OnchainPublicKey { // byte string onchainPublicKey := []byte{} - keys := slices.AppendSeq(make([]Key, 0, len(okr.keys)), maps.Values(okr.keys)) + keys := slices.Collect(maps.Values(okr.keys)) if len(keys) == 0 { return onchainPublicKey } diff --git a/core/services/llo/keyring_test.go b/core/services/llo/keyring_test.go index bcc34ec0005..1d376ad494e 100644 --- a/core/services/llo/keyring_test.go +++ b/core/services/llo/keyring_test.go @@ -12,7 +12,6 @@ import ( "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3types" "github.com/smartcontractkit/libocr/offchainreporting2plus/types" - ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types" "github.com/smartcontractkit/chainlink-common/pkg/logger" llotypes "github.com/smartcontractkit/chainlink-common/pkg/types/llo" @@ -27,43 +26,38 @@ type mockKey struct { sig []byte } -func (m *mockKey) Sign(reportCtx ocrtypes.ReportContext, report ocrtypes.Report) ([]byte, error) { +func (m *mockKey) Sign(reportCtx types.ReportContext, report types.Report) ([]byte, error) { return m.sig, nil } -func (m *mockKey) Verify(publicKey ocrtypes.OnchainPublicKey, reportCtx ocrtypes.ReportContext, report ocrtypes.Report, signature []byte) bool { +func (m *mockKey) Verify(publicKey types.OnchainPublicKey, reportCtx types.ReportContext, report types.Report, signature []byte) bool { return m.verify } -func (m *mockKey) Sign3(digest ocrtypes.ConfigDigest, seqNr uint64, r ocrtypes.Report) (signature []byte, err error) { +func (m *mockKey) Sign3(digest types.ConfigDigest, seqNr uint64, r types.Report) (signature []byte, err error) { return m.sig, nil } -func (m *mockKey) Verify3(publicKey ocrtypes.OnchainPublicKey, cd ocrtypes.ConfigDigest, seqNr uint64, r ocrtypes.Report, signature []byte) bool { +func (m *mockKey) Verify3(publicKey types.OnchainPublicKey, cd types.ConfigDigest, seqNr uint64, r types.Report, signature []byte) bool { return m.verify } func (m *mockKey) SignBlob(b []byte) (sig []byte, err error) { return m.sig, nil } -func (m *mockKey) VerifyBlob(publicKey ocrtypes.OnchainPublicKey, b, sig []byte) bool { +func (m *mockKey) VerifyBlob(publicKey types.OnchainPublicKey, b, sig []byte) bool { return m.verify } -func (m *mockKey) PublicKey() ocrtypes.OnchainPublicKey { +func (m *mockKey) PublicKey() types.OnchainPublicKey { b := make([]byte, m.maxSignatureLen) for i := range m.maxSignatureLen { b[i] = byte(255) } - return ocrtypes.OnchainPublicKey(b) + return types.OnchainPublicKey(b) } func (m *mockKey) MaxSignatureLength() int { return m.maxSignatureLen } -func (m *mockKey) reset(format llotypes.ReportFormat) { - m.format = format - m.verify = false -} - func Test_Keyring(t *testing.T) { t.Parallel() lggr := logger.Test(t) @@ -90,7 +84,7 @@ func Test_Keyring(t *testing.T) { }, } - cd, err := ocrtypes.BytesToConfigDigest(mustRandBytes(32)) + cd, err := types.BytesToConfigDigest(mustRandBytes(32)) require.NoError(t, err) seqNr := rand.Uint64N(math.MaxUint32 << 8) t.Run("Sign+Verify", func(t *testing.T) { diff --git a/core/services/llo/observation/data_source_test.go b/core/services/llo/observation/data_source_test.go index 413275dd5ec..c565aa11cfc 100644 --- a/core/services/llo/observation/data_source_test.go +++ b/core/services/llo/observation/data_source_test.go @@ -545,7 +545,9 @@ func Test_DataSource(t *testing.T) { wg.Go(func() { vals := lloprotocol.StreamValues{1: nil} err := ds.Observe(ctx, vals, opts) - assert.NoError(t, err) + if !assert.NoError(t, err) { //nolint:testifylint // require illegal inside wg.Go goroutine + return + } assert.Equal(t, lloprotocol.StreamValues{1: lloprotocol.ToDecimal(decimal.NewFromInt(100))}, vals) }) } diff --git a/core/services/llo/observation/observation_context_test.go b/core/services/llo/observation/observation_context_test.go index c86bebbb02d..6cef36b2817 100644 --- a/core/services/llo/observation/observation_context_test.go +++ b/core/services/llo/observation/observation_context_test.go @@ -297,7 +297,7 @@ multiply3 [type=multiply times=1 streamID=3 index=2]; // force conversion t result1 -> multiply2; result2 -> result2_parse; -result3 -> result3_parse -> multiply3; +result3 -> result3_parse -> multiply3; `, }, } @@ -489,7 +489,7 @@ multiply3 [type=multiply times=1 streamID=%d index=2]; // force conversion result1 -> multiply2; result2 -> result2_parse; -result3 -> result3_parse -> multiply3; +result3 -> result3_parse -> multiply3; `, i+n, i+2*n, i+3*n), }, } diff --git a/core/services/llo/telem/sampling_test.go b/core/services/llo/telem/sampling_test.go index 6915e3ff858..0a6e693b430 100644 --- a/core/services/llo/telem/sampling_test.go +++ b/core/services/llo/telem/sampling_test.go @@ -20,8 +20,8 @@ import ( func TestFingerprint(t *testing.T) { t.Parallel() - observationTime := time.Now() - bytes32 := sha256.Sum256([]byte(observationTime.String())) + ot := time.Now() + bytes32 := sha256.Sum256([]byte(ot.String())) configDigest := bytes32[:] donID := uint32(2) streamID := uint32(123) @@ -41,11 +41,11 @@ func TestFingerprint(t *testing.T) { DonId: donID, StreamId: streamID, ConfigDigest: configDigest, - ObservationTimestamp: observationTime.UnixNano(), + ObservationTimestamp: ot.UnixNano(), }, typ: synchronization.LLOObservation, fingerprint: fmt.Sprintf("%d-%d-%x", donID, streamID, configDigest), - ts: int32(observationTime.Unix()), //nolint:gosec // G115 + ts: int32(ot.Unix()), //nolint:gosec // G115 err: nil, }, { @@ -53,11 +53,11 @@ func TestFingerprint(t *testing.T) { msg: &lloprotocol.LLOOutcomeTelemetry{ DonId: donID, ConfigDigest: configDigest, - ObservationTimestampNanoseconds: uint64(observationTime.UnixNano()), + ObservationTimestampNanoseconds: uint64(ot.UnixNano()), }, typ: synchronization.LLOOutcome, fingerprint: fmt.Sprintf("%d-%x", donID, configDigest), - ts: int32(observationTime.Unix()), //nolint:gosec // G115 + ts: int32(ot.Unix()), //nolint:gosec // G115 err: nil, }, { @@ -66,11 +66,11 @@ func TestFingerprint(t *testing.T) { DonId: donID, ChannelId: channelID, ConfigDigest: configDigest, - ObservationTimestampNanoseconds: uint64(observationTime.UnixNano()), + ObservationTimestampNanoseconds: uint64(ot.UnixNano()), }, typ: synchronization.LLOReport, fingerprint: fmt.Sprintf("%d-%d-%x", donID, channelID, configDigest), - ts: int32(observationTime.Unix()), //nolint:gosec // G115 + ts: int32(ot.Unix()), //nolint:gosec // G115 err: nil, }, { @@ -81,11 +81,11 @@ func TestFingerprint(t *testing.T) { SpecId: 345, BridgeAdapterName: "bridge-adapter", ConfigDigest: configDigest, - ObservationTimestamp: observationTime.UnixNano(), + ObservationTimestamp: ot.UnixNano(), }, typ: synchronization.PipelineBridge, fingerprint: fmt.Sprintf("%d-%d-%d-%s-%x", donID, streamID, 345, "bridge-adapter", configDigest), - ts: int32(observationTime.Unix()), //nolint:gosec // G115 + ts: int32(ot.Unix()), //nolint:gosec // G115 err: nil, }, { diff --git a/core/services/nodestatusreporter/bridgestatus/bridge_status_reporter.go b/core/services/nodestatusreporter/bridgestatus/bridge_status_reporter.go index 9d38e2f0eea..8baedbf9f5d 100644 --- a/core/services/nodestatusreporter/bridgestatus/bridge_status_reporter.go +++ b/core/services/nodestatusreporter/bridgestatus/bridge_status_reporter.go @@ -10,10 +10,10 @@ import ( "sync" "github.com/smartcontractkit/chainlink-common/pkg/beholder" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink/v2/core/bridges" "github.com/smartcontractkit/chainlink/v2/core/config" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/nodestatusreporter/bridgestatus/events" ) diff --git a/core/services/nodestatusreporter/bridgestatus/bridge_status_reporter_test.go b/core/services/nodestatusreporter/bridgestatus/bridge_status_reporter_test.go index afcf045779a..89975bac109 100644 --- a/core/services/nodestatusreporter/bridgestatus/bridge_status_reporter_test.go +++ b/core/services/nodestatusreporter/bridgestatus/bridge_status_reporter_test.go @@ -545,7 +545,7 @@ func TestService_PollAllBridges_3000Bridges(t *testing.T) { service, mockORM, jobORM, emitter := setupTestService(t, true, testPollingInterval, httpClient) numBridges := 3000 - var allBridges []bridges.BridgeType + allBridges := make([]bridges.BridgeType, 0, numBridges) for i := range numBridges { u, _ := url.Parse(fmt.Sprintf("http://bridge%d.example.com", i)) bridge := bridges.BridgeType{ @@ -589,7 +589,7 @@ func TestService_PollAllBridges_ContextTimeout(t *testing.T) { service, mockORM, jobORM, _ := setupTestService(t, true, testPollingInterval, httpClient) numBridges := 5 - var allBridges []bridges.BridgeType + allBridges := make([]bridges.BridgeType, 0, numBridges) for i := range numBridges { u, _ := url.Parse(fmt.Sprintf("http://bridge%d.example.com", i)) bridge := bridges.BridgeType{ diff --git a/core/services/nodestatusreporter/jobspec/job_spec_reporter.go b/core/services/nodestatusreporter/jobspec/job_spec_reporter.go index 43df99c280c..110d1bf6cbf 100644 --- a/core/services/nodestatusreporter/jobspec/job_spec_reporter.go +++ b/core/services/nodestatusreporter/jobspec/job_spec_reporter.go @@ -12,11 +12,11 @@ import ( "github.com/google/uuid" "github.com/smartcontractkit/chainlink-common/pkg/beholder" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" commontypes "github.com/smartcontractkit/chainlink-common/pkg/types" commonv1 "github.com/smartcontractkit/chainlink-protos/node-platform/common/v1" coreconfig "github.com/smartcontractkit/chainlink/v2/core/config" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/feeds" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/nodestatusreporter/jobspec/events" diff --git a/core/services/nurse.go b/core/services/nurse.go index 01fb59219fc..7cb4b5b2722 100644 --- a/core/services/nurse.go +++ b/core/services/nurse.go @@ -21,9 +21,9 @@ import ( "github.com/google/pprof/profile" commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-common/pkg/timeutil" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/utils" ) @@ -92,7 +92,7 @@ func (n *Nurse) start(_ context.Context) error { runtime.SetBlockProfileRate(n.cfg.BlockProfileRate()) runtime.SetMutexProfileFraction(n.cfg.MutexProfileFraction()) - err := utils.EnsureDirAndMaxPerms(n.cfg.ProfileRoot(), 0744) + err := utils.EnsureDirAndMaxPerms(n.cfg.ProfileRoot(), 0o744) if err != nil { return err } @@ -166,18 +166,26 @@ func (n *Nurse) checkGoroutines() (bool, Meta) { } } -func (n *Nurse) gatherVitals(reason string, meta Meta) { - loggerFields := (logger.Fields{"reason": reason}).Merge(logger.Fields(meta)) +func metaFields(reason string, meta Meta, extra ...any) []any { + fields := make([]any, 0, 2+len(meta)*2+len(extra)) + fields = append(fields, "reason", reason) + for k, v := range meta { + fields = append(fields, k, v) + } + fields = append(fields, extra...) + return fields +} - n.eng.Debugw("Nurse is gathering vitals", loggerFields.Slice()...) +func (n *Nurse) gatherVitals(reason string, meta Meta) { + n.eng.Debugw("Nurse is gathering vitals", metaFields(reason, meta)...) size, err := n.totalProfileBytes() if err != nil { - n.eng.Errorw("could not fetch total profile bytes", loggerFields.With("err", err).Slice()...) + n.eng.Errorw("could not fetch total profile bytes", metaFields(reason, meta, "err", err)...) return } else if size >= uint64(n.cfg.MaxProfileSize()) { n.eng.Warnw("cannot write pprof profile, total profile size exceeds configured PPROF_MAX_PROFILE_SIZE", - loggerFields.With("total", size, "max", n.cfg.MaxProfileSize()).Slice()..., + metaFields(reason, meta, "total", size, "max", n.cfg.MaxProfileSize())..., ) return } @@ -186,7 +194,7 @@ func (n *Nurse) gatherVitals(reason string, meta Meta) { err = n.appendLog(now, reason, meta) if err != nil { - n.eng.Warnw("cannot write pprof profile", loggerFields.With("err", err).Slice()...) + n.eng.Warnw("cannot write pprof profile", metaFields(reason, meta, "err", err)...) return } var wg sync.WaitGroup @@ -232,7 +240,6 @@ func (n *Nurse) appendLog(now time.Time, reason string, meta Meta) error { n.eng.Debugf("creating nurse log %s", filename) file, err := os.Create(filename) - if err != nil { return err } @@ -434,20 +441,23 @@ func (n *Nurse) totalProfileBytes() (uint64, error) { if err != nil { return 0, err } - var size int64 + var size uint64 for _, p := range profiles { - size += p.Size() + sz := p.Size() + if sz < 0 { + return 0, errors.New("negative profile size encountered") + } + size += uint64(sz) } if size > math.MaxInt64 { return 0, errors.New("total profile size overflows int64") } - return uint64(size), nil + return size, nil } func (n *Nurse) listProfiles() ([]fs.FileInfo, error) { out := make([]fs.FileInfo, 0) entries, err := os.ReadDir(n.cfg.ProfileRoot()) - if err != nil { return nil, err } diff --git a/core/services/nurse_test.go b/core/services/nurse_test.go index 252a87522d5..16cc6a407c6 100644 --- a/core/services/nurse_test.go +++ b/core/services/nurse_test.go @@ -10,8 +10,8 @@ import ( "github.com/stretchr/testify/require" commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/utils" ) @@ -102,7 +102,7 @@ func TestNurse(t *testing.T) { t.Skip("too slow for testing.Short") } - l := logger.TestLogger(t) + l := logger.Test(t) nrse := NewNurse(newMockConfig(t), l) nrse.AddCheck("test", func() (bool, Meta) { return true, Meta{} }) diff --git a/core/services/ocr/config_overrider.go b/core/services/ocr/config_overrider.go index 1e91d116cd9..cf9a92be771 100644 --- a/core/services/ocr/config_overrider.go +++ b/core/services/ocr/config_overrider.go @@ -12,9 +12,9 @@ import ( ocrtypes "github.com/smartcontractkit/libocr/offchainreporting/types" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-evm/pkg/types" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/utils" ) @@ -58,7 +58,7 @@ func NewConfigOverriderImpl( addressBig := contractAddress.Big() jitterSeconds := int64(cfg.DeltaCJitterOverride() / time.Second) - addressSeconds := addressBig.Mod(addressBig, big.NewInt(jitterSeconds)).Uint64() + addressSeconds := addressBig.Mod(addressBig, big.NewInt(jitterSeconds)).Int64() deltaC := cfg.DeltaCOverride() + time.Duration(addressSeconds)*time.Second co := ConfigOverriderImpl{ @@ -91,7 +91,7 @@ func (c *ConfigOverriderImpl) Start(context.Context) error { } func (c *ConfigOverriderImpl) Close() error { - return c.StopOnce("OCRContractTracker", func() error { + return c.StopOnce("ContractTracker", func() error { close(c.chStop) <-c.chDone return nil diff --git a/core/services/ocr/contract_config_subscription.go b/core/services/ocr/contract_config_subscription.go index 9aaea3c3ec3..af7f006c2d4 100644 --- a/core/services/ocr/contract_config_subscription.go +++ b/core/services/ocr/contract_config_subscription.go @@ -4,18 +4,18 @@ import ( ocrtypes "github.com/smartcontractkit/libocr/offchainreporting/types" ) -var _ ocrtypes.ContractConfigSubscription = &OCRContractConfigSubscription{} +var _ ocrtypes.ContractConfigSubscription = &ContractConfigSubscription{} -// OCRContractConfigSubscription only exists to comply with the +// ContractConfigSubscription only exists to comply with the // ContractConfigSubscription interface, it's just a simple shell around -// OCRContractTracker that defines two methods -type OCRContractConfigSubscription OCRContractTracker +// ContractTracker that defines two methods +type ContractConfigSubscription ContractTracker // Configs complies with ContractConfigSubscription interface -func (sub *OCRContractConfigSubscription) Configs() <-chan ocrtypes.ContractConfig { +func (sub *ContractConfigSubscription) Configs() <-chan ocrtypes.ContractConfig { return sub.chConfigs } // Close is a no-op since Subscribing/Unsubscribing is handled in the -// Start/Close methods of the OCRContractTracker -func (sub *OCRContractConfigSubscription) Close() {} +// Start/Close methods of the ContractTracker +func (sub *ContractConfigSubscription) Close() {} diff --git a/core/services/ocr/contract_tracker.go b/core/services/ocr/contract_tracker.go index 1afaf379c96..b13c9b9ba93 100644 --- a/core/services/ocr/contract_tracker.go +++ b/core/services/ocr/contract_tracker.go @@ -18,6 +18,7 @@ import ( "github.com/smartcontractkit/libocr/offchainreporting/confighelper" ocrtypes "github.com/smartcontractkit/libocr/offchainreporting/types" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox" @@ -28,7 +29,6 @@ import ( "github.com/smartcontractkit/chainlink-evm/pkg/heads" "github.com/smartcontractkit/chainlink-evm/pkg/log" evmtypes "github.com/smartcontractkit/chainlink-evm/pkg/types" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon" ) @@ -39,18 +39,18 @@ import ( const configMailboxSanityLimit = 100 var ( - _ ocrtypes.ContractConfigTracker = &OCRContractTracker{} - _ log.Listener = &OCRContractTracker{} - _ heads.Trackable = &OCRContractTracker{} + _ ocrtypes.ContractConfigTracker = &ContractTracker{} + _ log.Listener = &ContractTracker{} + _ heads.Trackable = &ContractTracker{} OCRContractConfigSet = getEventTopic("ConfigSet") OCRContractLatestRoundRequested = getEventTopic("RoundRequested") ) type ( - // OCRContractTracker complies with ContractConfigTracker interface and + // ContractTracker complies with ContractConfigTracker interface and // handles log events related to the contract more generally - OCRContractTracker struct { + ContractTracker struct { services.StateMachine ethClient evmclient.Client @@ -59,8 +59,8 @@ type ( contractCaller *offchainaggregator.OffchainAggregatorCaller logBroadcaster log.Broadcaster jobID int32 - logger logger.Logger - ocrDB OCRContractTrackerDB + logger logger.SugaredLogger + ocrDB ContractTrackerDB ds sqlutil.DataSource blockTranslator block.BlockTranslator cfg ocrcommon.Config @@ -88,20 +88,23 @@ type ( latestBlockHeightMu sync.RWMutex } - OCRContractTrackerDB interface { + ContractTrackerDB interface { SaveLatestRoundRequested(ctx context.Context, rr offchainaggregator.OffchainAggregatorRoundRequested) error LoadLatestRoundRequested(ctx context.Context) (rr offchainaggregator.OffchainAggregatorRoundRequested, err error) - WithDataSource(sqlutil.DataSource) OCRContractTrackerDB + WithDataSource(sqlutil.DataSource) ContractTrackerDB } + + OCRContractTrackerDB = ContractTrackerDB //nolint:revive // alias needed for backward compatibility + OCRContractTracker = ContractTracker //nolint:revive // alias needed for backward compatibility ) -func (t *OCRContractTracker) HealthReport() map[string]error { +func (t *ContractTracker) HealthReport() map[string]error { return map[string]error{t.Name(): t.Healthy()} } -func (t *OCRContractTracker) Name() string { return t.logger.Name() } +func (t *ContractTracker) Name() string { return t.logger.Name() } -// NewOCRContractTracker makes a new OCRContractTracker +// NewOCRContractTracker makes a new ContractTracker func NewOCRContractTracker( contract *offchain_aggregator_wrapper.OffchainAggregator, contractFilterer *offchainaggregator.OffchainAggregatorFilterer, @@ -109,25 +112,24 @@ func NewOCRContractTracker( ethClient evmclient.Client, logBroadcaster log.Broadcaster, jobID int32, - logger logger.Logger, + lggr logger.Logger, ds sqlutil.DataSource, - ocrDB OCRContractTrackerDB, + ocrDB ContractTrackerDB, cfg ocrcommon.Config, headBroadcaster heads.Broadcaster, mailMon *mailbox.Monitor, -) (o *OCRContractTracker) { - logger = logger.Named("OCRContractTracker") - return &OCRContractTracker{ +) (o *ContractTracker) { + return &ContractTracker{ ethClient: ethClient, contract: contract, contractFilterer: contractFilterer, contractCaller: contractCaller, logBroadcaster: logBroadcaster, jobID: jobID, - logger: logger, + logger: logger.Sugared(lggr).Named("ContractTracker"), ocrDB: ocrDB, ds: ds, - blockTranslator: block.NewBlockTranslator(cfg.ChainType(), ethClient, logger), + blockTranslator: block.NewBlockTranslator(cfg.ChainType(), ethClient, lggr), cfg: cfg, mailMon: mailMon, headBroadcaster: headBroadcaster, @@ -141,11 +143,11 @@ func NewOCRContractTracker( // Start must be called before logs can be delivered // It ought to be called before starting OCR -func (t *OCRContractTracker) Start(ctx context.Context) error { - return t.StartOnce("OCRContractTracker", func() (err error) { +func (t *ContractTracker) Start(ctx context.Context) error { + return t.StartOnce("ContractTracker", func() (err error) { t.latestRoundRequested, err = t.ocrDB.LoadLatestRoundRequested(ctx) if err != nil { - return errors.Wrap(err, "OCRContractTracker#Start: failed to load latest round requested") + return errors.Wrap(err, "ContractTracker#Start: failed to load latest round requested") } t.unsubscribeLogs = t.logBroadcaster.Register(t, log.ListenerOpts{ @@ -167,15 +169,15 @@ func (t *OCRContractTracker) Start(ctx context.Context) error { t.wg.Add(1) go t.processLogs() - t.mailMon.Monitor(t.configsMB, "OCRContractTracker", "Configs", strconv.Itoa(int(t.jobID))) + t.mailMon.Monitor(t.configsMB, "ContractTracker", "Configs", strconv.Itoa(int(t.jobID))) return nil }) } // Close should be called after teardown of the OCR job relying on this tracker -func (t *OCRContractTracker) Close() error { - return t.StopOnce("OCRContractTracker", func() error { +func (t *ContractTracker) Close() error { + return t.StopOnce("ContractTracker", func() error { close(t.chStop) t.wg.Wait() t.unsubscribeHeads() @@ -186,11 +188,11 @@ func (t *OCRContractTracker) Close() error { } // OnNewLongestChain conformed to HeadTrackable and updates latestBlockHeight -func (t *OCRContractTracker) OnNewLongestChain(_ context.Context, h *evmtypes.Head) { +func (t *ContractTracker) OnNewLongestChain(_ context.Context, h *evmtypes.Head) { t.setLatestBlockHeight(h) } -func (t *OCRContractTracker) setLatestBlockHeight(h *evmtypes.Head) { +func (t *ContractTracker) setLatestBlockHeight(h *evmtypes.Head) { var num int64 if h.L1BlockNumber.Valid { num = h.L1BlockNumber.Int64 @@ -204,13 +206,13 @@ func (t *OCRContractTracker) setLatestBlockHeight(h *evmtypes.Head) { } } -func (t *OCRContractTracker) getLatestBlockHeight() int64 { +func (t *ContractTracker) getLatestBlockHeight() int64 { t.latestBlockHeightMu.RLock() defer t.latestBlockHeightMu.RUnlock() return t.latestBlockHeight } -func (t *OCRContractTracker) processLogs() { +func (t *ContractTracker) processLogs() { defer t.wg.Done() for { select { @@ -237,7 +239,7 @@ func (t *OCRContractTracker) processLogs() { // HandleLog complies with LogListener interface // It is not thread safe -func (t *OCRContractTracker) HandleLog(ctx context.Context, lb log.Broadcast) { +func (t *ContractTracker) HandleLog(ctx context.Context, lb log.Broadcast) { was, err := t.logBroadcaster.WasAlreadyConsumed(ctx, lb) if err != nil { t.logger.Errorw("could not determine if log was already consumed", "err", err) @@ -322,24 +324,24 @@ func (t *OCRContractTracker) HandleLog(ctx context.Context, lb log.Broadcast) { // IsLaterThan returns true if the first log was emitted "after" the second log // from the blockchain's point of view -func IsLaterThan(incoming gethTypes.Log, existing gethTypes.Log) bool { +func IsLaterThan(incoming, existing gethTypes.Log) bool { return incoming.BlockNumber > existing.BlockNumber || (incoming.BlockNumber == existing.BlockNumber && incoming.TxIndex > existing.TxIndex) || (incoming.BlockNumber == existing.BlockNumber && incoming.TxIndex == existing.TxIndex && incoming.Index > existing.Index) } // JobID complies with LogListener interface -func (t *OCRContractTracker) JobID() int32 { +func (t *ContractTracker) JobID() int32 { return t.jobID } // SubscribeToNewConfigs returns the tracker aliased as a ContractConfigSubscription -func (t *OCRContractTracker) SubscribeToNewConfigs(context.Context) (ocrtypes.ContractConfigSubscription, error) { - return (*OCRContractConfigSubscription)(t), nil +func (t *ContractTracker) SubscribeToNewConfigs(context.Context) (ocrtypes.ContractConfigSubscription, error) { + return (*ContractConfigSubscription)(t), nil } // LatestConfigDetails queries the eth node -func (t *OCRContractTracker) LatestConfigDetails(ctx context.Context) (changedInBlock uint64, configDigest ocrtypes.ConfigDigest, err error) { +func (t *ContractTracker) LatestConfigDetails(ctx context.Context) (changedInBlock uint64, configDigest ocrtypes.ConfigDigest, err error) { var cancel context.CancelFunc ctx, cancel = t.chStop.Ctx(ctx) defer cancel() @@ -357,7 +359,7 @@ func (t *OCRContractTracker) LatestConfigDetails(ctx context.Context) (changedIn } // ConfigFromLogs queries the eth node for logs for this contract -func (t *OCRContractTracker) ConfigFromLogs(ctx context.Context, changedInBlock uint64) (c ocrtypes.ContractConfig, err error) { +func (t *ContractTracker) ConfigFromLogs(ctx context.Context, changedInBlock uint64) (c ocrtypes.ContractConfig, err error) { fromBlock, toBlock := t.blockTranslator.NumberToQueryRange(ctx, changedInBlock) q := ethereum.FilterQuery{ FromBlock: fromBlock, @@ -392,14 +394,14 @@ func (t *OCRContractTracker) ConfigFromLogs(ctx context.Context, changedInBlock } // LatestBlockHeight queries the eth node for the most recent header -func (t *OCRContractTracker) LatestBlockHeight(ctx context.Context) (blockheight uint64, err error) { +func (t *ContractTracker) LatestBlockHeight(ctx context.Context) (blockheight uint64, err error) { switch t.cfg.ChainType() { case chaintype.ChainMetis: // We skip confirmation checking anyway on these L2s so there's no need to // care about the block height; we have no way of getting the L1 block // height anyway return 0, nil - case "", chaintype.ChainArbitrum, chaintype.ChainAstar, chaintype.ChainCelo, chaintype.ChainGnosis, chaintype.ChainHedera, chaintype.ChainKroma, chaintype.ChainOptimismBedrock, chaintype.ChainSei, chaintype.ChainScroll, chaintype.ChainWeMix, chaintype.ChainXLayer, chaintype.ChainZkEvm, chaintype.ChainZkSync, chaintype.ChainZircuit, chaintype.ChainRootstock, chaintype.ChainPharos: + case "", chaintype.ChainArbitrum, chaintype.ChainAstar, chaintype.ChainCelo, chaintype.ChainGnosis, chaintype.ChainHedera, chaintype.ChainKroma, chaintype.ChainOptimismBedrock, chaintype.ChainSei, chaintype.ChainScroll, chaintype.ChainWeMix, chaintype.ChainXLayer, chaintype.ChainZkEvm, chaintype.ChainZkSync, chaintype.ChainZircuit, chaintype.ChainRootstock, chaintype.ChainPharos, chaintype.ChainMantle, chaintype.ChainTron, chaintype.ChainJovay: // continue } latestBlockHeight := t.getLatestBlockHeight() @@ -422,10 +424,10 @@ func (t *OCRContractTracker) LatestBlockHeight(ctx context.Context) (blockheight } if h.L1BlockNumber.Valid { - return uint64(h.L1BlockNumber.Int64), nil + return uint64(h.L1BlockNumber.Int64), nil //nolint:gosec // G115: L1 block height is non-negative } - return uint64(h.Number), nil + return uint64(h.Number), nil //nolint:gosec // G115: block height is non-negative } // LatestRoundRequested returns the configDigest, epoch, and round from the latest @@ -439,7 +441,7 @@ func (t *OCRContractTracker) LatestBlockHeight(ctx context.Context) (blockheight // // As an optimization, this function may also return zero values, if no // RoundRequested event has been emitted after the latest NewTransmission event. -func (t *OCRContractTracker) LatestRoundRequested(_ context.Context, lookback time.Duration) (configDigest ocrtypes.ConfigDigest, epoch uint32, round uint8, err error) { +func (t *ContractTracker) LatestRoundRequested(_ context.Context, lookback time.Duration) (configDigest ocrtypes.ConfigDigest, epoch uint32, round uint8, err error) { // NOTE: This should be "good enough" 99% of the time. // It guarantees validity up to `EVM.BlockBackfillDepth` blocks ago // Some further improvements could be made: diff --git a/core/services/ocr/contract_tracker_test.go b/core/services/ocr/contract_tracker_test.go index 74a1f9f7630..f697bb72195 100644 --- a/core/services/ocr/contract_tracker_test.go +++ b/core/services/ocr/contract_tracker_test.go @@ -5,7 +5,6 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" - gethCommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/pkg/errors" "github.com/stretchr/testify/assert" @@ -32,7 +31,7 @@ import ( ocrmocks "github.com/smartcontractkit/chainlink/v2/core/services/ocr/mocks" ) -func mustNewContract(t *testing.T, address gethCommon.Address) *offchain_aggregator_wrapper.OffchainAggregator { +func mustNewContract(t *testing.T, address common.Address) *offchain_aggregator_wrapper.OffchainAggregator { contract, err := offchain_aggregator_wrapper.NewOffchainAggregator(address, nil) require.NoError(t, err) return contract @@ -49,7 +48,7 @@ type contractTrackerUni struct { lb *logmocks.Broadcaster hb *headstest.Broadcaster[*evmtypes.Head, common.Hash] ec *clienttest.Client - tracker *ocr.OCRContractTracker + tracker *ocr.ContractTracker } func newContractTrackerUni(t *testing.T, opts ...any) (uni contractTrackerUni) { @@ -76,7 +75,7 @@ func newContractTrackerUni(t *testing.T, opts ...any) (uni contractTrackerUni) { uni.db = ocrmocks.NewOCRContractTrackerDB(t) uni.lb = logmocks.NewBroadcaster(t) uni.hb = headstest.NewBroadcaster[*evmtypes.Head, common.Hash](t) - uni.ec = evmtest.NewEthClientMock(t) + uni.ec = clienttest.NewClient(t) mailMon := servicetest.Run(t, mailboxtest.NewMonitor(t)) db := pgtest.NewSqlxDB(t) @@ -116,7 +115,7 @@ func Test_OCRContractTracker_LatestBlockHeight(t *testing.T) { uni.ec.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(nil, nil).Once() _, err := uni.tracker.LatestBlockHeight(t.Context()) - assert.EqualError(t, err, "got nil head") + require.EqualError(t, err, "got nil head") uni.ec.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(nil, errors.New("bar")).Once() @@ -154,7 +153,7 @@ func Test_OCRContractTracker_LatestBlockHeight(t *testing.T) { func Test_OCRContractTracker_HandleLog_OCRContractLatestRoundRequested(t *testing.T) { t.Parallel() - fixtureLogAddress := gethCommon.HexToAddress("0x03bd0d5d39629423979f8a0e53dbce78c1791ebf") + fixtureLogAddress := common.HexToAddress("0x03bd0d5d39629423979f8a0e53dbce78c1791ebf") fixtureFilterer := mustNewFilterer(t) fixtureContract := mustNewContract(t, fixtureLogAddress) @@ -332,7 +331,7 @@ func Test_OCRContractTracker_HandleLog_OCRContractLatestRoundRequested(t *testin configDigest, epoch, round, err := uni.tracker.LatestRoundRequested(t.Context(), 0) require.NoError(t, err) - assert.Equal(t, (ocrtypes.ConfigDigest)(rr.ConfigDigest).Hex(), configDigest.Hex()) + assert.Equal(t, ocrtypes.ConfigDigest(rr.ConfigDigest).Hex(), configDigest.Hex()) assert.Equal(t, rr.Epoch, epoch) assert.Equal(t, rr.Round, round) diff --git a/core/services/ocr/contract_transmitter.go b/core/services/ocr/contract_transmitter.go index cdf0ce73281..ecf94de2645 100644 --- a/core/services/ocr/contract_transmitter.go +++ b/core/services/ocr/contract_transmitter.go @@ -17,17 +17,15 @@ import ( "github.com/smartcontractkit/chainlink-evm/pkg/transmitter/ocr" ) -var ( - _ ocrtypes.ContractTransmitter = &OCRContractTransmitter{} -) +var _ ocrtypes.ContractTransmitter = &ContractTransmitter{} type ( - OCRContractTransmitter struct { + ContractTransmitter struct { contractAddress gethCommon.Address contractABI abi.ABI transmitter ocr.Transmitter contractCaller *offchainaggregator.OffchainAggregatorCaller - tracker *OCRContractTracker + tracker *ContractTracker chainID *big.Int effectiveTransmitterAddress gethCommon.Address } @@ -39,11 +37,11 @@ func NewOCRContractTransmitter( contractABI abi.ABI, transmitter ocr.Transmitter, logBroadcaster log.Broadcaster, - tracker *OCRContractTracker, + tracker *ContractTracker, chainID *big.Int, effectiveTransmitterAddress gethCommon.Address, -) *OCRContractTransmitter { - return &OCRContractTransmitter{ +) *ContractTransmitter { + return &ContractTransmitter{ contractAddress: address, contractABI: contractABI, transmitter: transmitter, @@ -54,7 +52,7 @@ func NewOCRContractTransmitter( } } -func (oc *OCRContractTransmitter) Transmit(ctx context.Context, report []byte, rs, ss [][32]byte, vs [32]byte) error { +func (oc *ContractTransmitter) Transmit(ctx context.Context, report []byte, rs, ss [][32]byte, vs [32]byte) error { payload, err := oc.contractABI.Pack("transmit", report, rs, ss, vs) if err != nil { return errors.Wrap(err, "abi.Pack failed") @@ -63,20 +61,20 @@ func (oc *OCRContractTransmitter) Transmit(ctx context.Context, report []byte, r return errors.Wrap(oc.transmitter.CreateEthTransaction(ctx, oc.contractAddress, payload, nil), "failed to send Eth transaction") } -func (oc *OCRContractTransmitter) LatestTransmissionDetails(ctx context.Context) (configDigest ocrtypes.ConfigDigest, epoch uint32, round uint8, latestAnswer ocrtypes.Observation, latestTimestamp time.Time, err error) { +func (oc *ContractTransmitter) LatestTransmissionDetails(ctx context.Context) (configDigest ocrtypes.ConfigDigest, epoch uint32, round uint8, latestAnswer ocrtypes.Observation, latestTimestamp time.Time, err error) { opts := bind.CallOpts{Context: ctx, Pending: false} result, err := oc.contractCaller.LatestTransmissionDetails(&opts) if err != nil { return configDigest, 0, 0, ocrtypes.Observation(nil), time.Time{}, errors.Wrap(err, "error getting LatestTransmissionDetails") } - return result.ConfigDigest, result.Epoch, result.Round, ocrtypes.Observation(result.LatestAnswer), time.Unix(int64(result.LatestTimestamp), 0), nil + return result.ConfigDigest, result.Epoch, result.Round, ocrtypes.Observation(result.LatestAnswer), time.Unix(int64(result.LatestTimestamp), 0), nil //nolint:gosec // G115: unix timestamp fits int64 } -func (oc *OCRContractTransmitter) FromAddress() gethCommon.Address { +func (oc *ContractTransmitter) FromAddress() gethCommon.Address { return oc.effectiveTransmitterAddress } -func (oc *OCRContractTransmitter) ChainID() *big.Int { +func (oc *ContractTransmitter) ChainID() *big.Int { return oc.chainID } @@ -91,6 +89,6 @@ func (oc *OCRContractTransmitter) ChainID() *big.Int { // // As an optimization, this function may also return zero values, if no // RoundRequested event has been emitted after the latest NewTransmission event. -func (oc *OCRContractTransmitter) LatestRoundRequested(ctx context.Context, lookback time.Duration) (configDigest ocrtypes.ConfigDigest, epoch uint32, round uint8, err error) { +func (oc *ContractTransmitter) LatestRoundRequested(ctx context.Context, lookback time.Duration) (configDigest ocrtypes.ConfigDigest, epoch uint32, round uint8, err error) { return oc.tracker.LatestRoundRequested(ctx, lookback) } diff --git a/core/services/ocr/database.go b/core/services/ocr/database.go index 0f5bee4cf3d..d4c807faf7e 100644 --- a/core/services/ocr/database.go +++ b/core/services/ocr/database.go @@ -14,8 +14,8 @@ import ( "github.com/smartcontractkit/libocr/gethwrappers/offchainaggregator" ocrtypes "github.com/smartcontractkit/libocr/offchainreporting/types" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) type db struct { @@ -25,8 +25,8 @@ type db struct { } var ( - _ ocrtypes.Database = &db{} - _ OCRContractTrackerDB = &db{} + _ ocrtypes.Database = &db{} + _ ContractTrackerDB = &db{} ) // NewDB returns a new DB scoped to this oracleSpecID @@ -38,7 +38,7 @@ func NewDB(ds sqlutil.DataSource, oracleSpecID int32, lggr logger.Logger) *db { } } -func (d *db) WithDataSource(ds sqlutil.DataSource) OCRContractTrackerDB { +func (d *db) WithDataSource(ds sqlutil.DataSource) ContractTrackerDB { return NewDB(ds, d.oracleSpecID, d.lggr) } @@ -62,17 +62,17 @@ func (d *db) ReadState(ctx context.Context, cd ocrtypes.ConfigDigest) (ps *ocrty return nil, errors.Wrap(err, "ReadState failed") } - ps.HighestSentEpoch = uint32(highestSentEpochTmp) + ps.HighestSentEpoch = uint32(highestSentEpochTmp) //nolint:gosec // G115: epoch is a uint32 persisted as int64 for _, v := range tmp { - ps.HighestReceivedEpoch = append(ps.HighestReceivedEpoch, uint32(v)) + ps.HighestReceivedEpoch = append(ps.HighestReceivedEpoch, uint32(v)) //nolint:gosec // G115: epoch is a uint32 persisted as int64 } return ps, nil } func (d *db) WriteState(ctx context.Context, cd ocrtypes.ConfigDigest, state ocrtypes.PersistentState) error { - var highestReceivedEpoch []int64 + highestReceivedEpoch := make([]int64, 0, len(state.HighestReceivedEpoch)) for _, v := range state.HighestReceivedEpoch { highestReceivedEpoch = append(highestReceivedEpoch, int64(v)) } @@ -137,8 +137,8 @@ func (d *db) ReadConfig(ctx context.Context) (c *ocrtypes.ContractConfig, err er } func (d *db) WriteConfig(ctx context.Context, c ocrtypes.ContractConfig) error { - var signers [][]byte - var transmitters [][]byte + signers := make([][]byte, 0, len(c.Signers)) + transmitters := make([][]byte, 0, len(c.Transmitters)) for _, s := range c.Signers { signers = append(signers, s.Bytes()) } @@ -157,15 +157,15 @@ func (d *db) WriteConfig(ctx context.Context, c ocrtypes.ContractConfig) error { encoded = EXCLUDED.encoded, updated_at = NOW() ` - _, err := d.ds.ExecContext(ctx, stmt, d.oracleSpecID, c.ConfigDigest, pq.ByteaArray(signers), pq.ByteaArray(transmitters), c.Threshold, int(c.EncodedConfigVersion), c.Encoded) + _, err := d.ds.ExecContext(ctx, stmt, d.oracleSpecID, c.ConfigDigest, pq.ByteaArray(signers), pq.ByteaArray(transmitters), c.Threshold, int(c.EncodedConfigVersion), c.Encoded) //nolint:gosec // G115: encoded config version is a small non-negative value return errors.Wrap(err, "WriteConfig failed") } func (d *db) StorePendingTransmission(ctx context.Context, k ocrtypes.ReportTimestamp, p ocrtypes.PendingTransmission) error { median := sqlutil.New(p.Median) - var rs [][]byte - var ss [][]byte + rs := make([][]byte, 0, len(p.Rs)) + ss := make([][]byte, 0, len(p.Ss)) // Note: p.Rs and p.Ss are of type [][32]byte. // See last example of https://github.com/golang/go/wiki/CommonMistakes#using-reference-to-loop-iterator-variable for _, v := range p.Rs { diff --git a/core/services/ocr/delegate.go b/core/services/ocr/delegate.go index a9c84f561d3..a9932c6f1a6 100644 --- a/core/services/ocr/delegate.go +++ b/core/services/ocr/delegate.go @@ -15,6 +15,7 @@ import ( ocr "github.com/smartcontractkit/libocr/offchainreporting" ocrtypes "github.com/smartcontractkit/libocr/offchainreporting/types" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox" "github.com/smartcontractkit/chainlink-evm/gethwrappers/offchainaggregator/generated/ocr/offchain_aggregator_wrapper" @@ -24,7 +25,6 @@ import ( "github.com/smartcontractkit/chainlink-evm/pkg/txmgr" "github.com/smartcontractkit/chainlink-evm/pkg/types" txmgrcommon "github.com/smartcontractkit/chainlink-framework/chains/txmgr" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/keystore" "github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon" @@ -43,7 +43,7 @@ type Delegate struct { peerWrapper *ocrcommon.SingletonPeerWrapper monitoringEndpointGen telemetry.MonitoringEndpointGenerator legacyChains legacyevm.LegacyChainContainer - lggr logger.Logger + lggr logger.SugaredLogger cfg Config mailMon *mailbox.Monitor } @@ -74,7 +74,7 @@ func NewDelegate( peerWrapper: peerWrapper, monitoringEndpointGen: monitoringEndpointGen, legacyChains: legacyChains, - lggr: lggr.Named("OCR"), + lggr: logger.Sugared(logger.Named(lggr, "OCR")), cfg: cfg, mailMon: mailMon, } @@ -110,7 +110,8 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) (services [] "contractAddress", concreteSpec.ContractAddress, "jobName", jb.Name.ValueOrZero(), "jobID", jb.ID, - "externalJobID", jb.ExternalJobID) + "externalJobID", jb.ExternalJobID, + ) contract, err := offchain_aggregator_wrapper.NewOffchainAggregator(concreteSpec.ContractAddress.Address(), chain.Client()) if err != nil { @@ -330,7 +331,7 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) (services [] return services, nil } -func (d *Delegate) maybeCreateConfigOverrider(logger logger.Logger, chain legacyevm.Chain, contractAddress types.EIP55Address) (*ConfigOverriderImpl, error) { +func (d *Delegate) maybeCreateConfigOverrider(lggr logger.Logger, chain legacyevm.Chain, contractAddress types.EIP55Address) (*ConfigOverriderImpl, error) { flagsContractAddress := chain.Config().EVM().FlagsContractAddress() if flagsContractAddress != "" { flags, err := NewFlags(flagsContractAddress, chain.Client()) @@ -342,7 +343,7 @@ func (d *Delegate) maybeCreateConfigOverrider(logger logger.Logger, chain legacy } ticker := utils.NewPausableTicker(ConfigOverriderPollInterval) - return NewConfigOverriderImpl(logger, chain.Config().EVM().OCR(), contractAddress, flags, &ticker) + return NewConfigOverriderImpl(lggr, chain.Config().EVM().OCR(), contractAddress, flags, &ticker) } return nil, nil } diff --git a/core/services/ocr/mocks/ocr_contract_tracker_db.go b/core/services/ocr/mocks/ocr_contract_tracker_db.go index bca20394bd2..da35a79354d 100644 --- a/core/services/ocr/mocks/ocr_contract_tracker_db.go +++ b/core/services/ocr/mocks/ocr_contract_tracker_db.go @@ -130,19 +130,19 @@ func (_c *OCRContractTrackerDB_SaveLatestRoundRequested_Call) RunAndReturn(run f } // WithDataSource provides a mock function with given fields: _a0 -func (_m *OCRContractTrackerDB) WithDataSource(_a0 sqlutil.DataSource) ocr.OCRContractTrackerDB { +func (_m *OCRContractTrackerDB) WithDataSource(_a0 sqlutil.DataSource) ocr.ContractTrackerDB { ret := _m.Called(_a0) if len(ret) == 0 { panic("no return value specified for WithDataSource") } - var r0 ocr.OCRContractTrackerDB - if rf, ok := ret.Get(0).(func(sqlutil.DataSource) ocr.OCRContractTrackerDB); ok { + var r0 ocr.ContractTrackerDB + if rf, ok := ret.Get(0).(func(sqlutil.DataSource) ocr.ContractTrackerDB); ok { r0 = rf(_a0) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(ocr.OCRContractTrackerDB) + r0 = ret.Get(0).(ocr.ContractTrackerDB) } } @@ -167,12 +167,12 @@ func (_c *OCRContractTrackerDB_WithDataSource_Call) Run(run func(_a0 sqlutil.Dat return _c } -func (_c *OCRContractTrackerDB_WithDataSource_Call) Return(_a0 ocr.OCRContractTrackerDB) *OCRContractTrackerDB_WithDataSource_Call { +func (_c *OCRContractTrackerDB_WithDataSource_Call) Return(_a0 ocr.ContractTrackerDB) *OCRContractTrackerDB_WithDataSource_Call { _c.Call.Return(_a0) return _c } -func (_c *OCRContractTrackerDB_WithDataSource_Call) RunAndReturn(run func(sqlutil.DataSource) ocr.OCRContractTrackerDB) *OCRContractTrackerDB_WithDataSource_Call { +func (_c *OCRContractTrackerDB_WithDataSource_Call) RunAndReturn(run func(sqlutil.DataSource) ocr.ContractTrackerDB) *OCRContractTrackerDB_WithDataSource_Call { _c.Call.Return(run) return _c } diff --git a/core/services/ocr/validate.go b/core/services/ocr/validate.go index 354c3e68eae..8f971b91b5c 100644 --- a/core/services/ocr/validate.go +++ b/core/services/ocr/validate.go @@ -37,7 +37,7 @@ type ValidationConfig interface { ChainType() chaintype.ChainType } -type OCRValidationConfig interface { +type OracleValidationConfig interface { BlockchainTimeout() time.Duration CaptureEATelemetry() bool ContractPollInterval() time.Duration @@ -73,7 +73,7 @@ func ValidatedOracleSpecToml(gcfg GeneralConfig, legacyChains legacyevm.LegacyCh } func ValidatedOracleSpecTomlCfg(gcfg GeneralConfig, configFn func(id *big.Int, contractAddress types.EIP55Address) (evmconfig.ChainScopedConfig, error), tomlString string) (job.Job, error) { - var jb = job.Job{} + jb := job.Job{} var spec job.OCROracleSpec tree, err := toml.Load(tomlString) if err != nil { @@ -228,7 +228,7 @@ func isContractDeployed(client client.Client, address common.Address) (bool, err return len(code) > 0, nil } -func newContractTracker(chain legacyevm.Chain, contractAddress types.EIP55Address) (*OCRContractTracker, error) { +func newContractTracker(chain legacyevm.Chain, contractAddress types.EIP55Address) (*ContractTracker, error) { contractCaller, err := offchainaggregator.NewOffchainAggregatorCaller(contractAddress.Address(), chain.Client()) if err != nil { return nil, errors.Wrap(err, "could not instantiate NewOffchainAggregatorCaller") @@ -244,7 +244,7 @@ func newContractTracker(chain legacyevm.Chain, contractAddress types.EIP55Addres return nil, errors.Wrap(err, "failed to create OffchainAggregator filterer") } - return &OCRContractTracker{ + return &ContractTracker{ contractCaller: contractCaller, blockTranslator: block.NewBlockTranslator(chain.Config().EVM().ChainType(), chain.Client(), logger.NullLogger), ethClient: chain.Client(), @@ -253,7 +253,7 @@ func newContractTracker(chain legacyevm.Chain, contractAddress types.EIP55Addres }, nil } -func validateContractLogs(ct *OCRContractTracker, contractAddress types.EIP55Address) error { +func validateContractLogs(ct *ContractTracker, contractAddress types.EIP55Address) error { ctx := context.Background() changedInBlock, _, err := ct.LatestConfigDetails(ctx) if err != nil { diff --git a/core/services/ocr2/database.go b/core/services/ocr2/database.go index b57d1dd9b0f..d0ec8fd2c4f 100644 --- a/core/services/ocr2/database.go +++ b/core/services/ocr2/database.go @@ -55,17 +55,17 @@ func (d *db) ReadState(ctx context.Context, cd ocrtypes.ConfigDigest) (ps *ocrty return nil, errors.Wrap(err, "ReadState failed") } - ps.HighestSentEpoch = uint32(highestSentEpochTmp) + ps.HighestSentEpoch = uint32(highestSentEpochTmp) //nolint:gosec // G115: epoch is a uint32 persisted as int64 for _, v := range tmp { - ps.HighestReceivedEpoch = append(ps.HighestReceivedEpoch, uint32(v)) + ps.HighestReceivedEpoch = append(ps.HighestReceivedEpoch, uint32(v)) //nolint:gosec // G115: epoch is a uint32 persisted as int64 } return ps, nil } func (d *db) WriteState(ctx context.Context, cd ocrtypes.ConfigDigest, state ocrtypes.PersistentState) error { - var highestReceivedEpoch []int64 + highestReceivedEpoch := make([]int64, 0, len(state.HighestReceivedEpoch)) for _, v := range state.HighestReceivedEpoch { highestReceivedEpoch = append(highestReceivedEpoch, int64(v)) } @@ -158,7 +158,7 @@ func (d *db) ReadConfig(ctx context.Context) (c *ocrtypes.ContractConfig, err er } func (d *db) WriteConfig(ctx context.Context, c ocrtypes.ContractConfig) error { - var signers [][]byte + signers := make([][]byte, 0, len(c.Signers)) for _, s := range c.Signers { signers = append(signers, []byte(s)) } @@ -206,7 +206,7 @@ func (d *db) WriteConfig(ctx context.Context, c ocrtypes.ContractConfig) error { } func (d *db) StorePendingTransmission(ctx context.Context, t ocrtypes.ReportTimestamp, tx ocrtypes.PendingTransmission) error { - var signatures [][]byte + signatures := make([][]byte, 0, 2*len(tx.AttributedSignatures)) for _, s := range tx.AttributedSignatures { signatures = append(signatures, s.Signature) buffer := make([]byte, binary.MaxVarintLen64) @@ -226,12 +226,12 @@ func (d *db) StorePendingTransmission(ctx context.Context, t ocrtypes.ReportTime config_digest, epoch, round, - + time, extra_hash, report, attributed_signatures, - + created_at, updated_at ) @@ -241,12 +241,12 @@ func (d *db) StorePendingTransmission(ctx context.Context, t ocrtypes.ReportTime config_digest = EXCLUDED.config_digest, epoch = EXCLUDED.epoch, round = EXCLUDED.round, - + time = EXCLUDED.time, extra_hash = EXCLUDED.extra_hash, report = EXCLUDED.report, attributed_signatures = EXCLUDED.attributed_signatures, - + updated_at = NOW() ` @@ -308,7 +308,7 @@ func (d *db) PendingTransmissionsWithConfigDigest(ctx context.Context, cd ocrtyp signer, _ := binary.Varint(signatures[index+1]) sig := ocrtypes.AttributedOnchainSignature{ Signature: signature, - Signer: ocrcommon.OracleID(signer), + Signer: ocrcommon.OracleID(signer), //nolint:gosec // G115: signer is an OracleID encoded as a varint } p.AttributedSignatures = append(p.AttributedSignatures, sig) } diff --git a/core/services/ocr2/database_test.go b/core/services/ocr2/database_test.go index 216e647f8d5..a7ffa2e06fc 100644 --- a/core/services/ocr2/database_test.go +++ b/core/services/ocr2/database_test.go @@ -44,7 +44,7 @@ func MustInsertOCROracleSpec(t *testing.T, db *sqlx.DB, transmitterAddress types require.NoError(t, err) require.NoError(t, db.Get(&spec, `INSERT INTO ocr2_oracle_specs ( -relay, relay_config, contract_id, p2pv2_bootstrappers, ocr_key_bundle_id, monitoring_endpoint, transmitter_id, +relay, relay_config, contract_id, p2pv2_bootstrappers, ocr_key_bundle_id, monitoring_endpoint, transmitter_id, blockchain_timeout, contract_config_tracker_poll_interval, contract_config_confirmations, plugin_type, plugin_config, onchain_signing_strategy, allow_no_bootstrappers, created_at, updated_at) VALUES ( 'ethereum', '{}', $1, '{}', $2, $3, $4, 0, 0, 0, 'median', $5, '{}', $6, NOW(), NOW() @@ -461,55 +461,55 @@ func Test_DB_ReadWriteProtocolState(t *testing.T) { assertCount(0) err := db.WriteProtocolState(ctx, cd1, "key1", []byte{1}) - assert.NoError(t, err) + require.NoError(t, err) assertCount(1) err = db.WriteProtocolState(ctx, cd2, "key1", []byte{2}) - assert.NoError(t, err) + require.NoError(t, err) assertCount(2) err = db.WriteProtocolState(ctx, cd2, "key2", []byte{3}) - assert.NoError(t, err) + require.NoError(t, err) assertCount(3) // should overwrite err = db.WriteProtocolState(ctx, cd2, "key2", []byte{4}) - assert.NoError(t, err) + require.NoError(t, err) val, err := db.ReadProtocolState(ctx, cd1, "key1") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []byte{1}, val) val, err = db.ReadProtocolState(ctx, cd2, "key1") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []byte{2}, val) val, err = db.ReadProtocolState(ctx, cd2, "key2") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []byte{4}, val) // should write empty value err = db.WriteProtocolState(ctx, cd1, "key1", []byte{}) - assert.NoError(t, err) + require.NoError(t, err) val, err = db.ReadProtocolState(ctx, cd1, "key1") - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, []byte{}, val) assertCount(3) // should delete value err = db.WriteProtocolState(ctx, cd1, "key1", nil) - assert.NoError(t, err) + require.NoError(t, err) assertCount(2) // trying to read missing value yields nil val, err = db.ReadProtocolState(ctx, cd1, "key1") - assert.NoError(t, err) + require.NoError(t, err) assert.Nil(t, val) }) } diff --git a/core/services/ocr2/delegate.go b/core/services/ocr2/delegate.go index a5e13678f27..b2955e4b89a 100644 --- a/core/services/ocr2/delegate.go +++ b/core/services/ocr2/delegate.go @@ -132,7 +132,7 @@ type Delegate struct { peerWrapper *ocrcommon.SingletonPeerWrapper monitoringEndpointGen telemetry.MonitoringEndpointGenerator cfg DelegateConfig - lggr logger.Logger + lggr logger.SugaredLogger ks keystore.OCR2 ethKs keystore.Eth workflowKs keystore.Workflow @@ -275,7 +275,7 @@ type DelegateOpts struct { PeerWrapper *ocrcommon.SingletonPeerWrapper MonitoringEndpointGen telemetry.MonitoringEndpointGenerator LegacyChains legacyevm.LegacyChainContainer - Lggr logger.Logger + Lggr logger.SugaredLogger Ks keystore.OCR2 EthKs keystore.Eth Relayers RelayGetter @@ -316,7 +316,7 @@ func NewDelegate( monitoringEndpointGen: opts.MonitoringEndpointGen, legacyChains: opts.LegacyChains, cfg: cfg, - lggr: opts.Lggr.Named("OCR2"), + lggr: logger.Sugared(opts.Lggr.Named("OCR2")), ks: opts.Ks, ethKs: opts.EthKs, workflowKs: opts.WorkflowKs, @@ -362,7 +362,7 @@ func (d *Delegate) OnDeleteJob(ctx context.Context, jb job.Job) error { rid, err := spec.RelayID() if err != nil { d.lggr.Errorw("DeleteJob", "err", JobSpecNoRelayerError{Err: err, PluginName: string(spec.PluginType)}) - return nil + return nil //nolint:nilerr // deletion must not be blocked by a malformed spec } // we only have clean to do for the EVM if rid.Network == relay.NetworkEVM { @@ -889,7 +889,7 @@ func (d *Delegate) newServicesVaultPlugin( srvs = append(srvs, dm) fullPath := filepath.Join(d.cfg.OCR2().KeyValueStoreRootDir(), jb.ExternalJobID.String()) - err = utils.EnsureDirAndMaxPerms(fullPath, os.FileMode(0700)) + err = utils.EnsureDirAndMaxPerms(fullPath, os.FileMode(0o700)) if err != nil { return nil, fmt.Errorf("failed to create key value store directory: %w", err) } @@ -990,7 +990,7 @@ func (d *Delegate) newServicesVaultPlugin( srvs = append(srvs, dkgProvider) fullPathDKG := filepath.Join(d.cfg.OCR2().KeyValueStoreRootDir(), jb.ExternalJobID.String(), "_dkg") - err = utils.EnsureDirAndMaxPerms(fullPathDKG, os.FileMode(0700)) + err = utils.EnsureDirAndMaxPerms(fullPathDKG, os.FileMode(0o700)) if err != nil { return nil, fmt.Errorf("failed to create key value store directory: %w", err) } @@ -1738,7 +1738,7 @@ func (d *Delegate) newServicesLLO( // and DKG OCR3.1 plugins are (pebble under OCR2().KeyValueStoreRootDir()). if pluginCfg.IsOCR31() { fullPath := filepath.Join(d.cfg.OCR2().KeyValueStoreRootDir(), jb.ExternalJobID.String()) - if err = utils.EnsureDirAndMaxPerms(fullPath, os.FileMode(0700)); err != nil { + if err = utils.EnsureDirAndMaxPerms(fullPath, os.FileMode(0o700)); err != nil { return nil, fmt.Errorf("failed to create LLO key value store directory: %w", err) } cfg.BinaryNetworkEndpoint2Factory = d.peerWrapper.Peer3_1 @@ -1821,13 +1821,3 @@ type errorLog struct { func (l *errorLog) SaveError(ctx context.Context, msg string) error { return l.recordError(ctx, l.jobID, msg) } - -type logWriter struct { - log logger.Logger -} - -func (l *logWriter) Write(p []byte) (n int, err error) { - l.log.Debug(string(p), nil) - n = len(p) - return -} diff --git a/core/services/ocr2/plugins/generic/oraclefactory.go b/core/services/ocr2/plugins/generic/oraclefactory.go index 5a9de153a6f..59d5a13c552 100644 --- a/core/services/ocr2/plugins/generic/oraclefactory.go +++ b/core/services/ocr2/plugins/generic/oraclefactory.go @@ -17,9 +17,9 @@ import ( "github.com/smartcontractkit/chainlink-common/keystore/corekeys/ocr2key" capabilitiespb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink-common/pkg/types/core" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/keystore" "github.com/smartcontractkit/chainlink/v2/core/services/ocr/capregconfig" @@ -33,7 +33,7 @@ type oracleFactory struct { jobName string jobORM job.ORM kb ocr2key.KeyBundle - lggr logger.Logger + lggr logger.SugaredLogger config job.OracleFactoryConfig onchainSigningStrategy job.OnchainSigningStrategy peerWrapper *ocrcommon.SingletonPeerWrapper @@ -50,7 +50,7 @@ type OracleFactoryParams struct { JobName string JobORM job.ORM KB ocr2key.KeyBundle - Logger logger.Logger + Logger logger.SugaredLogger Config job.OracleFactoryConfig OnchainSigningStrategy job.OnchainSigningStrategy PeerWrapper *ocrcommon.SingletonPeerWrapper @@ -112,7 +112,7 @@ func (of *oracleFactory) NewOracle(ctx context.Context, args core.OracleArgs) (c return nil, fmt.Errorf("expected relayer to be of type relayerWrapper, got %T", relayer) } - var relayConfig = struct { + relayConfig := struct { ChainID string `json:"chainID"` EffectiveTransmitterID string `json:"effectiveTransmitterID"` SendingKeys []string `json:"sendingKeys"` @@ -143,13 +143,15 @@ func (of *oracleFactory) NewOracle(ctx context.Context, args core.OracleArgs) (c // Wrap with dynamic tracker/digester from OCRConfigService (with fallback). // NOTE: Standard Capabilities currently support only one OCR instance so we're using OCR3ConfigDefaultKey. configTracker, err = of.ocrConfigService.GetConfigTracker( - of.capabilityID, capabilitiespb.OCR3ConfigDefaultKey, legacyConfigProvider.ContractConfigTracker()) + of.capabilityID, capabilitiespb.OCR3ConfigDefaultKey, legacyConfigProvider.ContractConfigTracker(), + ) if err != nil { return nil, fmt.Errorf("failed to get config tracker: %w", err) } configDigester, err = of.ocrConfigService.GetConfigDigester( - of.capabilityID, capabilitiespb.OCR3ConfigDefaultKey, legacyConfigProvider.OffchainConfigDigester()) + of.capabilityID, capabilitiespb.OCR3ConfigDefaultKey, legacyConfigProvider.OffchainConfigDigester(), + ) if err != nil { return nil, fmt.Errorf("failed to get config digester: %w", err) } @@ -201,7 +203,6 @@ func (of *oracleFactory) NewOracle(ctx context.Context, args core.OracleArgs) (c OnchainKeyring: ocr3shims.OnchainKeyringAsOnchainKeyring2(onchainKeyringAdapter), MetricsRegisterer: prometheus.WrapRegistererWith(map[string]string{"job_name": of.jobName}, prometheus.DefaultRegisterer), }) - if err != nil { return nil, fmt.Errorf("%w: failed to create new OCR oracle", err) } diff --git a/core/services/ocr2/plugins/generic/oraclefactory_test.go b/core/services/ocr2/plugins/generic/oraclefactory_test.go index af4164d96a9..51c80995355 100644 --- a/core/services/ocr2/plugins/generic/oraclefactory_test.go +++ b/core/services/ocr2/plugins/generic/oraclefactory_test.go @@ -9,8 +9,8 @@ import ( ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" - "github.com/smartcontractkit/chainlink/v2/core/logger" v2 "github.com/smartcontractkit/chainlink/v2/core/services/registrysyncer/v2" ) @@ -18,7 +18,7 @@ func TestNewOracleFactory(t *testing.T) { params := OracleFactoryParams{ JobID: 1, JobName: "test-job", - Logger: logger.TestLogger(t), + Logger: logger.TestSugared(t), } factory, err := NewOracleFactory(params) @@ -32,7 +32,7 @@ func TestNewOracleFactory_WithOCRConfigService(t *testing.T) { params := OracleFactoryParams{ JobID: 1, JobName: "test-job", - Logger: logger.TestLogger(t), + Logger: logger.TestSugared(t), OCRConfigService: mockService, CapabilityID: "offchain_reporting@1.0.0", } @@ -68,7 +68,7 @@ func (m *mockOCRConfigService) GetConfigDigester( return &mockConfigDigester{}, nil } -func (m *mockOCRConfigService) GetContractConfig(capabilityID string, ocrConfigKey string) (ocrtypes.ContractConfig, bool) { +func (m *mockOCRConfigService) GetContractConfig(capabilityID, ocrConfigKey string) (ocrtypes.ContractConfig, bool) { return ocrtypes.ContractConfig{}, false } @@ -78,9 +78,11 @@ func (m *mockConfigTracker) Notify() <-chan struct{} { return nil } func (m *mockConfigTracker) LatestConfigDetails(ctx context.Context) (uint64, ocrtypes.ConfigDigest, error) { return 0, ocrtypes.ConfigDigest{}, nil } + func (m *mockConfigTracker) LatestConfig(ctx context.Context, changedInBlock uint64) (ocrtypes.ContractConfig, error) { return ocrtypes.ContractConfig{}, nil } + func (m *mockConfigTracker) LatestBlockHeight(ctx context.Context) (uint64, error) { return 0, nil } @@ -90,6 +92,7 @@ type mockConfigDigester struct{} func (m *mockConfigDigester) ConfigDigest(ctx context.Context, cc ocrtypes.ContractConfig) (ocrtypes.ConfigDigest, error) { return ocrtypes.ConfigDigest{}, nil } + func (m *mockConfigDigester) ConfigDigestPrefix(ctx context.Context) (ocrtypes.ConfigDigestPrefix, error) { return ocrtypes.ConfigDigestPrefixKeystoneOCR3Capability, nil } diff --git a/core/services/ocr2/plugins/generic/oraclefactorydb.go b/core/services/ocr2/plugins/generic/oraclefactorydb.go index 2f9c85ecf6b..b401d8c75b0 100644 --- a/core/services/ocr2/plugins/generic/oraclefactorydb.go +++ b/core/services/ocr2/plugins/generic/oraclefactorydb.go @@ -9,7 +9,7 @@ import ( ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types" - "github.com/smartcontractkit/chainlink/v2/core/logger" + "github.com/smartcontractkit/chainlink-common/pkg/logger" ) type oracleFactoryDb struct { @@ -26,15 +26,13 @@ type oracleFactoryDb struct { mu sync.Mutex } -var ( - _ ocrtypes.Database = &oracleFactoryDb{} -) +var _ ocrtypes.Database = &oracleFactoryDb{} // NewDB returns a new DB scoped to this instanceID func OracleFactoryDB(specID int32, lggr logger.Logger) *oracleFactoryDb { return &oracleFactoryDb{ specID: specID, - lggr: logger.Sugared(lggr.Named("OracleFactoryMemoryDb")), + lggr: logger.Sugared(lggr).Named("OracleFactoryMemoryDb"), states: make(map[ocrtypes.ConfigDigest]*ocrtypes.PersistentState), pendingTransmissions: make(map[ocrtypes.ReportTimestamp]ocrtypes.PendingTransmission), protocolStates: make(map[ocrtypes.ConfigDigest]map[string][]byte), diff --git a/core/services/ocr2/plugins/generic/pipeline_runner_adapter.go b/core/services/ocr2/plugins/generic/pipeline_runner_adapter.go index 978ab253310..343bcbf3611 100644 --- a/core/services/ocr2/plugins/generic/pipeline_runner_adapter.go +++ b/core/services/ocr2/plugins/generic/pipeline_runner_adapter.go @@ -4,9 +4,9 @@ import ( "context" "time" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" "github.com/smartcontractkit/chainlink-common/pkg/types/core" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/pipeline" ) diff --git a/core/services/ocr2/plugins/generic/relayerset_test.go b/core/services/ocr2/plugins/generic/relayerset_test.go index 7f9d4727b48..5c2a7f685c2 100644 --- a/core/services/ocr2/plugins/generic/relayerset_test.go +++ b/core/services/ocr2/plugins/generic/relayerset_test.go @@ -8,6 +8,7 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-common/pkg/loop" "github.com/smartcontractkit/chainlink-common/pkg/types" @@ -23,14 +24,14 @@ func TestRelayerSet_List(t *testing.T) { testGetter := TestRelayGetter{relayers: testRelayersMap} relayerSet, err := NewRelayerSet(testGetter, uuid.New(), 1, true) - assert.NoError(t, err) + require.NoError(t, err) relayers, err := relayerSet.List(t.Context()) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, relayers, 3) relayers, err = relayerSet.List(t.Context(), types.RelayID{Network: "N1", ChainID: "C1"}, types.RelayID{Network: "N3", ChainID: "C3"}) - assert.NoError(t, err) + require.NoError(t, err) assert.Len(t, relayers, 2) @@ -50,10 +51,10 @@ func TestRelayerSet_Get(t *testing.T) { testGetter := TestRelayGetter{relayers: testRelayersMap} relayerSet, err := NewRelayerSet(testGetter, uuid.New(), 1, true) - assert.NoError(t, err) + require.NoError(t, err) _, err = relayerSet.Get(t.Context(), types.RelayID{Network: "N1", ChainID: "C1"}) - assert.NoError(t, err) + require.NoError(t, err) _, err = relayerSet.Get(t.Context(), types.RelayID{Network: "N4", ChainID: "C4"}) assert.Error(t, err) @@ -70,10 +71,10 @@ func TestRelayerSet_NewPluginProvider(t *testing.T) { externalJobID := uuid.New() relayerSet, err := NewRelayerSet(testGetter, externalJobID, 1, true) - assert.NoError(t, err) + require.NoError(t, err) relayer, err := relayerSet.Get(t.Context(), types.RelayID{Network: "N1", ChainID: "C1"}) - assert.NoError(t, err) + require.NoError(t, err) _, err = relayer.NewPluginProvider(t.Context(), core.RelayArgs{ ContractID: "c1", @@ -89,7 +90,7 @@ func TestRelayerSet_NewPluginProvider(t *testing.T) { TransmitterID: "t1", PluginConfig: []byte("pluginconfig"), }) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, types.RelayArgs{ ExternalJobID: externalJobID, diff --git a/core/services/ocr2/plugins/llo/bench/harness_test.go b/core/services/ocr2/plugins/llo/bench/harness_test.go index 9a0484955ae..54022c3b16a 100644 --- a/core/services/ocr2/plugins/llo/bench/harness_test.go +++ b/core/services/ocr2/plugins/llo/bench/harness_test.go @@ -108,7 +108,7 @@ func (w workload) String() string { // full set of stream IDs referenced. func (w workload) channelDefinitions() (llotypes.ChannelDefinitions, []llotypes.StreamID) { defs := make(llotypes.ChannelDefinitions, w.numChannels) - var streamIDs []llotypes.StreamID + streamIDs := make([]llotypes.StreamID, 0, w.streamsPerChannel*w.numChannels) var sid llotypes.StreamID for c := range w.numChannels { streams := make([]llotypes.Stream, 0, w.streamsPerChannel) diff --git a/core/services/ocr2/plugins/median/services.go b/core/services/ocr2/plugins/median/services.go index 0fa41c884e9..3d92c797ab6 100644 --- a/core/services/ocr2/plugins/median/services.go +++ b/core/services/ocr2/plugins/median/services.go @@ -24,20 +24,20 @@ import ( "github.com/smartcontractkit/chainlink/v2/plugins" ) -type MedianConfig interface { +type Config interface { JobPipelineMaxSuccessfulRuns() uint64 JobPipelineResultWriteQueueDepth() uint64 plugins.RegistrarConfig } -// concrete implementation of MedianConfig +// concrete implementation of Config type medianConfig struct { jobPipelineMaxSuccessfulRuns uint64 jobPipelineResultWriteQueueDepth uint64 plugins.RegistrarConfig } -func NewMedianConfig(jobPipelineMaxSuccessfulRuns, jobPipelineResultWriteQueueDepth uint64, pluginProcessCfg plugins.RegistrarConfig) MedianConfig { +func NewMedianConfig(jobPipelineMaxSuccessfulRuns, jobPipelineResultWriteQueueDepth uint64, pluginProcessCfg plugins.RegistrarConfig) Config { return &medianConfig{ jobPipelineMaxSuccessfulRuns: jobPipelineMaxSuccessfulRuns, jobPipelineResultWriteQueueDepth: jobPipelineResultWriteQueueDepth, @@ -59,9 +59,9 @@ func NewMedianServices(ctx context.Context, relayer loop.Relayer, kvStore job.KVStore, pipelineRunner pipeline.Runner, - lggr logger.Logger, + lggr logger.SugaredLogger, argsNoPlugin libocr.OCR2OracleArgs, - cfg MedianConfig, + cfg Config, chEnhancedTelem chan ocrcommon.EnhancedTelemetryData, errorLog core.ErrorLog, ) (srvs []job.ServiceCtx, err error) { diff --git a/core/services/ocr2/plugins/vault/kvstore_test.go b/core/services/ocr2/plugins/vault/kvstore_test.go index d8bdcf206d9..f630071e66c 100644 --- a/core/services/ocr2/plugins/vault/kvstore_test.go +++ b/core/services/ocr2/plugins/vault/kvstore_test.go @@ -57,7 +57,7 @@ func (k *kv) Delete(key []byte) error { return nil } -func (k *kv) Write(key []byte, data []byte) error { +func (k *kv) Write(key, data []byte) error { k.m[string(key)] = response{ data: data, } @@ -97,9 +97,9 @@ func (b *blobber) unmarshalBlob(data []byte) (ocr3_1types.BlobHandle, error) { return ocr3_1types.BlobHandle{}, nil } -var _ (ocr3_1types.BlobBroadcastFetcher) = (*blobber)(nil) +var _ ocr3_1types.BlobBroadcastFetcher = (*blobber)(nil) -var _ (ocr3_1types.KeyValueReadWriter) = (*kv)(nil) +var _ ocr3_1types.KeyValueStateReadWriter = (*kv)(nil) func TestKVStore_Secrets(t *testing.T) { kv := &kv{ @@ -277,12 +277,12 @@ func TestKVStore_Metadata_Delete(t *testing.T) { assert.Empty(t, m.SecretIdentifiers) err = store.removeIDFromMetadata(t.Context(), id) - require.ErrorContains(t, err, "not found in metadata for owner owner") + require.ErrorContains(t, err, "not found in metadata for owner") delete(kv.m, "Metadata::owner") err = store.removeIDFromMetadata(t.Context(), id) - require.ErrorContains(t, err, "no metadata found for owner owner") + require.ErrorContains(t, err, "no metadata found for owner") } func TestKVStore_InconsistentWrites(t *testing.T) { diff --git a/core/services/ocr2/plugins/vault/plugin.go b/core/services/ocr2/plugins/vault/plugin.go index d90365c01f9..3d8e7eb8406 100644 --- a/core/services/ocr2/plugins/vault/plugin.go +++ b/core/services/ocr2/plugins/vault/plugin.go @@ -35,12 +35,12 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/capabilities/consensus/requests" pkgconfig "github.com/smartcontractkit/chainlink-common/pkg/config" "github.com/smartcontractkit/chainlink-common/pkg/contexts" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/settings/cresettings" "github.com/smartcontractkit/chainlink-common/pkg/settings/limits" vaultcap "github.com/smartcontractkit/chainlink/v2/core/capabilities/vault" "github.com/smartcontractkit/chainlink/v2/core/capabilities/vault/vaulttypes" "github.com/smartcontractkit/chainlink/v2/core/capabilities/vault/vaultutils" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) const ( @@ -91,7 +91,7 @@ func NewReportingPluginFactory( } return &ReportingPluginFactory{ - lggr: lggr.Named("VaultReportingPluginFactory"), + lggr: logger.Sugared(lggr).Named("VaultReportingPluginFactory"), store: store, cfg: cfg, db: db, @@ -102,7 +102,7 @@ func NewReportingPluginFactory( } type ReportingPluginFactory struct { - lggr logger.Logger + lggr logger.SugaredLogger store *requests.Store[*vaulttypes.Request] cfg *ReportingPluginConfig db dkgocrtypes.ResultPackageDatabase @@ -296,7 +296,7 @@ func (r *ReportingPluginFactory) NewReportingPlugin(ctx context.Context, config r.lifecycle.SetConfigDigest(config.ConfigDigest.String()) - plugin := &ReportingPlugin{ + return &ReportingPlugin{ lggr: r.lggr.Named("VaultReportingPlugin"), store: r.store, cfg: cfg, @@ -314,15 +314,14 @@ func (r *ReportingPluginFactory) NewReportingPlugin(ctx context.Context, config marshalBlob: func(handle ocr3_1types.BlobHandle) ([]byte, error) { return handle.MarshalBinary() }, - } - return plugin, ocr3_1types.ReportingPluginInfo1{ + }, ocr3_1types.ReportingPluginInfo1{ Name: "VaultReportingPlugin", Limits: pluginLimits, }, nil } type ReportingPlugin struct { - lggr logger.Logger + lggr logger.SugaredLogger store *requests.Store[*vaulttypes.Request] onchainCfg ocr3types.ReportingPluginConfig cfg *ReportingPluginConfig @@ -1254,7 +1253,7 @@ func userFacingError(err error, fallback string) string { func logUserErrorAware(l logger.Logger, msg string, err error, keysAndValues ...any) { keysAndValues = append(keysAndValues, "error", err) - lggr := l.Helper(1) + lggr := logger.Sugared(l).Helper(1) if vaulttypes.IsUserError(err) { lggr.Debugw(msg, keysAndValues...) return @@ -1932,7 +1931,7 @@ func (r *ReportingPlugin) stateTransitionGetSecrets(chosen []*vaultcommon.Observ } } - sortedResponses := []*vaultcommon.SecretResponse{} + sortedResponses := make([]*vaultcommon.SecretResponse, 0, len(idToAggResponse)) for _, k := range slices.Sorted(maps.Keys(idToAggResponse)) { sortedResponses = append(sortedResponses, idToAggResponse[k]) } diff --git a/core/services/ocr2/plugins/vault/plugin_helpers_test.go b/core/services/ocr2/plugins/vault/plugin_helpers_test.go index 01a5cd334d3..6e89e356e09 100644 --- a/core/services/ocr2/plugins/vault/plugin_helpers_test.go +++ b/core/services/ocr2/plugins/vault/plugin_helpers_test.go @@ -12,18 +12,18 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/capabilities/consensus/requests" pkgconfig "github.com/smartcontractkit/chainlink-common/pkg/config" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/settings" "github.com/smartcontractkit/chainlink-common/pkg/settings/cresettings" "github.com/smartcontractkit/chainlink-common/pkg/settings/limits" vaultcap "github.com/smartcontractkit/chainlink/v2/core/capabilities/vault" "github.com/smartcontractkit/chainlink/v2/core/capabilities/vault/vaulttypes" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) type testPluginOption func(*testPluginBuildOpts) type testPluginBuildOpts struct { - lggr logger.Logger + lggr logger.SugaredLogger store *requests.Store[*vaulttypes.Request] publicKey *tdh2easy.PublicKey privateKeyShare *tdh2easy.PrivateShare @@ -44,7 +44,7 @@ type testPluginBuildOpts struct { } func withLggr(lggr logger.Logger) testPluginOption { - return func(o *testPluginBuildOpts) { o.lggr = lggr } + return func(o *testPluginBuildOpts) { o.lggr = logger.Sugared(lggr) } } func withStore(store *requests.Store[*vaulttypes.Request]) testPluginOption { @@ -78,7 +78,7 @@ func withVaultPendingQueueStallThreshold(n int) testPluginOption { return func(o *testPluginBuildOpts) { o.vaultPendingQueueStallThreshold = n } } -func withOnchainCfg(n int, f int) testPluginOption { +func withOnchainCfg(n, f int) testPluginOption { return func(o *testPluginBuildOpts) { o.onchainCfg = ocr3types.ReportingPluginConfig{N: n, F: f} } @@ -104,14 +104,10 @@ func withMaxObservationBytes(n int) testPluginOption { return func(o *testPluginBuildOpts) { o.maxObservationBytesOverride = n } } -func withMaxReportsPlusPrecursorBytes(n int) testPluginOption { - return func(o *testPluginBuildOpts) { o.maxReportsPlusPrecursorBytesOverride = n } -} - func newTestReportingPlugin(t *testing.T, opts ...testPluginOption) *ReportingPlugin { t.Helper() o := testPluginBuildOpts{ - lggr: logger.TestLogger(t), + lggr: logger.TestSugared(t), store: requests.NewStore[*vaulttypes.Request](), onchainCfg: ocr3types.ReportingPluginConfig{N: 0, F: 0}, maxSecretsPerOwner: 1, diff --git a/core/services/ocr2/plugins/vault/plugin_share_label_test.go b/core/services/ocr2/plugins/vault/plugin_share_label_test.go index 0a7ebe84743..2084f7b5dc5 100644 --- a/core/services/ocr2/plugins/vault/plugin_share_label_test.go +++ b/core/services/ocr2/plugins/vault/plugin_share_label_test.go @@ -39,7 +39,7 @@ func TestPlugin_ValidateObservation_GetSecrets_BogusShareLabelRejected(t *testin honestResp := buildHonestGetSecretsResponse(t, id, esHex, vaultPub, vaultShares[0], []string{encKey}, esBytes, id.Owner) byzResp := proto.Clone(honestResp).(*vaultcommon.GetSecretsResponse) - byzResp.Responses[0].GetData().EncryptedDecryptionKeyShares[0].EncryptionKey = strings.Repeat("cd", 32) + byzResp.Responses[0].GetData().EncryptedDecryptionKeyShares[0].EncryptionKey = strings.Repeat("ba", 32) rdr := &kv{m: make(map[string]response)} writeGetSecretsPendingQueueItem(t, rdr, vaulttypes.KeyFor(id), req) @@ -64,7 +64,7 @@ func TestPlugin_ValidateObservation_GetSecrets_EmbeddedRequestMismatchRejected(t require.NoError(t, err) realKey := strings.Repeat("ab", 32) - bogusKey := strings.Repeat("cd", 32) + bogusKey := strings.Repeat("ba", 32) id := &vaultcommon.SecretIdentifier{Owner: "52bc44d5378309ee2abf1539bf71de1b7d7be3b5", Namespace: "main", Key: "mysecret"} pendingReq := &vaultcommon.GetSecretsRequest{ Requests: []*vaultcommon.SecretRequest{{Id: id, EncryptionKeys: []string{realKey}}}, @@ -100,7 +100,7 @@ func TestPlugin_ShaForObservation_GetSecrets_IncludesEncryptionKeysInSHA(t *test t.Parallel() id := &vaultcommon.SecretIdentifier{Owner: "owner", Namespace: "main", Key: "secret"} realKey := strings.Repeat("ab", 32) - bogusKey := strings.Repeat("cd", 32) + bogusKey := strings.Repeat("ba", 32) req := &vaultcommon.GetSecretsRequest{ Requests: []*vaultcommon.SecretRequest{{Id: id, EncryptionKeys: []string{realKey}}}, } @@ -147,7 +147,7 @@ func TestPlugin_ShaForObservation_GetSecrets_PermutedEntryOrder(t *testing.T) { Requests: []*vaultcommon.SecretRequest{{Id: id, EncryptionKeys: []string{keyA, keyB}}}, } - makeObs := func(order []string, shares []string) *vaultcommon.Observation { + makeObs := func(order, shares []string) *vaultcommon.Observation { entries := make([]*vaultcommon.EncryptedShares, len(order)) for i, key := range order { entries[i] = &vaultcommon.EncryptedShares{EncryptionKey: key, Shares: []string{shares[i]}} @@ -175,9 +175,9 @@ func TestPlugin_ShaForObservation_GetSecrets_PermutedEntryOrder(t *testing.T) { shaAB, err := plugin.shaForObservation(makeObs([]string{keyA, keyB}, []string{"share-a1", "share-b1"})) require.NoError(t, err) - shaCD, err := plugin.shaForObservation(makeObs([]string{keyB, keyA}, []string{"share-b2", "share-a2"})) + shaBA, err := plugin.shaForObservation(makeObs([]string{keyB, keyA}, []string{"share-b2", "share-a2"})) require.NoError(t, err) - require.NotEqual(t, shaAB, shaCD) + require.NotEqual(t, shaAB, shaBA) } func TestPlugin_ShaForObservation_GetSecrets_DifferentShareBytesSameLabels(t *testing.T) { diff --git a/core/services/ocr2/plugins/vault/plugin_test.go b/core/services/ocr2/plugins/vault/plugin_test.go index 282988520ec..0a768bfe040 100644 --- a/core/services/ocr2/plugins/vault/plugin_test.go +++ b/core/services/ocr2/plugins/vault/plugin_test.go @@ -37,12 +37,12 @@ import ( vaultcommon "github.com/smartcontractkit/chainlink-common/pkg/capabilities/actions/vault" "github.com/smartcontractkit/chainlink-common/pkg/capabilities/consensus/requests" "github.com/smartcontractkit/chainlink-common/pkg/contexts" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/settings/cresettings" "github.com/smartcontractkit/chainlink-common/pkg/settings/limits" vaultcap "github.com/smartcontractkit/chainlink/v2/core/capabilities/vault" "github.com/smartcontractkit/chainlink/v2/core/capabilities/vault/vaulttypes" "github.com/smartcontractkit/chainlink/v2/core/capabilities/vault/vaultutils" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) func testRequestLifecycleTracker(t *testing.T, lggr logger.Logger) *vaultcap.RequestLifecycleTracker { @@ -86,7 +86,7 @@ func assertLimit[N limits.Number](t *testing.T, expected int, limiter limits.Bou } func TestPlugin_ReportingPluginFactory_UsesDefaultsIfNotProvidedInOffchainConfig(t *testing.T) { - lggr := logger.TestLogger(t) + lggr := logger.Test(t) store := requests.NewStore[*vaulttypes.Request]() _, orm := setupORM(t) @@ -178,7 +178,7 @@ func TestPlugin_ReportingPluginFactory_UsesDefaultsIfNotProvidedInOffchainConfig } func TestPlugin_ReportingPluginFactory_PassesValidate(t *testing.T) { - lggr := logger.TestLogger(t) + lggr := logger.Test(t) store := requests.NewStore[*vaulttypes.Request]() _, orm := setupORM(t) @@ -206,7 +206,7 @@ func TestPlugin_ReportingPluginFactory_PassesValidate(t *testing.T) { } func TestPlugin_ReportingPluginFactory_UseDKGResult(t *testing.T) { - lggr := logger.TestLogger(t) + lggr := logger.Test(t) store := requests.NewStore[*vaulttypes.Request]() // Simulate DKG for a single recipient. @@ -263,7 +263,7 @@ func TestPlugin_ReportingPluginFactory_UseDKGResult(t *testing.T) { } func TestPlugin_ReportingPluginFactory_InvalidParams(t *testing.T) { - lggr := logger.TestLogger(t) + lggr := logger.Test(t) store := requests.NewStore[*vaulttypes.Request]() lpk := vaultcap.NewLazyPublicKey() @@ -866,7 +866,7 @@ func TestPlugin_Observation_PendingQueueEnabled_BroadcastsPendingQueueBlobsInPar } func TestPlugin_Observation_PendingQueueEnabled_BroadcastBlobError(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.WarnLevel) + lggr, observed := logger.TestObserved(t, zapcore.WarnLevel) store := requests.NewStore[*vaulttypes.Request]() r := newTestReportingPlugin(t, withStore(store), withLggr(lggr)) @@ -1262,7 +1262,7 @@ func TestPlugin_Observation_GetSecretsRequest_SecretDoesNotExist(t *testing.T) { } func TestPlugin_Observation_GetSecretsRequest_SecretExistsButIsIncorrect(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) @@ -1607,7 +1607,7 @@ func TestPlugin_Observation_GetSecretsRequest_BinaryShares(t *testing.T) { EncryptionKeys: []string{pks}, }, }, - WorkflowOwner: owner, + WorkflowOwner: owner, //nolint:staticcheck // SA1019: testing deprecated field } anyp, err := anypb.New(p) require.NoError(t, err) @@ -2524,28 +2524,6 @@ func TestPlugin_Observation_CreateSecretsRequest_WrongOwnerLabelRejected(t *test assert.NotEmpty(t, o.GetError().GetMessage()) } -func makeEncryptedShares(t *testing.T, ciphertext *tdh2easy.Ciphertext, privateShare *tdh2easy.PrivateShare, keys []string) []*vaultcommon.EncryptedShares { - t.Helper() - share, err := tdh2easy.Decrypt(ciphertext, privateShare) - require.NoError(t, err) - shareBytes, err := share.Marshal() - require.NoError(t, err) - - result := make([]*vaultcommon.EncryptedShares, len(keys)) - for i, pk := range keys { - pkBytes, err := hex.DecodeString(pk) - require.NoError(t, err) - pubKey := [32]byte(pkBytes) - encrypted, err := box.SealAnonymous(nil, shareBytes, &pubKey, rand.Reader) - require.NoError(t, err) - result[i] = &vaultcommon.EncryptedShares{ - EncryptionKey: pk, - Shares: []string{hex.EncodeToString(encrypted)}, - } - } - return result -} - func makeBinaryEncryptedShares(t *testing.T, ciphertext *tdh2easy.Ciphertext, privateShare *tdh2easy.PrivateShare, keys []string) []*vaultcommon.EncryptedShares { t.Helper() share, err := tdh2easy.Decrypt(ciphertext, privateShare) @@ -2568,52 +2546,6 @@ func makeBinaryEncryptedShares(t *testing.T, ciphertext *tdh2easy.Ciphertext, pr return result } -func makeGetSecretsObservations( - t *testing.T, - numRequests int, - owner string, - namespace string, - encryptionKeys []string, - encryptedValue string, - ciphertext *tdh2easy.Ciphertext, - privateShare *tdh2easy.PrivateShare, -) []byte { - t.Helper() - obs := make([]observation, 0, numRequests) - for i := range numRequests { - maxKey := fmt.Sprintf("%s%d", strings.Repeat("c", 64-1), i) - - id := &vaultcommon.SecretIdentifier{ - Owner: owner, - Namespace: namespace, - Key: maxKey, - } - req := &vaultcommon.GetSecretsRequest{ - Requests: []*vaultcommon.SecretRequest{ - { - Id: id, - EncryptionKeys: encryptionKeys, - }, - }, - } - resp := &vaultcommon.GetSecretsResponse{ - Responses: []*vaultcommon.SecretResponse{ - { - Id: id, - Result: &vaultcommon.SecretResponse_Data{ - Data: &vaultcommon.SecretData{ - EncryptedValue: encryptedValue, - EncryptedDecryptionKeyShares: makeEncryptedShares(t, ciphertext, privateShare, encryptionKeys), - }, - }, - }, - }, - } - obs = append(obs, observation{id, req, resp}) - } - return marshalObservations(t, obs...) -} - func makeGetSecretsBinaryObservations( t *testing.T, numRequests int, @@ -2746,7 +2678,7 @@ func marshalObservations(t *testing.T, observations ...observation) []byte { } func TestPlugin_StateTransition_InsufficientObservations(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withLggr(lggr), withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -3213,7 +3145,7 @@ func TestPlugin_ValidateObservations_DisallowsDuplicateBlobHandles(t *testing.T) } func TestPlugin_StateTransition_ShasDontMatch(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withLggr(lggr), withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -3289,7 +3221,7 @@ func TestPlugin_StateTransition_ShasDontMatch(t *testing.T) { } func TestPlugin_StateTransition_AggregatesValidationErrors(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withLggr(lggr), withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -3350,7 +3282,7 @@ func TestPlugin_StateTransition_AggregatesValidationErrors(t *testing.T) { } func TestPlugin_StateTransition_GetSecretsRequest_CombinesShares(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withLggr(lggr), withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -3482,7 +3414,7 @@ func TestPlugin_StateTransition_GetSecretsRequest_CombinesShares(t *testing.T) { func TestPlugin_StateTransition_GetSecretsRequest_ByzantineDivergentSHA(t *testing.T) { t.Parallel() - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) // N=4, F=1: 2F+1=3, F+1=2. One Byzantine observation with a divergent SHA must not stall the GET. @@ -3842,7 +3774,7 @@ func TestPlugin_StateTransition_GetSecretsRequest_DeterministicAcrossInvocations } func TestPlugin_StateTransition_GetSecretsRequest_CombinesBinaryShares(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withLggr(lggr), withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -3970,7 +3902,7 @@ func TestPlugin_StateTransition_GetSecretsRequest_CombinesBinaryShares(t *testin } func TestPlugin_StateTransition_GetSecretsRequest_CapsSharesAtTwoFPlusOne(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withLggr(lggr), withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -4116,7 +4048,7 @@ func TestPlugin_StateTransition_GetSecretsRequest_OmitsOutcomeRequest(t *testing } func TestPlugin_StateTransition_CreateSecretsRequest_WritesSecrets(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withLggr(lggr), withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -4274,7 +4206,7 @@ func TestPlugin_StateTransition_CreateSecretsRequest_PerOwnerLimitEnforcedWhenAt } func TestPlugin_StateTransition_CreateSecrets_ResponseOwnerMatchesStoredIdentifier(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin( @@ -4837,7 +4769,7 @@ func TestPlugin_Observation_UpdateSecretsRequest_InvalidCiphertext_EncryptedWith } func TestPlugin_StateTransition_UpdateSecretsRequest_SecretDoesntExist(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withLggr(lggr), withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -4922,7 +4854,7 @@ func TestPlugin_StateTransition_UpdateSecretsRequest_SecretDoesntExist(t *testin } func TestPlugin_StateTransition_UpdateSecretsRequest_WritesSecrets(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withLggr(lggr), withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -5248,7 +5180,7 @@ func TestPlugin_Observation_DeleteSecrets_InvalidRequestDuplicateIds(t *testing. } func TestPlugin_StateTransition_DeleteSecretsRequest(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withLggr(lggr), withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -5344,7 +5276,7 @@ func TestPlugin_StateTransition_DeleteSecretsRequest(t *testing.T) { } func TestPlugin_StateTransition_DeleteSecretsRequest_SecretDoesNotExist(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withLggr(lggr), withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -5834,7 +5766,7 @@ func TestPlugin_Reports_ListSecretIdentifiersRequest(t *testing.T) { } func TestPlugin_StateTransition_ListSecretIdentifiers(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin(t, withLggr(lggr), withKeys(pk, shares[0]), withOnchainCfg(4, 1)) @@ -6075,7 +6007,7 @@ func TestPlugin_StateTransition_StoresPendingQueue(t *testing.T) { require.NoError(t, err) assert.Len(t, pq, 3) - ids := []string{} + ids := make([]string, 0, len(pq)) for _, item := range pq { ids = append(ids, item.Id) } @@ -6555,7 +6487,7 @@ func TestPlugin_StateTransition_StoresPendingQueue_DoesntDoubleCountObservations require.NoError(t, err) assert.Empty(t, pq, 0) - ids := []string{} + ids := make([]string, 0, len(pq)) for _, item := range pq { ids = append(ids, item.Id) } @@ -7864,7 +7796,7 @@ func TestPlugin_ValidateObservation_SecretIdentifierValidation(t *testing.T) { } func TestPlugin_StateTransition_PendingQueueEnabled_NewQuora_NotGetRequest(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin( @@ -7932,7 +7864,7 @@ func TestPlugin_StateTransition_PendingQueueEnabled_NewQuora_NotGetRequest(t *te } func TestPlugin_StateTransition_PendingQueueEnabled_GetRequest(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) _, pk, shares, err := tdh2easy.GenerateKeys(1, 3) require.NoError(t, err) r := newTestReportingPlugin( @@ -8296,7 +8228,7 @@ func TestCheckRequestBatchSize_UserErrorSurfacesRealMessage(t *testing.T) { func TestLogUserErrorAware(t *testing.T) { t.Run("logs at debug level for userError", func(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) err := vaulttypes.NewUserError("key does not exist") logUserErrorAware(lggr, "failed to observe request", err, "id", "req-1") @@ -8314,7 +8246,7 @@ func TestLogUserErrorAware(t *testing.T) { }) t.Run("logs at error level for internal error", func(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) err := errors.New("database connection lost") logUserErrorAware(lggr, "failed to observe request", err, "id", "req-2") @@ -8332,7 +8264,7 @@ func TestLogUserErrorAware(t *testing.T) { }) t.Run("logs at debug level for wrapped userError", func(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) err := fmt.Errorf("validation: %w", vaulttypes.NewUserError("bad input")) logUserErrorAware(lggr, "request failed", err, "op", "create") @@ -8344,7 +8276,7 @@ func TestLogUserErrorAware(t *testing.T) { }) t.Run("includes all key-value pairs in log entry", func(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) + lggr, observed := logger.TestObserved(t, zapcore.DebugLevel) err := errors.New("internal error") logUserErrorAware(lggr, "op failed", err, "id", "req-3", "requestID", "abc-123") @@ -8472,7 +8404,7 @@ func TestPlugin_broadcastBlobPayloads(t *testing.T) { }) t.Run("failed broadcast is skipped and logged", func(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.WarnLevel) + lggr, observed := logger.TestObserved(t, zapcore.WarnLevel) marshalBlobOverride := func(ocr3_1types.BlobHandle) ([]byte, error) { return []byte("handle"), nil } @@ -8501,7 +8433,7 @@ func TestPlugin_broadcastBlobPayloads(t *testing.T) { }) t.Run("all broadcasts fail returns empty slice", func(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.WarnLevel) + lggr, observed := logger.TestObserved(t, zapcore.WarnLevel) marshalBlobOverride := func(ocr3_1types.BlobHandle) ([]byte, error) { return []byte("handle"), nil } @@ -8520,7 +8452,7 @@ func TestPlugin_broadcastBlobPayloads(t *testing.T) { }) t.Run("marshal blob failure skips item and logs warning", func(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.WarnLevel) + lggr, observed := logger.TestObserved(t, zapcore.WarnLevel) marshalBlobOverride := func(ocr3_1types.BlobHandle) ([]byte, error) { return nil, errors.New("marshal error") } @@ -8539,7 +8471,7 @@ func TestPlugin_broadcastBlobPayloads(t *testing.T) { }) t.Run("mix of broadcast and marshal failures", func(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.WarnLevel) + lggr, observed := logger.TestObserved(t, zapcore.WarnLevel) marshalCallCount := atomic.Int32{} marshalBlobOverride := func(ocr3_1types.BlobHandle) ([]byte, error) { @@ -8615,7 +8547,7 @@ func TestPlugin_broadcastBlobPayloads(t *testing.T) { }) t.Run("slow broadcast hits per-call timeout and is skipped", func(t *testing.T) { - lggr, observed := logger.TestLoggerObserved(t, zapcore.WarnLevel) + lggr, observed := logger.TestObserved(t, zapcore.WarnLevel) marshalBlobOverride := func(ocr3_1types.BlobHandle) ([]byte, error) { return []byte("handle"), nil } diff --git a/core/services/ocr2/plugins/vault/plugin_throughput_test.go b/core/services/ocr2/plugins/vault/plugin_throughput_test.go index 43e573de2eb..8bff5ae32bf 100644 --- a/core/services/ocr2/plugins/vault/plugin_throughput_test.go +++ b/core/services/ocr2/plugins/vault/plugin_throughput_test.go @@ -182,8 +182,8 @@ func TestPlugin_ThroughputAnalysis(t *testing.T) { Request: &vaultcommon.Observation_CreateSecretsRequest{ CreateSecretsRequest: &vaultcommon.CreateSecretsRequest{ RequestId: reqID, - OrgId: strings.Repeat("o", maxIdentifierBytes), - WorkflowOwner: strings.Repeat("w", maxIdentifierBytes), + OrgId: strings.Repeat("o", maxIdentifierBytes), //nolint:staticcheck // SA1019: testing deprecated field + WorkflowOwner: strings.Repeat("w", maxIdentifierBytes), //nolint:staticcheck // SA1019: testing deprecated field EncryptedSecrets: secrets, }, }, @@ -263,8 +263,8 @@ func TestPlugin_ThroughputAnalysis(t *testing.T) { } getSecretsPendingItemSize := pendingItemSizeFor(&vaultcommon.GetSecretsRequest{ Requests: getSecretsReqs, - OrgId: strings.Repeat("o", maxIdentifierBytes), - WorkflowOwner: strings.Repeat("w", maxIdentifierBytes), + OrgId: strings.Repeat("o", maxIdentifierBytes), //nolint:staticcheck // SA1019: testing deprecated field + WorkflowOwner: strings.Repeat("w", maxIdentifierBytes), //nolint:staticcheck // SA1019: testing deprecated field }) // Max-size CreateSecretsRequest pending queue item @@ -274,8 +274,8 @@ func TestPlugin_ThroughputAnalysis(t *testing.T) { } createSecretsPendingItemSize := pendingItemSizeFor(&vaultcommon.CreateSecretsRequest{ RequestId: strings.Repeat("r", 36), - OrgId: strings.Repeat("o", maxIdentifierBytes), - WorkflowOwner: strings.Repeat("w", maxIdentifierBytes), + OrgId: strings.Repeat("o", maxIdentifierBytes), //nolint:staticcheck // SA1019: testing deprecated field + WorkflowOwner: strings.Repeat("w", maxIdentifierBytes), //nolint:staticcheck // SA1019: testing deprecated field EncryptedSecrets: createSecrets, }) diff --git a/core/services/ocr2/plugins/vault/plugin_utils.go b/core/services/ocr2/plugins/vault/plugin_utils.go index b00829fb3dc..a638b54dec2 100644 --- a/core/services/ocr2/plugins/vault/plugin_utils.go +++ b/core/services/ocr2/plugins/vault/plugin_utils.go @@ -10,11 +10,11 @@ import ( "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3_1types" vaultcommon "github.com/smartcontractkit/chainlink-common/pkg/capabilities/actions/vault" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/settings" "github.com/smartcontractkit/chainlink-common/pkg/settings/cresettings" "github.com/smartcontractkit/chainlink-common/pkg/settings/limits" "github.com/smartcontractkit/chainlink/v2/core/capabilities/vault/vaulttypes" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) // resolveVaultOCRBoundLimitInt builds a short-lived BoundLimiter for an integer-sized CRE setting, reads Limit once, and closes the limiter. @@ -180,14 +180,14 @@ func (r *ReportingPlugin) isForceEmptyOCRRoundsEnabled(ctx context.Context) bool return open } -func (r *ReportingPlugin) roundLggr(seqNr uint64) logger.Logger { +func (r *ReportingPlugin) roundLggr(seqNr uint64) logger.SugaredLogger { return r.lggr.With("seqNr", seqNr) } -func (r *ReportingPlugin) requestLggr(seqNr uint64, requestID string) logger.Logger { +func (r *ReportingPlugin) requestLggr(seqNr uint64, requestID string) logger.SugaredLogger { return r.roundLggr(seqNr).With("requestID", requestID) } -func (r *ReportingPlugin) typedRequestLggr(seqNr uint64, requestID, requestType string) logger.Logger { +func (r *ReportingPlugin) typedRequestLggr(seqNr uint64, requestID, requestType string) logger.SugaredLogger { return r.requestLggr(seqNr, requestID).With("requestType", requestType) } diff --git a/core/services/ocr2/plugins/vault/transmitter.go b/core/services/ocr2/plugins/vault/transmitter.go index a6215325701..3377cc32c16 100644 --- a/core/services/ocr2/plugins/vault/transmitter.go +++ b/core/services/ocr2/plugins/vault/transmitter.go @@ -16,13 +16,13 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/capabilities/actions/vault" "github.com/smartcontractkit/chainlink-common/pkg/capabilities/consensus/requests" + "github.com/smartcontractkit/chainlink-common/pkg/logger" vaultcap "github.com/smartcontractkit/chainlink/v2/core/capabilities/vault" "github.com/smartcontractkit/chainlink/v2/core/capabilities/vault/vaulttypes" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) type Transmitter struct { - lggr logger.Logger + lggr logger.SugaredLogger handler *requests.Handler[*vaulttypes.Request, *vaulttypes.Response] fromAccount types.Account lifecycle *vaultcap.RequestLifecycleTracker @@ -30,7 +30,7 @@ type Transmitter struct { func NewTransmitter(lggr logger.Logger, fromAccount types.Account, handler *requests.Handler[*vaulttypes.Request, *vaulttypes.Response], lifecycle *vaultcap.RequestLifecycleTracker) *Transmitter { return &Transmitter{ - lggr: lggr.Named("VaultTransmitter"), + lggr: logger.Sugared(lggr).Named("VaultTransmitter"), handler: handler, fromAccount: fromAccount, lifecycle: lifecycle, diff --git a/core/services/ocr2/validate/validate.go b/core/services/ocr2/validate/validate.go index e22ab9b9dfb..5e2b8668e1a 100644 --- a/core/services/ocr2/validate/validate.go +++ b/core/services/ocr2/validate/validate.go @@ -30,7 +30,7 @@ import ( // ValidatedOracleSpecToml validates an oracle spec that came from TOML func ValidatedOracleSpecToml(ctx context.Context, config OCR2Config, insConf InsecureConfig, tomlString string, rc plugins.RegistrarConfig) (job.Job, error) { - var jb = job.Job{} + jb := job.Job{} var spec job.OCR2OracleSpec tree, err := toml.Load(tomlString) if err != nil { @@ -166,14 +166,12 @@ type OCR2GenericPluginConfig struct { } func (o *OCR2GenericPluginConfig) UnmarshalJSON(data []byte) error { - err := json.Unmarshal(data, &o.innerConfig) - if err != nil { - return nil - } + // innerConfig is best-effort: ignore a type mismatch so the raw PluginConfig + // map below is always populated. + _ = json.Unmarshal(data, &o.innerConfig) m := map[string]any{} - err = json.Unmarshal(data, &m) - if err != nil { + if err := json.Unmarshal(data, &m); err != nil { return err } diff --git a/core/services/ocrbootstrap/database.go b/core/services/ocrbootstrap/database.go index 8e4ed67cbfb..c3ab98f0ea8 100644 --- a/core/services/ocrbootstrap/database.go +++ b/core/services/ocrbootstrap/database.go @@ -9,8 +9,8 @@ import ( ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) type db struct { @@ -80,7 +80,7 @@ LIMIT 1`, d.oracleSpecID) } func (d *db) WriteConfig(ctx context.Context, c ocrtypes.ContractConfig) error { - var signers [][]byte + signers := make([][]byte, 0, len(c.Signers)) for _, s := range c.Signers { signers = append(signers, []byte(s)) } diff --git a/core/services/ocrbootstrap/delegate.go b/core/services/ocrbootstrap/delegate.go index af9d75a4ef5..662ead61a3c 100644 --- a/core/services/ocrbootstrap/delegate.go +++ b/core/services/ocrbootstrap/delegate.go @@ -55,7 +55,7 @@ func NewDelegateBootstrap( ds sqlutil.DataSource, jobORM job.ORM, peerWrapper *ocrcommon.SingletonPeerWrapper, - lggr logger.Logger, + lggr logger.SugaredLogger, ocr2Cfg validate.OCR2Config, insecureCfg validate.InsecureConfig, relayers RelayGetter, diff --git a/core/services/ocrcommon/adapters.go b/core/services/ocrcommon/adapters.go index 0aad9fcf2e6..d208a82eb68 100644 --- a/core/services/ocrcommon/adapters.go +++ b/core/services/ocrcommon/adapters.go @@ -19,7 +19,7 @@ import ( "github.com/smartcontractkit/chainlink-common/keystore/corekeys" "github.com/smartcontractkit/chainlink-common/keystore/corekeys/ocr2key" - "github.com/smartcontractkit/chainlink/v2/core/logger" + "github.com/smartcontractkit/chainlink-common/pkg/logger" ) var _ ocr3types.OnchainKeyring[[]byte] = (*OCR3OnchainKeyringAdapter)(nil) @@ -40,7 +40,7 @@ func (k *OCR3OnchainKeyringAdapter) Sign(digest ocrtypes.ConfigDigest, seqNr uin return k.o.Sign(ocrtypes.ReportContext{ ReportTimestamp: ocrtypes.ReportTimestamp{ ConfigDigest: digest, - Epoch: uint32(seqNr), + Epoch: uint32(seqNr), //nolint:gosec // seqNr maps to the uint32 epoch field Round: 0, }, ExtraHash: [32]byte(make([]byte, 32)), @@ -51,7 +51,7 @@ func (k *OCR3OnchainKeyringAdapter) Verify(opk ocrtypes.OnchainPublicKey, digest return k.o.Verify(opk, ocrtypes.ReportContext{ ReportTimestamp: ocrtypes.ReportTimestamp{ ConfigDigest: digest, - Epoch: uint32(seqNr), + Epoch: uint32(seqNr), //nolint:gosec // seqNr maps to the uint32 epoch field Round: 0, }, ExtraHash: [32]byte(make([]byte, 32)), @@ -76,7 +76,7 @@ func (c *OCR3ContractTransmitterAdapter) Transmit(ctx context.Context, digest oc return c.ct.Transmit(ctx, ocrtypes.ReportContext{ ReportTimestamp: ocrtypes.ReportTimestamp{ ConfigDigest: digest, - Epoch: uint32(seqNr), + Epoch: uint32(seqNr), //nolint:gosec // seqNr maps to the uint32 epoch field Round: 0, }, ExtraHash: [32]byte(make([]byte, 32)), @@ -87,8 +87,10 @@ func (c *OCR3ContractTransmitterAdapter) FromAccount(ctx context.Context) (ocrty return c.ct.FromAccount(ctx) } -var _ ocr3types.OnchainKeyring[[]byte] = (*OCR3OnchainKeyringMultiChainAdapter)(nil) -var _ ocr3types.OnchainKeyring2[[]byte] = (*OCR3OnchainKeyringMultiChainAdapter)(nil) +var ( + _ ocr3types.OnchainKeyring[[]byte] = (*OCR3OnchainKeyringMultiChainAdapter)(nil) + _ ocr3types.OnchainKeyring2[[]byte] = (*OCR3OnchainKeyringMultiChainAdapter)(nil) +) func MarshalMultichainKeyBundle(ost map[string]ocr2key.KeyBundle) (ocrtypes.OnchainPublicKey, error) { pubKeys := map[string]ocrtypes.OnchainPublicKey{} @@ -245,7 +247,7 @@ func (a *OCR3OnchainKeyringMultiChainAdapter) Sign(digest ocrtypes.ConfigDigest, return kb.Sign(ocrtypes.ReportContext{ ReportTimestamp: ocrtypes.ReportTimestamp{ ConfigDigest: digest, - Epoch: uint32(seqNr), + Epoch: uint32(seqNr), //nolint:gosec // seqNr maps to the uint32 epoch field Round: 0, }, ExtraHash: [32]byte(make([]byte, 32)), @@ -271,7 +273,7 @@ func (a *OCR3OnchainKeyringMultiChainAdapter) Verify(opk ocrtypes.OnchainPublicK return kb.Verify(publicKey, ocrtypes.ReportContext{ ReportTimestamp: ocrtypes.ReportTimestamp{ ConfigDigest: digest, - Epoch: uint32(seqNr), + Epoch: uint32(seqNr), //nolint:gosec // seqNr maps to the uint32 epoch field Round: 0, }, ExtraHash: [32]byte(make([]byte, 32)), diff --git a/core/services/ocrcommon/adapters_test.go b/core/services/ocrcommon/adapters_test.go index a03dfe783ac..9378d8b0aff 100644 --- a/core/services/ocrcommon/adapters_test.go +++ b/core/services/ocrcommon/adapters_test.go @@ -45,8 +45,7 @@ var ( sigs = []byte("some-signatures") ) -type fakeOnchainKeyring struct { -} +type fakeOnchainKeyring struct{} func (f fakeOnchainKeyring) PublicKey() ocrtypes.OnchainPublicKey { return pubKey @@ -57,7 +56,7 @@ func (f fakeOnchainKeyring) Sign(rc ocrtypes.ReportContext, r ocrtypes.Report) ( return nil, fmt.Errorf("expected configDigest %v but got %v", configDigest, rc.ConfigDigest) } - if rc.Epoch != uint32(seqNr) { + if rc.Epoch != uint32(seqNr) { //nolint:gosec // seqNr is a small fixed test value return nil, fmt.Errorf("expected Epoch %v but got %v", seqNr, rc.Epoch) } @@ -80,7 +79,7 @@ func (f fakeOnchainKeyring) Verify(pk ocrtypes.OnchainPublicKey, rc ocrtypes.Rep return false } - if rc.Epoch != uint32(seqNr) { + if rc.Epoch != uint32(seqNr) { //nolint:gosec // seqNr is a small fixed test value return false } @@ -291,8 +290,7 @@ func TestNewOCR3OnchainKeyringMultiChainAdapter_VerifyFromDifferentNodesPublicKe var _ ocrtypes.ContractTransmitter = (*fakeContractTransmitter)(nil) -type fakeContractTransmitter struct { -} +type fakeContractTransmitter struct{} func (f fakeContractTransmitter) Transmit(ctx context.Context, rc ocrtypes.ReportContext, report ocrtypes.Report, s []ocrtypes.AttributedOnchainSignature) error { if !reflect.DeepEqual(report, rwi.Report) { @@ -307,7 +305,7 @@ func (f fakeContractTransmitter) Transmit(ctx context.Context, rc ocrtypes.Repor return fmt.Errorf("expected configDigest %v but got %v", configDigest, rc.ConfigDigest) } - if rc.Epoch != uint32(seqNr) { + if rc.Epoch != uint32(seqNr) { //nolint:gosec // seqNr is a small fixed test value return fmt.Errorf("expected Epoch %v but got %v", seqNr, rc.Epoch) } diff --git a/core/services/ocrcommon/data_source.go b/core/services/ocrcommon/data_source.go index ea5b0a7ab0d..c378e2d6a8b 100644 --- a/core/services/ocrcommon/data_source.go +++ b/core/services/ocrcommon/data_source.go @@ -14,10 +14,10 @@ import ( "github.com/smartcontractkit/libocr/offchainreporting2/reportingplugin/median" ocr2types "github.com/smartcontractkit/libocr/offchainreporting2plus/types" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" "github.com/smartcontractkit/chainlink/v2/core/bridges" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/median/config" "github.com/smartcontractkit/chainlink/v2/core/services/pipeline" @@ -103,9 +103,11 @@ func NewInMemoryDataSource(pr pipeline.Runner, jb job.Job, spec pipeline.Spec, l } } -const defaultUpdateInterval = time.Minute * 5 -const defaultStalenessAlertThreshold = time.Hour * 24 -const dataSourceCacheKey = "dscache" +const ( + defaultUpdateInterval = time.Minute * 5 + defaultStalenessAlertThreshold = time.Hour * 24 + dataSourceCacheKey = "dscache" +) type DataSourceCacheService interface { Start(context.Context) error diff --git a/core/services/ocrcommon/data_source_test.go b/core/services/ocrcommon/data_source_test.go index 0efdc2a3ebe..b93314c8afe 100644 --- a/core/services/ocrcommon/data_source_test.go +++ b/core/services/ocrcommon/data_source_test.go @@ -120,7 +120,7 @@ func Test_CachedInMemoryDataSourceErrHandling(t *testing.T) { persistedVal := sqlutil.NewI(1337) result, err := json.Marshal(&ocrcommon.ResultTimePair{Result: *persistedVal, Time: time.Now()}) - assert.NoError(t, err) + require.NoError(t, err) mockKVStore.On("Get", mock.Anything, mock.Anything).Return(result, nil) // set updater to a long time so that it doesn't log errors after the test is done @@ -198,8 +198,8 @@ func Test_InMemoryDataSourceWithProm(t *testing.T) { require.NoError(t, err) assert.JSONEq(t, jsonParseTaskValue, val.String()) // returns expected value after pipeline run - assert.Equal(t, cast.ToFloat64(jsonParseTaskValue), promtestutil.ToFloat64(ocrcommon.PromOcrMedianValues)) - assert.Equal(t, cast.ToFloat64(jsonParseTaskValue), promtestutil.ToFloat64(ocrcommon.PromBridgeJsonParseValues)) + assert.InEpsilon(t, cast.ToFloat64(jsonParseTaskValue), promtestutil.ToFloat64(ocrcommon.PromOcrMedianValues), 1e-9) + assert.InEpsilon(t, cast.ToFloat64(jsonParseTaskValue), promtestutil.ToFloat64(ocrcommon.PromBridgeJSONParseValues), 1e-9) } type mockSaver struct { diff --git a/core/services/ocrcommon/discoverer_database_test.go b/core/services/ocrcommon/discoverer_database_test.go index 2e6b7bad556..a6f175d4522 100644 --- a/core/services/ocrcommon/discoverer_database_test.go +++ b/core/services/ocrcommon/discoverer_database_test.go @@ -49,12 +49,12 @@ func Test_DiscovererDatabase(t *testing.T) { t.Run(tt.name+" StoreAnnouncement writes a value", func(t *testing.T) { ann := []byte{1, 2, 3} err := dd1.StoreAnnouncement(ctx, "remote1", ann) - assert.NoError(t, err) + require.NoError(t, err) // test upsert ann = []byte{4, 5, 6} err = dd1.StoreAnnouncement(ctx, "remote1", ann) - assert.NoError(t, err) + require.NoError(t, err) // write a different value ann = []byte{7, 8, 9} @@ -80,7 +80,7 @@ func Test_DiscovererDatabase(t *testing.T) { t.Run(tt.name+" is scoped to local peer ID", func(t *testing.T) { ann := []byte{10, 11, 12} err := dd2.StoreAnnouncement(ctx, "remote1", ann) - assert.NoError(t, err) + require.NoError(t, err) announcements, err := dd2.ReadAnnouncements(ctx, []string{"remote1"}) require.NoError(t, err) diff --git a/core/services/ocrcommon/peer_wrapper.go b/core/services/ocrcommon/peer_wrapper.go index 53c8ad16c67..3f4d4f59e52 100644 --- a/core/services/ocrcommon/peer_wrapper.go +++ b/core/services/ocrcommon/peer_wrapper.go @@ -16,11 +16,10 @@ import ( ragetypes "github.com/smartcontractkit/libocr/ragep2p/types" "github.com/smartcontractkit/chainlink-common/keystore/corekeys/p2pkey" - commonlogger "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" "github.com/smartcontractkit/chainlink/v2/core/config" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/keystore" ) @@ -51,7 +50,7 @@ type ( p2pCfg config.P2P ocrCfg PeerWrapperOCRConfig ds sqlutil.DataSource - lggr logger.Logger + lggr logger.SugaredLogger PeerID p2pkey.PeerID // Used at shutdown to stop all of this peer's goroutines @@ -87,7 +86,7 @@ func NewSingletonPeerWrapper(keyStore keystore.Master, p2pCfg config.P2P, ocrCfg p2pCfg: p2pCfg, ocrCfg: ocrCfg, ds: ds, - lggr: lggr.Named("SingletonPeerWrapper"), + lggr: logger.Sugared(lggr).Named("SingletonPeerWrapper"), } } @@ -147,7 +146,7 @@ func (p *SingletonPeerWrapper) peerConfig() (ocrnetworking.PeerConfig, error) { config := p.p2pCfg peerConfig := ocrnetworking.PeerConfig{ PeerKeyring: peerKeyring, - Logger: commonlogger.NewOCRWrapper(p.lggr, p.ocrCfg.TraceLogging(), func(string) {}), + Logger: logger.NewOCRWrapper(p.lggr, p.ocrCfg.TraceLogging(), func(string) {}), // V2 config V2ListenAddresses: config.V2().ListenAddresses(), diff --git a/core/services/ocrcommon/prom.go b/core/services/ocrcommon/prom.go index 725cd121c73..21ec1303220 100644 --- a/core/services/ocrcommon/prom.go +++ b/core/services/ocrcommon/prom.go @@ -12,7 +12,7 @@ import ( ) var ( - PromBridgeJsonParseValues = promauto.NewGaugeVec(prometheus.GaugeOpts{ + PromBridgeJSONParseValues = promauto.NewGaugeVec(prometheus.GaugeOpts{ Name: "bridge_json_parse_values", Help: "Values returned by json_parse for bridge task", }, @@ -38,7 +38,7 @@ func promSetBridgeParseMetrics(ds *inMemoryDataSource, trrs *pipeline.TaskRunRes if nextTask != nil && nextTask.Task.Type() == pipeline.TaskTypeJSONParse { fetchedValue := cast.ToFloat64(nextTask.Result.Value) - PromBridgeJsonParseValues.WithLabelValues(strconv.Itoa(int(ds.jb.ID)), ds.jb.Name.String, trr.Task.(*pipeline.BridgeTask).Name, trr.Task.DotID()).Set(fetchedValue) + PromBridgeJSONParseValues.WithLabelValues(strconv.Itoa(int(ds.jb.ID)), ds.jb.Name.String, trr.Task.(*pipeline.BridgeTask).Name, trr.Task.DotID()).Set(fetchedValue) } } } diff --git a/core/services/ocrcommon/run_saver.go b/core/services/ocrcommon/run_saver.go index 52ffb31cea0..c6610df60ae 100644 --- a/core/services/ocrcommon/run_saver.go +++ b/core/services/ocrcommon/run_saver.go @@ -4,9 +4,9 @@ import ( "context" "time" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/pipeline" ) @@ -21,7 +21,7 @@ type RunResultSaver struct { runResults chan *pipeline.Run pipelineRunner Runner stopCh services.StopChan - logger logger.Logger + logger logger.SugaredLogger } func (r *RunResultSaver) HealthReport() map[string]error { @@ -31,14 +31,14 @@ func (r *RunResultSaver) HealthReport() map[string]error { func (r *RunResultSaver) Name() string { return r.logger.Name() } func NewResultRunSaver(pipelineRunner Runner, - logger logger.Logger, maxSuccessfulRuns uint64, resultsWriteDepth uint64, + lggr logger.Logger, maxSuccessfulRuns, resultsWriteDepth uint64, ) *RunResultSaver { return &RunResultSaver{ maxSuccessfulRuns: maxSuccessfulRuns, runResults: make(chan *pipeline.Run, resultsWriteDepth), pipelineRunner: pipelineRunner, stopCh: make(chan struct{}), - logger: logger.Named("RunResultSaver"), + logger: logger.Sugared(lggr).Named("RunResultSaver"), } } diff --git a/core/services/ocrcommon/telemetry.go b/core/services/ocrcommon/telemetry.go index 3d49054110c..11de8f115da 100644 --- a/core/services/ocrcommon/telemetry.go +++ b/core/services/ocrcommon/telemetry.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "math" "math/big" "strings" @@ -220,12 +221,12 @@ func parseEATelemetry(b []byte) (EATelemetry, error) { }, nil } -// getJsonParsedValue checks if the next logical task is of type pipeline.TaskTypeJSONParse and tries to return +// getJSONParsedValue checks if the next logical task is of type pipeline.TaskTypeJSONParse and tries to return // the response as a *big.Int. // Currently utils.ToDecimal cannot handle hex strings, so this function also has a special case, // to check and handle if the result is a hex string, if the call to utils.ToDecimal fails. // Draft PR to add hex string handling to utils.ToDecimal: https://github.com/smartcontractkit/chainlink/pull/14841 -func getJsonParsedValue(trr pipeline.TaskRunResult, trrs *pipeline.TaskRunResults) *float64 { +func getJSONParsedValue(trr pipeline.TaskRunResult, trrs *pipeline.TaskRunResults) *float64 { nextTask := trrs.GetNextTaskOf(trr) if nextTask != nil && nextTask.Task.Type() == pipeline.TaskTypeJSONParse { asDecimal, err := utils.ToDecimal(nextTask.Result.Value) @@ -273,7 +274,7 @@ func (e *EnhancedTelemetryService[T]) getObservation(finalResult *pipeline.Final } func (e *EnhancedTelemetryService[T]) getParsedValue(trrs *pipeline.TaskRunResults, trr pipeline.TaskRunResult) float64 { - parsedValue := getJsonParsedValue(trr, trrs) + parsedValue := getJSONParsedValue(trr, trrs) if parsedValue == nil { return 0 } @@ -431,7 +432,11 @@ func (e *EnhancedTelemetryService[T]) collectMercuryEnhancedTelemetry(d Enhanced bp = obs.BenchmarkPrice.Val } if obs.MarketStatus.Err == nil { - marketStatus = telem.MarketStatus(obs.MarketStatus.Val) + if obs.MarketStatus.Val > math.MaxInt32 { + marketStatus = telem.MarketStatus_UNKNOWN + } else { + marketStatus = telem.MarketStatus(obs.MarketStatus.Val) + } } } diff --git a/core/services/ocrcommon/telemetry_test.go b/core/services/ocrcommon/telemetry_test.go index 85c31854934..ea431b60e2f 100644 --- a/core/services/ocrcommon/telemetry_test.go +++ b/core/services/ocrcommon/telemetry_test.go @@ -167,7 +167,7 @@ func TestGetChainID(t *testing.T) { func TestParseEATelemetry(t *testing.T) { ea, err := parseEATelemetry([]byte(bridgeResponse)) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, "data-source-name", ea.DataSource) assert.Equal(t, int64(92233720368547760), ea.ProviderRequestedTimestamp) assert.Equal(t, int64(-92233720368547760), ea.ProviderReceivedTimestamp) @@ -179,14 +179,14 @@ func TestParseEATelemetry(t *testing.T) { } func TestGetJsonParsedValue(t *testing.T) { - resp := getJsonParsedValue(trrs[0], &trrs) - assert.Equal(t, 123456.123456789, *resp) + resp := getJSONParsedValue(trrs[0], &trrs) + assert.InEpsilon(t, 123456.123456789, *resp, 1e-9) trrs[1].Result.Value = nil - resp = getJsonParsedValue(trrs[0], &trrs) + resp = getJSONParsedValue(trrs[0], &trrs) assert.Nil(t, resp) - resp = getJsonParsedValue(trrs[1], &trrs) + resp = getJSONParsedValue(trrs[1], &trrs) assert.Nil(t, resp) } @@ -211,7 +211,7 @@ func TestGetJsonParsedValueHexValues(t *testing.T) { }, } - resp := getJsonParsedValue(trrsHexData[0], &trrsHexData) + resp := getJSONParsedValue(trrsHexData[0], &trrsHexData) assert.InDelta(t, 109519.0, *resp, 0) trrsHexData = pipeline.TaskRunResults{ @@ -234,7 +234,7 @@ func TestGetJsonParsedValueHexValues(t *testing.T) { }, } - resp = getJsonParsedValue(trrsHexData[0], &trrsHexData) + resp = getJSONParsedValue(trrsHexData[0], &trrsHexData) assert.InDelta(t, 109519.0, *resp, 0) trrsHexData = pipeline.TaskRunResults{ @@ -257,7 +257,7 @@ func TestGetJsonParsedValueHexValues(t *testing.T) { }, } - resp = getJsonParsedValue(trrsHexData[0], &trrsHexData) + resp = getJSONParsedValue(trrsHexData[0], &trrsHexData) assert.Nil(t, resp) trrsHexData = pipeline.TaskRunResults{ @@ -280,7 +280,7 @@ func TestGetJsonParsedValueHexValues(t *testing.T) { }, } - resp = getJsonParsedValue(trrsHexData[0], &trrsHexData) + resp = getJSONParsedValue(trrsHexData[0], &trrsHexData) assert.Nil(t, resp) } @@ -442,7 +442,8 @@ func TestCollectAndSend(t *testing.T) { Result: pipeline.Result{ Value: bridgeResponse, }, - }} + }, + } observationTimestamp := ObservationTimestamp{ Round: 0, @@ -467,7 +468,8 @@ func TestCollectAndSend(t *testing.T) { Result: pipeline.Result{ Value: "[]", }, - }} + }, + } enhancedTelemChan <- EnhancedTelemetryData{ TaskRunResults: *badTrrs, FinalResults: *finalResult, @@ -628,9 +630,9 @@ func TestGetPricesFromBridgeByTelemetryField(t *testing.T) { benchmarkPrice, bidPrice, askPrice := getPricesFromBridgeTask(lggr, taskRunResults[0], taskRunResults, 1) - require.Equal(t, 123456.123456, benchmarkPrice) - require.Equal(t, 1234567.1234567, bidPrice) - require.Equal(t, 321123.0, askPrice) + require.InEpsilon(t, 123456.123456, benchmarkPrice, 1e-9) + require.InEpsilon(t, 1234567.1234567, bidPrice, 1e-9) + require.InEpsilon(t, 321123.0, askPrice, 1e-9) // now removing the TaskTags will throw off the parsed order - and we'll be parsing the "incorrect" prices // according to the legacy ordering approach @@ -639,23 +641,23 @@ func TestGetPricesFromBridgeByTelemetryField(t *testing.T) { jsonParseTaskBenchmark.Tags = "" wrongBenchmarkPrice, wrongBidPrice, wrongAskPrice := getPricesFromBridgeTask(lggr, taskRunResults[0], taskRunResults, 1) - require.Equal(t, 1234567.1234567, wrongBenchmarkPrice) - require.Equal(t, 321123.0, wrongBidPrice) - require.Equal(t, 123456.123456, wrongAskPrice) + require.InEpsilon(t, 1234567.1234567, wrongBenchmarkPrice, 1e-9) + require.InEpsilon(t, 321123.0, wrongBidPrice, 1e-9) + require.InEpsilon(t, 123456.123456, wrongAskPrice, 1e-9) } func TestGetPricesFromBridgeTaskByOrder(t *testing.T) { lggr, logs := logger.TestLoggerObserved(t, zap.WarnLevel) benchmarkPrice, bid, ask := getPricesFromBridgeTask(lggr, trrsMercuryV1[0], trrsMercuryV1, 1) - require.Equal(t, 123456.123456, benchmarkPrice) - require.Equal(t, 1234567.1234567, bid) - require.Equal(t, float64(321123), ask) + require.InEpsilon(t, 123456.123456, benchmarkPrice, 1e-9) + require.InEpsilon(t, 1234567.1234567, bid, 1e-9) + require.InEpsilon(t, float64(321123), ask, 1e-9) benchmarkPrice, bid, ask = getPricesFromBridgeTask(lggr, trrsMercuryV1[0], pipeline.TaskRunResults{}, 1) - require.Equal(t, float64(0), benchmarkPrice) - require.Equal(t, float64(0), bid) - require.Equal(t, float64(0), ask) + require.InDelta(t, float64(0), benchmarkPrice, 1e-9) + require.InDelta(t, float64(0), bid, 1e-9) + require.InDelta(t, float64(0), ask, 1e-9) require.Equal(t, 0, logs.Len()) tt := trrsMercuryV1[:2] @@ -699,17 +701,18 @@ func TestGetPricesFromBridgeTaskByOrder(t *testing.T) { Result: pipeline.Result{ Value: nil, }, - }} + }, + } benchmarkPrice, bid, ask = getPricesFromBridgeTask(lggr, trrsMercuryV1[0], trrs2, 3) - require.Equal(t, benchmarkPrice, float64(0)) - require.Equal(t, bid, float64(0)) - require.Equal(t, ask, float64(0)) + require.InDelta(t, float64(0), benchmarkPrice, 1e-9) + require.InDelta(t, float64(0), bid, 1e-9) + require.InDelta(t, float64(0), ask, 1e-9) require.Equal(t, 0, logs.Len()) benchmarkPrice, bid, ask = getPricesFromBridgeTask(lggr, trrsMercuryV1[0], trrsMercuryV2, 2) - require.Equal(t, 123456.123456, benchmarkPrice) - require.Equal(t, float64(0), bid) - require.Equal(t, float64(0), ask) + require.InEpsilon(t, 123456.123456, benchmarkPrice, 1e-9) + require.InDelta(t, float64(0), bid, 1e-9) + require.InDelta(t, float64(0), ask, 1e-9) } func TestShouldCollectEnhancedTelemetryMercury(t *testing.T) { @@ -748,7 +751,7 @@ func TestParseBridgeRequestData(t *testing.T) { } func getViewFunctionTaskRunResults() pipeline.TaskRunResults { - var taskViewFunctionParseValue = func() pipeline.MultiplyTask { + taskViewFunctionParseValue := func() pipeline.MultiplyTask { task := pipeline.MultiplyTask{ BaseTask: pipeline.NewBaseTask(3, "ds1_parse", nil, nil, 3), Times: "1", @@ -757,12 +760,12 @@ func getViewFunctionTaskRunResults() pipeline.TaskRunResults { return task }() - var taskViewFunctionDecode = pipeline.ETHABIDecodeTask{ + taskViewFunctionDecode := pipeline.ETHABIDecodeTask{ ABI: "uint256 data", BaseTask: pipeline.NewBaseTask(2, "ds1_decode", nil, []pipeline.Task{&taskViewFunctionParseValue}, 2), } - var taskViewFunctionJSONParse = pipeline.JSONParseTask{ + taskViewFunctionJSONParse := pipeline.JSONParseTask{ BaseTask: pipeline.NewBaseTask(1, "ds1_parse", nil, []pipeline.Task{&taskViewFunctionDecode}, 1), } @@ -781,7 +784,7 @@ func getViewFunctionTaskRunResults() pipeline.TaskRunResults { } }` - var taskViewFunctionBridgeRequest = pipeline.BridgeTask{ + taskViewFunctionBridgeRequest := pipeline.BridgeTask{ Name: "bridge-view-function", BaseTask: pipeline.NewBaseTask(0, "ds1", nil, []pipeline.Task{&taskViewFunctionJSONParse}, 0), RequestData: `{"data":{"address":"0x1234","signature":"function stEthPerToken() external view returns (uint256)"}}`, @@ -988,13 +991,15 @@ func TestCollectMercuryEnhancedTelemetryV1(t *testing.T) { chTelem <- EnhancedTelemetryMercuryData{ TaskRunResults: pipeline.TaskRunResults{ - pipeline.TaskRunResult{Task: &pipeline.BridgeTask{ - Name: "test-mercury-bridge-1", - BaseTask: pipeline.NewBaseTask(0, "ds1", nil, nil, 0), - }, + pipeline.TaskRunResult{ + Task: &pipeline.BridgeTask{ + Name: "test-mercury-bridge-1", + BaseTask: pipeline.NewBaseTask(0, "ds1", nil, nil, 0), + }, Result: pipeline.Result{ Value: nil, - }}, + }, + }, }, V1Observation: &mercuryv1.Observation{}, RepTimestamp: types.ReportTimestamp{ @@ -1103,13 +1108,15 @@ func TestCollectMercuryEnhancedTelemetryV2(t *testing.T) { chTelem <- EnhancedTelemetryMercuryData{ TaskRunResults: pipeline.TaskRunResults{ - pipeline.TaskRunResult{Task: &pipeline.BridgeTask{ - Name: "test-mercury-bridge-2", - BaseTask: pipeline.NewBaseTask(0, "ds1", nil, nil, 0), - }, + pipeline.TaskRunResult{ + Task: &pipeline.BridgeTask{ + Name: "test-mercury-bridge-2", + BaseTask: pipeline.NewBaseTask(0, "ds1", nil, nil, 0), + }, Result: pipeline.Result{ Value: nil, - }}, + }, + }, }, V2Observation: &mercuryv2.Observation{}, RepTimestamp: types.ReportTimestamp{ diff --git a/core/services/p2p/shared_peer_test.go b/core/services/p2p/shared_peer_test.go index e982aa946d8..02e52a10548 100644 --- a/core/services/p2p/shared_peer_test.go +++ b/core/services/p2p/shared_peer_test.go @@ -74,10 +74,11 @@ func TestDon2DonSharedPeer_UpdateConnectionsByDONs(t *testing.T) { sp := p2p.NewDon2DonSharedPeer(pw, nil, logger.TestLogger(t)) require.NoError(t, sp.Start(t.Context())) - donPairs := []p2ptypes.DonPair{{ + donPairs := make([]p2ptypes.DonPair, 0, 2) + donPairs = append(donPairs, p2ptypes.DonPair{ {ID: 1, Members: []ragetypes.PeerID{myPeerID, peerID2}}, {ID: 2, Members: []ragetypes.PeerID{peerID2, peerID3}}, - }} + }) // Adding a new DON pair require.NoError(t, sp.UpdateConnectionsByDONs(t.Context(), donPairs, p2ptypes.StreamConfig{})) require.Equal(t, 1, mockPGFactory.newDonGroupCounter) diff --git a/core/services/periodicbackup/backup.go b/core/services/periodicbackup/backup.go index fb02a7537fd..61dd7ea6c24 100644 --- a/core/services/periodicbackup/backup.go +++ b/core/services/periodicbackup/backup.go @@ -11,9 +11,9 @@ import ( "github.com/pkg/errors" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink/v2/core/config" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/static" ) @@ -59,11 +59,11 @@ type ( ) // NewDatabaseBackup instantiates a *databaseBackup -func NewDatabaseBackup(dbUrl url.URL, rootDir string, backupConfig BackupConfig, lggr logger.Logger) (DatabaseBackup, error) { - lggr = lggr.Named("DatabaseBackup") - dbBackupUrl := backupConfig.URL() - if dbBackupUrl != nil { - dbUrl = *dbBackupUrl +func NewDatabaseBackup(dbURL url.URL, rootDir string, backupConfig BackupConfig, lggr logger.Logger) (DatabaseBackup, error) { + lggr = logger.Named(lggr, "DatabaseBackup") + dbBackupURL := backupConfig.URL() + if dbBackupURL != nil { + dbURL = *dbBackupURL } outputParentDir := filepath.Join(rootDir, "backup") @@ -78,7 +78,7 @@ func NewDatabaseBackup(dbUrl url.URL, rootDir string, backupConfig BackupConfig, return &databaseBackup{ services.StateMachine{}, lggr, - dbUrl, + dbURL, backupConfig.Mode(), backupConfig.Frequency(), outputParentDir, @@ -106,7 +106,7 @@ func (backup *databaseBackup) Start(context.Context) error { return case <-ticker.C: backup.logger.Infow("Starting automatic database backup, this can take a while. To disable periodic backups, set Database.Backup.Frequency=0. To disable database backups entirely, set Database.Backup.Mode=none.") - //nolint:errcheck + //nolint:errcheck // backup failure is surfaced via the logger and SvcErrBuffer backup.RunBackup(static.Version) } } @@ -141,7 +141,7 @@ func (backup *databaseBackup) RunBackup(version string) error { result, err := backup.runBackup(version) duration := time.Since(startAt) if err != nil { - backup.logger.Criticalw("Backup failed", "duration", duration, "err", err) + logger.Sugared(backup.logger).Criticalw("Backup failed", "duration", duration, "err", err) backup.SvcErrBuffer.Append(err) return err } @@ -185,12 +185,11 @@ func (backup *databaseBackup) runBackup(version string) (*backupResult, error) { maskedArgs := maskArgs(args) backup.logger.Debugf("Running pg_dump with: %v", maskedArgs) - cmd := exec.Command( + cmd := exec.CommandContext(context.Background(), "pg_dump", args..., ) _, err = cmd.Output() - if err != nil { partialResult := &backupResult{ size: 0, diff --git a/core/services/periodicbackup/backup_test.go b/core/services/periodicbackup/backup_test.go index 6e7f93d1857..ac24a2d3ac8 100644 --- a/core/services/periodicbackup/backup_test.go +++ b/core/services/periodicbackup/backup_test.go @@ -32,7 +32,7 @@ func must(t testing.TB, s string) *url.URL { func TestPeriodicBackup_RunBackup(t *testing.T) { backupConfig := newTestConfig(time.Minute, nil, "", config.DatabaseBackupModeFull) - periodicBackup := mustNewDatabaseBackup(t, *(must(t, string(env.DatabaseURL.Get()))), os.TempDir(), backupConfig) + periodicBackup := mustNewDatabaseBackup(t, *must(t, string(env.DatabaseURL.Get())), os.TempDir(), backupConfig) assert.False(t, periodicBackup.frequencyIsTooSmall()) result, err := periodicBackup.runBackup("0.9.9") @@ -51,7 +51,7 @@ func TestPeriodicBackup_RunBackup(t *testing.T) { func TestPeriodicBackup_RunBackupInLiteMode(t *testing.T) { backupConfig := newTestConfig(time.Minute, nil, "", config.DatabaseBackupModeLite) - periodicBackup := mustNewDatabaseBackup(t, *(must(t, string(env.DatabaseURL.Get()))), os.TempDir(), backupConfig) + periodicBackup := mustNewDatabaseBackup(t, *must(t, string(env.DatabaseURL.Get())), os.TempDir(), backupConfig) assert.False(t, periodicBackup.frequencyIsTooSmall()) result, err := periodicBackup.runBackup("0.9.9") @@ -70,7 +70,7 @@ func TestPeriodicBackup_RunBackupInLiteMode(t *testing.T) { func TestPeriodicBackup_RunBackupWithoutVersion(t *testing.T) { backupConfig := newTestConfig(time.Minute, nil, "", config.DatabaseBackupModeFull) - periodicBackup := mustNewDatabaseBackup(t, *(must(t, string(env.DatabaseURL.Get()))), os.TempDir(), backupConfig) + periodicBackup := mustNewDatabaseBackup(t, *must(t, string(env.DatabaseURL.Get())), os.TempDir(), backupConfig) assert.False(t, periodicBackup.frequencyIsTooSmall()) result, err := periodicBackup.runBackup(static.Unset) @@ -87,9 +87,9 @@ func TestPeriodicBackup_RunBackupWithoutVersion(t *testing.T) { } func TestPeriodicBackup_RunBackupViaAltUrlAndMaskPassword(t *testing.T) { - altUrl, _ := url.Parse("postgresql://invalid:some-pass@invalid") - backupConfig := newTestConfig(time.Minute, altUrl, "", config.DatabaseBackupModeFull) - periodicBackup := mustNewDatabaseBackup(t, *(must(t, string(env.DatabaseURL.Get()))), os.TempDir(), backupConfig) + altURL, _ := url.Parse("postgresql://invalid:some-pass@invalid") // betterleaks:allow + backupConfig := newTestConfig(time.Minute, altURL, "", config.DatabaseBackupModeFull) + periodicBackup := mustNewDatabaseBackup(t, *must(t, string(env.DatabaseURL.Get())), os.TempDir(), backupConfig) assert.False(t, periodicBackup.frequencyIsTooSmall()) partialResult, err := periodicBackup.runBackup("") @@ -99,14 +99,14 @@ func TestPeriodicBackup_RunBackupViaAltUrlAndMaskPassword(t *testing.T) { func TestPeriodicBackup_FrequencyTooSmall(t *testing.T) { backupConfig := newTestConfig(time.Second, nil, "", config.DatabaseBackupModeFull) - periodicBackup := mustNewDatabaseBackup(t, *(must(t, string(env.DatabaseURL.Get()))), os.TempDir(), backupConfig) + periodicBackup := mustNewDatabaseBackup(t, *must(t, string(env.DatabaseURL.Get())), os.TempDir(), backupConfig) assert.True(t, periodicBackup.frequencyIsTooSmall()) } func TestPeriodicBackup_AlternativeOutputDir(t *testing.T) { backupDir := filepath.Join(os.TempDir(), "alternative") backupConfig := newTestConfig(time.Second, nil, backupDir, config.DatabaseBackupModeFull) - periodicBackup := mustNewDatabaseBackup(t, *(must(t, string(env.DatabaseURL.Get()))), os.TempDir(), backupConfig) + periodicBackup := mustNewDatabaseBackup(t, *must(t, string(env.DatabaseURL.Get())), os.TempDir(), backupConfig) result, err := periodicBackup.runBackup("0.9.9") require.NoError(t, err, "error not nil for backup") diff --git a/core/services/pg/connection.go b/core/services/pg/connection.go index ae670afcc16..c667d63c21f 100644 --- a/core/services/pg/connection.go +++ b/core/services/pg/connection.go @@ -114,7 +114,7 @@ func checkVersion(db Getter, minVersion int) error { return nil } if version < minVersion { - return fmt.Errorf("The minimum required Postgres server version is %d, you are running: %d, which is EOL (see: https://www.postgresql.org/support/versioning/). It is recommended to upgrade your Postgres server. To forcibly override this check, set SKIP_PG_VERSION_CHECK=true", minVersion/10000, version/10000) + return fmt.Errorf("the minimum required Postgres server version is %d, you are running: %d, which is EOL (see: https://www.postgresql.org/support/versioning/). It is recommended to upgrade your Postgres server. To forcibly override this check, set SKIP_PG_VERSION_CHECK=true", minVersion/10000, version/10000) } return nil } diff --git a/core/services/pg/connection_test.go b/core/services/pg/connection_test.go index f21793371f2..26af2da2479 100644 --- a/core/services/pg/connection_test.go +++ b/core/services/pg/connection_test.go @@ -21,7 +21,7 @@ func (m *mockGetter) Get(dest any, query string, args ...any) error { if m.err != nil { return m.err } - *(dest.(*int)) = m.version + *dest.(*int) = m.version return nil } @@ -33,7 +33,7 @@ func Test_checkVersion(t *testing.T) { m := &mockGetter{version: 100000} err := checkVersion(m, 110000) require.Error(t, err) - assert.Contains(t, err.Error(), "The minimum required Postgres server version is 11, you are running: 10") + assert.Contains(t, err.Error(), "the minimum required Postgres server version is 11, you are running: 10") }) t.Run("when the version is at minimum", func(t *testing.T) { m := &mockGetter{version: 110000} diff --git a/core/services/pg/datatypes/json.go b/core/services/pg/datatypes/json.go index ac72a5a5ed4..7180e518495 100644 --- a/core/services/pg/datatypes/json.go +++ b/core/services/pg/datatypes/json.go @@ -5,5 +5,6 @@ import ( ) // JSON defined JSON data type, need to implements driver.Valuer, sql.Scanner interface +// // Deprecated: Use sqlutil.JSON instead type JSON = sqlutil.JSON diff --git a/core/services/pg/lease_lock.go b/core/services/pg/lease_lock.go index e61f34b6fe0..5e731191dac 100644 --- a/core/services/pg/lease_lock.go +++ b/core/services/pg/lease_lock.go @@ -12,10 +12,10 @@ import ( "github.com/jmoiron/sqlx" "github.com/pkg/errors" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" "github.com/smartcontractkit/chainlink-common/pkg/timeutil" "github.com/smartcontractkit/chainlink-common/pkg/utils" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) // LeaseLock handles taking an exclusive lease on database access. This is not @@ -70,7 +70,7 @@ type leaseLock struct { db *sqlx.DB conn *sqlx.Conn cfg LeaseLockConfig - logger logger.Logger + logger logger.SugaredLogger stop func() wgReleased sync.WaitGroup } @@ -80,7 +80,7 @@ func NewLeaseLock(db *sqlx.DB, appID uuid.UUID, lggr logger.Logger, cfg LeaseLoc if cfg.LeaseRefreshInterval > cfg.LeaseDuration/2 { panic("refresh interval must be <= half the lease duration") } - return &leaseLock{appID, db, nil, cfg, lggr.Named("LeaseLock").With("appID", appID), func() {}, sync.WaitGroup{}} + return &leaseLock{appID, db, nil, cfg, logger.Sugared(lggr).Named("LeaseLock").With("appID", appID), func() {}, sync.WaitGroup{}} } // TakeAndHold will block and wait indefinitely until it can get its first lock or ctx is cancelled. diff --git a/core/services/pg/lease_lock_test.go b/core/services/pg/lease_lock_test.go index dbdf3061492..c0ac8124420 100644 --- a/core/services/pg/lease_lock_test.go +++ b/core/services/pg/lease_lock_test.go @@ -47,7 +47,9 @@ func Test_LeaseLock(t *testing.T) { leaseLock2 := newLeaseLock(t, db, cfg) go func() { defer leaseLock2.Release() - require.NoError(t, leaseLock2.TakeAndHold(t.Context())) + if !assert.NoError(t, leaseLock2.TakeAndHold(t.Context())) { + return + } close(started2) }() @@ -95,7 +97,9 @@ func Test_LeaseLock(t *testing.T) { gotLease := make(chan struct{}) go func() { errInternal := leaseLock.TakeAndHold(t.Context()) - require.NoError(t, errInternal) + if !assert.NoError(t, errInternal) { + return + } close(gotLease) }() diff --git a/core/services/pg/locked_db.go b/core/services/pg/locked_db.go index ae4b80a83c2..ac11ddd3187 100644 --- a/core/services/pg/locked_db.go +++ b/core/services/pg/locked_db.go @@ -9,9 +9,9 @@ import ( "github.com/jmoiron/sqlx" "github.com/pkg/errors" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink/v2/core/config" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/static" ) @@ -46,7 +46,7 @@ func NewLockedDB(appID uuid.UUID, cfg LockedDBConfig, lockCfg config.Lock, lggr appID: appID, cfg: cfg, lockCfg: lockCfg, - lggr: lggr.Named("LockedDB"), + lggr: logger.Named(lggr, "LockedDB"), } } @@ -84,8 +84,7 @@ func (l *lockedDb) Open(ctx context.Context) (err error) { l.lggr.Debugf("Using database locking mode: %s", lockingMode) // Take the lease before any other DB operations - switch lockingMode { - case "lease": + if lockingMode == "lease" { cfg := LeaseLockConfig{ DefaultQueryTimeout: l.cfg.DefaultQueryTimeout(), LeaseDuration: l.lockCfg.LeaseDuration(), @@ -148,5 +147,5 @@ func openDB(ctx context.Context, appID uuid.UUID, cfg LockedDBConfig) (db *sqlx. uri := cfg.URL() static.SetConsumerName(&uri, "App", &appID) db, err = NewConnection(ctx, uri.String(), cfg.DriverName(), cfg) - return + return db, err } diff --git a/core/services/pg/stats.go b/core/services/pg/stats.go index 3aa40580a90..e7760fcaa20 100644 --- a/core/services/pg/stats.go +++ b/core/services/pg/stats.go @@ -1,8 +1,8 @@ package pg import ( + "github.com/smartcontractkit/chainlink-common/pkg/logger" commonpg "github.com/smartcontractkit/chainlink-common/pkg/sqlutil/pg" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) type ( diff --git a/core/services/pipeline/task.vrfv2.go b/core/services/pipeline/task.vrfv2.go index a94fcffcf7d..795321cf0af 100644 --- a/core/services/pipeline/task.vrfv2.go +++ b/core/services/pipeline/task.vrfv2.go @@ -112,7 +112,7 @@ func (t *VRFTaskV2) Run(_ context.Context, lggr logger.Logger, vars Vars, inputs PreSeed: preSeed, BlockHash: common.BytesToHash(requestBlockHash), BlockNum: uint64(requestBlockNumber), - SubId: subID, + SubID: subID, CallbackGasLimit: callbackGasLimit, NumWords: numWords, Sender: sender, diff --git a/core/services/pipeline/task.vrfv2plus.go b/core/services/pipeline/task.vrfv2plus.go index ee3efa05e73..46b95f4b1c9 100644 --- a/core/services/pipeline/task.vrfv2plus.go +++ b/core/services/pipeline/task.vrfv2plus.go @@ -119,7 +119,7 @@ func (t *VRFTaskV2Plus) Run(_ context.Context, lggr logger.Logger, vars Vars, in PreSeed: preSeed, BlockHash: common.BytesToHash(requestBlockHash), BlockNum: uint64(requestBlockNumber), - SubId: subID, + SubID: subID, CallbackGasLimit: callbackGasLimit, NumWords: numWords, Sender: sender, diff --git a/core/services/registrysyncer/syncer.go b/core/services/registrysyncer/syncer.go index a7c68d096a4..79eb31282c3 100644 --- a/core/services/registrysyncer/syncer.go +++ b/core/services/registrysyncer/syncer.go @@ -64,9 +64,7 @@ type registrySyncer struct { var _ services.Service = ®istrySyncer{} -var ( - defaultTickInterval = 12 * time.Second -) +var defaultTickInterval = 12 * time.Second // New instantiates a new RegistrySyncer func New( @@ -379,7 +377,7 @@ func toCapabilityType(capabilityType uint8) capabilities.CapabilityType { } func toDONInfo(don kcr.CapabilitiesRegistryDONInfo) *capabilities.DON { - peerIDs := []p2ptypes.PeerID{} + peerIDs := make([]p2ptypes.PeerID, 0, len(don.NodeP2PIds)) for _, p := range don.NodeP2PIds { peerIDs = append(peerIDs, p) } diff --git a/core/services/registrysyncer/syncer_test.go b/core/services/registrysyncer/syncer_test.go index 3e38b7ee5f4..19544ecdb88 100644 --- a/core/services/registrysyncer/syncer_test.go +++ b/core/services/registrysyncer/syncer_test.go @@ -26,6 +26,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/capabilities" capabilitiespb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb" "github.com/smartcontractkit/chainlink-common/pkg/capabilities/registry" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/types" kcr_v1 "github.com/smartcontractkit/chainlink-evm/gethwrappers/keystone/generated/capabilities_registry_1_1_0" evmclient "github.com/smartcontractkit/chainlink-evm/pkg/client" @@ -37,7 +38,6 @@ import ( "github.com/smartcontractkit/chainlink-protos/cre/go/values" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/registrysyncer" syncerMocks "github.com/smartcontractkit/chainlink/v2/core/services/registrysyncer/mocks" ) @@ -91,7 +91,7 @@ func (c *crFactory) NewContractReader(ctx context.Context, cfg []byte) (types.Co } func newContractReaderFactory(t *testing.T, simulatedBackend *simulated.Backend) *crFactory { - lggr := logger.TestLogger(t) + lggr := logger.Test(t) client := evmclient.NewSimulatedBackendClient( t, simulatedBackend, @@ -182,7 +182,7 @@ func (o *orm) LatestRegistryMetadata(ctx context.Context) (*registry.RegistryMet } func toPeerIDs(ids [][32]byte) []p2ptypes.PeerID { - var pids []p2ptypes.PeerID + pids := make([]p2ptypes.PeerID, 0, len(ids)) for _, id := range ids { pids = append(pids, id) } @@ -285,8 +285,8 @@ func TestReader_Integration(t *testing.T) { db := pgtest.NewSqlxDB(t) factory := newContractReaderFactory(t, sim) - syncerORM := registrysyncer.NewORM(db, logger.TestLogger(t)) - syncer, err := registrysyncer.New(logger.TestLogger(t), func() (p2ptypes.PeerID, error) { return p2ptypes.PeerID{}, nil }, factory, regAddress.Hex(), syncerORM) + syncerORM := registrysyncer.NewORM(db, logger.Test(t)) + syncer, err := registrysyncer.New(logger.Test(t), func() (p2ptypes.PeerID, error) { return p2ptypes.PeerID{}, nil }, factory, regAddress.Hex(), syncerORM) require.NoError(t, err) l := &launcher{} @@ -452,7 +452,7 @@ func TestSyncer_DBIntegration(t *testing.T) { syncerORM := newORM(t) syncerORM.ormMock.On("LatestRegistryMetadata", mock.Anything).Return(nil, errors.New("no state found")) syncerORM.ormMock.On("AddRegistryMetadata", mock.Anything, mock.Anything).Return(nil) - syncer, err := newTestSyncer(logger.TestLogger(t), func() (p2ptypes.PeerID, error) { return p2ptypes.PeerID{}, nil }, factory, regAddress.Hex(), syncerORM) + syncer, err := newTestSyncer(logger.Test(t), func() (p2ptypes.PeerID, error) { return p2ptypes.PeerID{}, nil }, factory, regAddress.Hex(), syncerORM) require.NoError(t, err) l := &launcher{} @@ -483,7 +483,7 @@ func TestSyncer_DBIntegration(t *testing.T) { func TestSyncer_LocalNode(t *testing.T) { ctx := t.Context() - lggr := logger.TestLogger(t) + lggr := logger.Test(t) var pid p2ptypes.PeerID err := pid.UnmarshalText([]byte("12D3KooWBCF1XT5Wi8FzfgNCqRL76Swv8TRU3TiD4QiJm8NMNX7N")) diff --git a/core/services/registrysyncer/v2/syncer.go b/core/services/registrysyncer/v2/syncer.go index 075908c5169..a78fd2fd2e0 100644 --- a/core/services/registrysyncer/v2/syncer.go +++ b/core/services/registrysyncer/v2/syncer.go @@ -410,7 +410,7 @@ func toCapabilityType(capabilityType uint8) capabilities.CapabilityType { } func toDONInfo(don capabilities_registry_v2.CapabilitiesRegistryDONInfo) *capabilities.DON { - peerIDs := []p2ptypes.PeerID{} + peerIDs := make([]p2ptypes.PeerID, 0, len(don.NodeP2PIds)) for _, p := range don.NodeP2PIds { peerIDs = append(peerIDs, p) } diff --git a/core/services/registrysyncer/v2/syncer_test.go b/core/services/registrysyncer/v2/syncer_test.go index ebc4af13f8a..f0200346395 100644 --- a/core/services/registrysyncer/v2/syncer_test.go +++ b/core/services/registrysyncer/v2/syncer_test.go @@ -24,6 +24,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/capabilities" capabilitiespb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb" "github.com/smartcontractkit/chainlink-common/pkg/capabilities/registry" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" capabilities_registry_v2 "github.com/smartcontractkit/chainlink-evm/gethwrappers/workflow/generated/capabilities_registry_wrapper_v2" @@ -36,7 +37,6 @@ import ( "github.com/smartcontractkit/chainlink-protos/cre/go/values" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/registrysyncer" syncerMocks "github.com/smartcontractkit/chainlink/v2/core/services/registrysyncer/mocks" registrysyncer_v2 "github.com/smartcontractkit/chainlink/v2/core/services/registrysyncer/v2" @@ -64,7 +64,7 @@ func (c *crFactory) NewContractReader(ctx context.Context, cfg []byte) (types.Co } func newContractReaderFactory(t *testing.T, simulatedBackend *simulated.Backend) *crFactory { - lggr := logger.TestLogger(t) + lggr := logger.Test(t) client := evmclient.NewSimulatedBackendClient( t, simulatedBackend, @@ -164,7 +164,7 @@ func toPeerIDs(ids [][32]byte) []p2ptypes.PeerID { func TestReader_Integration(t *testing.T) { ctx := t.Context() - lggr := logger.TestLogger(t) + lggr := logger.Test(t) // Create a simulated backend similar to V1 tests owner := evmtestutils.MustNewSimTransactor(t) @@ -384,7 +384,7 @@ func TestReader_Integration(t *testing.T) { func TestSyncer_V2_DBIntegration(t *testing.T) { ctx := t.Context() - lggr := logger.TestLogger(t) + lggr := logger.Test(t) // Create a simulated backend similar to V1 tests owner := evmtestutils.MustNewSimTransactor(t) @@ -544,7 +544,7 @@ func TestSyncer_V2_DBIntegration(t *testing.T) { func TestSyncer_V2_LocalNode(t *testing.T) { ctx := t.Context() - lggr := logger.TestLogger(t) + lggr := logger.Test(t) var pid p2ptypes.PeerID err := pid.UnmarshalText([]byte("12D3KooWBCF1XT5Wi8FzfgNCqRL76Swv8TRU3TiD4QiJm8NMNX7N")) @@ -659,7 +659,7 @@ func TestSyncer_V2_LocalNode(t *testing.T) { func TestReader_V2_FamilyOperations(t *testing.T) { ctx := t.Context() - lggr := logger.TestLogger(t) + lggr := logger.Test(t) // Create a simulated backend owner := evmtestutils.MustNewSimTransactor(t) @@ -713,7 +713,7 @@ func TestReader_V2_FamilyOperations(t *testing.T) { nodeSetD := [][32]byte{randomWord(), randomWord(), randomWord()} // Create all nodes with both capabilities - allNodes := []capabilities_registry_v2.CapabilitiesRegistryNodeParams{} + allNodes := make([]capabilities_registry_v2.CapabilitiesRegistryNodeParams, 0, len(nodeSetA)+len(nodeSetB)+len(nodeSetC)+len(nodeSetD)) // Add nodes for DON A (workflow-family-a) for _, nodeID := range nodeSetA { @@ -1034,7 +1034,7 @@ func (r *CapabilitiesRegistryReader) GetDONsInFamily(ctx context.Context, family return familyADONs, err } -func (r *CapabilitiesRegistryReader) GetHistoricalDONInfo(ctx context.Context, donID uint32, configCount uint32) (*capabilities_registry_v2.CapabilitiesRegistryDONInfo, error) { +func (r *CapabilitiesRegistryReader) GetHistoricalDONInfo(ctx context.Context, donID, configCount uint32) (*capabilities_registry_v2.CapabilitiesRegistryDONInfo, error) { var historicalDON capabilities_registry_v2.CapabilitiesRegistryDONInfo err := r.contractReader.GetLatestValue( ctx, diff --git a/core/services/relay/evm/chain_components_test.go b/core/services/relay/evm/chain_components_test.go index 2cea3c8683b..a5937c5c217 100644 --- a/core/services/relay/evm/chain_components_test.go +++ b/core/services/relay/evm/chain_components_test.go @@ -53,8 +53,10 @@ import ( . "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/evmtesting" //nolint:revive // dot-imports ) -const commonGasLimitOnEvms = uint64(4712388) -const finalityDepth = 4 +const ( + commonGasLimitOnEvms = uint64(4712388) + finalityDepth = 4 +) func TestContractReaderEventsInitValidation(t *testing.T) { tests := []struct { @@ -93,7 +95,8 @@ func TestContractReaderEventsInitValidation(t *testing.T) { }, expectedError: fmt.Errorf( "%w: conflicting chain reader polling filter definitions for contract: %s event: %s, can't have polling filter defined both on contract and event level", - clcommontypes.ErrInvalidConfig, "ContractWithConflict", "EventWithConflict"), + clcommontypes.ErrInvalidConfig, "ContractWithConflict", "EventWithConflict", + ), }, { name: "No polling filter defined", @@ -110,7 +113,8 @@ func TestContractReaderEventsInitValidation(t *testing.T) { }, expectedError: fmt.Errorf( "%w: chain reader has no polling filter defined for contract: %s, event: %s", - clcommontypes.ErrInvalidConfig, "ContractWithNoFilter", "EventWithNoFilter"), + clcommontypes.ErrInvalidConfig, "ContractWithNoFilter", "EventWithNoFilter", + ), }, { name: "Invalid chain reader definition read type", @@ -127,7 +131,8 @@ func TestContractReaderEventsInitValidation(t *testing.T) { }, expectedError: fmt.Errorf( "%w: invalid chain reader definition read type", - clcommontypes.ErrInvalidConfig), + clcommontypes.ErrInvalidConfig, + ), }, { name: "Event not present in ABI", @@ -147,7 +152,8 @@ func TestContractReaderEventsInitValidation(t *testing.T) { }, expectedError: fmt.Errorf( "%w: event %q doesn't exist", - clcommontypes.ErrInvalidConfig, "EventName"), + clcommontypes.ErrInvalidConfig, "EventName", + ), }, { name: "Event has a unnecessary data word index override", @@ -174,7 +180,7 @@ func TestContractReaderEventsInitValidation(t *testing.T) { }, }, }, - expectedError: fmt.Errorf("failed to init dw querying for event: %q, err: data word: %q at index: %d details, were calculated automatically and shouldn't be manully overridden by cfg", // typos:ignore // 'manully' should be 'manually', error text from upstream dep + expectedError: fmt.Errorf("failed to init dw querying for event: %q, err: data word: %q at index: %d details, were calculated automatically and shouldn't be manully overridden by cfg", //typos:ignore // Need to match incoming error string verbatim "SomeEvent", "DW", 0), }, { @@ -420,7 +426,8 @@ func (h *helper) GasPriceBufferPercent() int64 { func (h *helper) Backend() bind.ContractBackend { if h.sim == nil { h.sim = simulated.NewBackend( - evmtypes.GenesisAlloc{h.accounts[0].From: {Balance: big.NewInt(math.MaxInt64)}, h.accounts[1].From: {Balance: big.NewInt(math.MaxInt64)}}, simulated.WithBlockGasLimit(commonGasLimitOnEvms*5000)) + evmtypes.GenesisAlloc{h.accounts[0].From: {Balance: big.NewInt(math.MaxInt64)}, h.accounts[1].From: {Balance: big.NewInt(math.MaxInt64)}}, simulated.WithBlockGasLimit(commonGasLimitOnEvms*5000), + ) cltest.Mine(h.sim, 1*time.Second) } @@ -507,7 +514,7 @@ func (h *helper) TXM(t *testing.T, client client.Client) evmtxmgr.TxManager { require.NoError(t, keyStore.Add(h.Context(t), h.accounts[1].From, h.ChainID())) require.NoError(t, keyStore.Enable(h.Context(t), h.accounts[1].From, h.ChainID())) - chainService, err := app.GetRelayers().LegacyEVMChains().Get((h.ChainID()).String()) + chainService, err := app.GetRelayers().LegacyEVMChains().Get(h.ChainID().String()) //nolint:staticcheck // legacy chain access required for tx manager test setup require.NoError(t, err) chain, ok := chainService.(legacyevm.Chain) require.True(t, ok) diff --git a/core/services/relay/evm/config_poller_test.go b/core/services/relay/evm/config_poller_test.go index 86e886ff1fd..3549e12c891 100644 --- a/core/services/relay/evm/config_poller_test.go +++ b/core/services/relay/evm/config_poller_test.go @@ -24,14 +24,12 @@ import ( testoffchainaggregator2 "github.com/smartcontractkit/libocr/gethwrappers2/testocr2aggregator" "github.com/smartcontractkit/libocr/offchainreporting2/reportingplugin/median" confighelper2 "github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper" - ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types" ocrtypes2 "github.com/smartcontractkit/libocr/offchainreporting2plus/types" "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest" "github.com/smartcontractkit/chainlink-evm/gethwrappers/generated/link_token_interface" "github.com/smartcontractkit/chainlink-evm/pkg/client" - evmclient "github.com/smartcontractkit/chainlink-evm/pkg/client" "github.com/smartcontractkit/chainlink-evm/pkg/client/clienttest" "github.com/smartcontractkit/chainlink-evm/pkg/heads/headstest" "github.com/smartcontractkit/chainlink-evm/pkg/logpoller" @@ -66,7 +64,8 @@ func TestConfigPoller(t *testing.T) { user, err = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) require.NoError(t, err) b = simulated.NewBackend(types.GenesisAlloc{ - user.From: {Balance: big.NewInt(1000000000000000000)}}, + user.From: {Balance: big.NewInt(1000000000000000000)}, + }, simulated.WithBlockGasLimit(5*ethconfig.Defaults.Miner.GasCeil)) require.NotNil(t, b) ec = b.Client() @@ -91,7 +90,7 @@ func TestConfigPoller(t *testing.T) { b.Commit() db := testutils.NewSqlxDB(t) - ethClient = evmclient.NewSimulatedBackendClient(t, b, testutils.SimulatedChainID) + ethClient = client.NewSimulatedBackendClient(t, b, testutils.SimulatedChainID) lorm := logpoller.NewORM(testutils.SimulatedChainID, db, lggr) @@ -195,8 +194,8 @@ func TestConfigPoller(t *testing.T) { changedInBlock, configDigest, err := cp.LatestConfigDetails(t.Context()) require.NoError(t, err) - assert.Equal(t, 0, int(changedInBlock)) - assert.Equal(t, ocrtypes.ConfigDigest{}, configDigest) + assert.Equal(t, uint64(0), changedInBlock) + assert.Equal(t, ocrtypes2.ConfigDigest{}, configDigest) }) t.Run("when config has been set, returns config details", func(t *testing.T) { setConfig(t, median.OffchainConfig{ @@ -217,7 +216,7 @@ func TestConfigPoller(t *testing.T) { onchainDetails, err := ocrContract.LatestConfigDetails(nil) require.NoError(t, err) - assert.Equal(t, latest.Number().Int64(), int64(changedInBlock)) + assert.Equal(t, latest.Number().Uint64(), changedInBlock) assert.Equal(t, onchainDetails.ConfigDigest, [32]byte(configDigest)) }) }) @@ -229,7 +228,7 @@ func TestConfigPoller(t *testing.T) { require.NoError(t, err) _, _, err = cp.LatestConfigDetails(t.Context()) - assert.EqualError(t, err, "something exploded") + require.EqualError(t, err, "something exploded") failingClient.AssertExpectations(t) }) @@ -327,7 +326,7 @@ func TestConfigPoller(t *testing.T) { require.NoError(t, err) _, err = cp.LatestConfig(t.Context(), 0) - assert.EqualError(t, err, "failed to get latest config details: something exploded") + require.EqualError(t, err, "failed to get latest config details: something exploded") failingClient.AssertExpectations(t) }) @@ -336,7 +335,7 @@ func TestConfigPoller(t *testing.T) { func setConfig(t *testing.T, pluginConfig median.OffchainConfig, ocrContract *ocr2aggregator.OCR2Aggregator, user *bind.TransactOpts) ocrtypes2.ContractConfig { // Create minimum number of nodes. - var oracles []confighelper2.OracleIdentityExtra + oracles := make([]confighelper2.OracleIdentityExtra, 0, 4) for range 4 { oracles = append(oracles, confighelper2.OracleIdentityExtra{ OracleIdentity: confighelper2.OracleIdentity{ diff --git a/core/services/relay/evm/evmtesting/bindings_test_adapter.go b/core/services/relay/evm/evmtesting/bindings_test_adapter.go index 0c6ff71cc1f..b9df5cb8d7a 100644 --- a/core/services/relay/evm/evmtesting/bindings_test_adapter.go +++ b/core/services/relay/evm/evmtesting/bindings_test_adapter.go @@ -201,7 +201,7 @@ func (b bindingContractReaderProxy) Bind(ctx context.Context, boundContracts []c return b.ContractReader.Bind(ctx, updatedBindings) } -func (b bindingsMapping) translateContractNames(boundContracts []commontypes.BoundContract) []commontypes.BoundContract { +func (b *bindingsMapping) translateContractNames(boundContracts []commontypes.BoundContract) []commontypes.BoundContract { updatedBindings := make([]commontypes.BoundContract, 0, len(boundContracts)) for _, boundContract := range boundContracts { updatedBindings = append(updatedBindings, commontypes.BoundContract{ @@ -235,7 +235,7 @@ func (b bindingContractReaderProxy) GetLatestValue(ctx context.Context, readKey return nil } -func (b bindingChainWriterProxy) SubmitTransaction(ctx context.Context, contract, method string, args any, transactionID string, toAddress string, meta *commontypes.TxMeta, value *big.Int) error { +func (b bindingChainWriterProxy) SubmitTransaction(ctx context.Context, contract, method string, args any, transactionID, toAddress string, meta *commontypes.TxMeta, value *big.Int) error { chainReaderTesters := b.bm.chainReaderTesters[toAddress] switch contract { case interfacetests.AnyContractName, interfacetests.AnySecondContractName: @@ -264,7 +264,7 @@ func (b bindingChainWriterProxy) SubmitTransaction(ctx context.Context, contract } } -func (b *bindingChainWriterProxy) GetTransactionStatus(ctx context.Context, transactionID string) (commontypes.TransactionStatus, error) { +func (b bindingChainWriterProxy) GetTransactionStatus(ctx context.Context, transactionID string) (commontypes.TransactionStatus, error) { return b.ContractWriter.GetTransactionStatus(ctx, transactionID) } @@ -367,8 +367,8 @@ func (b *bindingsMapping) createDelegateForSecondContractMethodReturningUint64() } // Transforms a readKey from ChainReader using the generic testing config to the actual config being used with go bindings which is the auto-generated from the solidity contract. -func (b bindingsMapping) translateReadKey(key string) string { - var updatedKey = key +func (b *bindingsMapping) translateReadKey(key string) string { + updatedKey := key parts := strings.Split(key, "-") contractName := parts[1] methodName := parts[2] @@ -386,7 +386,7 @@ func (b bindingsMapping) translateReadKey(key string) string { } // Transforms a readKey from ChainReader using the generic testing config to the actual config being used with go bindings which is the auto-generated from the solidity contract. -func (b bindingsMapping) translateContractName(contractName string) string { +func (b *bindingsMapping) translateContractName(contractName string) string { for testContractName, bindingsName := range b.contractNameMapping { if contractName == testContractName { return bindingsName @@ -399,7 +399,7 @@ func invokeSpecificMethod[T any](ctx context.Context, readKey string, input T, l return methodInvocation(ctx, readKey, input, level) } -func (b bindingsMapping) getBindingDelegate(readKey string) (*Delegate, error) { +func (b *bindingsMapping) getBindingDelegate(readKey string) (*Delegate, error) { translatedKey := removeAddressFromReadIdentifier(b.translateReadKey(readKey)) delegate := b.delegates[translatedKey] @@ -409,7 +409,7 @@ func (b bindingsMapping) getBindingDelegate(readKey string) (*Delegate, error) { return delegate, nil } -func (b bindingsMapping) GetChainReaderTester(key string) *bindings.ChainReaderTester { +func (b *bindingsMapping) GetChainReaderTester(key string) *bindings.ChainReaderTester { address := key[0:strings.Index(key, "-")] return b.chainReaderTesters[address] } @@ -444,7 +444,7 @@ func (d Delegate) apply(ctx context.Context, readKey string, input any, confiden } // Utility function to converted original types from and to bindings expected types. -func convertStruct(src any, dst any) error { +func convertStruct(src, dst any) error { if reflect.TypeOf(src).Kind() == reflect.Pointer && reflect.TypeOf(dst).Kind() == reflect.Pointer && reflect.TypeOf(src).Elem() == reflect.TypeFor[interfacetests.LatestParams]() && reflect.TypeOf(dst).Elem() == reflect.TypeFor[bindings.GetElementAtIndexInput]() { value := src.(*interfacetests.LatestParams).I dst.(*bindings.GetElementAtIndexInput).I = big.NewInt(int64(value)) @@ -519,7 +519,7 @@ func createDecoder(dst any) (*mapstructure.Decoder, error) { return decoder, err } -func stringToByteArrayHook(from reflect.Type, to reflect.Type, data any) (any, error) { +func stringToByteArrayHook(from, to reflect.Type, data any) (any, error) { if from.Kind() == reflect.String && to == reflect.TypeFor[[]byte]() { return evmcodec.EVMAddressModifier{}.DecodeAddress(data.(string)) } diff --git a/core/services/relay/evm/evmtesting/run_tests.go b/core/services/relay/evm/evmtesting/run_tests.go index fed46d4d52d..06a12682ed9 100644 --- a/core/services/relay/evm/evmtesting/run_tests.go +++ b/core/services/relay/evm/evmtesting/run_tests.go @@ -12,7 +12,7 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-common/pkg/types" - . "github.com/smartcontractkit/chainlink-common/pkg/types/interfacetests" //nolint:revive // dot-imports + . "github.com/smartcontractkit/chainlink-common/pkg/types/interfacetests" //nolint:revive,staticcheck // dot-imports "github.com/smartcontractkit/chainlink-common/pkg/types/query" "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" "github.com/smartcontractkit/chainlink-evm/pkg/read" diff --git a/core/services/relay/evm/write_target_test.go b/core/services/relay/evm/write_target_test.go index e05eed91b49..c64c7af4272 100644 --- a/core/services/relay/evm/write_target_test.go +++ b/core/services/relay/evm/write_target_test.go @@ -1,500 +1,13 @@ package evm_test import ( - "bytes" - "encoding/hex" - "errors" - "fmt" - "math/big" - "strings" "testing" - "time" - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - "go.uber.org/zap/zapcore" - "go.uber.org/zap/zaptest/observer" chainselectors "github.com/smartcontractkit/chain-selectors" - - "github.com/smartcontractkit/chainlink-common/pkg/capabilities" - ocr3types "github.com/smartcontractkit/chainlink-common/pkg/capabilities/consensus/ocr3/types" - capreg "github.com/smartcontractkit/chainlink-common/pkg/capabilities/registry" - "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest" - commontypes "github.com/smartcontractkit/chainlink-common/pkg/types" - commonevm "github.com/smartcontractkit/chainlink-common/pkg/types/chains/evm" - "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" - forwarder "github.com/smartcontractkit/chainlink-evm/gethwrappers/keystone/generated/forwarder_1_0_0" - "github.com/smartcontractkit/chainlink-evm/pkg/client/clienttest" - "github.com/smartcontractkit/chainlink-evm/pkg/config/configtest" - "github.com/smartcontractkit/chainlink-evm/pkg/config/toml" - gasmocks "github.com/smartcontractkit/chainlink-evm/pkg/gas/mocks" - "github.com/smartcontractkit/chainlink-evm/pkg/heads/headstest" - "github.com/smartcontractkit/chainlink-evm/pkg/keys" - evm "github.com/smartcontractkit/chainlink-evm/pkg/relay" - "github.com/smartcontractkit/chainlink-evm/pkg/report/datafeeds" - df_processor "github.com/smartcontractkit/chainlink-evm/pkg/report/datafeeds/processor" - por_processor "github.com/smartcontractkit/chainlink-evm/pkg/report/por/processor" - "github.com/smartcontractkit/chainlink-evm/pkg/testutils" - "github.com/smartcontractkit/chainlink-evm/pkg/txmgr" - evmtypes "github.com/smartcontractkit/chainlink-evm/pkg/types" - "github.com/smartcontractkit/chainlink-framework/capabilities/writetarget/report/platform" - "github.com/smartcontractkit/chainlink-protos/cre/go/values" - evmmocks "github.com/smartcontractkit/chainlink/v2/common/chains/mocks" - lpmocks "github.com/smartcontractkit/chainlink/v2/common/logpoller/mocks" - txmmocks "github.com/smartcontractkit/chainlink/v2/common/txmgr/mocks" - "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" - "github.com/smartcontractkit/chainlink/v2/core/logger" - "github.com/smartcontractkit/chainlink/v2/core/services/keystore" ) -var forwardABI = evmtypes.MustGetABI(forwarder.KeystoneForwarderMetaData.ABI) - -func newMockedEncodeTransmissionInfo(state uint8) ([]byte, error) { - info := evm.TransmissionInfo{ - GasLimit: big.NewInt(0), - InvalidReceiver: false, - State: state, - Success: false, - TransmissionID: [32]byte{}, - Transmitter: common.HexToAddress("0x0"), - } - var buffer bytes.Buffer - - // 1. Encode TransmissionId (bytes32) - buffer.Write(info.TransmissionID[:]) - - // 2. Encode State (uint8, ABI pads to 32 bytes: 31 zeros + 1 byte) - stateSlot := make([]byte, 31) - stateSlot = append(stateSlot, info.State) - buffer.Write(stateSlot) - - // 3. Encode Transmitter (address): address is 20 bytes; pad left with 12 zeros. - txBytes := info.Transmitter.Bytes() - // Ensure it is 20 bytes; if not, left-pad it (common.HexToAddress always returns 20 bytes). - paddedTx := make([]byte, 32-len(txBytes)) - buffer.Write(paddedTx) - buffer.Write(txBytes) - - // 4. Encode InvalidReceiver as bool (32 bytes: 31 zeros then byte(0) or byte(1)) - var invReceiverByte byte - if info.InvalidReceiver { - invReceiverByte = 1 - } - invalidReceiverSlot := make([]byte, 31) - invalidReceiverSlot = append(invalidReceiverSlot, invReceiverByte) - buffer.Write(invalidReceiverSlot) - - // 5. Encode Success as bool (32 bytes) - var successByte byte - if info.Success { - successByte = 1 - } - successSlot := make([]byte, 31) - successSlot = append(successSlot, successByte) - buffer.Write(successSlot) - - // 6. Encode GasLimit as a uint (for uint80, still ABI-encoded in a 32-byte slot) - gasLimitBytes := info.GasLimit.Bytes() - // Left-pad the gas limit to 32 bytes. - paddedGasLimit := make([]byte, 32-len(gasLimitBytes)) - buffer.Write(paddedGasLimit) - buffer.Write(gasLimitBytes) - - return buffer.Bytes(), nil -} - -func TestEvmWrite(t *testing.T) { - chain := evmmocks.NewChain(t) - txManager := txmmocks.NewMockEvmTxManager(t) - evmClient := clienttest.NewClient(t) - poller := lpmocks.NewLogPoller(t) - - chain.On("Start", mock.Anything).Return(nil) - chain.On("Close").Return(nil) - chain.On("ID").Return(big.NewInt(11155111)) - chain.On("TxManager").Return(txManager) - chain.On("LogPoller").Return(poller) - chain.On("LatestHead", mock.Anything).Return(commontypes.Head{Height: "99"}, nil) - chain.On("GetChainInfo", mock.Anything).Return(commontypes.ChainInfo{}, nil) - - ht := headstest.NewTracker[*evmtypes.Head](t) - ht.On("LatestAndFinalizedBlock", mock.Anything).Return(&evmtypes.Head{Number: 99}, &evmtypes.Head{}, nil) - chain.On("HeadTracker").Return(ht) - - evmClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Maybe().Return(big.NewInt(0), nil) - chain.On("Client").Return(evmClient) - - evmCfg := configtest.NewChainScopedConfig(t, func(c *toml.EVMConfig) { - a := testutils.NewAddress() - addr, err2 := evmtypes.NewEIP55Address(a.Hex()) - require.NoError(t, err2) - c.Workflow.FromAddress = &addr - - forwarderA := testutils.NewAddress() - forwarderAddr, err2 := evmtypes.NewEIP55Address(forwarderA.Hex()) - require.NoError(t, err2) - c.Workflow.ForwarderAddress = &forwarderAddr - }) - ge := gasmocks.NewEvmFeeEstimator(t) - - chain.On("Config").Return(evmCfg) - chain.On("GasEstimator").Return(ge) - - db := testutils.NewSqlxDB(t) - keyStore := cltest.NewKeyStore(t, db) - - lggr := logger.TestLogger(t, zapcore.DebugLevel) - cRegistry := capreg.NewRegistry(lggr) - relayer, err := evm.NewRelayer(lggr, chain, evm.RelayerOpts{ - DS: db, - EVMKeystore: keys.NewChainStore(keystore.NewEthSigner(keyStore.Eth(), chain.ID()), chain.ID()), - CSAKeystore: &keystore.CSASigner{CSA: keyStore.CSA()}, - CapabilitiesRegistry: cRegistry, - }) - require.NoError(t, err) - servicetest.Run(t, relayer) - registeredCapabilities, err := cRegistry.List(t.Context()) - require.NoError(t, err) - require.Len(t, registeredCapabilities, 1) // WriteTarget should be added to the registry - - reportID := [2]byte{0x00, 0x01} - - reportMetadata := ocr3types.Metadata{ - Version: 1, - ExecutionID: "0102030405060708090a0b0c0d0e0f1000000000000000000000000000000000", - Timestamp: 1620000000, - DONID: 1, - DONConfigVersion: 1, - WorkflowID: "1234567890123456789012345678901234567890123456789012345678901234", - WorkflowName: "123456789", - WorkflowOwner: "1234567890123456789012345678901234567890", - ReportID: hex.EncodeToString(reportID[:]), - } - - generateReportEncoded := func(reportType string) []byte { - feedReports := datafeeds.Reports{ - { - FeedID: [32]byte{0x01}, - Price: big.NewInt(1234567890123456789), - Timestamp: 1620000000, - }, - } - - ccipFeedReports := datafeeds.CCIPReports{ - { - FeedID: [32]byte{0x01}, - Timestamp: 1620000000, - Price: big.NewInt(1234567890123456789), - }, - } - - porFeedReports := datafeeds.PORReports{ - { - DataID: [32]byte{0x01}, - Timestamp: 1620000000, - Bundle: []byte{0x01, 0x02, 0x03}, - }, - } - - var feedReportsEncoded []byte - - switch reportType { - case "ccip": - feedReportsEncoded, err = df_processor.GetCCIPDataFeedsSchema().Pack(ccipFeedReports) - require.NoError(t, err) - case "por": - feedReportsEncoded, err = por_processor.GetPORSchema().Pack(porFeedReports) - require.NoError(t, err) - // normal non-ccip / POR report - default: - feedReportsEncoded, err = df_processor.GetDataFeedsSchema().Pack(feedReports) - require.NoError(t, err) - } - - report := platform.Report{ - Metadata: reportMetadata, - Data: feedReportsEncoded, - } - - reportEncoded, encodeErr := report.Encode() - require.NoError(t, encodeErr) - - return reportEncoded - } - - signatures := [][]byte{} - - mockSuccessfulTransmission := func(reportType string) { - // This is a very error-prone way to mock an on-chain response to a GetLatestValue("getTransmissionInfo") call - // It's a bit of a hack, but it's the best way to do it without a lot of refactoring - mockNotStarted, mockErr := newMockedEncodeTransmissionInfo(0) - require.NoError(t, mockErr) - - evmClient.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(mockNotStarted, nil).Once() - evmClient.On("CodeAt", mock.Anything, mock.Anything, mock.Anything).Return([]byte("test"), nil) - - txManager.On("GetTransactionStatus", mock.Anything, mock.Anything).Return(commontypes.Finalized, nil).Maybe() - - mockSucceeded, mockErr2 := newMockedEncodeTransmissionInfo(1) - require.NoError(t, mockErr2) - evmClient.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(mockSucceeded, nil).Maybe().Once() - - txManager.On("CreateTransaction", mock.Anything, mock.Anything).Return(txmgr.Tx{}, nil).Run(func(args mock.Arguments) { - req := args.Get(1).(txmgr.TxRequest) - payload := make(map[string]any) - method := forwardABI.Methods["report"] - err = method.Inputs.UnpackIntoMap(payload, req.EncodedPayload[4:]) - require.NoError(t, err) - require.Equal(t, generateReportEncoded(reportType), payload["rawReport"]) - require.Equal(t, signatures, payload["signatures"]) - }).Once() - txManager.On("GetTransactionFee", mock.Anything, mock.Anything).Return(&commonevm.TransactionFee{TransactionFee: big.NewInt(10)}, nil) - } - - generateValidInputs := func(reportType string) *values.Map { - validInputs, inputErr := values.NewMap(map[string]any{ - "signed_report": map[string]any{ - "report": generateReportEncoded(reportType), - "signatures": signatures, - "context": []byte{4, 5}, - "id": reportID[:], - }, - }) - require.NoError(t, inputErr) - return validInputs - } - - // default inputs/report are not CCIP / POR - validInputs := generateValidInputs("") - - validMetadata := capabilities.RequestMetadata{ - WorkflowID: reportMetadata.WorkflowID, - WorkflowOwner: reportMetadata.WorkflowOwner, - WorkflowName: reportMetadata.WorkflowName, - WorkflowExecutionID: reportMetadata.ExecutionID, - } - - validConfig, err := values.NewMap(map[string]any{ - "address": evmCfg.EVM().Workflow().ForwarderAddress().String(), - "processor": "evm-data-feeds", - }) - require.NoError(t, err) - - gasLimitDefault := uint64(400_000) - - t.Run("succeeds with valid report", func(t *testing.T) { - mockSuccessfulTransmission("") - ctx := t.Context() - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) - - capability, err := evm.NewWriteTarget(ctx, relayer, chain, gasLimitDefault, lggr) - require.NoError(t, err) - - req := capabilities.CapabilityRequest{ - Metadata: validMetadata, - Config: validConfig, - Inputs: validInputs, - } - - _, err = capability.Execute(ctx, req) - require.NoError(t, err) - - findLogMatch(t, observed, "[Beholder.emit]", "attributes", "FeedUpdated") - }) - - t.Run("succeeds with valid CCIP report", func(t *testing.T) { - mockSuccessfulTransmission("ccip") - ctx := t.Context() - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) - - capability, err := evm.NewWriteTarget(ctx, relayer, chain, gasLimitDefault, lggr) - require.NoError(t, err) - - config, err := values.NewMap(map[string]any{ - "address": evmCfg.EVM().Workflow().ForwarderAddress().String(), - "processor": "evm-data-feeds-ccip", - }) - require.NoError(t, err) - - // special request with properly encoded CCIP report using ccip processor - req := capabilities.CapabilityRequest{ - Metadata: validMetadata, - Config: config, - Inputs: generateValidInputs("ccip"), - } - - _, err = capability.Execute(ctx, req) - require.NoError(t, err) - - findLogMatch(t, observed, "[Beholder.emit]", "attributes", "FeedUpdated") - }) - - t.Run("succeeds with valid POR report", func(t *testing.T) { - mockSuccessfulTransmission("por") - ctx := t.Context() - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) - - capability, err := evm.NewWriteTarget(ctx, relayer, chain, gasLimitDefault, lggr) - require.NoError(t, err) - - config, err := values.NewMap(map[string]any{ - "address": evmCfg.EVM().Workflow().ForwarderAddress().String(), - "processor": "evm-por-feeds", - }) - require.NoError(t, err) - - // special request with properly encoded CCIP report using ccip processor - req := capabilities.CapabilityRequest{ - Metadata: validMetadata, - Config: config, - Inputs: generateValidInputs("por"), - } - - _, err = capability.Execute(ctx, req) - require.NoError(t, err) - - findLogMatch(t, observed, "[Beholder.emit]", "attributes", "FeedUpdated") - }) - - t.Run("succeeds with valid report, but logs error for missing processor", func(t *testing.T) { - mockSuccessfulTransmission("") - - ctx := t.Context() - lggr, observed := logger.TestLoggerObserved(t, zapcore.DebugLevel) - - capability, err := evm.NewWriteTarget(ctx, relayer, chain, gasLimitDefault, lggr) - require.NoError(t, err) - - config, err := values.NewMap(map[string]any{ - "address": evmCfg.EVM().Workflow().ForwarderAddress().String(), - "processor": "invalid-name", - }) - require.NoError(t, err) - - req := capabilities.CapabilityRequest{ - Metadata: validMetadata, - Config: config, - Inputs: validInputs, - } - - _, err = capability.Execute(ctx, req) - require.NoError(t, err) - - tests.RequireLogMessage(t, observed, "no matching processor for MetaCapabilityProcessor=invalid-name") - }) - - t.Run("succeeds when report already succeeded", func(t *testing.T) { - mockCall, err := newMockedEncodeTransmissionInfo(1) - require.NoError(t, err) - - evmClient.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(mockCall, nil).Once() - - ctx := t.Context() - capability, err := evm.NewWriteTarget(ctx, relayer, chain, gasLimitDefault, lggr) - require.NoError(t, err) - - req := capabilities.CapabilityRequest{ - Metadata: validMetadata, - Config: validConfig, - Inputs: validInputs, - } - - _, err = capability.Execute(ctx, req) - require.NoError(t, err) - }) - - t.Run("fails with invalid config", func(t *testing.T) { - ctx := t.Context() - capability, err := evm.NewWriteTarget(ctx, relayer, chain, gasLimitDefault, logger.TestLogger(t)) - require.NoError(t, err) - - invalidConfig, err := values.NewMap(map[string]any{ - "Address": "invalid-address", - }) - require.NoError(t, err) - - req := capabilities.CapabilityRequest{ - Metadata: validMetadata, - Config: invalidConfig, - Inputs: validInputs, - } - - _, err = capability.Execute(ctx, req) - require.Error(t, err) - }) - - t.Run("fails when TXM CreateTransaction returns error", func(t *testing.T) { - ctx := t.Context() - capability, err := evm.NewWriteTarget(ctx, relayer, chain, gasLimitDefault, logger.TestLogger(t)) - require.NoError(t, err) - - req := capabilities.CapabilityRequest{ - Metadata: validMetadata, - Config: validConfig, - Inputs: validInputs, - } - mockCall, err := newMockedEncodeTransmissionInfo(0) - require.NoError(t, err) - evmClient.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(mockCall, nil).Once() - txManager.On("CreateTransaction", mock.Anything, mock.Anything).Return(txmgr.Tx{}, errors.New("TXM error")).Once() - - _, err = capability.Execute(ctx, req) - require.Error(t, err) - }) - - t.Run("Relayer fails to start WriteTarget capability on missing config", func(t *testing.T) { - ctx := t.Context() - testChain := evmmocks.NewChain(t) - testCfg := configtest.NewChainScopedConfig(t, func(c *toml.EVMConfig) { - c.Workflow.FromAddress = nil - forwarderA := testutils.NewAddress() - forwarderAddr, err2 := evmtypes.NewEIP55Address(forwarderA.Hex()) - require.NoError(t, err2) - c.Workflow.ForwarderAddress = &forwarderAddr - }) - testChain.On("Start", mock.Anything).Return(nil) - testChain.On("Close").Return(nil) - testChain.On("ID").Return(big.NewInt(11155111)) - testChain.On("Config").Return(testCfg) - capabilityRegistry := capreg.NewRegistry(lggr) - - relayer, err := evm.NewRelayer(lggr, testChain, evm.RelayerOpts{ - DS: db, - EVMKeystore: keys.NewChainStore(keystore.NewEthSigner(keyStore.Eth(), chain.ID()), chain.ID()), - CSAKeystore: &keystore.CSASigner{CSA: keyStore.CSA()}, - CapabilitiesRegistry: capabilityRegistry, - }) - require.NoError(t, err) - servicetest.Run(t, relayer) - - l, err := capabilityRegistry.List(ctx) - require.NoError(t, err) - - assert.Empty(t, l) - }) -} - -func findLogMatch(t *testing.T, observed *observer.ObservedLogs, msg string, key string, value string) { - require.Eventually(t, func() bool { - filteredByMsg := observed.FilterMessage(msg) - matches := filteredByMsg. - Filter(func(le observer.LoggedEntry) bool { - for _, field := range le.Context { - if field.Key == key && - strings.Contains(fmt.Sprint(field.Interface), - value) { - return true - } - } - return false - }). - All() // => []observer.LoggedEntry - return len(matches) > 0 - }, 30*time.Second, 1*time.Second) -} func TestExtractNetwork(t *testing.T) { testCases := []struct { networkName string diff --git a/core/services/relay/relay.go b/core/services/relay/relay.go index fecd143122b..4cc0c893b61 100644 --- a/core/services/relay/relay.go +++ b/core/services/relay/relay.go @@ -55,9 +55,9 @@ func (r *ServerAdapter) NewPluginProvider(ctx context.Context, rargs types.Relay return r.NewFunctionsProvider(ctx, rargs, pargs) case types.OCR3Capability, types.DonTimePlugin, types.RingPlugin: return r.NewOCR3CapabilityProvider(ctx, rargs, pargs) - case types.DKG, types.GenericPlugin, types.VaultPlugin: + case types.DKG, types.OCR2VRF, types.GenericPlugin, types.Mercury, types.SecureMint, types.VaultPlugin, types.CCIPCommit, types.CCIPExecution: return r.Relayer.NewPluginProvider(ctx, rargs, pargs) - case types.LLO: + case types.LLO, types.OCR2Keeper: return nil, fmt.Errorf("provider type not supported: %s", rargs.ProviderType) } return nil, fmt.Errorf("provider type not recognized: %s", rargs.ProviderType) diff --git a/core/services/ring/plugin_test.go b/core/services/ring/plugin_test.go index 4fe3808bc26..2a334b85e07 100644 --- a/core/services/ring/plugin_test.go +++ b/core/services/ring/plugin_test.go @@ -103,7 +103,7 @@ func TestPlugin_Outcome(t *testing.T) { } // Build attributed observations - aos := make([]types.AttributedObservation, 0) + aos := make([]types.AttributedObservation, 0, len(observations)) for idx, obs := range observations { pbObs := &ringpb.Observation{ ShardStatus: obs.shardStatus, diff --git a/core/services/standardcapabilities/delegate.go b/core/services/standardcapabilities/delegate.go index ab4c58bc577..86a0ec09540 100644 --- a/core/services/standardcapabilities/delegate.go +++ b/core/services/standardcapabilities/delegate.go @@ -18,6 +18,7 @@ import ( "github.com/smartcontractkit/chainlink-common/keystore/corekeys/p2pkey" capabilitiespb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb" "github.com/smartcontractkit/chainlink-common/pkg/capabilities/registry" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/loop" "github.com/smartcontractkit/chainlink-common/pkg/services/orgresolver" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" @@ -27,7 +28,6 @@ import ( gatewayconnector "github.com/smartcontractkit/chainlink/v2/core/capabilities/gateway_connector" triggercap "github.com/smartcontractkit/chainlink/v2/core/capabilities/triggers" coreconfig "github.com/smartcontractkit/chainlink/v2/core/config" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/gateway/connector" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/keystore" @@ -178,7 +178,7 @@ func (d *Delegate) NewServices( capabilityDonID uint32, registryOCRConfig *ocrtypes.ContractConfig, ) ([]job.ServiceCtx, error) { - log := d.logger.Named("StandardCapabilities").Named(strconv.Itoa(int(jobID))).Named(jobName) + log := logger.Sugared(logger.Named(d.logger, "StandardCapabilities")).Named(strconv.Itoa(int(jobID))).Named(jobName) // Warn when neither the job spec nor the TOML config provide bootstrap peers. // The oracle factory will fail at startup if it can't find peers, so the error diff --git a/core/services/standardcapabilities/delegate_test.go b/core/services/standardcapabilities/delegate_test.go index 8a3e7904a44..544dfa9784a 100644 --- a/core/services/standardcapabilities/delegate_test.go +++ b/core/services/standardcapabilities/delegate_test.go @@ -12,9 +12,9 @@ import ( p2ptypes "github.com/smartcontractkit/libocr/ragep2p/types" "github.com/smartcontractkit/chainlink-common/pkg/capabilities" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/types/core/mocks" "github.com/smartcontractkit/chainlink/v2/core/config" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/job" ) @@ -87,7 +87,7 @@ func Test_ValidatedStandardCapabilitiesSpec(t *testing.T) { forwardingAllowed = false command = "path/to/binary" config = """""" - + [oracle_factory] enabled = true bootstrap_peers = ["12D3KooWBAzThfs9pD4WcsFKCi68EUz2fZgZskDBT6JcJRndPss5@cl-keystone-two-bt-0:5001"] @@ -129,7 +129,7 @@ func Test_ValidatedStandardCapabilitiesSpec(t *testing.T) { jobSpec, err := ValidatedStandardCapabilitiesSpec(tc.tomlString) if tc.expectedError != "" { - assert.ErrorContains(t, err, tc.expectedError) + require.ErrorContains(t, err, tc.expectedError) } else { require.NoError(t, err) } @@ -251,7 +251,7 @@ func TestResolveCapabilityDonID(t *testing.T) { donWithNodes(20, node(localPeerID)), }, nil) - got := resolveCapabilityDonID(ctx, logger.TestLogger(t), registry, func() (p2ptypes.PeerID, error) { + got := resolveCapabilityDonID(ctx, logger.Test(t), registry, func() (p2ptypes.PeerID, error) { return localPeerID, nil }, capabilityID) @@ -266,7 +266,7 @@ func TestResolveCapabilityDonID(t *testing.T) { donWithNodes(10, node(testPeerID(2))), }, nil) - got := resolveCapabilityDonID(ctx, logger.TestLogger(t), registry, func() (p2ptypes.PeerID, error) { + got := resolveCapabilityDonID(ctx, logger.Test(t), registry, func() (p2ptypes.PeerID, error) { return localPeerID, nil }, capabilityID) @@ -282,7 +282,7 @@ func TestResolveCapabilityDonID(t *testing.T) { donWithNodes(20, node(localPeerID)), }, nil) - got := resolveCapabilityDonID(ctx, logger.TestLogger(t), registry, func() (p2ptypes.PeerID, error) { + got := resolveCapabilityDonID(ctx, logger.Test(t), registry, func() (p2ptypes.PeerID, error) { return localPeerID, nil }, capabilityID) @@ -294,7 +294,7 @@ func TestResolveCapabilityDonID(t *testing.T) { registry := mocks.NewCapabilitiesRegistry(t) - got := resolveCapabilityDonID(ctx, logger.TestLogger(t), registry, func() (p2ptypes.PeerID, error) { + got := resolveCapabilityDonID(ctx, logger.Test(t), registry, func() (p2ptypes.PeerID, error) { return p2ptypes.PeerID{}, errors.New("dispatcher not ready") }, capabilityID) @@ -307,7 +307,7 @@ func TestResolveCapabilityDonID(t *testing.T) { registry := mocks.NewCapabilitiesRegistry(t) registry.EXPECT().DONsForCapability(ctx, capabilityID).Return(nil, errors.New("registry unavailable")) - got := resolveCapabilityDonID(ctx, logger.TestLogger(t), registry, func() (p2ptypes.PeerID, error) { + got := resolveCapabilityDonID(ctx, logger.Test(t), registry, func() (p2ptypes.PeerID, error) { return localPeerID, nil }, capabilityID) @@ -330,9 +330,11 @@ func (s *stubLocalCapabilities) RegistryBasedLaunchAllowlist() []string { return func (s *stubLocalCapabilities) Capabilities() map[string]config.CapabilityNodeConfig { return nil } + func (s *stubLocalCapabilities) IsAllowlisted(capabilityID string) bool { return s.allowlisted[capabilityID] } + func (s *stubLocalCapabilities) GetCapabilityConfig(string) config.CapabilityNodeConfig { return nil } diff --git a/core/services/streams/delegate.go b/core/services/streams/delegate.go index e044a4b0c79..bbc418dd2c3 100644 --- a/core/services/streams/delegate.go +++ b/core/services/streams/delegate.go @@ -9,7 +9,7 @@ import ( "github.com/pelletier/go-toml/v2" "github.com/pkg/errors" - "github.com/smartcontractkit/chainlink/v2/core/logger" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon" "github.com/smartcontractkit/chainlink/v2/core/services/pipeline" @@ -30,7 +30,7 @@ type Delegate struct { var _ job.Delegate = (*Delegate)(nil) func NewDelegate(lggr logger.Logger, registry Registry, runner ocrcommon.Runner, cfg DelegateConfig) *Delegate { - return &Delegate{lggr.Named("StreamsDelegate"), registry, runner, cfg} + return &Delegate{lggr: logger.Named(lggr, "StreamsDelegate"), registry: registry, runner: runner, cfg: cfg} } func (d *Delegate) JobType() job.Type { @@ -43,7 +43,7 @@ func (d *Delegate) BeforeJobDeleted(jb job.Job) {} func (d *Delegate) OnDeleteJob(context.Context, job.Job) error { return nil } func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) (services []job.ServiceCtx, err error) { - lggr := d.lggr.Named(fmt.Sprintf("Job.%d", jb.ID)).With("jobID", jb.ID) + lggr := logger.With(logger.Named(d.lggr, fmt.Sprintf("Job.%d", jb.ID)), "jobID", jb.ID) rrs := ocrcommon.NewResultRunSaver(d.runner, lggr, d.cfg.MaxSuccessfulRuns(), d.cfg.ResultWriteQueueDepth()) services = append(services, rrs, &StreamService{ @@ -79,7 +79,7 @@ func (s *StreamService) Close() error { } func ValidatedStreamSpec(tomlString string) (job.Job, error) { - var jb = job.Job{ExternalJobID: uuid.New()} + jb := job.Job{ExternalJobID: uuid.New()} r := strings.NewReader(tomlString) d := toml.NewDecoder(r) diff --git a/core/services/streams/delegate_test.go b/core/services/streams/delegate_test.go index 3f385367cc5..192e2c94ffc 100644 --- a/core/services/streams/delegate_test.go +++ b/core/services/streams/delegate_test.go @@ -90,7 +90,7 @@ answer1 [type=median index=0]; name: "unparseable toml", toml: `not toml`, assertion: func(t *testing.T, jb job.Job, err error) { - assert.EqualError(t, err, "toml unmarshal error on job: toml: expected '=' after key") + assert.ErrorContains(t, err, "toml unmarshal error on job: toml:") }, }, { diff --git a/core/services/streams/stream_registry.go b/core/services/streams/stream_registry.go index c6628e76104..0cf5d42432c 100644 --- a/core/services/streams/stream_registry.go +++ b/core/services/streams/stream_registry.go @@ -4,8 +4,8 @@ import ( "fmt" "sync" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/types/llo" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/job" ) @@ -39,7 +39,7 @@ func NewRegistry(lggr logger.Logger, runner Runner) Registry { func newRegistry(lggr logger.Logger, runner Runner) *streamRegistry { return &streamRegistry{ sync.RWMutex{}, - lggr.Named("Registry"), + logger.Named(lggr, "Registry"), runner, make(map[StreamID]Pipeline), make(map[int32]Pipeline), @@ -50,7 +50,7 @@ func (s *streamRegistry) Get(streamID StreamID) (p Pipeline, exists bool) { s.RLock() defer s.RUnlock() p, exists = s.pipelines[streamID] - return + return p, exists } func (s *streamRegistry) Register(jb job.Job, rrs ResultRunSaver) error { diff --git a/core/services/streams/stream_test.go b/core/services/streams/stream_test.go index 41bd7ada1a5..d09ae5766da 100644 --- a/core/services/streams/stream_test.go +++ b/core/services/streams/stream_test.go @@ -82,7 +82,7 @@ succeed; runner.err = nil run, trrs, err := strm.Run(ctx) - assert.NoError(t, err) + require.NoError(t, err) assert.Equal(t, int64(42), run.ID) require.Len(t, trrs, 1) diff --git a/core/services/telemetry/manager_test.go b/core/services/telemetry/manager_test.go index da8aca9111e..143066e0894 100644 --- a/core/services/telemetry/manager_test.go +++ b/core/services/telemetry/manager_test.go @@ -23,7 +23,7 @@ import ( mocks2 "github.com/smartcontractkit/chainlink/v2/core/services/synchronization/mocks" ) -func setupMockConfig(t *testing.T, useBatchSend bool, chipIngressEnabled bool) *mocks.TelemetryIngress { +func setupMockConfig(t *testing.T, useBatchSend, chipIngressEnabled bool) *mocks.TelemetryIngress { tic := mocks.NewTelemetryIngress(t) tic.On("BufferSize").Return(uint(123)) tic.On("Logging").Return(true) @@ -128,7 +128,7 @@ func TestNewManager(t *testing.T) { }, } - var mockEndpoints []config.TelemetryIngressEndpoint + mockEndpoints := make([]config.TelemetryIngressEndpoint, 0, len(endpoints)) for _, e := range endpoints { te := mocks.NewTelemetryIngressEndpoint(t) diff --git a/core/services/versioning/orm.go b/core/services/versioning/orm.go index 35e1407184f..91e35609ef7 100644 --- a/core/services/versioning/orm.go +++ b/core/services/versioning/orm.go @@ -10,9 +10,9 @@ import ( "github.com/jackc/pgx/v5/pgconn" "github.com/pkg/errors" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" "github.com/smartcontractkit/chainlink/v2/core/config/env" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) // Version ORM manages the node_versions table @@ -32,7 +32,7 @@ type orm struct { func NewORM(ds sqlutil.DataSource, lggr logger.Logger) *orm { return &orm{ ds: ds, - lggr: lggr.Named("VersioningORM"), + lggr: logger.Named(lggr, "VersioningORM"), } } @@ -51,7 +51,7 @@ func (o *orm) UpsertNodeVersion(ctx context.Context, version NodeVersion) error if env.SkipAppVersionCheck.IsTrue() { o.lggr.Warnw("Skipping app version check", "appVersion", version.Version) } else { - if _, _, err := CheckVersion(ctx, tx, logger.NullLogger, version.Version, env.IgnorePrereleaseVersionCheck.IsTrue()); err != nil { + if _, _, err := CheckVersion(ctx, tx, logger.Nop(), version.Version, env.IgnorePrereleaseVersionCheck.IsTrue()); err != nil { return err } } @@ -73,7 +73,7 @@ created_at = EXCLUDED.created_at // node_versions table that is higher than the current app version. // If ignorePrerelease is true, pre-release information is ignored when comparing versions. func CheckVersion(ctx context.Context, ds sqlutil.DataSource, lggr logger.Logger, appVersion string, ignorePrerelease bool) (appv, dbv *semver.Version, err error) { - lggr = lggr.Named("Version") + lggr = logger.Named(lggr, "Version") var dbVersion string err = ds.GetContext(ctx, &dbVersion, `SELECT version FROM node_versions ORDER BY created_at DESC LIMIT 1 FOR UPDATE`) if errors.Is(err, sql.ErrNoRows) { @@ -93,7 +93,7 @@ func CheckVersion(ctx context.Context, ds sqlutil.DataSource, lggr logger.Logger appv, apperr := semver.NewVersion(appVersion) if dberr != nil { lggr.Warnf("Database version %q is not valid semver; skipping version check", dbVersion) - return nil, nil, nil + return nil, nil, nil //nolint:nilerr // intentionally skip the check when the stored version is invalid } if apperr != nil { return nil, nil, errors.Errorf("Application version %q is not valid semver", appVersion) diff --git a/core/services/vrf/delegate.go b/core/services/vrf/delegate.go index dd24c3cb4a9..8d2e152ec54 100644 --- a/core/services/vrf/delegate.go +++ b/core/services/vrf/delegate.go @@ -11,6 +11,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/pkg/errors" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox" "github.com/smartcontractkit/chainlink-evm/gethwrappers/generated/batch_vrf_coordinator_v2" @@ -20,7 +21,6 @@ import ( "github.com/smartcontractkit/chainlink-evm/gethwrappers/shared/generated/initial/aggregator_v3_interface" "github.com/smartcontractkit/chainlink-evm/pkg/assets" "github.com/smartcontractkit/chainlink-evm/pkg/chains/legacyevm" - "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/keystore" "github.com/smartcontractkit/chainlink/v2/core/services/pipeline" @@ -34,7 +34,7 @@ type Delegate struct { porm pipeline.ORM ks keystore.Master legacyChains legacyevm.LegacyChainContainer - lggr logger.Logger + lggr logger.SugaredLogger mailMon *mailbox.Monitor } @@ -45,14 +45,15 @@ func NewDelegate( porm pipeline.ORM, legacyChains legacyevm.LegacyChainContainer, lggr logger.Logger, - mailMon *mailbox.Monitor) *Delegate { + mailMon *mailbox.Monitor, +) *Delegate { return &Delegate{ ds: ds, ks: ks, pr: pr, porm: porm, legacyChains: legacyChains, - lggr: lggr.Named("VRF"), + lggr: logger.Sugared(logger.Named(lggr, "VRF")), mailMon: mailMon, } } @@ -109,7 +110,8 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) ([]job.Servi var batchCoordinatorV2 *batch_vrf_coordinator_v2.BatchVRFCoordinatorV2 if jb.VRFSpec.BatchCoordinatorAddress != nil { batchCoordinatorV2, err = batch_vrf_coordinator_v2.NewBatchVRFCoordinatorV2( - jb.VRFSpec.BatchCoordinatorAddress.Address(), chain.Client()) + jb.VRFSpec.BatchCoordinatorAddress.Address(), chain.Client(), + ) if err != nil { return nil, errors.Wrap(err, "create batch coordinator wrapper") } @@ -225,26 +227,27 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, jb job.Job) ([]job.Servi lV2.Infow("Running without VRFOwnerAddress set on the spec") } - return []job.ServiceCtx{v2.New( - chain.Config().EVM(), - chain.Config().EVM().GasEstimator(), - lV2, - chain, - chain.ID(), - d.ds, - v2.NewCoordinatorV2(coordinatorV2), - batchCoordinatorV2, - vrfOwner, - aggregator, - d.pr, - d.ks.Eth(), - jb, - func() {}, - // the lookback in the deduper must be >= the lookback specified for the log poller - // otherwise we will end up re-delivering logs that were already delivered. - vrfcommon.NewInflightCache(int(chain.Config().EVM().FinalityDepth())), - vrfcommon.NewLogDeduper(int(chain.Config().EVM().FinalityDepth())), - ), + return []job.ServiceCtx{ + v2.New( + chain.Config().EVM(), + chain.Config().EVM().GasEstimator(), + lV2, + chain, + chain.ID(), + d.ds, + v2.NewCoordinatorV2(coordinatorV2), + batchCoordinatorV2, + vrfOwner, + aggregator, + d.pr, + d.ks.Eth(), + jb, + func() {}, + // the lookback in the deduper must be >= the lookback specified for the log poller + // otherwise we will end up re-delivering logs that were already delivered. + vrfcommon.NewInflightCache(int(chain.Config().EVM().FinalityDepth())), + vrfcommon.NewLogDeduper(int(chain.Config().EVM().FinalityDepth())), + ), }, nil } } @@ -258,7 +261,7 @@ func CheckFromAddressesExist(ctx context.Context, jb job.Job, gethks keystore.Et _, err2 := gethks.Get(ctx, a.Hex()) err = stderrors.Join(err, err2) } - return + return err } // CheckFromAddressMaxGasPrices checks if the provided gas price in the job spec gas lane parameter @@ -272,11 +275,12 @@ func CheckFromAddressMaxGasPrices(jb job.Job, keySpecificMaxGas keySpecificMaxGa err = stderrors.Join(err, fmt.Errorf( "key-specific max gas price of from address %s (%s) does not match gasLanePriceGWei (%s) specified in job spec", - a.Hex(), keySpecific.String(), jb.VRFSpec.GasLanePrice.String())) + a.Hex(), keySpecific.String(), jb.VRFSpec.GasLanePrice.String(), + )) } } } - return + return err } type keySpecificMaxGasFn func(common.Address) *assets.Wei @@ -291,5 +295,5 @@ func FromAddressMaxGasPricesAllEqual(jb job.Job, keySpecificMaxGasPriceWei keySp keySpecificMaxGasPriceWei(jb.VRFSpec.FromAddresses[0].Address()), ) } - return + return allEqual } diff --git a/core/services/vrf/delegate_test.go b/core/services/vrf/delegate_test.go index 88e864944d8..97e5dc6b20f 100644 --- a/core/services/vrf/delegate_test.go +++ b/core/services/vrf/delegate_test.go @@ -134,7 +134,8 @@ func Test_CheckFromAddressMaxGasPrices(t *testing.T) { PublicKey: "0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F8179800", FromAddresses: []string{"0x1111111111111111111111111111111111111111"}, OmitGasLanePrice: true, - }).Toml()) + }, + ).Toml()) require.NoError(tt, err) cfg := vrf_mocks.NewFeeConfig(t) @@ -142,7 +143,7 @@ func Test_CheckFromAddressMaxGasPrices(t *testing.T) { }) t.Run("returns nil error on valid gas lane <=> key specific gas price setting", func(tt *testing.T) { - var fromAddresses []string + fromAddresses := make([]string, 0, 3) for range 3 { fromAddresses = append(fromAddresses, testutils.NewAddress().Hex()) } @@ -161,7 +162,8 @@ func Test_CheckFromAddressMaxGasPrices(t *testing.T) { BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), - }). + }, + ). Toml()) require.NoError(t, err) @@ -169,7 +171,7 @@ func Test_CheckFromAddressMaxGasPrices(t *testing.T) { }) t.Run("returns error on invalid setting", func(tt *testing.T) { - var fromAddresses []string + fromAddresses := make([]string, 0, 3) for range 3 { fromAddresses = append(fromAddresses, testutils.NewAddress().Hex()) } @@ -188,7 +190,8 @@ func Test_CheckFromAddressMaxGasPrices(t *testing.T) { BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), - }). + }, + ). Toml()) require.NoError(t, err) @@ -204,10 +207,10 @@ func Test_CheckFromAddressesExist(t *testing.T) { ks := keystore.NewInMemory(db, commonkeystore.FastScryptParams, lggr.Infof) require.NoError(t, ks.Unlock(ctx, testutils.Password)) - var fromAddresses []string + fromAddresses := make([]string, 0, 3) for range 3 { k, err := ks.Eth().Create(t.Context(), big.NewInt(1337)) - assert.NoError(t, err) + require.NoError(t, err) fromAddresses = append(fromAddresses, k.Address.Hex()) } jb, err := vrfcommon.ValidatedVRFSpec(testspecs.GenerateVRFSpec( @@ -218,7 +221,8 @@ func Test_CheckFromAddressesExist(t *testing.T) { BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), - }). + }, + ). Toml()) assert.NoError(t, err) @@ -232,10 +236,10 @@ func Test_CheckFromAddressesExist(t *testing.T) { ks := keystore.NewInMemory(db, commonkeystore.FastScryptParams, lggr.Infof) require.NoError(t, ks.Unlock(ctx, testutils.Password)) - var fromAddresses []string + fromAddresses := make([]string, 0, 4) for range 3 { k, err := ks.Eth().Create(t.Context(), big.NewInt(1337)) - assert.NoError(t, err) + require.NoError(t, err) fromAddresses = append(fromAddresses, k.Address.Hex()) } fromAddresses = append(fromAddresses, testutils.NewAddress().Hex()) @@ -247,9 +251,10 @@ func Test_CheckFromAddressesExist(t *testing.T) { BackoffInitialDelay: time.Minute, BackoffMaxDelay: time.Hour, GasLanePrice: assets.GWei(100), - }). + }, + ). Toml()) - assert.NoError(t, err) + require.NoError(t, err) assert.Error(t, vrf.CheckFromAddressesExist(t.Context(), jb, ks.Eth())) }) @@ -326,7 +331,8 @@ func Test_VRFV2PlusServiceFailsWhenVRFOwnerProvided(t *testing.T) { vuni.prm, vuni.legacyChains, logger.TestLogger(t), - mailMon) + mailMon, + ) chainService, err := vuni.legacyChains.Get(testutils.FixtureChainID.String()) require.NoError(t, err) chain, ok := chainService.(legacyevm.Chain) diff --git a/core/services/vrf/proof/proof_response.go b/core/services/vrf/proof/proof_response.go index 9dedb536e9d..b845d41b005 100644 --- a/core/services/vrf/proof/proof_response.go +++ b/core/services/vrf/proof/proof_response.go @@ -17,9 +17,9 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/services/keystore" ) -// ProofResponse is the data which is sent back to the VRFCoordinator, so that +// Response is the data which is sent back to the VRFCoordinator, so that // it can verify that the seed the oracle finally used is correct. -type ProofResponse struct { +type Response struct { // Approximately the proof which will be checked on-chain. Note that this // contains the pre-seed in place of the final seed. That should be computed // as in FinalSeed. @@ -31,7 +31,7 @@ type ProofResponse struct { // OnChainResponseLength is the length of the MarshaledOnChainResponse. The // extra 32 bytes are for blocknumber (as a uint256), which goes at the end. The // seed is rewritten with the preSeed. (See MarshalForVRFCoordinator and -// ProofResponse#ActualProof.) +// Response#ActualProof.) const OnChainResponseLength = ProofLength + 32 // blocknum @@ -41,7 +41,7 @@ type MarshaledOnChainResponse [OnChainResponseLength]byte // MarshalForVRFCoordinator constructs the flat bytes which are sent to the // VRFCoordinator. -func (p *ProofResponse) MarshalForVRFCoordinator() ( +func (p *Response) MarshalForVRFCoordinator() ( response MarshaledOnChainResponse, err error, ) { solidityProof, err := SolidityPrecalculations(&p.P) @@ -65,22 +65,22 @@ func (p *ProofResponse) MarshalForVRFCoordinator() ( return response, nil } -// UnmarshalProofResponse returns the ProofResponse represented by the bytes in m -func UnmarshalProofResponse(m MarshaledOnChainResponse) (*ProofResponse, error) { +// UnmarshalProofResponse returns the Response represented by the bytes in m +func UnmarshalProofResponse(m MarshaledOnChainResponse) (*Response, error) { blockNum := common.BytesToHash(m[ProofLength : ProofLength+32]).Big().Uint64() proof, err := UnmarshalSolidityProof(m[:ProofLength]) if err != nil { - return nil, errors.Wrap(err, "while parsing ProofResponse") + return nil, errors.Wrap(err, "while parsing Response") } preSeed, err := BigToSeed(proof.Seed) if err != nil { return nil, errors.Wrap(err, "while converting seed to bytes representation") } - return &ProofResponse{P: proof, PreSeed: preSeed, BlockNum: blockNum}, nil + return &Response{P: proof, PreSeed: preSeed, BlockNum: blockNum}, nil } // CryptoProof returns the proof implied by p, with the correct seed -func (p ProofResponse) CryptoProof(s PreSeedData) (vrfkey.Proof, error) { +func (p *Response) CryptoProof(s PreSeedData) (vrfkey.Proof, error) { proof := p.P // Copy P, which has wrong seed value proof.Seed = FinalSeed(s) valid, err := proof.VerifyVRFProof() @@ -97,7 +97,7 @@ func (p ProofResponse) CryptoProof(s PreSeedData) (vrfkey.Proof, error) { } func GenerateProofResponseFromProof(proof vrfkey.Proof, s PreSeedData) (MarshaledOnChainResponse, error) { - p := ProofResponse{P: proof, PreSeed: s.PreSeed, BlockNum: s.BlockNum} + p := Response{P: proof, PreSeed: s.PreSeed, BlockNum: s.BlockNum} rv, err := p.MarshalForVRFCoordinator() if err != nil { return MarshaledOnChainResponse{}, err @@ -130,7 +130,7 @@ func GenerateProofResponseFromProofV2(p vrfkey.Proof, s PreSeedDataV2) (vrf_coor ZInv: solidityProof.ZInv, }, vrf_coordinator_v2.VRFCoordinatorV2RequestCommitment{ BlockNum: s.BlockNum, - SubId: s.SubId, + SubId: s.SubID, CallbackGasLimit: s.CallbackGasLimit, NumWords: s.NumWords, Sender: s.Sender, @@ -168,7 +168,7 @@ func GenerateProofResponseFromProofV2Plus( ZInv: solidityProof.ZInv, }, vrf_coordinator_v2plus_interface.IVRFCoordinatorV2PlusInternalRequestCommitment{ BlockNum: s.BlockNum, - SubId: s.SubId, + SubId: s.SubID, CallbackGasLimit: s.CallbackGasLimit, NumWords: s.NumWords, Sender: s.Sender, @@ -190,7 +190,8 @@ func GenerateProofResponse(keystore keystore.VRF, id string, s PreSeedData) ( func GenerateProofResponseV2(keystore keystore.VRF, id string, s PreSeedDataV2) ( vrf_coordinator_v2.VRFProof, vrf_coordinator_v2.VRFCoordinatorV2RequestCommitment, error, ) { - seedHashMsg := append(s.PreSeed[:], s.BlockHash.Bytes()...) + seedHashMsg := append([]byte{}, s.PreSeed[:]...) + seedHashMsg = append(seedHashMsg, s.BlockHash.Bytes()...) seed := utils.MustHash(string(seedHashMsg)).Big() proof, err := keystore.GenerateProof(id, seed) if err != nil { @@ -202,7 +203,8 @@ func GenerateProofResponseV2(keystore keystore.VRF, id string, s PreSeedDataV2) func GenerateProofResponseV2Plus(keystore keystore.VRF, id string, s PreSeedDataV2Plus) ( vrf_coordinator_v2plus_interface.IVRFCoordinatorV2PlusInternalProof, vrf_coordinator_v2plus_interface.IVRFCoordinatorV2PlusInternalRequestCommitment, error, ) { - seedHashMsg := append(s.PreSeed[:], s.BlockHash.Bytes()...) + seedHashMsg := append([]byte{}, s.PreSeed[:]...) + seedHashMsg = append(seedHashMsg, s.BlockHash.Bytes()...) seed := utils.MustHash(string(seedHashMsg)).Big() proof, err := keystore.GenerateProof(id, seed) if err != nil { diff --git a/core/services/vrf/proof/seed.go b/core/services/vrf/proof/seed.go index db0feffb5df..0849a4aee4b 100644 --- a/core/services/vrf/proof/seed.go +++ b/core/services/vrf/proof/seed.go @@ -39,7 +39,7 @@ type PreSeedDataV2 struct { PreSeed Seed // Seed to be mixed with hash of containing block BlockHash common.Hash // Hash of block containing VRF request BlockNum uint64 // Cardinal number of block containing VRF request - SubId uint64 + SubID uint64 CallbackGasLimit uint32 NumWords uint32 Sender common.Address @@ -49,7 +49,7 @@ type PreSeedDataV2Plus struct { PreSeed Seed // Seed to be mixed with hash of containing block BlockHash common.Hash // Hash of block containing VRF request BlockNum uint64 // Cardinal number of block containing VRF request - SubId *big.Int + SubID *big.Int CallbackGasLimit uint32 NumWords uint32 Sender common.Address @@ -60,17 +60,17 @@ type PreSeedDataV2Plus struct { // given the pre-seed and the hash of the block in which the VRFCoordinator // emitted the log for the request this is responding to. func FinalSeed(s PreSeedData) (finalSeed *big.Int) { - seedHashMsg := append(s.PreSeed[:], s.BlockHash.Bytes()...) + seedHashMsg := append(s.PreSeed[:], s.BlockHash.Bytes()...) //nolint:gocritic // intentional concat of array slice + hash bytes into a new slice return utils.MustHash(string(seedHashMsg)).Big() } func FinalSeedV2(s PreSeedDataV2) (finalSeed *big.Int) { - seedHashMsg := append(s.PreSeed[:], s.BlockHash.Bytes()...) + seedHashMsg := append(s.PreSeed[:], s.BlockHash.Bytes()...) //nolint:gocritic // intentional concat of array slice + hash bytes into a new slice return utils.MustHash(string(seedHashMsg)).Big() } func FinalSeedV2Plus(s PreSeedDataV2Plus) (finalSeed *big.Int) { - seedHashMsg := append(s.PreSeed[:], s.BlockHash.Bytes()...) + seedHashMsg := append(s.PreSeed[:], s.BlockHash.Bytes()...) //nolint:gocritic // intentional concat of array slice + hash bytes into a new slice return utils.MustHash(string(seedHashMsg)).Big() } @@ -82,7 +82,7 @@ func TestXXXSeedData(t *testing.T, preSeed *big.Int, blockHash common.Hash, bloc } return PreSeedData{ PreSeed: seedAsSeed, - BlockNum: uint64(blockNum), + BlockNum: uint64(blockNum), //nolint:gosec // G115: guarded above by the negative blockNum check BlockHash: blockHash, } } diff --git a/core/services/vrf/v2/integration_v2_plus_test.go b/core/services/vrf/v2/integration_v2_plus_test.go index 270f14cf8b0..0e5c0583036 100644 --- a/core/services/vrf/v2/integration_v2_plus_test.go +++ b/core/services/vrf/v2/integration_v2_plus_test.go @@ -944,7 +944,7 @@ func TestVRFV2PlusIntegration_RequestCost(t *testing.T) { require.NoError(tt, err) t.Log("gas used by proxied CreateSubscriptionAndFund:", r.GasUsed) - subID, err := consumerContract.SSubId(nil) + subID, err := consumerContract.SSubID(nil) require.NoError(tt, err) _, err = uni.rootContract.GetSubscription(nil, subID) require.NoError(tt, err) @@ -977,7 +977,7 @@ func TestVRFV2PlusIntegration_MaxConsumersCost(t *testing.T) { big.NewInt(1000000000000000000)) // 0.1 LINK require.NoError(t, err) uni.backend.Commit() - subID, err := carolContract.SSubId(nil) + subID, err := carolContract.SSubID(nil) require.NoError(t, err) addrs := make([]common.Address, 0, 98) for range 98 { @@ -1028,7 +1028,7 @@ func requestAndEstimateFulfillmentCost( PreSeed: s, BlockHash: requestLog.Raw().BlockHash, BlockNum: requestLog.Raw().BlockNumber, - SubId: subID, + SubID: subID, CallbackGasLimit: gas, NumWords: numWords, Sender: consumerContractAddress, @@ -1066,7 +1066,7 @@ func TestVRFV2PlusIntegration_FulfillmentCost(t *testing.T) { big.NewInt(1000000000000000000)) // 0.1 LINK require.NoError(tt, err) uni.backend.Commit() - subID, err2 := carolContract.SSubId(nil) + subID, err2 := carolContract.SSubID(nil) require.NoError(tt, err2) _, err2 = carolContract.TopUpSubscriptionNative(carol, big.NewInt(2000000000000000000)) // 0.2 ETH @@ -1121,7 +1121,7 @@ func TestVRFV2PlusIntegration_FulfillmentCost(t *testing.T) { _, err2 := consumerContract.CreateSubscriptionAndFund(consumerOwner, assets.Ether(5).ToInt()) require.NoError(t, err2) uni.backend.Commit() - subID, err2 := consumerContract.SSubId(nil) + subID, err2 := consumerContract.SSubID(nil) require.NoError(t, err2) gasRequested := uint32(50_000) nw := uint32(1) @@ -1357,7 +1357,7 @@ func requestRandomnessAndValidate(t *testing.T, require.NoError(t, err) uni.backend.Commit() - requestID, err := consumerContract.SRequestId(nil) + requestID, err := consumerContract.SRequestID(nil) require.NoError(t, err) _, err = uni.migrationTestCoordinator.FulfillRandomWords(uni.neil, requestID) diff --git a/core/services/vrf/v2/integration_v2_reverted_txns_test.go b/core/services/vrf/v2/integration_v2_reverted_txns_test.go index 02d173bd918..93921ce60bf 100644 --- a/core/services/vrf/v2/integration_v2_reverted_txns_test.go +++ b/core/services/vrf/v2/integration_v2_reverted_txns_test.go @@ -427,7 +427,7 @@ func genReqProofNCommitment(t *testing.T, PreSeed: s, BlockHash: requestLog.Raw().BlockHash, BlockNum: requestLog.Raw().BlockNumber, - SubId: sub.subID, + SubID: sub.subID, CallbackGasLimit: req.callbackGasLimit, NumWords: req.numWords, Sender: th.eoaConsumerAddr, @@ -530,7 +530,7 @@ func getTxnReceiptDB(db *sqlx.DB, txesID int64) ([]v2.TxnReceiptDB, error) { FROM evm.receipts WHERE tx_hash IN (SELECT hash FROM attempts) ) - SELECT r.tx_hash, + SELECT r.tx_hash, r.receipt, t.from_address, t.meta->>'SubId' as sub_id, diff --git a/core/services/vrf/v2/integration_v2_test.go b/core/services/vrf/v2/integration_v2_test.go index e85eadbbbb3..2d8d3e8da4a 100644 --- a/core/services/vrf/v2/integration_v2_test.go +++ b/core/services/vrf/v2/integration_v2_test.go @@ -544,7 +544,7 @@ func subscribeVRF( require.NoError(t, err) backend.Commit() - subID, err := consumerContract.SSubId(nil) + subID, err := consumerContract.SSubID(nil) require.NoError(t, err) sub, err := coordinator.GetSubscription(nil, subID) @@ -745,7 +745,7 @@ func requestRandomnessAndAssertRandomWordsRequestedEvent( events = append(events, iter.Event()) } - requestID, err = vrfConsumerHandle.SRequestId(nil) + requestID, err = vrfConsumerHandle.SRequestID(nil) require.NoError(t, err) event := events[len(events)-1] @@ -1811,7 +1811,7 @@ func TestIntegrationVRFV2(t *testing.T) { assets.Ether(1).ToInt(), big.NewInt(0), }) - subID, err := carolContract.SSubId(nil) + subID, err := carolContract.SSubID(nil) require.NoError(t, err) subStart, err := uni.rootContract.GetSubscription(nil, subID) require.NoError(t, err) @@ -1977,7 +1977,7 @@ func TestRequestCost(t *testing.T) { big.NewInt(1000000000000000000)) // 0.1 LINK require.NoError(tt, err) uni.backend.Commit() - subID, err := carolContract.SSubId(nil) + subID, err := carolContract.SSubID(nil) require.NoError(tt, err) // Ensure even with large number of consumers its still cheap addrs := make([]common.Address, 0, 99) @@ -2009,7 +2009,7 @@ func TestRequestCost(t *testing.T) { require.NoError(tt, err) t.Log("gas used by proxied CreateSubscriptionAndFund:", r.GasUsed) - subID, err := consumerContract.SSubId(nil) + subID, err := consumerContract.SSubID(nil) require.NoError(tt, err) _, err = uni.rootContract.GetSubscription(nil, subID) require.NoError(tt, err) @@ -2043,7 +2043,7 @@ func TestMaxConsumersCost(t *testing.T) { big.NewInt(1000000000000000000)) // 0.1 LINK require.NoError(t, err) uni.backend.Commit() - subID, err := carolContract.SSubId(nil) + subID, err := carolContract.SSubID(nil) require.NoError(t, err) addrs := make([]common.Address, 0, 98) for range 98 { @@ -2091,7 +2091,7 @@ func TestFulfillmentCost(t *testing.T) { big.NewInt(1000000000000000000)) // 0.1 LINK require.NoError(tt, err) uni.backend.Commit() - subID, err := carolContract.SSubId(nil) + subID, err := carolContract.SSubID(nil) require.NoError(tt, err) gasRequested := 50_000 @@ -2110,7 +2110,7 @@ func TestFulfillmentCost(t *testing.T) { PreSeed: s, BlockHash: requestLog.Raw().BlockHash, BlockNum: requestLog.Raw().BlockNumber, - SubId: subID.Uint64(), + SubID: subID.Uint64(), CallbackGasLimit: uint32(gasRequested), NumWords: uint32(nw), Sender: carolContractAddress, @@ -2133,7 +2133,7 @@ func TestFulfillmentCost(t *testing.T) { _, err := consumerContract.CreateSubscriptionAndFund(consumerOwner, assets.Ether(5).ToInt()) require.NoError(t, err) uni.backend.Commit() - subID, err := consumerContract.SSubId(nil) + subID, err := consumerContract.SSubID(nil) require.NoError(t, err) gasRequested := 50_000 nw := 1 @@ -2152,7 +2152,7 @@ func TestFulfillmentCost(t *testing.T) { PreSeed: s, BlockHash: requestLog.Raw().BlockHash, BlockNum: requestLog.Raw().BlockNumber, - SubId: subID.Uint64(), + SubID: subID.Uint64(), CallbackGasLimit: uint32(gasRequested), NumWords: uint32(nw), Sender: consumerContractAddress, diff --git a/core/services/vrf/v2/listener_v2_log_listener.go b/core/services/vrf/v2/listener_v2_log_listener.go index 30fc7a49f4d..6cc990800b9 100644 --- a/core/services/vrf/v2/listener_v2_log_listener.go +++ b/core/services/vrf/v2/listener_v2_log_listener.go @@ -103,7 +103,8 @@ func (lsn *listenerV2) getLogPollerFilterName() string { "VRFListener", "version", lsn.coordinator.Version(), "keyhash", lsn.job.VRFSpec.PublicKey.MustHash(), - "coordinatorAddress", lsn.coordinator.Address()) + "coordinatorAddress", lsn.coordinator.Address(), + ) } // initializeLastProcessedBlock returns the earliest block number that we need to @@ -123,7 +124,8 @@ func (lsn *listenerV2) initializeLastProcessedBlock(ctx context.Context) (lastPr ll := lsn.l.With( "latestFinalizedBlock", latestBlock.FinalizedBlockNumber, "latestBlock", latestBlock.BlockNumber, - "fromTimestamp", fromTimestamp) + "fromTimestamp", fromTimestamp, + ) ll.Debugw("Initializing last processed block") defer func() { ll.Debugw("Done initializing last processed block", "elapsed", time.Since(start)) @@ -142,7 +144,7 @@ func (lsn *listenerV2) initializeLastProcessedBlock(ctx context.Context) (lastPr } // get randomness requested logs with the appropriate keyhash - // keyhash is specified in topic1 + // is specified in topic1 requests, err := lp.IndexedLogsCreatedAfter( ctx, lsn.coordinator.RandomWordsRequestedTopic(), // event sig @@ -203,7 +205,8 @@ func (lsn *listenerV2) updateLastProcessedBlock(ctx context.Context, currLastPro ll := lsn.l.With( "currLastProcessedBlock", currLastProcessedBlock, "latestBlock", latestBlock.BlockNumber, - "latestFinalizedBlock", latestBlock.FinalizedBlockNumber) + "latestFinalizedBlock", latestBlock.FinalizedBlockNumber, + ) ll.Debugw("updating last processed block") defer func() { ll.Debugw("done updating last processed block", "elapsed", time.Since(start)) @@ -268,7 +271,8 @@ func (lsn *listenerV2) pollLogs(ctx context.Context, minConfs uint32, lastProces "lastProcessedBlock", lastProcessedBlock, "minConfs", minConfs, "latestBlock", latestBlock.BlockNumber, - "latestFinalizedBlock", latestBlock.FinalizedBlockNumber) + "latestFinalizedBlock", latestBlock.FinalizedBlockNumber, + ) ll.Debugw("polling for logs") defer func() { ll.Debugw("done polling for logs", "elapsed", time.Since(start)) @@ -440,7 +444,7 @@ func (lsn *listenerV2) handleRequested(requested []RandomWordsRequested, request // if the chain ID is not recognized it assumes a block time of 1 second // and returns the number of blocks in a day. func numReplayBlocks(requestTimeout time.Duration, chainID *big.Int) int64 { - var timeoutSeconds = int64(requestTimeout.Seconds()) + timeoutSeconds := int64(requestTimeout.Seconds()) switch chainID.String() { case "1", // eth mainnet diff --git a/core/services/vrf/v2/reverted_txns.go b/core/services/vrf/v2/reverted_txns.go index 472c1b73b81..a9e3659748f 100644 --- a/core/services/vrf/v2/reverted_txns.go +++ b/core/services/vrf/v2/reverted_txns.go @@ -170,7 +170,7 @@ func (lsn *listenerV2) fetchRecentSingleTxns(ctx context.Context, WHERE tx_hash IN (SELECT hash FROM attempts) AND receipt->>'status' = '0x0' ) - SELECT r.tx_hash, + SELECT r.tx_hash, r.receipt, t.from_address, t.to_address, @@ -235,7 +235,7 @@ func (lsn *listenerV2) fetchRecentBatchTxns(ctx context.Context, FROM evm.receipts WHERE tx_hash IN (SELECT hash FROM attempts) ) - SELECT r.tx_hash, + SELECT r.tx_hash, r.receipt, t.from_address, t.to_address, @@ -286,7 +286,7 @@ func (lsn *listenerV2) fetchRevertedForceFulfilmentTxns(ctx context.Context, WHERE tx_hash IN (SELECT hash FROM attempts) AND receipt->>'status' = '0x0' ) - SELECT r.tx_hash, + SELECT r.tx_hash, r.receipt, t.from_address, t.to_address, diff --git a/core/services/vrf/vrfcommon/starting_response_counts_v1.go b/core/services/vrf/vrfcommon/starting_response_counts_v1.go index e8ec6688b9b..5515630cb09 100644 --- a/core/services/vrf/vrfcommon/starting_response_counts_v1.go +++ b/core/services/vrf/vrfcommon/starting_response_counts_v1.go @@ -35,7 +35,7 @@ func GetStartingResponseCountsV1(ctx context.Context, chain legacyevm.Chain) (ma var counts []RespCountEntry counts, err = GetRespCounts(ctx, chain.TxManager(), chain.Client().ConfiguredChainID(), confirmedBlockNum) if err != nil { - return respCounts, nil + return respCounts, err } for _, c := range counts { diff --git a/core/services/vrf/vrfcommon/utils.go b/core/services/vrf/vrfcommon/utils.go index c473713cde9..c9f92b1baad 100644 --- a/core/services/vrf/vrfcommon/utils.go +++ b/core/services/vrf/vrfcommon/utils.go @@ -46,11 +46,11 @@ func GetRespCounts(ctx context.Context, txm txmgr.TxManager, chainID *big.Int, c return nil, errors.Wrap(err, "getRespCounts failed parsing tx meta field") } if meta != nil && meta.RequestID != nil { - requestId := meta.RequestID.String() - if _, exists := respCountMap[requestId]; !exists { - respCountMap[requestId] = 0 + requestID := meta.RequestID.String() + if _, exists := respCountMap[requestID]; !exists { + respCountMap[requestID] = 0 } - respCountMap[requestId]++ + respCountMap[requestID]++ } } @@ -66,11 +66,11 @@ func GetRespCounts(ctx context.Context, txm txmgr.TxManager, chainID *big.Int, c } func DedupeTxList(txes []*txmgr.Tx) []*txmgr.Tx { - txIdMap := make(map[string]bool) + txIDMap := make(map[string]bool) dedupedTxes := []*txmgr.Tx{} for _, tx := range txes { - if _, found := txIdMap[tx.GetID()]; !found { - txIdMap[tx.GetID()] = true + if _, found := txIDMap[tx.GetID()]; !found { + txIDMap[tx.GetID()] = true dedupedTxes = append(dedupedTxes, tx) } } diff --git a/core/services/vrf/vrftesthelpers/consumer_v2.go b/core/services/vrf/vrftesthelpers/consumer_v2.go index 80ef5b94cb8..52ec82a0065 100644 --- a/core/services/vrf/vrftesthelpers/consumer_v2.go +++ b/core/services/vrf/vrftesthelpers/consumer_v2.go @@ -18,18 +18,16 @@ import ( "github.com/smartcontractkit/chainlink-evm/gethwrappers/generated/vrfv2plus_reverting_example" ) -var ( - _ VRFConsumerContract = (*vrfConsumerContract)(nil) -) +var _ VRFConsumerContract = (*vrfConsumerContract)(nil) // VRFConsumerContract is the common interface implemented by // the example contracts used for the integration tests. type VRFConsumerContract interface { CreateSubscriptionAndFund(opts *bind.TransactOpts, fundingJuels *big.Int) (*gethtypes.Transaction, error) CreateSubscriptionAndFundNative(opts *bind.TransactOpts, fundingAmount *big.Int) (*gethtypes.Transaction, error) - SSubId(opts *bind.CallOpts) (*big.Int, error) - SRequestId(opts *bind.CallOpts) (*big.Int, error) - RequestRandomness(opts *bind.TransactOpts, keyHash [32]byte, subID *big.Int, minReqConfs uint16, callbackGasLimit uint32, numWords uint32, payInEth bool) (*gethtypes.Transaction, error) + SSubID(opts *bind.CallOpts) (*big.Int, error) + SRequestID(opts *bind.CallOpts) (*big.Int, error) + RequestRandomness(opts *bind.TransactOpts, keyHash [32]byte, subID *big.Int, minReqConfs uint16, callbackGasLimit, numWords uint32, payInEth bool) (*gethtypes.Transaction, error) SRandomWords(opts *bind.CallOpts, randomwordIdx *big.Int) (*big.Int, error) TopUpSubscription(opts *bind.TransactOpts, amount *big.Int) (*gethtypes.Transaction, error) TopUpSubscriptionNative(opts *bind.TransactOpts, amount *big.Int) (*gethtypes.Transaction, error) @@ -147,7 +145,7 @@ func (c *vrfConsumerContract) CreateSubscriptionAndFund(opts *bind.TransactOpts, return nil, errors.New("CreateSubscriptionAndFund is not supported") } -func (c *vrfConsumerContract) SSubId(opts *bind.CallOpts) (*big.Int, error) { +func (c *vrfConsumerContract) SSubID(opts *bind.CallOpts) (*big.Int, error) { if c.consumerType == VRFConsumerV2 { subID, err := c.vrfConsumerV2.SSubId(opts) if err != nil { @@ -181,7 +179,7 @@ func (c *vrfConsumerContract) SSubId(opts *bind.CallOpts) (*big.Int, error) { return nil, errors.New("SSubId is not supported") } -func (c *vrfConsumerContract) SRequestId(opts *bind.CallOpts) (*big.Int, error) { +func (c *vrfConsumerContract) SRequestID(opts *bind.CallOpts) (*big.Int, error) { if c.consumerType == VRFConsumerV2 { return c.vrfConsumerV2.SRequestId(opts) } @@ -209,7 +207,7 @@ func (c *vrfConsumerContract) SRequestId(opts *bind.CallOpts) (*big.Int, error) return nil, errors.New("SRequestId is not supported") } -func (c *vrfConsumerContract) RequestRandomness(opts *bind.TransactOpts, keyHash [32]byte, subID *big.Int, minReqConfs uint16, callbackGasLimit uint32, numWords uint32, payInEth bool) (*gethtypes.Transaction, error) { +func (c *vrfConsumerContract) RequestRandomness(opts *bind.TransactOpts, keyHash [32]byte, subID *big.Int, minReqConfs uint16, callbackGasLimit, numWords uint32, payInEth bool) (*gethtypes.Transaction, error) { if c.consumerType == VRFV2PlusConsumer { return c.vrfV2PlusConsumer.RequestRandomWords(opts, callbackGasLimit, minReqConfs, numWords, keyHash, payInEth) } diff --git a/core/services/workflows/artifacts/v2/file_module_store_test.go b/core/services/workflows/artifacts/v2/file_module_store_test.go index 43a1d6b21c2..0792fa8ca56 100644 --- a/core/services/workflows/artifacts/v2/file_module_store_test.go +++ b/core/services/workflows/artifacts/v2/file_module_store_test.go @@ -179,7 +179,9 @@ func TestStore_ConcurrentAccess(t *testing.T) { go func(idx int) { defer wg.Done() wfID := "wf-" + string(wfSuffix[idx]) - assert.NoError(t, s.StoreModule(wfID, []byte("data"), "v1")) + if !assert.NoError(t, s.StoreModule(wfID, []byte("data"), "v1")) { + return + } }(i) } for i := range 10 { @@ -188,7 +190,9 @@ func TestStore_ConcurrentAccess(t *testing.T) { defer wg.Done() wfID := "wf-" + string(wfSuffix[idx]) _, _, _, err := s.GetModule(wfID) - assert.NoError(t, err) + if !assert.NoError(t, err) { + return + } }(i) } wg.Wait() diff --git a/core/services/workflows/cmd/cre/examples/v2/simple_cron_with_config/main.go b/core/services/workflows/cmd/cre/examples/v2/simple_cron_with_config/main.go index 50ce88b4efd..56d8ee91626 100644 --- a/core/services/workflows/cmd/cre/examples/v2/simple_cron_with_config/main.go +++ b/core/services/workflows/cmd/cre/examples/v2/simple_cron_with_config/main.go @@ -6,10 +6,11 @@ import ( "fmt" "log/slog" + "gopkg.in/yaml.v3" + "github.com/smartcontractkit/cre-sdk-go/capabilities/scheduler/cron" "github.com/smartcontractkit/cre-sdk-go/cre" "github.com/smartcontractkit/cre-sdk-go/cre/wasm" - "gopkg.in/yaml.v3" ) type runtimeConfig struct { diff --git a/core/services/workflows/cmd/cre/examples/v2/simple_cron_with_secrets/main.go b/core/services/workflows/cmd/cre/examples/v2/simple_cron_with_secrets/main.go index 71ec8002777..0874385b79d 100644 --- a/core/services/workflows/cmd/cre/examples/v2/simple_cron_with_secrets/main.go +++ b/core/services/workflows/cmd/cre/examples/v2/simple_cron_with_secrets/main.go @@ -6,13 +6,12 @@ import ( "fmt" "log/slog" - "github.com/smartcontractkit/cre-sdk-go/cre" - "github.com/smartcontractkit/cre-sdk-go/cre/wasm" "gopkg.in/yaml.v3" - "github.com/smartcontractkit/cre-sdk-go/capabilities/scheduler/cron" - "github.com/smartcontractkit/chainlink-protos/cre/go/sdk" + "github.com/smartcontractkit/cre-sdk-go/capabilities/scheduler/cron" + "github.com/smartcontractkit/cre-sdk-go/cre" + "github.com/smartcontractkit/cre-sdk-go/cre/wasm" ) type runtimeConfig struct { diff --git a/core/services/workflows/syncer/v2/handler_test.go b/core/services/workflows/syncer/v2/handler_test.go index f3e48d6dd94..e6aedbc04cc 100644 --- a/core/services/workflows/syncer/v2/handler_test.go +++ b/core/services/workflows/syncer/v2/handler_test.go @@ -162,7 +162,7 @@ func (m *mockDrainableEngine) Close() error { // mockEngineFactory returns a standard mock engine factory for tests. // It sends nil to initDone to signal successful initialization. -func mockEngineFactory(ctx context.Context, wfid string, owner string, name types.WorkflowName, tag string, config []byte, binary []byte, binaryURL string, initDone chan<- error) (services.Service, error) { +func mockEngineFactory(ctx context.Context, wfid, owner string, name types.WorkflowName, tag string, config, binary []byte, binaryURL string, initDone chan<- error) (services.Service, error) { if initDone != nil { initDone <- nil } @@ -262,7 +262,7 @@ func Test_workflowRegisteredHandler(t *testing.T) { require.NoError(t, err) } - defaultValidationFnWithFetch := func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL string, configURL string) { + defaultValidationFnWithFetch := func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL, configURL string) { defaultValidationFn(t, ctx, event, h, s, wfOwner, wfName, wfID, fetcher) // Verify that the URLs have been called @@ -317,7 +317,7 @@ func Test_workflowRegisteredHandler(t *testing.T) { signedConfigURL: {Body: config, Err: nil}, }) }, - engineFactoryFn: func(ctx context.Context, wfid string, owner string, name types.WorkflowName, tag string, config []byte, binary []byte, binaryURL string, initDone chan<- error) (services.Service, error) { + engineFactoryFn: func(ctx context.Context, wfid, owner string, name types.WorkflowName, tag string, config, binary []byte, binaryURL string, initDone chan<- error) (services.Service, error) { if _, err := hex.DecodeString(name.Hex()); err != nil { return nil, fmt.Errorf("invalid workflow name: %w", err) } @@ -361,7 +361,7 @@ func Test_workflowRegisteredHandler(t *testing.T) { signedConfigURL: {Body: config, Err: nil}, }) }, - engineFactoryFn: func(ctx context.Context, wfid string, owner string, name types.WorkflowName, tag string, config []byte, binary []byte, binaryURL string, initDone chan<- error) (services.Service, error) { + engineFactoryFn: func(ctx context.Context, wfid, owner string, name types.WorkflowName, tag string, config, binary []byte, binaryURL string, initDone chan<- error) (services.Service, error) { if initDone != nil { initDone <- nil } @@ -384,7 +384,7 @@ func Test_workflowRegisteredHandler(t *testing.T) { } }, validationFn: func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, - s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL string, configURL string, + s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL, configURL string, ) { err := h.workflowRegisteredEvent(ctx, event) require.Error(t, err) @@ -420,7 +420,7 @@ func Test_workflowRegisteredHandler(t *testing.T) { ConfigURL: configURLFactory(hex.EncodeToString(wfID)), } }, - validationFn: func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL string, configURL string) { + validationFn: func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL, configURL string) { me := &mockEngine{} err := h.engineRegistry.Add(wfID, event.Source, me) require.NoError(t, err) @@ -458,7 +458,7 @@ func Test_workflowRegisteredHandler(t *testing.T) { } }, engineFactoryFn: mockEngineFactory, - validationFn: func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL string, configURL string) { + validationFn: func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL, configURL string) { me := &mockEngine{} oldWfIDBytes := [32]byte{0, 1, 2, 3, 5} err := h.engineRegistry.Add(oldWfIDBytes, event.Source, me) @@ -500,7 +500,7 @@ func Test_workflowRegisteredHandler(t *testing.T) { } }, validationFn: func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, - s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL string, configURL string, + s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL, configURL string, ) { err := h.workflowRegisteredEvent(ctx, event) require.NoError(t, err) @@ -548,7 +548,7 @@ func Test_workflowRegisteredHandler(t *testing.T) { }, engineFactoryFn: mockEngineFactory, validationFn: func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, - s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL string, configURL string, + s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL, configURL string, ) { // Create the record in the database entry := &job.WorkflowSpec{ @@ -597,7 +597,7 @@ func Test_workflowRegisteredHandler(t *testing.T) { }) }, engineFactoryFn: mockEngineFactory, - validationFn: func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL string, configURL string) { + validationFn: func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL, configURL string) { defaultValidationFn(t, ctx, event, h, s, wfOwner, wfName, wfID, fetcher) // Verify that the URLs have been called @@ -634,7 +634,7 @@ func Test_workflowRegisteredHandler(t *testing.T) { }) }, engineFactoryFn: mockEngineFactory, - validationFn: func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL string, configURL string) { + validationFn: func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL, configURL string) { // Create the record in the database entry := &job.WorkflowSpec{ Workflow: hex.EncodeToString(binary), @@ -691,7 +691,7 @@ func Test_workflowRegisteredHandler(t *testing.T) { }) }, engineFactoryFn: mockEngineFactory, - validationFn: func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL string, configURL string) { + validationFn: func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL, configURL string) { defaultValidationFn(t, ctx, event, h, s, wfOwner, wfName, wfID, fetcher) require.NoError(t, h.workflowPausedEvent(ctx, WorkflowPausedEvent{WorkflowID: wfID})) @@ -959,8 +959,8 @@ type testCase struct { WFOwner []byte fetcherFactory func(wfID []byte) *mockFetcher Event func(wfID []byte, wfName string, wfOwner []byte) WorkflowRegisteredEvent - validationFn func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL string, configURL string) - engineFactoryFn func(ctx context.Context, wfid string, owner string, name types.WorkflowName, tag string, config []byte, binary []byte, binaryURL string, initDone chan<- error) (services.Service, error) + validationFn func(t *testing.T, ctx context.Context, event WorkflowRegisteredEvent, h *eventHandler, s *artifacts.Store, wfOwner []byte, wfName string, wfID types.WorkflowID, fetcher *mockFetcher, binaryURL, configURL string) + engineFactoryFn func(ctx context.Context, wfid, owner string, name types.WorkflowName, tag string, config, binary []byte, binaryURL string, initDone chan<- error) (services.Service, error) } func testRunningWorkflow(t *testing.T, tc testCase) { @@ -1696,7 +1696,11 @@ func Test_Handler_OrganizationID(t *testing.T) { s := grpc.NewServer() linkingclient.RegisterLinkingServiceServer(s, mockLinking) go func() { - assert.NoError(t, s.Serve(lis)) + if serveErr := s.Serve(lis); serveErr != nil && !errors.Is(serveErr, grpc.ErrServerStopped) { + if !assert.NoError(t, serveErr) { + return + } + } }() defer s.Stop() linkingURL := lis.Addr().String() @@ -1876,10 +1880,12 @@ type testActionBase struct { var _ commoncap.ExecutableAndTriggerCapability = (*testActionBase)(nil) -func (t *testActionBase) AckEvent(_ context.Context, _ string, _ string, _ string) error { return nil } +func (t *testActionBase) AckEvent(_ context.Context, _, _, _ string) error { return nil } + func (t *testActionBase) RegisterTrigger(_ context.Context, _ commoncap.TriggerRegistrationRequest) (<-chan commoncap.TriggerResponse, error) { panic("not implemented for this test") } + func (t *testActionBase) UnregisterTrigger(_ context.Context, _ commoncap.TriggerRegistrationRequest) error { return nil } diff --git a/core/services/workflows/syncer/v2/workflow_registry.go b/core/services/workflows/syncer/v2/workflow_registry.go index 16be4a10518..56143644606 100644 --- a/core/services/workflows/syncer/v2/workflow_registry.go +++ b/core/services/workflows/syncer/v2/workflow_registry.go @@ -876,7 +876,7 @@ func (w *workflowRegistry) syncUsingReconciliationStrategy(ctx context.Context) case <-ticker: don, err := w.workflowDonNotifier.WaitForDon(ctx) if err != nil { - w.lggr.Errorw("failed to get get don from notifier", "err", err) + w.lggr.Errorw("failed to get don from notifier", "err", err) continue } w.lggr.Debugw("fetching workflow metadata from all sources", "don", don.Families) @@ -1259,7 +1259,7 @@ func (w *workflowRegistry) getAllowlistedRequests(ctx context.Context, contractR var newAllowlistedRequests []workflow_registry_wrapper_v2.WorkflowRegistryOwnerAllowlistedRequest readIdentifier = contractBinding.ReadIdentifier(GetActiveAllowlistedRequestsReverseMethodName) - var endIndex = new(big.Int).Sub(totalAllowlistedRequestsResult, big.NewInt(1)) + endIndex := new(big.Int).Sub(totalAllowlistedRequestsResult, big.NewInt(1)) var startIndex *big.Int for { diff --git a/core/services/workflows/test/wasm/v2/cmd/with_config/main.go b/core/services/workflows/test/wasm/v2/cmd/with_config/main.go index b54ffe9ceef..a16d80b5d88 100644 --- a/core/services/workflows/test/wasm/v2/cmd/with_config/main.go +++ b/core/services/workflows/test/wasm/v2/cmd/with_config/main.go @@ -5,10 +5,11 @@ package main import ( "log/slog" + "gopkg.in/yaml.v3" + "github.com/smartcontractkit/cre-sdk-go/cre" "github.com/smartcontractkit/cre-sdk-go/cre/wasm" "github.com/smartcontractkit/cre-sdk-go/internal_testing/capabilities/basictrigger" - "gopkg.in/yaml.v3" ) type runtimeConfig struct { diff --git a/core/services/workflows/test/wasm/v2/cmd/with_secrets/main.go b/core/services/workflows/test/wasm/v2/cmd/with_secrets/main.go index 2e97f5585ca..e7cfa83eb1d 100644 --- a/core/services/workflows/test/wasm/v2/cmd/with_secrets/main.go +++ b/core/services/workflows/test/wasm/v2/cmd/with_secrets/main.go @@ -5,10 +5,11 @@ package main import ( "log/slog" + "gopkg.in/yaml.v3" + "github.com/smartcontractkit/cre-sdk-go/cre" "github.com/smartcontractkit/cre-sdk-go/cre/wasm" "github.com/smartcontractkit/cre-sdk-go/internal_testing/capabilities/basictrigger" - "gopkg.in/yaml.v3" ) type runtimeConfig struct { diff --git a/deployment/go.mod b/deployment/go.mod index d8dc488a798..cd2080772ac 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -50,11 +50,11 @@ require ( github.com/smartcontractkit/chainlink-ccip/chains/solana/deployment v0.0.0-20260908155618-50f521d70e62 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260908155618-50f521d70e62 github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260908155618-50f521d70e62 - github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d + github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049 github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d github.com/smartcontractkit/chainlink-data-streams v1.1.1 github.com/smartcontractkit/chainlink-deployments-framework v0.122.2 - github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab + github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744 github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260713161920-de075095648b github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20260804200254-c1accce563a8 @@ -435,9 +435,8 @@ require ( github.com/sirupsen/logrus v1.9.4 // indirect github.com/smartcontractkit/chainlink-canton/contracts/v2 v2.0.0 // indirect github.com/smartcontractkit/chainlink-ccv v0.12.0 // indirect - github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72 // indirect + github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 // indirect - github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb // indirect github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20260723212800-b2f21d31b1d2 // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20260625152110-9afcf56e4053 // indirect diff --git a/deployment/go.sum b/deployment/go.sum index 87fb4ad8522..803b58e5e35 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1405,26 +1405,24 @@ github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260908155618-50f5 github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260908155618-50f521d70e62/go.mod h1:Dm/Abz0vr7F2v9TygUX947q8HIwJEJikDfSdanX1Cic= github.com/smartcontractkit/chainlink-ccv v0.12.0 h1:/EbL7S96ItC3YF9pZ/fihbxugYxT1xxLSQSFJT4JQoQ= github.com/smartcontractkit/chainlink-ccv v0.12.0/go.mod h1:yijeTgli1K0e1noV/06/etKFxnYz8kBIe3IVXBaGnQw= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d h1:4heqJxOTXBHR3425SuXe9EzkZq+CqWOdKe4KWzAoGYA= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d/go.mod h1:ks0kniCCg8Siv2XflmwLOq5ib9Ifoh6VHXHwfEWIMQA= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049 h1:WebE9HTubitMC5xq+xCAArEI+oBLekVOoxYnCkB8whI= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049/go.mod h1:3CaCxSyZmgWl1PhxneFSZqOfN7DF2VnHML0bTfiDNIo= github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d h1:M9xuiIvdiHtim4nlxCVajyC/Mk63tAg9ESWb/biAhNA= github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d/go.mod h1:rI2njmTlyTvh+xhmORmK6qX3+V1ycDAqGJLu8LS8WpU= -github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72 h1:uWEwl7i2ryuRVoV4DmIKm6mqYevf1lH/8cQYhw/JXko= -github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72/go.mod h1:UYcRMb4dZcoaIPgZJ3hckCySTqtJc9K4Q+tOKErwTq0= +github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92 h1:Z1OIGukDhJD+Gknr5G07Vtml24E7BwKaIQoWzV/SdqA= +github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92/go.mod h1:Scyk7O80fde5rJF3Ty3fEE3xiS6j84eWbu8/2gl3pIY= github.com/smartcontractkit/chainlink-data-streams v1.1.1 h1:WcNIy7fy/HVnjHKOm21pLwD7aMa0H6IY8mB3aJHKU4c= github.com/smartcontractkit/chainlink-data-streams v1.1.1/go.mod h1:3mVEtx2PceMRauxmK6SJqJA7JB6XHeqCJLs370nYXgI= github.com/smartcontractkit/chainlink-deployments-framework v0.122.2 h1:UtkIAbqWYtbExgCBEhQCJMEZpSrcAgPnk8GvFOGXuxA= github.com/smartcontractkit/chainlink-deployments-framework v0.122.2/go.mod h1:1fA5FLbgZlpC3OvLD/Nr86rgb4ZRI6MK0QEVVOIP1+o= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab h1:NWZzKhUqh56rmOMWMz9urvBm6jKKktdW3GBGFcJjNJE= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab/go.mod h1:XionVLmbYKsgR7Xi6hoC4D4c/uxhhBvNny8qgA39D4M= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744 h1:n+V23NCROMeWFHUyR78Z4dXkUnPV3K8RzOzJpnXuXV0= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744/go.mod h1:dEk48o9w++AyLCv12fNKIJf4Ko6iywWWJAGrjfS0vR8= github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501 h1:QJiXTG9CmaQAuMRn5JGi+Jhji7fSkehVnKpjc8oNJJY= github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501/go.mod h1:4cT1BeNF8DAn6In9zr3LayVCv1KzFeuxT7zcuNkfIb0= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260713161920-de075095648b h1:UdsGoTutNrzqQ23xA49U19lucVR98agzXRVPUPUf7eU= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260713161920-de075095648b/go.mod h1:lvYHbYNhFR2rrtwZ8NYw6dokZrX6/u9eWWJmP0Jg0y8= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 h1:8u9xUrC+yHrTDexOKDd+jrA6LCzFFHeX1G82oj2fsSI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135/go.mod h1:NkvE4iQgiT7dMCP6U3xPELHhWhN5Xr6rHC0axRebyMU= -github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c h1:AYRSQarVw1EJXUrGvHSwmRTtNHHww/i3xwLat5CshUE= -github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c/go.mod h1:HcwehCao5k5C2NGuKJUVoX/AYtoH6njGFiV44dBOcY4= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb h1:HQN56hEteWOBagVDCxV2Fn++frjRI7dfnozEQUq/5ok= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb/go.mod h1:kGprqyjsz6qFNVszOQoHc24wfvCjyipNZFste/3zcbs= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20260723212800-b2f21d31b1d2 h1:N1Q6NHuH+T2b6cst43LD2pnykNJSymP/szJJ7rrYY8I= diff --git a/go.md b/go.md index dec11c02787..eb3c2f58743 100644 --- a/go.md +++ b/go.md @@ -87,7 +87,7 @@ flowchart LR click chainlink-evm/gethwrappers/helpers href "https://github.com/smartcontractkit/chainlink-evm" chainlink-feeds --> chainlink-common click chainlink-feeds href "https://github.com/smartcontractkit/chainlink-feeds" - chainlink-framework/capabilities --> chainlink-common + chainlink-framework/capabilities click chainlink-framework/capabilities href "https://github.com/smartcontractkit/chainlink-framework" chainlink-framework/chains --> chainlink-framework/multinode click chainlink-framework/chains href "https://github.com/smartcontractkit/chainlink-framework" @@ -473,7 +473,6 @@ flowchart LR click chainlink-ton/deployment href "https://github.com/smartcontractkit/chainlink-ton" chainlink-tron/relayer --> chainlink-common click chainlink-tron/relayer href "https://github.com/smartcontractkit/chainlink-tron" - chainlink/core/scripts --> chainlink/core/scripts/cre/environment/examples/workflows/proof-of-reserve/cron-based chainlink/core/scripts --> chainlink/system-tests/lib click chainlink/core/scripts href "https://github.com/smartcontractkit/chainlink" chainlink/core/scripts/cre/environment/examples/workflows/cron --> cre-sdk-go/capabilities/scheduler/cron diff --git a/go.mod b/go.mod index 90d9c02f7b9..793cd8dd2c0 100644 --- a/go.mod +++ b/go.mod @@ -82,15 +82,14 @@ require ( github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260908155618-50f521d70e62 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260908155618-50f521d70e62 github.com/smartcontractkit/chainlink-ccv v0.12.0 - github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d + github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049 github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d - github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72 + github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92 github.com/smartcontractkit/chainlink-data-streams v1.1.1 - github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab + github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744 github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260710181111-6417709a55ee github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 - github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20260625152110-9afcf56e4053 github.com/smartcontractkit/chainlink-protos/billing/go v0.0.0-20251024234028-0988426d98f4 diff --git a/go.sum b/go.sum index 90ac950258a..8dbdc7c6ad4 100644 --- a/go.sum +++ b/go.sum @@ -1106,24 +1106,22 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260908155618-50f521d70e62/go.mod h1:c++Ed0jeYn4w8WIfiAboRwN6ClRRVGglL0qwB/QjJvM= github.com/smartcontractkit/chainlink-ccv v0.12.0 h1:/EbL7S96ItC3YF9pZ/fihbxugYxT1xxLSQSFJT4JQoQ= github.com/smartcontractkit/chainlink-ccv v0.12.0/go.mod h1:yijeTgli1K0e1noV/06/etKFxnYz8kBIe3IVXBaGnQw= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d h1:4heqJxOTXBHR3425SuXe9EzkZq+CqWOdKe4KWzAoGYA= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d/go.mod h1:ks0kniCCg8Siv2XflmwLOq5ib9Ifoh6VHXHwfEWIMQA= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049 h1:WebE9HTubitMC5xq+xCAArEI+oBLekVOoxYnCkB8whI= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049/go.mod h1:3CaCxSyZmgWl1PhxneFSZqOfN7DF2VnHML0bTfiDNIo= github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d h1:M9xuiIvdiHtim4nlxCVajyC/Mk63tAg9ESWb/biAhNA= github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d/go.mod h1:rI2njmTlyTvh+xhmORmK6qX3+V1ycDAqGJLu8LS8WpU= -github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72 h1:uWEwl7i2ryuRVoV4DmIKm6mqYevf1lH/8cQYhw/JXko= -github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72/go.mod h1:UYcRMb4dZcoaIPgZJ3hckCySTqtJc9K4Q+tOKErwTq0= +github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92 h1:Z1OIGukDhJD+Gknr5G07Vtml24E7BwKaIQoWzV/SdqA= +github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92/go.mod h1:Scyk7O80fde5rJF3Ty3fEE3xiS6j84eWbu8/2gl3pIY= github.com/smartcontractkit/chainlink-data-streams v1.1.1 h1:WcNIy7fy/HVnjHKOm21pLwD7aMa0H6IY8mB3aJHKU4c= github.com/smartcontractkit/chainlink-data-streams v1.1.1/go.mod h1:3mVEtx2PceMRauxmK6SJqJA7JB6XHeqCJLs370nYXgI= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab h1:NWZzKhUqh56rmOMWMz9urvBm6jKKktdW3GBGFcJjNJE= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab/go.mod h1:XionVLmbYKsgR7Xi6hoC4D4c/uxhhBvNny8qgA39D4M= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744 h1:n+V23NCROMeWFHUyR78Z4dXkUnPV3K8RzOzJpnXuXV0= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744/go.mod h1:dEk48o9w++AyLCv12fNKIJf4Ko6iywWWJAGrjfS0vR8= github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501 h1:QJiXTG9CmaQAuMRn5JGi+Jhji7fSkehVnKpjc8oNJJY= github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501/go.mod h1:4cT1BeNF8DAn6In9zr3LayVCv1KzFeuxT7zcuNkfIb0= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260710181111-6417709a55ee h1:MfUoOYDYeE4vzk2FXDw65V0CjDlVczYd5ohCBRwByjk= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260710181111-6417709a55ee/go.mod h1:eLkDLcX+AfkWNRp9oOZL4db2Ah8emZa3bGddKU4Rjdg= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 h1:8u9xUrC+yHrTDexOKDd+jrA6LCzFFHeX1G82oj2fsSI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135/go.mod h1:NkvE4iQgiT7dMCP6U3xPELHhWhN5Xr6rHC0axRebyMU= -github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c h1:AYRSQarVw1EJXUrGvHSwmRTtNHHww/i3xwLat5CshUE= -github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c/go.mod h1:HcwehCao5k5C2NGuKJUVoX/AYtoH6njGFiV44dBOcY4= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb h1:HQN56hEteWOBagVDCxV2Fn++frjRI7dfnozEQUq/5ok= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb/go.mod h1:kGprqyjsz6qFNVszOQoHc24wfvCjyipNZFste/3zcbs= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20260723212800-b2f21d31b1d2 h1:N1Q6NHuH+T2b6cst43LD2pnykNJSymP/szJJ7rrYY8I= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 54f31ba7de8..393e9dcaebe 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -33,10 +33,10 @@ require ( github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260908164107-3de1349d970b github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260908155618-50f521d70e62 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260908155618-50f521d70e62 - github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d + github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049 github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d github.com/smartcontractkit/chainlink-deployments-framework v0.122.2 - github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab + github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260713161920-de075095648b github.com/smartcontractkit/chainlink-protos/job-distributor v0.20.1-0.20260701185448-696c075849ea github.com/smartcontractkit/chainlink-sui v0.0.0-20260827120130-362c4a408695 @@ -418,11 +418,10 @@ require ( github.com/smartcontractkit/chainlink-aptos/deployment v0.0.0-20260706100550-d43558069754 github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260908155618-50f521d70e62 // indirect github.com/smartcontractkit/chainlink-ccv v0.12.0 // indirect - github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72 // indirect + github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92 // indirect github.com/smartcontractkit/chainlink-data-streams v1.1.1 // indirect github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 // indirect - github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb // indirect github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20260723212800-b2f21d31b1d2 // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20260625152110-9afcf56e4053 // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 34e2cb8a62e..acee8cfc231 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1394,26 +1394,24 @@ github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260908155618-50f5 github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260908155618-50f521d70e62/go.mod h1:Dm/Abz0vr7F2v9TygUX947q8HIwJEJikDfSdanX1Cic= github.com/smartcontractkit/chainlink-ccv v0.12.0 h1:/EbL7S96ItC3YF9pZ/fihbxugYxT1xxLSQSFJT4JQoQ= github.com/smartcontractkit/chainlink-ccv v0.12.0/go.mod h1:yijeTgli1K0e1noV/06/etKFxnYz8kBIe3IVXBaGnQw= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d h1:4heqJxOTXBHR3425SuXe9EzkZq+CqWOdKe4KWzAoGYA= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d/go.mod h1:ks0kniCCg8Siv2XflmwLOq5ib9Ifoh6VHXHwfEWIMQA= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049 h1:WebE9HTubitMC5xq+xCAArEI+oBLekVOoxYnCkB8whI= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049/go.mod h1:3CaCxSyZmgWl1PhxneFSZqOfN7DF2VnHML0bTfiDNIo= github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d h1:M9xuiIvdiHtim4nlxCVajyC/Mk63tAg9ESWb/biAhNA= github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d/go.mod h1:rI2njmTlyTvh+xhmORmK6qX3+V1ycDAqGJLu8LS8WpU= -github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72 h1:uWEwl7i2ryuRVoV4DmIKm6mqYevf1lH/8cQYhw/JXko= -github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72/go.mod h1:UYcRMb4dZcoaIPgZJ3hckCySTqtJc9K4Q+tOKErwTq0= +github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92 h1:Z1OIGukDhJD+Gknr5G07Vtml24E7BwKaIQoWzV/SdqA= +github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92/go.mod h1:Scyk7O80fde5rJF3Ty3fEE3xiS6j84eWbu8/2gl3pIY= github.com/smartcontractkit/chainlink-data-streams v1.1.1 h1:WcNIy7fy/HVnjHKOm21pLwD7aMa0H6IY8mB3aJHKU4c= github.com/smartcontractkit/chainlink-data-streams v1.1.1/go.mod h1:3mVEtx2PceMRauxmK6SJqJA7JB6XHeqCJLs370nYXgI= github.com/smartcontractkit/chainlink-deployments-framework v0.122.2 h1:UtkIAbqWYtbExgCBEhQCJMEZpSrcAgPnk8GvFOGXuxA= github.com/smartcontractkit/chainlink-deployments-framework v0.122.2/go.mod h1:1fA5FLbgZlpC3OvLD/Nr86rgb4ZRI6MK0QEVVOIP1+o= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab h1:NWZzKhUqh56rmOMWMz9urvBm6jKKktdW3GBGFcJjNJE= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab/go.mod h1:XionVLmbYKsgR7Xi6hoC4D4c/uxhhBvNny8qgA39D4M= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744 h1:n+V23NCROMeWFHUyR78Z4dXkUnPV3K8RzOzJpnXuXV0= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744/go.mod h1:dEk48o9w++AyLCv12fNKIJf4Ko6iywWWJAGrjfS0vR8= github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501 h1:QJiXTG9CmaQAuMRn5JGi+Jhji7fSkehVnKpjc8oNJJY= github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501/go.mod h1:4cT1BeNF8DAn6In9zr3LayVCv1KzFeuxT7zcuNkfIb0= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260713161920-de075095648b h1:UdsGoTutNrzqQ23xA49U19lucVR98agzXRVPUPUf7eU= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260713161920-de075095648b/go.mod h1:lvYHbYNhFR2rrtwZ8NYw6dokZrX6/u9eWWJmP0Jg0y8= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 h1:8u9xUrC+yHrTDexOKDd+jrA6LCzFFHeX1G82oj2fsSI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135/go.mod h1:NkvE4iQgiT7dMCP6U3xPELHhWhN5Xr6rHC0axRebyMU= -github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c h1:AYRSQarVw1EJXUrGvHSwmRTtNHHww/i3xwLat5CshUE= -github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c/go.mod h1:HcwehCao5k5C2NGuKJUVoX/AYtoH6njGFiV44dBOcY4= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb h1:HQN56hEteWOBagVDCxV2Fn++frjRI7dfnozEQUq/5ok= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb/go.mod h1:kGprqyjsz6qFNVszOQoHc24wfvCjyipNZFste/3zcbs= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20260723212800-b2f21d31b1d2 h1:N1Q6NHuH+T2b6cst43LD2pnykNJSymP/szJJ7rrYY8I= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 4af4c2d7e7d..47a859d715d 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -24,9 +24,9 @@ require ( github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260908164107-3de1349d970b github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260908155618-50f521d70e62 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260908155618-50f521d70e62 - github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d + github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049 github.com/smartcontractkit/chainlink-deployments-framework v0.122.2 - github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab + github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744 github.com/smartcontractkit/chainlink-testing-framework/framework v0.16.8 github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.5 github.com/smartcontractkit/chainlink-testing-framework/seth v1.51.5 @@ -481,12 +481,11 @@ require ( github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260908155618-50f521d70e62 // indirect github.com/smartcontractkit/chainlink-ccv v0.12.0 // indirect github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d // indirect - github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72 // indirect + github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92 // indirect github.com/smartcontractkit/chainlink-data-streams v1.1.1 // indirect github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501 // indirect github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260713161920-de075095648b // indirect github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 // indirect - github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb // indirect github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20260723212800-b2f21d31b1d2 // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20260625152110-9afcf56e4053 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index b54e445e941..c6725a2ae14 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1632,26 +1632,24 @@ github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260908155618-50f5 github.com/smartcontractkit/chainlink-ccip/deployment v0.0.0-20260908155618-50f521d70e62/go.mod h1:Dm/Abz0vr7F2v9TygUX947q8HIwJEJikDfSdanX1Cic= github.com/smartcontractkit/chainlink-ccv v0.12.0 h1:/EbL7S96ItC3YF9pZ/fihbxugYxT1xxLSQSFJT4JQoQ= github.com/smartcontractkit/chainlink-ccv v0.12.0/go.mod h1:yijeTgli1K0e1noV/06/etKFxnYz8kBIe3IVXBaGnQw= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d h1:4heqJxOTXBHR3425SuXe9EzkZq+CqWOdKe4KWzAoGYA= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d/go.mod h1:ks0kniCCg8Siv2XflmwLOq5ib9Ifoh6VHXHwfEWIMQA= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049 h1:WebE9HTubitMC5xq+xCAArEI+oBLekVOoxYnCkB8whI= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049/go.mod h1:3CaCxSyZmgWl1PhxneFSZqOfN7DF2VnHML0bTfiDNIo= github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d h1:M9xuiIvdiHtim4nlxCVajyC/Mk63tAg9ESWb/biAhNA= github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d/go.mod h1:rI2njmTlyTvh+xhmORmK6qX3+V1ycDAqGJLu8LS8WpU= -github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72 h1:uWEwl7i2ryuRVoV4DmIKm6mqYevf1lH/8cQYhw/JXko= -github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72/go.mod h1:UYcRMb4dZcoaIPgZJ3hckCySTqtJc9K4Q+tOKErwTq0= +github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92 h1:Z1OIGukDhJD+Gknr5G07Vtml24E7BwKaIQoWzV/SdqA= +github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92/go.mod h1:Scyk7O80fde5rJF3Ty3fEE3xiS6j84eWbu8/2gl3pIY= github.com/smartcontractkit/chainlink-data-streams v1.1.1 h1:WcNIy7fy/HVnjHKOm21pLwD7aMa0H6IY8mB3aJHKU4c= github.com/smartcontractkit/chainlink-data-streams v1.1.1/go.mod h1:3mVEtx2PceMRauxmK6SJqJA7JB6XHeqCJLs370nYXgI= github.com/smartcontractkit/chainlink-deployments-framework v0.122.2 h1:UtkIAbqWYtbExgCBEhQCJMEZpSrcAgPnk8GvFOGXuxA= github.com/smartcontractkit/chainlink-deployments-framework v0.122.2/go.mod h1:1fA5FLbgZlpC3OvLD/Nr86rgb4ZRI6MK0QEVVOIP1+o= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab h1:NWZzKhUqh56rmOMWMz9urvBm6jKKktdW3GBGFcJjNJE= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab/go.mod h1:XionVLmbYKsgR7Xi6hoC4D4c/uxhhBvNny8qgA39D4M= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744 h1:n+V23NCROMeWFHUyR78Z4dXkUnPV3K8RzOzJpnXuXV0= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744/go.mod h1:dEk48o9w++AyLCv12fNKIJf4Ko6iywWWJAGrjfS0vR8= github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501 h1:QJiXTG9CmaQAuMRn5JGi+Jhji7fSkehVnKpjc8oNJJY= github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501/go.mod h1:4cT1BeNF8DAn6In9zr3LayVCv1KzFeuxT7zcuNkfIb0= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260713161920-de075095648b h1:UdsGoTutNrzqQ23xA49U19lucVR98agzXRVPUPUf7eU= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260713161920-de075095648b/go.mod h1:lvYHbYNhFR2rrtwZ8NYw6dokZrX6/u9eWWJmP0Jg0y8= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 h1:8u9xUrC+yHrTDexOKDd+jrA6LCzFFHeX1G82oj2fsSI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135/go.mod h1:NkvE4iQgiT7dMCP6U3xPELHhWhN5Xr6rHC0axRebyMU= -github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c h1:AYRSQarVw1EJXUrGvHSwmRTtNHHww/i3xwLat5CshUE= -github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c/go.mod h1:HcwehCao5k5C2NGuKJUVoX/AYtoH6njGFiV44dBOcY4= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb h1:HQN56hEteWOBagVDCxV2Fn++frjRI7dfnozEQUq/5ok= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb/go.mod h1:kGprqyjsz6qFNVszOQoHc24wfvCjyipNZFste/3zcbs= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20260723212800-b2f21d31b1d2 h1:N1Q6NHuH+T2b6cst43LD2pnykNJSymP/szJJ7rrYY8I= diff --git a/plugins/plugins.public.yaml b/plugins/plugins.public.yaml index 2cecd9c3231..a94fbf75544 100644 --- a/plugins/plugins.public.yaml +++ b/plugins/plugins.public.yaml @@ -58,7 +58,7 @@ plugins: evm: - moduleURI: "github.com/smartcontractkit/chainlink-evm" - gitRef: "v0.3.4-0.20260914143713-424babc506ab" + gitRef: "v0.3.4-0.20260917132551-2a2b38e8b744" installPath: "./pkg/cmd/chainlink-evm" capability-cron: diff --git a/system-tests/lib/go.mod b/system-tests/lib/go.mod index 51353b5d757..b6f69273881 100644 --- a/system-tests/lib/go.mod +++ b/system-tests/lib/go.mod @@ -37,11 +37,11 @@ require ( github.com/smartcontractkit/chain-selectors v1.0.109 github.com/smartcontractkit/chainlink-aptos v0.0.0-20260828090428-9828cc37ebc2 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260908155618-50f521d70e62 - github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d + github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049 github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d github.com/smartcontractkit/chainlink-confidential-compute v1.3.0 github.com/smartcontractkit/chainlink-deployments-framework v0.122.2 - github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab + github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260713161920-de075095648b github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20260804200254-c1accce563a8 github.com/smartcontractkit/chainlink-protos/job-distributor v0.20.1-0.20260701185448-696c075849ea @@ -496,11 +496,10 @@ require ( github.com/smartcontractkit/chainlink-ccip/chains/evm v0.0.0-20260908164107-3de1349d970b // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260908155618-50f521d70e62 // indirect github.com/smartcontractkit/chainlink-ccv v0.12.0 // indirect - github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72 // indirect + github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92 // indirect github.com/smartcontractkit/chainlink-data-streams v1.1.1 // indirect github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 // indirect - github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb // indirect github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20260723212800-b2f21d31b1d2 // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20260625152110-9afcf56e4053 // indirect diff --git a/system-tests/lib/go.sum b/system-tests/lib/go.sum index 6f7388990c7..94e7b105aed 100644 --- a/system-tests/lib/go.sum +++ b/system-tests/lib/go.sum @@ -1654,28 +1654,26 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260908155618-50f521d70e62/go.mod h1:c++Ed0jeYn4w8WIfiAboRwN6ClRRVGglL0qwB/QjJvM= github.com/smartcontractkit/chainlink-ccv v0.12.0 h1:/EbL7S96ItC3YF9pZ/fihbxugYxT1xxLSQSFJT4JQoQ= github.com/smartcontractkit/chainlink-ccv v0.12.0/go.mod h1:yijeTgli1K0e1noV/06/etKFxnYz8kBIe3IVXBaGnQw= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d h1:4heqJxOTXBHR3425SuXe9EzkZq+CqWOdKe4KWzAoGYA= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d/go.mod h1:ks0kniCCg8Siv2XflmwLOq5ib9Ifoh6VHXHwfEWIMQA= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049 h1:WebE9HTubitMC5xq+xCAArEI+oBLekVOoxYnCkB8whI= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049/go.mod h1:3CaCxSyZmgWl1PhxneFSZqOfN7DF2VnHML0bTfiDNIo= github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d h1:M9xuiIvdiHtim4nlxCVajyC/Mk63tAg9ESWb/biAhNA= github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d/go.mod h1:rI2njmTlyTvh+xhmORmK6qX3+V1ycDAqGJLu8LS8WpU= -github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72 h1:uWEwl7i2ryuRVoV4DmIKm6mqYevf1lH/8cQYhw/JXko= -github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72/go.mod h1:UYcRMb4dZcoaIPgZJ3hckCySTqtJc9K4Q+tOKErwTq0= +github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92 h1:Z1OIGukDhJD+Gknr5G07Vtml24E7BwKaIQoWzV/SdqA= +github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92/go.mod h1:Scyk7O80fde5rJF3Ty3fEE3xiS6j84eWbu8/2gl3pIY= github.com/smartcontractkit/chainlink-confidential-compute v1.3.0 h1:y64hOzM9H61E4EYRzQDtRwqunDBlKpsZc1SvFEUlSLE= github.com/smartcontractkit/chainlink-confidential-compute v1.3.0/go.mod h1:fq9n85XoREIUxgdXIX3RyDIRCRyxZKZ5NCBbFDfdySo= github.com/smartcontractkit/chainlink-data-streams v1.1.1 h1:WcNIy7fy/HVnjHKOm21pLwD7aMa0H6IY8mB3aJHKU4c= github.com/smartcontractkit/chainlink-data-streams v1.1.1/go.mod h1:3mVEtx2PceMRauxmK6SJqJA7JB6XHeqCJLs370nYXgI= github.com/smartcontractkit/chainlink-deployments-framework v0.122.2 h1:UtkIAbqWYtbExgCBEhQCJMEZpSrcAgPnk8GvFOGXuxA= github.com/smartcontractkit/chainlink-deployments-framework v0.122.2/go.mod h1:1fA5FLbgZlpC3OvLD/Nr86rgb4ZRI6MK0QEVVOIP1+o= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab h1:NWZzKhUqh56rmOMWMz9urvBm6jKKktdW3GBGFcJjNJE= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab/go.mod h1:XionVLmbYKsgR7Xi6hoC4D4c/uxhhBvNny8qgA39D4M= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744 h1:n+V23NCROMeWFHUyR78Z4dXkUnPV3K8RzOzJpnXuXV0= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744/go.mod h1:dEk48o9w++AyLCv12fNKIJf4Ko6iywWWJAGrjfS0vR8= github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501 h1:QJiXTG9CmaQAuMRn5JGi+Jhji7fSkehVnKpjc8oNJJY= github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501/go.mod h1:4cT1BeNF8DAn6In9zr3LayVCv1KzFeuxT7zcuNkfIb0= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260713161920-de075095648b h1:UdsGoTutNrzqQ23xA49U19lucVR98agzXRVPUPUf7eU= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260713161920-de075095648b/go.mod h1:lvYHbYNhFR2rrtwZ8NYw6dokZrX6/u9eWWJmP0Jg0y8= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135 h1:8u9xUrC+yHrTDexOKDd+jrA6LCzFFHeX1G82oj2fsSI= github.com/smartcontractkit/chainlink-feeds v0.1.2-0.20250227211209-7cd000095135/go.mod h1:NkvE4iQgiT7dMCP6U3xPELHhWhN5Xr6rHC0axRebyMU= -github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c h1:AYRSQarVw1EJXUrGvHSwmRTtNHHww/i3xwLat5CshUE= -github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c/go.mod h1:HcwehCao5k5C2NGuKJUVoX/AYtoH6njGFiV44dBOcY4= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb h1:HQN56hEteWOBagVDCxV2Fn++frjRI7dfnozEQUq/5ok= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb/go.mod h1:kGprqyjsz6qFNVszOQoHc24wfvCjyipNZFste/3zcbs= github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20260723212800-b2f21d31b1d2 h1:N1Q6NHuH+T2b6cst43LD2pnykNJSymP/szJJ7rrYY8I= diff --git a/system-tests/tests/go.mod b/system-tests/tests/go.mod index 8c9ea310b89..69c75a62923 100644 --- a/system-tests/tests/go.mod +++ b/system-tests/tests/go.mod @@ -64,13 +64,14 @@ require ( github.com/rs/zerolog v1.35.1 github.com/smartcontractkit/chain-selectors v1.0.109 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20260908155618-50f521d70e62 - github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d + github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049 github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d github.com/smartcontractkit/chainlink-confidential-compute v1.3.0 github.com/smartcontractkit/chainlink-confidential-compute/tests/testhelpers v0.0.0-20260812145307-d77342c53d7d github.com/smartcontractkit/chainlink-deployments-framework v0.122.2 github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501 github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260713161920-de075095648b + github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20260804200254-c1accce563a8 github.com/smartcontractkit/chainlink-protos/ring/go v0.0.0-20260904122233-4d79005babd9 github.com/smartcontractkit/chainlink-protos/workflows/go v0.0.0-20260821155228-fa1d775e2138 @@ -672,9 +673,8 @@ require ( github.com/smartcontractkit/ccip-owner-contracts v0.2.1 // indirect github.com/smartcontractkit/chainlink-aptos v0.0.0-20260828090428-9828cc37ebc2 github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20260908155618-50f521d70e62 // indirect - github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72 - github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab - github.com/smartcontractkit/chainlink-framework/capabilities v0.0.0-20260423135514-5b1a7565a99c // indirect + github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92 + github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20260724153515-bb6a2de39bcb // indirect github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20260723212800-b2f21d31b1d2 // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20260625152110-9afcf56e4053 // indirect diff --git a/system-tests/tests/go.sum b/system-tests/tests/go.sum index 685ee73483b..2544e69c3e1 100644 --- a/system-tests/tests/go.sum +++ b/system-tests/tests/go.sum @@ -1833,12 +1833,12 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260 github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings v0.0.0-20260908155618-50f521d70e62/go.mod h1:c++Ed0jeYn4w8WIfiAboRwN6ClRRVGglL0qwB/QjJvM= github.com/smartcontractkit/chainlink-ccv v0.12.0 h1:/EbL7S96ItC3YF9pZ/fihbxugYxT1xxLSQSFJT4JQoQ= github.com/smartcontractkit/chainlink-ccv v0.12.0/go.mod h1:yijeTgli1K0e1noV/06/etKFxnYz8kBIe3IVXBaGnQw= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d h1:4heqJxOTXBHR3425SuXe9EzkZq+CqWOdKe4KWzAoGYA= -github.com/smartcontractkit/chainlink-common v0.11.2-0.20260915135448-9ec0150ecb5d/go.mod h1:ks0kniCCg8Siv2XflmwLOq5ib9Ifoh6VHXHwfEWIMQA= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049 h1:WebE9HTubitMC5xq+xCAArEI+oBLekVOoxYnCkB8whI= +github.com/smartcontractkit/chainlink-common v0.11.2-0.20260917115705-1d3a14a9b049/go.mod h1:3CaCxSyZmgWl1PhxneFSZqOfN7DF2VnHML0bTfiDNIo= github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d h1:M9xuiIvdiHtim4nlxCVajyC/Mk63tAg9ESWb/biAhNA= github.com/smartcontractkit/chainlink-common/keystore v1.3.1-0.20260903141829-ef07b52a737d/go.mod h1:rI2njmTlyTvh+xhmORmK6qX3+V1ycDAqGJLu8LS8WpU= -github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72 h1:uWEwl7i2ryuRVoV4DmIKm6mqYevf1lH/8cQYhw/JXko= -github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260724142814-45996a1bcb72/go.mod h1:UYcRMb4dZcoaIPgZJ3hckCySTqtJc9K4Q+tOKErwTq0= +github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92 h1:Z1OIGukDhJD+Gknr5G07Vtml24E7BwKaIQoWzV/SdqA= +github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.11-0.20260915184316-2730f1867c92/go.mod h1:Scyk7O80fde5rJF3Ty3fEE3xiS6j84eWbu8/2gl3pIY= github.com/smartcontractkit/chainlink-confidential-compute v1.3.0 h1:y64hOzM9H61E4EYRzQDtRwqunDBlKpsZc1SvFEUlSLE= github.com/smartcontractkit/chainlink-confidential-compute v1.3.0/go.mod h1:fq9n85XoREIUxgdXIX3RyDIRCRyxZKZ5NCBbFDfdySo= github.com/smartcontractkit/chainlink-confidential-compute/tests/testhelpers v0.0.0-20260812145307-d77342c53d7d h1:CZ0Om7lANyhpFJcmZE8RwQpEP4PyvoNLhOJckjm+zao= @@ -1847,8 +1847,8 @@ github.com/smartcontractkit/chainlink-data-streams v1.1.1 h1:WcNIy7fy/HVnjHKOm21 github.com/smartcontractkit/chainlink-data-streams v1.1.1/go.mod h1:3mVEtx2PceMRauxmK6SJqJA7JB6XHeqCJLs370nYXgI= github.com/smartcontractkit/chainlink-deployments-framework v0.122.2 h1:UtkIAbqWYtbExgCBEhQCJMEZpSrcAgPnk8GvFOGXuxA= github.com/smartcontractkit/chainlink-deployments-framework v0.122.2/go.mod h1:1fA5FLbgZlpC3OvLD/Nr86rgb4ZRI6MK0QEVVOIP1+o= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab h1:NWZzKhUqh56rmOMWMz9urvBm6jKKktdW3GBGFcJjNJE= -github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260914143713-424babc506ab/go.mod h1:XionVLmbYKsgR7Xi6hoC4D4c/uxhhBvNny8qgA39D4M= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744 h1:n+V23NCROMeWFHUyR78Z4dXkUnPV3K8RzOzJpnXuXV0= +github.com/smartcontractkit/chainlink-evm v0.3.4-0.20260917132551-2a2b38e8b744/go.mod h1:dEk48o9w++AyLCv12fNKIJf4Ko6iywWWJAGrjfS0vR8= github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501 h1:QJiXTG9CmaQAuMRn5JGi+Jhji7fSkehVnKpjc8oNJJY= github.com/smartcontractkit/chainlink-evm/contracts/cre/gobindings v0.0.0-20260403151002-2c91155b5501/go.mod h1:4cT1BeNF8DAn6In9zr3LayVCv1KzFeuxT7zcuNkfIb0= github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20260713161920-de075095648b h1:UdsGoTutNrzqQ23xA49U19lucVR98agzXRVPUPUf7eU= diff --git a/system-tests/tests/smoke/cre/por_helpers.go b/system-tests/tests/smoke/cre/por_helpers.go index 5da677e9cc3..378fa96f44f 100644 --- a/system-tests/tests/smoke/cre/por_helpers.go +++ b/system-tests/tests/smoke/cre/por_helpers.go @@ -4,6 +4,7 @@ import ( "fmt" "math/big" "slices" + "strconv" "strings" "testing" "time" @@ -16,25 +17,21 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/sync/errgroup" + chainselectors "github.com/smartcontractkit/chain-selectors" + cldchangeset "github.com/smartcontractkit/cld-changesets/pkg/cldfutil/changeset" + cldf_tron "github.com/smartcontractkit/chainlink-deployments-framework/chain/tron" "github.com/smartcontractkit/chainlink-deployments-framework/datastore" "github.com/smartcontractkit/chainlink-evm/gethwrappers/data-feeds/generated/data_feeds_cache" + "github.com/smartcontractkit/chainlink-framework/capabilities/writetarget" "github.com/smartcontractkit/chainlink-testing-framework/framework" "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" - + portypes "github.com/smartcontractkit/chainlink/core/scripts/cre/environment/examples/workflows/proof-of-reserve/cron-based/types" + df_changeset "github.com/smartcontractkit/chainlink/deployment/data-feeds/changeset" tron_df_changeset "github.com/smartcontractkit/chainlink/deployment/data-feeds/changeset/tron" df_changeset_types "github.com/smartcontractkit/chainlink/deployment/data-feeds/changeset/types" - - cldchangeset "github.com/smartcontractkit/cld-changesets/pkg/cldfutil/changeset" - - df_changeset "github.com/smartcontractkit/chainlink/deployment/data-feeds/changeset" keystone_changeset "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" tron_keystone_changeset "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/tron" - - corevm "github.com/smartcontractkit/chainlink-evm/pkg/relay" - - portypes "github.com/smartcontractkit/chainlink/core/scripts/cre/environment/examples/workflows/proof-of-reserve/cron-based/types" - "github.com/smartcontractkit/chainlink/system-tests/lib/cre" crecontracts "github.com/smartcontractkit/chainlink/system-tests/lib/cre/contracts" "github.com/smartcontractkit/chainlink/system-tests/lib/cre/environment/blockchains" @@ -77,6 +74,20 @@ func BeforePoRTest(t *testing.T, testEnv *ttypes.TestEnvironment, workflowName, return priceProvider, porWfCfg } +func GenerateWriteTargetName(t *testing.T, chainID uint64) string { + chainName, err := chainselectors.NameFromChainId(chainID) + if err != nil { + t.Fatalf("could not resolve chain ID %d", chainID) + } + + wtID, err := writetarget.NewWriteTargetID("", chainName, strconv.FormatUint(chainID, 10), "1.0.0") + if err != nil { + t.Fatalf("could not generate write target id: %s", err) + } + + return wtID +} + // ExecutePoRTest deploys DataFeedsCache + ReadBalances contracts on all writable chains, // registers a workflow per chain, and validates that each feed is updated with the // expected prices from priceProvider. @@ -153,7 +164,7 @@ func ExecutePoRTest(t *testing.T, testEnv *ttypes.TestEnvironment, priceProvider require.NoError(t, addrErr, "failed to create and fund addresses to read") testLogger.Info().Msg("Creating PoR workflow configuration file...") - writeTargetName := corevm.GenerateWriteTargetName(chainID) + writeTargetName := GenerateWriteTargetName(t, chainID) testLogger.Info().Msgf("Generated WriteTargetName for chain %d (%s): %s", chainID, chainFamily, writeTargetName) workflowConfig := portypes.WorkflowConfig{ @@ -239,7 +250,7 @@ func SetupPoRWorkflowForSoak(t *testing.T, testEnv *ttypes.TestEnvironment, pric addressesToRead, addrErr := t_helpers.CreateAndFundAddressesEVM(t, testLogger, numberOfAddressesToCreate, amountToFund, bcOutput) require.NoError(t, addrErr, "failed to create and fund addresses for soak workflow %s", wfConfig.WorkflowName) - writeTargetName := corevm.GenerateWriteTargetName(chainID) + writeTargetName := GenerateWriteTargetName(t, chainID) testLogger.Info().Msgf("SetupPoRWorkflowForSoak: chain=%d writeTarget=%s cache=%s feedID=%s cron=%q", chainID, writeTargetName, dataFeedsCacheAddress.Hex(), feedID, wfConfig.CronSchedule)