diff --git a/.dockerignore b/.dockerignore index 8d6556b2075..91f01a2637c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -33,4 +33,4 @@ credentials.env gcr_creds.env go.work -go.work.sum \ No newline at end of file +go.work.sum diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 63f9949e821..1500ac9ab38 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -200,6 +200,43 @@ jobs: AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} dep_evm_sha: ${{ inputs.evm-ref }} + # TODO: Use the docker image built in the previous step + ctf-v2-test: + runs-on: ubuntu-latest + env: + CTF_IGNORE_CRITICAL_LOGS: true + CTF_CONFIGS: environment.toml + CTF_LOG_LEVEL: info + CTF_LOKI_STREAM: "false" + PRIVATE_KEY: ${{ secrets.CTF_SIMULATED_KEY_1 }} + steps: + - name: Check out code + uses: actions/checkout@v4 + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: 1.22.8 + - name: Cache Go modules + uses: actions/cache@v4 + with: + path: | + ~/.cache/go-build + ~/go/pkg/mod + key: go-modules-${{ hashFiles('**/go.sum') }}-${{ runner.os }} + restore-keys: | + go-modules-${{ hashFiles('**/go.sum') }}-${{ runner.os }} + - name: Install dependencies + run: go mod download + - name: Run tests + working-directory: integration-tests/capabilities + run: go test -v -timeout 15m -run TestWorkflow + - name: Upload logs directory + if: always() + uses: actions/upload-artifact@v4 + with: + name: container-logs + path: integration-tests/capabilities/logs + run-core-e2e-tests-for-pr: name: Run Core E2E Tests For PR permissions: @@ -737,4 +774,3 @@ jobs: name: cl_node_coverage_data_solana_tests path: .covdata retention-days: 1 - diff --git a/go.md b/go.md index 9f51ecd4c81..cdf92c064dc 100644 --- a/go.md +++ b/go.md @@ -122,6 +122,8 @@ flowchart LR click chainlink-solana href "https://github.com/smartcontractkit/chainlink-solana" chainlink-starknet/relayer --> chainlink-common click chainlink-starknet/relayer href "https://github.com/smartcontractkit/chainlink-starknet" + chainlink-testing-framework/framework + click chainlink-testing-framework/framework href "https://github.com/smartcontractkit/chainlink-testing-framework" chainlink-testing-framework/havoc --> chainlink-testing-framework/lib/grafana click chainlink-testing-framework/havoc href "https://github.com/smartcontractkit/chainlink-testing-framework" chainlink-testing-framework/lib --> chainlink-testing-framework/seth @@ -140,6 +142,7 @@ flowchart LR chainlink/deployment --> chainlink-testing-framework/lib chainlink/deployment --> chainlink/v2 click chainlink/deployment href "https://github.com/smartcontractkit/chainlink" + chainlink/integration-tests --> chainlink-testing-framework/framework chainlink/integration-tests --> chainlink-testing-framework/havoc chainlink/integration-tests --> chainlink/deployment click chainlink/integration-tests href "https://github.com/smartcontractkit/chainlink" @@ -185,6 +188,7 @@ flowchart LR click chainlink-protos-repo href "https://github.com/smartcontractkit/chainlink-protos" subgraph chainlink-testing-framework-repo[chainlink-testing-framework] + chainlink-testing-framework/framework chainlink-testing-framework/havoc chainlink-testing-framework/lib chainlink-testing-framework/lib/grafana diff --git a/integration-tests/.gitignore b/integration-tests/.gitignore new file mode 100644 index 00000000000..68edba4a6de --- /dev/null +++ b/integration-tests/.gitignore @@ -0,0 +1,7 @@ +# CTFv2 - Observability stack +**/compose +**/compose/* +**/*cache.toml + +# CTFv2 - Blockscout +**/blockscout diff --git a/integration-tests/capabilities/components/evmcontracts/capabilities_registry/capabilities_registry.go b/integration-tests/capabilities/components/evmcontracts/capabilities_registry/capabilities_registry.go new file mode 100644 index 00000000000..24962dfb7c6 --- /dev/null +++ b/integration-tests/capabilities/components/evmcontracts/capabilities_registry/capabilities_registry.go @@ -0,0 +1,70 @@ +package capabilities_registry + +import ( + "context" + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/smartcontractkit/chainlink-testing-framework/seth" + cr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" +) + +type CapabilitiesRegistryInstance struct { + Address common.Address + Contract *cr.CapabilitiesRegistry + sc *seth.Client + ExistingHashedCapabilitiesIDs [][32]byte +} + +func Deploy(sc *seth.Client) (*CapabilitiesRegistryInstance, error) { + capabilitiesRegistryAddress, tx, capabilitiesRegistryContract, err := cr.DeployCapabilitiesRegistry( + sc.NewTXOpts(), + sc.Client, + ) + if err != nil { + return nil, err + } + + _, err = bind.WaitMined(context.Background(), sc.Client, tx) + if err != nil { + return nil, err + } + + fmt.Printf("🚀 Deployed \033[1mcapabilities_registry\033[0m contract at \033[1m%s\033[0m\n", capabilitiesRegistryAddress) + return &CapabilitiesRegistryInstance{ + sc: sc, + Address: capabilitiesRegistryAddress, + Contract: capabilitiesRegistryContract, + }, nil +} + +func (cr *CapabilitiesRegistryInstance) AddCapabilities(capabilities []cr.CapabilitiesRegistryCapability) error { + tx, err := cr.Contract.AddCapabilities( + cr.sc.NewTXOpts(), + capabilities, + ) + if err != nil { + return err + } + + _, err = bind.WaitMined(context.Background(), cr.sc.Client, tx) + if err != nil { + return err + } + + for _, capability := range capabilities { + hashedCapabilityID, err := cr.Contract.GetHashedCapabilityId( + cr.sc.NewCallOpts(), + capability.LabelledName, + capability.Version, + ) + if err != nil { + return err + } + cr.ExistingHashedCapabilitiesIDs = append(cr.ExistingHashedCapabilitiesIDs, hashedCapabilityID) + } + + return nil +} diff --git a/integration-tests/capabilities/components/evmcontracts/forwarder/forwarder.go b/integration-tests/capabilities/components/evmcontracts/forwarder/forwarder.go new file mode 100644 index 00000000000..c6284ab95e8 --- /dev/null +++ b/integration-tests/capabilities/components/evmcontracts/forwarder/forwarder.go @@ -0,0 +1,67 @@ +package forwarder + +import ( + "context" + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + + "github.com/smartcontractkit/chainlink-testing-framework/seth" + + forwarder_wrapper "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder" +) + +type ForwarderInstance struct { + Address common.Address + Contract *forwarder_wrapper.KeystoneForwarder + sc *seth.Client + ExistingHashedCapabilitiesIDs [][32]byte +} + +func Deploy(sc *seth.Client) (*ForwarderInstance, error) { + forwarderAddress, tx, forwarderContract, err := forwarder_wrapper.DeployKeystoneForwarder( + sc.NewTXOpts(), + sc.Client, + ) + if err != nil { + return nil, err + } + + _, err = bind.WaitMined(context.Background(), sc.Client, tx) + if err != nil { + return nil, err + } + + fmt.Printf("🚀 Deployed \033[1mforwarder\033[0m contract at \033[1m%s\033[0m\n", forwarderAddress) + return &ForwarderInstance{ + sc: sc, + Address: forwarderAddress, + Contract: forwarderContract, + }, nil +} + +func (i *ForwarderInstance) SetConfig( + donID uint32, + configVersion uint32, + f uint8, + signers []common.Address, +) error { + tx, err := i.Contract.SetConfig( + i.sc.NewTXOpts(), + donID, + configVersion, + f, + signers, + ) + if err != nil { + return err + } + + _, err = bind.WaitMined(context.Background(), i.sc.Client, tx) + if err != nil { + return err + } + + return nil +} diff --git a/integration-tests/capabilities/components/onchain/fund.go b/integration-tests/capabilities/components/onchain/fund.go new file mode 100644 index 00000000000..adcaf1eb1bf --- /dev/null +++ b/integration-tests/capabilities/components/onchain/fund.go @@ -0,0 +1,80 @@ +package onchain + +import ( + "context" + "crypto/ecdsa" + "errors" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/smartcontractkit/chainlink-testing-framework/framework" + "github.com/smartcontractkit/chainlink-testing-framework/framework/clclient" + "github.com/smartcontractkit/chainlink-testing-framework/seth" +) + +func SendETH(client *ethclient.Client, privateKeyHex string, toAddress string, amount *big.Float) error { + privateKey, err := crypto.HexToECDSA(privateKeyHex) + if err != nil { + return fmt.Errorf("failed to parse private key: %w", err) + } + wei := new(big.Int) + amountWei := new(big.Float).Mul(amount, big.NewFloat(1e18)) + amountWei.Int(wei) + + publicKey := privateKey.Public() + publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey) + if !ok { + return fmt.Errorf("error casting public key to ECDSA") + } + fromAddress := crypto.PubkeyToAddress(*publicKeyECDSA) + + nonce, err := client.PendingNonceAt(context.Background(), fromAddress) + if err != nil { + return fmt.Errorf("failed to fetch nonce: %w", err) + } + + gasPrice, err := client.SuggestGasPrice(context.Background()) + if err != nil { + return fmt.Errorf("failed to fetch gas price: %w", err) + } + gasLimit := uint64(21000) // Standard gas limit for ETH transfer + + tx := types.NewTransaction(nonce, common.HexToAddress(toAddress), wei, gasLimit, gasPrice, nil) + + chainID, err := client.NetworkID(context.Background()) + if err != nil { + return fmt.Errorf("failed to fetch chain ID: %w", err) + } + signedTx, err := types.SignTx(tx, types.NewEIP155Signer(chainID), privateKey) + if err != nil { + return fmt.Errorf("failed to sign transaction: %w", err) + } + + err = client.SendTransaction(context.Background(), signedTx) + if err != nil { + return fmt.Errorf("failed to send transaction: %w", err) + } + framework.L.Info().Msgf("Transaction sent: %s", signedTx.Hash().Hex()) + return nil +} + +func FundNodes(sc *seth.Client, nodes []*clclient.ChainlinkClient, pkey string, ethAmount float64) error { + if ethAmount == 0 { + return errors.New("funds_eth is 0, set some value in config, ex.: funds_eth = 30.0") + } + for _, cl := range nodes { + ek, err := cl.ReadPrimaryETHKey() + if err != nil { + return err + } + if err := SendETH(sc.Client, pkey, ek.Attributes.Address, big.NewFloat(ethAmount)); err != nil { + return fmt.Errorf("failed to fund CL node %s: %w", ek.Attributes.Address, err) + } + } + return nil +} diff --git a/integration-tests/capabilities/environment.toml b/integration-tests/capabilities/environment.toml new file mode 100644 index 00000000000..bf84816d940 --- /dev/null +++ b/integration-tests/capabilities/environment.toml @@ -0,0 +1,105 @@ + +[blockchain_a] + type = "anvil" + docker_cmd_params = ["-b", "5"] + +[nodeset] + nodes = 5 + override_mode = "each" + +[nodeset.db] + image = "postgres:15.6" + + [[nodeset.node_specs]] + + [nodeset.node_specs.node] + docker_ctx = "../.." + docker_file = "plugins/chainlink.Dockerfile" + user_config_overrides = """ + [Feature] + LogPoller = true + + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:6690'] + """ + + [[nodeset.node_specs]] + + [nodeset.node_specs.node] + capabilities = ["./streams-linux-amd64"] + docker_ctx = "../.." + docker_file = "plugins/chainlink.Dockerfile" + user_config_overrides = """ + [Feature] + LogPoller = true + + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:6690'] + """ + + [[nodeset.node_specs]] + + [nodeset.node_specs.node] + capabilities = ["./streams-linux-amd64"] + docker_ctx = "../.." + docker_file = "plugins/chainlink.Dockerfile" + user_config_overrides = """ + [Feature] + LogPoller = true + + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:6690'] + """ + + [[nodeset.node_specs]] + + [nodeset.node_specs.node] + capabilities = ["./streams-linux-amd64"] + docker_ctx = "../.." + docker_file = "plugins/chainlink.Dockerfile" + user_config_overrides = """ + [Feature] + LogPoller = true + + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:6690'] + """ + + [[nodeset.node_specs]] + + [nodeset.node_specs.node] + capabilities = ["./streams-linux-amd64"] + docker_ctx = "../.." + docker_file = "plugins/chainlink.Dockerfile" + user_config_overrides = """ + [Feature] + LogPoller = true + + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:6690'] + """ diff --git a/integration-tests/capabilities/streams-linux-amd64 b/integration-tests/capabilities/streams-linux-amd64 new file mode 100755 index 00000000000..1f311c023c5 Binary files /dev/null and b/integration-tests/capabilities/streams-linux-amd64 differ diff --git a/integration-tests/capabilities/workflow_test.go b/integration-tests/capabilities/workflow_test.go new file mode 100644 index 00000000000..17fb5b2e168 --- /dev/null +++ b/integration-tests/capabilities/workflow_test.go @@ -0,0 +1,650 @@ +package capabilities_test + +import ( + "bytes" + "cmp" + "context" + "encoding/binary" + "encoding/hex" + "errors" + "fmt" + "math" + "os" + "slices" + "strings" + "sync" + "testing" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/libocr/offchainreporting2/confighelper" + "github.com/smartcontractkit/libocr/offchainreporting2/types" + "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3confighelper" + ragetypes "github.com/smartcontractkit/libocr/ragep2p/types" + + "github.com/smartcontractkit/chainlink-testing-framework/framework" + "github.com/smartcontractkit/chainlink-testing-framework/framework/clclient" + "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" + ns "github.com/smartcontractkit/chainlink-testing-framework/framework/components/simple_node_set" + "github.com/smartcontractkit/chainlink-testing-framework/seth" + + "github.com/smartcontractkit/chainlink/integration-tests/capabilities/components/evmcontracts/capabilities_registry" + "github.com/smartcontractkit/chainlink/integration-tests/capabilities/components/evmcontracts/forwarder" + "github.com/smartcontractkit/chainlink/integration-tests/capabilities/components/onchain" + + cr_wrapper "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" + feeds_consumer "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/feeds_consumer" + ocr3_capability "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability" +) + +// Copying this to avoid dependency on the core repo +func GetChainType(chainType string) (uint8, error) { + switch chainType { + case "evm": + return 1, nil + // case Solana: + // return 2, nil + // case Cosmos: + // return 3, nil + // case StarkNet: + // return 4, nil + // case Aptos: + // return 5, nil + default: + return 0, fmt.Errorf("unexpected chaintype.ChainType: %#v", chainType) + } +} + +// Copying this to avoid dependency on the core repo +func MarshalMultichainPublicKey(ost map[string]types.OnchainPublicKey) (types.OnchainPublicKey, error) { + pubKeys := make([][]byte, 0, len(ost)) + for k, pubKey := range ost { + typ, err := GetChainType(k) + if err != nil { + // skipping unknown key type + continue + } + buf := new(bytes.Buffer) + if err = binary.Write(buf, binary.LittleEndian, typ); err != nil { + return nil, err + } + length := len(pubKey) + if length < 0 || length > math.MaxUint16 { + return nil, errors.New("pubKey doesn't fit into uint16") + } + if err = binary.Write(buf, binary.LittleEndian, uint16(length)); err != nil { + return nil, err + } + _, _ = buf.Write(pubKey) + pubKeys = append(pubKeys, buf.Bytes()) + } + // sort keys based on encoded type to make encoding deterministic + slices.SortFunc(pubKeys, func(a, b []byte) int { return cmp.Compare(a[0], b[0]) }) + return bytes.Join(pubKeys, nil), nil +} + +type WorkflowTestConfig struct { + BlockchainA *blockchain.Input `toml:"blockchain_a" validate:"required"` + NodeSet *ns.Input `toml:"nodeset" validate:"required"` +} + +type OCR3Config struct { + Signers [][]byte + Transmitters []common.Address + F uint8 + OnchainConfig []byte + OffchainConfigVersion uint64 + OffchainConfig []byte +} + +type NodeInfo struct { + OcrKeyBundleID string + TransmitterAddress string + PeerID string + Signer common.Address + OffchainPublicKey [32]byte + OnchainPublicKey types.OnchainPublicKey + ConfigEncryptionPublicKey [32]byte +} + +func extractKey(value string) string { + parts := strings.Split(value, "_") + if len(parts) > 1 { + return parts[len(parts)-1] + } + return value +} + +func getNodesInfo( + t *testing.T, + nodes []*clclient.ChainlinkClient, +) (nodesInfo []NodeInfo) { + nodesInfo = make([]NodeInfo, len(nodes)) + + for i, node := range nodes { + // OCR Keys + ocr2Keys, err := node.MustReadOCR2Keys() + require.NoError(t, err) + nodesInfo[i].OcrKeyBundleID = ocr2Keys.Data[0].ID + + firstOCR2Key := ocr2Keys.Data[0].Attributes + nodesInfo[i].Signer = common.HexToAddress(extractKey(firstOCR2Key.OnChainPublicKey)) + + pubKeys := make(map[string]types.OnchainPublicKey) + ethOnchainPubKey, err := hex.DecodeString(extractKey(firstOCR2Key.OnChainPublicKey)) + require.NoError(t, err) + pubKeys["evm"] = ethOnchainPubKey + + multichainPubKey, err := MarshalMultichainPublicKey(pubKeys) + require.NoError(t, err) + nodesInfo[i].OnchainPublicKey = multichainPubKey + + offchainPublicKeyBytes, err := hex.DecodeString(extractKey(firstOCR2Key.OffChainPublicKey)) + require.NoError(t, err) + var offchainPublicKey [32]byte + copy(offchainPublicKey[:], offchainPublicKeyBytes) + nodesInfo[i].OffchainPublicKey = offchainPublicKey + + sharedSecretEncryptionPublicKeyBytes, err := hex.DecodeString(extractKey(firstOCR2Key.ConfigPublicKey)) + require.NoError(t, err) + var sharedSecretEncryptionPublicKey [32]byte + copy(sharedSecretEncryptionPublicKey[:], sharedSecretEncryptionPublicKeyBytes) + nodesInfo[i].ConfigEncryptionPublicKey = sharedSecretEncryptionPublicKey + + // ETH Keys + ethKeys, err := node.MustReadETHKeys() + require.NoError(t, err) + nodesInfo[i].TransmitterAddress = ethKeys.Data[0].Attributes.Address + + // P2P Keys + p2pKeys, err := node.MustReadP2PKeys() + require.NoError(t, err) + nodesInfo[i].PeerID = p2pKeys.Data[0].Attributes.PeerID + } + + return nodesInfo +} + +func generateOCR3Config( + t *testing.T, + nodesInfo []NodeInfo, +) (config *OCR3Config) { + oracleIdentities := []confighelper.OracleIdentityExtra{} + transmissionSchedule := []int{} + + for _, nodeInfo := range nodesInfo { + transmissionSchedule = append(transmissionSchedule, 1) + oracleIdentity := confighelper.OracleIdentityExtra{} + oracleIdentity.OffchainPublicKey = nodeInfo.OffchainPublicKey + oracleIdentity.OnchainPublicKey = nodeInfo.OnchainPublicKey + oracleIdentity.ConfigEncryptionPublicKey = nodeInfo.ConfigEncryptionPublicKey + oracleIdentity.PeerID = nodeInfo.PeerID + oracleIdentity.TransmitAccount = types.Account(nodeInfo.TransmitterAddress) + oracleIdentities = append(oracleIdentities, oracleIdentity) + } + + maxDurationInitialization := 10 * time.Second + + // Generate OCR3 configuration arguments for testing + signers, transmitters, f, onchainConfig, offchainConfigVersion, offchainConfig, err := ocr3confighelper.ContractSetConfigArgsForTests( + 20*time.Second, // DeltaProgress: Time between rounds + 10*time.Second, // DeltaResend: Time between resending unconfirmed transmissions + 1*time.Second, // DeltaInitial: Initial delay before starting the first round + 5*time.Second, // DeltaRound: Time between rounds within an epoch + 1*time.Second, // DeltaGrace: Grace period for delayed transmissions + 5*time.Second, // DeltaCertifiedCommitRequest: Time between certified commit requests + 10*time.Second, // DeltaStage: Time between stages of the protocol + uint64(10), // MaxRoundsPerEpoch: Maximum number of rounds per epoch + transmissionSchedule, // TransmissionSchedule: Transmission schedule + oracleIdentities, // Oracle identities with their public keys + nil, // Plugin config (empty for now) + &maxDurationInitialization, // MaxDurationInitialization: ??? + 5*time.Second, // MaxDurationQuery: Maximum duration for querying + 5*time.Second, // MaxDurationObservation: Maximum duration for observation + 5*time.Second, // MaxDurationAccept: Maximum duration for acceptance + 5*time.Second, // MaxDurationTransmit: Maximum duration for transmission + 1, // F: Maximum number of faulty oracles + nil, // OnChain config (empty for now) + ) + require.NoError(t, err) + + signerAddresses := [][]byte{} + for _, signer := range signers { + signerAddresses = append(signerAddresses, signer) + } + + transmitterAddresses := []common.Address{} + for _, transmitter := range transmitters { + transmitterAddresses = append(transmitterAddresses, common.HexToAddress(string(transmitter))) + } + + return &OCR3Config{ + Signers: signerAddresses, + Transmitters: transmitterAddresses, + F: f, + OnchainConfig: onchainConfig, + OffchainConfigVersion: offchainConfigVersion, + OffchainConfig: offchainConfig, + } +} + +func TestWorkflow(t *testing.T) { + workflowOwner := "0x00000000000000000000000000000000000000aa" + workflowName := "ccipethsep" + feedID := "0x0003fbba4fce42f65d6032b18aee53efdf526cc734ad296cb57565979d883bdd" + + t.Run("Keystoen workflow test", func(t *testing.T) { + in, err := framework.Load[WorkflowTestConfig](t) + require.NoError(t, err) + pkey := os.Getenv("PRIVATE_KEY") + + bc, err := blockchain.NewBlockchainNetwork(in.BlockchainA) + require.NoError(t, err) + + sc, err := seth.NewClientBuilder(). + WithRpcUrl(bc.Nodes[0].HostWSUrl). + WithPrivateKeys([]string{pkey}). + Build() + require.NoError(t, err) + + capabilitiesRegistryInstance, err := capabilities_registry.Deploy(sc) + require.NoError(t, err) + + require.NoError(t, capabilitiesRegistryInstance.AddCapabilities( + []cr_wrapper.CapabilitiesRegistryCapability{ + { + LabelledName: "mock-streams-trigger", + Version: "1.0.0", + CapabilityType: 0, // TRIGGER + ResponseType: 0, // REPORT + }, + { + LabelledName: "offchain_reporting", + Version: "1.0.0", + CapabilityType: 2, // CONSENSUS + ResponseType: 0, // REPORT + }, + { + LabelledName: "write_geth-testnet", + Version: "1.0.0", + CapabilityType: 3, // TARGET + ResponseType: 1, // OBSERVATION_IDENTICAL + }, + }, + )) + + forwarderInstance, err := forwarder.Deploy(sc) + require.NoError(t, err) + + // TODO: When the capabilities registry address is provided: + // - NOPs and nodes are added to the registry. + // - Nodes are configured to listen to the registry for updates. + nodeset, err := ns.NewSharedDBNodeSet(in.NodeSet, bc) + require.NoError(t, err) + + nodeClients, err := clclient.New(nodeset.CLNodes) + require.NoError(t, err) + + err = onchain.FundNodes(sc, nodeClients, pkey, 5) + require.NoError(t, err) + + nodesInfo := getNodesInfo(t, nodeClients) + + bootstrapNodeInfo := nodesInfo[0] + workflowNodesetInfo := nodesInfo[1:] + + for i := range workflowNodesetInfo { + in.NodeSet.NodeSpecs[i].Node.TestConfigOverrides = fmt.Sprintf(` + [Feature] + LogPoller = true + + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:6690'] + + # This is needed for the target capability to be initialized + [[EVM]] + ChainID = '%s' + + [[EVM.Nodes]] + Name = 'anvil' + WSURL = '%s' + HTTPURL = '%s' + + [EVM.Workflow] + FromAddress = '%s' + ForwarderAddress = '%s' + GasLimitDefault = 400_000 + + # This is needed for external registry + [Capabilities.ExternalRegistry] + Address = '%s' + NetworkID = 'evm' + ChainID = '%s' + `, + bc.ChainID, + bc.Nodes[0].DockerInternalWSUrl, + bc.Nodes[0].DockerInternalHTTPUrl, + nodesInfo[i].TransmitterAddress, + forwarderInstance.Address, + capabilitiesRegistryInstance.Address, + bc.ChainID, + ) + } + + nodeset, err = ns.UpgradeNodeSet(in.NodeSet, bc, 5*time.Second) + require.NoError(t, err) + nodeClients, err = clclient.New(nodeset.CLNodes) + require.NoError(t, err) + + ocr3CapabilityAddress, tx, ocr3CapabilityContract, err := ocr3_capability.DeployOCR3Capability( + sc.NewTXOpts(), + sc.Client, + ) + require.NoError(t, err) + _, err = bind.WaitMined(context.Background(), sc.Client, tx) + require.NoError(t, err) + fmt.Println("Deployed ocr3_capability contract at", ocr3CapabilityAddress.Hex()) + + feedsConsumerAddress, tx, feedsConsumerContract, err := feeds_consumer.DeployKeystoneFeedsConsumer( + sc.NewTXOpts(), + sc.Client, + ) + require.NoError(t, err) + _, err = bind.WaitMined(context.Background(), sc.Client, tx) + require.NoError(t, err) + fmt.Println("Deployed feeds_consumer contract at", feedsConsumerAddress.Hex()) + + var workflowNameBytes [10]byte + copy(workflowNameBytes[:], []byte(workflowName)) + + tx, err = feedsConsumerContract.SetConfig( + sc.NewTXOpts(), + []common.Address{forwarderInstance.Address}, + []common.Address{common.HexToAddress(workflowOwner)}, + [][10]byte{workflowNameBytes}, + ) + require.NoError(t, err) + _, err = bind.WaitMined(context.Background(), sc.Client, tx) + require.NoError(t, err) + + // Add bootstrap spec to the first node + bootstrapNode := nodeClients[0] + + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + bootstrapJobSpec := fmt.Sprintf(` + type = "bootstrap" + schemaVersion = 1 + name = "Botostrap" + contractID = "%s" + contractConfigTrackerPollInterval = "1s" + contractConfigConfirmations = 1 + relay = "evm" + + [relayConfig] + chainID = %s + providerType = "ocr3-capability" + `, ocr3CapabilityAddress, bc.ChainID) + r, _, err2 := bootstrapNode.CreateJobRaw(bootstrapJobSpec) + assert.NoError(t, err2) + assert.Empty(t, r.Errors) + }() + + for i, nodeClient := range nodeClients { + // First node is a bootstrap node, so we skip it + if i == 0 { + continue + } + + wg.Add(1) + go func() { + defer wg.Done() + + scJobSpec := ` + type = "standardcapabilities" + schemaVersion = 1 + name = "streams-capabilities" + command="/home/capabilities/streams-linux-amd64" + ` + response, _, err2 := nodeClient.CreateJobRaw(scJobSpec) + assert.NoError(t, err2) + assert.Empty(t, response.Errors) + + consensusJobSpec := fmt.Sprintf(` + type = "offchainreporting2" + schemaVersion = 1 + name = "Keystone OCR3 Consensus Capability" + contractID = "%s" + ocrKeyBundleID = "%s" + p2pv2Bootstrappers = [ + "%s@%s", + ] + relay = "evm" + pluginType = "plugin" + transmitterID = "%s" + + [relayConfig] + chainID = "%s" + + [pluginConfig] + command = "/usr/local/bin/chainlink-ocr3-capability" + ocrVersion = 3 + pluginName = "ocr-capability" + providerType = "ocr3-capability" + telemetryType = "plugin" + + [onchainSigningStrategy] + strategyName = 'multi-chain' + [onchainSigningStrategy.config] + evm = "%s" + `, + ocr3CapabilityAddress, + nodesInfo[i].OcrKeyBundleID, + bootstrapNodeInfo.PeerID, + strings.TrimPrefix(nodeset.CLNodes[0].Node.DockerP2PUrl, "http://"), + nodesInfo[i].TransmitterAddress, + bc.ChainID, + nodesInfo[i].OcrKeyBundleID, + ) + fmt.Println("consensusJobSpec", consensusJobSpec) + response, _, err2 = nodeClient.CreateJobRaw(consensusJobSpec) + assert.NoError(t, err2) + assert.Empty(t, response.Errors) + + workflowSpec := fmt.Sprintf(` +type = "workflow" +schemaVersion = 1 +name = "Keystone CCIP Feeds Workflow" +forwardingAllowed = false +workflow = """ +name: %s +owner: '%s' +triggers: + - id: mock-streams-trigger@1.0.0 + config: + maxFrequencyMs: 15000 + feedIds: + - '%s' +consensus: + - id: offchain_reporting@1.0.0 + ref: ccip_feeds + inputs: + observations: + - $(trigger.outputs) + config: + report_id: '0001' + key_id: evm + aggregation_method: data_feeds + aggregation_config: + allowedPartialStaleness: '0.5' + feeds: + '%s': + deviation: '0.05' + heartbeat: 3600 + remappedID: '0x666666666666' + encoder: EVM + encoder_config: + abi: '(bytes32 FeedID, uint224 Price, uint32 Timestamp)[] Reports' +targets: + - id: write_%s@1.0.0 + inputs: + signed_report: $(ccip_feeds.outputs) + config: + address: '%s' + deltaStage: 45s + schedule: oneAtATime +"""`, + workflowName, + workflowOwner, + feedID, + feedID, + "geth-testnet", + feedsConsumerAddress, + ) + response, _, err2 = nodeClient.CreateJobRaw(workflowSpec) + assert.NoError(t, err2) + assert.Empty(t, response.Errors) + }() + } + wg.Wait() + + var nopsToAdd []cr_wrapper.CapabilitiesRegistryNodeOperator + var nodesToAdd []cr_wrapper.CapabilitiesRegistryNodeParams + var donNodes [][32]byte + var signers []common.Address + + for i, node := range nodesInfo { + if i == 0 { + continue + } + nopsToAdd = append(nopsToAdd, cr_wrapper.CapabilitiesRegistryNodeOperator{ + Admin: common.HexToAddress(node.TransmitterAddress), + Name: fmt.Sprintf("NOP %d", i), + }) + + var peerID ragetypes.PeerID + err = peerID.UnmarshalText([]byte(node.PeerID)) + require.NoError(t, err) + + nodesToAdd = append(nodesToAdd, cr_wrapper.CapabilitiesRegistryNodeParams{ + NodeOperatorId: uint32(i), //nolint:gosec // disable G115 + Signer: common.BytesToHash(node.Signer.Bytes()), + P2pId: peerID, + EncryptionPublicKey: [32]byte{1, 2, 3, 4, 5}, + HashedCapabilityIds: capabilitiesRegistryInstance.ExistingHashedCapabilitiesIDs, + }) + + donNodes = append(donNodes, peerID) + signers = append(signers, node.Signer) + } + + // Add NOPs to registry + tx, err = capabilitiesRegistryInstance.Contract.AddNodeOperators( + sc.NewTXOpts(), + nopsToAdd, + ) + require.NoError(t, err) + _, err = bind.WaitMined(context.Background(), sc.Client, tx) + require.NoError(t, err) + + // Add nodes to registry + tx, err = capabilitiesRegistryInstance.Contract.AddNodes( + sc.NewTXOpts(), + nodesToAdd, + ) + require.NoError(t, err) + _, err = bind.WaitMined(context.Background(), sc.Client, tx) + require.NoError(t, err) + + // Add nodeset to registry + tx, err = capabilitiesRegistryInstance.Contract.AddDON( + sc.NewTXOpts(), + donNodes, + []cr_wrapper.CapabilitiesRegistryCapabilityConfiguration{ + { + CapabilityId: capabilitiesRegistryInstance.ExistingHashedCapabilitiesIDs[0], + Config: []byte(""), + }, + { + CapabilityId: capabilitiesRegistryInstance.ExistingHashedCapabilitiesIDs[1], + Config: []byte(""), + }, + { + CapabilityId: capabilitiesRegistryInstance.ExistingHashedCapabilitiesIDs[2], + Config: []byte(""), + }, + }, + true, + true, + uint8(1), + ) + require.NoError(t, err) + _, err = bind.WaitMined(context.Background(), sc.Client, tx) + require.NoError(t, err) + + require.NoError(t, forwarderInstance.SetConfig( + 1, + 1, + 1, + signers, + )) + + // Wait for OCR listeners to be ready before setting the configuration. + // If the ConfigSet event is missed, OCR protocol will not start. + fmt.Println("Waiting 30s for OCR listeners to be ready...") + time.Sleep(30 * time.Second) + fmt.Println("Proceeding to set OCR3 configuration.") + + // Configure OCR capability contract + ocr3Config := generateOCR3Config(t, workflowNodesetInfo) + tx, err = ocr3CapabilityContract.SetConfig( + sc.NewTXOpts(), + ocr3Config.Signers, + ocr3Config.Transmitters, + ocr3Config.F, + ocr3Config.OnchainConfig, + ocr3Config.OffchainConfigVersion, + ocr3Config.OffchainConfig, + ) + require.NoError(t, err) + _, err = bind.WaitMined(context.Background(), sc.Client, tx) + require.NoError(t, err) + + // It can take a while before the first report is produced, particularly on CI. + timeout := 5 * time.Minute + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + startTime := time.Now() + for { + select { + case <-ctx.Done(): + t.Fatalf("feed did not update, timeout after %s", timeout) + case <-time.After(5 * time.Second): + elapsed := time.Since(startTime).Round(time.Second) + price, _, err := feedsConsumerContract.GetPrice( + sc.NewCallOpts(), + common.HexToHash(feedID), + ) + require.NoError(t, err) + + if price.String() != "0" { + fmt.Printf("Feed updated after %s - price set, price=%s\n", elapsed, price) + return + } + fmt.Printf("Feed not updated yet, waiting for %s\n", elapsed) + } + } + }) +} diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 43c1445b800..52d598ce469 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -40,6 +40,7 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.0.0-20241128080738-06bef8620ac6 github.com/smartcontractkit/chainlink-common v0.3.1-0.20241125150608-97ceadb2072d github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 + github.com/smartcontractkit/chainlink-testing-framework/framework v0.3.2-0.20241202152224-151614d375c8 github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.17 github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 @@ -132,8 +133,8 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/bytecodealliance/wasmtime-go/v23 v23.0.0 // indirect - github.com/bytedance/sonic v1.11.6 // indirect - github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/bytedance/sonic v1.12.3 // indirect + github.com/bytedance/sonic/loader v0.2.0 // indirect github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b // indirect github.com/c9s/goprocinfo v0.0.0-20210130143923-c95fcf8c64a8 // indirect github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5 // indirect @@ -204,7 +205,7 @@ require ( github.com/fatih/color v1.17.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gabriel-vasile/mimetype v1.4.6 // indirect github.com/gagliardetto/binary v0.7.7 // indirect github.com/gagliardetto/solana-go v1.8.4 // indirect github.com/gagliardetto/treeout v0.1.4 // indirect @@ -234,12 +235,12 @@ require ( github.com/go-openapi/validate v0.23.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.22.0 // indirect + github.com/go-playground/validator/v10 v10.22.1 // indirect github.com/go-redis/redis/v8 v8.11.5 // indirect github.com/go-viper/mapstructure/v2 v2.1.0 // indirect github.com/go-webauthn/webauthn v0.9.4 // indirect github.com/go-webauthn/x v0.1.5 // indirect - github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-json v0.10.3 // indirect github.com/goccy/go-yaml v1.12.0 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gofrs/flock v0.8.1 // indirect @@ -332,7 +333,7 @@ require ( github.com/julienschmidt/httprouter v1.3.0 // indirect github.com/kelseyhightower/envconfig v1.4.0 // indirect github.com/klauspost/compress v1.17.9 // indirect - github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect @@ -347,7 +348,7 @@ require ( github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/miekg/dns v1.1.61 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect @@ -400,7 +401,7 @@ require ( github.com/prometheus/procfs v0.15.1 // indirect github.com/prometheus/prometheus v0.54.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rivo/uniseg v0.4.4 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/rs/cors v1.10.1 // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index e903de1c802..b853ef4f9ac 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -234,6 +234,8 @@ github.com/aws/jsii-runtime-go v1.104.0 h1:651Sh6J2FtatfnVzlOQ3/Ye1WWPAseZ6E/tSQ github.com/aws/jsii-runtime-go v1.104.0/go.mod h1:7ZmQXxV0AAhhvv/GaHX4n6zbgA1tSRVdnQYAJbIhXHk= github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM= github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df h1:GSoSVRLoBaFpOOds6QyY1L8AX7uoY+Ln3BHc22W40X0= @@ -274,10 +276,11 @@ github.com/bxcodec/faker v2.0.1+incompatible h1:P0KUpUw5w6WJXwrPfv35oc91i4d8nf40 github.com/bxcodec/faker v2.0.1+incompatible/go.mod h1:BNzfpVdTwnFJ6GtfYTcQu6l6rHShT+veBxNCnjCx5XM= github.com/bytecodealliance/wasmtime-go/v23 v23.0.0 h1:NJvU4S8KEk1GnF6+FvlnzMD/8wXTj/mYJSG6Q4yu3Pw= github.com/bytecodealliance/wasmtime-go/v23 v23.0.0/go.mod h1:5YIL+Ouiww2zpO7u+iZ1U1G5NvmwQYaXdmCZQGjQM0U= -github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= -github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= -github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic v1.12.3 h1:W2MGa7RCU1QTeYRTPE3+88mVC0yXmsRQRChiyVocVjU= +github.com/bytedance/sonic v1.12.3/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM= +github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b h1:6+ZFm0flnudZzdSE0JxlhR2hKnGPcNB35BjQf4RYQDY= github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= github.com/c9s/goprocinfo v0.0.0-20210130143923-c95fcf8c64a8 h1:SjZ2GvvOononHOpK84APFuMvxqsk3tEIaKH/z4Rpu3g= @@ -418,8 +421,8 @@ github.com/creachadair/taskgroup v0.4.2 h1:jsBLdAJE42asreGss2xZGZ8fJra7WtwnHWeJF github.com/creachadair/taskgroup v0.4.2/go.mod h1:qiXUOSrbwAY3u0JPGTzObbE3yf9hcXHDKBZ2ZjpCbgM= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= -github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= +github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= @@ -523,8 +526,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= -github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc= +github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc= github.com/gagliardetto/binary v0.7.7 h1:QZpT38+sgoPg+TIQjH94sLbl/vX+nlIRA37pEyOsjfY= github.com/gagliardetto/binary v0.7.7/go.mod h1:mUuay5LL8wFVnIlecHakSZMvcdqfs+CsotR5n77kyjM= github.com/gagliardetto/gofuzz v1.2.2 h1:XL/8qDMzcgvR4+CyRQW9UGdwPRPMHVJfqQ/uMvSUuQw= @@ -609,8 +612,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao= -github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-playground/validator/v10 v10.22.1 h1:40JcKH+bBNGFczGuoBYgX4I6m/i27HYW8P9FDk5PbgA= +github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-resty/resty/v2 v2.15.3 h1:bqff+hcqAflpiF591hhJzNdkRsFhlB96CYfBwSFvql8= @@ -632,8 +635,8 @@ github.com/go-webauthn/x v0.1.5 h1:V2TCzDU2TGLd0kSZOXdrqDVV5JB9ILnKxA9S53CSBw0= github.com/go-webauthn/x v0.1.5/go.mod h1:qbzWwcFcv4rTwtCLOZd+icnr6B7oSsAGZJqlt8cukqY= github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/goccy/go-yaml v1.12.0 h1:/1WHjnMsI1dlIBQutrvSMGZRQufVO3asrHfTwfACoPM= github.com/goccy/go-yaml v1.12.0/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHvE4m7WU= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= @@ -1025,8 +1028,8 @@ github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47e github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= -github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= @@ -1101,8 +1104,8 @@ github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= @@ -1183,8 +1186,8 @@ github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= -github.com/muesli/termenv v0.12.0 h1:KuQRUE3PgxRFWhq4gHvZtPSLCGDqM5q/cYr1pZ39ytc= -github.com/muesli/termenv v0.12.0/go.mod h1:WCCv32tusQ/EEZ5S8oUIIrC/nIuBcxCVqlN4Xfkv+7A= +github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a h1:2MaM6YC3mGu54x+RKAA6JiFFHlHDY1UbkxqppT7wYOg= +github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a/go.mod h1:hxSnBBYLK21Vtq/PHd0S2FYCxBXzBua8ov5s1RobyRQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -1327,8 +1330,8 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqn github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -1421,6 +1424,8 @@ github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241127201057-3c9282e3974 github.com/smartcontractkit/chainlink-solana v1.1.1-0.20241127201057-3c9282e39749/go.mod h1:nkIegLHodyrrZguxkYEHcNw2vAXv8H8xlCoLzwylcL0= github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241017135645-176a23722fd8 h1:B4DFdk6MGcQnoCjjMBCx7Z+GWQpxRWJ4O8W/dVJyWGA= github.com/smartcontractkit/chainlink-starknet/relayer v0.1.1-0.20241017135645-176a23722fd8/go.mod h1:WkBqgBo+g34Gm5vWkDDl8Fh3Mzd7bF5hXp7rryg0t5o= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.3.2-0.20241202152224-151614d375c8 h1:Dcbv5du1oOcX52JtTdH8dtMxgqLo4PjMBpFlKGqap08= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.3.2-0.20241202152224-151614d375c8/go.mod h1:mMUqvS3BZfvN1OfK4OFTYf1+T0X6nwmSXJM2keaPsSM= github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 h1:GDGrC5OGiV0RyM1znYWehSQXyZQWTOzrEeJRYmysPCE= github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2/go.mod h1:DsT43c1oTBmp3iQkMcoZOoKThwZvt8X3Pz6UmznJ4GY= github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.17 h1:Fw2F8fKa5QdOUzLAj6Y/EB6XFC0QtK2pw5bqQSatL4A= @@ -1707,7 +1712,6 @@ go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go4.org/netipx v0.0.0-20230125063823-8449b0a6169f h1:ketMxHg+vWm3yccyYiq+uK8D3fRmna2Fcj+awpQp84s= go4.org/netipx v0.0.0-20230125063823-8449b0a6169f/go.mod h1:tgPU4N2u9RByaTN3NC2p9xOzyFpte4jYwsIIRF7XlSc= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.11.0 h1:KXV8WWKCXm6tRpLirl2szsO5j/oOODwZf4hATmGVNs4= golang.org/x/arch v0.11.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -2226,7 +2230,6 @@ nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYm pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index cd1326f9578..76de2719fb5 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -101,8 +101,8 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/bytecodealliance/wasmtime-go/v23 v23.0.0 // indirect - github.com/bytedance/sonic v1.11.6 // indirect - github.com/bytedance/sonic/loader v0.1.1 // indirect + github.com/bytedance/sonic v1.12.3 // indirect + github.com/bytedance/sonic/loader v0.2.0 // indirect github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b // indirect github.com/c9s/goprocinfo v0.0.0-20210130143923-c95fcf8c64a8 // indirect github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5 // indirect @@ -174,7 +174,7 @@ require ( github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gabriel-vasile/mimetype v1.4.6 // indirect github.com/gagliardetto/binary v0.7.7 // indirect github.com/gagliardetto/solana-go v1.8.4 // indirect github.com/gagliardetto/treeout v0.1.4 // indirect @@ -204,12 +204,12 @@ require ( github.com/go-openapi/validate v0.23.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.22.0 // indirect + github.com/go-playground/validator/v10 v10.22.1 // indirect github.com/go-redis/redis/v8 v8.11.5 // indirect github.com/go-viper/mapstructure/v2 v2.1.0 // indirect github.com/go-webauthn/webauthn v0.9.4 // indirect github.com/go-webauthn/x v0.1.5 // indirect - github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-json v0.10.3 // indirect github.com/goccy/go-yaml v1.12.0 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gofrs/flock v0.8.1 // indirect @@ -306,7 +306,7 @@ require ( github.com/julienschmidt/httprouter v1.3.0 // indirect github.com/kelseyhightower/envconfig v1.4.0 // indirect github.com/klauspost/compress v1.17.9 // indirect - github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect @@ -322,7 +322,7 @@ require ( github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/miekg/dns v1.1.61 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect @@ -377,7 +377,7 @@ require ( github.com/prometheus/procfs v0.15.1 // indirect github.com/prometheus/prometheus v0.54.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rivo/uniseg v0.4.4 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/robfig/cron/v3 v3.0.1 // indirect github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/rs/cors v1.10.1 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 42b7c05df8a..7e8e67b71e7 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -278,10 +278,11 @@ github.com/bxcodec/faker v2.0.1+incompatible h1:P0KUpUw5w6WJXwrPfv35oc91i4d8nf40 github.com/bxcodec/faker v2.0.1+incompatible/go.mod h1:BNzfpVdTwnFJ6GtfYTcQu6l6rHShT+veBxNCnjCx5XM= github.com/bytecodealliance/wasmtime-go/v23 v23.0.0 h1:NJvU4S8KEk1GnF6+FvlnzMD/8wXTj/mYJSG6Q4yu3Pw= github.com/bytecodealliance/wasmtime-go/v23 v23.0.0/go.mod h1:5YIL+Ouiww2zpO7u+iZ1U1G5NvmwQYaXdmCZQGjQM0U= -github.com/bytedance/sonic v1.11.6 h1:oUp34TzMlL+OY1OUWxHqsdkgC/Zfc85zGqw9siXjrc0= -github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= -github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM= +github.com/bytedance/sonic v1.12.3 h1:W2MGa7RCU1QTeYRTPE3+88mVC0yXmsRQRChiyVocVjU= +github.com/bytedance/sonic v1.12.3/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM= +github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b h1:6+ZFm0flnudZzdSE0JxlhR2hKnGPcNB35BjQf4RYQDY= github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= github.com/c9s/goprocinfo v0.0.0-20210130143923-c95fcf8c64a8 h1:SjZ2GvvOononHOpK84APFuMvxqsk3tEIaKH/z4Rpu3g= @@ -517,8 +518,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= -github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc= +github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc= github.com/gagliardetto/binary v0.7.7 h1:QZpT38+sgoPg+TIQjH94sLbl/vX+nlIRA37pEyOsjfY= github.com/gagliardetto/binary v0.7.7/go.mod h1:mUuay5LL8wFVnIlecHakSZMvcdqfs+CsotR5n77kyjM= github.com/gagliardetto/gofuzz v1.2.2 h1:XL/8qDMzcgvR4+CyRQW9UGdwPRPMHVJfqQ/uMvSUuQw= @@ -603,8 +604,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao= -github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-playground/validator/v10 v10.22.1 h1:40JcKH+bBNGFczGuoBYgX4I6m/i27HYW8P9FDk5PbgA= +github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-resty/resty/v2 v2.15.3 h1:bqff+hcqAflpiF591hhJzNdkRsFhlB96CYfBwSFvql8= @@ -626,8 +627,8 @@ github.com/go-webauthn/x v0.1.5 h1:V2TCzDU2TGLd0kSZOXdrqDVV5JB9ILnKxA9S53CSBw0= github.com/go-webauthn/x v0.1.5/go.mod h1:qbzWwcFcv4rTwtCLOZd+icnr6B7oSsAGZJqlt8cukqY= github.com/go-zookeeper/zk v1.0.3 h1:7M2kwOsc//9VeeFiPtf+uSJlVpU66x9Ba5+8XK7/TDg= github.com/go-zookeeper/zk v1.0.3/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/goccy/go-yaml v1.12.0 h1:/1WHjnMsI1dlIBQutrvSMGZRQufVO3asrHfTwfACoPM= github.com/goccy/go-yaml v1.12.0/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHvE4m7WU= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= @@ -1021,8 +1022,8 @@ github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47e github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= -github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= @@ -1095,8 +1096,8 @@ github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= @@ -1317,8 +1318,8 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqn github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -1698,7 +1699,6 @@ go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go4.org/netipx v0.0.0-20230125063823-8449b0a6169f h1:ketMxHg+vWm3yccyYiq+uK8D3fRmna2Fcj+awpQp84s= go4.org/netipx v0.0.0-20230125063823-8449b0a6169f/go.mod h1:tgPU4N2u9RByaTN3NC2p9xOzyFpte4jYwsIIRF7XlSc= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.11.0 h1:KXV8WWKCXm6tRpLirl2szsO5j/oOODwZf4hATmGVNs4= golang.org/x/arch v0.11.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -2215,7 +2215,6 @@ nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYm pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU=