From daa128a736f181f6a62725e5a43af14fd4893381 Mon Sep 17 00:00:00 2001 From: gustavogama-cll <165679773+gustavogama-cll@users.noreply.github.com> Date: Wed, 19 Feb 2025 23:23:58 -0300 Subject: [PATCH 01/58] chore: migrate CCIP changesets to the new MCMS lib (#16458) --- deployment/ccip/changeset/cs_ccip_home.go | 277 +++++----- .../ccip/changeset/cs_chain_contracts.go | 514 ++++++++++-------- deployment/ccip/changeset/cs_home_chain.go | 52 +- .../ccip/changeset/cs_update_rmn_config.go | 178 +++--- deployment/ccip/changeset/deployer_group.go | 92 ++-- .../ccip/changeset/deployer_group_test.go | 18 +- deployment/ccip/changeset/v1_5/cs_rmn.go | 64 ++- .../common/proposalutils/mcms_test_helpers.go | 28 +- 8 files changed, 674 insertions(+), 549 deletions(-) diff --git a/deployment/ccip/changeset/cs_ccip_home.go b/deployment/ccip/changeset/cs_ccip_home.go index 21c22121851..763f7791efe 100644 --- a/deployment/ccip/changeset/cs_ccip_home.go +++ b/deployment/ccip/changeset/cs_ccip_home.go @@ -10,11 +10,13 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" "golang.org/x/exp/maps" + mcmslib "github.com/smartcontractkit/mcms" + mcmssdk "github.com/smartcontractkit/mcms/sdk" + mcmsevmsdk "github.com/smartcontractkit/mcms/sdk/evm" + mcmstypes "github.com/smartcontractkit/mcms/types" + "github.com/smartcontractkit/chainlink-common/pkg/config" "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/merklemulti" @@ -407,7 +409,7 @@ func PromoteCandidateChangeset( homeChain := e.Chains[cfg.HomeChainSelector] - var ops []mcms.Operation + var mcmsTxs []mcmstypes.Transaction for _, plugin := range cfg.PluginInfo { for _, donID := range donIDs { promoteCandidateOps, err := promoteCandidateForChainOps( @@ -422,9 +424,9 @@ func PromoteCandidateChangeset( cfg.MCMS != nil, ) if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("generating promote candidate ops: %w", err) + return deployment.ChangesetOutput{}, fmt.Errorf("generating promote candidate mcms txs: %w", err) } - ops = append(ops, promoteCandidateOps) + mcmsTxs = append(mcmsTxs, promoteCandidateOps) } } @@ -433,28 +435,25 @@ func PromoteCandidateChangeset( return deployment.ChangesetOutput{}, nil } - prop, err := proposalutils.BuildProposalFromBatches( - map[uint64]common.Address{ - cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].Timelock.Address(), - }, - map[uint64]*gethwrappers.ManyChainMultiSig{ - cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].ProposerMcm, - }, - []timelock.BatchChainOperation{{ - ChainIdentifier: mcms.ChainIdentifier(cfg.HomeChainSelector), - Batch: ops, - }}, + timelocks := map[uint64]string{cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].Timelock.Address().Hex()} + proposers := map[uint64]string{cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].ProposerMcm.Address().Hex()} + inspectors := map[uint64]mcmssdk.Inspector{cfg.HomeChainSelector: mcmsevmsdk.NewInspector(e.Chains[cfg.HomeChainSelector].Client)} + batches := []mcmstypes.BatchOperation{{ChainSelector: mcmstypes.ChainSelector(cfg.HomeChainSelector), Transactions: mcmsTxs}} + + prop, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), + timelocks, + proposers, + inspectors, + batches, "promoteCandidate", cfg.MCMS.MinDelay, ) if err != nil { return deployment.ChangesetOutput{}, err } - return deployment.ChangesetOutput{ - Proposals: []timelock.MCMSWithTimelockProposal{ - *prop, - }, - }, nil + + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*prop}}, nil } type SetCandidatePluginInfo struct { @@ -634,7 +633,7 @@ func AddDonAndSetCandidateChangeset( if cfg.MCMS != nil { txOpts = deployment.SimTransactOpts() } - var donOps []mcms.Operation + var donMcmsTxs []mcmstypes.Transaction for chainSelector, params := range cfg.PluginInfo.OCRConfigPerRemoteChainSelector { offRampAddress, err := state.GetOffRampAddress(chainSelector) if err != nil { @@ -679,23 +678,23 @@ func AddDonAndSetCandidateChangeset( if err != nil { return deployment.ChangesetOutput{}, err } - donOps = append(donOps, addDonOp) + donMcmsTxs = append(donMcmsTxs, addDonOp) } if cfg.MCMS == nil { return deployment.ChangesetOutput{}, nil } - prop, err := proposalutils.BuildProposalFromBatches( - map[uint64]common.Address{ - cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].Timelock.Address(), - }, - map[uint64]*gethwrappers.ManyChainMultiSig{ - cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].ProposerMcm, - }, - []timelock.BatchChainOperation{{ - ChainIdentifier: mcms.ChainIdentifier(cfg.HomeChainSelector), - Batch: donOps, - }}, + timelocks := map[uint64]string{cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].Timelock.Address().Hex()} + proposers := map[uint64]string{cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].ProposerMcm.Address().Hex()} + inspectors := map[uint64]mcmssdk.Inspector{cfg.HomeChainSelector: mcmsevmsdk.NewInspector(e.Chains[cfg.HomeChainSelector].Client)} + batches := []mcmstypes.BatchOperation{{ChainSelector: mcmstypes.ChainSelector(cfg.HomeChainSelector), Transactions: donMcmsTxs}} + + prop, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), + timelocks, + proposers, + inspectors, + batches, "addDON on new Chain && setCandidate for plugin "+cfg.PluginInfo.PluginType.String(), cfg.MCMS.MinDelay, ) @@ -703,9 +702,7 @@ func AddDonAndSetCandidateChangeset( return deployment.ChangesetOutput{}, fmt.Errorf("failed to build proposal from batch: %w", err) } - return deployment.ChangesetOutput{ - Proposals: []timelock.MCMSWithTimelockProposal{*prop}, - }, nil + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*prop}}, nil } // newDonWithCandidateOp sets the candidate commit config by calling setCandidate on CCIPHome contract through the AddDON call on CapReg contract @@ -719,7 +716,7 @@ func newDonWithCandidateOp( capReg *capabilities_registry.CapabilitiesRegistry, nodes deployment.Nodes, mcmsEnabled bool, -) (mcms.Operation, error) { +) (mcmstypes.Transaction, error) { encodedSetCandidateCall, err := internal.CCIPHomeABI.Pack( "setCandidate", donID, @@ -728,7 +725,7 @@ func newDonWithCandidateOp( [32]byte{}, ) if err != nil { - return mcms.Operation{}, fmt.Errorf("pack set candidate call: %w", err) + return mcmstypes.Transaction{}, fmt.Errorf("pack set candidate call: %w", err) } addDonTx, err := capReg.AddDON( @@ -744,22 +741,27 @@ func newDonWithCandidateOp( false, // acceptsWorkflows nodes.DefaultF(), ) + if err != nil { + return mcmstypes.Transaction{}, fmt.Errorf("failed to call AddDON (ptype: %s): %w", + types.PluginType(pluginConfig.PluginType).String(), err) + } + if !mcmsEnabled { _, err = deployment.ConfirmIfNoErrorWithABI( homeChain, addDonTx, ccip_home.CCIPHomeABI, err) if err != nil { - return mcms.Operation{}, fmt.Errorf("error confirming addDon call: %w", err) + return mcmstypes.Transaction{}, fmt.Errorf("error confirming addDon call: %w", err) } } + + tx, err := proposalutils.TransactionForChain(homeChain.Selector, capReg.Address().Hex(), addDonTx.Data(), + big.NewInt(0), string(CapabilitiesRegistry), []string{}) if err != nil { - return mcms.Operation{}, fmt.Errorf("could not generate add don tx w/ %s config: %w", - types.PluginType(pluginConfig.PluginType).String(), err) + return mcmstypes.Transaction{}, fmt.Errorf("failed to create AddDON mcms tx (don: %d; ptype: %s): %w", + donID, types.PluginType(pluginConfig.PluginType).String(), err) } - return mcms.Operation{ - To: capReg.Address(), - Data: addDonTx.Data(), - Value: big.NewInt(0), - }, nil + + return tx, nil } type SetCandidateChangesetConfig struct { @@ -823,7 +825,7 @@ func SetCandidateChangeset( if cfg.MCMS != nil { txOpts = deployment.SimTransactOpts() } - var setCandidateOps []mcms.Operation + var setCandidateMcmsTxs []mcmstypes.Transaction pluginInfos := make([]string, 0) for _, plugin := range cfg.PluginInfo { pluginInfos = append(pluginInfos, plugin.String()) @@ -864,35 +866,32 @@ func SetCandidateChangeset( if err != nil { return deployment.ChangesetOutput{}, err } - setCandidateOps = append(setCandidateOps, setCandidateMCMSOps...) + setCandidateMcmsTxs = append(setCandidateMcmsTxs, setCandidateMCMSOps...) } } if cfg.MCMS == nil { return deployment.ChangesetOutput{}, nil } - prop, err := proposalutils.BuildProposalFromBatches( - map[uint64]common.Address{ - cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].Timelock.Address(), - }, - map[uint64]*gethwrappers.ManyChainMultiSig{ - cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].ProposerMcm, - }, - []timelock.BatchChainOperation{{ - ChainIdentifier: mcms.ChainIdentifier(cfg.HomeChainSelector), - Batch: setCandidateOps, - }}, + timelocks := map[uint64]string{cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].Timelock.Address().Hex()} + proposers := map[uint64]string{cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].ProposerMcm.Address().Hex()} + inspectors := map[uint64]mcmssdk.Inspector{cfg.HomeChainSelector: mcmsevmsdk.NewInspector(e.Chains[cfg.HomeChainSelector].Client)} + batches := []mcmstypes.BatchOperation{{ChainSelector: mcmstypes.ChainSelector(cfg.HomeChainSelector), Transactions: setCandidateMcmsTxs}} + + prop, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), + timelocks, + proposers, + inspectors, + batches, fmt.Sprintf("SetCandidate for plugin details %v", pluginInfos), cfg.MCMS.MinDelay, ) if err != nil { return deployment.ChangesetOutput{}, err } - return deployment.ChangesetOutput{ - Proposals: []timelock.MCMSWithTimelockProposal{ - *prop, - }, - }, nil + + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*prop}}, nil } // setCandidateOnExistingDon calls setCandidate on CCIPHome contract through the UpdateDON call on CapReg contract @@ -905,7 +904,7 @@ func setCandidateOnExistingDon( donID uint32, pluginConfig ccip_home.CCIPHomeOCR3Config, mcmsEnabled bool, -) ([]mcms.Operation, error) { +) ([]mcmstypes.Transaction, error) { if donID == 0 { return nil, errors.New("donID is zero") } @@ -935,21 +934,27 @@ func setCandidateOnExistingDon( false, nodes.DefaultF(), ) + if err != nil { + return nil, fmt.Errorf("failed to call UpdateDON in set candidate (don: %d; ptype: %s): %w", + donID, types.PluginType(pluginConfig.PluginType).String(), err) + } + if !mcmsEnabled { _, err = deployment.ConfirmIfNoErrorWithABI( homeChain, updateDonTx, ccip_home.CCIPHomeABI, err) if err != nil { - return nil, fmt.Errorf("error confirming updateDon call: %w", err) + return nil, fmt.Errorf("error confirming UpdateDON call in set candidate (don: %d; ptype: %s): %w", + donID, types.PluginType(pluginConfig.PluginType).String(), err) } } + + tx, err := proposalutils.TransactionForChain(homeChain.Selector, capReg.Address().Hex(), updateDonTx.Data(), big.NewInt(0), string(CapabilitiesRegistry), []string{}) if err != nil { - return nil, fmt.Errorf("update don w/ setCandidate call: %w", err) + return nil, fmt.Errorf("failed to create UpdateDON mcms tx in set candidate (don: %d; ptype: %s): %w", + donID, types.PluginType(pluginConfig.PluginType).String(), err) } - return []mcms.Operation{{ - To: capReg.Address(), - Data: updateDonTx.Data(), - Value: big.NewInt(0), - }}, nil + + return []mcmstypes.Transaction{tx}, nil } // promoteCandidateOp will create the MCMS Operation for `promoteCandidateAndRevokeActive` directed towards the capabilityRegistry @@ -962,10 +967,10 @@ func promoteCandidateOp( donID uint32, pluginType uint8, mcmsEnabled bool, -) (mcms.Operation, error) { +) (mcmstypes.Transaction, error) { allConfigs, err := ccipHome.GetAllConfigs(nil, donID, pluginType) if err != nil { - return mcms.Operation{}, err + return mcmstypes.Transaction{}, err } encodedPromotionCall, err := internal.CCIPHomeABI.Pack( @@ -976,7 +981,7 @@ func promoteCandidateOp( allConfigs.ActiveConfig.ConfigDigest, ) if err != nil { - return mcms.Operation{}, fmt.Errorf("pack promotion call: %w", err) + return mcmstypes.Transaction{}, fmt.Errorf("pack promotion call: %w", err) } updateDonTx, err := capReg.UpdateDON( @@ -992,23 +997,28 @@ func promoteCandidateOp( false, nodes.DefaultF(), ) + if err != nil { + return mcmstypes.Transaction{}, fmt.Errorf("failed to call UpdateDON in promote candidate (don: %d; ptype: %s): %w", + donID, types.PluginType(pluginType).String(), err) + } + if !mcmsEnabled { _, err = deployment.ConfirmIfNoErrorWithABI( homeChain, updateDonTx, ccip_home.CCIPHomeABI, err) if err != nil { - return mcms.Operation{}, - fmt.Errorf("error confirming updateDon call for donID(%d) and plugin type (%d): %w", donID, pluginType, err) + return mcmstypes.Transaction{}, fmt.Errorf("error confirming UpdateDON call in promote candidate (don: %d; ptype: %s): %w", + donID, types.PluginType(pluginType).String(), err) } } + + tx, err := proposalutils.TransactionForChain(homeChain.Selector, capReg.Address().Hex(), updateDonTx.Data(), + big.NewInt(0), string(CapabilitiesRegistry), []string{}) if err != nil { - return mcms.Operation{}, fmt.Errorf("error creating updateDon op for donID(%d) and plugin type (%s): %w", + return mcmstypes.Transaction{}, fmt.Errorf("failed to create UpdateDON mcms tx in promote candidate (don: %d; ptype: %s): %w", donID, types.PluginType(pluginType).String(), err) } - return mcms.Operation{ - To: capReg.Address(), - Data: updateDonTx.Data(), - Value: big.NewInt(0), - }, nil + + return tx, nil } // promoteCandidateForChainOps promotes the candidate commit and exec configs to active by calling promoteCandidateAndRevokeActive on CCIPHome through the UpdateDON call on CapReg contract @@ -1022,16 +1032,16 @@ func promoteCandidateForChainOps( pluginType cctypes.PluginType, allowEmpty bool, mcmsEnabled bool, -) (mcms.Operation, error) { +) (mcmstypes.Transaction, error) { if donID == 0 { - return mcms.Operation{}, errors.New("donID is zero") + return mcmstypes.Transaction{}, errors.New("donID is zero") } digest, err := ccipHome.GetCandidateDigest(nil, donID, uint8(pluginType)) if err != nil { - return mcms.Operation{}, err + return mcmstypes.Transaction{}, err } if digest == [32]byte{} && !allowEmpty { - return mcms.Operation{}, errors.New("candidate config digest is zero, promoting empty config is not allowed") + return mcmstypes.Transaction{}, errors.New("candidate config digest is zero, promoting empty config is not allowed") } fmt.Println("Promoting candidate for plugin", pluginType.String(), "with digest", digest) updatePluginOp, err := promoteCandidateOp( @@ -1045,7 +1055,7 @@ func promoteCandidateForChainOps( mcmsEnabled, ) if err != nil { - return mcms.Operation{}, fmt.Errorf("promote candidate op for plugin %s: %w", pluginType.String(), err) + return mcmstypes.Transaction{}, fmt.Errorf("promote candidate op for plugin %s: %w", pluginType.String(), err) } return updatePluginOp, nil } @@ -1151,17 +1161,17 @@ func RevokeCandidateChangeset(e deployment.Environment, cfg RevokeCandidateChang return deployment.ChangesetOutput{}, nil } - prop, err := proposalutils.BuildProposalFromBatches( - map[uint64]common.Address{ - cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].Timelock.Address(), - }, - map[uint64]*gethwrappers.ManyChainMultiSig{ - cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].ProposerMcm, - }, - []timelock.BatchChainOperation{{ - ChainIdentifier: mcms.ChainIdentifier(cfg.HomeChainSelector), - Batch: ops, - }}, + timelocks := map[uint64]string{cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].Timelock.Address().Hex()} + proposers := map[uint64]string{cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].ProposerMcm.Address().Hex()} + inspectors := map[uint64]mcmssdk.Inspector{cfg.HomeChainSelector: mcmsevmsdk.NewInspector(e.Chains[cfg.HomeChainSelector].Client)} + batches := []mcmstypes.BatchOperation{{ChainSelector: mcmstypes.ChainSelector(cfg.HomeChainSelector), Transactions: ops}} + + prop, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), + timelocks, + proposers, + inspectors, + batches, fmt.Sprintf("revokeCandidate for don %d", cfg.RemoteChainSelector), cfg.MCMS.MinDelay, ) @@ -1169,11 +1179,7 @@ func RevokeCandidateChangeset(e deployment.Environment, cfg RevokeCandidateChang return deployment.ChangesetOutput{}, err } - return deployment.ChangesetOutput{ - Proposals: []timelock.MCMSWithTimelockProposal{ - *prop, - }, - }, nil + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*prop}}, nil } func revokeCandidateOps( @@ -1185,7 +1191,7 @@ func revokeCandidateOps( donID uint32, pluginType uint8, mcmsEnabled bool, -) ([]mcms.Operation, error) { +) ([]mcmstypes.Transaction, error) { if donID == 0 { return nil, errors.New("donID is zero") } @@ -1219,22 +1225,28 @@ func revokeCandidateOps( nodes.DefaultF(), ) if err != nil { - return nil, fmt.Errorf("update don w/ revokeCandidate call: %w", deployment.MaybeDataErr(err)) + return nil, fmt.Errorf("failed to call UpdateDON in revoke candidate (don: %d; ptype: %s): %w", + donID, types.PluginType(pluginType).String(), err) } + if !mcmsEnabled { _, err = deployment.ConfirmIfNoErrorWithABI( homeChain, updateDonTx, capabilities_registry.CapabilitiesRegistryABI, err) if err != nil { - return nil, fmt.Errorf("error confirming updateDon call: %w", err) + return nil, fmt.Errorf("error confirming UpdateDON call in revoke candidate (don: %d; ptype: %s): %w", + donID, types.PluginType(pluginType).String(), err) } } - return []mcms.Operation{{ - To: capReg.Address(), - Data: updateDonTx.Data(), - Value: big.NewInt(0), - }}, nil + tx, err := proposalutils.TransactionForChain(homeChain.Selector, capReg.Address().Hex(), updateDonTx.Data(), + big.NewInt(0), string(CapabilitiesRegistry), []string{}) + if err != nil { + return nil, fmt.Errorf("failed to create UpdateDON mcms tx in revoke candidate (don: %d; ptype: %s): %w", + donID, types.PluginType(pluginType).String(), err) + } + + return []mcmstypes.Transaction{tx}, nil } type ChainConfig struct { @@ -1351,33 +1363,30 @@ func UpdateChainConfigChangeset(e deployment.Environment, cfg UpdateChainConfigC return deployment.ChangesetOutput{}, nil } - p, err := proposalutils.BuildProposalFromBatches( - map[uint64]common.Address{ - cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].Timelock.Address(), - }, - map[uint64]*gethwrappers.ManyChainMultiSig{ - cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].ProposerMcm, - }, - []timelock.BatchChainOperation{{ - ChainIdentifier: mcms.ChainIdentifier(cfg.HomeChainSelector), - Batch: []mcms.Operation{ - { - To: state.Chains[cfg.HomeChainSelector].CCIPHome.Address(), - Data: tx.Data(), - Value: big.NewInt(0), - }, - }, - }}, + timelocks := map[uint64]string{cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].Timelock.Address().Hex()} + proposers := map[uint64]string{cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].ProposerMcm.Address().Hex()} + inspectors := map[uint64]mcmssdk.Inspector{cfg.HomeChainSelector: mcmsevmsdk.NewInspector(e.Chains[cfg.HomeChainSelector].Client)} + batchOp, err := proposalutils.BatchOperationForChain(cfg.HomeChainSelector, state.Chains[cfg.HomeChainSelector].CCIPHome.Address().Hex(), + tx.Data(), big.NewInt(0), string(CCIPHome), []string{}) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to create batch operation: %w", err) + } + + prop, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), + timelocks, + proposers, + inspectors, + []mcmstypes.BatchOperation{batchOp}, "Update chain config", cfg.MCMS.MinDelay, ) if err != nil { return deployment.ChangesetOutput{}, err } + e.Logger.Infof("Proposed chain config update on chain %d removes %v, adds %v", cfg.HomeChainSelector, cfg.RemoteChainRemoves, cfg.RemoteChainAdds) - return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{ - *p, - }}, nil + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*prop}}, nil } func isChainConfigEqual(a, b ccip_home.CCIPHomeChainConfig) bool { diff --git a/deployment/ccip/changeset/cs_chain_contracts.go b/deployment/ccip/changeset/cs_chain_contracts.go index 2faffbfc102..4a0c15d4ff5 100644 --- a/deployment/ccip/changeset/cs_chain_contracts.go +++ b/deployment/ccip/changeset/cs_chain_contracts.go @@ -11,10 +11,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" chain_selectors "github.com/smartcontractkit/chain-selectors" + mcmslib "github.com/smartcontractkit/mcms" + mcmssdk "github.com/smartcontractkit/mcms/sdk" + mcmstypes "github.com/smartcontractkit/mcms/types" "github.com/smartcontractkit/chainlink-common/pkg/logger" @@ -143,9 +143,12 @@ func UpdateNonceManagersChangeset(e deployment.Environment, cfg UpdateNonceManag if err != nil { return deployment.ChangesetOutput{}, err } - var batches []timelock.BatchChainOperation - timelocks := make(map[uint64]common.Address) - proposers := make(map[uint64]*gethwrappers.ManyChainMultiSig) + + batches := []mcmstypes.BatchOperation{} + timelocks := make(map[uint64]string) + proposers := make(map[uint64]string) + inspectors := make(map[uint64]mcmssdk.Inspector) + for chainSel, updates := range cfg.UpdatesByChain { txOpts := e.Chains[chainSel].DeployerKey if cfg.MCMS != nil { @@ -200,39 +203,51 @@ func UpdateNonceManagersChangeset(e deployment.Environment, cfg UpdateNonceManag } } if cfg.MCMS != nil { - ops := make([]mcms.Operation, 0) + mcmsTransactions := make([]mcmstypes.Transaction, 0) if authTx != nil { - ops = append(ops, mcms.Operation{ - To: nm.Address(), - Data: authTx.Data(), - Value: big.NewInt(0), - }) + mcmsTx, err := proposalutils.TransactionForChain(chainSel, nm.Address().Hex(), authTx.Data(), big.NewInt(0), + string(NonceManager), []string{}) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to create transaction for chain %d: %w", chainSel, err) + } + + mcmsTransactions = append(mcmsTransactions, mcmsTx) } if prevRampsTx != nil { - ops = append(ops, mcms.Operation{ - To: nm.Address(), - Data: prevRampsTx.Data(), - Value: big.NewInt(0), - }) + mcmsTx, err := proposalutils.TransactionForChain(chainSel, nm.Address().Hex(), prevRampsTx.Data(), big.NewInt(0), + string(NonceManager), []string{}) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to create transaction for chain %d: %w", chainSel, err) + } + + mcmsTransactions = append(mcmsTransactions, mcmsTx) } - if len(ops) == 0 { + if len(mcmsTransactions) == 0 { return deployment.ChangesetOutput{}, errors.New("no operations to batch") } - batches = append(batches, timelock.BatchChainOperation{ - ChainIdentifier: mcms.ChainIdentifier(chainSel), - Batch: ops, + + batches = append(batches, mcmstypes.BatchOperation{ + ChainSelector: mcmstypes.ChainSelector(chainSel), + Transactions: mcmsTransactions, }) - timelocks[chainSel] = s.Chains[chainSel].Timelock.Address() - proposers[chainSel] = s.Chains[chainSel].ProposerMcm + + timelocks[chainSel] = s.Chains[chainSel].Timelock.Address().Hex() + proposers[chainSel] = s.Chains[chainSel].ProposerMcm.Address().Hex() + inspectors[chainSel], err = proposalutils.McmsInspectorForChain(e, chainSel) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get inspector for chain %d: %w", chainSel, err) + } } } if cfg.MCMS == nil { return deployment.ChangesetOutput{}, nil } - p, err := proposalutils.BuildProposalFromBatches( + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), timelocks, proposers, + inspectors, batches, "Update nonce manager for previous ramps and authorized callers", cfg.MCMS.MinDelay, @@ -240,9 +255,8 @@ func UpdateNonceManagersChangeset(e deployment.Environment, cfg UpdateNonceManag if err != nil { return deployment.ChangesetOutput{}, err } - return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{ - *p, - }}, nil + + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*proposal}}, nil } type OnRampDestinationUpdate struct { @@ -314,9 +328,12 @@ func UpdateOnRampsDestsChangeset(e deployment.Environment, cfg UpdateOnRampDests if err != nil { return deployment.ChangesetOutput{}, err } - var batches []timelock.BatchChainOperation - timelocks := make(map[uint64]common.Address) - proposers := make(map[uint64]*gethwrappers.ManyChainMultiSig) + + batches := []mcmstypes.BatchOperation{} + timelocks := make(map[uint64]string) + proposers := make(map[uint64]string) + inspectors := make(map[uint64]mcmssdk.Inspector) + for chainSel, updates := range cfg.UpdatesByChain { txOpts := e.Chains[chainSel].DeployerKey txOpts.Context = e.GetContext() @@ -350,26 +367,31 @@ func UpdateOnRampsDestsChangeset(e deployment.Environment, cfg UpdateOnRampDests if err != nil { return deployment.ChangesetOutput{}, err } - batches = append(batches, timelock.BatchChainOperation{ - ChainIdentifier: mcms.ChainIdentifier(chainSel), - Batch: []mcms.Operation{ - { - To: onRamp.Address(), - Data: tx.Data(), - Value: big.NewInt(0), - }, - }, - }) - timelocks[chainSel] = s.Chains[chainSel].Timelock.Address() - proposers[chainSel] = s.Chains[chainSel].ProposerMcm + + batchOperation, err := proposalutils.BatchOperationForChain(chainSel, onRamp.Address().Hex(), tx.Data(), + big.NewInt(0), string(OnRamp), []string{}) + if err != nil { + return deployment.ChangesetOutput{}, err + } + batches = append(batches, batchOperation) + + timelocks[chainSel] = s.Chains[chainSel].Timelock.Address().Hex() + proposers[chainSel] = s.Chains[chainSel].ProposerMcm.Address().Hex() + inspectors[chainSel], err = proposalutils.McmsInspectorForChain(e, chainSel) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get inspector for chain %d: %w", chainSel, err) + } } } if cfg.MCMS == nil { return deployment.ChangesetOutput{}, nil } - p, err := proposalutils.BuildProposalFromBatches( + + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), timelocks, proposers, + inspectors, batches, "Update onramp destinations", cfg.MCMS.MinDelay, @@ -377,9 +399,8 @@ func UpdateOnRampsDestsChangeset(e deployment.Environment, cfg UpdateOnRampDests if err != nil { return deployment.ChangesetOutput{}, err } - return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{ - *p, - }}, nil + + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*proposal}}, nil } type OnRampDynamicConfigUpdate struct { @@ -422,9 +443,12 @@ func UpdateOnRampDynamicConfigChangeset(e deployment.Environment, cfg UpdateOnRa if err := cfg.Validate(e, state); err != nil { return deployment.ChangesetOutput{}, err } - var batches []timelock.BatchChainOperation - timelocks := make(map[uint64]common.Address) - proposers := make(map[uint64]*gethwrappers.ManyChainMultiSig) + + batches := []mcmstypes.BatchOperation{} + timelocks := make(map[uint64]string) + proposers := make(map[uint64]string) + inspectors := make(map[uint64]mcmssdk.Inspector) + for chainSel, update := range cfg.UpdatesByChain { txOps := e.Chains[chainSel].DeployerKey if cfg.MCMS != nil { @@ -458,33 +482,35 @@ func UpdateOnRampDynamicConfigChangeset(e deployment.Environment, cfg UpdateOnRa if err != nil { return deployment.ChangesetOutput{}, err } - batches = append(batches, timelock.BatchChainOperation{ - ChainIdentifier: mcms.ChainIdentifier(chainSel), - Batch: []mcms.Operation{ - { - To: onRamp.Address(), - Data: tx.Data(), - Value: big.NewInt(0), - }, - }, - }) - timelocks[chainSel] = state.Chains[chainSel].Timelock.Address() - proposers[chainSel] = state.Chains[chainSel].ProposerMcm + + batchOperation, err := proposalutils.BatchOperationForChain(chainSel, onRamp.Address().Hex(), tx.Data(), + big.NewInt(0), string(OnRamp), []string{}) + if err != nil { + return deployment.ChangesetOutput{}, err + } + batches = append(batches, batchOperation) + + timelocks[chainSel] = state.Chains[chainSel].Timelock.Address().Hex() + proposers[chainSel] = state.Chains[chainSel].ProposerMcm.Address().Hex() + inspectors[chainSel], err = proposalutils.McmsInspectorForChain(e, chainSel) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get inspector for chain %d: %w", chainSel, err) + } } } if cfg.MCMS == nil { return deployment.ChangesetOutput{}, nil } - proposal, err := proposalutils.BuildProposalFromBatches( - timelocks, proposers, batches, + + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), timelocks, proposers, inspectors, batches, "update onramp dynamic config", cfg.MCMS.MinDelay) if err != nil { return deployment.ChangesetOutput{}, err } - return deployment.ChangesetOutput{ - Proposals: []timelock.MCMSWithTimelockProposal{*proposal}, - }, nil + + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*proposal}}, nil } type OnRampAllowListUpdate struct { @@ -559,9 +585,12 @@ func UpdateOnRampAllowListChangeset(e deployment.Environment, cfg UpdateOnRampAl if err != nil { return deployment.ChangesetOutput{}, err } - var batches []timelock.BatchChainOperation - timelocks := make(map[uint64]common.Address) - proposers := make(map[uint64]*gethwrappers.ManyChainMultiSig) + + batches := []mcmstypes.BatchOperation{} + timelocks := make(map[uint64]string) + proposers := make(map[uint64]string) + inspectors := make(map[uint64]mcmssdk.Inspector) + for srcSel, updates := range cfg.UpdatesByChain { txOps := e.Chains[srcSel].DeployerKey if cfg.MCMS != nil { @@ -611,26 +640,31 @@ func UpdateOnRampAllowListChangeset(e deployment.Environment, cfg UpdateOnRampAl if err != nil { return deployment.ChangesetOutput{}, err } - batches = append(batches, timelock.BatchChainOperation{ - ChainIdentifier: mcms.ChainIdentifier(srcSel), - Batch: []mcms.Operation{ - { - To: onRamp.Address(), - Data: tx.Data(), - Value: big.NewInt(0), - }, - }, - }) - timelocks[srcSel] = onchain.Chains[srcSel].Timelock.Address() - proposers[srcSel] = onchain.Chains[srcSel].ProposerMcm + + batchOperation, err := proposalutils.BatchOperationForChain(srcSel, onRamp.Address().Hex(), tx.Data(), + big.NewInt(0), string(OnRamp), []string{}) + if err != nil { + return deployment.ChangesetOutput{}, err + } + batches = append(batches, batchOperation) + + timelocks[srcSel] = onchain.Chains[srcSel].Timelock.Address().Hex() + proposers[srcSel] = onchain.Chains[srcSel].ProposerMcm.Address().Hex() + inspectors[srcSel], err = proposalutils.McmsInspectorForChain(e, srcSel) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get inspector for chain %d: %w", srcSel, err) + } } } if cfg.MCMS == nil { return deployment.ChangesetOutput{}, nil } - proposal, err := proposalutils.BuildProposalFromBatches( + + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), timelocks, proposers, + inspectors, batches, "update onramp allowlist", cfg.MCMS.MinDelay, @@ -638,9 +672,8 @@ func UpdateOnRampAllowListChangeset(e deployment.Environment, cfg UpdateOnRampAl if err != nil { return deployment.ChangesetOutput{}, err } - return deployment.ChangesetOutput{ - Proposals: []timelock.MCMSWithTimelockProposal{*proposal}, - }, nil + + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*proposal}}, nil } type WithdrawOnRampFeeTokensConfig struct { @@ -691,9 +724,12 @@ func WithdrawOnRampFeeTokensChangeset(e deployment.Environment, cfg WithdrawOnRa if err := cfg.Validate(e, state); err != nil { return deployment.ChangesetOutput{}, err } - var batches []timelock.BatchChainOperation - timelocks := make(map[uint64]common.Address) - proposers := make(map[uint64]*gethwrappers.ManyChainMultiSig) + + batches := []mcmstypes.BatchOperation{} + timelocks := make(map[uint64]string) + proposers := make(map[uint64]string) + inspectors := make(map[uint64]mcmssdk.Inspector) + for chainSel, feeTokens := range cfg.FeeTokensByChain { txOps := e.Chains[chainSel].DeployerKey onRamp := state.Chains[chainSel].OnRamp @@ -706,26 +742,31 @@ func WithdrawOnRampFeeTokensChangeset(e deployment.Environment, cfg WithdrawOnRa if err != nil { return deployment.ChangesetOutput{}, err } - batches = append(batches, timelock.BatchChainOperation{ - ChainIdentifier: mcms.ChainIdentifier(chainSel), - Batch: []mcms.Operation{ - { - To: onRamp.Address(), - Data: tx.Data(), - Value: big.NewInt(0), - }, - }, - }) - timelocks[chainSel] = state.Chains[chainSel].Timelock.Address() - proposers[chainSel] = state.Chains[chainSel].ProposerMcm + + batchOperation, err := proposalutils.BatchOperationForChain(chainSel, onRamp.Address().Hex(), tx.Data(), + big.NewInt(0), string(OnRamp), []string{}) + if err != nil { + return deployment.ChangesetOutput{}, err + } + batches = append(batches, batchOperation) + + timelocks[chainSel] = state.Chains[chainSel].Timelock.Address().Hex() + proposers[chainSel] = state.Chains[chainSel].ProposerMcm.Address().Hex() + inspectors[chainSel], err = proposalutils.McmsInspectorForChain(e, chainSel) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get inspector for chain %d: %w", chainSel, err) + } } } if cfg.MCMS == nil { return deployment.ChangesetOutput{}, nil } - proposal, err := proposalutils.BuildProposalFromBatches( + + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), timelocks, proposers, + inspectors, batches, "withdraw onramp fee tokens", cfg.MCMS.MinDelay, @@ -733,9 +774,8 @@ func WithdrawOnRampFeeTokensChangeset(e deployment.Environment, cfg WithdrawOnRa if err != nil { return deployment.ChangesetOutput{}, err } - return deployment.ChangesetOutput{ - Proposals: []timelock.MCMSWithTimelockProposal{*proposal}, - }, nil + + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*proposal}}, nil } type UpdateFeeQuoterPricesConfig struct { @@ -831,9 +871,12 @@ func UpdateFeeQuoterPricesChangeset(e deployment.Environment, cfg UpdateFeeQuote if err != nil { return deployment.ChangesetOutput{}, err } - var batches []timelock.BatchChainOperation - timelocks := make(map[uint64]common.Address) - proposers := make(map[uint64]*gethwrappers.ManyChainMultiSig) + + batches := []mcmstypes.BatchOperation{} + timelocks := make(map[uint64]string) + proposers := make(map[uint64]string) + inspectors := make(map[uint64]mcmssdk.Inspector) + for chainSel, initialPrice := range cfg.PricesByChain { txOpts := e.Chains[chainSel].DeployerKey if cfg.MCMS != nil { @@ -866,27 +909,31 @@ func UpdateFeeQuoterPricesChangeset(e deployment.Environment, cfg UpdateFeeQuote if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("error updating prices for chain %s: %w", e.Chains[chainSel].String(), err) } - batches = append(batches, timelock.BatchChainOperation{ - ChainIdentifier: mcms.ChainIdentifier(chainSel), - Batch: []mcms.Operation{ - { - To: fq.Address(), - Data: tx.Data(), - Value: big.NewInt(0), - }, - }, - }) - timelocks[chainSel] = s.Chains[chainSel].Timelock.Address() - proposers[chainSel] = s.Chains[chainSel].ProposerMcm + + batchOperation, err := proposalutils.BatchOperationForChain(chainSel, fq.Address().Hex(), tx.Data(), + big.NewInt(0), string(FeeQuoter), []string{}) + if err != nil { + return deployment.ChangesetOutput{}, err + } + batches = append(batches, batchOperation) + + timelocks[chainSel] = s.Chains[chainSel].Timelock.Address().Hex() + proposers[chainSel] = s.Chains[chainSel].ProposerMcm.Address().Hex() + inspectors[chainSel], err = proposalutils.McmsInspectorForChain(e, chainSel) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get inspector for chain %d: %w", chainSel, err) + } } } if cfg.MCMS == nil { return deployment.ChangesetOutput{}, nil } - p, err := proposalutils.BuildProposalFromBatches( + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), timelocks, proposers, + inspectors, batches, "Update fq prices", cfg.MCMS.MinDelay, @@ -894,9 +941,8 @@ func UpdateFeeQuoterPricesChangeset(e deployment.Environment, cfg UpdateFeeQuote if err != nil { return deployment.ChangesetOutput{}, err } - return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{ - *p, - }}, nil + + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*proposal}}, nil } type UpdateFeeQuoterDestsConfig struct { @@ -956,9 +1002,12 @@ func UpdateFeeQuoterDestsChangeset(e deployment.Environment, cfg UpdateFeeQuoter if err != nil { return deployment.ChangesetOutput{}, err } - var batches []timelock.BatchChainOperation - timelocks := make(map[uint64]common.Address) - proposers := make(map[uint64]*gethwrappers.ManyChainMultiSig) + + batches := []mcmstypes.BatchOperation{} + timelocks := make(map[uint64]string) + proposers := make(map[uint64]string) + inspectors := make(map[uint64]mcmssdk.Inspector) + for chainSel, updates := range cfg.UpdatesByChain { txOpts := e.Chains[chainSel].DeployerKey txOpts.Context = e.GetContext() @@ -982,27 +1031,30 @@ func UpdateFeeQuoterDestsChangeset(e deployment.Environment, cfg UpdateFeeQuoter return deployment.ChangesetOutput{}, err } } else { - batches = append(batches, timelock.BatchChainOperation{ - ChainIdentifier: mcms.ChainIdentifier(chainSel), - Batch: []mcms.Operation{ - { - To: fq.Address(), - Data: tx.Data(), - Value: big.NewInt(0), - }, - }, - }) - timelocks[chainSel] = s.Chains[chainSel].Timelock.Address() - proposers[chainSel] = s.Chains[chainSel].ProposerMcm + batchOperation, err := proposalutils.BatchOperationForChain(chainSel, fq.Address().Hex(), tx.Data(), + big.NewInt(0), string(FeeQuoter), []string{}) + if err != nil { + return deployment.ChangesetOutput{}, err + } + batches = append(batches, batchOperation) + + timelocks[chainSel] = s.Chains[chainSel].Timelock.Address().Hex() + proposers[chainSel] = s.Chains[chainSel].ProposerMcm.Address().Hex() + inspectors[chainSel], err = proposalutils.McmsInspectorForChain(e, chainSel) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get inspector for chain %d: %w", chainSel, err) + } } } if cfg.MCMS == nil { return deployment.ChangesetOutput{}, nil } - p, err := proposalutils.BuildProposalFromBatches( + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), timelocks, proposers, + inspectors, batches, "Update fq destinations", cfg.MCMS.MinDelay, @@ -1010,9 +1062,8 @@ func UpdateFeeQuoterDestsChangeset(e deployment.Environment, cfg UpdateFeeQuoter if err != nil { return deployment.ChangesetOutput{}, err } - return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{ - *p, - }}, nil + + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*proposal}}, nil } type OffRampSourceUpdate struct { @@ -1076,9 +1127,12 @@ func UpdateOffRampSourcesChangeset(e deployment.Environment, cfg UpdateOffRampSo if err := cfg.Validate(e, state); err != nil { return deployment.ChangesetOutput{}, err } - var batches []timelock.BatchChainOperation - timelocks := make(map[uint64]common.Address) - proposers := make(map[uint64]*gethwrappers.ManyChainMultiSig) + + batches := []mcmstypes.BatchOperation{} + timelocks := make(map[uint64]string) + proposers := make(map[uint64]string) + inspectors := make(map[uint64]mcmssdk.Inspector) + for chainSel, updates := range cfg.UpdatesByChain { txOpts := e.Chains[chainSel].DeployerKey txOpts.Context = e.GetContext() @@ -1123,27 +1177,31 @@ func UpdateOffRampSourcesChangeset(e deployment.Environment, cfg UpdateOffRampSo if err != nil { return deployment.ChangesetOutput{}, err } - batches = append(batches, timelock.BatchChainOperation{ - ChainIdentifier: mcms.ChainIdentifier(chainSel), - Batch: []mcms.Operation{ - { - To: offRamp.Address(), - Data: tx.Data(), - Value: big.NewInt(0), - }, - }, - }) - timelocks[chainSel] = state.Chains[chainSel].Timelock.Address() - proposers[chainSel] = state.Chains[chainSel].ProposerMcm + + batchOperation, err := proposalutils.BatchOperationForChain(chainSel, offRamp.Address().Hex(), tx.Data(), + big.NewInt(0), string(OffRamp), []string{}) + if err != nil { + return deployment.ChangesetOutput{}, err + } + batches = append(batches, batchOperation) + + timelocks[chainSel] = state.Chains[chainSel].Timelock.Address().Hex() + proposers[chainSel] = state.Chains[chainSel].ProposerMcm.Address().Hex() + inspectors[chainSel], err = proposalutils.McmsInspectorForChain(e, chainSel) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get inspector for chain %d: %w", chainSel, err) + } } } if cfg.MCMS == nil { return deployment.ChangesetOutput{}, nil } - p, err := proposalutils.BuildProposalFromBatches( + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), timelocks, proposers, + inspectors, batches, "Update offramp sources", cfg.MCMS.MinDelay, @@ -1151,9 +1209,8 @@ func UpdateOffRampSourcesChangeset(e deployment.Environment, cfg UpdateOffRampSo if err != nil { return deployment.ChangesetOutput{}, err } - return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{ - *p, - }}, nil + + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*proposal}}, nil } type RouterUpdates struct { @@ -1241,9 +1298,12 @@ func UpdateRouterRampsChangeset(e deployment.Environment, cfg UpdateRouterRampsC if err := cfg.Validate(e, state); err != nil { return deployment.ChangesetOutput{}, err } - var batches []timelock.BatchChainOperation - timelocks := make(map[uint64]common.Address) - proposers := make(map[uint64]*gethwrappers.ManyChainMultiSig) + + batches := []mcmstypes.BatchOperation{} + timelocks := make(map[uint64]string) + proposers := make(map[uint64]string) + inspectors := make(map[uint64]mcmssdk.Inspector) + for chainSel, update := range cfg.UpdatesByChain { txOpts := e.Chains[chainSel].DeployerKey txOpts.Context = e.GetContext() @@ -1297,27 +1357,31 @@ func UpdateRouterRampsChangeset(e deployment.Environment, cfg UpdateRouterRampsC if err != nil { return deployment.ChangesetOutput{}, err } - batches = append(batches, timelock.BatchChainOperation{ - ChainIdentifier: mcms.ChainIdentifier(chainSel), - Batch: []mcms.Operation{ - { - To: routerC.Address(), - Data: tx.Data(), - Value: big.NewInt(0), - }, - }, - }) - timelocks[chainSel] = state.Chains[chainSel].Timelock.Address() - proposers[chainSel] = state.Chains[chainSel].ProposerMcm + + batchOperation, err := proposalutils.BatchOperationForChain(chainSel, routerC.Address().Hex(), tx.Data(), + big.NewInt(0), string(Router), []string{}) + if err != nil { + return deployment.ChangesetOutput{}, err + } + batches = append(batches, batchOperation) + + timelocks[chainSel] = state.Chains[chainSel].Timelock.Address().Hex() + proposers[chainSel] = state.Chains[chainSel].ProposerMcm.Address().Hex() + inspectors[chainSel], err = proposalutils.McmsInspectorForChain(e, chainSel) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get inspector for chain %d: %w", chainSel, err) + } } } if cfg.MCMS == nil { return deployment.ChangesetOutput{}, nil } - p, err := proposalutils.BuildProposalFromBatches( + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), timelocks, proposers, + inspectors, batches, "Update router offramps", cfg.MCMS.MinDelay, @@ -1325,9 +1389,8 @@ func UpdateRouterRampsChangeset(e deployment.Environment, cfg UpdateRouterRampsC if err != nil { return deployment.ChangesetOutput{}, err } - return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{ - *p, - }}, nil + + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*proposal}}, nil } type SetOCR3OffRampConfig struct { @@ -1410,9 +1473,12 @@ func SetOCR3OffRampChangeset(e deployment.Environment, cfg SetOCR3OffRampConfig) if err := cfg.Validate(e, state); err != nil { return deployment.ChangesetOutput{}, err } - var batches []timelock.BatchChainOperation - timelocks := make(map[uint64]common.Address) - proposers := make(map[uint64]*gethwrappers.ManyChainMultiSig) + + batches := []mcmstypes.BatchOperation{} + timelocks := make(map[uint64]string) + proposers := make(map[uint64]string) + inspectors := make(map[uint64]mcmssdk.Inspector) + for _, remote := range cfg.RemoteChainSels { donID, err := internal.DonIDForChain( state.Chains[cfg.HomeChainSel].CapabilityRegistry, @@ -1448,26 +1514,31 @@ func SetOCR3OffRampChangeset(e deployment.Environment, cfg SetOCR3OffRampConfig) if err != nil { return deployment.ChangesetOutput{}, err } - batches = append(batches, timelock.BatchChainOperation{ - ChainIdentifier: mcms.ChainIdentifier(remote), - Batch: []mcms.Operation{ - { - To: offRamp.Address(), - Data: tx.Data(), - Value: big.NewInt(0), - }, - }, - }) - timelocks[remote] = state.Chains[remote].Timelock.Address() - proposers[remote] = state.Chains[remote].ProposerMcm + + batchOperation, err := proposalutils.BatchOperationForChain(remote, offRamp.Address().Hex(), tx.Data(), + big.NewInt(0), string(OffRamp), []string{}) + if err != nil { + return deployment.ChangesetOutput{}, err + } + batches = append(batches, batchOperation) + + timelocks[remote] = state.Chains[remote].Timelock.Address().Hex() + proposers[remote] = state.Chains[remote].ProposerMcm.Address().Hex() + inspectors[remote], err = proposalutils.McmsInspectorForChain(e, remote) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get inspector for chain %d: %w", remote, err) + } } } if cfg.MCMS == nil { return deployment.ChangesetOutput{}, nil } - p, err := proposalutils.BuildProposalFromBatches( + + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), timelocks, proposers, + inspectors, batches, "Update OCR3 config", cfg.MCMS.MinDelay, @@ -1475,10 +1546,9 @@ func SetOCR3OffRampChangeset(e deployment.Environment, cfg SetOCR3OffRampConfig) if err != nil { return deployment.ChangesetOutput{}, err } + e.Logger.Info("Proposing OCR3 config update for", cfg.RemoteChainSels) - return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{ - *p, - }}, nil + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*proposal}}, nil } type UpdateDynamicConfigOffRampConfig struct { @@ -1536,9 +1606,12 @@ func UpdateDynamicConfigOffRampChangeset(e deployment.Environment, cfg UpdateDyn if err != nil { return deployment.ChangesetOutput{}, err } - var batches []timelock.BatchChainOperation - timelocks := make(map[uint64]common.Address) - proposers := make(map[uint64]*gethwrappers.ManyChainMultiSig) + + batches := []mcmstypes.BatchOperation{} + timelocks := make(map[uint64]string) + proposers := make(map[uint64]string) + inspectors := make(map[uint64]mcmssdk.Inspector) + for chainSel, params := range cfg.Updates { chain := e.Chains[chainSel] txOpts := e.Chains[chainSel].DeployerKey @@ -1561,38 +1634,41 @@ func UpdateDynamicConfigOffRampChangeset(e deployment.Environment, cfg UpdateDyn if err != nil { return deployment.ChangesetOutput{}, err } - batches = append(batches, timelock.BatchChainOperation{ - ChainIdentifier: mcms.ChainIdentifier(chainSel), - Batch: []mcms.Operation{ - { - To: offRamp.Address(), - Data: tx.Data(), - Value: big.NewInt(0), - }, - }, - }) - timelocks[chainSel] = state.Chains[chainSel].Timelock.Address() - proposers[chainSel] = state.Chains[chainSel].ProposerMcm + + batchOperation, err := proposalutils.BatchOperationForChain(chainSel, offRamp.Address().Hex(), tx.Data(), + big.NewInt(0), string(OffRamp), []string{}) + if err != nil { + return deployment.ChangesetOutput{}, err + } + batches = append(batches, batchOperation) + + timelocks[chainSel] = state.Chains[chainSel].Timelock.Address().Hex() + proposers[chainSel] = state.Chains[chainSel].ProposerMcm.Address().Hex() + inspectors[chainSel], err = proposalutils.McmsInspectorForChain(e, chainSel) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get inspector for chain %d: %w", chainSel, err) + } } } if cfg.MCMS == nil { return deployment.ChangesetOutput{}, nil } - p, err := proposalutils.BuildProposalFromBatches( + + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), timelocks, proposers, + inspectors, batches, "Update offramp dynamic config", cfg.MCMS.MinDelay, ) - if err != nil { return deployment.ChangesetOutput{}, err } + e.Logger.Infow("Proposing offramp dynamic config update", "config", cfg.Updates) - return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{ - *p, - }}, nil + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*proposal}}, nil } func isOCR3ConfigSetOnOffRamp( diff --git a/deployment/ccip/changeset/cs_home_chain.go b/deployment/ccip/changeset/cs_home_chain.go index b3fbb990991..458356ae25c 100644 --- a/deployment/ccip/changeset/cs_home_chain.go +++ b/deployment/ccip/changeset/cs_home_chain.go @@ -10,9 +10,10 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/pkg/errors" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" + mcmslib "github.com/smartcontractkit/mcms" + mcmssdk "github.com/smartcontractkit/mcms/sdk" + mcmsevmsdk "github.com/smartcontractkit/mcms/sdk/evm" + mcmstypes "github.com/smartcontractkit/mcms/types" "golang.org/x/exp/maps" "github.com/smartcontractkit/chainlink-common/pkg/logger" @@ -468,8 +469,7 @@ func (c RemoveDONsConfig) Validate(homeChain CCIPChainState) error { } // RemoveDONs removes DONs from the CapabilitiesRegistry contract. -// TODO: Could likely be moved to common, but needs -// a common state struct first. +// TODO: Could likely be moved to common, but needs a common state struct first. func RemoveDONs(e deployment.Environment, cfg RemoveDONsConfig) (deployment.ChangesetOutput, error) { state, err := LoadOnchainState(e) if err != nil { @@ -500,33 +500,31 @@ func RemoveDONs(e deployment.Environment, cfg RemoveDONsConfig) (deployment.Chan e.Logger.Infof("Removed dons using deployer key tx %s", tx.Hash().String()) return deployment.ChangesetOutput{}, nil } - p, err := proposalutils.BuildProposalFromBatches( - map[uint64]common.Address{ - cfg.HomeChainSel: homeChainState.Timelock.Address(), - }, - map[uint64]*gethwrappers.ManyChainMultiSig{ - cfg.HomeChainSel: homeChainState.ProposerMcm, - }, - []timelock.BatchChainOperation{ - { - ChainIdentifier: mcms.ChainIdentifier(cfg.HomeChainSel), - Batch: []mcms.Operation{ - { - To: homeChainState.CapabilityRegistry.Address(), - Data: tx.Data(), - Value: big.NewInt(0), - }, - }, - }, - }, + + batchOperation, err := proposalutils.BatchOperationForChain(cfg.HomeChainSel, + homeChainState.CapabilityRegistry.Address().Hex(), tx.Data(), big.NewInt(0), + string(CapabilitiesRegistry), []string{}) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to create batch operation for home chain: %w", err) + } + + timelocks := map[uint64]string{cfg.HomeChainSel: homeChainState.Timelock.Address().Hex()} + proposerMcms := map[uint64]string{cfg.HomeChainSel: homeChainState.ProposerMcm.Address().Hex()} + inspectors := map[uint64]mcmssdk.Inspector{cfg.HomeChainSel: mcmsevmsdk.NewInspector(homeChain.Client)} + + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), + timelocks, + proposerMcms, + inspectors, + []mcmstypes.BatchOperation{batchOperation}, "Remove DONs", cfg.MCMS.MinDelay, ) if err != nil { return deployment.ChangesetOutput{}, err } + e.Logger.Infof("Created proposal to remove dons") - return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{ - *p, - }}, nil + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*proposal}}, nil } diff --git a/deployment/ccip/changeset/cs_update_rmn_config.go b/deployment/ccip/changeset/cs_update_rmn_config.go index a543b622354..b935190fc62 100644 --- a/deployment/ccip/changeset/cs_update_rmn_config.go +++ b/deployment/ccip/changeset/cs_update_rmn_config.go @@ -9,8 +9,9 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" + mcmslib "github.com/smartcontractkit/mcms" + mcmssdk "github.com/smartcontractkit/mcms/sdk" + mcmstypes "github.com/smartcontractkit/mcms/types" "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" @@ -62,42 +63,46 @@ func SetRMNRemoteOnRMNProxyChangeset(e deployment.Environment, cfg SetRMNRemoteO if err := cfg.Validate(state); err != nil { return deployment.ChangesetOutput{}, err } - timelocks, err := state.GetAllTimeLocksForChains(cfg.ChainSelectors) - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to get timelocks for chains %v: %w", cfg.ChainSelectors, err) - } - multiSigs, err := state.GetAllProposerMCMSForChains(cfg.ChainSelectors) - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to get proposer MCMS for chains %v: %w", cfg.ChainSelectors, err) - } - var timelockBatch []timelock.BatchChainOperation + + timelocks := BuildTimelockAddressPerChain(e, state) + proposerMcms := BuildProposerMcmAddressesPerChain(e, state) + + inspectors := map[uint64]mcmssdk.Inspector{} + timelockBatch := []mcmstypes.BatchOperation{} for _, sel := range cfg.ChainSelectors { chain, exists := e.Chains[sel] if !exists { return deployment.ChangesetOutput{}, fmt.Errorf("chain %d not found", sel) } + + inspectors[sel], err = proposalutils.McmsInspectorForChain(e, sel) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get mcms inspector for chain %s: %w", chain.String(), err) + } + txOpts := chain.DeployerKey if cfg.MCMSConfig != nil { txOpts = deployment.SimTransactOpts() } - mcmsOps, err := setRMNRemoteOnRMNProxyOp(txOpts, chain, state.Chains[sel], cfg.MCMSConfig != nil) + batchOperation, err := setRMNRemoteOnRMNProxyOp(txOpts, chain, state.Chains[sel], cfg.MCMSConfig != nil) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to set RMNRemote on RMNProxy for chain %s: %w", chain.String(), err) } + if cfg.MCMSConfig != nil { - timelockBatch = append(timelockBatch, timelock.BatchChainOperation{ - ChainIdentifier: mcms.ChainIdentifier(sel), - Batch: []mcms.Operation{mcmsOps}, - }) + timelockBatch = append(timelockBatch, batchOperation) } } // If we're not using MCMS, we can just return now as we've already confirmed the transactions if len(timelockBatch) == 0 { return deployment.ChangesetOutput{}, nil } - prop, err := proposalutils.BuildProposalFromBatches( + + prop, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), timelocks, - multiSigs, + proposerMcms, + inspectors, timelockBatch, fmt.Sprintf("proposal to set RMNRemote on RMNProxy for chains %v", cfg.ChainSelectors), cfg.MCMSConfig.MinDelay, @@ -106,30 +111,35 @@ func SetRMNRemoteOnRMNProxyChangeset(e deployment.Environment, cfg SetRMNRemoteO return deployment.ChangesetOutput{}, err } return deployment.ChangesetOutput{ - Proposals: []timelock.MCMSWithTimelockProposal{ + MCMSTimelockProposals: []mcmslib.TimelockProposal{ *prop, }, }, nil } -func setRMNRemoteOnRMNProxyOp(txOpts *bind.TransactOpts, chain deployment.Chain, chainState CCIPChainState, mcmsEnabled bool) (mcms.Operation, error) { +func setRMNRemoteOnRMNProxyOp( + txOpts *bind.TransactOpts, chain deployment.Chain, chainState CCIPChainState, mcmsEnabled bool, +) (mcmstypes.BatchOperation, error) { rmnProxy := chainState.RMNProxy rmnRemoteAddr := chainState.RMNRemote.Address() setRMNTx, err := rmnProxy.SetARM(txOpts, rmnRemoteAddr) if err != nil { - return mcms.Operation{}, fmt.Errorf("failed to build call data/transaction to set RMNRemote on RMNProxy for chain %s: %w", chain.String(), err) + return mcmstypes.BatchOperation{}, fmt.Errorf("failed to build call data/transaction to set RMNRemote on RMNProxy for chain %s: %w", chain.String(), err) } if !mcmsEnabled { _, err = deployment.ConfirmIfNoErrorWithABI(chain, setRMNTx, rmn_proxy_contract.RMNProxyABI, err) if err != nil { - return mcms.Operation{}, fmt.Errorf("failed to confirm tx to set RMNRemote on RMNProxy for chain %s: %w", chain.String(), deployment.MaybeDataErr(err)) + return mcmstypes.BatchOperation{}, fmt.Errorf("failed to confirm tx to set RMNRemote on RMNProxy for chain %s: %w", chain.String(), deployment.MaybeDataErr(err)) } } - return mcms.Operation{ - To: rmnProxy.Address(), - Data: setRMNTx.Data(), - Value: big.NewInt(0), - }, nil + + batchOperation, err := proposalutils.BatchOperationForChain(chain.Selector, rmnProxy.Address().Hex(), + setRMNTx.Data(), big.NewInt(0), string(RMN), []string{}) + if err != nil { + return mcmstypes.BatchOperation{}, fmt.Errorf("failed to create batch operation for chain%s: %w", chain.String(), err) + } + + return batchOperation, nil } type RMNNopConfig struct { @@ -347,7 +357,6 @@ func SetRMNHomeCandidateConfigChangeset(e deployment.Environment, config SetRMNH if config.MCMSConfig == nil { chain := e.Chains[config.HomeChainSelector] _, err := chain.Confirm(setCandidateTx) - if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm tx for chain %s: %w", homeChain.String(), deployment.MaybeDataErr(err)) } @@ -355,38 +364,33 @@ func SetRMNHomeCandidateConfigChangeset(e deployment.Environment, config SetRMNH return deployment.ChangesetOutput{}, nil } - op := mcms.Operation{ - To: rmnHome.Address(), - Data: setCandidateTx.Data(), - Value: big.NewInt(0), + operation, err := proposalutils.BatchOperationForChain(homeChain.Selector, rmnHome.Address().Hex(), + setCandidateTx.Data(), big.NewInt(0), string(RMN), []string{}) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to create batch operation for chain %s: %w", homeChain.String(), err) } - batches := []timelock.BatchChainOperation{ - { - ChainIdentifier: mcms.ChainIdentifier(config.HomeChainSelector), - Batch: []mcms.Operation{op}, - }, + timelocks := BuildTimelockAddressPerChain(e, state) + proposerMcms := BuildProposerMcmAddressesPerChain(e, state) + inspectors, err := proposalutils.McmsInspectors(e) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get mcms inspector for chain %s: %w", homeChain.String(), err) } - timelocksPerChain := BuildTimelockAddressPerChain(e, state) - - proposerMCMSes := BuildProposerPerChain(e, state) - - prop, err := proposalutils.BuildProposalFromBatches( - timelocksPerChain, - proposerMCMSes, - batches, + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), + timelocks, + proposerMcms, + inspectors, + []mcmstypes.BatchOperation{operation}, "proposal to set candidate config", config.MCMSConfig.MinDelay, ) - if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to build proposal for chain %s: %w", homeChain.String(), err) } - return deployment.ChangesetOutput{ - Proposals: []timelock.MCMSWithTimelockProposal{*prop}, - }, nil + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*proposal}}, nil } func PromoteRMNHomeCandidateConfigChangeset(e deployment.Environment, config PromoteRMNHomeCandidateConfig) (deployment.ChangesetOutput, error) { @@ -430,7 +434,6 @@ func PromoteRMNHomeCandidateConfigChangeset(e deployment.Environment, config Pro if config.MCMSConfig == nil { chain := e.Chains[config.HomeChainSelector] _, err := chain.Confirm(promoteCandidateTx) - if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm tx for chain %s: %w", homeChain.String(), deployment.MaybeDataErr(err)) } @@ -438,37 +441,36 @@ func PromoteRMNHomeCandidateConfigChangeset(e deployment.Environment, config Pro return deployment.ChangesetOutput{}, nil } - op := mcms.Operation{ - To: rmnHome.Address(), - Data: promoteCandidateTx.Data(), - Value: big.NewInt(0), - } - - batches := []timelock.BatchChainOperation{ - { - ChainIdentifier: mcms.ChainIdentifier(config.HomeChainSelector), - Batch: []mcms.Operation{op}, - }, + operation, err := proposalutils.BatchOperationForChain(homeChain.Selector, rmnHome.Address().Hex(), + promoteCandidateTx.Data(), big.NewInt(0), string(RMN), []string{}) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to create batch operation for chain %s: %w", homeChain.String(), err) } - timelocksPerChain := BuildTimelockAddressPerChain(e, state) + timelocks := BuildTimelockAddressPerChain(e, state) + proposerMcms := BuildProposerMcmAddressesPerChain(e, state) - proposerMCMSes := BuildProposerPerChain(e, state) + inspectors := map[uint64]mcmssdk.Inspector{} + inspectors[config.HomeChainSelector], err = proposalutils.McmsInspectorForChain(e, config.HomeChainSelector) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get mcms inspector for chain %s: %w", homeChain.String(), err) + } - prop, err := proposalutils.BuildProposalFromBatches( - timelocksPerChain, - proposerMCMSes, - batches, + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), + timelocks, + proposerMcms, + inspectors, + []mcmstypes.BatchOperation{operation}, "proposal to promote candidate config", config.MCMSConfig.MinDelay, ) - if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to build proposal for chain %s: %w", homeChain.String(), err) } return deployment.ChangesetOutput{ - Proposals: []timelock.MCMSWithTimelockProposal{*prop}, + MCMSTimelockProposals: []mcmslib.TimelockProposal{*proposal}, }, nil } @@ -693,7 +695,7 @@ func SetRMNRemoteConfigChangeset(e deployment.Environment, config SetRMNRemoteCo } rmnRemotePerChain := BuildRMNRemotePerChain(e, state) - batches := make([]timelock.BatchChainOperation, 0) + batches := make([]mcmstypes.BatchOperation, 0) for chain, remoteConfig := range config.RMNRemoteConfigs { remote, ok := rmnRemotePerChain[chain] if !ok { @@ -731,31 +733,31 @@ func SetRMNRemoteConfigChangeset(e deployment.Environment, config SetRMNRemoteCo } } - op := mcms.Operation{ - To: remote.Address(), - Data: tx.Data(), - Value: big.NewInt(0), - } - - batch := timelock.BatchChainOperation{ - ChainIdentifier: mcms.ChainIdentifier(chain), - Batch: []mcms.Operation{op}, + operation, err := proposalutils.BatchOperationForChain(e.Chains[chain].Selector, remote.Address().Hex(), + tx.Data(), big.NewInt(0), string(RMN), []string{}) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to create batch operation for chain %s: %w", homeChain.String(), err) } - batches = append(batches, batch) + batches = append(batches, operation) } if config.MCMSConfig == nil { return deployment.ChangesetOutput{}, nil } - timelocksPerChain := BuildTimelockAddressPerChain(e, state) - - proposerMCMSes := BuildProposerPerChain(e, state) + timelocks := BuildTimelockAddressPerChain(e, state) + proposerMcms := BuildProposerMcmAddressesPerChain(e, state) + inspectors, err := proposalutils.McmsInspectors(e) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get mcms inspector for chain %s: %w", homeChain.String(), err) + } - prop, err := proposalutils.BuildProposalFromBatches( - timelocksPerChain, - proposerMCMSes, + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), + timelocks, + proposerMcms, + inspectors, batches, "proposal to promote candidate config", config.MCMSConfig.MinDelay, @@ -765,7 +767,5 @@ func SetRMNRemoteConfigChangeset(e deployment.Environment, config SetRMNRemoteCo return deployment.ChangesetOutput{}, fmt.Errorf("failed to build proposal for chain %s: %w", homeChain.String(), err) } - return deployment.ChangesetOutput{ - Proposals: []timelock.MCMSWithTimelockProposal{*prop}, - }, nil + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{*proposal}}, nil } diff --git a/deployment/ccip/changeset/deployer_group.go b/deployment/ccip/changeset/deployer_group.go index 6f3732a760b..84610b4b007 100644 --- a/deployment/ccip/changeset/deployer_group.go +++ b/deployment/ccip/changeset/deployer_group.go @@ -12,9 +12,8 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" + mcmslib "github.com/smartcontractkit/mcms" + mcmstypes "github.com/smartcontractkit/mcms/types" "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" @@ -201,21 +200,22 @@ func (d *DeployerGroup) Enact() (deployment.ChangesetOutput, error) { func (d *DeployerGroup) enactMcms() (deployment.ChangesetOutput, error) { contexts := d.getContextChainInOrder() - proposals := make([]timelock.MCMSWithTimelockProposal, 0) + proposals := make([]mcmslib.TimelockProposal, 0) for _, dc := range contexts { - batches := make([]timelock.BatchChainOperation, 0) + batches := make([]mcmstypes.BatchOperation, 0) for selector, txs := range dc.transactions { - mcmOps := make([]mcms.Operation, len(txs)) + mcmTransactions := make([]mcmstypes.Transaction, len(txs)) for i, tx := range txs { - mcmOps[i] = mcms.Operation{ - To: *tx.To(), - Data: tx.Data(), - Value: tx.Value(), + var err error + mcmTransactions[i], err = proposalutils.TransactionForChain(selector, tx.To().Hex(), tx.Data(), tx.Value(), "", []string{}) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to build mcms transaction: %w", err) } } - batches = append(batches, timelock.BatchChainOperation{ - ChainIdentifier: mcms.ChainIdentifier(selector), - Batch: mcmOps, + + batches = append(batches, mcmstypes.BatchOperation{ + ChainSelector: mcmstypes.ChainSelector(selector), + Transactions: mcmTransactions, }) } @@ -224,50 +224,53 @@ func (d *DeployerGroup) enactMcms() (deployment.ChangesetOutput, error) { continue } - timelocksPerChain := BuildTimelockAddressPerChain(d.e, d.state) - - proposerMCMSes := BuildProposerPerChain(d.e, d.state) + timelocks := BuildTimelockAddressPerChain(d.e, d.state) + proposerMcms := BuildProposerMcmAddressesPerChain(d.e, d.state) + inspectors, err := proposalutils.McmsInspectors(d.e) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get mcms inspector for chain: %w", err) + } - prop, err := proposalutils.BuildProposalFromBatches( - timelocksPerChain, - proposerMCMSes, + proposal, err := proposalutils.BuildProposalFromBatchesV2( + d.e.GetContext(), + timelocks, + proposerMcms, + inspectors, batches, dc.description, d.mcmConfig.MinDelay, ) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to build proposal %w", err) + } // Update the proposal metadata to incorporate the startingOpCount // from the previous proposal if len(proposals) > 0 { previousProposal := proposals[len(proposals)-1] for chain, metadata := range previousProposal.ChainMetadata { - nextStartingOp := metadata.StartingOpCount + getBatchCountForChain(chain, prop) - prop.ChainMetadata[chain] = mcms.ChainMetadata{ + nextStartingOp := metadata.StartingOpCount + getBatchCountForChain(chain, proposal) + proposal.ChainMetadata[chain] = mcmstypes.ChainMetadata{ StartingOpCount: nextStartingOp, - MCMAddress: prop.ChainMetadata[chain].MCMAddress, + MCMAddress: proposal.ChainMetadata[chain].MCMAddress, } } } - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to build proposal %w", err) - } - - proposals = append(proposals, *prop) + proposals = append(proposals, *proposal) } - return deployment.ChangesetOutput{ - Proposals: proposals, - }, nil + return deployment.ChangesetOutput{MCMSTimelockProposals: proposals}, nil } -func getBatchCountForChain(chain mcms.ChainIdentifier, m *timelock.MCMSWithTimelockProposal) uint64 { - batches := make([]timelock.BatchChainOperation, 0) - for _, t := range m.Transactions { - if t.ChainIdentifier == chain { - batches = append(batches, t) +func getBatchCountForChain(chain mcmstypes.ChainSelector, timelockProposal *mcmslib.TimelockProposal) uint64 { + batches := make([]mcmstypes.BatchOperation, 0) + for _, batchOperation := range timelockProposal.Operations { + if batchOperation.ChainSelector == chain { + batches = append(batches, batchOperation) } } + return uint64(len(batches)) } @@ -310,19 +313,18 @@ func BuildTimelockPerChain(e deployment.Environment, state CCIPOnChainState) map return timelocksPerChain } -func BuildTimelockAddressPerChain(e deployment.Environment, state CCIPOnChainState) map[uint64]common.Address { - timelocksPerChain := BuildTimelockPerChain(e, state) - timelockAddressPerChain := make(map[uint64]common.Address) - for chain, timelock := range timelocksPerChain { - timelockAddressPerChain[chain] = timelock.Timelock.Address() +func BuildTimelockAddressPerChain(e deployment.Environment, state CCIPOnChainState) map[uint64]string { + addressPerChain := make(map[uint64]string) + for _, chain := range e.Chains { + addressPerChain[chain.Selector] = state.Chains[chain.Selector].Timelock.Address().Hex() } - return timelockAddressPerChain + return addressPerChain } -func BuildProposerPerChain(e deployment.Environment, state CCIPOnChainState) map[uint64]*gethwrappers.ManyChainMultiSig { - proposerPerChain := make(map[uint64]*gethwrappers.ManyChainMultiSig) +func BuildProposerMcmAddressesPerChain(e deployment.Environment, state CCIPOnChainState) map[uint64]string { + addressPerChain := make(map[uint64]string) for _, chain := range e.Chains { - proposerPerChain[chain.Selector] = state.Chains[chain.Selector].ProposerMcm + addressPerChain[chain.Selector] = state.Chains[chain.Selector].ProposerMcm.Address().Hex() } - return proposerPerChain + return addressPerChain } diff --git a/deployment/ccip/changeset/deployer_group_test.go b/deployment/ccip/changeset/deployer_group_test.go index 21f6688c815..cd58633df7c 100644 --- a/deployment/ccip/changeset/deployer_group_test.go +++ b/deployment/ccip/changeset/deployer_group_test.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms" + mcmstypes "github.com/smartcontractkit/mcms/types" "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" @@ -331,13 +331,13 @@ func TestDeployerGroupGenerateMultipleProposals(t *testing.T) { cs, err := dummyDeployerGroupMintMultiDeploymentContextChangeset(e.Env, tc) require.NoError(t, err) - require.Len(t, cs.Proposals, len(tc.mints)) - require.Equal(t, "mint tokens 1", cs.Proposals[0].Description) - require.Equal(t, "mint tokens 2", cs.Proposals[1].Description) - require.Equal(t, "mint tokens 3", cs.Proposals[2].Description) - require.Equal(t, uint64(2), cs.Proposals[0].ChainMetadata[mcms.ChainIdentifier(e.Env.AllChainSelectors()[tc.mints[0].selectorIndex])].StartingOpCount) - require.Equal(t, uint64(3), cs.Proposals[1].ChainMetadata[mcms.ChainIdentifier(e.Env.AllChainSelectors()[tc.mints[1].selectorIndex])].StartingOpCount) - require.Equal(t, uint64(2), cs.Proposals[2].ChainMetadata[mcms.ChainIdentifier(e.Env.AllChainSelectors()[tc.mints[2].selectorIndex])].StartingOpCount) + require.Len(t, cs.MCMSTimelockProposals, len(tc.mints)) + require.Equal(t, "mint tokens 1", cs.MCMSTimelockProposals[0].Description) + require.Equal(t, "mint tokens 2", cs.MCMSTimelockProposals[1].Description) + require.Equal(t, "mint tokens 3", cs.MCMSTimelockProposals[2].Description) + require.Equal(t, uint64(2), cs.MCMSTimelockProposals[0].ChainMetadata[mcmstypes.ChainSelector(e.Env.AllChainSelectors()[tc.mints[0].selectorIndex])].StartingOpCount) + require.Equal(t, uint64(3), cs.MCMSTimelockProposals[1].ChainMetadata[mcmstypes.ChainSelector(e.Env.AllChainSelectors()[tc.mints[1].selectorIndex])].StartingOpCount) + require.Equal(t, uint64(2), cs.MCMSTimelockProposals[2].ChainMetadata[mcmstypes.ChainSelector(e.Env.AllChainSelectors()[tc.mints[2].selectorIndex])].StartingOpCount) } func TestDeployerGroupMultipleProposalsMCMS(t *testing.T) { @@ -424,5 +424,5 @@ func TestEmptyBatch(t *testing.T) { result, err := dummyEmptyBatchChangeset(e.Env, cfg) require.NoError(t, err) - require.Empty(t, result.Proposals) + require.Empty(t, result.MCMSTimelockProposals) } diff --git a/deployment/ccip/changeset/v1_5/cs_rmn.go b/deployment/ccip/changeset/v1_5/cs_rmn.go index 539dc5f4d5c..1245d907d81 100644 --- a/deployment/ccip/changeset/v1_5/cs_rmn.go +++ b/deployment/ccip/changeset/v1_5/cs_rmn.go @@ -7,9 +7,9 @@ import ( "slices" "github.com/ethereum/go-ethereum/common" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" + mcmslib "github.com/smartcontractkit/mcms" + mcmssdk "github.com/smartcontractkit/mcms/sdk" + mcmstypes "github.com/smartcontractkit/mcms/types" "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" @@ -104,18 +104,22 @@ func PermaBlessCommitStoreChangeset(env deployment.Environment, c PermaBlessComm if err := c.Validate(env); err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("invalid PermaBlessCommitStoreConfig: %w", err) } + state, err := changeset.LoadOnchainState(env) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } - ops := make([]timelock.BatchChainOperation, 0) - timelocks := make(map[uint64]common.Address) - proposerMCM := make(map[uint64]*gethwrappers.ManyChainMultiSig) + + ops := make([]mcmstypes.BatchOperation, 0) + timelocks := make(map[uint64]string) + proposerMcms := make(map[uint64]string) + inspectors := make(map[uint64]mcmssdk.Inspector) + for destChain, cfg := range c.Configs { destState := state.Chains[destChain] RMN := destState.RMN - var removes []common.Address - var adds []common.Address + + var removes, adds []common.Address for _, sourceCfg := range cfg.Sources { commitStore := destState.CommitStore[sourceCfg.SourceChainSelector] if sourceCfg.PermaBless { @@ -124,11 +128,16 @@ func PermaBlessCommitStoreChangeset(env deployment.Environment, c PermaBlessComm removes = append(removes, commitStore.Address()) } } + txOpts := env.Chains[destChain].DeployerKey if c.MCMSConfig != nil { txOpts = deployment.SimTransactOpts() } tx, err := RMN.OwnerRemoveThenAddPermaBlessedCommitStores(txOpts, removes, adds) + if err != nil { + return deployment.ChangesetOutput{}, err + } + if c.MCMSConfig == nil { _, err = deployment.ConfirmIfNoErrorWithABI(env.Chains[destChain], tx, rmn_contract.RMNContractABI, err) if err != nil { @@ -137,25 +146,31 @@ func PermaBlessCommitStoreChangeset(env deployment.Environment, c PermaBlessComm env.Logger.Infof("PermaBlessed commit stores on chain %d removed %v, added %v", destChain, removes, adds) continue } - timelocks[destChain] = destState.Timelock.Address() - proposerMCM[destChain] = destState.ProposerMcm - ops = append(ops, timelock.BatchChainOperation{ - ChainIdentifier: mcms.ChainIdentifier(destChain), - Batch: []mcms.Operation{ - { - To: RMN.Address(), - Data: tx.Data(), - Value: big.NewInt(0), - }, - }, - }) + + timelocks[destChain] = destState.Timelock.Address().Hex() + proposerMcms[destChain] = destState.ProposerMcm.Address().Hex() + inspectors[destChain], err = proposalutils.McmsInspectorForChain(env, destChain) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get inspector for chain %d: %w", destChain, err) + } + + batchOperation, err := proposalutils.BatchOperationForChain(destChain, RMN.Address().Hex(), tx.Data(), big.NewInt(0), + string(changeset.RMN), []string{}) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to create batch operation for chain %d: %w", destChain, err) + } + + ops = append(ops, batchOperation) } if c.MCMSConfig == nil { return deployment.ChangesetOutput{}, nil } - p, err := proposalutils.BuildProposalFromBatches( + + timelockProposal, err := proposalutils.BuildProposalFromBatchesV2( + env.GetContext(), timelocks, - proposerMCM, + proposerMcms, + inspectors, ops, "PermaBless commit stores on RMN", c.MCMSConfig.MinDelay, @@ -163,8 +178,9 @@ func PermaBlessCommitStoreChangeset(env deployment.Environment, c PermaBlessComm if err != nil { return deployment.ChangesetOutput{}, err } + env.Logger.Infof("perma bless commit stores proposal created with %d operations", len(ops)) - return deployment.ChangesetOutput{Proposals: []timelock.MCMSWithTimelockProposal{ - *p, + return deployment.ChangesetOutput{MCMSTimelockProposals: []mcmslib.TimelockProposal{ + *timelockProposal, }}, nil } diff --git a/deployment/common/proposalutils/mcms_test_helpers.go b/deployment/common/proposalutils/mcms_test_helpers.go index a3e3047fa2e..c5a62193872 100644 --- a/deployment/common/proposalutils/mcms_test_helpers.go +++ b/deployment/common/proposalutils/mcms_test_helpers.go @@ -4,6 +4,7 @@ import ( "crypto/ecdsa" "fmt" "math/big" + "slices" "testing" "time" @@ -278,7 +279,8 @@ func ExecuteMCMSTimelockProposalV2(t *testing.T, env deployment.Environment, tim // build a "chainSelector => executor" map executorsMap := map[mcmstypes.ChainSelector]mcmssdk.TimelockExecutor{} - for _, op := range timelockProposal.Operations { + callProxies := make([]string, len(timelockProposal.Operations)) + for i, op := range timelockProposal.Operations { family, err := chainsel.GetSelectorFamily(uint64(op.ChainSelector)) require.NoError(t, err) @@ -287,10 +289,13 @@ func ExecuteMCMSTimelockProposalV2(t *testing.T, env deployment.Environment, tim executorsMap[op.ChainSelector] = mcmsevmsdk.NewTimelockExecutor( env.Chains[uint64(op.ChainSelector)].Client, env.Chains[uint64(op.ChainSelector)].DeployerKey) + callProxies[i] = findCallProxyAddress(t, env, uint64(op.ChainSelector)) + case chainsel.FamilySolana: executorsMap[op.ChainSelector] = mcmssolanasdk.NewTimelockExecutor( env.SolChains[uint64(op.ChainSelector)].Client, *env.SolChains[uint64(op.ChainSelector)].DeployerKey) + default: require.FailNow(t, "unsupported chain family") } @@ -306,7 +311,12 @@ func ExecuteMCMSTimelockProposalV2(t *testing.T, env deployment.Environment, tim // execute each operation sequentially var tx = mcmstypes.TransactionResult{} for i, op := range timelockProposal.Operations { - tx, err = timelockExecutable.Execute(env.GetContext(), i, opts...) + opOpts := slices.Clone(opts) + if callProxies[i] != "" { + opOpts = append(opOpts, mcmslib.WithCallProxy(callProxies[i])) + } + + tx, err = timelockExecutable.Execute(env.GetContext(), i, opOpts...) if err != nil { return fmt.Errorf("[ExecuteMCMSTimelockProposalV2] Execute failed: %w", err) } @@ -345,3 +355,17 @@ func SingleGroupTimelockConfigV2(t *testing.T) commontypes.MCMSWithTimelockConfi TimelockMinDelay: big.NewInt(0), } } + +func findCallProxyAddress(t *testing.T, env deployment.Environment, chainSelector uint64) string { + addressesForChain, err := env.ExistingAddresses.AddressesForChain(chainSelector) + require.NoError(t, err) + + for address, tvStr := range addressesForChain { + if tvStr.Type == commontypes.CallProxy && tvStr.Version == deployment.Version1_0_0 { + return address + } + } + + require.FailNow(t, "unable to find call proxy address") + return "" +} From 8e1480cde627cabd12ac72578b995efc56eaad16 Mon Sep 17 00:00:00 2001 From: gustavogama-cll <165679773+gustavogama-cll@users.noreply.github.com> Date: Wed, 19 Feb 2025 23:24:52 -0300 Subject: [PATCH 02/58] fix(deployment): add labels to the MCMSWithTimelockConfigV2 type (#16487) --- .../common/changeset/internal/evm/mcms.go | 46 ++++++++++-- .../changeset/internal/evm/mcms_test.go | 73 +++++++++++++++++++ deployment/common/types/types.go | 1 + 3 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 deployment/common/changeset/internal/evm/mcms_test.go diff --git a/deployment/common/changeset/internal/evm/mcms.go b/deployment/common/changeset/internal/evm/mcms.go index 8346f0d0e75..a310706ea6f 100644 --- a/deployment/common/changeset/internal/evm/mcms.go +++ b/deployment/common/changeset/internal/evm/mcms.go @@ -13,6 +13,16 @@ import ( "github.com/smartcontractkit/chainlink/deployment/common/view/v1_0" ) +// DeployMCMSOption is a function that modifies a TypeAndVersion before or after deployment. +type DeployMCMSOption func(*deployment.TypeAndVersion) + +// WithLabel is a functional option that sets a label on the TypeAndVersion. +func WithLabel(label string) DeployMCMSOption { + return func(tv *deployment.TypeAndVersion) { + tv.AddLabel(label) + } +} + // MCMSWithTimelockEVMDeploy holds a bundle of MCMS contract deploys. type MCMSWithTimelockEVMDeploy struct { Canceller *deployment.ContractDeploy[*bindings.ManyChainMultiSig] @@ -28,6 +38,7 @@ func deployMCMSWithConfigEVM( chain deployment.Chain, ab deployment.AddressBook, mcmConfig mcmsTypes.Config, + options ...DeployMCMSOption, ) (*deployment.ContractDeploy[*bindings.ManyChainMultiSig], error) { groupQuorums, groupParents, signerAddresses, signerGroups, err := evmMcms.ExtractSetConfigInputs(&mcmConfig) if err != nil { @@ -40,8 +51,14 @@ func deployMCMSWithConfigEVM( chain.DeployerKey, chain.Client, ) + + tv := deployment.NewTypeAndVersion(contractType, deployment.Version1_0_0) + for _, option := range options { + option(&tv) + } + return deployment.ContractDeploy[*bindings.ManyChainMultiSig]{ - Address: mcmAddr, Contract: mcm, Tx: tx, Tv: deployment.NewTypeAndVersion(contractType, deployment.Version1_0_0), Err: err2, + Address: mcmAddr, Contract: mcm, Tx: tx, Tv: tv, Err: err2, } }) if err != nil { @@ -74,15 +91,20 @@ func DeployMCMSWithTimelockContractsEVM( ab deployment.AddressBook, config commontypes.MCMSWithTimelockConfigV2, ) (*MCMSWithTimelockEVMDeploy, error) { - bypasser, err := deployMCMSWithConfigEVM(commontypes.BypasserManyChainMultisig, lggr, chain, ab, config.Bypasser) + opts := []DeployMCMSOption{} + if config.Label != nil { + opts = append(opts, WithLabel(*config.Label)) + } + + bypasser, err := deployMCMSWithConfigEVM(commontypes.BypasserManyChainMultisig, lggr, chain, ab, config.Bypasser, opts...) if err != nil { return nil, err } - canceller, err := deployMCMSWithConfigEVM(commontypes.CancellerManyChainMultisig, lggr, chain, ab, config.Canceller) + canceller, err := deployMCMSWithConfigEVM(commontypes.CancellerManyChainMultisig, lggr, chain, ab, config.Canceller, opts...) if err != nil { return nil, err } - proposer, err := deployMCMSWithConfigEVM(commontypes.ProposerManyChainMultisig, lggr, chain, ab, config.Proposer) + proposer, err := deployMCMSWithConfigEVM(commontypes.ProposerManyChainMultisig, lggr, chain, ab, config.Proposer, opts...) if err != nil { return nil, err } @@ -104,8 +126,14 @@ func DeployMCMSWithTimelockContractsEVM( []common.Address{canceller.Address, proposer.Address, bypasser.Address}, // cancellers []common.Address{bypasser.Address}, // bypassers ) + + tv := deployment.NewTypeAndVersion(commontypes.RBACTimelock, deployment.Version1_0_0) + if config.Label != nil { + tv.AddLabel(*config.Label) + } + return deployment.ContractDeploy[*bindings.RBACTimelock]{ - Address: timelock, Contract: cc, Tx: tx2, Tv: deployment.NewTypeAndVersion(commontypes.RBACTimelock, deployment.Version1_0_0), Err: err2, + Address: timelock, Contract: cc, Tx: tx2, Tv: tv, Err: err2, } }) if err != nil { @@ -120,8 +148,14 @@ func DeployMCMSWithTimelockContractsEVM( chain.Client, timelock.Address, ) + + tv := deployment.NewTypeAndVersion(commontypes.CallProxy, deployment.Version1_0_0) + if config.Label != nil { + tv.AddLabel(*config.Label) + } + return deployment.ContractDeploy[*bindings.CallProxy]{ - Address: callProxy, Contract: cc, Tx: tx2, Tv: deployment.NewTypeAndVersion(commontypes.CallProxy, deployment.Version1_0_0), Err: err2, + Address: callProxy, Contract: cc, Tx: tx2, Tv: tv, Err: err2, } }) if err != nil { diff --git a/deployment/common/changeset/internal/evm/mcms_test.go b/deployment/common/changeset/internal/evm/mcms_test.go new file mode 100644 index 00000000000..7d7ef8e2b47 --- /dev/null +++ b/deployment/common/changeset/internal/evm/mcms_test.go @@ -0,0 +1,73 @@ +package mcmsnew_test + +import ( + "encoding/json" + "testing" + + chainsel "github.com/smartcontractkit/chain-selectors" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/common/changeset/internal" + "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" + "github.com/smartcontractkit/chainlink/deployment/common/types" + "github.com/smartcontractkit/chainlink/deployment/environment/memory" + "github.com/smartcontractkit/chainlink/v2/core/logger" +) + +func TestDeployMCMSWithConfig(t *testing.T) { + lggr := logger.TestLogger(t) + + chains, _ := memory.NewMemoryChainsWithChainIDs(t, []uint64{ + chainsel.TEST_90000001.EvmChainID, + }, 1) + ab := deployment.NewMemoryAddressBook() + + // 1) Test WITHOUT a label + mcmNoLabel, err := internal.DeployMCMSWithConfig( + types.ProposerManyChainMultisig, + lggr, + chains[chainsel.TEST_90000001.Selector], + ab, + proposalutils.SingleGroupMCMS(t), + ) + require.NoError(t, err) + require.Empty(t, mcmNoLabel.Tv.Labels, "expected no label to be set") + + // 2) Test WITH a label + label := "SA" + mcmWithLabel, err := internal.DeployMCMSWithConfig( + types.ProposerManyChainMultisig, + lggr, + chains[chainsel.TEST_90000001.Selector], + ab, + proposalutils.SingleGroupMCMS(t), + internal.WithLabel(label), + ) + require.NoError(t, err) + require.NotNil(t, mcmWithLabel.Tv.Labels, "expected labels to be set") + require.Contains(t, mcmWithLabel.Tv.Labels, label, "label mismatch") +} + +func TestDeployMCMSWithTimelockContracts(t *testing.T) { + lggr := logger.TestLogger(t) + chains, _ := memory.NewMemoryChainsWithChainIDs(t, []uint64{ + chainsel.TEST_90000001.EvmChainID, + }, 1) + ab := deployment.NewMemoryAddressBook() + _, err := internal.DeployMCMSWithTimelockContracts(lggr, + chains[chainsel.TEST_90000001.Selector], + ab, proposalutils.SingleGroupTimelockConfig(t)) + require.NoError(t, err) + addresses, err := ab.AddressesForChain(chainsel.TEST_90000001.Selector) + require.NoError(t, err) + require.Len(t, addresses, 5) + mcmsState, err := state.MaybeLoadMCMSWithTimelockChainState(chains[chainsel.TEST_90000001.Selector], addresses) + require.NoError(t, err) + v, err := mcmsState.GenerateMCMSWithTimelockView() + require.NoError(t, err) + b, err := json.MarshalIndent(v, "", " ") + require.NoError(t, err) + t.Log(string(b)) +} diff --git a/deployment/common/types/types.go b/deployment/common/types/types.go index 5d8386ee674..c82559276e7 100644 --- a/deployment/common/types/types.go +++ b/deployment/common/types/types.go @@ -65,6 +65,7 @@ type MCMSWithTimelockConfigV2 struct { Bypasser mcmstypes.Config Proposer mcmstypes.Config TimelockMinDelay *big.Int + Label *string } type OCRParameters struct { From 2f3038312a27aece1980caddd411c101908daa79 Mon Sep 17 00:00:00 2001 From: gustavogama-cll <165679773+gustavogama-cll@users.noreply.github.com> Date: Wed, 19 Feb 2025 23:41:32 -0300 Subject: [PATCH 03/58] feat: add view for new mcms evm state (#16290) --- .../common/changeset/internal/solana/mcms.go | 3 +- deployment/common/changeset/state/evm.go | 48 ++--- deployment/common/changeset/state/evm_test.go | 186 ++++++++++++++++++ deployment/common/changeset/state/solana.go | 30 ++- .../common/changeset/state/solana_test.go | 159 +++++++++++++++ deployment/common/view/v1_0/mcms.go | 161 +++++++++++++-- 6 files changed, 530 insertions(+), 57 deletions(-) create mode 100644 deployment/common/changeset/state/evm_test.go create mode 100644 deployment/common/changeset/state/solana_test.go diff --git a/deployment/common/changeset/internal/solana/mcms.go b/deployment/common/changeset/internal/solana/mcms.go index 355eb0bd2df..82d7d89e4a3 100644 --- a/deployment/common/changeset/internal/solana/mcms.go +++ b/deployment/common/changeset/internal/solana/mcms.go @@ -1,6 +1,7 @@ package mcmsnew import ( + "errors" "fmt" "github.com/smartcontractkit/chainlink/deployment" @@ -19,7 +20,7 @@ func DeployMCMSWithTimelockProgramsSolana( config commontypes.MCMSWithTimelockConfigV2, ) (*state.MCMSWithTimelockStateSolana, error) { addresses, err := e.ExistingAddresses.AddressesForChain(chain.Selector) - if err != nil { + if err != nil && !errors.Is(err, deployment.ErrChainNotFound) { return nil, fmt.Errorf("failed to get addresses for chain %v from environment: %w", chain.Selector, err) } diff --git a/deployment/common/changeset/state/evm.go b/deployment/common/changeset/state/evm.go index d1319cc2d89..c81f6d1a453 100644 --- a/deployment/common/changeset/state/evm.go +++ b/deployment/common/changeset/state/evm.go @@ -10,7 +10,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/common/types" - "github.com/smartcontractkit/chainlink/deployment/common/view/v1_0" + view "github.com/smartcontractkit/chainlink/deployment/common/view/v1_0" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/link_token" ) @@ -23,37 +23,13 @@ type MCMSWithTimelockState struct { *proposalutils.MCMSWithTimelockContracts } -func (state MCMSWithTimelockState) GenerateMCMSWithTimelockView() (v1_0.MCMSWithTimelockView, error) { +func (state MCMSWithTimelockState) GenerateMCMSWithTimelockView() (view.MCMSWithTimelockView, error) { if err := state.Validate(); err != nil { - return v1_0.MCMSWithTimelockView{}, err + return view.MCMSWithTimelockView{}, fmt.Errorf("unable to validate McmsWithTimelock state: %w", err) } - timelockView, err := v1_0.GenerateTimelockView(*state.Timelock) - if err != nil { - return v1_0.MCMSWithTimelockView{}, nil - } - callProxyView, err := v1_0.GenerateCallProxyView(*state.CallProxy) - if err != nil { - return v1_0.MCMSWithTimelockView{}, nil - } - bypasserView, err := v1_0.GenerateMCMSView(*state.BypasserMcm) - if err != nil { - return v1_0.MCMSWithTimelockView{}, nil - } - proposerView, err := v1_0.GenerateMCMSView(*state.ProposerMcm) - if err != nil { - return v1_0.MCMSWithTimelockView{}, nil - } - cancellerView, err := v1_0.GenerateMCMSView(*state.CancellerMcm) - if err != nil { - return v1_0.MCMSWithTimelockView{}, nil - } - return v1_0.MCMSWithTimelockView{ - Timelock: timelockView, - Bypasser: bypasserView, - Proposer: proposerView, - Canceller: cancellerView, - CallProxy: callProxyView, - }, nil + + return view.GenerateMCMSWithTimelockView(*state.BypasserMcm, *state.CancellerMcm, *state.ProposerMcm, + *state.Timelock, *state.CallProxy) } // MaybeLoadMCMSWithTimelockState loads the MCMSWithTimelockState state for each chain in the given environment. @@ -163,11 +139,11 @@ type LinkTokenState struct { LinkToken *link_token.LinkToken } -func (s LinkTokenState) GenerateLinkView() (v1_0.LinkTokenView, error) { +func (s LinkTokenState) GenerateLinkView() (view.LinkTokenView, error) { if s.LinkToken == nil { - return v1_0.LinkTokenView{}, errors.New("link token not found") + return view.LinkTokenView{}, errors.New("link token not found") } - return v1_0.GenerateLinkTokenView(s.LinkToken) + return view.GenerateLinkTokenView(s.LinkToken) } // MaybeLoadLinkTokenState loads the LinkTokenState state for each chain in the given environment. @@ -220,11 +196,11 @@ type StaticLinkTokenState struct { StaticLinkToken *link_token_interface.LinkToken } -func (s StaticLinkTokenState) GenerateStaticLinkView() (v1_0.StaticLinkTokenView, error) { +func (s StaticLinkTokenState) GenerateStaticLinkView() (view.StaticLinkTokenView, error) { if s.StaticLinkToken == nil { - return v1_0.StaticLinkTokenView{}, errors.New("static link token not found") + return view.StaticLinkTokenView{}, errors.New("static link token not found") } - return v1_0.GenerateStaticLinkTokenView(s.StaticLinkToken) + return view.GenerateStaticLinkTokenView(s.StaticLinkToken) } func MaybeLoadStaticLinkTokenState(chain deployment.Chain, addresses map[string]deployment.TypeAndVersion) (*StaticLinkTokenState, error) { diff --git a/deployment/common/changeset/state/evm_test.go b/deployment/common/changeset/state/evm_test.go new file mode 100644 index 00000000000..0a5a639ece8 --- /dev/null +++ b/deployment/common/changeset/state/evm_test.go @@ -0,0 +1,186 @@ +package state + +import ( + "encoding/json" + "fmt" + "math/big" + "strings" + "testing" + + "github.com/ethereum/go-ethereum/common" + bindings "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers" + mcmsevmsdk "github.com/smartcontractkit/mcms/sdk/evm" + mcmstypes "github.com/smartcontractkit/mcms/types" + "github.com/stretchr/testify/require" + "go.uber.org/zap/zapcore" + + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" + "github.com/smartcontractkit/chainlink/deployment/environment/memory" + "github.com/smartcontractkit/chainlink/v2/core/logger" +) + +func TestMCMSWithTimelockState_GenerateMCMSWithTimelockViewV2(t *testing.T) { + envConfig := memory.MemoryEnvironmentConfig{Chains: 1} + env := memory.NewMemoryEnvironment(t, logger.TestLogger(t), zapcore.InfoLevel, envConfig) + chain := env.Chains[env.AllChainSelectors()[0]] + + proposerMcm := deployMCMEvm(t, chain, &mcmstypes.Config{Quorum: 1, Signers: []common.Address{ + common.HexToAddress("0x0000000000000000000000000000000000000001"), + }}) + cancellerMcm := deployMCMEvm(t, chain, &mcmstypes.Config{Quorum: 1, Signers: []common.Address{ + common.HexToAddress("0x0000000000000000000000000000000000000002"), + }}) + bypasserMcm := deployMCMEvm(t, chain, &mcmstypes.Config{Quorum: 1, Signers: []common.Address{ + common.HexToAddress("0x0000000000000000000000000000000000000003"), + }}) + timelock := deployTimelockEvm(t, chain, big.NewInt(1), + common.HexToAddress("0x0000000000000000000000000000000000000004"), + []common.Address{common.HexToAddress("0x0000000000000000000000000000000000000005")}, + []common.Address{common.HexToAddress("0x0000000000000000000000000000000000000006")}, + []common.Address{common.HexToAddress("0x0000000000000000000000000000000000000007")}, + []common.Address{common.HexToAddress("0x0000000000000000000000000000000000000008")}, + ) + callProxy := deployCallProxyEvm(t, chain, + common.HexToAddress("0x0000000000000000000000000000000000000009")) + + tests := []struct { + name string + contracts *proposalutils.MCMSWithTimelockContracts + want string + wantErr string + }{ + { + name: "success", + contracts: &proposalutils.MCMSWithTimelockContracts{ + ProposerMcm: proposerMcm, + CancellerMcm: cancellerMcm, + BypasserMcm: bypasserMcm, + Timelock: timelock, + CallProxy: callProxy, + }, + want: fmt.Sprintf(`{ + "proposer": { + "address": "%s", + "owner": "%s", + "config": { + "quorum": 1, + "signers": ["0x0000000000000000000000000000000000000001"], + "groupSigners": [] + } + }, + "canceller": { + "address": "%s", + "owner": "%s", + "config": { + "quorum": 1, + "signers": ["0x0000000000000000000000000000000000000002"], + "groupSigners": [] + } + }, + "bypasser": { + "address": "%s", + "owner": "%s", + "config": { + "quorum": 1, + "signers": ["0x0000000000000000000000000000000000000003"], + "groupSigners": [] + } + }, + "timelock": { + "address": "%s", + "owner": "0x0000000000000000000000000000000000000000", + "membersByRole": { + "ADMIN_ROLE": [ "0x0000000000000000000000000000000000000004" ], + "PROPOSER_ROLE": [ "0x0000000000000000000000000000000000000005" ], + "EXECUTOR_ROLE": [ "0x0000000000000000000000000000000000000006" ], + "CANCELLER_ROLE": [ "0x0000000000000000000000000000000000000007" ], + "BYPASSER_ROLE": [ "0x0000000000000000000000000000000000000008" ] + } + }, + "callProxy": { + "address": "%s", + "owner": "0x0000000000000000000000000000000000000000" + } + }`, evmAddr(proposerMcm.Address()), evmAddr(chain.DeployerKey.From), + evmAddr(cancellerMcm.Address()), evmAddr(chain.DeployerKey.From), + evmAddr(bypasserMcm.Address()), evmAddr(chain.DeployerKey.From), + evmAddr(timelock.Address()), evmAddr(callProxy.Address())), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + state := MCMSWithTimelockState{tt.contracts} + + got, err := state.GenerateMCMSWithTimelockView() + + if tt.wantErr == "" { + require.NoError(t, err) + require.JSONEq(t, tt.want, toJSON(t, &got)) + } else { + require.ErrorContains(t, err, tt.wantErr) + } + }) + } +} + +// ----- helpers ----- + +func toJSON[T any](t *testing.T, value T) string { + t.Helper() + + bytes, err := json.Marshal(value) + require.NoError(t, err) + + return string(bytes) +} + +func deployMCMEvm( + t *testing.T, chain deployment.Chain, config *mcmstypes.Config, +) *bindings.ManyChainMultiSig { + t.Helper() + + _, tx, contract, err := bindings.DeployManyChainMultiSig(chain.DeployerKey, chain.Client) + require.NoError(t, err) + _, err = chain.Confirm(tx) + require.NoError(t, err) + + groupQuorums, groupParents, signerAddresses, signerGroups, err := mcmsevmsdk.ExtractSetConfigInputs(config) + require.NoError(t, err) + tx, err = contract.SetConfig(chain.DeployerKey, signerAddresses, signerGroups, groupQuorums, groupParents, false) + require.NoError(t, err) + _, err = chain.Confirm(tx) + require.NoError(t, err) + + return contract +} + +func deployTimelockEvm( + t *testing.T, chain deployment.Chain, minDelay *big.Int, admin common.Address, + proposers, executors, cancellers, bypassers []common.Address, +) *bindings.RBACTimelock { + t.Helper() + _, tx, contract, err := bindings.DeployRBACTimelock( + chain.DeployerKey, chain.Client, minDelay, admin, proposers, executors, cancellers, bypassers) + require.NoError(t, err) + _, err = chain.Confirm(tx) + require.NoError(t, err) + + return contract +} + +func deployCallProxyEvm( + t *testing.T, chain deployment.Chain, target common.Address, +) *bindings.CallProxy { + t.Helper() + _, tx, contract, err := bindings.DeployCallProxy(chain.DeployerKey, chain.Client, target) + require.NoError(t, err) + _, err = chain.Confirm(tx) + require.NoError(t, err) + + return contract +} + +func evmAddr(addr common.Address) string { + return strings.ToLower(addr.Hex()) +} diff --git a/deployment/common/changeset/state/solana.go b/deployment/common/changeset/state/solana.go index fecb86bcffc..772c2482ced 100644 --- a/deployment/common/changeset/state/solana.go +++ b/deployment/common/changeset/state/solana.go @@ -1,6 +1,7 @@ package state import ( + "context" "errors" "fmt" @@ -10,6 +11,7 @@ import ( timelockBindings "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/timelock" "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/common/types" + view "github.com/smartcontractkit/chainlink/deployment/common/view/v1_0" ) type PDASeed [32]byte @@ -98,25 +100,25 @@ func (s *MCMSWithTimelockProgramsSolana) SetState(contractType deployment.Contra // for use generating views or interactions. func (s *MCMSWithTimelockProgramsSolana) Validate() error { if s.McmProgram.IsZero() { - return errors.New("canceller not found") + return errors.New("mcm program not found") } if s.TimelockProgram.IsZero() { - return errors.New("timelock not found") + return errors.New("timelock program not found") } if s.AccessControllerProgram.IsZero() { - return errors.New("timelock not found") + return errors.New("access controller program not found") } if s.ProposerAccessControllerAccount.IsZero() { - return errors.New("access controller not found") + return errors.New("proposer access controller account not found") } if s.ExecutorAccessControllerAccount.IsZero() { - return errors.New("access controller not found") + return errors.New("executor access controller account not found") } if s.CancellerAccessControllerAccount.IsZero() { - return errors.New("access controller not found") + return errors.New("canceller access controller account not found") } if s.BypasserAccessControllerAccount.IsZero() { - return errors.New("access controller not found") + return errors.New("bypasser access controller account not found") } return nil } @@ -136,6 +138,20 @@ func (s *MCMSWithTimelockProgramsSolana) RoleAccount(role timelockBindings.Role) } } +func (s *MCMSWithTimelockProgramsSolana) GenerateView( + ctx context.Context, chain deployment.SolChain, +) (view.MCMSWithTimelockViewSolana, error) { + if err := s.Validate(); err != nil { + return view.MCMSWithTimelockViewSolana{}, fmt.Errorf("unable to validate state: %w", err) + } + + inspector := mcmssolanasdk.NewInspector(chain.Client) + timelockInspector := mcmssolanasdk.NewTimelockInspector(chain.Client) + + return view.GenerateMCMSWithTimelockViewSolana(ctx, inspector, timelockInspector, s.McmProgram, + s.ProposerMcmSeed, s.CancellerMcmSeed, s.BypasserMcmSeed, s.TimelockProgram, s.TimelockSeed) +} + // MCMSWithTimelockStateStateSolana holds the Go bindings // for a MCMSWithTimelock contract deployment. // It is public for use in product specific packages. diff --git a/deployment/common/changeset/state/solana_test.go b/deployment/common/changeset/state/solana_test.go new file mode 100644 index 00000000000..fea1a458701 --- /dev/null +++ b/deployment/common/changeset/state/solana_test.go @@ -0,0 +1,159 @@ +package state_test + +import ( + "encoding/json" + "fmt" + "math/big" + "slices" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/gagliardetto/solana-go" + mcmstypes "github.com/smartcontractkit/mcms/types" + "github.com/stretchr/testify/require" + "go.uber.org/zap/zapcore" + + "github.com/smartcontractkit/chainlink/deployment" + solanainternal "github.com/smartcontractkit/chainlink/deployment/common/changeset/internal/solana" + "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" + "github.com/smartcontractkit/chainlink/deployment/environment/memory" + "github.com/smartcontractkit/chainlink/v2/core/logger" +) + +func TestMCMSWithTimelockState_GenerateMCMSWithTimelockViewSolana(t *testing.T) { + envConfig := memory.MemoryEnvironmentConfig{SolChains: 1} + env := memory.NewMemoryEnvironment(t, logger.TestLogger(t), zapcore.InfoLevel, envConfig) + chainSelector := env.AllChainSelectorsSolana()[0] + chain := env.SolChains[chainSelector] + defaultState := func() *state.MCMSWithTimelockStateSolana { + addressBook := deployment.NewMemoryAddressBook() + chainState, err := solanainternal.DeployMCMSWithTimelockProgramsSolana(env, chain, addressBook, + commontypes.MCMSWithTimelockConfigV2{ + Proposer: mcmstypes.Config{ + Quorum: 1, + Signers: []common.Address{common.HexToAddress("0x0000000000000000000000000000000000000001")}, + }, + Canceller: mcmstypes.Config{ + Quorum: 1, + Signers: []common.Address{common.HexToAddress("0x0000000000000000000000000000000000000002")}, + }, + Bypasser: mcmstypes.Config{ + Quorum: 1, + Signers: []common.Address{common.HexToAddress("0x0000000000000000000000000000000000000002")}, + }, + TimelockMinDelay: big.NewInt(1), + }, + ) + require.NoError(t, err) + env.ExistingAddresses = addressBook + return chainState + } + + setPreloadedSolanaAddresses(t, env, chainSelector) + + tests := []struct { + name string + state *state.MCMSWithTimelockStateSolana + want func(*state.MCMSWithTimelockStateSolana) string + wantErr string + }{ + { + name: "success", + state: defaultState(), + want: func(state *state.MCMSWithTimelockStateSolana) string { + return fmt.Sprintf(`{ + "proposer": { + "programID": "%s", + "seed": "%s", + "owner": "11111111111111111111111111111111", + "config": { + "quorum": 1, + "signers": ["0x0000000000000000000000000000000000000001"], + "groupSigners": [] + } + }, + "canceller": { + "programID": "%s", + "seed": "%s", + "owner": "11111111111111111111111111111111", + "config": { + "quorum": 1, + "signers": ["0x0000000000000000000000000000000000000002" ], + "groupSigners": [] + } + }, + "bypasser": { + "programID": "%s", + "seed": "%s", + "owner": "11111111111111111111111111111111", + "config": { + "quorum": 1, + "signers": ["0x0000000000000000000000000000000000000002"], + "groupSigners": [] + } + }, + "timelock": { + "programID": "%s", + "seed": "%s", + "owner": "11111111111111111111111111111111", + "proposers": ["%s"], + "executors": ["%s"], + "bypassers": ["%s"], + "cancellers": %s + } + }`, state.McmProgram, state.ProposerMcmSeed, state.McmProgram, state.CancellerMcmSeed, + state.McmProgram, state.BypasserMcmSeed, state.TimelockProgram, state.TimelockSeed, + signerPDA(state.McmProgram, state.ProposerMcmSeed), chain.DeployerKey.PublicKey(), + signerPDA(state.McmProgram, state.BypasserMcmSeed), + toJSON(t, slices.Sorted(slices.Values([]string{ + signerPDA(state.McmProgram, state.CancellerMcmSeed), + signerPDA(state.McmProgram, state.ProposerMcmSeed), + signerPDA(state.McmProgram, state.BypasserMcmSeed), + }))), + ) + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := tt.state.GenerateView(env.GetContext(), chain) + + if tt.wantErr == "" { + require.NoError(t, err) + require.JSONEq(t, tt.want(tt.state), toJSON(t, &got)) + } else { + require.ErrorContains(t, err, tt.wantErr) + } + }) + } +} + +// ----- helpers ----- + +func toJSON[T any](t *testing.T, value T) string { + t.Helper() + + bytes, err := json.Marshal(value) + require.NoError(t, err) + + return string(bytes) +} + +func setPreloadedSolanaAddresses(t *testing.T, env deployment.Environment, selector uint64) { + typeAndVersion := deployment.NewTypeAndVersion(commontypes.ManyChainMultisigProgram, deployment.Version1_0_0) + err := env.ExistingAddresses.Save(selector, memory.SolanaProgramIDs["mcm"], typeAndVersion) + require.NoError(t, err) + + typeAndVersion = deployment.NewTypeAndVersion(commontypes.AccessControllerProgram, deployment.Version1_0_0) + err = env.ExistingAddresses.Save(selector, memory.SolanaProgramIDs["access_controller"], typeAndVersion) + require.NoError(t, err) + + typeAndVersion = deployment.NewTypeAndVersion(commontypes.RBACTimelockProgram, deployment.Version1_0_0) + err = env.ExistingAddresses.Save(selector, memory.SolanaProgramIDs["timelock"], typeAndVersion) + require.NoError(t, err) +} + +func signerPDA(programID solana.PublicKey, seed state.PDASeed) string { + return state.GetMCMSignerPDA(programID, seed).String() +} diff --git a/deployment/common/view/v1_0/mcms.go b/deployment/common/view/v1_0/mcms.go index 8f3f5ad66e1..a3a4829d330 100644 --- a/deployment/common/view/v1_0/mcms.go +++ b/deployment/common/view/v1_0/mcms.go @@ -1,11 +1,18 @@ package v1_0 import ( + "context" + "fmt" "math/big" + "slices" "github.com/ethereum/go-ethereum/common" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/config" + "github.com/gagliardetto/solana-go" owner_helpers "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers" + mcmsevmsdk "github.com/smartcontractkit/mcms/sdk/evm" + "github.com/smartcontractkit/mcms/sdk/evm/bindings" + mcmssolanasdk "github.com/smartcontractkit/mcms/sdk/solana" + mcmstypes "github.com/smartcontractkit/mcms/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" "github.com/smartcontractkit/chainlink/deployment/common/view/types" @@ -49,24 +56,39 @@ var ( } ) +// --- evm --- + type MCMSView struct { types.ContractMetaData // Note config is json marshallable. - Config config.Config `json:"config"` + Config mcmstypes.Config `json:"config"` } func GenerateMCMSView(mcms owner_helpers.ManyChainMultiSig) (MCMSView, error) { owner, err := mcms.Owner(nil) if err != nil { - return MCMSView{}, nil + return MCMSView{}, err } - c, err := mcms.GetConfig(nil) + mcmsConfig, err := mcms.GetConfig(nil) if err != nil { - return MCMSView{}, nil + return MCMSView{}, err + } + + mapSigners := func(in []owner_helpers.ManyChainMultiSigSigner) []bindings.ManyChainMultiSigSigner { + out := make([]bindings.ManyChainMultiSigSigner, len(in)) + for i, s := range in { + out[i] = bindings.ManyChainMultiSigSigner{Addr: s.Addr, Index: s.Index, Group: s.Group} + } + return out } - parsedConfig, err := config.NewConfigFromRaw(c) + + parsedConfig, err := mcmsevmsdk.NewConfigTransformer().ToConfig(bindings.ManyChainMultiSigConfig{ + Signers: mapSigners(mcmsConfig.Signers), + GroupQuorums: mcmsConfig.GroupQuorums, + GroupParents: mcmsConfig.GroupParents, + }) if err != nil { - return MCMSView{}, nil + return MCMSView{}, err } return MCMSView{ // Has no type and version on the contract @@ -132,26 +154,27 @@ func GenerateMCMSWithTimelockView( canceller owner_helpers.ManyChainMultiSig, proposer owner_helpers.ManyChainMultiSig, timelock owner_helpers.RBACTimelock, + callProxy owner_helpers.CallProxy, ) (MCMSWithTimelockView, error) { timelockView, err := GenerateTimelockView(timelock) if err != nil { - return MCMSWithTimelockView{}, nil + return MCMSWithTimelockView{}, err } - callProxyView, err := GenerateCallProxyView(owner_helpers.CallProxy{}) + callProxyView, err := GenerateCallProxyView(callProxy) if err != nil { - return MCMSWithTimelockView{}, nil + return MCMSWithTimelockView{}, err } bypasserView, err := GenerateMCMSView(bypasser) if err != nil { - return MCMSWithTimelockView{}, nil + return MCMSWithTimelockView{}, err } proposerView, err := GenerateMCMSView(proposer) if err != nil { - return MCMSWithTimelockView{}, nil + return MCMSWithTimelockView{}, err } cancellerView, err := GenerateMCMSView(canceller) if err != nil { - return MCMSWithTimelockView{}, nil + return MCMSWithTimelockView{}, err } return MCMSWithTimelockView{ @@ -162,3 +185,115 @@ func GenerateMCMSWithTimelockView( CallProxy: callProxyView, }, nil } + +// --- solana --- + +type MCMSWithTimelockViewSolana struct { + Bypasser MCMViewSolana `json:"bypasser"` + Canceller MCMViewSolana `json:"canceller"` + Proposer MCMViewSolana `json:"proposer"` + Timelock TimelockViewSolana `json:"timelock"` +} + +func GenerateMCMSWithTimelockViewSolana( + ctx context.Context, + inspector *mcmssolanasdk.Inspector, + timelockInspector *mcmssolanasdk.TimelockInspector, + mcmProgram solana.PublicKey, + proposerMcmSeed [32]byte, + cancellerMcmSeed [32]byte, + bypasserMcmSeed [32]byte, + timelockProgram solana.PublicKey, + timelockSeed [32]byte, +) (MCMSWithTimelockViewSolana, error) { + timelockView, err := GenerateTimelockViewSolana(ctx, timelockInspector, timelockProgram, timelockSeed) + if err != nil { + return MCMSWithTimelockViewSolana{}, fmt.Errorf("unable to generate timelock view: %w", err) + } + bypasserView, err := GenerateMCMViewSolana(ctx, inspector, mcmProgram, bypasserMcmSeed) + if err != nil { + return MCMSWithTimelockViewSolana{}, fmt.Errorf("unable to generate bypasser mcm view: %w", err) + } + proposerView, err := GenerateMCMViewSolana(ctx, inspector, mcmProgram, proposerMcmSeed) + if err != nil { + return MCMSWithTimelockViewSolana{}, fmt.Errorf("unable to generate proposer mcm view: %w", err) + } + cancellerView, err := GenerateMCMViewSolana(ctx, inspector, mcmProgram, cancellerMcmSeed) + if err != nil { + return MCMSWithTimelockViewSolana{}, fmt.Errorf("unable to generate canceller mcm view: %w", err) + } + + return MCMSWithTimelockViewSolana{ + Timelock: timelockView, + Bypasser: bypasserView, + Proposer: proposerView, + Canceller: cancellerView, + }, nil +} + +type MCMViewSolana struct { + ProgramID solana.PublicKey `json:"programID"` + Seed string `json:"seed"` + Owner solana.PublicKey `json:"owner"` + Config mcmstypes.Config `json:"config"` +} + +func GenerateMCMViewSolana( + ctx context.Context, inspector *mcmssolanasdk.Inspector, programID solana.PublicKey, seed [32]byte, +) (MCMViewSolana, error) { + address := mcmssolanasdk.ContractAddress(programID, mcmssolanasdk.PDASeed(seed)) + config, err := inspector.GetConfig(ctx, address) + if err != nil { + return MCMViewSolana{}, fmt.Errorf("unable to get config from mcm (%v): %w", address, err) + } + + return MCMViewSolana{ + ProgramID: programID, + Seed: string(seed[:]), + Owner: solana.PublicKey{}, // FIXME: needs inspector.GetOwner() in mcms solana sdk + Config: *config, + }, nil +} + +type TimelockViewSolana struct { + ProgramID solana.PublicKey `json:"programID"` + Seed string `json:"seed"` + Owner solana.PublicKey `json:"owner"` + Proposers []string `json:"proposers"` + Executors []string `json:"executors"` + Cancellers []string `json:"cancellers"` + Bypassers []string `json:"bypassers"` +} + +func GenerateTimelockViewSolana( + ctx context.Context, inspector *mcmssolanasdk.TimelockInspector, programID solana.PublicKey, seed [32]byte, +) (TimelockViewSolana, error) { + address := mcmssolanasdk.ContractAddress(programID, mcmssolanasdk.PDASeed(seed)) + + proposers, err := inspector.GetProposers(ctx, address) + if err != nil { + return TimelockViewSolana{}, fmt.Errorf("unable to get proposers from timelock (%v): %w", address, err) + } + executors, err := inspector.GetExecutors(ctx, address) + if err != nil { + return TimelockViewSolana{}, fmt.Errorf("unable to get executors from timelock (%v): %w", address, err) + } + cancellers, err := inspector.GetCancellers(ctx, address) + if err != nil { + return TimelockViewSolana{}, fmt.Errorf("unable to get cancellers from timelock (%v): %w", address, err) + } + bypassers, err := inspector.GetBypassers(ctx, address) + if err != nil { + return TimelockViewSolana{}, fmt.Errorf("unable to get bypassers from timelock (%v): %w", address, err) + } + + return TimelockViewSolana{ + ProgramID: programID, + Seed: string(seed[:]), + Owner: solana.PublicKey{}, // FIXME: needs inspector.GetOwner() in mcms solana sdk + Proposers: slices.Sorted(slices.Values(proposers)), + Executors: slices.Sorted(slices.Values(executors)), + Cancellers: slices.Sorted(slices.Values(cancellers)), + Bypassers: slices.Sorted(slices.Values(bypassers)), + }, nil +} From 10fd69c7471612e395c728a8963c4b4c20b16815 Mon Sep 17 00:00:00 2001 From: Mateusz Sekara Date: Thu, 20 Feb 2025 10:38:11 +0100 Subject: [PATCH 04/58] Bumping chainlink-ccip and increasing buckets for latencies (#16490) --- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 ++-- core/services/ocr3/promwrapper/types.go | 2 ++ deployment/go.mod | 2 +- deployment/go.sum | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 ++-- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 ++-- 11 files changed, 17 insertions(+), 15 deletions(-) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index f1147292305..8b8c07425db 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -340,7 +340,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219000908-751d873236f2 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index ef423eea3a7..09c5ff95b01 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1086,8 +1086,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219000908-751d873236f2 h1:cXUlW1NIbTFT+oaV2Xio+shr3MHESzaYr+hke14YORU= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219000908-751d873236f2/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/core/services/ocr3/promwrapper/types.go b/core/services/ocr3/promwrapper/types.go index 59468358783..408fdd051d7 100644 --- a/core/services/ocr3/promwrapper/types.go +++ b/core/services/ocr3/promwrapper/types.go @@ -31,6 +31,8 @@ var ( float64(2 * time.Second), float64(5 * time.Second), float64(10 * time.Second), + float64(20 * time.Second), + float64(30 * time.Second), } promOCR3ReportsGenerated = promauto.NewCounterVec( diff --git a/deployment/go.mod b/deployment/go.mod index 1c340853acd..11ea7a213ad 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -30,7 +30,7 @@ require ( github.com/sethvargo/go-retry v0.2.4 github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219000908-751d873236f2 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb diff --git a/deployment/go.sum b/deployment/go.sum index fe10c5468a6..3c3309070d9 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1134,8 +1134,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219000908-751d873236f2 h1:cXUlW1NIbTFT+oaV2Xio+shr3MHESzaYr+hke14YORU= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219000908-751d873236f2/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/go.mod b/go.mod index 0a36224b82f..61064f2e11f 100644 --- a/go.mod +++ b/go.mod @@ -76,7 +76,7 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219000908-751d873236f2 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 diff --git a/go.sum b/go.sum index 226b61cfe4e..2a317acb602 100644 --- a/go.sum +++ b/go.sum @@ -1018,8 +1018,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219000908-751d873236f2 h1:cXUlW1NIbTFT+oaV2Xio+shr3MHESzaYr+hke14YORU= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219000908-751d873236f2/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 0a4281b33d5..19b237fa380 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -49,7 +49,7 @@ require ( github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219000908-751d873236f2 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 073107beb80..699e03dae19 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1386,8 +1386,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219000908-751d873236f2 h1:cXUlW1NIbTFT+oaV2Xio+shr3MHESzaYr+hke14YORU= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219000908-751d873236f2/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 1d477cb2f93..d122de7671f 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -28,7 +28,7 @@ require ( github.com/rs/zerolog v1.33.0 github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219000908-751d873236f2 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 62fac99e859..4f0a836f8c4 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1369,8 +1369,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219000908-751d873236f2 h1:cXUlW1NIbTFT+oaV2Xio+shr3MHESzaYr+hke14YORU= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219000908-751d873236f2/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= From d7cfdae77ab0ba54ff46eda0ab1d4ae87eca88da Mon Sep 17 00:00:00 2001 From: Makram Date: Thu, 20 Feb 2025 13:04:48 +0200 Subject: [PATCH 05/58] core/capabilities/ccip: add manual exec helpers (#16479) * core/capabilities/ccip: add manual exec helpers * use common logger * add checkalreadyexecuted * add default lookback * lint * fix lint * use manualexechelpers in tests * lint --- core/capabilities/ccip/ccipevm/helpers.go | 95 ++++- .../ccip/ccipevm/manualexeclib/exec.go | 133 ++++++ deployment/ccip/manualexechelpers/exec.go | 403 ++++++++++++++++++ .../smoke/ccip/ccip_messaging_test.go | 175 +------- 4 files changed, 646 insertions(+), 160 deletions(-) create mode 100644 core/capabilities/ccip/ccipevm/manualexeclib/exec.go create mode 100644 deployment/ccip/manualexechelpers/exec.go diff --git a/core/capabilities/ccip/ccipevm/helpers.go b/core/capabilities/ccip/ccipevm/helpers.go index 13e635ecbdf..b93cbad3cbb 100644 --- a/core/capabilities/ccip/ccipevm/helpers.go +++ b/core/capabilities/ccip/ccipevm/helpers.go @@ -6,6 +6,10 @@ import ( "math/big" "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" ) const ( @@ -24,9 +28,11 @@ var ( } ) +// decodeExtraArgsV1V2 decodes the given EVM Extra Args and extracts the gas limit +// that was specified. func decodeExtraArgsV1V2(extraArgs []byte) (gasLimit *big.Int, err error) { if len(extraArgs) < 4 { - return nil, fmt.Errorf("extra args too short: %d, should be at least 4 (i.e the extraArgs tag)", len(extraArgs)) + return nil, fmt.Errorf("extra args too short: %d, should be at least 4 bytes long (i.e the extraArgs tag)", len(extraArgs)) } var method string @@ -80,3 +86,90 @@ func decodeTokenDestGasOverhead(destExecData []byte) (uint32, error) { } return ifaces[0].(uint32), nil } + +// CCIPMsgToAny2EVMMessage converts a ccipocr3.Message object to an offramp.InternalAny2EVMRampMessage object. +// These are typically used to create the execution report for EVM. +func CCIPMsgToAny2EVMMessage(msg ccipocr3.Message) (offramp.InternalAny2EVMRampMessage, error) { + var tokenAmounts []offramp.InternalAny2EVMTokenTransfer + for _, rta := range msg.TokenAmounts { + destGasAmount, err := abiDecodeUint32(rta.DestExecData) + if err != nil { + return offramp.InternalAny2EVMRampMessage{}, fmt.Errorf("failed to decode dest gas amount: %w", err) + } + + tokenAmounts = append(tokenAmounts, offramp.InternalAny2EVMTokenTransfer{ + SourcePoolAddress: common.LeftPadBytes(rta.SourcePoolAddress, 32), + DestTokenAddress: common.BytesToAddress(rta.DestTokenAddress), + ExtraData: rta.ExtraData[:], + Amount: rta.Amount.Int, + DestGasAmount: destGasAmount, + }) + } + + gasLimit, err := decodeExtraArgsV1V2(msg.ExtraArgs) + if err != nil { + return offramp.InternalAny2EVMRampMessage{}, fmt.Errorf("failed to decode extra args: %w", err) + } + + return offramp.InternalAny2EVMRampMessage{ + Header: offramp.InternalRampMessageHeader{ + MessageId: msg.Header.MessageID, + SourceChainSelector: uint64(msg.Header.SourceChainSelector), + DestChainSelector: uint64(msg.Header.DestChainSelector), + SequenceNumber: uint64(msg.Header.SequenceNumber), + Nonce: msg.Header.Nonce, + }, + Sender: common.LeftPadBytes(msg.Sender, 32), + Data: msg.Data, + Receiver: common.BytesToAddress(msg.Receiver), + GasLimit: gasLimit, + TokenAmounts: tokenAmounts, + }, nil +} + +// EVM2AnyToCCIPMsg converts an offramp.InternalEVM2AnyRampMessage object to a ccipocr3.Message object. +// These are typically used to calculate the message hash. +func EVM2AnyToCCIPMsg( + onrampAddress common.Address, + any2EVM onramp.InternalEVM2AnyRampMessage, +) ccipocr3.Message { + var tokenAmounts []ccipocr3.RampTokenAmount + for _, ta := range any2EVM.TokenAmounts { + tokenAmounts = append(tokenAmounts, ccipocr3.RampTokenAmount{ + SourcePoolAddress: ta.SourcePoolAddress.Bytes(), + DestTokenAddress: ta.DestTokenAddress, + DestExecData: ta.DestExecData, + ExtraData: ta.ExtraData, + Amount: ccipocr3.NewBigInt(ta.Amount), + }) + } + return ccipocr3.Message{ + Header: ccipocr3.RampMessageHeader{ + MessageID: ccipocr3.Bytes32(any2EVM.Header.MessageId), + SourceChainSelector: ccipocr3.ChainSelector(any2EVM.Header.SourceChainSelector), + DestChainSelector: ccipocr3.ChainSelector(any2EVM.Header.DestChainSelector), + SequenceNumber: ccipocr3.SeqNum(any2EVM.Header.SequenceNumber), + Nonce: any2EVM.Header.Nonce, + OnRamp: onrampAddress.Bytes(), + }, + Sender: any2EVM.Sender.Bytes(), + Data: any2EVM.Data, + Receiver: ccipocr3.UnknownAddress(any2EVM.Receiver), + ExtraArgs: any2EVM.ExtraArgs, + FeeToken: any2EVM.FeeToken.Bytes(), + FeeTokenAmount: ccipocr3.NewBigInt(any2EVM.FeeTokenAmount), + FeeValueJuels: ccipocr3.NewBigInt(any2EVM.FeeValueJuels), + TokenAmounts: tokenAmounts, + } +} + +// BoolsToBitFlags transforms a list of boolean flags to a *big.Int encoded number. +func BoolsToBitFlags(bools []bool) *big.Int { + encodedFlags := big.NewInt(0) + for i := 0; i < len(bools); i++ { + if bools[i] { + encodedFlags.SetBit(encodedFlags, i, 1) + } + } + return encodedFlags +} diff --git a/core/capabilities/ccip/ccipevm/manualexeclib/exec.go b/core/capabilities/ccip/ccipevm/manualexeclib/exec.go new file mode 100644 index 00000000000..1a59dd6bcd4 --- /dev/null +++ b/core/capabilities/ccip/ccipevm/manualexeclib/exec.go @@ -0,0 +1,133 @@ +package manualexeclib + +import ( + "context" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/smartcontractkit/chainlink-common/pkg/hashutil" + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-common/pkg/merklemulti" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipsolana" + ccipcommon "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" +) + +func GetMessageHashes( + ctx context.Context, + lggr logger.Logger, + onrampAddress common.Address, + ccipMessageSentEvents []onramp.OnRampCCIPMessageSent, +) ([][32]byte, error) { + msgHasher := ccipevm.NewMessageHasherV1( + lggr, + ccipcommon.NewExtraDataCodec(ccipcommon.NewExtraDataCodecParams( + ccipevm.ExtraDataDecoder{}, + ccipsolana.ExtraDataDecoder{}, + )), + ) + var ret [][32]byte + for _, event := range ccipMessageSentEvents { + ccipMsg := ccipevm.EVM2AnyToCCIPMsg(onrampAddress, event.Message) + msgHash, err := msgHasher.Hash(ctx, ccipMsg) + if err != nil { + return nil, fmt.Errorf("failed to hash message (evm2any: %+v, generic: %+v): %w", event.Message, ccipMsg, err) + } + ret = append(ret, msgHash) + } + + return ret, nil +} + +// GetMerkleProof returns the merkle proof of inclusion for the given sequence number +// in the given merkleRoot. +// +// In the event that: +// 1. the calculated merkle root does not match the committed merkle root +// 2. the sequence number is not found in the merkle root struct +// an error is returned. +func GetMerkleProof( + lggr logger.Logger, + merkleRoot offramp.InternalMerkleRoot, + messageHashes [][32]byte, + msgSeqNr uint64, +) ([][32]byte, *big.Int, error) { + mtree, err := merklemulti.NewTree(hashutil.NewKeccak(), messageHashes) + if err != nil { + return nil, nil, fmt.Errorf("failed to create merkle tree: %w", err) + } + + // calculate merkle root from tree, should match the committed root + root := mtree.Root() + if root != merkleRoot.MerkleRoot { + return nil, nil, fmt.Errorf( + "merkle root mismatch, calculated != committed: %x != %x", + root, merkleRoot.MerkleRoot) + } + + lggr.Debugw("merkle roots match", "calculated", hexutil.Encode(root[:]), "committed", hexutil.Encode(merkleRoot.MerkleRoot[:])) + + // get the index of the msgSeqNr in the messageHashes + var idx int = -1 + var j int + for i := merkleRoot.MinSeqNr; i <= merkleRoot.MaxSeqNr; i++ { + if i == msgSeqNr { + idx = j + break + } + j++ + } + + if idx == -1 { + return nil, nil, fmt.Errorf("msgSeqNr %d not found in merkle root struct, range: [%d, %d]", + msgSeqNr, merkleRoot.MinSeqNr, merkleRoot.MaxSeqNr) + } + + proof, err := mtree.Prove([]int{idx}) + if err != nil { + return nil, nil, fmt.Errorf("failed to prove: %w", err) + } + + bitFlag := ccipevm.BoolsToBitFlags(proof.SourceFlags) + + return proof.Hashes, bitFlag, nil +} + +// CreateExecutionReport creates an offramp.InternalExecutionReport from the given parameters. +// +// It converts the given ccipMessageSentEvents to offramp.InternalAny2EVMRampMessage +// and then to offramp.InternalExecutionReport. +// +// The offchainTokenData is not currently supported and is set to an empty slice. +func CreateExecutionReport( + srcChainSel uint64, + onrampAddress common.Address, + ccipMessageSentEvents []onramp.OnRampCCIPMessageSent, + hashes [][32]byte, + flags *big.Int, +) (offramp.InternalExecutionReport, error) { + var any2EVMs []offramp.InternalAny2EVMRampMessage + for _, event := range ccipMessageSentEvents { + ccipMsg := ccipevm.EVM2AnyToCCIPMsg(onrampAddress, event.Message) + any2EVM, err := ccipevm.CCIPMsgToAny2EVMMessage(ccipMsg) + if err != nil { + return offramp.InternalExecutionReport{}, fmt.Errorf("failed to convert ccip message to any2evm message: %w", err) + } + any2EVMs = append(any2EVMs, any2EVM) + } + + return offramp.InternalExecutionReport{ + SourceChainSelector: srcChainSel, + Messages: any2EVMs, + // not currently supported + OffchainTokenData: [][][]byte{ + {}, + }, + Proofs: hashes, + ProofFlagBits: flags, + }, nil +} diff --git a/deployment/ccip/manualexechelpers/exec.go b/deployment/ccip/manualexechelpers/exec.go new file mode 100644 index 00000000000..5d5099fb424 --- /dev/null +++ b/deployment/ccip/manualexechelpers/exec.go @@ -0,0 +1,403 @@ +package manualexechelpers + +import ( + "context" + "errors" + "fmt" + "math/big" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common/hexutil" + chainsel "github.com/smartcontractkit/chain-selectors" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/deployment" + ccipchangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm/manualexeclib" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" +) + +// 14 days is the default lookback but it can be overridden. +const DefaultLookback = 14 * 24 * time.Hour + +var ( + blockTimeSecondsPerChain = map[uint64]uint64{ + // simchains + chainsel.GETH_TESTNET.Selector: 1, + chainsel.GETH_DEVNET_2.Selector: 1, + chainsel.GETH_DEVNET_3.Selector: 1, + + // arb + chainsel.ETHEREUM_MAINNET_ARBITRUM_1.Selector: 1, + chainsel.ETHEREUM_TESTNET_SEPOLIA_ARBITRUM_1.Selector: 1, + + // op + chainsel.ETHEREUM_MAINNET_OPTIMISM_1.Selector: 1, + chainsel.ETHEREUM_TESTNET_SEPOLIA_OPTIMISM_1.Selector: 1, + + // base + chainsel.ETHEREUM_MAINNET_BASE_1.Selector: 1, + chainsel.ETHEREUM_TESTNET_SEPOLIA_BASE_1.Selector: 1, + + // matic + chainsel.POLYGON_MAINNET.Selector: 2, + chainsel.POLYGON_TESTNET_MUMBAI.Selector: 2, + chainsel.POLYGON_TESTNET_AMOY.Selector: 2, + + // bsc + chainsel.BINANCE_SMART_CHAIN_MAINNET.Selector: 2, + chainsel.BINANCE_SMART_CHAIN_TESTNET.Selector: 2, + + // eth + chainsel.ETHEREUM_MAINNET.Selector: 12, + chainsel.ETHEREUM_TESTNET_SEPOLIA.Selector: 12, + chainsel.ETHEREUM_TESTNET_HOLESKY.Selector: 12, + + // avax + chainsel.AVALANCHE_MAINNET.Selector: 3, + chainsel.AVALANCHE_TESTNET_FUJI.Selector: 3, + } + // used if the chain isn't in the map above. + defaultBlockTimeSeconds uint64 = 2 +) + +// getStartBlock gets the starting block of a filter logs query based on the current head block and a lookback duration. +// block time is used to calculate the number of blocks to go back. +func getStartBlock(srcChainSel uint64, currentHead uint64, lookbackDuration time.Duration) uint64 { + blockTimeSeconds := blockTimeSecondsPerChain[srcChainSel] + if blockTimeSeconds == 0 { + blockTimeSeconds = defaultBlockTimeSeconds + } + + toSub := uint64(lookbackDuration.Seconds()) / blockTimeSeconds + if toSub > currentHead { + return 1 // start from genesis - might happen for simchains. + } + + start := currentHead - toSub + return start +} + +func getCommitRootAcceptedEvent( + ctx context.Context, + lggr logger.Logger, + env deployment.Environment, + state ccipchangeset.CCIPOnChainState, + srcChainSel uint64, + destChainSel uint64, + msgSeqNr uint64, + lookbackDuration time.Duration, +) (offramp.InternalMerkleRoot, error) { + hdr, err := env.Chains[destChainSel].Client.HeaderByNumber(ctx, nil) + if err != nil { + return offramp.InternalMerkleRoot{}, fmt.Errorf("failed to get header: %w", err) + } + + start := getStartBlock(srcChainSel, hdr.Number.Uint64(), lookbackDuration) + lggr.Debugw("Getting commit root accepted event", "startBlock", start) + iter, err := state.Chains[destChainSel].OffRamp.FilterCommitReportAccepted( + &bind.FilterOpts{ + Start: start, + }, + ) + if err != nil { + return offramp.InternalMerkleRoot{}, fmt.Errorf("failed to filter commit report accepted: %w", err) + } + + var countMerkleRoots int + var countNoRoots int + for iter.Next() { + if len(iter.Event.BlessedMerkleRoots) == 0 && len(iter.Event.UnblessedMerkleRoots) == 0 { + countNoRoots++ + continue + } + + countMerkleRoots++ + for _, root := range iter.Event.BlessedMerkleRoots { + if root.SourceChainSelector == srcChainSel { + lggr.Debugw("checking commit root", "minSeqNr", root.MinSeqNr, "maxSeqNr", root.MaxSeqNr, "txHash", iter.Event.Raw.TxHash.String()) + if msgSeqNr >= root.MinSeqNr && msgSeqNr <= root.MaxSeqNr { + lggr.Debugw("found commit root", "root", root, "txHash", iter.Event.Raw.TxHash.String()) + return root, nil + } + } + } + + for _, root := range iter.Event.UnblessedMerkleRoots { + if root.SourceChainSelector == srcChainSel { + lggr.Debugw("checking commit root", "minSeqNr", root.MinSeqNr, "maxSeqNr", root.MaxSeqNr, "txHash", iter.Event.Raw.TxHash.String()) + if msgSeqNr >= root.MinSeqNr && msgSeqNr <= root.MaxSeqNr { + lggr.Debugw("found commit root", "root", root, "txHash", iter.Event.Raw.TxHash.String()) + return root, nil + } + } + } + } + + lggr.Debugw("didn't find commit root", "countMerkleRoots", countMerkleRoots, "countNoRoots", countNoRoots) + + return offramp.InternalMerkleRoot{}, errors.New("commit root not found") +} + +func getCCIPMessageSentEvents( + ctx context.Context, + lggr logger.Logger, + env deployment.Environment, + state ccipchangeset.CCIPOnChainState, + srcChainSel uint64, + destChainSel uint64, + merkleRoot offramp.InternalMerkleRoot, + lookbackDuration time.Duration, +) ([]onramp.OnRampCCIPMessageSent, error) { + hdr, err := env.Chains[srcChainSel].Client.HeaderByNumber(ctx, nil) + if err != nil { + return nil, fmt.Errorf("failed to get header: %w", err) + } + + start := getStartBlock(srcChainSel, hdr.Number.Uint64(), lookbackDuration) + + var seqNrs []uint64 + for i := merkleRoot.MinSeqNr; i <= merkleRoot.MaxSeqNr; i++ { + seqNrs = append(seqNrs, i) + } + + lggr.Debugw("would query with", + "seqNrs", seqNrs, + "minSeqNr", merkleRoot.MinSeqNr, + "maxSeqNr", merkleRoot.MaxSeqNr, + "startBlock", start, + ) + + iter, err := state.Chains[srcChainSel].OnRamp.FilterCCIPMessageSent( + &bind.FilterOpts{ + Start: start, + }, + []uint64{destChainSel}, + seqNrs, + ) + if err != nil { + return nil, fmt.Errorf("failed to filter ccip message sent: %w", err) + } + + var ret []onramp.OnRampCCIPMessageSent + var count int + var toDestCount int + for iter.Next() { + count++ + if iter.Event.DestChainSelector == destChainSel { + toDestCount++ + lggr.Debugw("checking message", + "seqNr", iter.Event.SequenceNumber, + "destChain", iter.Event.DestChainSelector, + "txHash", iter.Event.Raw.TxHash.String()) + if iter.Event.SequenceNumber >= merkleRoot.MinSeqNr && + iter.Event.SequenceNumber <= merkleRoot.MaxSeqNr { + ret = append(ret, *iter.Event) + } + } + } + + lggr.Debugw("found messages", "count", count, "toDestCount", toDestCount) + + if len(ret) != len(seqNrs) { + return nil, fmt.Errorf("not all messages found, got: %d, expected: %d", len(ret), len(seqNrs)) + } + + return ret, nil +} + +func manuallyExecuteSingle( + ctx context.Context, + lggr logger.Logger, + state ccipchangeset.CCIPOnChainState, + env deployment.Environment, + srcChainSel uint64, + destChainSel uint64, + msgSeqNr uint64, + lookbackDuration time.Duration, + reExecuteIfFailed bool, +) error { + onRampAddress := state.Chains[srcChainSel].OnRamp.Address() + + execState, err := state.Chains[destChainSel].OffRamp.GetExecutionState(&bind.CallOpts{ + Context: ctx, + }, srcChainSel, msgSeqNr) + if err != nil { + return fmt.Errorf("failed to get execution state: %w", err) + } + + if execState == testhelpers.EXECUTION_STATE_SUCCESS || + (execState == testhelpers.EXECUTION_STATE_FAILURE && !reExecuteIfFailed) { + lggr.Debugw("message already executed", "execState", execState) + return nil + } + + lggr.Debugw("addresses", + "offRampAddress", state.Chains[destChainSel].OffRamp.Address(), + "onRampAddress", onRampAddress, + "execState", execState, + ) + merkleRoot, err := getCommitRootAcceptedEvent( + ctx, + lggr, + env, + state, + srcChainSel, + destChainSel, + msgSeqNr, + lookbackDuration, + ) + if err != nil { + return fmt.Errorf("failed to get merkle root: %w", err) + } + + lggr.Debugw("merkle root", + "merkleRoot", hexutil.Encode(merkleRoot.MerkleRoot[:]), + "minSeqNr", merkleRoot.MinSeqNr, + "maxSeqNr", merkleRoot.MaxSeqNr, + "sourceChainSel", merkleRoot.SourceChainSelector, + ) + + ccipMessageSentEvents, err := getCCIPMessageSentEvents( + ctx, + lggr, + env, + state, + srcChainSel, + destChainSel, + merkleRoot, + lookbackDuration, + ) + if err != nil { + return fmt.Errorf("failed to get ccip message sent event: %w", err) + } + + messageHashes, err := manualexeclib.GetMessageHashes( + ctx, + lggr, + onRampAddress, + ccipMessageSentEvents, + ) + if err != nil { + return fmt.Errorf("failed to get message hashes: %w", err) + } + + hashes, flags, err := manualexeclib.GetMerkleProof( + lggr, + merkleRoot, + messageHashes, + msgSeqNr, + ) + if err != nil { + return fmt.Errorf("failed to get merkle proof: %w", err) + } + + lggr.Debugw("got hashes and flags", "hashes", hashes, "flags", flags) + + execReport, err := manualexeclib.CreateExecutionReport( + srcChainSel, + onRampAddress, + ccipMessageSentEvents, + hashes, + flags, + ) + if err != nil { + return fmt.Errorf("failed to create execution report: %w", err) + } + + txOpts := &bind.TransactOpts{ + From: env.Chains[destChainSel].DeployerKey.From, + Nonce: nil, + Signer: env.Chains[destChainSel].DeployerKey.Signer, + Value: big.NewInt(0), + // We manually set the gas limit here because estimateGas doesn't take into account + // internal reverts (such as those that could happen on ERC165 interface checks). + // This is just a big value for now, we can investigate something more efficient later. + GasLimit: 1e6, + } + tx, err := state.Chains[destChainSel].OffRamp.ManuallyExecute( + txOpts, + []offramp.InternalExecutionReport{execReport}, + [][]offramp.OffRampGasLimitOverride{ + { + { + ReceiverExecutionGasLimit: big.NewInt(200_000), + TokenGasOverrides: nil, + }, + }, + }, + ) + _, err = deployment.ConfirmIfNoErrorWithABI(env.Chains[destChainSel], tx, offramp.OffRampABI, err) + if err != nil { + return fmt.Errorf("failed to execute message: %w", err) + } + + lggr.Debugw("successfully manually executed msg", "msgSeqNr", msgSeqNr) + + return nil +} + +// ManuallyExecuteAll will manually execute the provided messages if they were not already executed. +// At the moment offchain token data (i.e USDC/Lombard attestations) is not supported. +func ManuallyExecuteAll( + ctx context.Context, + lggr logger.Logger, + state ccipchangeset.CCIPOnChainState, + env deployment.Environment, + srcChainSel uint64, + destChainSel uint64, + msgSeqNrs []int64, + lookbackDuration time.Duration, + reExecuteIfFailed bool, +) error { + for _, seqNr := range msgSeqNrs { + err := manuallyExecuteSingle( + ctx, + lggr, + state, + env, + srcChainSel, + destChainSel, + uint64(seqNr), //nolint:gosec // seqNr is never <= 0. + lookbackDuration, + reExecuteIfFailed, + ) + if err != nil { + return err + } + } + + return nil +} + +// CheckAlreadyExecuted will check the execution state of the provided messages and log if they were already executed. +func CheckAlreadyExecuted( + ctx context.Context, + lggr logger.Logger, + state ccipchangeset.CCIPOnChainState, + srcChainSel uint64, + destChainSel uint64, + msgSeqNrs []int64, +) error { + for _, seqNr := range msgSeqNrs { + execState, err := state.Chains[destChainSel].OffRamp.GetExecutionState( + &bind.CallOpts{Context: ctx}, + srcChainSel, + uint64(seqNr), //nolint:gosec // seqNr is never <= 0. + ) + if err != nil { + return fmt.Errorf("failed to get execution state: %w", err) + } + + if execState == testhelpers.EXECUTION_STATE_SUCCESS || execState == testhelpers.EXECUTION_STATE_FAILURE { + lggr.Debugw("message already executed", "execState", execState, "msgSeqNr", seqNr) + } else { + lggr.Debugw("message not executed", "execState", execState, "msgSeqNr", seqNr) + } + } + + return nil +} diff --git a/integration-tests/smoke/ccip/ccip_messaging_test.go b/integration-tests/smoke/ccip/ccip_messaging_test.go index 67d0a460360..33133bd958e 100644 --- a/integration-tests/smoke/ccip/ccip_messaging_test.go +++ b/integration-tests/smoke/ccip/ccip_messaging_test.go @@ -2,11 +2,10 @@ package ccip import ( "context" - "fmt" - "math/big" "sync" "sync/atomic" "testing" + "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -15,13 +14,10 @@ import ( chainsel "github.com/smartcontractkit/chain-selectors" - "github.com/smartcontractkit/chainlink-common/pkg/hashutil" - "github.com/smartcontractkit/chainlink-common/pkg/merklemulti" - - "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" mt "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers/messagingtest" + "github.com/smartcontractkit/chainlink/deployment/ccip/manualexechelpers" "github.com/smartcontractkit/chainlink/deployment/environment/memory" testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" @@ -152,8 +148,6 @@ func Test_CCIPMessaging(t *testing.T) { }) t.Run("message to contract implementing CCIPReceiver with low exec gas", func(t *testing.T) { - latestHead, err := e.Env.Chains[destChain].Client.HeaderByNumber(ctx, nil) - require.NoError(t, err) out = mt.Run( mt.TestCase{ TestSetup: setup, @@ -166,7 +160,20 @@ func Test_CCIPMessaging(t *testing.T) { }, ) - manuallyExecute(ctx, t, latestHead.Number.Uint64(), state, destChain, out, sourceChain, e, sender) + err := manualexechelpers.ManuallyExecuteAll( + ctx, + e.Env.Logger, + state, + e.Env, + sourceChain, + destChain, + []int64{ + int64(out.MsgSentEvent.Message.Header.SequenceNumber), //nolint:gosec // seqNr fits in int64 + }, + 24*time.Hour, + true, // reExecuteIfFailed + ) + require.NoError(t, err) t.Logf("successfully manually executed message %x", out.MsgSentEvent.Message.Header.MessageId) @@ -214,153 +221,3 @@ func monitorReExecutions( } } } - -func manuallyExecute( - ctx context.Context, - t *testing.T, - startBlock uint64, - state changeset.CCIPOnChainState, - destChain uint64, - out mt.TestCaseOutput, - sourceChain uint64, - e testhelpers.DeployedEnv, - sender []byte, -) { - merkleRoot := getMerkleRoot( - ctx, - t, - state.Chains[destChain].OffRamp, - out.MsgSentEvent.SequenceNumber, - startBlock, - ) - messageHash := getMessageHash( - ctx, - t, - state.Chains[destChain].OffRamp, - sourceChain, - out.MsgSentEvent.SequenceNumber, - out.MsgSentEvent.Message.Header.MessageId, - startBlock, - ) - tree, err := merklemulti.NewTree(hashutil.NewKeccak(), [][32]byte{messageHash}) - require.NoError(t, err) - proof, err := tree.Prove([]int{0}) - require.NoError(t, err) - require.Equal(t, merkleRoot, tree.Root()) - - tx, err := state.Chains[destChain].OffRamp.ManuallyExecute( - e.Env.Chains[destChain].DeployerKey, - []offramp.InternalExecutionReport{ - { - SourceChainSelector: sourceChain, - Messages: []offramp.InternalAny2EVMRampMessage{ - { - Header: offramp.InternalRampMessageHeader{ - MessageId: out.MsgSentEvent.Message.Header.MessageId, - SourceChainSelector: sourceChain, - DestChainSelector: destChain, - SequenceNumber: out.MsgSentEvent.SequenceNumber, - Nonce: out.MsgSentEvent.Message.Header.Nonce, - }, - Sender: sender, - Data: []byte("hello CCIPReceiver with low exec gas"), - Receiver: state.Chains[destChain].Receiver.Address(), - GasLimit: big.NewInt(1), - TokenAmounts: []offramp.InternalAny2EVMTokenTransfer{}, - }, - }, - OffchainTokenData: [][][]byte{ - {}, - }, - Proofs: proof.Hashes, - ProofFlagBits: boolsToBitFlags(proof.SourceFlags), - }, - }, - [][]offramp.OffRampGasLimitOverride{ - { - { - ReceiverExecutionGasLimit: big.NewInt(200_000), - TokenGasOverrides: nil, - }, - }, - }, - ) - _, err = deployment.ConfirmIfNoError(e.Env.Chains[destChain], tx, err) - require.NoError(t, err, "failed to send/confirm manuallyExecute tx") - - newExecutionState, err := state.Chains[destChain].OffRamp.GetExecutionState(&bind.CallOpts{Context: ctx}, sourceChain, out.MsgSentEvent.SequenceNumber) - require.NoError(t, err) - require.Equal(t, uint8(testhelpers.EXECUTION_STATE_SUCCESS), newExecutionState) -} - -func getMerkleRoot( - ctx context.Context, - t *testing.T, - offRamp offramp.OffRampInterface, - seqNr, - startBlock uint64, -) (merkleRoot [32]byte) { - iter, err := offRamp.FilterCommitReportAccepted(&bind.FilterOpts{ - Context: ctx, - Start: startBlock, - }) - require.NoError(t, err) - for iter.Next() { - for _, mr := range iter.Event.BlessedMerkleRoots { - if mr.MinSeqNr >= seqNr || mr.MaxSeqNr <= seqNr { - return mr.MerkleRoot - } - } - // todo: dedup - // ------------------------------ - for _, mr := range iter.Event.UnblessedMerkleRoots { - if mr.MinSeqNr >= seqNr || mr.MaxSeqNr <= seqNr { - return mr.MerkleRoot - } - } - // ------------------------------ - } - require.Fail( - t, - fmt.Sprintf("no merkle root found for seq nr %d", seqNr), - ) - return merkleRoot -} - -func getMessageHash( - ctx context.Context, - t *testing.T, - offRamp offramp.OffRampInterface, - sourceChainSelector, - seqNr uint64, - msgID [32]byte, - startBlock uint64, -) (messageHash [32]byte) { - iter, err := offRamp.FilterExecutionStateChanged( - &bind.FilterOpts{ - Context: ctx, - Start: startBlock, - }, - []uint64{sourceChainSelector}, - []uint64{seqNr}, - [][32]byte{msgID}, - ) - require.NoError(t, err) - require.True(t, iter.Next()) - require.Equal(t, sourceChainSelector, iter.Event.SourceChainSelector) - require.Equal(t, seqNr, iter.Event.SequenceNumber) - require.Equal(t, msgID, iter.Event.MessageId) - - return iter.Event.MessageHash -} - -// boolsToBitFlags transforms a list of boolean flags to a *big.Int encoded number. -func boolsToBitFlags(bools []bool) *big.Int { - encodedFlags := big.NewInt(0) - for i := 0; i < len(bools); i++ { - if bools[i] { - encodedFlags.SetBit(encodedFlags, i, 1) - } - } - return encodedFlags -} From 048a4557ab557c8745b22be3d007f676bba31888 Mon Sep 17 00:00:00 2001 From: Cedric Date: Thu, 20 Feb 2025 11:25:46 +0000 Subject: [PATCH 06/58] Add workflow key to NodeInfo (#16492) --- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 ++-- deployment/common/view/nops.go | 2 ++ deployment/environment.go | 3 +++ deployment/environment_test.go | 16 ++++++++++------ deployment/go.mod | 2 +- deployment/go.sum | 4 ++-- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 ++-- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 ++-- 11 files changed, 27 insertions(+), 18 deletions(-) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 8b8c07425db..f1a99fa4b15 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -345,7 +345,7 @@ require ( github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb // indirect - github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 // indirect + github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 // indirect github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 09c5ff95b01..ec8dc2be52a 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1102,8 +1102,8 @@ github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441- github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 h1:3icYNFldKQbs6Qrfai2LE+tKbNcE4tfgPRELF30mnEA= github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02/go.mod h1:7DbPnG0E39eZaX1CXKxRiJ1NOWHwTZYDWR9ys3kZZuU= -github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= -github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= +github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 h1:hfMRj2ny6oNHd8w1rhJHdoX3YkoWJtCkBK6wTlCE4+c= +github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 h1:L6KJ4kGv/yNNoCk8affk7Y1vAY0qglPMXC/hevV/IsA= diff --git a/deployment/common/view/nops.go b/deployment/common/view/nops.go index 200d8e744a6..9e5ec6c0dd7 100644 --- a/deployment/common/view/nops.go +++ b/deployment/common/view/nops.go @@ -20,6 +20,7 @@ type NopView struct { OCRKeys map[string]OCRKeyView `json:"ocrKeys"` PayeeAddress string `json:"payeeAddress"` CSAKey string `json:"csaKey"` + WorkflowKey string `json:"workflowKey"` IsConnected bool `json:"isConnected"` IsEnabled bool `json:"isEnabled"` Labels []LabelView `json:"labels"` @@ -74,6 +75,7 @@ func GenerateNopsView(nodeIDs []string, oc deployment.OffchainClient) (map[strin OCRKeys: make(map[string]OCRKeyView), PayeeAddress: node.AdminAddr, CSAKey: nodeDetails.Node.PublicKey, + WorkflowKey: nodeDetails.Node.GetWorkflowKey(), IsConnected: nodeDetails.Node.IsConnected, IsEnabled: nodeDetails.Node.IsEnabled, Labels: labels, diff --git a/deployment/environment.go b/deployment/environment.go index 58d61061541..360b5f629cf 100644 --- a/deployment/environment.go +++ b/deployment/environment.go @@ -332,6 +332,7 @@ type Node struct { NodeID string Name string CSAKey string + WorkflowKey string SelToOCRConfig map[chain_selectors.ChainDetails]OCRConfig PeerID p2pkey.PeerID IsBootstrap bool @@ -491,6 +492,7 @@ func NewNodeFromJD(jdNode *nodev1.Node, chainConfigs []*nodev1.ChainConfig) (*No NodeID: jdNode.Id, Name: jdNode.Name, CSAKey: jdNode.PublicKey, + WorkflowKey: jdNode.GetWorkflowKey(), SelToOCRConfig: make(map[chain_selectors.ChainDetails]OCRConfig), } var goldenConfig *nodev1.ChainConfig @@ -516,6 +518,7 @@ func NewNodeFromJD(jdNode *nodev1.Node, chainConfigs []*nodev1.ChainConfig) (*No NodeID: jdNode.Id, Name: jdNode.Name, CSAKey: jdNode.PublicKey, + WorkflowKey: jdNode.GetWorkflowKey(), SelToOCRConfig: selToOCRConfig, IsBootstrap: bootstrap, PeerID: MustPeerIDFromString(goldenConfig.Ocr2Config.P2PKeyBundle.PeerId), diff --git a/deployment/environment_test.go b/deployment/environment_test.go index ac23ee2889c..29578366916 100644 --- a/deployment/environment_test.go +++ b/deployment/environment_test.go @@ -339,6 +339,7 @@ func Test_isValidMultiAddr(t *testing.T) { } } func TestNewNodeFromJD(t *testing.T) { + wk := "node-workflow-key" type args struct { jdNode *nodev1.Node chainConfigs []*nodev1.ChainConfig @@ -353,9 +354,10 @@ func TestNewNodeFromJD(t *testing.T) { name: "ok", args: args{ jdNode: &nodev1.Node{ - Id: "node-id1", - Name: "node1", - PublicKey: "node-pub-key", + Id: "node-id1", + Name: "node1", + PublicKey: "node-pub-key", + WorkflowKey: &wk, }, chainConfigs: []*nodev1.ChainConfig{ { @@ -380,9 +382,10 @@ func TestNewNodeFromJD(t *testing.T) { }, }, want: &Node{ - NodeID: "node-id1", - Name: "node1", - CSAKey: "node-pub-key", + NodeID: "node-id1", + Name: "node1", + CSAKey: "node-pub-key", + WorkflowKey: "node-workflow-key", SelToOCRConfig: map[chain_selectors.ChainDetails]OCRConfig{ { ChainSelector: chain_selectors.ETHEREUM_MAINNET_ARBITRUM_1.Selector, @@ -449,6 +452,7 @@ func TestNewNodeFromJD(t *testing.T) { assert.Equal(t, tt.want.PeerID, got.PeerID) assert.Equal(t, tt.want.CSAKey, got.CSAKey) assert.Equal(t, tt.want.NodeID, got.NodeID) + assert.Equal(t, tt.want.WorkflowKey, got.WorkflowKey) assert.Equal(t, tt.want.Name, got.Name) for k, v := range tt.want.SelToOCRConfig { assert.Equal(t, v, got.SelToOCRConfig[k]) diff --git a/deployment/go.mod b/deployment/go.mod index 11ea7a213ad..262150b519b 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -35,7 +35,7 @@ require ( github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 - github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 + github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 diff --git a/deployment/go.sum b/deployment/go.sum index 3c3309070d9..5fd96a19bf3 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1150,8 +1150,8 @@ github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441- github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 h1:3icYNFldKQbs6Qrfai2LE+tKbNcE4tfgPRELF30mnEA= github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02/go.mod h1:7DbPnG0E39eZaX1CXKxRiJ1NOWHwTZYDWR9ys3kZZuU= -github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= -github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= +github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 h1:hfMRj2ny6oNHd8w1rhJHdoX3YkoWJtCkBK6wTlCE4+c= +github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 h1:L6KJ4kGv/yNNoCk8affk7Y1vAY0qglPMXC/hevV/IsA= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 19b237fa380..4c576adc0fe 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -52,7 +52,7 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 - github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 + github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0 github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 699e03dae19..477ad31608a 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1402,8 +1402,8 @@ github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441- github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 h1:3icYNFldKQbs6Qrfai2LE+tKbNcE4tfgPRELF30mnEA= github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02/go.mod h1:7DbPnG0E39eZaX1CXKxRiJ1NOWHwTZYDWR9ys3kZZuU= -github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= -github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= +github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 h1:hfMRj2ny6oNHd8w1rhJHdoX3YkoWJtCkBK6wTlCE4+c= +github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 h1:L6KJ4kGv/yNNoCk8affk7Y1vAY0qglPMXC/hevV/IsA= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index d122de7671f..41d6de9c90f 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -423,7 +423,7 @@ require ( github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb // indirect - github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 // indirect + github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 // indirect github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 4f0a836f8c4..b177d929157 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1385,8 +1385,8 @@ github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441- github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 h1:3icYNFldKQbs6Qrfai2LE+tKbNcE4tfgPRELF30mnEA= github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02/go.mod h1:7DbPnG0E39eZaX1CXKxRiJ1NOWHwTZYDWR9ys3kZZuU= -github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= -github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= +github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 h1:hfMRj2ny6oNHd8w1rhJHdoX3YkoWJtCkBK6wTlCE4+c= +github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 h1:L6KJ4kGv/yNNoCk8affk7Y1vAY0qglPMXC/hevV/IsA= From e6a6fb2f8743aad79adb4880d004a2fd6a2e43a9 Mon Sep 17 00:00:00 2001 From: jinhoonbang Date: Thu, 20 Feb 2025 04:16:04 -0800 Subject: [PATCH 07/58] fix typo (#16478) --- contracts/scripts/native_solc_compile_all_vrfv2plus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/scripts/native_solc_compile_all_vrfv2plus b/contracts/scripts/native_solc_compile_all_vrfv2plus index 6a44b7d405a..0e82c435430 100755 --- a/contracts/scripts/native_solc_compile_all_vrfv2plus +++ b/contracts/scripts/native_solc_compile_all_vrfv2plus @@ -1,4 +1,4 @@ -\#!/usr/bin/env bash +#!/usr/bin/env bash set -e From 3b0de83a549a57fcebc46befac4c2cc6ee4b8677 Mon Sep 17 00:00:00 2001 From: Austin <107539019+0xAustinWang@users.noreply.github.com> Date: Thu, 20 Feb 2025 20:51:01 +0800 Subject: [PATCH 08/58] Support the ability to replace the chainlink don, without replacing geth entirely (#16471) * parallelize operations in the deployer group * enable replacing ocr only * Update deployment/environment/crib/ccip_deployer.go Co-authored-by: Abdelrahman Soliman (Boda) <2677789+asoliman92@users.noreply.github.com> --------- Co-authored-by: Abdelrahman Soliman (Boda) <2677789+asoliman92@users.noreply.github.com> --- deployment/environment/crib/ccip_deployer.go | 40 +++++++++++++++----- integration-tests/testconfig/ccip/ccip.toml | 7 ++-- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/deployment/environment/crib/ccip_deployer.go b/deployment/environment/crib/ccip_deployer.go index fb8890238d3..49e3fae4678 100644 --- a/deployment/environment/crib/ccip_deployer.go +++ b/deployment/environment/crib/ccip_deployer.go @@ -125,7 +125,7 @@ func DeployCCIPAndAddLanes(ctx context.Context, lggr logger.Logger, envConfig de // ----- Part 2 ----- lggr.Infow("setting up ocr...") - *e, err = setupOCR(e, homeChainSel, feedChainSel) + *e, err = mustOCR(e, homeChainSel, feedChainSel, true) if err != nil { return DeployCCIPOutput{}, fmt.Errorf("failed to apply changesets for setting up OCR: %w", err) } @@ -205,8 +205,7 @@ func ConnectCCIPLanes(ctx context.Context, lggr logger.Logger, envConfig devenv. }, nil } -// ConfigureCCIPOCR is a group of changesets used from CRIB to configure OCR on a new setup -// This sets up OCR on all chains in the envConfig by configuring the CCIP home chain +// ConfigureCCIPOCR is a group of changesets used from CRIB to redeploy the chainlink don on an existing setup func ConfigureCCIPOCR(ctx context.Context, lggr logger.Logger, envConfig devenv.EnvironmentConfig, homeChainSel, feedChainSel uint64, ab deployment.AddressBook) (DeployCCIPOutput, error) { e, _, err := devenv.NewEnvironment(func() context.Context { return ctx }, lggr, envConfig) if err != nil { @@ -214,8 +213,8 @@ func ConfigureCCIPOCR(ctx context.Context, lggr logger.Logger, envConfig devenv. } e.ExistingAddresses = ab - lggr.Infow("setting up ocr...") - *e, err = setupOCR(e, homeChainSel, feedChainSel) + lggr.Infow("resetting ocr...") + *e, err = mustOCR(e, homeChainSel, feedChainSel, false) if err != nil { return DeployCCIPOutput{}, fmt.Errorf("failed to apply changesets for setting up OCR: %w", err) } @@ -522,7 +521,7 @@ func setupLanes(e *deployment.Environment, state changeset.CCIPOnChainState) (de return *e, err } -func setupOCR(e *deployment.Environment, homeChainSel uint64, feedChainSel uint64) (deployment.Environment, error) { +func mustOCR(e *deployment.Environment, homeChainSel uint64, feedChainSel uint64, newDons bool) (deployment.Environment, error) { chainSelectors := e.AllChainSelectors() var ocrConfigPerSelector = make(map[uint64]changeset.CCIPOCRParams) for selector := range e.Chains { @@ -530,8 +529,10 @@ func setupOCR(e *deployment.Environment, homeChainSel uint64, feedChainSel uint6 changeset.WithDefaultExecuteOffChainConfig(nil), ) } - return commonchangeset.Apply(nil, *e, nil, - commonchangeset.Configure( + + var commitChangeset commonchangeset.ConfiguredChangeSet + if newDons { + commitChangeset = commonchangeset.Configure( // Add the DONs and candidate commit OCR instances for the chain deployment.CreateLegacyChangeSet(changeset.AddDonAndSetCandidateChangeset), changeset.AddDonAndSetCandidateChangesetConfig{ @@ -544,7 +545,28 @@ func setupOCR(e *deployment.Environment, homeChainSel uint64, feedChainSel uint6 PluginType: types.PluginTypeCCIPCommit, }, }, - ), + ) + } else { + commitChangeset = commonchangeset.Configure( + // Update commit OCR instances for existing chains + deployment.CreateLegacyChangeSet(changeset.SetCandidateChangeset), + changeset.SetCandidateChangesetConfig{ + SetCandidateConfigBase: changeset.SetCandidateConfigBase{ + HomeChainSelector: homeChainSel, + FeedChainSelector: feedChainSel, + }, + PluginInfo: []changeset.SetCandidatePluginInfo{ + { + OCRConfigPerRemoteChainSelector: ocrConfigPerSelector, + PluginType: types.PluginTypeCCIPCommit, + }, + }, + }, + ) + } + + return commonchangeset.Apply(nil, *e, nil, + commitChangeset, commonchangeset.Configure( // Add the exec OCR instances for the new chains deployment.CreateLegacyChangeSet(changeset.SetCandidateChangeset), diff --git a/integration-tests/testconfig/ccip/ccip.toml b/integration-tests/testconfig/ccip/ccip.toml index e8ca343bbab..9d98f796900 100644 --- a/integration-tests/testconfig/ccip/ccip.toml +++ b/integration-tests/testconfig/ccip/ccip.toml @@ -243,13 +243,12 @@ ephemeral_addresses_number = 0 [Load.CCIP.Load] # MessageTypeWeights corresponds with [data only, token only, message with token] -#MessageTypeWeights = [100,0,0] MessageTypeWeights = [100,0,0] # each destination chain will receive 1 incoming request per RequestFrequency for the duration of LoadDuration RequestFrequency = "5s" -LoadDuration = "1h" +LoadDuration = "10m" # destination chain selectors to send messages to -NumDestinationChains = 30 +NumDestinationChains = 8 # Directory where we receive environment configuration from crib CribEnvDirectory = "../../../../crib/deployments/ccip-v2/.tmp" -TimeoutDuration = "1h" \ No newline at end of file +TimeoutDuration = "20m" \ No newline at end of file From 227ded3d2321aa7f9154359a6677474ebecbf64c Mon Sep 17 00:00:00 2001 From: Bartek Tofel Date: Thu, 20 Feb 2025 14:41:53 +0100 Subject: [PATCH 09/58] [TT-1997] modular keystone smoke test -> new module (#16411) * modular keystone smoke test -> new module * fix go.md, dynamically resolve gist ip, update forwarder address in CI config * decouple lib from testing.T * fix lints and CI test config * go mod tidy + check returned err * go mod tidy * add single point of entry to configure keystone env * safer keystone env field access * make code more explicit * separate test for single and multi DON * remove conditional logic from test config * fix lints * use unique job names * check only one price in the CI * fix e2e test setup, allow using cached contract addresses and config * remove one validator * use tagged version of CTF * go mod tidy * fix keytsone test path * CR changes: less public variables, labels for node roles, clearer function naming, more input structs * add Validate() to all input structs * go mod tidy * try using latest version of github.com/smartcontractkit/ccip-owner-contracts * add changeset * update keystone e2e test name in gh config * go mod tidy, update ci env config * move price provider to dedicated file --- .changeset/weak-terms-type.md | 5 + .github/e2e-tests.yml | 14 +- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 +- deployment/environment/devenv/don.go | 19 +- deployment/go.mod | 2 +- deployment/go.sum | 4 +- go.md | 6 + integration-tests/go.mod | 11 +- integration-tests/go.sum | 6 +- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 +- .../smoke/capabilities/workflow_test.go | 2529 ----------------- system-tests/lib/conversions/ints.go | 35 + system-tests/lib/cre/capabilities/download.go | 28 + system-tests/lib/cre/contracts/contracts.go | 490 ++++ .../lib/cre/contracts/workflow_registry.go | 69 + system-tests/lib/cre/debug/debug.go | 283 ++ system-tests/lib/cre/don/config/config.go | 22 + .../lib/cre/don/config/definitions.go | 164 ++ system-tests/lib/cre/don/config/por/por.go | 122 + system-tests/lib/cre/don/don.go | 135 + system-tests/lib/cre/don/jobs/definitions.go | 219 ++ system-tests/lib/cre/don/jobs/jd.go | 52 + system-tests/lib/cre/don/jobs/jobs.go | 71 + system-tests/lib/cre/don/jobs/por/por.go | 125 + system-tests/lib/cre/don/node/node.go | 144 + system-tests/lib/cre/don/peering.go | 82 + .../lib/cre/environment/environment.go | 101 + system-tests/lib/cre/flags/flags.go | 45 + system-tests/lib/cre/types/flags.go | 24 + system-tests/lib/cre/types/keystone.go | 377 +++ system-tests/lib/crecli/commands.go | 70 + system-tests/lib/crecli/download.go | 75 + system-tests/lib/crecli/por/por.go | 50 + system-tests/lib/crecli/settings.go | 115 + system-tests/lib/funding/funding.go | 173 ++ system-tests/lib/go.mod | 472 +++ system-tests/lib/go.sum | 1956 +++++++++++++ system-tests/lib/net/download.go | 51 + system-tests/lib/types/funding.go | 20 + .../tests}/.gitignore | 0 system-tests/tests/go.mod | 478 ++++ system-tests/tests/go.sum | 1956 +++++++++++++ .../smoke/capabilities/environment-ci.toml | 17 +- .../capabilities/environment-multi-don.toml | 103 +- .../smoke/capabilities/environment.toml | 44 +- .../tests}/smoke/capabilities/guidelines.md | 0 .../smoke/capabilities/por_price_provider.go | 195 ++ .../tests/smoke/capabilities/workflow_test.go | 876 ++++++ 50 files changed, 9179 insertions(+), 2668 deletions(-) create mode 100644 .changeset/weak-terms-type.md delete mode 100644 integration-tests/smoke/capabilities/workflow_test.go create mode 100644 system-tests/lib/conversions/ints.go create mode 100644 system-tests/lib/cre/capabilities/download.go create mode 100644 system-tests/lib/cre/contracts/contracts.go create mode 100644 system-tests/lib/cre/contracts/workflow_registry.go create mode 100644 system-tests/lib/cre/debug/debug.go create mode 100644 system-tests/lib/cre/don/config/config.go create mode 100644 system-tests/lib/cre/don/config/definitions.go create mode 100644 system-tests/lib/cre/don/config/por/por.go create mode 100644 system-tests/lib/cre/don/don.go create mode 100644 system-tests/lib/cre/don/jobs/definitions.go create mode 100644 system-tests/lib/cre/don/jobs/jd.go create mode 100644 system-tests/lib/cre/don/jobs/jobs.go create mode 100644 system-tests/lib/cre/don/jobs/por/por.go create mode 100644 system-tests/lib/cre/don/node/node.go create mode 100644 system-tests/lib/cre/don/peering.go create mode 100644 system-tests/lib/cre/environment/environment.go create mode 100644 system-tests/lib/cre/flags/flags.go create mode 100644 system-tests/lib/cre/types/flags.go create mode 100644 system-tests/lib/cre/types/keystone.go create mode 100644 system-tests/lib/crecli/commands.go create mode 100644 system-tests/lib/crecli/download.go create mode 100644 system-tests/lib/crecli/por/por.go create mode 100644 system-tests/lib/crecli/settings.go create mode 100644 system-tests/lib/funding/funding.go create mode 100644 system-tests/lib/go.mod create mode 100644 system-tests/lib/go.sum create mode 100644 system-tests/lib/net/download.go create mode 100644 system-tests/lib/types/funding.go rename {integration-tests/smoke/capabilities => system-tests/tests}/.gitignore (100%) create mode 100644 system-tests/tests/go.mod create mode 100644 system-tests/tests/go.sum rename {integration-tests => system-tests/tests}/smoke/capabilities/environment-ci.toml (80%) rename {integration-tests => system-tests/tests}/smoke/capabilities/environment-multi-don.toml (58%) rename {integration-tests => system-tests/tests}/smoke/capabilities/environment.toml (67%) rename {integration-tests => system-tests/tests}/smoke/capabilities/guidelines.md (100%) create mode 100644 system-tests/tests/smoke/capabilities/por_price_provider.go create mode 100644 system-tests/tests/smoke/capabilities/workflow_test.go diff --git a/.changeset/weak-terms-type.md b/.changeset/weak-terms-type.md new file mode 100644 index 00000000000..3b7b01e8dc5 --- /dev/null +++ b/.changeset/weak-terms-type.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#updated ccip-owner-contracts in CLD to latest diff --git a/.github/e2e-tests.yml b/.github/e2e-tests.yml index 65b03846c43..335bacf1d14 100644 --- a/.github/e2e-tests.yml +++ b/.github/e2e-tests.yml @@ -183,14 +183,14 @@ runner-test-matrix: E2E_TEST_CHAINLINK_VERSION: '{{ env.DEFAULT_CHAINLINK_PLUGINS_VERSION }}' # This is the chainlink version that has the plugins ENABLE_OTEL_TRACES: true - - id: smoke/capabilities/workflow_test.go:* - path: integration-tests/smoke/capabilities/workflow_test.go + - id: system-tests/smoke/capabilities/workflow_test.go:TestKeystoneWithOCR3Workflow_SingleDon + path: system-tests/tests/smoke/capabilities/workflow_test.go test_env_type: docker runs_on: ubuntu-latest triggers: - PR Workflow Engine E2E Core Tests - Nightly E2E Tests - test_cmd: cd integration-tests && go test github.com/smartcontractkit/chainlink/integration-tests/smoke/capabilities -v -run "^(TestKeystoneWithOCR3Workflow)$" -timeout 30m -count=1 -test.parallel=1 -json + test_cmd: cd system-tests/tests && go test github.com/smartcontractkit/chainlink/system-tests/tests/smoke/capabilities -v -run "^(TestKeystoneWithOCR3Workflow_SingleDon_MockedPrice)$" -timeout 30m -count=1 -test.parallel=1 -json pyroscope_env: ci-smoke-capabilities-evm-simulated test_env_vars: E2E_TEST_CHAINLINK_VERSION: '{{ env.DEFAULT_CHAINLINK_PLUGINS_VERSION }}' # This is the chainlink version that has the plugins @@ -1112,11 +1112,11 @@ runner-test-matrix: CCIP_V16_TEST_ENV: docker - id: smoke/ccip/ccip_rmn_test.go:^TestRMN_IncorrectSig$ - path: integration-tests/smoke/ccip/ccip_rmn_test.go + path: integration-tests/smoke/ccip/ccip_rmn_test.go test_env_type: docker runs_on: ubuntu20.04-8cores-32GB triggers: - - PR E2E Core Tests + - PR E2E Core Tests - Nightly E2E Tests test_cmd: cd integration-tests/smoke/ccip && go test -test.run ^TestRMN_IncorrectSig$ -timeout 20m -test.parallel=1 -count=1 -json pyroscope_env: ci-smoke-ccipv1_6-evm-simulated @@ -1128,11 +1128,11 @@ runner-test-matrix: CCIP_V16_TEST_ENV: docker - id: smoke/ccip/ccip_rmn_test.go:^TestRMN_TwoMessagesOnTwoLanesIncludingBatchingWithTemporaryPause$ - path: integration-tests/smoke/ccip/ccip_rmn_test.go + path: integration-tests/smoke/ccip/ccip_rmn_test.go test_env_type: docker runs_on: ubuntu20.04-8cores-32GB triggers: - - PR E2E Core Tests + - PR E2E Core Tests - Nightly E2E Tests test_cmd: cd integration-tests/smoke/ccip && go test -test.run ^TestRMN_TwoMessagesOnTwoLanesIncludingBatchingWithTemporaryPause$ -timeout 12m -test.parallel=1 -count=1 -json pyroscope_env: ci-smoke-ccipv1_6-evm-simulated diff --git a/core/scripts/go.mod b/core/scripts/go.mod index f1a99fa4b15..4abaebcec06 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -338,7 +338,7 @@ require ( github.com/shirou/gopsutil/v3 v3.24.3 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect - github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect + github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index ec8dc2be52a..1f3dc61b15b 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1080,8 +1080,8 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix h1:DPJD++yKLSx0EfT+U14P8vLVxjXFmoIETiCO9lVwQo8= -github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix/go.mod h1:NnT6w4Kj42OFFXhSx99LvJZWPpMjmo4+CpDEWfw61xY= +github.com/smartcontractkit/ccip-owner-contracts v0.1.0 h1:GiBDtlx7539o7AKlDV+9LsA7vTMPv+0n7ClhSFnZFAk= +github.com/smartcontractkit/ccip-owner-contracts v0.1.0/go.mod h1:NnT6w4Kj42OFFXhSx99LvJZWPpMjmo4+CpDEWfw61xY= github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0DF25d3mh+vsYeZQiSCE= github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= diff --git a/deployment/environment/devenv/don.go b/deployment/environment/devenv/don.go index 50ec3805377..df360dc0845 100644 --- a/deployment/environment/devenv/don.go +++ b/deployment/environment/devenv/don.go @@ -32,13 +32,14 @@ const ( // NodeInfo holds the information required to create a node type NodeInfo struct { - CLConfig clclient.ChainlinkConfig // config to connect to chainlink node via API - P2PPort string // port for P2P communication - IsBootstrap bool // denotes if the node is a bootstrap node - Name string // name of the node, used to identify the node, helpful in logs - AdminAddr string // admin address to send payments to, applicable only for non-bootstrap nodes - MultiAddr string // multi address denoting node's FQN (needed for deriving P2PBootstrappers in OCR), applicable only for bootstrap nodes - Labels map[string]string // labels to use when registering the node with job distributor + CLConfig clclient.ChainlinkConfig // config to connect to chainlink node via API + P2PPort string // port for P2P communication + IsBootstrap bool // denotes if the node is a bootstrap node + Name string // name of the node, used to identify the node, helpful in logs + AdminAddr string // admin address to send payments to, applicable only for non-bootstrap nodes + MultiAddr string // multi address denoting node's FQN (needed for deriving P2PBootstrappers in OCR), applicable only for bootstrap nodes + Labels map[string]string // labels to use when registering the node with job distributor + ContainerName string // name of Docker container } type DON struct { @@ -206,6 +207,10 @@ func (n *Node) Labels() []*ptypes.Label { return n.labels } +func (n *Node) AddLabel(label *ptypes.Label) { + n.labels = append(n.labels, label) +} + // CreateCCIPOCRSupportedChains creates a JobDistributorChainConfig for the node. // It works under assumption that the node is already registered with the job distributor. // It expects bootstrap nodes to have label with key "type" and value as "bootstrap". diff --git a/deployment/go.mod b/deployment/go.mod index 262150b519b..5f2c01cd595 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -28,7 +28,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/rs/zerolog v1.33.0 github.com/sethvargo/go-retry v0.2.4 - github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix + github.com/smartcontractkit/ccip-owner-contracts v0.1.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 diff --git a/deployment/go.sum b/deployment/go.sum index 5fd96a19bf3..c899c4da9ba 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1128,8 +1128,8 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix h1:DPJD++yKLSx0EfT+U14P8vLVxjXFmoIETiCO9lVwQo8= -github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix/go.mod h1:NnT6w4Kj42OFFXhSx99LvJZWPpMjmo4+CpDEWfw61xY= +github.com/smartcontractkit/ccip-owner-contracts v0.1.0 h1:GiBDtlx7539o7AKlDV+9LsA7vTMPv+0n7ClhSFnZFAk= +github.com/smartcontractkit/ccip-owner-contracts v0.1.0/go.mod h1:NnT6w4Kj42OFFXhSx99LvJZWPpMjmo4+CpDEWfw61xY= github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0DF25d3mh+vsYeZQiSCE= github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= diff --git a/go.md b/go.md index 0a9ebdb8455..8bcff404215 100644 --- a/go.md +++ b/go.md @@ -193,6 +193,10 @@ flowchart LR click chainlink/integration-tests href "https://github.com/smartcontractkit/chainlink" chainlink/load-tests --> chainlink/integration-tests click chainlink/load-tests href "https://github.com/smartcontractkit/chainlink" + chainlink/system-tests/lib --> chainlink/deployment + click chainlink/system-tests/lib href "https://github.com/smartcontractkit/chainlink" + chainlink/system-tests/tests --> chainlink/system-tests/lib + click chainlink/system-tests/tests href "https://github.com/smartcontractkit/chainlink" chainlink/v2 --> chainlink-automation chainlink/v2 --> chainlink-data-streams chainlink/v2 --> chainlink-feeds @@ -223,6 +227,8 @@ flowchart LR chainlink/deployment chainlink/integration-tests chainlink/load-tests + chainlink/system-tests/lib + chainlink/system-tests/tests chainlink/v2 end click chainlink-repo href "https://github.com/smartcontractkit/chainlink" diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 4c576adc0fe..55f992dda69 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -28,11 +28,8 @@ require ( github.com/deckarep/golang-set/v2 v2.6.0 github.com/ethereum/go-ethereum v1.15.0 github.com/fxamacker/cbor/v2 v2.7.0 - github.com/gin-gonic/gin v1.10.0 github.com/go-resty/resty/v2 v2.15.3 - github.com/go-yaml/yaml v2.1.0+incompatible github.com/google/go-cmp v0.6.0 - github.com/google/go-github/v41 v41.0.0 github.com/google/uuid v1.6.0 github.com/jmoiron/sqlx v1.4.0 github.com/lib/pq v1.10.9 @@ -53,7 +50,6 @@ require ( github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 - github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0 github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 @@ -71,7 +67,6 @@ require ( go.uber.org/zap v1.27.0 golang.org/x/crypto v0.32.0 golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c - golang.org/x/oauth2 v0.23.0 golang.org/x/sync v0.10.0 golang.org/x/text v0.21.0 google.golang.org/grpc v1.67.1 @@ -217,6 +212,7 @@ require ( github.com/getsentry/sentry-go v0.27.0 // indirect github.com/gin-contrib/sessions v0.0.5 // indirect github.com/gin-contrib/sse v0.1.0 // indirect + github.com/gin-gonic/gin v1.10.0 // indirect github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect github.com/go-errors/errors v1.4.2 // indirect github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 // indirect @@ -259,6 +255,7 @@ require ( github.com/google/btree v1.1.2 // indirect github.com/google/flatbuffers v24.3.25+incompatible // indirect github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect + github.com/google/go-github/v41 v41.0.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/go-tpm v0.9.0 // indirect github.com/google/gofuzz v1.2.0 // indirect @@ -430,7 +427,7 @@ require ( github.com/shirou/gopsutil/v3 v3.24.3 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect - github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect + github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect @@ -440,6 +437,7 @@ require ( github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a // indirect + github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0 // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect github.com/smartcontractkit/mcms v0.10.0 // indirect github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect @@ -515,6 +513,7 @@ require ( golang.org/x/arch v0.11.0 // indirect golang.org/x/mod v0.22.0 // indirect golang.org/x/net v0.34.0 // indirect + golang.org/x/oauth2 v0.23.0 // indirect golang.org/x/sys v0.29.0 // indirect golang.org/x/term v0.28.0 // indirect golang.org/x/time v0.7.0 // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 477ad31608a..d33f50ae8ec 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -593,8 +593,6 @@ github.com/go-webauthn/webauthn v0.9.4 h1:YxvHSqgUyc5AK2pZbqkWWR55qKeDPhP8zLDr6l github.com/go-webauthn/webauthn v0.9.4/go.mod h1:LqupCtzSef38FcxzaklmOn7AykGKhAhr9xlRbdbgnTw= 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-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= -github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= 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.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= @@ -1380,8 +1378,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/slack-go/slack v0.15.0 h1:LE2lj2y9vqqiOf+qIIy0GvEoxgF1N5yLGZffmEZykt0= github.com/slack-go/slack v0.15.0/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw= -github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix h1:DPJD++yKLSx0EfT+U14P8vLVxjXFmoIETiCO9lVwQo8= -github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix/go.mod h1:NnT6w4Kj42OFFXhSx99LvJZWPpMjmo4+CpDEWfw61xY= +github.com/smartcontractkit/ccip-owner-contracts v0.1.0 h1:GiBDtlx7539o7AKlDV+9LsA7vTMPv+0n7ClhSFnZFAk= +github.com/smartcontractkit/ccip-owner-contracts v0.1.0/go.mod h1:NnT6w4Kj42OFFXhSx99LvJZWPpMjmo4+CpDEWfw61xY= github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0DF25d3mh+vsYeZQiSCE= github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 41d6de9c90f..8ca24e49805 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -416,7 +416,7 @@ require ( github.com/shoenig/test v0.6.6 // indirect github.com/shopspring/decimal v1.4.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect - github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect + github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index b177d929157..1c6a4dee4a4 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1363,8 +1363,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/slack-go/slack v0.15.0 h1:LE2lj2y9vqqiOf+qIIy0GvEoxgF1N5yLGZffmEZykt0= github.com/slack-go/slack v0.15.0/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw= -github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix h1:DPJD++yKLSx0EfT+U14P8vLVxjXFmoIETiCO9lVwQo8= -github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix/go.mod h1:NnT6w4Kj42OFFXhSx99LvJZWPpMjmo4+CpDEWfw61xY= +github.com/smartcontractkit/ccip-owner-contracts v0.1.0 h1:GiBDtlx7539o7AKlDV+9LsA7vTMPv+0n7ClhSFnZFAk= +github.com/smartcontractkit/ccip-owner-contracts v0.1.0/go.mod h1:NnT6w4Kj42OFFXhSx99LvJZWPpMjmo4+CpDEWfw61xY= github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0DF25d3mh+vsYeZQiSCE= github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= diff --git a/integration-tests/smoke/capabilities/workflow_test.go b/integration-tests/smoke/capabilities/workflow_test.go deleted file mode 100644 index 04ac23cb629..00000000000 --- a/integration-tests/smoke/capabilities/workflow_test.go +++ /dev/null @@ -1,2529 +0,0 @@ -package capabilities_test - -import ( - "bufio" - "bytes" - "context" - "crypto/sha256" - "encoding/base64" - "encoding/hex" - "encoding/json" - "fmt" - "io" - "math/big" - "net/http" - "net/url" - "os" - "os/exec" - "path/filepath" - "regexp" - "runtime" - "slices" - "strconv" - "strings" - "sync" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/gin-gonic/gin" - "github.com/go-yaml/yaml" - "github.com/google/go-github/v41/github" - "github.com/google/uuid" - "github.com/pkg/errors" - "github.com/rs/zerolog" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "golang.org/x/oauth2" - "google.golang.org/grpc/credentials/insecure" - - "github.com/smartcontractkit/chainlink-testing-framework/framework" - "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" - "github.com/smartcontractkit/chainlink-testing-framework/framework/components/fake" - "github.com/smartcontractkit/chainlink-testing-framework/framework/components/jd" - ns "github.com/smartcontractkit/chainlink-testing-framework/framework/components/simple_node_set" - "github.com/smartcontractkit/chainlink-testing-framework/seth" - "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/integration-tests/actions" - - pkgworkflows "github.com/smartcontractkit/chainlink-common/pkg/workflows" - jobv1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/job" - - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/feeds_consumer" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/workflow/generated/workflow_registry_wrapper" - "github.com/smartcontractkit/chainlink/v2/core/logger" - - chainselectors "github.com/smartcontractkit/chain-selectors" - - capabilitiespb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb" - ctfconfig "github.com/smartcontractkit/chainlink-testing-framework/lib/config" - "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/ptr" - - "github.com/smartcontractkit/chainlink/deployment/environment/devenv" - "github.com/smartcontractkit/chainlink/deployment/environment/nodeclient" - keystone_changeset "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" - workflow_registry_changeset "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/workflowregistry" - kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" -) - -type WorkflowConfig struct { - UseCRECLI bool `toml:"use_cre_cli"` - ShouldCompileNewWorkflow bool `toml:"should_compile_new_workflow"` - // Tells the test where the workflow to compile is located - WorkflowFolderLocation *string `toml:"workflow_folder_location"` - CompiledWorkflowConfig *CompiledConfig `toml:"compiled_config"` - DependenciesConfig *DependenciesConfig `toml:"dependencies"` - WorkflowName string `toml:"workflow_name" validate:"required" ` -} - -// Defines relases/versions of test dependencies that will be downloaded from Github -type DependenciesConfig struct { - CapabiltiesVersion string `toml:"capabilities_version"` - CRECLIVersion string `toml:"cre_cli_version"` -} - -// Defines the location of already compiled workflow binary and config files -// They will be used if WorkflowConfig.ShouldCompileNewWorkflow is `false` -// Otherwise test will compile and upload a new workflow -type CompiledConfig struct { - BinaryURL string `toml:"binary_url"` - ConfigURL string `toml:"config_url"` -} - -type TestConfig struct { - BlockchainA *blockchain.Input `toml:"blockchain_a" validate:"required"` - NodeSets []*CapabilitiesAwareNodeSet `toml:"nodesets" validate:"required"` - WorkflowConfig *WorkflowConfig `toml:"workflow_config" validate:"required"` - JD *jd.Input `toml:"jd" validate:"required"` - PriceProvider *PriceProviderConfig `toml:"price_provider"` -} - -type CapabilitiesAwareNodeSet struct { - *ns.Input - Capabilities []string `toml:"capabilities"` - DONType string `toml:"don_type"` -} -type FakeConfig struct { - *fake.Input - Prices []float64 `toml:"prices"` -} - -type PriceProviderConfig struct { - Fake *FakeConfig `toml:"fake"` - FeedID string `toml:"feed_id" validate:"required"` - URL string `toml:"url"` -} - -func downloadGHAssetFromRelease(owner, repository, releaseTag, assetName, ghToken string) ([]byte, error) { - var content []byte - if ghToken == "" { - return content, errors.New("no github token provided") - } - - // assuming 180s is enough to fetch releases, find the asset we need and download it - // some assets might be 30+ MB, so we need to give it some time (for really slow connections) - ctx, cancelFn := context.WithTimeout(context.Background(), 180*time.Second) - defer cancelFn() - ts := oauth2.StaticTokenSource( - &oauth2.Token{AccessToken: ghToken}, - ) - tc := oauth2.NewClient(ctx, ts) - - ghClient := github.NewClient(tc) - - ghReleases, _, err := ghClient.Repositories.ListReleases(ctx, owner, repository, &github.ListOptions{PerPage: 20}) - if err != nil { - return content, errors.Wrapf(err, "failed to list releases for %s", repository) - } - - var ghRelease *github.RepositoryRelease - for _, release := range ghReleases { - if release.TagName == nil { - continue - } - - if *release.TagName == releaseTag { - ghRelease = release - break - } - } - - if ghRelease == nil { - return content, errors.New("failed to find release with tag: " + releaseTag) - } - - var assetID int64 - for _, asset := range ghRelease.Assets { - if strings.Contains(asset.GetName(), assetName) { - assetID = asset.GetID() - break - } - } - - if assetID == 0 { - return content, fmt.Errorf("failed to find asset %s for %s", assetName, *ghRelease.TagName) - } - - asset, _, err := ghClient.Repositories.DownloadReleaseAsset(ctx, owner, repository, assetID, tc) - if err != nil { - return content, errors.Wrapf(err, "failed to download asset %s for %s", assetName, *ghRelease.TagName) - } - - content, err = io.ReadAll(asset) - if err != nil { - return content, err - } - - return content, nil -} - -func GenerateWorkflowIDFromStrings(owner string, name string, workflow []byte, config []byte, secretsURL string) (string, error) { - ownerWithoutPrefix := owner - if strings.HasPrefix(owner, "0x") { - ownerWithoutPrefix = owner[2:] - } - - ownerb, err := hex.DecodeString(ownerWithoutPrefix) - if err != nil { - return "", err - } - - wid, err := pkgworkflows.GenerateWorkflowID(ownerb, name, workflow, config, secretsURL) - if err != nil { - return "", err - } - - return hex.EncodeToString(wid[:]), nil -} - -func isInstalled(name string) bool { - _, err := exec.LookPath(name) - return err == nil -} - -func download(url string) ([]byte, error) { - ctx, cancelFn := context.WithTimeout(context.Background(), 120*time.Second) - defer cancelFn() - - req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) - if err != nil { - return nil, err - } - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("received non-200 response: %d", resp.StatusCode) - } - - data, err := io.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("failed to read response body: %w", err) - } - - return data, nil -} - -func downloadAndDecode(url string) ([]byte, error) { - data, err := download(url) - if err != nil { - return nil, err - } - - decoded, err := base64.StdEncoding.DecodeString(string(data)) - if err != nil { - return nil, fmt.Errorf("failed to decode base64 content: %w", err) - } - - return decoded, nil -} - -type CRECLISettings struct { - DevPlatform DevPlatform `yaml:"dev-platform"` - UserWorkflow UserWorkflow `yaml:"user-workflow"` - Logging Logging `yaml:"logging"` - McmsConfig McmsConfig `yaml:"mcms-config"` - Contracts Contracts `yaml:"contracts"` - Rpcs []RPC `yaml:"rpcs"` -} - -type DevPlatform struct { - CapabilitiesRegistryAddress string `yaml:"capabilities-registry-contract-address"` - DonID uint32 `yaml:"don-id"` - WorkflowRegistryAddress string `yaml:"workflow-registry-contract-address"` -} - -type UserWorkflow struct { - WorkflowOwnerAddress string `yaml:"workflow-owner-address"` -} - -type Logging struct { - SethConfigPath string `yaml:"seth-config-path"` -} - -type McmsConfig struct { - ProposalsDirectory string `yaml:"proposals-directory"` -} - -type Contracts struct { - ContractRegistry []ContractRegistry `yaml:"registries"` -} - -type ContractRegistry struct { - Name string `yaml:"name"` - Address string `yaml:"address"` - ChainSelector uint64 `yaml:"chain-selector"` -} - -type RPC struct { - ChainSelector uint64 `yaml:"chain-selector"` - URL string `yaml:"url"` -} - -type PoRWorkflowConfig struct { - FeedID string `json:"feed_id"` - URL string `json:"url"` - ConsumerAddress string `json:"consumer_address"` -} - -const ( - CRECLISettingsFileName = ".cre-cli-settings.yaml" - cronCapabilityAssetFile = "amd64_cron" - e2eJobDistributorImageEnvVarName = "E2E_JD_IMAGE" - e2eJobDistributorVersionEnvVarName = "E2E_JD_VERSION" - ghReadTokenEnvVarName = "GITHUB_READ_TOKEN" - GistIP = "185.199.108.133" -) - -var ( - CRECLICommand string -) - -func downloadAndInstallChainlinkCLI(ghToken, version string) error { - system := runtime.GOOS - arch := runtime.GOARCH - - switch system { - case "darwin", "linux": - // nothing to do, we have the binaries - default: - return fmt.Errorf("chainlnk-cli does not support OS: %s", system) - } - - switch arch { - case "amd64", "arm64": - // nothing to do, we have the binaries - default: - return fmt.Errorf("chainlnk-cli does not support arch: %s", arch) - } - - CRECLIAssetFile := fmt.Sprintf("cre_%s_%s_%s.tar.gz", version, system, arch) - content, err := downloadGHAssetFromRelease("smartcontractkit", "dev-platform", version, CRECLIAssetFile, ghToken) - if err != nil { - return errors.Wrapf(err, "failed to download CRE CLI asset %s", CRECLIAssetFile) - } - - tmpfile, err := os.CreateTemp("", CRECLIAssetFile) - if err != nil { - return errors.Wrapf(err, "failed to create temp file for CRE CLI asset %s", CRECLIAssetFile) - } - defer tmpfile.Close() - - if _, err := tmpfile.Write(content); err != nil { - return errors.Wrapf(err, "failed to write content to temp file for CRE CLI asset %s", CRECLIAssetFile) - } - - cmd := exec.Command("tar", "-xvf", tmpfile.Name(), "-C", ".") // #nosec G204 - if cmd.Run() != nil { - return errors.Wrapf(err, "failed to extract CRE CLI asset %s", CRECLIAssetFile) - } - - extractedFileName := fmt.Sprintf("cre_%s_%s_%s", version, system, arch) - cmd = exec.Command("chmod", "+x", extractedFileName) - if cmd.Run() != nil { - return errors.Wrapf(err, "failed to make %s executable", extractedFileName) - } - - // set it to absolute path, because some commands (e.g. compile) need to be executed in the context - // of the workflow directory - extractedFile, err := os.Open(extractedFileName) - if err != nil { - return errors.Wrapf(err, "failed to open %s", extractedFileName) - } - - CRECLICommand, err = filepath.Abs(extractedFile.Name()) - if err != nil { - return errors.Wrapf(err, "failed to get absolute path for %s", tmpfile.Name()) - } - - if isInstalled := isInstalled(CRECLICommand); !isInstalled { - return errors.New("failed to install CRE CLI or it is not available in the PATH") - } - - return nil -} - -func downloadCronCapability(ghToken, version string) (string, error) { - content, err := downloadGHAssetFromRelease("smartcontractkit", "capabilities", version, cronCapabilityAssetFile, ghToken) - if err != nil { - return "", err - } - - fileName := cronCapabilityAssetFile - file, err := os.Create(cronCapabilityAssetFile) - if err != nil { - return "", err - } - defer file.Close() - - if _, err := file.Write(content); err != nil { - return "", err - } - - return fileName, nil -} - -func validateInputsAndEnvVars(t *testing.T, in *TestConfig) { - require.NotEmpty(t, os.Getenv("PRIVATE_KEY"), "PRIVATE_KEY env var must be set") - require.NotEmpty(t, in.WorkflowConfig.DependenciesConfig, "dependencies config must be set") - - if !in.WorkflowConfig.UseCRECLI { - require.False(t, in.WorkflowConfig.ShouldCompileNewWorkflow, "if you are not using CRE CLI you cannot compile a new workflow") - } - - var ghReadToken string - // this is a small hack to avoid changing the reusable workflow - if os.Getenv("CI") == "true" { - // This part should ideally happen outside of the test, but due to how our reusable e2e test workflow is structured now - // we cannot execute this part in workflow steps (it doesn't support any pre-execution hooks) - require.NotEmpty(t, os.Getenv(ctfconfig.E2E_TEST_CHAINLINK_IMAGE_ENV), "missing env var: "+ctfconfig.E2E_TEST_CHAINLINK_IMAGE_ENV) - require.NotEmpty(t, os.Getenv(ctfconfig.E2E_TEST_CHAINLINK_VERSION_ENV), "missing env var: "+ctfconfig.E2E_TEST_CHAINLINK_VERSION_ENV) - require.NotEmpty(t, os.Getenv(e2eJobDistributorImageEnvVarName), "missing env var: "+e2eJobDistributorImageEnvVarName) - require.NotEmpty(t, os.Getenv(e2eJobDistributorVersionEnvVarName), "missing env var: "+e2eJobDistributorVersionEnvVarName) - - // disabled until we can figure out how to generate a gist read:write token in CI - /* - This test can be run in two modes: - 1. `existing` mode: it uses a workflow binary (and configuration) file that is already uploaded to Gist - 2. `compile` mode: it compiles a new workflow binary and uploads it to Gist - - For the `new` mode to work, the `GITHUB_API_TOKEN` env var must be set to a token that has `gist:read` and `gist:write` permissions, but this permissions - are tied to account not to repository. Currently, we have no service account in the CI at all. And using a token that's tied to personal account of a developer - is not a good idea. So, for now, we are only allowing the `existing` mode in CI. - */ - require.False(t, in.WorkflowConfig.ShouldCompileNewWorkflow, "you cannot compile a new workflow in the CI as of now due to issues with generating a gist write token") - - // we use this special function to subsitute a placeholder env variable with the actual environment variable name - // it is defined in .github/e2e-tests.yml as '{{ env.GITHUB_API_TOKEN }}' - ghReadToken = ctfconfig.MustReadEnvVar_String(ghReadTokenEnvVarName) - } else { - ghReadToken = os.Getenv(ghReadTokenEnvVarName) - } - - require.NotEmpty(t, ghReadToken, ghReadTokenEnvVarName+" env var must be set") - require.NotEmpty(t, in.WorkflowConfig.DependenciesConfig.CapabiltiesVersion, "capabilities_version must be set in the dependencies config") - - _, err := downloadCronCapability(ghReadToken, in.WorkflowConfig.DependenciesConfig.CapabiltiesVersion) - require.NoError(t, err, "failed to download cron capability. Make sure token has content:read permissions to the capabilities repo") - - if in.WorkflowConfig.UseCRECLI { - require.NotEmpty(t, in.WorkflowConfig.DependenciesConfig.CRECLIVersion, "chainlink_cli_version must be set in the dependencies config") - - err = downloadAndInstallChainlinkCLI(ghReadToken, in.WorkflowConfig.DependenciesConfig.CRECLIVersion) - require.NoError(t, err, "failed to download and install CRE CLI. Make sure token has content:read permissions to the dev-platform repo") - - if in.WorkflowConfig.ShouldCompileNewWorkflow { - gistWriteToken := os.Getenv("GIST_WRITE_TOKEN") - require.NotEmpty(t, gistWriteToken, "GIST_WRITE_TOKEN must be set to use CRE CLI to compile workflows. It requires gist:read and gist:write permissions") - err := os.Setenv("GITHUB_API_TOKEN", gistWriteToken) - require.NoError(t, err, "failed to set GITHUB_API_TOKEN env var") - require.NotEmpty(t, in.WorkflowConfig.WorkflowFolderLocation, "workflow_folder_location must be set, when compiling new workflow") - } - } - - if in.PriceProvider.Fake == nil { - require.NotEmpty(t, in.PriceProvider.URL, "URL must be set in the price provider config, if fake provider is not used") - } - - if len(in.NodeSets) == 1 { - noneEmpty := in.NodeSets[0].DONType != "" && len(in.NodeSets[0].Capabilities) > 0 - bothEmpty := in.NodeSets[0].DONType == "" && len(in.NodeSets[0].Capabilities) == 0 - require.True(t, noneEmpty || bothEmpty, "either both DONType and Capabilities must be set or both must be empty, when using only one node set") - } else { - for _, nodeSet := range in.NodeSets { - require.NotEmpty(t, nodeSet.Capabilities, "capabilities must be set for each node set") - require.NotEmpty(t, nodeSet.DONType, "don_type must be set for each node set") - } - } - - // make sure the feed id is in the correct format - in.PriceProvider.FeedID = strings.TrimPrefix(in.PriceProvider.FeedID, "0x") -} - -// copied from Bala's unmerged PR: https://github.com/smartcontractkit/chainlink/pull/15751 -// TODO: remove this once the PR is merged and import his function -// IMPORTANT ADDITION: prefix to differentiate between the different DONs -func getNodeInfo(nodeOut *ns.Output, prefix string, bootstrapNodeCount int) ([]devenv.NodeInfo, error) { - var nodeInfo []devenv.NodeInfo - for i := 1; i <= len(nodeOut.CLNodes); i++ { - p2pURL, err := url.Parse(nodeOut.CLNodes[i-1].Node.DockerP2PUrl) - if err != nil { - return nil, fmt.Errorf("failed to parse p2p url: %w", err) - } - if i <= bootstrapNodeCount { - nodeInfo = append(nodeInfo, devenv.NodeInfo{ - IsBootstrap: true, - Name: fmt.Sprintf("%s_bootstrap-%d", prefix, i), - P2PPort: p2pURL.Port(), - CLConfig: nodeclient.ChainlinkConfig{ - URL: nodeOut.CLNodes[i-1].Node.HostURL, - Email: nodeOut.CLNodes[i-1].Node.APIAuthUser, - Password: nodeOut.CLNodes[i-1].Node.APIAuthPassword, - InternalIP: nodeOut.CLNodes[i-1].Node.InternalIP, - }, - }) - } else { - nodeInfo = append(nodeInfo, devenv.NodeInfo{ - IsBootstrap: false, - Name: fmt.Sprintf("%s_node-%d", prefix, i), - P2PPort: p2pURL.Port(), - CLConfig: nodeclient.ChainlinkConfig{ - URL: nodeOut.CLNodes[i-1].Node.HostURL, - Email: nodeOut.CLNodes[i-1].Node.APIAuthUser, - Password: nodeOut.CLNodes[i-1].Node.APIAuthPassword, - InternalIP: nodeOut.CLNodes[i-1].Node.InternalIP, - }, - }) - } - } - return nodeInfo, nil -} - -func buildChainlinkDeploymentEnv(t *testing.T, keystoneEnv *KeystoneEnvironment) { - lgr := logger.TestLogger(t) - require.NotNil(t, keystoneEnv, "keystone environment must be set") - require.NotNil(t, keystoneEnv.Blockchain, "blockchain must be set") - require.NotNil(t, keystoneEnv.WrappedNodeOutput, "wrapped node output must be set") - require.NotNil(t, keystoneEnv.JD, "job distributor must be set") - require.NotNil(t, keystoneEnv.SethClient, "seth client must be set") - require.GreaterOrEqual(t, len(keystoneEnv.Blockchain.Nodes), 1, "expected at least one node in the blockchain output") - require.GreaterOrEqual(t, len(keystoneEnv.WrappedNodeOutput), 1, "expected at least one node in the wrapped node output") - - envs := make([]*deployment.Environment, len(keystoneEnv.WrappedNodeOutput)) - keystoneEnv.dons = make([]*devenv.DON, len(keystoneEnv.WrappedNodeOutput)) - - for i, nodeOutput := range keystoneEnv.WrappedNodeOutput { - // assume that each nodeset has only one bootstrap node - nodeInfo, err := getNodeInfo(nodeOutput.Output, nodeOutput.NodeSetName, 1) - require.NoError(t, err, "failed to get node info") - - jdConfig := devenv.JDConfig{ - GRPC: keystoneEnv.JD.HostGRPCUrl, - WSRPC: keystoneEnv.JD.DockerWSRPCUrl, - Creds: insecure.NewCredentials(), - NodeInfo: nodeInfo, - } - - devenvConfig := devenv.EnvironmentConfig{ - JDConfig: jdConfig, - Chains: []devenv.ChainConfig{ - { - ChainID: keystoneEnv.SethClient.Cfg.Network.ChainID, - ChainName: keystoneEnv.SethClient.Cfg.Network.Name, - ChainType: strings.ToUpper(keystoneEnv.Blockchain.Family), - WSRPCs: []devenv.CribRPCs{{ - External: keystoneEnv.Blockchain.Nodes[0].HostWSUrl, - Internal: keystoneEnv.Blockchain.Nodes[0].DockerInternalWSUrl, - }}, - HTTPRPCs: []devenv.CribRPCs{{ - External: keystoneEnv.Blockchain.Nodes[0].HostHTTPUrl, - Internal: keystoneEnv.Blockchain.Nodes[0].DockerInternalHTTPUrl, - }}, - DeployerKey: keystoneEnv.SethClient.NewTXOpts(seth.WithNonce(nil)), // set nonce to nil, so that it will be fetched from the chain - }, - }, - } - - env, don, err := devenv.NewEnvironment(context.Background, lgr, devenvConfig) - require.NoError(t, err, "failed to create environment") - - envs[i] = env - keystoneEnv.dons[i] = don - } - - var nodeIDs []string - for _, env := range envs { - nodeIDs = append(nodeIDs, env.NodeIDs...) - } - - // we assume that all DONs run on the same chain and that there's only one chain - // also, we don't care which instance of offchain client we use, because we have - // only one instance of offchain client and we have just configured it to work - // with nodes from all DONs - keystoneEnv.Environment = &deployment.Environment{ - Name: envs[0].Name, - Logger: envs[0].Logger, - ExistingAddresses: envs[0].ExistingAddresses, - Chains: envs[0].Chains, - Offchain: envs[0].Offchain, - OCRSecrets: envs[0].OCRSecrets, - GetContext: envs[0].GetContext, - NodeIDs: nodeIDs, - } -} - -func deployKeystoneContracts(t *testing.T, testLogger zerolog.Logger, keystoneEnv *KeystoneEnvironment) { - require.NotNil(t, keystoneEnv, "keystone environment must be set") - require.NotNil(t, keystoneEnv.Environment, "environment must be set") - require.NotEmpty(t, keystoneEnv.ChainSelector, "chain selector must be set") - - keystoneEnv.KeystoneContractAddresses = &KeystoneContractAddresses{} - - // Deploy keystone forwarder contract - keystoneEnv.KeystoneContractAddresses.ForwarderAddress = deployKeystoneForwarder(t, testLogger, keystoneEnv.Environment, keystoneEnv.ChainSelector) - - // Deploy OCR3 contract - keystoneEnv.KeystoneContractAddresses.OCR3CapabilityAddress = deployOCR3(t, testLogger, keystoneEnv.Environment, keystoneEnv.ChainSelector) - - // Deploy capabilities registry contract - keystoneEnv.KeystoneContractAddresses.CapabilitiesRegistryAddress = deployCapabilitiesRegistry(t, testLogger, keystoneEnv.Environment, keystoneEnv.ChainSelector) -} - -func deployOCR3(t *testing.T, testLogger zerolog.Logger, ctfEnv *deployment.Environment, chainSelector uint64) common.Address { - output, err := keystone_changeset.DeployOCR3(*ctfEnv, chainSelector) - require.NoError(t, err, "failed to deploy OCR3 Capability contract") - - err = ctfEnv.ExistingAddresses.Merge(output.AddressBook) - require.NoError(t, err, "failed to merge address book") - - addresses, err := ctfEnv.ExistingAddresses.AddressesForChain(chainSelector) - require.NoError(t, err, "failed to get addresses for chain %d from the address book", chainSelector) - - var forwarderAddress common.Address - for addrStr, tv := range addresses { - if strings.Contains(tv.String(), "OCR3Capability") { - forwarderAddress = common.HexToAddress(addrStr) - testLogger.Info().Msgf("Deployed OCR3Capability contract at %s", forwarderAddress.Hex()) - break - } - } - - return forwarderAddress -} - -func deployCapabilitiesRegistry(t *testing.T, testLogger zerolog.Logger, ctfEnv *deployment.Environment, chainSelector uint64) common.Address { - output, err := keystone_changeset.DeployCapabilityRegistry(*ctfEnv, chainSelector) - require.NoError(t, err, "failed to deploy Capabilities Registry contract") - - err = ctfEnv.ExistingAddresses.Merge(output.AddressBook) - require.NoError(t, err, "failed to merge address book") - - addresses, err := ctfEnv.ExistingAddresses.AddressesForChain(chainSelector) - require.NoError(t, err, "failed to get addresses for chain %d from the address book", chainSelector) - - var forwarderAddress common.Address - for addrStr, tv := range addresses { - if strings.Contains(tv.String(), "CapabilitiesRegistry") { - forwarderAddress = common.HexToAddress(addrStr) - testLogger.Info().Msgf("Deployed Capabilities Registry contract at %s", forwarderAddress.Hex()) - break - } - } - - return forwarderAddress -} - -func deployKeystoneForwarder(t *testing.T, testLogger zerolog.Logger, ctfEnv *deployment.Environment, chainSelector uint64) common.Address { - output, err := keystone_changeset.DeployForwarder(*ctfEnv, keystone_changeset.DeployForwarderRequest{ - ChainSelectors: []uint64{chainSelector}, - }) - require.NoError(t, err, "failed to deploy forwarder contract") - - err = ctfEnv.ExistingAddresses.Merge(output.AddressBook) - require.NoError(t, err, "failed to merge address book") - - addresses, err := ctfEnv.ExistingAddresses.AddressesForChain(chainSelector) - require.NoError(t, err, "failed to get addresses for chain %d from the address book", chainSelector) - - var forwarderAddress common.Address - for addrStr, tv := range addresses { - if strings.Contains(tv.String(), "KeystoneForwarder") { - forwarderAddress = common.HexToAddress(addrStr) - testLogger.Info().Msgf("Deployed KeystoneForwarder contract at %s", forwarderAddress.Hex()) - break - } - } - - return forwarderAddress -} - -func prepareWorkflowRegistry(t *testing.T, testLogger zerolog.Logger, keystoneEnv *KeystoneEnvironment) { - require.NotNil(t, keystoneEnv, "keystone environment must be set") - require.NotNil(t, keystoneEnv.Environment, "environment must be set") - require.NotEmpty(t, keystoneEnv.ChainSelector, "chain selector must be set") - require.NotNil(t, keystoneEnv.SethClient, "seth client must be set") - require.NotEmpty(t, keystoneEnv.WorkflowDONID, "workflow DON ID must be set") - - output, err := workflow_registry_changeset.Deploy(*keystoneEnv.Environment, keystoneEnv.ChainSelector) - require.NoError(t, err, "failed to deploy workflow registry contract") - - err = keystoneEnv.Environment.ExistingAddresses.Merge(output.AddressBook) - require.NoError(t, err, "failed to merge address book") - - addresses, err := keystoneEnv.Environment.ExistingAddresses.AddressesForChain(keystoneEnv.ChainSelector) - require.NoError(t, err, "failed to get addresses for chain %d from the address book", keystoneEnv.ChainSelector) - - var workflowRegistryAddr common.Address - for addrStr, tv := range addresses { - if strings.Contains(tv.String(), "WorkflowRegistry") { - workflowRegistryAddr = common.HexToAddress(addrStr) - testLogger.Info().Msgf("Deployed WorkflowRegistry contract at %s", workflowRegistryAddr.Hex()) - } - } - - // Configure Workflow Registry contract - _, err = workflow_registry_changeset.UpdateAllowedDons(*keystoneEnv.Environment, &workflow_registry_changeset.UpdateAllowedDonsRequest{ - RegistryChainSel: keystoneEnv.ChainSelector, - DonIDs: []uint32{keystoneEnv.WorkflowDONID}, - Allowed: true, - }) - require.NoError(t, err, "failed to update allowed Dons") - - _, err = workflow_registry_changeset.UpdateAuthorizedAddresses(*keystoneEnv.Environment, &workflow_registry_changeset.UpdateAuthorizedAddressesRequest{ - RegistryChainSel: keystoneEnv.ChainSelector, - Addresses: []string{keystoneEnv.SethClient.MustGetRootKeyAddress().Hex()}, - Allowed: true, - }) - require.NoError(t, err, "failed to update authorized addresses") - - keystoneEnv.KeystoneContractAddresses.WorkflowRegistryAddress = workflowRegistryAddr -} - -func prepareFeedsConsumer(t *testing.T, testLogger zerolog.Logger, workflowName string, keystonEnv *KeystoneEnvironment) { - require.NotNil(t, keystonEnv, "keystone environment must be set") - require.NotNil(t, keystonEnv.Environment, "environment must be set") - require.NotEmpty(t, keystonEnv.ChainSelector, "chain selector must be set") - require.NotNil(t, keystonEnv.SethClient, "seth client must be set") - require.NotNil(t, keystonEnv.KeystoneContractAddresses, "keystone contract addresses must be set") - require.NotEmpty(t, keystonEnv.KeystoneContractAddresses.ForwarderAddress, "forwarder address must be set") - - output, err := keystone_changeset.DeployFeedsConsumer(*keystonEnv.Environment, &keystone_changeset.DeployFeedsConsumerRequest{ - ChainSelector: keystonEnv.ChainSelector, - }) - require.NoError(t, err, "failed to deploy feeds_consumer contract") - - err = keystonEnv.Environment.ExistingAddresses.Merge(output.AddressBook) - require.NoError(t, err, "failed to merge address book") - - addresses, err := keystonEnv.Environment.ExistingAddresses.AddressesForChain(keystonEnv.ChainSelector) - require.NoError(t, err, "failed to get addresses for chain %d from the address book", keystonEnv.ChainSelector) - - var feedsConsumerAddress common.Address - for addrStr, tv := range addresses { - if strings.Contains(tv.String(), "FeedConsumer") { - feedsConsumerAddress = common.HexToAddress(addrStr) - testLogger.Info().Msgf("Deployed FeedConsumer contract at %s", feedsConsumerAddress.Hex()) - break - } - } - - require.NotEmpty(t, feedsConsumerAddress, "failed to find FeedConsumer address in the address book") - - // configure Keystone Feeds Consumer contract, so it can accept reports from the forwarder contract, - // that come from our workflow that is owned by the root private key - feedsConsumerInstance, err := feeds_consumer.NewKeystoneFeedsConsumer(feedsConsumerAddress, keystonEnv.SethClient.Client) - require.NoError(t, err, "failed to create feeds consumer instance") - - // Prepare hex-encoded and truncated workflow name - var workflowNameBytes [10]byte - var HashTruncateName = func(name string) string { - // Compute SHA-256 hash of the input string - hash := sha256.Sum256([]byte(name)) - - // Encode as hex to ensure UTF8 - var hashBytes []byte = hash[:] - resultHex := hex.EncodeToString(hashBytes) - - // Truncate to 10 bytes - truncated := []byte(resultHex)[:10] - return string(truncated) - } - - truncated := HashTruncateName(workflowName) - copy(workflowNameBytes[:], []byte(truncated)) - - _, decodeErr := keystonEnv.SethClient.Decode(feedsConsumerInstance.SetConfig( - keystonEnv.SethClient.NewTXOpts(), - []common.Address{keystonEnv.KeystoneContractAddresses.ForwarderAddress}, // allowed senders - []common.Address{keystonEnv.SethClient.MustGetRootKeyAddress()}, // allowed workflow owners - // here we need to use hex-encoded workflow name converted to []byte - [][10]byte{workflowNameBytes}, // allowed workflow names - )) - require.NoError(t, decodeErr, "failed to set config for feeds consumer") - - keystonEnv.KeystoneContractAddresses.FeedsConsumerAddress = feedsConsumerAddress -} - -func registerWorkflowDirectly(t *testing.T, in *TestConfig, sc *seth.Client, workflowRegistryAddr common.Address, donID uint32, workflowName string) { - require.NotEmpty(t, in.WorkflowConfig.CompiledWorkflowConfig.BinaryURL) - workFlowData, err := downloadAndDecode(in.WorkflowConfig.CompiledWorkflowConfig.BinaryURL) - require.NoError(t, err, "failed to download and decode workflow binary") - - var configData []byte - if in.WorkflowConfig.CompiledWorkflowConfig.ConfigURL != "" { - configData, err = download(in.WorkflowConfig.CompiledWorkflowConfig.ConfigURL) - require.NoError(t, err, "failed to download workflow config") - } - - // use non-encoded workflow name - workflowID, idErr := GenerateWorkflowIDFromStrings(sc.MustGetRootKeyAddress().Hex(), workflowName, workFlowData, configData, "") - require.NoError(t, idErr, "failed to generate workflow ID") - - workflowRegistryInstance, err := workflow_registry_wrapper.NewWorkflowRegistry(workflowRegistryAddr, sc.Client) - require.NoError(t, err, "failed to create workflow registry instance") - - // use non-encoded workflow name - _, decodeErr := sc.Decode(workflowRegistryInstance.RegisterWorkflow(sc.NewTXOpts(), workflowName, [32]byte(common.Hex2Bytes(workflowID)), donID, uint8(0), in.WorkflowConfig.CompiledWorkflowConfig.BinaryURL, in.WorkflowConfig.CompiledWorkflowConfig.ConfigURL, "")) - require.NoError(t, decodeErr, "failed to register workflow") -} - -//revive:disable // ignore confusing-results -func compileWorkflowWithCRECLI(t *testing.T, in *TestConfig, feedsConsumerAddress common.Address, feedID, dataURL string, settingsFile *os.File) (string, string) { - configFile, err := os.CreateTemp("", "config.json") - require.NoError(t, err, "failed to create workflow config file") - - cleanFeedId := strings.TrimPrefix(feedID, "0x") - feedLength := len(cleanFeedId) - - require.GreaterOrEqual(t, feedLength, 32, "feed ID must be at least 32 characters long") - - if feedLength > 32 { - cleanFeedId = cleanFeedId[:32] - } - - feedIDToUse := "0x" + cleanFeedId - - workflowConfig := PoRWorkflowConfig{ - FeedID: feedIDToUse, - URL: dataURL, - ConsumerAddress: feedsConsumerAddress.Hex(), - } - - configMarshalled, err := json.Marshal(workflowConfig) - require.NoError(t, err, "failed to marshal workflow config") - - _, err = configFile.Write(configMarshalled) - require.NoError(t, err, "failed to write workflow config file") - - var outputBuffer bytes.Buffer - - // the CLI expects the workflow code to be located in the same directory as its `go.mod`` file. That's why we assume that the file, which - // contains the entrypoint method is always named `main.go`. This is a limitation of the CLI, which we can't change. - compileCmd := exec.Command(CRECLICommand, "workflow", "compile", "-S", settingsFile.Name(), "-c", configFile.Name(), "main.go") // #nosec G204 - compileCmd.Stdout = &outputBuffer - compileCmd.Stderr = &outputBuffer - compileCmd.Dir = *in.WorkflowConfig.WorkflowFolderLocation - err = compileCmd.Start() - require.NoError(t, err, "failed to start compile command") - - err = compileCmd.Wait() - fmt.Println("Compile output:\n", outputBuffer.String()) - - require.NoError(t, err, "failed to wait for compile command") - - re := regexp.MustCompile(`Gist URL=([^\s]+)`) - matches := re.FindAllStringSubmatch(outputBuffer.String(), -1) - require.Len(t, matches, 2, "failed to find 2 gist URLs in compile output") - - ansiEscapePattern := `\x1b\[[0-9;]*m` - re = regexp.MustCompile(ansiEscapePattern) - - workflowGistURL := re.ReplaceAllString(matches[0][1], "") - workflowConfigURL := re.ReplaceAllString(matches[1][1], "") - - require.NotEmpty(t, workflowGistURL, "failed to find workflow gist URL") - require.NotEmpty(t, workflowConfigURL, "failed to find workflow config gist URL") - - return workflowGistURL, workflowConfigURL -} - -func preapreCRECLISettingsFile(t *testing.T, sc *seth.Client, capRegAddr, workflowRegistryAddr common.Address, donID uint32, chainSelector uint64, rpcHTTPURL string) *os.File { - settingsFile, err := os.CreateTemp("", CRECLISettingsFileName) - require.NoError(t, err, "failed to create CRE CLI settings file") - - settings := CRECLISettings{ - DevPlatform: DevPlatform{ - CapabilitiesRegistryAddress: capRegAddr.Hex(), - DonID: donID, - WorkflowRegistryAddress: workflowRegistryAddr.Hex(), - }, - UserWorkflow: UserWorkflow{ - WorkflowOwnerAddress: sc.MustGetRootKeyAddress().Hex(), - }, - Logging: Logging{}, - McmsConfig: McmsConfig{ - ProposalsDirectory: "./", - }, - Contracts: Contracts{ - ContractRegistry: []ContractRegistry{ - { - Name: "CapabilitiesRegistry", - Address: capRegAddr.Hex(), - ChainSelector: chainSelector, - }, - { - Name: "WorkflowRegistry", - Address: workflowRegistryAddr.Hex(), - ChainSelector: chainSelector, - }, - }, - }, - Rpcs: []RPC{ - { - ChainSelector: chainSelector, - URL: rpcHTTPURL, - }, - }, - } - - settingsMarshalled, err := yaml.Marshal(settings) - require.NoError(t, err, "failed to marshal CRE CLI settings") - - _, err = settingsFile.Write(settingsMarshalled) - require.NoError(t, err, "failed to write %s settings file", CRECLISettingsFileName) - - return settingsFile -} - -func registerWorkflow(t *testing.T, in *TestConfig, workflowName string, keystoneEnv *KeystoneEnvironment) { - require.NotNil(t, keystoneEnv, "keystone environment must be set") - require.NotNil(t, keystoneEnv.Environment, "environment must be set") - require.NotNil(t, keystoneEnv.SethClient, "seth client must be set") - require.NotNil(t, keystoneEnv.Blockchain, "blockchain must be set") - require.NotEmpty(t, keystoneEnv.ChainSelector, "chain selector must be set") - require.NotNil(t, keystoneEnv.KeystoneContractAddresses, "keystone contract addresses must be set") - require.NotEmpty(t, keystoneEnv.KeystoneContractAddresses.CapabilitiesRegistryAddress, "capabilities registry address must be set") - require.NotEmpty(t, keystoneEnv.KeystoneContractAddresses.WorkflowRegistryAddress, "workflow registry address must be set") - require.NotEmpty(t, keystoneEnv.KeystoneContractAddresses.FeedsConsumerAddress, "feed consumer address must be set") - require.NotEmpty(t, keystoneEnv.DeployerPrivateKey, "deployer private key must be set") - require.NotEmpty(t, keystoneEnv.WorkflowDONID, "workflow DON ID must be set") - require.NotNil(t, keystoneEnv.PriceProvider, "price provider must be set") - - // Register workflow directly using the provided binary and config URLs - // This is a legacy solution, probably we can remove it soon, but there's still quite a lot of people - // who have no access to dev-platform repo, so they cannot use the CRE CLI - if !in.WorkflowConfig.ShouldCompileNewWorkflow && !in.WorkflowConfig.UseCRECLI { - registerWorkflowDirectly(t, in, keystoneEnv.SethClient, keystoneEnv.KeystoneContractAddresses.WorkflowRegistryAddress, keystoneEnv.WorkflowDONID, workflowName) - - return - } - - // These two env vars are required by the CRE CLI - err := os.Setenv("WORKFLOW_OWNER_ADDRESS", keystoneEnv.SethClient.MustGetRootKeyAddress().Hex()) - require.NoError(t, err, "failed to set WORKFLOW_OWNER_ADDRESS env var") - - err = os.Setenv("ETH_PRIVATE_KEY", keystoneEnv.DeployerPrivateKey) - require.NoError(t, err, "failed to set ETH_PRIVATE_KEY env var") - - // create CRE CLI settings file - settingsFile := preapreCRECLISettingsFile(t, keystoneEnv.SethClient, keystoneEnv.KeystoneContractAddresses.CapabilitiesRegistryAddress, keystoneEnv.KeystoneContractAddresses.WorkflowRegistryAddress, keystoneEnv.WorkflowDONID, keystoneEnv.ChainSelector, keystoneEnv.Blockchain.Nodes[0].HostHTTPUrl) - - var workflowGistURL string - var workflowConfigURL string - - // compile and upload the workflow, if we are not using an existing one - if in.WorkflowConfig.ShouldCompileNewWorkflow { - workflowGistURL, workflowConfigURL = compileWorkflowWithCRECLI(t, in, keystoneEnv.KeystoneContractAddresses.FeedsConsumerAddress, in.PriceProvider.FeedID, keystoneEnv.PriceProvider.URL(), settingsFile) - } else { - workflowGistURL = in.WorkflowConfig.CompiledWorkflowConfig.BinaryURL - workflowConfigURL = in.WorkflowConfig.CompiledWorkflowConfig.ConfigURL - } - - // register the workflow - registerCmd := exec.Command(CRECLICommand, "workflow", "register", workflowName, "-b", workflowGistURL, "-c", workflowConfigURL, "-S", settingsFile.Name(), "-v") - registerCmd.Stdout = os.Stdout - registerCmd.Stderr = os.Stderr - err = registerCmd.Run() - require.NoError(t, err, "failed to register workflow using CRE CLI") -} - -func startSingleNodeSet(t *testing.T, nsInput *CapabilitiesAwareNodeSet, keystoneEnv *KeystoneEnvironment) { - require.NotNil(t, keystoneEnv, "keystone environment must be set") - require.NotNil(t, keystoneEnv.Blockchain, "blockchain environment must be set") - - // Hack for CI that allows us to dynamically set the chainlink image and version - // CTFv2 currently doesn't support dynamic image and version setting - if os.Getenv("CI") == "true" { - // Due to how we pass custom env vars to reusable workflow we need to use placeholders, so first we need to resolve what's the name of the target environment variable - // that stores chainlink version and then we can use it to resolve the image name - image := fmt.Sprintf("%s:%s", os.Getenv(ctfconfig.E2E_TEST_CHAINLINK_IMAGE_ENV), ctfconfig.MustReadEnvVar_String(ctfconfig.E2E_TEST_CHAINLINK_VERSION_ENV)) - for _, nodeSpec := range nsInput.NodeSpecs { - nodeSpec.Node.Image = image - } - } - - nodeset, err := ns.NewSharedDBNodeSet(nsInput.Input, keystoneEnv.Blockchain) - require.NoError(t, err, "failed to deploy node set") - - keystoneEnv.WrappedNodeOutput = append(keystoneEnv.WrappedNodeOutput, &WrappedNodeOutput{ - nodeset, - nsInput.Name, - nsInput.Capabilities, - }) -} - -// In order to whitelist host IP in the gateway, we need to resolve the host.docker.internal to the host IP, -// and since CL image doesn't have dig or nslookup, we need to use curl. -func resolveHostDockerInternaIp(testLogger zerolog.Logger, nsOutput *ns.Output) (string, error) { - containerName := nsOutput.CLNodes[0].Node.ContainerName - cmd := []string{"curl", "-v", "http://host.docker.internal"} - output, err := framework.ExecContainer(containerName, cmd) - if err != nil { - return "", err - } - - re := regexp.MustCompile(`.*Trying ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*`) - matches := re.FindStringSubmatch(output) - if len(matches) < 2 { - testLogger.Error().Msgf("failed to extract IP address from curl output:\n%s", output) - return "", errors.New("failed to extract IP address from curl output") - } - - testLogger.Info().Msgf("Resolved host.docker.internal to %s", matches[1]) - - return matches[1], nil -} - -func fundNodes(t *testing.T, keystoneEnv *KeystoneEnvironment) { - require.NotNil(t, keystoneEnv, "keystone environment must be set") - require.NotNil(t, keystoneEnv.SethClient, "seth client must be set") - require.NotNil(t, keystoneEnv.dons, "dons must be set") - - for _, don := range keystoneEnv.dons { - for _, node := range don.Nodes { - _, err := actions.SendFunds(zerolog.Logger{}, keystoneEnv.SethClient, actions.FundsToSendPayload{ - ToAddress: common.HexToAddress(node.AccountAddr[keystoneEnv.SethClient.Cfg.Network.ChainID]), - Amount: big.NewInt(5000000000000000000), - PrivateKey: keystoneEnv.SethClient.MustGetRootPrivateKey(), - }) - require.NoError(t, err, "failed to send funds to node %s", node.AccountAddr[keystoneEnv.SethClient.Cfg.Network.ChainID]) - } - } -} - -type CapabilityFlag = string - -// DON types -const ( - WorkflowDON CapabilityFlag = "workflow" - CapabilitiesDON CapabilityFlag = "capabilities" -) - -// Capabilities -const ( - OCR3Capability CapabilityFlag = "ocr3" - CronCapability CapabilityFlag = "cron" - CustomComputeCapability CapabilityFlag = "custom-compute" - WriteEVMCapability CapabilityFlag = "write-evm" - - // Add more capabilities as needed -) - -var ( - // Add new capabilities here as well, if single DON should have them by default - SingleDonFlags = []string{"workflow", "capabilities", "ocr3", "cron", "custom-compute", "write-evm"} -) - -// WrappedNodeOutput is a struct that holds the node output and the name of the node set (required by multiple functions) -type WrappedNodeOutput struct { - *ns.Output - NodeSetName string - Capabilities []string -} - -// DONTopology is a struct that holds the DON references and various metadata -type DONTopology struct { - DON *devenv.DON - NodeInput *CapabilitiesAwareNodeSet - NodeOutput *WrappedNodeOutput - ID uint32 - Flags []string -} - -func hasFlag(values []string, flag string) bool { - return slices.Contains(values, flag) -} - -func mustOneDONTopologyWithFlag(t *testing.T, donTopologies []*DONTopology, flag string) *DONTopology { - donTopologies = DONTopologyWithFlag(donTopologies, flag) - require.Len(t, donTopologies, 1, "expected exactly one DON topology with flag %d", flag) - - return donTopologies[0] -} - -func DONTopologyWithFlag(donTopologies []*DONTopology, flag string) []*DONTopology { - var result []*DONTopology - - for _, donTopology := range donTopologies { - if hasFlag(donTopology.Flags, flag) { - result = append(result, donTopology) - } - } - - return result -} - -type PeeringData struct { - GlobalBootstraperPeerId string - GlobalBootstraperAddress string -} - -func peeringData(donTopologies []*DONTopology) (PeeringData, error) { - globalBootstraperPeerId, globalBootstraperAddress, err := globalBootstraperNodeData(donTopologies) - if err != nil { - return PeeringData{}, err - } - - return PeeringData{ - GlobalBootstraperPeerId: globalBootstraperPeerId, - GlobalBootstraperAddress: globalBootstraperAddress, - }, nil -} - -type KeystoneContractAddresses struct { - CapabilitiesRegistryAddress common.Address - ForwarderAddress common.Address - OCR3CapabilityAddress common.Address - WorkflowRegistryAddress common.Address - FeedsConsumerAddress common.Address -} - -type KeystoneEnvironment struct { - *deployment.Environment - Blockchain *blockchain.Output - SethClient *seth.Client - ChainSelector uint64 - DeployerPrivateKey string - KeystoneContractAddresses *KeystoneContractAddresses - - JD *jd.Output - - WrappedNodeOutput []*WrappedNodeOutput - DONTopology []*DONTopology - dons []*devenv.DON - WorkflowDONID uint32 - - PriceProvider PriceProvider -} - -func configureNodes(t *testing.T, testLogger zerolog.Logger, in *TestConfig, keystoneEnv *KeystoneEnvironment) { - require.NotNil(t, keystoneEnv, "keystone environment must be set") - require.NotNil(t, keystoneEnv.Environment, "environment must be set") - require.NotNil(t, keystoneEnv.Blockchain, "blockchain must be set") - require.NotNil(t, keystoneEnv.WrappedNodeOutput, "wrapped node output must be set") - require.NotNil(t, keystoneEnv.JD, "job distributor must be set") - require.NotNil(t, keystoneEnv.SethClient, "seth client must be set") - require.NotEmpty(t, keystoneEnv.DONTopology, "DON topology must not be empty") - require.NotNil(t, keystoneEnv.KeystoneContractAddresses, "keystone contract addresses must be set") - require.NotEmpty(t, keystoneEnv.KeystoneContractAddresses.CapabilitiesRegistryAddress, "capabilities registry address must be set") - require.NotEmpty(t, keystoneEnv.KeystoneContractAddresses.OCR3CapabilityAddress, "OCR3 capability address must be set") - require.NotEmpty(t, keystoneEnv.KeystoneContractAddresses.ForwarderAddress, "forwarder address must be set") - require.NotEmpty(t, keystoneEnv.KeystoneContractAddresses.WorkflowRegistryAddress, "workflow registry address must be set") - require.GreaterOrEqual(t, len(keystoneEnv.DONTopology), 1, "expected at least one DON topology") - - peeringData, err := peeringData(keystoneEnv.DONTopology) - require.NoError(t, err, "failed to get peering data") - - for i, donTopology := range keystoneEnv.DONTopology { - keystoneEnv.DONTopology[i].NodeOutput = configureDON(t, donTopology.DON, donTopology.NodeInput, donTopology.NodeOutput, keystoneEnv.Blockchain, donTopology.ID, donTopology.Flags, peeringData, keystoneEnv.KeystoneContractAddresses.CapabilitiesRegistryAddress, keystoneEnv.KeystoneContractAddresses.WorkflowRegistryAddress, keystoneEnv.KeystoneContractAddresses.ForwarderAddress) - } - - nodeOutputs := make([]*WrappedNodeOutput, 0, len(keystoneEnv.DONTopology)) - for i := range keystoneEnv.DONTopology { - nodeOutputs = append(nodeOutputs, keystoneEnv.DONTopology[i].NodeOutput) - } - - // after restarting the nodes, we need to reinitialize the JD clients otherwise - // communication between JD and nodes will fail due to invalidated session cookie - keystoneEnv.Environment = reinitialiseJDClients(t, keystoneEnv.Environment, keystoneEnv.JD, nodeOutputs...) - - for _, donTopology := range keystoneEnv.DONTopology { - ips, ports := extraAllowedPortsAndIps(t, testLogger, in, donTopology.NodeOutput.Output) - createJobs(t, keystoneEnv.Environment, donTopology.DON, donTopology.NodeOutput, keystoneEnv.Blockchain, keystoneEnv.KeystoneContractAddresses.OCR3CapabilityAddress, donTopology.ID, donTopology.Flags, ports, ips) - } -} - -func globalBootstraperNodeData(donTopologies []*DONTopology) (string, string, error) { - if len(donTopologies) == 1 { - // if there is only one DON, then the global bootstrapper is the bootstrap node of the DON - peerId, err := nodeToP2PID(donTopologies[0].DON.Nodes[0], keyExtractingTransformFn) - if err != nil { - return "", "", errors.Wrapf(err, "failed to get peer ID for node %s", donTopologies[0].DON.Nodes[0].Name) - } - - return peerId, donTopologies[0].NodeOutput.CLNodes[0].Node.ContainerName, nil - } else if len(donTopologies) > 1 { - // if there's more than one DON, then peering capabilitity needs to point to the same bootstrap node - // for all the DONs, and so we need to find it first. For us, it will always be the bootstrap node of the workflow DON. - for _, donTopology := range donTopologies { - if hasFlag(donTopology.Flags, WorkflowDON) { - peerId, err := nodeToP2PID(donTopology.DON.Nodes[0], keyExtractingTransformFn) - if err != nil { - return "", "", errors.Wrapf(err, "failed to get peer ID for node %s", donTopology.DON.Nodes[0].Name) - } - - return peerId, donTopology.NodeOutput.CLNodes[0].Node.ContainerName, nil - } - } - - return "", "", errors.New("expected at least one workflow DON") - } - - return "", "", errors.New("expected at least one DON topology") -} - -func buildWorkerNodeConfig(donBootstrapNodePeerId, donBootstrapNodeAddress string, peeringData PeeringData, bc *blockchain.Output, capRegAddr, forwarderAddress, workflowRegistryAddr common.Address, donID uint32, flags []string, nodeAddress string) string { - workerNodeConfig := fmt.Sprintf(` - [Feature] - LogPoller = true - - [OCR2] - Enabled = true - DatabaseTimeout = '1s' - ContractPollInterval = '1s' - - [P2P.V2] - Enabled = true - ListenAddresses = ['0.0.0.0:5001'] - DefaultBootstrappers = ['%s@%s:5001'] - - [Capabilities.Peering.V2] - Enabled = true - ListenAddresses = ['0.0.0.0:6690'] - DefaultBootstrappers = ['%s@%s:6690'] - - [[EVM]] - ChainID = '%s' - - [[EVM.Nodes]] - Name = 'anvil' - WSURL = '%s' - HTTPURL = '%s' - - # Capabilities registry address, always needed - [Capabilities.ExternalRegistry] - Address = '%s' - NetworkID = 'evm' - ChainID = '%s' - `, - donBootstrapNodePeerId, - donBootstrapNodeAddress, - peeringData.GlobalBootstraperPeerId, - peeringData.GlobalBootstraperAddress, - bc.ChainID, - bc.Nodes[0].DockerInternalWSUrl, - bc.Nodes[0].DockerInternalHTTPUrl, - capRegAddr, - bc.ChainID, - ) - - if hasFlag(flags, WriteEVMCapability) { - writeEVMConfig := fmt.Sprintf(` - # Required for the target capability to be initialized - [EVM.Workflow] - FromAddress = '%s' - ForwarderAddress = '%s' - GasLimitDefault = 400_000 - `, - nodeAddress, - forwarderAddress.Hex(), - ) - workerNodeConfig += writeEVMConfig - } - - // if it's workflow DON configure workflow registry - if hasFlag(flags, WorkflowDON) { - workflowRegistryConfig := fmt.Sprintf(` - [Capabilities.WorkflowRegistry] - Address = "%s" - NetworkID = "evm" - ChainID = "%s" - `, - workflowRegistryAddr.Hex(), - bc.ChainID, - ) - - workerNodeConfig += workflowRegistryConfig - } - - // workflow DON nodes always needs gateway connector, otherwise they won't be able to fetch the workflow - // it's also required by custom compute, which can only run on workflow DON nodes - if hasFlag(flags, WorkflowDON) || hasFlag(flags, CustomComputeCapability) { - // assuming for now that gateway always used port 5003 and /node path - gatewayAddress := fmt.Sprintf("ws://%s:5003/node", donBootstrapNodeAddress) - gatewayConfig := fmt.Sprintf(` - [Capabilities.GatewayConnector] - DonID = "%s" - ChainIDForNodeKey = "%s" - NodeAddress = '%s' - - [[Capabilities.GatewayConnector.Gateways]] - Id = "por_gateway" - URL = "%s" - `, - strconv.FormatUint(uint64(donID), 10), - bc.ChainID, - nodeAddress, - gatewayAddress, - ) - - workerNodeConfig += gatewayConfig - } - - return workerNodeConfig -} - -func configureDON(t *testing.T, don *devenv.DON, nodeInput *CapabilitiesAwareNodeSet, nodeOutput *WrappedNodeOutput, bc *blockchain.Output, donID uint32, flags []string, peeringData PeeringData, capRegAddr, workflowRegistryAddr, forwarderAddress common.Address) *WrappedNodeOutput { - workflowNodeSet := don.Nodes[1:] - - donBootstrapNodePeerId, err := nodeToP2PID(don.Nodes[0], keyExtractingTransformFn) - require.NoError(t, err, "failed to get bootstrap node peer ID") - - donBootstrapNodeAddress := nodeOutput.CLNodes[0].Node.ContainerName - - chainIDInt, err := strconv.Atoi(bc.ChainID) - require.NoError(t, err, "failed to convert chain ID to int") - chainIDUint64 := mustSafeUint64(int64(chainIDInt)) - - // bootstrap node in the DON always points to itself as the OCR peering bootstrapper - bootstrapNodeConfig := fmt.Sprintf(` - [Feature] - LogPoller = true - - [OCR2] - Enabled = true - DatabaseTimeout = '1s' - ContractPollInterval = '1s' - - [P2P.V2] - Enabled = true - ListenAddresses = ['0.0.0.0:5001'] - DefaultBootstrappers = ['%s@localhost:5001'] - - [[EVM]] - ChainID = '%s' - - [[EVM.Nodes]] - Name = 'anvil' - WSURL = '%s' - HTTPURL = '%s' - - # Capabilities registry address, required for do2don p2p mesh to work and for capabilities discovery - # Required even, when all capabilities are local to DON in a single DON scenario - [Capabilities.ExternalRegistry] - Address = '%s' - NetworkID = 'evm' - ChainID = '%s' - `, - donBootstrapNodePeerId, - bc.ChainID, - bc.Nodes[0].DockerInternalWSUrl, - bc.Nodes[0].DockerInternalHTTPUrl, - capRegAddr, - bc.ChainID, - ) - - // configure Don2Don peering capability for workflow DON's bootstrap node, but not for other DON's bootstrap nodes - // since they do not have any capabilities - if hasFlag(flags, WorkflowDON) { - bootstrapNodeConfig += fmt.Sprintf(` - [Capabilities.Peering.V2] - Enabled = true - ListenAddresses = ['0.0.0.0:6690'] - DefaultBootstrappers = ['%s@%s:6690'] - `, - peeringData.GlobalBootstraperPeerId, - "localhost", // bootstrap node should always point to itself as the bootstrapper - ) - } - - nodeInput.NodeSpecs[0].Node.TestConfigOverrides = bootstrapNodeConfig - - // configure worker nodes with OCR Peering, Don2Don peering, EVM, and capabilities registry - for i := range workflowNodeSet { - nodeInput.NodeSpecs[i+1].Node.TestConfigOverrides = buildWorkerNodeConfig(donBootstrapNodePeerId, donBootstrapNodeAddress, peeringData, bc, capRegAddr, forwarderAddress, workflowRegistryAddr, donID, flags, workflowNodeSet[i].AccountAddr[chainIDUint64]) - } - - // we need to restart all nodes for configuration changes to take effect - nodeset, err := ns.UpgradeNodeSet(t, nodeInput.Input, bc, 5*time.Second) - require.NoError(t, err, "failed to upgrade node set") - - return &WrappedNodeOutput{nodeset, nodeInput.Name, nodeInput.Capabilities} -} - -func createJobs(t *testing.T, ctfEnv *deployment.Environment, don *devenv.DON, nodeOutput *WrappedNodeOutput, bc *blockchain.Output, ocr3CapabilityAddress common.Address, donID uint32, flags []string, extraAllowedPorts []int, extraAllowedIps []string) { - donBootstrapNodePeerId, err := nodeToP2PID(don.Nodes[0], keyExtractingTransformFn) - require.NoError(t, err, "failed to get bootstrap node peer ID") - - donBootstrapNodeAddress := nodeOutput.CLNodes[0].Node.ContainerName - - chainIDInt, err := strconv.Atoi(bc.ChainID) - require.NoError(t, err, "failed to convert chain ID to int") - chainIDUint64 := mustSafeUint64(int64(chainIDInt)) - - jobCount := 2 + (len(don.Nodes)-1)*3 - errCh := make(chan error, jobCount) - - var wg sync.WaitGroup - - // configuration of bootstrap node - wg.Add(1) - go func() { - defer wg.Done() - - // create Bootstrap (OCR3 capability) job, if DON has OCR3 capability - if hasFlag(flags, OCR3Capability) { - bootstrapJobSpec := fmt.Sprintf(` - type = "bootstrap" - schemaVersion = 1 - externalJobID = "%s" - name = "Botostrap" - contractID = "%s" - contractConfigTrackerPollInterval = "1s" - contractConfigConfirmations = 1 - relay = "evm" - [relayConfig] - chainID = %s - providerType = "ocr3-capability" - `, uuid.NewString(), - ocr3CapabilityAddress.Hex(), - bc.ChainID) - - bootstrapJobRequest := &jobv1.ProposeJobRequest{ - NodeId: don.Nodes[0].NodeID, - Spec: bootstrapJobSpec, - } - - _, bootErr := ctfEnv.Offchain.ProposeJob(context.Background(), bootstrapJobRequest) - if bootErr != nil { - errCh <- errors.Wrapf(bootErr, "failed to propose bootstrap ocr3 job") - return - } - } - - // if it's a workflow DON or it has custom compute capability, we need to create a gateway job - if hasFlag(flags, WorkflowDON) || hasFlag(flags, CustomComputeCapability) { - var gatewayMembers string - for i := 1; i < len(don.Nodes); i++ { - gatewayMembers += fmt.Sprintf(` - [[gatewayConfig.Dons.Members]] - Address = "%s" - Name = "Node %d"`, - don.Nodes[i].AccountAddr[chainIDUint64], - i, - ) - } - - gatewayJobSpec := fmt.Sprintf(` - type = "gateway" - schemaVersion = 1 - externalJobID = "%s" - name = "Gateway" - forwardingAllowed = false - [gatewayConfig.ConnectionManagerConfig] - AuthChallengeLen = 10 - AuthGatewayId = "por_gateway" - AuthTimestampToleranceSec = 5 - HeartbeatIntervalSec = 20 - [[gatewayConfig.Dons]] - DonId = "%s" - F = 1 - HandlerName = "web-api-capabilities" - [gatewayConfig.Dons.HandlerConfig] - MaxAllowedMessageAgeSec = 1_000 - [gatewayConfig.Dons.HandlerConfig.NodeRateLimiter] - GlobalBurst = 10 - GlobalRPS = 50 - PerSenderBurst = 10 - PerSenderRPS = 10 - %s - [gatewayConfig.NodeServerConfig] - HandshakeTimeoutMillis = 1_000 - MaxRequestBytes = 100_000 - Path = "/node" - Port = 5_003 #this is the port the other nodes will use to connect to the gateway - ReadTimeoutMillis = 1_000 - RequestTimeoutMillis = 10_000 - WriteTimeoutMillis = 1_000 - [gatewayConfig.UserServerConfig] - ContentTypeHeader = "application/jsonrpc" - MaxRequestBytes = 100_000 - Path = "/" - Port = 5_002 - ReadTimeoutMillis = 1_000 - RequestTimeoutMillis = 10_000 - WriteTimeoutMillis = 1_000 - [gatewayConfig.HTTPClientConfig] - MaxResponseBytes = 100_000_000 - `, - uuid.NewString(), - strconv.FormatUint(uint64(donID), 10), - gatewayMembers, - ) - - if len(extraAllowedPorts) != 0 { - var allowedPorts string - for _, port := range extraAllowedPorts { - allowedPorts += fmt.Sprintf("%d, ", port) - } - - // when we pass custom allowed IPs, defaults are not used and we need to - // pass HTTP and HTTPS explicitly - gatewayJobSpec += fmt.Sprintf(` - AllowedPorts = [80, 443, %s] - `, - allowedPorts, - ) - } - - if len(extraAllowedIps) != 0 { - allowedIPs := strings.Join(extraAllowedIps, `", "`) - - gatewayJobSpec += fmt.Sprintf(` - AllowedIps = ["%s"] - `, - allowedIPs, - ) - } - - gatewayJobRequest := &jobv1.ProposeJobRequest{ - NodeId: don.Nodes[0].NodeID, - Spec: gatewayJobSpec, - } - - _, gateErr := ctfEnv.Offchain.ProposeJob(context.Background(), gatewayJobRequest) - if gateErr != nil { - errCh <- errors.Wrapf(gateErr, "failed to propose gateway job for the bootstrap node") - } - } - }() - - // configuration of worker nodes - for i, node := range don.Nodes { - // First node is a bootstrap node, so we skip it - if i == 0 { - continue - } - - wg.Add(1) - go func() { - defer wg.Done() - - // create cron capability job, if DON has cron capability - // remember that since we are using a capability that is not bundled-in, we need to point the job - // to binary location within the container - if hasFlag(flags, CronCapability) { - cronJobSpec := fmt.Sprintf(` - type = "standardcapabilities" - schemaVersion = 1 - externalJobID = "%s" - name = "cron-capabilities" - forwardingAllowed = false - command = "/home/capabilities/%s" - config = "" - `, - uuid.NewString(), - cronCapabilityAssetFile) - - cronJobRequest := &jobv1.ProposeJobRequest{ - NodeId: node.NodeID, - Spec: cronJobSpec, - } - - _, cronErr := ctfEnv.Offchain.ProposeJob(context.Background(), cronJobRequest) - if cronErr != nil { - errCh <- errors.Wrapf(cronErr, "failed to propose cron job for node %s", node.NodeID) - return - } - } - - // create custom compute capability job, if DON has custom compute capability - if hasFlag(flags, CustomComputeCapability) { - computeJobSpec := fmt.Sprintf(` - type = "standardcapabilities" - schemaVersion = 1 - name = "compute-capabilities" - externalJobID = "%s" - forwardingAllowed = false - command = "__builtin_custom-compute-action" - config = """ - NumWorkers = 3 - [rateLimiter] - globalRPS = 20.0 - globalBurst = 30 - perSenderRPS = 1.0 - perSenderBurst = 5 - """`, - uuid.NewString(), - ) - - computeJobRequest := &jobv1.ProposeJobRequest{ - NodeId: node.NodeID, - Spec: computeJobSpec, - } - - _, compErr := ctfEnv.Offchain.ProposeJob(context.Background(), computeJobRequest) - if compErr != nil { - errCh <- errors.Wrapf(compErr, "failed to propose compute job for node %s", node.NodeID) - return - } - } - - // create OCR3 consensus job, if DON has OCR3 capability - if hasFlag(flags, OCR3Capability) { - consensusJobSpec := fmt.Sprintf(` - type = "offchainreporting2" - schemaVersion = 1 - externalJobID = "%s" - 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" - `, - uuid.NewString(), - ocr3CapabilityAddress, - node.Ocr2KeyBundleID, - donBootstrapNodePeerId, - // assume that OCR3 nodes always use port 5001 (that's P2P V2 port of the bootstrap node) - donBootstrapNodeAddress+":5001", - don.Nodes[i].AccountAddr[chainIDUint64], - bc.ChainID, - node.Ocr2KeyBundleID, - ) - - consensusJobRequest := &jobv1.ProposeJobRequest{ - NodeId: node.NodeID, - Spec: consensusJobSpec, - } - - _, consErr := ctfEnv.Offchain.ProposeJob(context.Background(), consensusJobRequest) - if consErr != nil { - errCh <- errors.Wrapf(consErr, "failed to propose consensus job for node %s ", node.NodeID) - } - } - }() - } - wg.Wait() - close(errCh) - - errFound := false - for err := range errCh { - errFound = true - //nolint:testifylint // we want to assert here to catch all errors - assert.NoError(t, err, "job creation/acception failed") - } - - require.False(t, errFound, "failed to create at least one job for DON: %d", donID) -} - -func reinitialiseJDClients(t *testing.T, ctfEnv *deployment.Environment, jdOutput *jd.Output, nodeOutputs ...*WrappedNodeOutput) *deployment.Environment { - offchainClients := make([]deployment.OffchainClient, len(nodeOutputs)) - - for i, nodeOutput := range nodeOutputs { - nodeInfo, err := getNodeInfo(nodeOutput.Output, nodeOutput.NodeSetName, 1) - require.NoError(t, err, "failed to get node info") - - jdConfig := devenv.JDConfig{ - GRPC: jdOutput.HostGRPCUrl, - WSRPC: jdOutput.DockerWSRPCUrl, - Creds: insecure.NewCredentials(), - NodeInfo: nodeInfo, - } - - offChain, err := devenv.NewJDClient(context.Background(), jdConfig) - require.NoError(t, err, "failed to create JD client") - - offchainClients[i] = offChain - } - - // we don't really care, which instance we set here, since there's only one - // what's important is that we create a new JD client for each DON, because - // that authenticates JD with each node - ctfEnv.Offchain = offchainClients[0] - - return ctfEnv -} - -func mustSafeUint64(input int64) uint64 { - if input < 0 { - panic(fmt.Errorf("int64 %d is below uint64 min value", input)) - } - return uint64(input) -} - -func mustSafeUint32(input int) uint32 { - if input < 0 { - panic(fmt.Errorf("int %d is below uint32 min value", input)) - } - maxUint32 := (1 << 32) - 1 - if input > maxUint32 { - panic(fmt.Errorf("int %d exceeds uint32 max value", input)) - } - return uint32(input) -} - -func noOpTransformFn(value string) string { - return value -} - -func keyExtractingTransformFn(value string) string { - parts := strings.Split(value, "_") - if len(parts) > 1 { - return parts[len(parts)-1] - } - return value -} - -func nodeToP2PID(node devenv.Node, transformFn func(string) string) (string, error) { - for _, label := range node.Labels() { - if label.Key == devenv.NodeLabelP2PIDType { - if label.Value == nil { - return "", fmt.Errorf("p2p label value is nil for node %s", node.Name) - } - return transformFn(*label.Value), nil - } - } - - return "", fmt.Errorf("p2p label not found for node %s", node.Name) -} - -func configureContracts(t *testing.T, keystoneEnv *KeystoneEnvironment) { - require.NotNil(t, keystoneEnv, "keystone environment must be set") - require.NotNil(t, keystoneEnv.DONTopology, "DON topology must be set") - require.NotEmpty(t, keystoneEnv.ChainSelector, "chain selector must be set") - require.NotNil(t, keystoneEnv.Environment, "environment must be set") - - donCapabilities := make([]keystone_changeset.DonCapabilities, 0, len(keystoneEnv.DONTopology)) - - for _, donTopology := range keystoneEnv.DONTopology { - var capabilities []keystone_changeset.DONCapabilityWithConfig - - // check what capabilities each DON has and register them with Capabilities Registry contract - if hasFlag(donTopology.Flags, CronCapability) { - capabilities = append(capabilities, keystone_changeset.DONCapabilityWithConfig{ - Capability: kcr.CapabilitiesRegistryCapability{ - LabelledName: "cron-trigger", - Version: "1.0.0", - CapabilityType: 0, // TRIGGER - }, - Config: &capabilitiespb.CapabilityConfig{}, - }) - } - - if hasFlag(donTopology.Flags, CustomComputeCapability) { - capabilities = append(capabilities, keystone_changeset.DONCapabilityWithConfig{ - Capability: kcr.CapabilitiesRegistryCapability{ - LabelledName: "custom-compute", - Version: "1.0.0", - CapabilityType: 1, // ACTION - }, - Config: &capabilitiespb.CapabilityConfig{}, - }) - } - - if hasFlag(donTopology.Flags, OCR3Capability) { - capabilities = append(capabilities, keystone_changeset.DONCapabilityWithConfig{ - Capability: kcr.CapabilitiesRegistryCapability{ - LabelledName: "offchain_reporting", - Version: "1.0.0", - CapabilityType: 2, // CONSENSUS - ResponseType: 0, // REPORT - }, - Config: &capabilitiespb.CapabilityConfig{}, - }) - } - - if hasFlag(donTopology.Flags, WriteEVMCapability) { - capabilities = append(capabilities, keystone_changeset.DONCapabilityWithConfig{ - Capability: kcr.CapabilitiesRegistryCapability{ - LabelledName: "write_geth-testnet", - Version: "1.0.0", - CapabilityType: 3, // TARGET - ResponseType: 1, // OBSERVATION_IDENTICAL - }, - Config: &capabilitiespb.CapabilityConfig{}, - }) - } - - // Add support for new capabilities here as needed - - donPeerIds := make([]string, len(donTopology.DON.Nodes)-1) - for i, node := range donTopology.DON.Nodes { - if i == 0 { - continue - } - - p2pId, err := nodeToP2PID(node, noOpTransformFn) - require.NoError(t, err, "failed to get p2p id for node %s", node.Name) - - donPeerIds[i-1] = p2pId - } - - // we only need to assign P2P IDs to NOPs, since `ConfigureInitialContractsChangeset` method - // will take care of creating DON to Nodes mapping - nop := keystone_changeset.NOP{ - Name: fmt.Sprintf("NOP for %s DON", donTopology.NodeOutput.NodeSetName), - Nodes: donPeerIds, - } - - donName := donTopology.NodeOutput.NodeSetName + "-don" - donCapabilities = append(donCapabilities, keystone_changeset.DonCapabilities{ - Name: donName, - F: 1, - Nops: []keystone_changeset.NOP{nop}, - Capabilities: capabilities, - }) - } - - var transmissionSchedule []int - - for _, donTopology := range keystoneEnv.DONTopology { - if hasFlag(donTopology.Flags, OCR3Capability) { - // this schedule makes sure that all worker nodes are transmitting OCR3 reports - transmissionSchedule = []int{len(donTopology.DON.Nodes) - 1} - break - } - } - - require.NotEmpty(t, transmissionSchedule, "transmission schedule must not be empty") - - // values supplied by Alexandr Yepishev as the expected values for OCR3 config - oracleConfig := keystone_changeset.OracleConfig{ - DeltaProgressMillis: 5000, - DeltaResendMillis: 5000, - DeltaInitialMillis: 5000, - DeltaRoundMillis: 2000, - DeltaGraceMillis: 500, - DeltaCertifiedCommitRequestMillis: 1000, - DeltaStageMillis: 30000, - MaxRoundsPerEpoch: 10, - TransmissionSchedule: transmissionSchedule, - MaxDurationQueryMillis: 1000, - MaxDurationObservationMillis: 1000, - MaxDurationAcceptMillis: 1000, - MaxDurationTransmitMillis: 1000, - MaxFaultyOracles: 1, - MaxQueryLengthBytes: 1000000, - MaxObservationLengthBytes: 1000000, - MaxReportLengthBytes: 1000000, - MaxRequestBatchSize: 1000, - UniqueReports: true, - } - - cfg := keystone_changeset.InitialContractsCfg{ - RegistryChainSel: keystoneEnv.ChainSelector, - Dons: donCapabilities, - OCR3Config: &oracleConfig, - } - - _, err := keystone_changeset.ConfigureInitialContractsChangeset(*keystoneEnv.Environment, cfg) - require.NoError(t, err, "failed to configure initial contracts") -} - -func startJobDistributor(t *testing.T, in *TestConfig, keystoneEnv *KeystoneEnvironment) { - if os.Getenv("CI") == "true" { - jdImage := ctfconfig.MustReadEnvVar_String(e2eJobDistributorImageEnvVarName) - jdVersion := os.Getenv(e2eJobDistributorVersionEnvVarName) - in.JD.Image = fmt.Sprintf("%s:%s", jdImage, jdVersion) - } - jdOutput, err := jd.NewJD(in.JD) - require.NoError(t, err, "failed to create new job distributor") - - keystoneEnv.JD = jdOutput -} - -func nodeSetFlags(nodeSet *CapabilitiesAwareNodeSet) ([]string, error) { - var stringCaps []string - if len(nodeSet.Capabilities) == 0 && nodeSet.DONType == "" { - // if no flags are set, we assign all known capabilities to the DON - return SingleDonFlags, nil - } - - stringCaps = append(stringCaps, append(nodeSet.Capabilities, nodeSet.DONType)...) - return stringCaps, nil -} - -func buildDONTopology(t *testing.T, in *TestConfig, keystoneEnv *KeystoneEnvironment) { - require.NotNil(t, in, "test config must not be nil") - require.NotNil(t, keystoneEnv, "keystone environment must not be nil") - require.NotNil(t, keystoneEnv.dons, "keystone environment must have DONs") - require.NotNil(t, keystoneEnv.WrappedNodeOutput, "keystone environment must have node outputs") - - require.Equal(t, len(keystoneEnv.dons), len(keystoneEnv.WrappedNodeOutput), "number of DONs and node outputs must match") - keystoneEnv.DONTopology = make([]*DONTopology, len(keystoneEnv.dons)) - - // one DON to do everything - if len(keystoneEnv.dons) == 1 { - flags, err := nodeSetFlags(in.NodeSets[0]) - require.NoError(t, err, "failed to convert string flags to bitmap for nodeset %s", in.NodeSets[0].Name) - - keystoneEnv.DONTopology[0] = &DONTopology{ - DON: keystoneEnv.dons[0], - NodeInput: in.NodeSets[0], - NodeOutput: keystoneEnv.WrappedNodeOutput[0], - ID: 1, - Flags: flags, - } - } else { - for i, don := range keystoneEnv.dons { - flags, err := nodeSetFlags(in.NodeSets[i]) - require.NoError(t, err, "failed to convert string flags to bitmap for nodeset %s", in.NodeSets[i].Name) - - keystoneEnv.DONTopology[i] = &DONTopology{ - DON: don, - NodeInput: in.NodeSets[i], - NodeOutput: keystoneEnv.WrappedNodeOutput[i], - ID: mustSafeUint32(i + 1), - Flags: flags, - } - } - } - - keystoneEnv.WorkflowDONID = mustOneDONTopologyWithFlag(t, keystoneEnv.DONTopology, WorkflowDON).ID -} - -func getLogFileHandles(t *testing.T, l zerolog.Logger, ns *ns.Output) ([]*os.File, error) { - var logFiles []*os.File - - var belongsToCurrentEnv = func(filePath string) bool { - for i, clNode := range ns.CLNodes { - if clNode == nil { - continue - } - - // skip the first node, as it's the bootstrap node - if i == 0 { - continue - } - - if strings.EqualFold(filePath, clNode.Node.ContainerName+".log") { - return true - } - } - return false - } - - logsDir := "logs/docker-" + t.Name() - - fileWalkErr := filepath.Walk(logsDir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if !info.IsDir() && belongsToCurrentEnv(info.Name()) { - file, fileErr := os.Open(path) - if fileErr != nil { - return fmt.Errorf("failed to open file %s: %w", path, fileErr) - } - logFiles = append(logFiles, file) - } - return nil - }) - - expectedLogCount := len(ns.CLNodes) - 1 - if len(logFiles) != expectedLogCount { - l.Warn().Int("Expected", expectedLogCount).Int("Got", len(logFiles)).Msg("Number of log files does not match number of worker nodes. Some logs might be missing.") - } - - if fileWalkErr != nil { - l.Error().Err(fileWalkErr).Msg("Error walking through log files. Will not look for report transmission transaction hashes") - return nil, fileWalkErr - } - - return logFiles, nil -} - -// This function is used to go through Chainlink Node logs and look for entries related to report transmissions. -// Once such a log entry is found, it looks for transaction hash and then it tries to decode the transaction and print the result. -func debugReportTransmissions(logFiles []*os.File, l zerolog.Logger, wsRPCURL string) { - /* - Example log entry: - 2025-01-28T14:44:48.080Z [DEBUG] Node sent transaction multinode@v0.0.0-20250121205514-f73e2f86c23b/transaction_sender.go:180 chainID=1337 logger=EVM.1337.TransactionSender tx={"type":"0x0","chainId":"0x539","nonce":"0x0","to":"0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9","gas":"0x61a80","gasPrice":"0x3b9aca00","maxPriorityFeePerGas":null,"maxFeePerGas":null,"value":"0x0","input":"0x11289565000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c853000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000010d010f715db03509d388f706e16137722000e26aa650a64ac826ae8e5679cdf57fd96798ed50000000010000000100000a9c593aaed2f5371a5bc0779d1b8ea6f9c7d37bfcbb876a0a9444dbd36f64306466323239353031f39fd6e51aad88f6f4ce6ab8827279cfffb92266000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001018bfe88407000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb5c162c8000000000000000000000000000000000000000000000000000000006798ed37000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000e700d4c57250eac9dc925c951154c90c1b6017944322fb2075055d8bdbe19000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000041561c171b7465e8efef35572ef82adedb49ea71b8344a34a54ce5e853f80ca1ad7d644ebe710728f21ebfc3e2407bd90173244f744faa011c3a57213c8c585de90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004165e6f3623acc43f163a58761655841bfebf3f6b4ea5f8d34c64188036b0ac23037ebbd3854b204ca26d828675395c4b9079ca068d9798326eb8c93f26570a1080100000000000000000000000000000000000000000000000000000000000000","v":"0xa96","r":"0x168547e96e7088c212f85a4e8dddce044bbb2abfd5ccc8a5451fdfcb812c94e5","s":"0x2a735a3df046632c2aaa7e583fe161113f3345002e6c9137bbfa6800a63f28a4","hash":"0x3fc5508310f8deef09a46ad594dcc5dc9ba415319ef1dfa3136335eb9e87ff4d"} version=2.19.0@05c05a9 - - What we are looking for: - "hash":"0x3fc5508310f8deef09a46ad594dcc5dc9ba415319ef1dfa3136335eb9e87ff4d" - */ - reportTransmissionTxHashPattern := regexp.MustCompile(`"hash":"(0x[0-9a-fA-F]+)"`) - - // let's be prudent and assume that in extreme scenario when feed price isn't updated, but - // transmission is still sent, we might have multiple transmissions per node, and if we want - // to avoid blocking on the channel, we need to have a higher buffer - resultsCh := make(chan string, len(logFiles)*4) - - wg := &sync.WaitGroup{} - for _, f := range logFiles { - wg.Add(1) - file := f - - go func() { - defer wg.Done() - - scanner := bufio.NewScanner(file) - scanner.Split(bufio.ScanLines) - - for scanner.Scan() { - jsonLogLine := scanner.Text() - - if !strings.Contains(jsonLogLine, "Node sent transaction") { - continue - } - - match := reportTransmissionTxHashPattern.MatchString(jsonLogLine) - if match { - resultsCh <- reportTransmissionTxHashPattern.FindStringSubmatch(jsonLogLine)[1] - } - } - }() - } - - wg.Wait() - close(resultsCh) - - if len(resultsCh) == 0 { - l.Error().Msg("❌ No report transmissions found in Chainlink Node logs.") - return - } - - // required as Seth prints transaction traces to stdout with debug level - _ = os.Setenv(seth.LogLevelEnvVar, "debug") - - sc, err := seth.NewClientBuilder(). - WithRpcUrl(wsRPCURL). - WithReadOnlyMode(). - WithGethWrappersFolders([]string{"../../../core/gethwrappers/keystone/generated"}). // point Seth to the folder with keystone geth wrappers, so that it can load contract ABIs - Build() - - if err != nil { - l.Error().Err(err).Msg("Failed to create seth client") - return - } - - for txHash := range resultsCh { - l.Info().Msgf("🔍 Tracing report transmission transaction %s", txHash) - // set tracing level to all to trace also successful transactions - sc.Cfg.TracingLevel = seth.TracingLevel_All - tx, _, err := sc.Client.TransactionByHash(context.Background(), common.HexToHash(txHash)) - if err != nil { - l.Warn().Err(err).Msgf("Failed to get transaction by hash %s", txHash) - continue - } - _, decodedErr := sc.DecodeTx(tx) - - if decodedErr != nil { - l.Error().Err(decodedErr).Msgf("Transmission transaction %s failed due to %s", txHash, decodedErr.Error()) - continue - } - } -} - -// this function is used to print debug information from Chainlink Node logs -// it checks whether workflow was executing, OCR was executing and whether reports were sent -// and if they were, it traces each report transmission transaction -func printTestDebug(t *testing.T, l zerolog.Logger, keystoneEnv *KeystoneEnvironment) { - require.NotNil(t, keystoneEnv, "keystone environment must not be nil") - require.NotNil(t, keystoneEnv.DONTopology, "keystone environment must have DON topology") - require.NotNil(t, keystoneEnv.Blockchain, "keystone environment must have blockchain") - - l.Info().Msg("🔍 Debug information from Chainlink Node logs:") - - for _, donTopology := range keystoneEnv.DONTopology { - logFiles, err := getLogFileHandles(t, l, donTopology.NodeOutput.Output) - if err != nil { - l.Error().Err(err).Msg("Failed to get log file handles. No debug information will be printed") - return - } - - defer func() { - for _, f := range logFiles { - _ = f.Close() - } - }() - - // assuming one bootstrap node - workflowNodeCount := len(donTopology.NodeOutput.CLNodes) - 1 - - if hasFlag(donTopology.Flags, WorkflowDON) { - if !checkIfWorkflowWasExecuting(logFiles, workflowNodeCount) { - l.Error().Msg("❌ Workflow was not executing") - return - } else { - l.Info().Msg("✅ Workflow was executing") - } - } - - if hasFlag(donTopology.Flags, OCR3Capability) { - if !checkIfOCRWasExecuting(logFiles, workflowNodeCount) { - l.Error().Msg("❌ OCR was not executing") - return - } else { - l.Info().Msg("✅ OCR was executing") - } - } - - if hasFlag(donTopology.Flags, WriteEVMCapability) { - if !checkIfAtLeastOneReportWasSent(logFiles, workflowNodeCount) { - l.Error().Msg("❌ Reports were not sent") - return - } else { - l.Info().Msg("✅ Reports were sent") - - // debug report transmissions - debugReportTransmissions(logFiles, l, keystoneEnv.Blockchain.Nodes[0].HostWSUrl) - } - } - - // Add support for new capabilities here as needed, if there is some specific debug information to be printed - } -} - -func checkIfLogsHaveText(logFiles []*os.File, bufferSize int, expectedText string, validationFn func(int) bool) bool { - wg := &sync.WaitGroup{} - - resultsCh := make(chan struct{}, bufferSize) - - for _, f := range logFiles { - wg.Add(1) - file := f - - go func() { - defer func() { - wg.Done() - // reset file pointer to the beginning of the file - // so that subsequent reads start from the beginning - _, _ = file.Seek(0, io.SeekStart) - }() - - scanner := bufio.NewScanner(file) - scanner.Split(bufio.ScanLines) - - for scanner.Scan() { - jsonLogLine := scanner.Text() - - if strings.Contains(jsonLogLine, expectedText) { - resultsCh <- struct{}{} - return - } - } - }() - } - - wg.Wait() - close(resultsCh) - - var found int - for range resultsCh { - found++ - } - - return validationFn(found) -} - -func exactCountValidationFn(expected int) func(int) bool { - return func(found int) bool { - return found == expected - } -} - -func checkIfWorkflowWasExecuting(logFiles []*os.File, workflowNodeCount int) bool { - return checkIfLogsHaveText(logFiles, workflowNodeCount, "step request enqueued", exactCountValidationFn(workflowNodeCount)) -} - -func checkIfOCRWasExecuting(logFiles []*os.File, workflowNodeCount int) bool { - return checkIfLogsHaveText(logFiles, workflowNodeCount, "✅ committed outcome", exactCountValidationFn(workflowNodeCount)) -} - -func checkIfAtLeastOneReportWasSent(logFiles []*os.File, workflowNodeCount int) bool { - // we are looking for "Node sent transaction" log entry, which might appear various times in the logs - // but most probably not in the logs of all nodes, since they take turns in sending reports - // our buffer must be large enough to capture all the possible log entries in order to avoid channel blocking - bufferSize := workflowNodeCount * 4 - - return checkIfLogsHaveText(logFiles, bufferSize, "Node sent transaction", func(found int) bool { return found > 0 }) -} - -func logTestInfo(l zerolog.Logger, feedId, workflowName, feedConsumerAddr, forwarderAddr string) { - l.Info().Msg("------ Test configuration:") - l.Info().Msgf("Feed ID: %s", feedId) - l.Info().Msgf("Workflow name: %s", workflowName) - l.Info().Msgf("FeedConsumer address: %s", feedConsumerAddr) - l.Info().Msgf("KeystoneForwarder address: %s", forwarderAddr) -} - -func float64ToBigInt(f float64) *big.Int { - f *= 100 - - bigFloat := new(big.Float).SetFloat64(f) - - bigInt := new(big.Int) - bigFloat.Int(bigInt) // Truncate towards zero - - return bigInt -} - -func setupFakeDataProvider(t *testing.T, testLogger zerolog.Logger, in *TestConfig, priceIndex *int) string { - _, err := fake.NewFakeDataProvider(in.PriceProvider.Fake.Input) - require.NoError(t, err) - fakeApiPath := "/fake/api/price" - fakeFinalUrl := fmt.Sprintf("%s:%d%s", framework.HostDockerInternal(), in.PriceProvider.Fake.Port, fakeApiPath) - - getPriceResponseFn := func() map[string]interface{} { - response := map[string]interface{}{ - "accountName": "TrueUSD", - "totalTrust": in.PriceProvider.Fake.Prices[*priceIndex], - "ripcord": false, - "updatedAt": time.Now().Format(time.RFC3339), - } - - marshalled, err := json.Marshal(response) - if err == nil { - testLogger.Info().Msgf("Returning response: %s", string(marshalled)) - } else { - testLogger.Info().Msgf("Returning response: %v", response) - } - - return response - } - - err = fake.Func("GET", fakeApiPath, func(c *gin.Context) { - c.JSON(200, getPriceResponseFn()) - }) - - require.NoError(t, err, "failed to set up fake data provider") - - return fakeFinalUrl -} - -func setupPriceProvider(t *testing.T, testLogger zerolog.Logger, in *TestConfig, keystoneEnv *KeystoneEnvironment) { - if in.PriceProvider.Fake != nil { - keystoneEnv.PriceProvider = NewFakePriceProvider(t, testLogger, in) - return - } - - keystoneEnv.PriceProvider = NewLivePriceProvider(t, testLogger, in) -} - -// PriceProvider abstracts away the logic of checking whether the feed has been correctly updated -// and it also returns port and URL of the price provider. This is so, because when using a mocked -// price provider we need start a separate service and whitelist its port and IP with the gateway job. -// Also, since it's a mocked price provider we can now check whether the feed has been correctly updated -// instead of only checking whether it has some price that's != 0. -type PriceProvider interface { - URL() string - NextPrice(price *big.Int, elapsed time.Duration) bool - CheckPrices() -} - -// LivePriceProvider is a PriceProvider implementation that uses a live feed to get the price, typically http://api.real-time-reserves.verinumus.io -type LivePriceProvider struct { - t *testing.T - testLogger zerolog.Logger - url string - actualPrices []*big.Int -} - -func NewLivePriceProvider(t *testing.T, testLogger zerolog.Logger, in *TestConfig) PriceProvider { - return &LivePriceProvider{ - testLogger: testLogger, - url: in.PriceProvider.URL, - t: t, - } -} - -func (l *LivePriceProvider) NextPrice(price *big.Int, elapsed time.Duration) bool { - // if price is nil or 0 it means that the feed hasn't been updated yet - if price == nil || price.Cmp(big.NewInt(0)) == 0 { - return true - } - - l.testLogger.Info().Msgf("Feed updated after %s - price set, price=%s", elapsed, price) - l.actualPrices = append(l.actualPrices, price) - - // no other price to return, we are done - return false -} - -func (l *LivePriceProvider) URL() string { - return l.url -} - -func (l *LivePriceProvider) CheckPrices() { - // we don't have a way to check the price in the live feed, so we always assume it's correct - // as long as it's != 0. And we only wait for the first price to be set. - require.NotEmpty(l.t, l.actualPrices, "no prices found in the feed") - require.NotEqual(l.t, l.actualPrices[0], big.NewInt(0), "price found in the feed is 0") -} - -// FakePriceProvider is a PriceProvider implementation that uses a mocked feed to get the price -// It returns a configured price sequence and makes sure that the feed has been correctly updated -type FakePriceProvider struct { - t *testing.T - testLogger zerolog.Logger - priceIndex *int - url string - expectedPrices []*big.Int - actualPrices []*big.Int -} - -func NewFakePriceProvider(t *testing.T, testLogger zerolog.Logger, in *TestConfig) PriceProvider { - priceIndex := ptr.Ptr(0) - expectedPrices := make([]*big.Int, len(in.PriceProvider.Fake.Prices)) - for i, p := range in.PriceProvider.Fake.Prices { - // convert float64 to big.Int by multiplying by 100 - // just like the PoR workflow does - expectedPrices[i] = float64ToBigInt(p) - } - - return &FakePriceProvider{ - t: t, - testLogger: testLogger, - expectedPrices: expectedPrices, - priceIndex: priceIndex, - url: setupFakeDataProvider(t, testLogger, in, priceIndex), - } -} - -func (f *FakePriceProvider) priceAlreadyFound(price *big.Int) bool { - for _, p := range f.actualPrices { - if p.Cmp(price) == 0 { - return true - } - } - - return false -} - -func (f *FakePriceProvider) NextPrice(price *big.Int, elapsed time.Duration) bool { - // if price is nil or 0 it means that the feed hasn't been updated yet - if price == nil || price.Cmp(big.NewInt(0)) == 0 { - return true - } - - if !f.priceAlreadyFound(price) { - f.testLogger.Info().Msgf("Feed updated after %s - price set, price=%s", elapsed, price) - f.actualPrices = append(f.actualPrices, price) - - if len(f.actualPrices) == len(f.expectedPrices) { - // all prices found, nothing more to check - return false - } else { - require.Less(f.t, len(f.actualPrices), len(f.expectedPrices), "more prices found than expected") - f.testLogger.Info().Msgf("Changing price provider price to %s", f.expectedPrices[len(f.actualPrices)].String()) - *f.priceIndex = len(f.actualPrices) - - // set new price and continue checking - return true - } - } - - // continue checking, price not updated yet - return true -} - -func (f *FakePriceProvider) CheckPrices() { - require.EqualValues(f.t, f.expectedPrices, f.actualPrices, "prices found in the feed do not match prices set in the mock") - f.testLogger.Info().Msgf("All %d mocked prices were found in the feed", len(f.expectedPrices)) -} - -func (f *FakePriceProvider) URL() string { - return f.url -} - -func startBlockchain(t *testing.T, in *TestConfig, keystoneEnv *KeystoneEnvironment) { - bc, err := blockchain.NewBlockchainNetwork(in.BlockchainA) - require.NoError(t, err, "failed to create blockchain network") - - pkey := os.Getenv("PRIVATE_KEY") - require.NotEmpty(t, pkey, "private key must not be empty") - - sc, err := seth.NewClientBuilder(). - WithRpcUrl(bc.Nodes[0].HostWSUrl). - WithPrivateKeys([]string{pkey}). - Build() - require.NoError(t, err, "failed to create seth client") - - chainSelector, err := chainselectors.SelectorFromChainId(sc.Cfg.Network.ChainID) - require.NoError(t, err, "failed to get chain selector for chain id %d", sc.Cfg.Network.ChainID) - - keystoneEnv.Blockchain = bc - keystoneEnv.SethClient = sc - keystoneEnv.DeployerPrivateKey = pkey - keystoneEnv.ChainSelector = chainSelector -} - -func extraAllowedPortsAndIps(t *testing.T, testLogger zerolog.Logger, in *TestConfig, nodeOutput *ns.Output) ([]string, []int) { - // no need to allow anything, if we are using live feed - if in.PriceProvider.Fake == nil { - return nil, nil - } - - // we need to explicitly allow the port used by the fake data provider - // and IP corresponding to host.docker.internal or the IP of the host machine, if we are running on Linux, - // because that's where the fake data provider is running - var hostIp string - var err error - - system := runtime.GOOS - switch system { - case "darwin": - hostIp, err = resolveHostDockerInternaIp(testLogger, nodeOutput) - require.NoError(t, err, "failed to resolve host.docker.internal IP") - case "linux": - // for linux framework already returns an IP, so we don't need to resolve it, - // but we need to remove the http:// prefix - hostIp = strings.ReplaceAll(framework.HostDockerInternal(), "http://", "") - default: - err = fmt.Errorf("unsupported OS: %s", system) - } - require.NoError(t, err, "failed to resolve host.docker.internal IP") - - testLogger.Info().Msgf("Will allow IP %s and port %d for the fake data provider", hostIp, in.PriceProvider.Fake.Port) - - // we also need to explicitly allow Gist's IP - return []string{hostIp, GistIP}, []int{in.PriceProvider.Fake.Port} -} -func TestKeystoneWithOCR3Workflow(t *testing.T) { - testLogger := framework.L - - // Load test configuration - in, err := framework.Load[TestConfig](t) - require.NoError(t, err, "couldn't load test config") - validateInputsAndEnvVars(t, in) - - keystoneEnv := &KeystoneEnvironment{} - - // Create a new blockchain network and Seth client to interact with it - startBlockchain(t, in, keystoneEnv) - - // Get either a no-op price provider (for live endpoint) - // or a fake price provider (for mock endpoint) - setupPriceProvider(t, testLogger, in, keystoneEnv) - - // Start job distributor - startJobDistributor(t, in, keystoneEnv) - - // Deploy the DONs - for _, nodeSet := range in.NodeSets { - startSingleNodeSet(t, nodeSet, keystoneEnv) - } - - // Prepare the chainlink/deployment environment, which also configures chains for nodes and job distributor - buildChainlinkDeploymentEnv(t, keystoneEnv) - - // Fund the nodes - fundNodes(t, keystoneEnv) - - buildDONTopology(t, in, keystoneEnv) - - // Deploy keystone contracts (forwarder, capability registry, ocr3 capability) - deployKeystoneContracts(t, testLogger, keystoneEnv) - - // Deploy and pre-configure workflow registry contract (using only workflow DON id) - prepareWorkflowRegistry(t, testLogger, keystoneEnv) - - // Deploy and configure Keystone Feeds Consumer contract - prepareFeedsConsumer(t, testLogger, in.WorkflowConfig.WorkflowName, keystoneEnv) - - // Register the workflow (either via CRE CLI or by calling the workflow registry directly; using only workflow DON id) - registerWorkflow(t, in, in.WorkflowConfig.WorkflowName, keystoneEnv) - - // update node configuration and create jobs - configureNodes(t, testLogger, in, keystoneEnv) - - // Log extra information that might help debugging - t.Cleanup(func() { - if t.Failed() { - logTestInfo(testLogger, in.PriceProvider.FeedID, in.WorkflowConfig.WorkflowName, keystoneEnv.KeystoneContractAddresses.FeedsConsumerAddress.Hex(), keystoneEnv.KeystoneContractAddresses.ForwarderAddress.Hex()) - - logDir := fmt.Sprintf("%s-%s", framework.DefaultCTFLogsDir, t.Name()) - - err := os.RemoveAll(logDir) - if err != nil { - testLogger.Error().Err(err).Msg("failed to remove log directory") - return - } - - _, err = framework.SaveContainerLogs(logDir) - if err != nil { - testLogger.Error().Err(err).Msg("failed to save container logs") - return - } - - printTestDebug(t, testLogger, keystoneEnv) - } - }) - - // CAUTION: It is crucial to configure OCR3 jobs on nodes before configuring the workflow contracts. - // Wait for OCR listeners to be ready before setting the configuration. - // If the ConfigSet event is missed, OCR protocol will not start. - // TODO make it fluent! - testLogger.Info().Msg("Waiting 30s for OCR listeners to be ready...") - time.Sleep(30 * time.Second) - testLogger.Info().Msg("Proceeding to set OCR3 configuration.") - - // Configure the workflow DON and contracts - configureContracts(t, keystoneEnv) - - // It can take a while before the first report is produced, particularly on CI. - timeout := 10 * time.Minute - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - - feedsConsumerInstance, err := feeds_consumer.NewKeystoneFeedsConsumer(keystoneEnv.KeystoneContractAddresses.FeedsConsumerAddress, keystoneEnv.SethClient.Client) - require.NoError(t, err, "failed to create feeds consumer instance") - - testLogger.Info().Msg("Waiting for feed to update...") - startTime := time.Now() - feedBytes := common.HexToHash(in.PriceProvider.FeedID) - - for { - select { - case <-ctx.Done(): - testLogger.Error().Msgf("feed did not update, timeout after %s", timeout) - t.FailNow() - case <-time.After(10 * time.Second): - elapsed := time.Since(startTime).Round(time.Second) - price, _, err := feedsConsumerInstance.GetPrice( - keystoneEnv.SethClient.NewCallOpts(), - feedBytes, - ) - require.NoError(t, err, "failed to get price from Keystone Consumer contract") - - if !keystoneEnv.PriceProvider.NextPrice(price, elapsed) { - // check if all expected prices were found and finish the test - keystoneEnv.PriceProvider.CheckPrices() - return - } - testLogger.Info().Msgf("Feed not updated yet, waiting for %s", elapsed) - } - } -} diff --git a/system-tests/lib/conversions/ints.go b/system-tests/lib/conversions/ints.go new file mode 100644 index 00000000000..1035f2a783c --- /dev/null +++ b/system-tests/lib/conversions/ints.go @@ -0,0 +1,35 @@ +package conversions + +import ( + "fmt" + "math/big" +) + +func MustSafeUint64(input int64) uint64 { + if input < 0 { + panic(fmt.Errorf("int64 %d is below uint64 min value", input)) + } + return uint64(input) +} + +func MustSafeUint32(input int) uint32 { + if input < 0 { + panic(fmt.Errorf("int %d is below uint32 min value", input)) + } + maxUint32 := (1 << 32) - 1 + if input > maxUint32 { + panic(fmt.Errorf("int %d exceeds uint32 max value", input)) + } + return uint32(input) +} + +func Float64ToBigInt(f float64) *big.Int { + f *= 100 + + bigFloat := new(big.Float).SetFloat64(f) + + bigInt := new(big.Int) + bigFloat.Int(bigInt) // Truncate towards zero + + return bigInt +} diff --git a/system-tests/lib/cre/capabilities/download.go b/system-tests/lib/cre/capabilities/download.go new file mode 100644 index 00000000000..23644c872d4 --- /dev/null +++ b/system-tests/lib/cre/capabilities/download.go @@ -0,0 +1,28 @@ +package capabilities + +import ( + "os" + + "github.com/smartcontractkit/chainlink-testing-framework/lib/client" +) + +func DownloadCapabilityFromRelease(ghToken, version, assetFileName string) (string, error) { + ghClient := client.NewGithubClient(ghToken) + content, err := ghClient.DownloadAssetFromRelease("smartcontractkit", "capabilities", version, assetFileName) + if err != nil { + return "", err + } + + fileName := assetFileName + file, err := os.Create(assetFileName) + if err != nil { + return "", err + } + defer file.Close() + + if _, err := file.Write(content); err != nil { + return "", err + } + + return fileName, nil +} diff --git a/system-tests/lib/cre/contracts/contracts.go b/system-tests/lib/cre/contracts/contracts.go new file mode 100644 index 00000000000..84c63d02fe7 --- /dev/null +++ b/system-tests/lib/cre/contracts/contracts.go @@ -0,0 +1,490 @@ +package contracts + +import ( + "crypto/sha256" + "encoding/hex" + "fmt" + "strings" + + "github.com/ethereum/go-ethereum/common" + "github.com/pkg/errors" + "github.com/rs/zerolog" + + capabilitiespb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb" + "github.com/smartcontractkit/chainlink/deployment" + keystone_changeset "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" + kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/feeds_consumer" + + workflow_registry_changeset "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/workflowregistry" + + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/flags" + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/types" + + keystonenode "github.com/smartcontractkit/chainlink/system-tests/lib/cre/don/node" +) + +func ConfigureKeystone(input types.ConfigureKeystoneInput) error { + if err := input.Validate(); err != nil { + return errors.Wrap(err, "input validation failed") + } + + donCapabilities := make([]keystone_changeset.DonCapabilities, 0, len(input.DonTopology.MetaDons)) + + for _, metaDon := range input.DonTopology.MetaDons { + var capabilities []keystone_changeset.DONCapabilityWithConfig + + // check what capabilities each DON has and register them with Capabilities Registry contract + if flags.HasFlag(metaDon.Flags, types.CronCapability) { + capabilities = append(capabilities, keystone_changeset.DONCapabilityWithConfig{ + Capability: kcr.CapabilitiesRegistryCapability{ + LabelledName: "cron-trigger", + Version: "1.0.0", + CapabilityType: 0, // TRIGGER + }, + Config: &capabilitiespb.CapabilityConfig{}, + }) + } + + if flags.HasFlag(metaDon.Flags, types.CustomComputeCapability) { + capabilities = append(capabilities, keystone_changeset.DONCapabilityWithConfig{ + Capability: kcr.CapabilitiesRegistryCapability{ + LabelledName: "custom-compute", + Version: "1.0.0", + CapabilityType: 1, // ACTION + }, + Config: &capabilitiespb.CapabilityConfig{}, + }) + } + + if flags.HasFlag(metaDon.Flags, types.OCR3Capability) { + capabilities = append(capabilities, keystone_changeset.DONCapabilityWithConfig{ + Capability: kcr.CapabilitiesRegistryCapability{ + LabelledName: "offchain_reporting", + Version: "1.0.0", + CapabilityType: 2, // CONSENSUS + ResponseType: 0, // REPORT + }, + Config: &capabilitiespb.CapabilityConfig{}, + }) + } + + if flags.HasFlag(metaDon.Flags, types.WriteEVMCapability) { + capabilities = append(capabilities, keystone_changeset.DONCapabilityWithConfig{ + Capability: kcr.CapabilitiesRegistryCapability{ + LabelledName: "write_geth-testnet", + Version: "1.0.0", + CapabilityType: 3, // TARGET + ResponseType: 1, // OBSERVATION_IDENTICAL + }, + Config: &capabilitiespb.CapabilityConfig{}, + }) + } + + // Add support for new capabilities here as needed + + donPeerIDs := make([]string, len(metaDon.DON.Nodes)-1) + for i, node := range metaDon.DON.Nodes { + if i == 0 { + continue + } + + p2pID, err := keystonenode.ToP2PID(node, keystonenode.NoOpTransformFn) + if err != nil { + return errors.Wrapf(err, "failed to get p2p id for node %s", node.Name) + } + + donPeerIDs[i-1] = p2pID + } + + // we only need to assign P2P IDs to NOPs, since `ConfigureInitialContractsChangeset` method + // will take care of creating DON to Nodes mapping + nop := keystone_changeset.NOP{ + Name: fmt.Sprintf("NOP for %s DON", metaDon.NodeOutput.NodeSetName), + Nodes: donPeerIDs, + } + + donName := metaDon.NodeOutput.NodeSetName + "-don" + donCapabilities = append(donCapabilities, keystone_changeset.DonCapabilities{ + Name: donName, + F: 1, + Nops: []keystone_changeset.NOP{nop}, + Capabilities: capabilities, + }) + } + + var transmissionSchedule []int + + for _, metaDon := range input.DonTopology.MetaDons { + if flags.HasFlag(metaDon.Flags, types.OCR3Capability) { + // this schedule makes sure that all worker nodes are transmitting OCR3 reports + transmissionSchedule = []int{len(metaDon.DON.Nodes) - 1} + break + } + } + + if len(transmissionSchedule) == 0 { + return errors.New("no OCR3-capable DON found in the topology") + } + + // values supplied by Alexandr Yepishev as the expected values for OCR3 config + oracleConfig := keystone_changeset.OracleConfig{ + DeltaProgressMillis: 5000, + DeltaResendMillis: 5000, + DeltaInitialMillis: 5000, + DeltaRoundMillis: 2000, + DeltaGraceMillis: 500, + DeltaCertifiedCommitRequestMillis: 1000, + DeltaStageMillis: 30000, + MaxRoundsPerEpoch: 10, + TransmissionSchedule: transmissionSchedule, + MaxDurationQueryMillis: 1000, + MaxDurationObservationMillis: 1000, + MaxDurationAcceptMillis: 1000, + MaxDurationTransmitMillis: 1000, + MaxFaultyOracles: 1, + MaxQueryLengthBytes: 1000000, + MaxObservationLengthBytes: 1000000, + MaxReportLengthBytes: 1000000, + MaxRequestBatchSize: 1000, + UniqueReports: true, + } + + cfg := keystone_changeset.InitialContractsCfg{ + RegistryChainSel: input.ChainSelector, + Dons: donCapabilities, + OCR3Config: &oracleConfig, + } + + _, err := keystone_changeset.ConfigureInitialContractsChangeset(*input.CldEnv, cfg) + if err != nil { + return errors.Wrap(err, "failed to configure initial contracts") + } + + return nil +} + +func DeployKeystone(testLogger zerolog.Logger, input *types.KeystoneContractsInput) (*types.KeystoneContractOutput, error) { + if input == nil { + return nil, errors.New("input is nil") + } + + if input.Out != nil && input.Out.UseCache { + return input.Out, nil + } + + if err := input.Validate(); err != nil { + return nil, errors.Wrap(err, "input validation failed") + } + + var err error + forwarderAddress, err := DeployKeystoneForwarder(testLogger, input.CldEnv, input.ChainSelector) + if err != nil { + return nil, errors.Wrap(err, "failed to deploy Keystone Forwarder contract") + } + oCR3CapabilityAddress, err := DeployOCR3(testLogger, input.CldEnv, input.ChainSelector) + if err != nil { + return nil, errors.Wrap(err, "failed to deploy OCR3 contract") + } + capabilitiesRegistryAddress, err := DeployCapabilitiesRegistry(testLogger, input.CldEnv, input.ChainSelector) + if err != nil { + return nil, errors.Wrap(err, "failed to deploy Capabilities Registry contract") + } + workflowRegistryAddress, err := DeployWorkflowRegistry(testLogger, input.CldEnv, input.ChainSelector) + if err != nil { + return nil, errors.Wrap(err, "failed to deploy Workflow Registry contract") + } + + out := &types.KeystoneContractOutput{ + ForwarderAddress: forwarderAddress, + OCR3CapabilityAddress: oCR3CapabilityAddress, + CapabilitiesRegistryAddress: capabilitiesRegistryAddress, + WorkflowRegistryAddress: workflowRegistryAddress, + } + + input.Out = out + return out, nil +} + +func DeployOCR3(testLogger zerolog.Logger, ctfEnv *deployment.Environment, chainSelector uint64) (common.Address, error) { + output, err := keystone_changeset.DeployOCR3(*ctfEnv, chainSelector) + if err != nil { + return common.Address{}, errors.Wrap(err, "failed to deploy OCR3 contract") + } + + err = ctfEnv.ExistingAddresses.Merge(output.AddressBook) + if err != nil { + return common.Address{}, errors.Wrap(err, "failed to merge address book") + } + + addresses, err := ctfEnv.ExistingAddresses.AddressesForChain(chainSelector) + if err != nil { + return common.Address{}, errors.Wrapf(err, "failed to get addresses for chain %d from the address book", chainSelector) + } + + var ocr3capabilityAddr common.Address + for addrStr, tv := range addresses { + if strings.Contains(tv.String(), "OCR3Capability") { + ocr3capabilityAddr = common.HexToAddress(addrStr) + testLogger.Info().Msgf("Deployed OCR3Capability contract at %s", ocr3capabilityAddr.Hex()) + break + } + } + if ocr3capabilityAddr == (common.Address{}) { + return common.Address{}, errors.New("failed to find OCR3Capability address in the address book") + } + + return ocr3capabilityAddr, nil +} + +func DeployCapabilitiesRegistry(testLogger zerolog.Logger, ctfEnv *deployment.Environment, chainSelector uint64) (common.Address, error) { + output, err := keystone_changeset.DeployCapabilityRegistry(*ctfEnv, chainSelector) + if err != nil { + return common.Address{}, errors.Wrap(err, "failed to deploy Capabilities Registry contract") + } + + err = ctfEnv.ExistingAddresses.Merge(output.AddressBook) + if err != nil { + return common.Address{}, errors.Wrap(err, "failed to merge address book") + } + + addresses, err := ctfEnv.ExistingAddresses.AddressesForChain(chainSelector) + if err != nil { + return common.Address{}, errors.Wrapf(err, "failed to get addresses for chain %d from the address book", chainSelector) + } + + var capabilitiesRegistryAddr common.Address + for addrStr, tv := range addresses { + if strings.Contains(tv.String(), "CapabilitiesRegistry") { + capabilitiesRegistryAddr = common.HexToAddress(addrStr) + testLogger.Info().Msgf("Deployed Capabilities Registry contract at %s", capabilitiesRegistryAddr.Hex()) + break + } + } + if capabilitiesRegistryAddr == (common.Address{}) { + return common.Address{}, errors.New("failed to find Capabilities Registry address in the address book") + } + + return capabilitiesRegistryAddr, nil +} + +func DeployKeystoneForwarder(testLogger zerolog.Logger, ctfEnv *deployment.Environment, chainSelector uint64) (common.Address, error) { + output, err := keystone_changeset.DeployForwarder(*ctfEnv, keystone_changeset.DeployForwarderRequest{ + ChainSelectors: []uint64{chainSelector}, + }) + if err != nil { + return common.Address{}, errors.Wrap(err, "failed to deploy forwarder contract") + } + + err = ctfEnv.ExistingAddresses.Merge(output.AddressBook) + if err != nil { + return common.Address{}, errors.Wrap(err, "failed to merge address book") + } + + addresses, err := ctfEnv.ExistingAddresses.AddressesForChain(chainSelector) + if err != nil { + return common.Address{}, errors.Wrapf(err, "failed to get addresses for chain %d from the address book", chainSelector) + } + + var forwarderAddress common.Address + for addrStr, tv := range addresses { + if strings.Contains(tv.String(), "KeystoneForwarder") { + forwarderAddress = common.HexToAddress(addrStr) + testLogger.Info().Msgf("Deployed KeystoneForwarder contract at %s", forwarderAddress.Hex()) + break + } + } + if forwarderAddress == (common.Address{}) { + return common.Address{}, errors.New("failed to find KeystoneForwarder address in the address book") + } + + return forwarderAddress, nil +} + +func DeployWorkflowRegistry(testLogger zerolog.Logger, ctfEnv *deployment.Environment, chainSelector uint64) (common.Address, error) { + output, err := workflow_registry_changeset.Deploy(*ctfEnv, chainSelector) + if err != nil { + return common.Address{}, errors.Wrap(err, "failed to deploy workflow registry contract") + } + + err = ctfEnv.ExistingAddresses.Merge(output.AddressBook) + if err != nil { + return common.Address{}, errors.Wrap(err, "failed to merge address book") + } + + addresses, err := ctfEnv.ExistingAddresses.AddressesForChain(chainSelector) + if err != nil { + return common.Address{}, errors.Wrapf(err, "failed to get addresses for chain %d from the address book", chainSelector) + } + + var workflowRegistryAddr common.Address + for addrStr, tv := range addresses { + if strings.Contains(tv.String(), "WorkflowRegistry") { + workflowRegistryAddr = common.HexToAddress(addrStr) + testLogger.Info().Msgf("Deployed WorkflowRegistry contract at %s", workflowRegistryAddr.Hex()) + } + } + if workflowRegistryAddr == (common.Address{}) { + return common.Address{}, errors.New("failed to find WorkflowRegistry address in the address book") + } + + return workflowRegistryAddr, nil +} + +func ConfigureWorkflowRegistry(testLogger zerolog.Logger, input *types.WorkflowRegistryInput) (*types.WorkflowRegistryOutput, error) { + if input == nil { + return nil, errors.New("input is nil") + } + if input.Out != nil && input.Out.UseCache { + return input.Out, nil + } + + if err := input.Validate(); err != nil { + return nil, errors.Wrap(err, "input validation failed") + } + + _, err := workflow_registry_changeset.UpdateAllowedDons(*input.CldEnv, &workflow_registry_changeset.UpdateAllowedDonsRequest{ + RegistryChainSel: input.ChainSelector, + DonIDs: input.AllowedDonIDs, + Allowed: true, + }) + if err != nil { + return nil, errors.Wrap(err, "failed to update allowed Dons") + } + + addresses := make([]string, 0, len(input.WorkflowOwners)) + for _, owner := range input.WorkflowOwners { + addresses = append(addresses, owner.Hex()) + } + + _, err = workflow_registry_changeset.UpdateAuthorizedAddresses(*input.CldEnv, &workflow_registry_changeset.UpdateAuthorizedAddressesRequest{ + RegistryChainSel: input.ChainSelector, + Addresses: addresses, + Allowed: true, + }) + if err != nil { + return nil, errors.Wrap(err, "failed to update authorized addresses") + } + + out := &types.WorkflowRegistryOutput{ + ChainSelector: input.ChainSelector, + AllowedDonIDs: input.AllowedDonIDs, + WorkflowOwners: input.WorkflowOwners, + } + + input.Out = out + return out, nil +} + +func DeployFeedsConsumer(testLogger zerolog.Logger, input *types.DeployFeedConsumerInput) (*types.DeployFeedConsumerOutput, error) { + if input == nil { + return nil, errors.New("input is nil") + } + if input.Out != nil && input.Out.UseCache { + return input.Out, nil + } + + if err := input.Validate(); err != nil { + return nil, errors.Wrap(err, "input validation failed") + } + + output, err := keystone_changeset.DeployFeedsConsumer(*input.CldEnv, &keystone_changeset.DeployFeedsConsumerRequest{ + ChainSelector: input.ChainSelector, + }) + if err != nil { + return nil, errors.Wrap(err, "failed to deploy feeds_consumer contract") + } + + err = input.CldEnv.ExistingAddresses.Merge(output.AddressBook) + if err != nil { + return nil, errors.Wrap(err, "failed to merge address book") + } + + addresses, err := input.CldEnv.ExistingAddresses.AddressesForChain(input.ChainSelector) + if err != nil { + return nil, errors.Wrapf(err, "failed to get addresses for chain %d from the address book", input.ChainSelector) + } + + var feedsConsumerAddress common.Address + for addrStr, tv := range addresses { + if strings.Contains(tv.String(), "FeedConsumer") { + feedsConsumerAddress = common.HexToAddress(addrStr) + testLogger.Info().Msgf("Deployed FeedConsumer contract at %s", feedsConsumerAddress.Hex()) + break + } + } + + if feedsConsumerAddress == (common.Address{}) { + return nil, errors.New("failed to find FeedConsumer address in the address book") + } + + out := &types.DeployFeedConsumerOutput{ + FeedConsumerAddress: feedsConsumerAddress, + } + + input.Out = out + return out, nil +} + +func ConfigureFeedsConsumer(testLogger zerolog.Logger, input *types.ConfigureFeedConsumerInput) (*types.ConfigureFeedConsumerOutput, error) { + if input == nil { + return nil, errors.New("input is nil") + } + if input.Out != nil && input.Out.UseCache { + return input.Out, nil + } + + if err := input.Validate(); err != nil { + return nil, errors.Wrap(err, "input validation failed") + } + + feedsConsumerInstance, err := feeds_consumer.NewKeystoneFeedsConsumer(input.FeedConsumerAddress, input.SethClient.Client) + if err != nil { + return nil, errors.Wrap(err, "failed to create feeds consumer instance") + } + + // Prepare hex-encoded and truncated workflow name + + var HashTruncateName = func(name string) string { + // Compute SHA-256 hash of the input string + hash := sha256.Sum256([]byte(name)) + + // Encode as hex to ensure UTF8 + var hashBytes []byte = hash[:] + resultHex := hex.EncodeToString(hashBytes) + + // Truncate to 10 bytes + truncated := []byte(resultHex)[:10] + return string(truncated) + } + + truncatedNames := make([][10]byte, 0, len(input.AllowedWorkflowNames)) + for _, workflowName := range input.AllowedWorkflowNames { + var workflowNameBytes [10]byte + truncated := HashTruncateName(workflowName) + copy(workflowNameBytes[:], []byte(truncated)) + + truncatedNames = append(truncatedNames, workflowNameBytes) + } + + _, decodeErr := input.SethClient.Decode(feedsConsumerInstance.SetConfig( + input.SethClient.NewTXOpts(), + input.AllowedSenders, // forwarder contract!!! + input.AllowedWorkflowOwners, // allowed workflow owners + // here we need to use hex-encoded workflow name converted to []byte + truncatedNames, // allowed workflow names + )) + if decodeErr != nil { + return nil, errors.Wrap(decodeErr, "failed to set config for feeds consumer") + } + + out := &types.ConfigureFeedConsumerOutput{ + FeedConsumerAddress: input.FeedConsumerAddress, + AllowedSenders: input.AllowedSenders, + AllowedWorkflowOwners: input.AllowedWorkflowOwners, + AllowedWorkflowNames: input.AllowedWorkflowNames, + } + + input.Out = out + return out, nil +} diff --git a/system-tests/lib/cre/contracts/workflow_registry.go b/system-tests/lib/cre/contracts/workflow_registry.go new file mode 100644 index 00000000000..7e685bf92ff --- /dev/null +++ b/system-tests/lib/cre/contracts/workflow_registry.go @@ -0,0 +1,69 @@ +package contracts + +import ( + "encoding/hex" + "strings" + + "github.com/ethereum/go-ethereum/common" + "github.com/pkg/errors" + + "github.com/smartcontractkit/chainlink-testing-framework/seth" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/workflow/generated/workflow_registry_wrapper" + + pkgworkflows "github.com/smartcontractkit/chainlink-common/pkg/workflows" + + libnet "github.com/smartcontractkit/chainlink/system-tests/lib/net" +) + +func RegisterWorkflow(sc *seth.Client, workflowRegistryAddr common.Address, donID uint32, workflowName, binaryURL, configURL string) error { + workFlowData, err := libnet.DownloadAndDecodeBase64(binaryURL) + if err != nil { + return errors.Wrap(err, "failed to download and decode workflow binary") + } + + var configData []byte + if configURL != "" { + configData, err = libnet.Download(configURL) + if err != nil { + return errors.Wrap(err, "failed to download workflow config") + } + } + + // use non-encoded workflow name + workflowID, idErr := generateWorkflowIDFromStrings(sc.MustGetRootKeyAddress().Hex(), workflowName, workFlowData, configData, "") + if idErr != nil { + return errors.Wrap(idErr, "failed to generate workflow ID") + } + + workflowRegistryInstance, err := workflow_registry_wrapper.NewWorkflowRegistry(workflowRegistryAddr, sc.Client) + if err != nil { + return errors.Wrap(err, "failed to create workflow registry instance") + } + + // use non-encoded workflow name + _, decodeErr := sc.Decode(workflowRegistryInstance.RegisterWorkflow(sc.NewTXOpts(), workflowName, [32]byte(common.Hex2Bytes(workflowID)), donID, uint8(0), binaryURL, configURL, "")) + if decodeErr != nil { + return errors.Wrap(decodeErr, "failed to register workflow") + } + + return nil +} + +func generateWorkflowIDFromStrings(owner string, name string, workflow []byte, config []byte, secretsURL string) (string, error) { + ownerWithoutPrefix := owner + if strings.HasPrefix(owner, "0x") { + ownerWithoutPrefix = owner[2:] + } + + ownerb, err := hex.DecodeString(ownerWithoutPrefix) + if err != nil { + return "", err + } + + wid, err := pkgworkflows.GenerateWorkflowID(ownerb, name, workflow, config, secretsURL) + if err != nil { + return "", err + } + + return hex.EncodeToString(wid[:]), nil +} diff --git a/system-tests/lib/cre/debug/debug.go b/system-tests/lib/cre/debug/debug.go new file mode 100644 index 00000000000..32697a92bd5 --- /dev/null +++ b/system-tests/lib/cre/debug/debug.go @@ -0,0 +1,283 @@ +package debug + +import ( + "bufio" + "context" + "fmt" + "io" + "os" + "path/filepath" + "regexp" + "strings" + "sync" + + "github.com/ethereum/go-ethereum/common" + "github.com/rs/zerolog" + + ns "github.com/smartcontractkit/chainlink-testing-framework/framework/components/simple_node_set" + "github.com/smartcontractkit/chainlink-testing-framework/seth" + + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/flags" + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/types" +) + +func PrintTestDebug(testName string, l zerolog.Logger, input types.DebugInput) { + l.Info().Msg("🔍 Debug information from Chainlink Node logs:") + + if err := input.Validate(); err != nil { + l.Error().Err(err).Msg("Input validation failed. No debug information will be printed") + + return + } + + var allLogFiles []*os.File + + defer func() { + for _, f := range allLogFiles { + if f != nil { + _ = (*f).Close() + } + } + }() + + for _, donTopology := range input.DonTopology.MetaDons { + logFiles, err := getLogFileHandles(testName, l, donTopology.NodeOutput.Output) + if err != nil { + l.Error().Err(err).Msg("Failed to get log file handles. No debug information will be printed") + return + } + + allLogFiles = append(allLogFiles, logFiles...) + + // assuming one bootstrap node + workflowNodeCount := len(donTopology.NodeOutput.CLNodes) - 1 + + if flags.HasFlag(donTopology.Flags, types.WorkflowDON) { + if !checkIfWorkflowWasExecuting(logFiles, workflowNodeCount) { + l.Error().Msg("❌ Workflow was not executing") + return + } + l.Info().Msg("✅ Workflow was executing") + } + + if flags.HasFlag(donTopology.Flags, types.OCR3Capability) { + if !checkIfOCRWasExecuting(logFiles, workflowNodeCount) { + l.Error().Msg("❌ OCR was not executing") + return + } + l.Info().Msg("✅ OCR was executing") + } + + if flags.HasFlag(donTopology.Flags, types.WriteEVMCapability) { + if !checkIfAtLeastOneReportWasSent(logFiles, workflowNodeCount) { + l.Error().Msg("❌ Reports were not sent") + return + } + + l.Info().Msg("✅ Reports were sent") + + // debug report transmissions + ReportTransmissions(logFiles, l, input.BlockchainOutput.Nodes[0].HostWSUrl) + } + + // Add support for new capabilities here as needed, if there is some specific debug information to be printed + } +} + +// This function is used to go through Chainlink Node logs and look for entries related to report transmissions. +// Once such a log entry is found, it looks for transaction hash and then it tries to decode the transaction and print the result. +func ReportTransmissions(logFiles []*os.File, l zerolog.Logger, wsRPCURL string) { + /* + Example log entry: + 2025-01-28T14:44:48.080Z [DEBUG] Node sent transaction multinode@v0.0.0-20250121205514-f73e2f86c23b/transaction_sender.go:180 chainID=1337 logger=EVM.1337.TransactionSender tx={"type":"0x0","chainId":"0x539","nonce":"0x0","to":"0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9","gas":"0x61a80","gasPrice":"0x3b9aca00","maxPriorityFeePerGas":null,"maxFeePerGas":null,"value":"0x0","input":"0x11289565000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c853000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000010d010f715db03509d388f706e16137722000e26aa650a64ac826ae8e5679cdf57fd96798ed50000000010000000100000a9c593aaed2f5371a5bc0779d1b8ea6f9c7d37bfcbb876a0a9444dbd36f64306466323239353031f39fd6e51aad88f6f4ce6ab8827279cfffb92266000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001018bfe88407000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bb5c162c8000000000000000000000000000000000000000000000000000000006798ed37000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000e700d4c57250eac9dc925c951154c90c1b6017944322fb2075055d8bdbe19000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000041561c171b7465e8efef35572ef82adedb49ea71b8344a34a54ce5e853f80ca1ad7d644ebe710728f21ebfc3e2407bd90173244f744faa011c3a57213c8c585de90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004165e6f3623acc43f163a58761655841bfebf3f6b4ea5f8d34c64188036b0ac23037ebbd3854b204ca26d828675395c4b9079ca068d9798326eb8c93f26570a1080100000000000000000000000000000000000000000000000000000000000000","v":"0xa96","r":"0x168547e96e7088c212f85a4e8dddce044bbb2abfd5ccc8a5451fdfcb812c94e5","s":"0x2a735a3df046632c2aaa7e583fe161113f3345002e6c9137bbfa6800a63f28a4","hash":"0x3fc5508310f8deef09a46ad594dcc5dc9ba415319ef1dfa3136335eb9e87ff4d"} version=2.19.0@05c05a9 + + What we are looking for: + "hash":"0x3fc5508310f8deef09a46ad594dcc5dc9ba415319ef1dfa3136335eb9e87ff4d" + */ + reportTransmissionTxHashPattern := regexp.MustCompile(`"hash":"(0x[0-9a-fA-F]+)"`) + + // let's be prudent and assume that in extreme scenario when feed price isn't updated, but + // transmission is still sent, we might have multiple transmissions per node, and if we want + // to avoid blocking on the channel, we need to have a higher buffer + resultsCh := make(chan string, len(logFiles)*4) + + wg := &sync.WaitGroup{} + for _, f := range logFiles { + wg.Add(1) + file := f + + go func() { + defer wg.Done() + + scanner := bufio.NewScanner(file) + scanner.Split(bufio.ScanLines) + + for scanner.Scan() { + jsonLogLine := scanner.Text() + + if !strings.Contains(jsonLogLine, "Node sent transaction") { + continue + } + + match := reportTransmissionTxHashPattern.MatchString(jsonLogLine) + if match { + resultsCh <- reportTransmissionTxHashPattern.FindStringSubmatch(jsonLogLine)[1] + } + } + }() + } + + wg.Wait() + close(resultsCh) + + if len(resultsCh) == 0 { + l.Error().Msg("❌ No report transmissions found in Chainlink Node logs.") + return + } + + // required as Seth prints transaction traces to stdout with debug level + _ = os.Setenv(seth.LogLevelEnvVar, "debug") + + sc, err := seth.NewClientBuilder(). + WithRpcUrl(wsRPCURL). + WithReadOnlyMode(). + WithGethWrappersFolders([]string{"../../../../core/gethwrappers/keystone/generated"}). // point Seth to the folder with keystone geth wrappers, so that it can load contract ABIs + Build() + + if err != nil { + l.Error().Err(err).Msg("Failed to create seth client") + return + } + + for txHash := range resultsCh { + l.Info().Msgf("🔍 Tracing report transmission transaction %s", txHash) + // set tracing level to all to trace also successful transactions + sc.Cfg.TracingLevel = seth.TracingLevel_All + tx, _, err := sc.Client.TransactionByHash(context.Background(), common.HexToHash(txHash)) + if err != nil { + l.Warn().Err(err).Msgf("Failed to get transaction by hash %s", txHash) + continue + } + _, decodedErr := sc.DecodeTx(tx) + + if decodedErr != nil { + l.Error().Err(decodedErr).Msgf("Transmission transaction %s failed due to %s", txHash, decodedErr.Error()) + continue + } + } +} + +func getLogFileHandles(testName string, l zerolog.Logger, ns *ns.Output) ([]*os.File, error) { + var logFiles []*os.File + + var belongsToCurrentEnv = func(filePath string) bool { + for i, clNode := range ns.CLNodes { + if clNode == nil { + continue + } + + // skip the first node, as it's the bootstrap node + if i == 0 { + continue + } + + if strings.EqualFold(filePath, clNode.Node.ContainerName+".log") { + return true + } + } + return false + } + + logsDir := "logs/docker-" + testName + + fileWalkErr := filepath.Walk(logsDir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if !info.IsDir() && belongsToCurrentEnv(info.Name()) { + file, fileErr := os.Open(path) + if fileErr != nil { + return fmt.Errorf("failed to open file %s: %w", path, fileErr) + } + logFiles = append(logFiles, file) + } + return nil + }) + + expectedLogCount := len(ns.CLNodes) - 1 + if len(logFiles) != expectedLogCount { + l.Warn().Int("Expected", expectedLogCount).Int("Got", len(logFiles)).Msg("Number of log files does not match number of worker nodes. Some logs might be missing.") + } + + if fileWalkErr != nil { + l.Error().Err(fileWalkErr).Msg("Error walking through log files. Will not look for report transmission transaction hashes") + return nil, fileWalkErr + } + + return logFiles, nil +} + +func exactCountValidationFn(expected int) func(int) bool { + return func(found int) bool { + return found == expected + } +} + +func checkIfWorkflowWasExecuting(logFiles []*os.File, workflowNodeCount int) bool { + return checkIfLogsHaveText(logFiles, workflowNodeCount, "step request enqueued", exactCountValidationFn(workflowNodeCount)) +} + +func checkIfOCRWasExecuting(logFiles []*os.File, workflowNodeCount int) bool { + return checkIfLogsHaveText(logFiles, workflowNodeCount, "✅ committed outcome", exactCountValidationFn(workflowNodeCount)) +} + +func checkIfAtLeastOneReportWasSent(logFiles []*os.File, workflowNodeCount int) bool { + // we are looking for "Node sent transaction" log entry, which might appear various times in the logs + // but most probably not in the logs of all nodes, since they take turns in sending reports + // our buffer must be large enough to capture all the possible log entries in order to avoid channel blocking + bufferSize := workflowNodeCount * 4 + + return checkIfLogsHaveText(logFiles, bufferSize, "Node sent transaction", func(found int) bool { return found > 0 }) +} + +func checkIfLogsHaveText(logFiles []*os.File, bufferSize int, expectedText string, validationFn func(int) bool) bool { + wg := &sync.WaitGroup{} + + resultsCh := make(chan struct{}, bufferSize) + + for _, f := range logFiles { + wg.Add(1) + file := f + + go func() { + defer func() { + wg.Done() + // reset file pointer to the beginning of the file + // so that subsequent reads start from the beginning + _, _ = file.Seek(0, io.SeekStart) + }() + + scanner := bufio.NewScanner(file) + scanner.Split(bufio.ScanLines) + + for scanner.Scan() { + jsonLogLine := scanner.Text() + + if strings.Contains(jsonLogLine, expectedText) { + resultsCh <- struct{}{} + return + } + } + }() + } + + wg.Wait() + close(resultsCh) + + var found int + for range resultsCh { + found++ + } + + return validationFn(found) +} diff --git a/system-tests/lib/cre/don/config/config.go b/system-tests/lib/cre/don/config/config.go new file mode 100644 index 00000000000..6a4a29647c8 --- /dev/null +++ b/system-tests/lib/cre/don/config/config.go @@ -0,0 +1,22 @@ +package config + +import ( + "testing" + "time" + + "github.com/pkg/errors" + + "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/system-tests/lib/cre/types" +) + +func Set(t *testing.T, nodeInput *types.CapabilitiesAwareNodeSet, bc *blockchain.Output) (*types.WrappedNodeOutput, error) { + nodeset, err := ns.UpgradeNodeSet(t, nodeInput.Input, bc, 5*time.Second) + if err != nil { + return nil, errors.Wrap(err, "failed to upgrade node set") + } + + return &types.WrappedNodeOutput{Output: nodeset, NodeSetName: nodeInput.Name, Capabilities: nodeInput.Capabilities}, nil +} diff --git a/system-tests/lib/cre/don/config/definitions.go b/system-tests/lib/cre/don/config/definitions.go new file mode 100644 index 00000000000..770a8594364 --- /dev/null +++ b/system-tests/lib/cre/don/config/definitions.go @@ -0,0 +1,164 @@ +package config + +import ( + "fmt" + "strconv" + + "github.com/ethereum/go-ethereum/common" + + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/types" +) + +func BootstrapEVM(donBootstrapNodePeerID string, chainID uint64, capabilitiesRegistryAddress common.Address, httpRPC, wsRPC string) string { + return fmt.Sprintf(` + [Feature] + LogPoller = true + + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + ContractPollInterval = '1s' + + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:5001'] + # bootstrap node in the DON always points to itself as the OCR peering bootstrapper + DefaultBootstrappers = ['%s@localhost:5001'] + + [[EVM]] + ChainID = '%d' + + [[EVM.Nodes]] + Name = 'anvil' + WSURL = '%s' + HTTPURL = '%s' + + # Capabilities registry address, required for do2don p2p mesh to work and for capabilities discovery + # Required even, when all capabilities are local to DON in a single DON scenario + [Capabilities.ExternalRegistry] + Address = '%s' + NetworkID = 'evm' + ChainID = '%d' +`, + donBootstrapNodePeerID, + chainID, + wsRPC, + httpRPC, + capabilitiesRegistryAddress, + chainID, + ) +} + +func BoostrapDon2DonPeering(peeringData types.PeeringData) string { + return fmt.Sprintf(` + [Capabilities.Peering.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:6690'] + DefaultBootstrappers = ['%s@%s:6690'] +`, + peeringData.GlobalBootstraperPeerID, + "localhost", // bootstrap node should always point to itself as the don2don peering bootstrapper + ) +} + +// could add multichain with something like this: +// +// type EVMChain struct { +// ChainID uint64 +// HTTPRPC string +// WSRPC string +// } +// +// so that we are future-proof (for bootstrap too!) +// we'd need to have capabilitiesRegistryChainID too +func WorkerEVM(donBootstrapNodePeerID, donBootstrapNodeHost string, peeringData types.PeeringData, chainID uint64, capabilitiesRegistryAddress common.Address, httpRPC, wsRPC string) string { + return fmt.Sprintf(` + [Feature] + LogPoller = true + + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + ContractPollInterval = '1s' + + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:5001'] + DefaultBootstrappers = ['%s@%s:5001'] + + [Capabilities.Peering.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:6690'] + DefaultBootstrappers = ['%s@%s:6690'] + + [[EVM]] + ChainID = '%d' + + [[EVM.Nodes]] + Name = 'anvil' + WSURL = '%s' + HTTPURL = '%s' + + # Capabilities registry address, required for do2don p2p mesh to work and for capabilities discovery + # Required even, when all capabilities are local to DON in a single DON scenario + [Capabilities.ExternalRegistry] + Address = '%s' + NetworkID = 'evm' + ChainID = '%d' +`, + donBootstrapNodePeerID, + donBootstrapNodeHost, + peeringData.GlobalBootstraperPeerID, + peeringData.GlobalBootstraperHost, + chainID, + wsRPC, + httpRPC, + capabilitiesRegistryAddress, + chainID, + ) +} + +func WorkerWriteEMV(nodeAddress, forwarderAddress common.Address) string { + return fmt.Sprintf(` + # Required for the target capability to be initialized + [EVM.Workflow] + FromAddress = '%s' + ForwarderAddress = '%s' + GasLimitDefault = 400_000 +`, + nodeAddress.Hex(), + forwarderAddress.Hex(), + ) +} + +func WorkerWorkflowRegistry(workflowRegistryAddr common.Address, chainID uint64) string { + return fmt.Sprintf(` + [Capabilities.WorkflowRegistry] + Address = "%s" + NetworkID = "evm" + ChainID = "%d" +`, + workflowRegistryAddr.Hex(), + chainID, + ) +} + +func WorkerGateway(nodeAddress common.Address, chainID uint64, donID uint32, gatewayConnectorData types.GatewayConnectorOutput) string { + gatewayURL := fmt.Sprintf("ws://%s:%d/%s", gatewayConnectorData.Host, 5003, "node") + + return fmt.Sprintf(` + [Capabilities.GatewayConnector] + DonID = "%s" + ChainIDForNodeKey = "%d" + NodeAddress = '%s' + + [[Capabilities.GatewayConnector.Gateways]] + Id = "por_gateway" + URL = "%s" +`, + strconv.FormatUint(uint64(donID), 10), + chainID, + nodeAddress, + gatewayURL, + ) +} diff --git a/system-tests/lib/cre/don/config/por/por.go b/system-tests/lib/cre/don/config/por/por.go new file mode 100644 index 00000000000..afd67a8672d --- /dev/null +++ b/system-tests/lib/cre/don/config/por/por.go @@ -0,0 +1,122 @@ +package por + +import ( + "strconv" + + "github.com/ethereum/go-ethereum/common" + "github.com/pkg/errors" + + "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/shared/ptypes" + "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/ptr" + + libc "github.com/smartcontractkit/chainlink/system-tests/lib/conversions" + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/don/config" + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/don/node" + keystoneflags "github.com/smartcontractkit/chainlink/system-tests/lib/cre/flags" + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/types" +) + +func GenerateConfigs(input types.GeneratePoRConfigsInput) (types.NodeIndexToConfigOverrides, error) { + if err := input.Validate(); err != nil { + return nil, errors.Wrap(err, "input validation failed") + } + configOverrides := make(types.NodeIndexToConfigOverrides) + + chainIDInt, err := strconv.Atoi(input.BlockchainOutput.ChainID) + if err != nil { + return nil, errors.Wrap(err, "failed to convert chain ID to int") + } + chainIDUint64 := libc.MustSafeUint64(int64(chainIDInt)) + + // find bootstrap node + bootstrapNode, err := node.FindOneWithLabel(input.Don, &ptypes.Label{Key: node.RoleLabelKey, Value: ptr.Ptr(types.BootstrapNode)}) + if err != nil { + return nil, errors.Wrap(err, "failed to find bootstrap node") + } + + donBootstrapNodePeerID, err := node.ToP2PID(*bootstrapNode, node.KeyExtractingTransformFn) + if err != nil { + return nil, errors.Wrap(err, "failed to get bootstrap node peer ID") + } + + var donBootstrapNodeHost string + for _, label := range bootstrapNode.Labels() { + if label.Key == node.HostLabelKey { + donBootstrapNodeHost = *label.Value + break + } + } + + if donBootstrapNodeHost == "" { + return nil, errors.New("failed to get bootstrap node host from labels") + } + + var nodeIndex int + for _, label := range bootstrapNode.Labels() { + if label.Key == node.NodeIndexKey { + nodeIndex, err = strconv.Atoi(*label.Value) + if err != nil { + return nil, errors.Wrap(err, "failed to convert node index to int") + } + } + } + + // generat configuration for the bootstrap node + configOverrides[nodeIndex] = config.BootstrapEVM(donBootstrapNodePeerID, chainIDUint64, input.CapabilitiesRegistryAddress, input.BlockchainOutput.Nodes[0].DockerInternalHTTPUrl, input.BlockchainOutput.Nodes[0].DockerInternalWSUrl) + + if keystoneflags.HasFlag(input.Flags, types.WorkflowDON) { + configOverrides[nodeIndex] += config.BoostrapDon2DonPeering(input.PeeringData) + + if input.GatewayConnectorOutput == nil { + return nil, errors.New("GatewayConnectorOutput is required for Workflow DON") + } + input.GatewayConnectorOutput.Host = donBootstrapNodeHost + } + + // find worker nodes + workflowNodeSet, err := node.FindManyWithLabel(input.Don, &ptypes.Label{Key: node.RoleLabelKey, Value: ptr.Ptr(types.WorkerNode)}) + if err != nil { + return nil, errors.Wrap(err, "failed to find worker nodes") + } + + for i := range workflowNodeSet { + var nodeIndex int + for _, label := range workflowNodeSet[i].Labels() { + if label.Key == node.NodeIndexKey { + nodeIndex, err = strconv.Atoi(*label.Value) + if err != nil { + return nil, errors.Wrap(err, "failed to convert node index to int") + } + } + } + + configOverrides[nodeIndex] = config.WorkerEVM(donBootstrapNodePeerID, donBootstrapNodeHost, input.PeeringData, chainIDUint64, input.CapabilitiesRegistryAddress, input.BlockchainOutput.Nodes[0].DockerInternalHTTPUrl, input.BlockchainOutput.Nodes[0].DockerInternalWSUrl) + nodeEthAddr := common.HexToAddress(workflowNodeSet[i].AccountAddr[chainIDUint64]) + + if keystoneflags.HasFlag(input.Flags, types.WriteEVMCapability) { + configOverrides[nodeIndex] += config.WorkerWriteEMV( + nodeEthAddr, + input.ForwarderAddress, + ) + } + + // if it's workflow DON configure workflow registry + if keystoneflags.HasFlag(input.Flags, types.WorkflowDON) { + configOverrides[nodeIndex] += config.WorkerWorkflowRegistry( + input.WorkflowRegistryAddress, chainIDUint64) + } + + // workflow DON nodes always needs gateway connector, otherwise they won't be able to fetch the workflow + // it's also required by custom compute, which can only run on workflow DON nodes + if keystoneflags.HasFlag(input.Flags, types.WorkflowDON) || keystoneflags.HasFlag(input.Flags, types.CustomComputeCapability) { + configOverrides[nodeIndex] += config.WorkerGateway( + nodeEthAddr, + chainIDUint64, + input.DonID, + *input.GatewayConnectorOutput, + ) + } + } + + return configOverrides, nil +} diff --git a/system-tests/lib/cre/don/don.go b/system-tests/lib/cre/don/don.go new file mode 100644 index 00000000000..31687809dc0 --- /dev/null +++ b/system-tests/lib/cre/don/don.go @@ -0,0 +1,135 @@ +package don + +import ( + "regexp" + "testing" + + "github.com/pkg/errors" + "github.com/rs/zerolog" + + "github.com/smartcontractkit/chainlink-testing-framework/framework" + ns "github.com/smartcontractkit/chainlink-testing-framework/framework/components/simple_node_set" + + "github.com/smartcontractkit/chainlink/deployment/environment/devenv" + libc "github.com/smartcontractkit/chainlink/system-tests/lib/conversions" + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/don/config" + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/don/jobs" + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/flags" + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/types" +) + +func Configure(t *testing.T, testLogger zerolog.Logger, input types.ConfigureDonInput) (*types.ConfigureDonOutput, error) { + if err := input.Validate(); err != nil { + return nil, errors.Wrap(err, "input validation failed") + } + + for i, donTopology := range input.DonTopology.MetaDons { + if configOverrides, ok := input.DonToConfigOverrides[donTopology.ID]; ok { + for j, configOverride := range configOverrides { + if len(donTopology.NodeInput.NodeSpecs)-1 < j { + return nil, errors.Errorf("config override index out of bounds: %d", j) + } + donTopology.NodeInput.NodeSpecs[j].Node.TestConfigOverrides = configOverride + } + var setErr error + input.DonTopology.MetaDons[i].NodeOutput, setErr = config.Set(t, donTopology.NodeInput, input.BlockchainOutput) + if setErr != nil { + return nil, errors.Wrap(setErr, "failed to set node output") + } + } + } + + nodeOutputs := make([]*types.WrappedNodeOutput, 0, len(input.DonTopology.MetaDons)) + for i := range input.DonTopology.MetaDons { + nodeOutputs = append(nodeOutputs, input.DonTopology.MetaDons[i].NodeOutput) + } + + // after restarting the nodes, we need to reinitialize the JD clients otherwise + // communication between JD and nodes will fail due to invalidated session cookie + // TODO remove if our idea with pre-generating & importing keys works and we do not need to restart the nodes + jdOutput, jdErr := jobs.ReinitialiseJDClients(input.CldEnv, input.JdOutput, nodeOutputs...) + if jdErr != nil { + return nil, errors.Wrap(jdErr, "failed to reinitialize JD clients") + } + for _, donTopology := range input.DonTopology.MetaDons { + if jobSpecs, ok := input.DonToJobSpecs[donTopology.ID]; ok { + createErr := jobs.Create(input.CldEnv.Offchain, donTopology.DON, donTopology.Flags, jobSpecs) + if createErr != nil { + return nil, errors.Wrapf(createErr, "failed to create jobs for DON %d", donTopology.ID) + } + } else { + testLogger.Warn().Msgf("No job specs found for DON %d", donTopology.ID) + } + } + + return &types.ConfigureDonOutput{ + JdOutput: &jdOutput.Offchain, + }, nil +} + +func BuildDONTopology(dons []*devenv.DON, nodeSetInput []*types.CapabilitiesAwareNodeSet, nodeSetOutput []*types.WrappedNodeOutput) (*types.DonTopology, error) { + donWithMeta := make([]*types.DonWithMetadata, len(dons)) + + // one DON to do everything + if len(dons) == 1 { + flags, err := flags.NodeSetFlags(nodeSetInput[0]) + if err != nil { + return nil, errors.Wrapf(err, "failed to convert string flags to bitmap for nodeset %s", nodeSetInput[0].Name) + } + + donWithMeta[0] = &types.DonWithMetadata{ + DON: dons[0], + NodeInput: nodeSetInput[0], + NodeOutput: nodeSetOutput[0], + ID: 1, + Flags: flags, + } + } else { + for i := range dons { + flags, err := flags.NodeSetFlags(nodeSetInput[i]) + if err != nil { + return nil, errors.Wrapf(err, "failed to convert string flags to bitmap for nodeset %s", nodeSetInput[i].Name) + } + + donWithMeta[i] = &types.DonWithMetadata{ + DON: dons[i], + NodeInput: nodeSetInput[i], + NodeOutput: nodeSetOutput[i], + ID: libc.MustSafeUint32(i + 1), + Flags: flags, + } + } + } + + maybeID, err := flags.OneDONTopologyWithFlag(donWithMeta, types.WorkflowDON) + if err != nil { + return nil, errors.Wrap(err, "failed to get workflow DON ID") + } + + return &types.DonTopology{ + MetaDons: donWithMeta, + WorkflowDONID: maybeID.ID, + }, nil +} + +// In order to whitelist host IP in the gateway, we need to resolve the host.docker.internal to the host IP, +// and since CL image doesn't have dig or nslookup, we need to use curl. +func ResolveHostDockerInternaIP(testLogger zerolog.Logger, nsOutput *ns.Output) (string, error) { + containerName := nsOutput.CLNodes[0].Node.ContainerName + cmd := []string{"curl", "-v", "http://host.docker.internal"} + output, err := framework.ExecContainer(containerName, cmd) + if err != nil { + return "", err + } + + re := regexp.MustCompile(`.*Trying ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*`) + matches := re.FindStringSubmatch(output) + if len(matches) < 2 { + testLogger.Error().Msgf("failed to extract IP address from curl output:\n%s", output) + return "", errors.New("failed to extract IP address from curl output") + } + + testLogger.Info().Msgf("Resolved host.docker.internal to %s", matches[1]) + + return matches[1], nil +} diff --git a/system-tests/lib/cre/don/jobs/definitions.go b/system-tests/lib/cre/don/jobs/definitions.go new file mode 100644 index 00000000000..c8997024664 --- /dev/null +++ b/system-tests/lib/cre/don/jobs/definitions.go @@ -0,0 +1,219 @@ +package jobs + +import ( + "fmt" + "strconv" + "strings" + + "github.com/ethereum/go-ethereum/common" + "github.com/google/uuid" + + jobv1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/job" + "github.com/smartcontractkit/chainlink/deployment/environment/devenv" + + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/types" +) + +var ( + NoExtraAllowedPorts = []int{} + NoExtraAllowedIPs = []string{} + + DefaultAllowedPorts = []int{80, 443} +) + +func BootstrapOCR3(nodeID string, ocr3CapabilityAddress common.Address, chainID uint64) *jobv1.ProposeJobRequest { + uuid := uuid.NewString() + + return &jobv1.ProposeJobRequest{ + NodeId: nodeID, + Spec: fmt.Sprintf(` + type = "bootstrap" + schemaVersion = 1 + externalJobID = "%s" + name = "Botostrap-%s" + contractID = "%s" + contractConfigTrackerPollInterval = "1s" + contractConfigConfirmations = 1 + relay = "evm" + [relayConfig] + chainID = %d + providerType = "ocr3-capability" +`, + uuid, + uuid[0:8], + ocr3CapabilityAddress.Hex(), + chainID), + } +} + +func BootstrapGateway(don *devenv.DON, chainID uint64, donID uint32, extraAllowedPorts []int, extraAllowedIps []string, gatewayConnectorData types.GatewayConnectorOutput) *jobv1.ProposeJobRequest { + var gatewayMembers string + for i := 1; i < len(don.Nodes); i++ { + gatewayMembers += fmt.Sprintf(` + [[gatewayConfig.Dons.Members]] + Address = "%s" + Name = "Node %d"`, + don.Nodes[i].AccountAddr[chainID], + i, + ) + } + + uuid := uuid.NewString() + + gatewayJobSpec := fmt.Sprintf(` + type = "gateway" + schemaVersion = 1 + externalJobID = "%s" + name = "Gateway-%s" + forwardingAllowed = false + [gatewayConfig.ConnectionManagerConfig] + AuthChallengeLen = 10 + AuthGatewayId = "por_gateway" + AuthTimestampToleranceSec = 5 + HeartbeatIntervalSec = 20 + [[gatewayConfig.Dons]] + DonId = "%s" + F = 1 + HandlerName = "web-api-capabilities" + [gatewayConfig.Dons.HandlerConfig] + MaxAllowedMessageAgeSec = 1_000 + [gatewayConfig.Dons.HandlerConfig.NodeRateLimiter] + GlobalBurst = 10 + GlobalRPS = 50 + PerSenderBurst = 10 + PerSenderRPS = 10 + %s + [gatewayConfig.NodeServerConfig] + HandshakeTimeoutMillis = 1_000 + MaxRequestBytes = 100_000 + # this is the path other nodes will use to connect to the gateway + Path = "%s" + # this is the port other nodes will use to connect to the gateway + Port = %d + ReadTimeoutMillis = 1_000 + RequestTimeoutMillis = 10_000 + WriteTimeoutMillis = 1_000 + [gatewayConfig.UserServerConfig] + ContentTypeHeader = "application/jsonrpc" + MaxRequestBytes = 100_000 + Path = "/" + Port = 5_002 + ReadTimeoutMillis = 1_000 + RequestTimeoutMillis = 10_000 + WriteTimeoutMillis = 1_000 + [gatewayConfig.HTTPClientConfig] + MaxResponseBytes = 100_000_000 +`, + uuid, + uuid[0:8], + strconv.FormatUint(uint64(donID), 10), + gatewayMembers, + gatewayConnectorData.Path, + gatewayConnectorData.Port, + ) + + if len(extraAllowedPorts) != 0 { + var allowedPorts string + allPorts := make([]int, 0, len(DefaultAllowedPorts)+len(extraAllowedPorts)) + allPorts = append(allPorts, append(extraAllowedPorts, DefaultAllowedPorts...)...) + for _, port := range allPorts { + allowedPorts += fmt.Sprintf("%d, ", port) + } + + // when we pass custom allowed IPs, defaults are not used and we need to + // pass HTTP and HTTPS explicitly + gatewayJobSpec += fmt.Sprintf(` + AllowedPorts = [%s] +`, + allowedPorts, + ) + } + + if len(extraAllowedIps) != 0 { + allowedIPs := strings.Join(extraAllowedIps, `", "`) + + gatewayJobSpec += fmt.Sprintf(` + AllowedIps = ["%s"] +`, + allowedIPs, + ) + } + + return &jobv1.ProposeJobRequest{ + NodeId: don.Nodes[0].NodeID, + Spec: gatewayJobSpec, + } +} + +const ( + EmptyStdCapConfig = "\"\"" +) + +func ExternalCapabilityPath(binaryName string) string { + return "/home/capabilities/" + binaryName +} + +func WorkerStandardCapability(nodeID, name, command, config string) *jobv1.ProposeJobRequest { + uuid := uuid.NewString() + + return &jobv1.ProposeJobRequest{ + NodeId: nodeID, + Spec: fmt.Sprintf(` + type = "standardcapabilities" + schemaVersion = 1 + externalJobID = "%s" + name = "%s" + forwardingAllowed = false + command = "%s" + config = %s +`, + uuid, + name+"-"+uuid[0:8], + command, + config), + } +} + +func WorkerOCR3(nodeID string, ocr3CapabilityAddress, nodeEthAddress common.Address, ocr2KeyBundleID string, ocrPeeringData types.OCRPeeringData, chainID uint64) *jobv1.ProposeJobRequest { + uuid := uuid.NewString() + + return &jobv1.ProposeJobRequest{ + NodeId: nodeID, + Spec: fmt.Sprintf(` + type = "offchainreporting2" + schemaVersion = 1 + externalJobID = "%s" + name = "ocr3-consensus-%s" + contractID = "%s" + ocrKeyBundleID = "%s" + p2pv2Bootstrappers = [ + "%s@%s", + ] + relay = "evm" + pluginType = "plugin" + transmitterID = "%s" + [relayConfig] + chainID = "%d" + [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" +`, + uuid, + uuid[0:8], + ocr3CapabilityAddress, + ocr2KeyBundleID, + ocrPeeringData.OCRBootstraperPeerID, + fmt.Sprintf("%s:%d", ocrPeeringData.OCRBootstraperHost, ocrPeeringData.Port), + nodeEthAddress, + chainID, + ocr2KeyBundleID, + ), + } +} diff --git a/system-tests/lib/cre/don/jobs/jd.go b/system-tests/lib/cre/don/jobs/jd.go new file mode 100644 index 00000000000..d68d1aa6305 --- /dev/null +++ b/system-tests/lib/cre/don/jobs/jd.go @@ -0,0 +1,52 @@ +package jobs + +import ( + "context" + + "github.com/pkg/errors" + "google.golang.org/grpc/credentials/insecure" + + "github.com/smartcontractkit/chainlink-testing-framework/framework/components/jd" + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/environment/devenv" + + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/don/node" + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/types" +) + +const ( + E2eJobDistributorImageEnvVarName = "E2E_JD_IMAGE" + E2eJobDistributorVersionEnvVarName = "E2E_JD_VERSION" +) + +func ReinitialiseJDClients(ctfEnv *deployment.Environment, jdOutput *jd.Output, nodeOutputs ...*types.WrappedNodeOutput) (*deployment.Environment, error) { + offchainClients := make([]deployment.OffchainClient, len(nodeOutputs)) + + for i, nodeOutput := range nodeOutputs { + nodeInfo, err := node.GetNodeInfo(nodeOutput.Output, nodeOutput.NodeSetName, 1) + if err != nil { + return nil, errors.Wrap(err, "failed to get node info") + } + + jdConfig := devenv.JDConfig{ + GRPC: jdOutput.HostGRPCUrl, + WSRPC: jdOutput.DockerWSRPCUrl, + Creds: insecure.NewCredentials(), + NodeInfo: nodeInfo, + } + + offChain, err := devenv.NewJDClient(context.Background(), jdConfig) + if err != nil { + return nil, errors.Wrap(err, "failed to create JD client") + } + + offchainClients[i] = offChain + } + + // we don't really care, which instance we set here, since there's only one + // what's important is that we create a new JD client for each DON, because + // that authenticates JD with each node + ctfEnv.Offchain = offchainClients[0] + + return ctfEnv, nil +} diff --git a/system-tests/lib/cre/don/jobs/jobs.go b/system-tests/lib/cre/don/jobs/jobs.go new file mode 100644 index 00000000000..132d0e146f9 --- /dev/null +++ b/system-tests/lib/cre/don/jobs/jobs.go @@ -0,0 +1,71 @@ +package jobs + +import ( + "context" + "sync" + + "github.com/pkg/errors" + + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/environment/devenv" + + jobv1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/job" + + keystoneflags "github.com/smartcontractkit/chainlink/system-tests/lib/cre/flags" + types "github.com/smartcontractkit/chainlink/system-tests/lib/cre/types" +) + +var SupportedJobs = []types.JobDescription{ + {Flag: types.OCR3Capability, NodeType: types.BootstrapNode}, + {Flag: types.WorkflowDON, NodeType: types.BootstrapNode}, + {Flag: types.CustomComputeCapability, NodeType: types.BootstrapNode}, + {Flag: types.CronCapability, NodeType: types.WorkerNode}, + {Flag: types.CustomComputeCapability, NodeType: types.WorkerNode}, + {Flag: types.OCR3Capability, NodeType: types.WorkerNode}, +} + +func Create(offChainClient deployment.OffchainClient, don *devenv.DON, flags []string, jobSpecs types.DonJobs) error { + errCh := make(chan error, calculateJobCount(jobSpecs)) + + var wg sync.WaitGroup + + for _, jobDesc := range SupportedJobs { + if keystoneflags.HasFlag(flags, jobDesc.Flag) { + if jobReqs, ok := jobSpecs[jobDesc]; ok { + for _, jobReq := range jobReqs { + wg.Add(1) + go func(jobReq *jobv1.ProposeJobRequest) { + defer wg.Done() + _, err := offChainClient.ProposeJob(context.Background(), jobReq) + if err != nil { + errCh <- errors.Wrapf(err, "failed to propose job for node %s", jobReq.NodeId) + } + }(jobReq) + } + } + } + } + + wg.Wait() + close(errCh) + + var finalErr error + for err := range errCh { + finalErr = errors.Wrap(finalErr, err.Error()) + } + + if finalErr != nil { + return errors.Wrap(finalErr, "failed to create at least one job for DON") + } + + return nil +} + +func calculateJobCount(jobSpecs types.DonJobs) int { + count := 0 + for _, jobSpec := range jobSpecs { + count += len(jobSpec) + } + + return count +} diff --git a/system-tests/lib/cre/don/jobs/por/por.go b/system-tests/lib/cre/don/jobs/por/por.go new file mode 100644 index 00000000000..44ef67a91cf --- /dev/null +++ b/system-tests/lib/cre/don/jobs/por/por.go @@ -0,0 +1,125 @@ +package por + +import ( + "strconv" + + "github.com/ethereum/go-ethereum/common" + "github.com/pkg/errors" + + "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/ptr" + + jobv1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/job" + "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/shared/ptypes" + + libc "github.com/smartcontractkit/chainlink/system-tests/lib/conversions" + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/don/jobs" + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/don/node" + keystoneflags "github.com/smartcontractkit/chainlink/system-tests/lib/cre/flags" + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/types" +) + +// If we wanted to by fancy we could also accept map[JobDescription]string that would get us the job spec +// if there's no job spec for the given JobDescription we would use the standard one, that could be easier +// than having to define the job spec for each JobDescription manually, in case someone wants to change one parameter +func GenerateJobSpecs(input types.GeneratePoRJobSpecsInput) (types.DonJobs, error) { + if err := input.Validate(); err != nil { + return nil, errors.Wrap(err, "input validation failed") + } + jobSpecs := make(types.DonJobs) + + chainIDInt, err := strconv.Atoi(input.BlockchainOutput.ChainID) + if err != nil { + return nil, errors.Wrap(err, "failed to convert chain ID to int") + } + chainIDUint64 := libc.MustSafeUint64(int64(chainIDInt)) + + bootstrapNode, err := node.FindOneWithLabel(input.Don, &ptypes.Label{Key: node.RoleLabelKey, Value: ptr.Ptr(types.BootstrapNode)}) + if err != nil { + return nil, errors.Wrap(err, "failed to find bootstrap node") + } + + donBootstrapNodePeerID, err := node.ToP2PID(*bootstrapNode, node.KeyExtractingTransformFn) + if err != nil { + return nil, errors.Wrap(err, "failed to get bootstrap node peer ID") + } + + var donBootstrapNodeHost string + for _, label := range bootstrapNode.Labels() { + if label.Key == node.HostLabelKey { + donBootstrapNodeHost = *label.Value + break + } + } + + if donBootstrapNodeHost == "" { + return nil, errors.New("failed to get bootstrap node host from labels") + } + + // configuration of bootstrap node + if keystoneflags.HasFlag(input.Flags, types.OCR3Capability) { + jobSpecs[types.JobDescription{Flag: types.OCR3Capability, NodeType: types.BootstrapNode}] = []*jobv1.ProposeJobRequest{jobs.BootstrapOCR3(bootstrapNode.NodeID, input.OCR3CapabilityAddress, chainIDUint64)} + } + + // if it's a workflow DON or it has custom compute capability, we need to create a gateway job + if keystoneflags.HasFlag(input.Flags, types.WorkflowDON) || keystoneflags.HasFlag(input.Flags, types.CustomComputeCapability) { + jobSpecs[types.JobDescription{Flag: types.WorkflowDON, NodeType: types.BootstrapNode}] = []*jobv1.ProposeJobRequest{jobs.BootstrapGateway(input.Don, chainIDUint64, input.DonID, input.ExtraAllowedPorts, input.ExtraAllowedIPs, input.GatewayConnectorOutput)} + } + + ocrPeeringData := types.OCRPeeringData{ + OCRBootstraperPeerID: donBootstrapNodePeerID, + OCRBootstraperHost: donBootstrapNodeHost, + Port: 5001, + } + + workflowNodeSet, err := node.FindManyWithLabel(input.Don, &ptypes.Label{Key: node.RoleLabelKey, Value: ptr.Ptr(types.WorkerNode)}) + if err != nil { + return nil, errors.Wrap(err, "failed to find worker nodes") + } + + // configuration of worker nodes + for _, node := range workflowNodeSet { + if keystoneflags.HasFlag(input.Flags, types.CronCapability) { + jobSpec := jobs.WorkerStandardCapability(node.NodeID, "cron-capabilities", jobs.ExternalCapabilityPath(input.CronCapBinName), jobs.EmptyStdCapConfig) + jobDesc := types.JobDescription{Flag: types.CronCapability, NodeType: types.WorkerNode} + + if _, ok := jobSpecs[jobDesc]; !ok { + jobSpecs[jobDesc] = []*jobv1.ProposeJobRequest{jobSpec} + } else { + jobSpecs[jobDesc] = append(jobSpecs[jobDesc], jobSpec) + } + } + + if keystoneflags.HasFlag(input.Flags, types.CustomComputeCapability) { + config := `""" + NumWorkers = 3 + [rateLimiter] + globalRPS = 20.0 + globalBurst = 30 + perSenderRPS = 1.0 + perSenderBurst = 5 + """` + + jobSpec := jobs.WorkerStandardCapability(node.NodeID, "custom-compute", "__builtin_custom-compute-action", config) + jobDesc := types.JobDescription{Flag: types.CustomComputeCapability, NodeType: types.WorkerNode} + + if _, ok := jobSpecs[jobDesc]; !ok { + jobSpecs[jobDesc] = []*jobv1.ProposeJobRequest{jobSpec} + } else { + jobSpecs[jobDesc] = append(jobSpecs[jobDesc], jobSpec) + } + } + + if keystoneflags.HasFlag(input.Flags, types.OCR3Capability) { + jobSpec := jobs.WorkerOCR3(node.NodeID, input.OCR3CapabilityAddress, common.HexToAddress(node.AccountAddr[chainIDUint64]), node.Ocr2KeyBundleID, ocrPeeringData, chainIDUint64) + jobDesc := types.JobDescription{Flag: types.OCR3Capability, NodeType: types.WorkerNode} + + if _, ok := jobSpecs[jobDesc]; !ok { + jobSpecs[jobDesc] = []*jobv1.ProposeJobRequest{jobSpec} + } else { + jobSpecs[jobDesc] = append(jobSpecs[jobDesc], jobSpec) + } + } + } + + return jobSpecs, nil +} diff --git a/system-tests/lib/cre/don/node/node.go b/system-tests/lib/cre/don/node/node.go new file mode 100644 index 00000000000..70f1c2be72c --- /dev/null +++ b/system-tests/lib/cre/don/node/node.go @@ -0,0 +1,144 @@ +package node + +import ( + "errors" + "fmt" + "net/url" + "strconv" + "strings" + + "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/shared/ptypes" + "github.com/smartcontractkit/chainlink/deployment/environment/devenv" + "github.com/smartcontractkit/chainlink/deployment/environment/nodeclient" + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/types" + + ns "github.com/smartcontractkit/chainlink-testing-framework/framework/components/simple_node_set" +) + +type stringTransformer func(string) string + +func NoOpTransformFn(value string) string { + return value +} + +func KeyExtractingTransformFn(value string) string { + parts := strings.Split(value, "_") + if len(parts) > 1 { + return parts[len(parts)-1] + } + return value +} + +func ToP2PID(node devenv.Node, transformFn stringTransformer) (string, error) { + for _, label := range node.Labels() { + if label.Key == devenv.NodeLabelP2PIDType { + if label.Value == nil { + return "", fmt.Errorf("p2p label value is nil for node %s", node.Name) + } + return transformFn(*label.Value), nil + } + } + + return "", fmt.Errorf("p2p label not found for node %s", node.Name) +} + +const ( + RoleLabelKey = "role" + HostLabelKey = "host" + NodeIndexKey = "node_index" +) + +// copied from Bala's unmerged PR: https://github.com/smartcontractkit/chainlink/pull/15751 +// TODO: remove this once the PR is merged and import his function +// IMPORTANT ADDITION: prefix to differentiate between the different DONs +func GetNodeInfo(nodeOut *ns.Output, prefix string, bootstrapNodeCount int) ([]devenv.NodeInfo, error) { + var nodeInfo []devenv.NodeInfo + for i := 1; i <= len(nodeOut.CLNodes); i++ { + p2pURL, err := url.Parse(nodeOut.CLNodes[i-1].Node.DockerP2PUrl) + if err != nil { + return nil, fmt.Errorf("failed to parse p2p url: %w", err) + } + if i <= bootstrapNodeCount { + nodeInfo = append(nodeInfo, devenv.NodeInfo{ + IsBootstrap: true, + Name: fmt.Sprintf("%s_bootstrap-%d", prefix, i), + P2PPort: p2pURL.Port(), + CLConfig: nodeclient.ChainlinkConfig{ + URL: nodeOut.CLNodes[i-1].Node.HostURL, + Email: nodeOut.CLNodes[i-1].Node.APIAuthUser, + Password: nodeOut.CLNodes[i-1].Node.APIAuthPassword, + InternalIP: nodeOut.CLNodes[i-1].Node.InternalIP, + }, + Labels: map[string]string{ + HostLabelKey: nodeOut.CLNodes[i-1].Node.ContainerName, + NodeIndexKey: strconv.Itoa(i - 1), + RoleLabelKey: types.BootstrapNode, + }, + }) + } else { + nodeInfo = append(nodeInfo, devenv.NodeInfo{ + IsBootstrap: false, + Name: fmt.Sprintf("%s_node-%d", prefix, i), + P2PPort: p2pURL.Port(), + CLConfig: nodeclient.ChainlinkConfig{ + URL: nodeOut.CLNodes[i-1].Node.HostURL, + Email: nodeOut.CLNodes[i-1].Node.APIAuthUser, + Password: nodeOut.CLNodes[i-1].Node.APIAuthPassword, + InternalIP: nodeOut.CLNodes[i-1].Node.InternalIP, + }, + Labels: map[string]string{ + HostLabelKey: nodeOut.CLNodes[i-1].Node.ContainerName, + NodeIndexKey: strconv.Itoa(i - 1), + RoleLabelKey: types.WorkerNode, + }, + }) + } + } + return nodeInfo, nil +} + +func FindOneWithLabel(nodes *devenv.DON, wantedLabel *ptypes.Label) (*devenv.Node, error) { + if wantedLabel == nil { + return nil, errors.New("label is nil") + } + for _, node := range nodes.Nodes { + for _, label := range node.Labels() { + if wantedLabel.Key == label.Key && equalLabels(wantedLabel.Value, label.Value) { + return &node, nil + } + } + } + return nil, fmt.Errorf("node with label %s=%s not found", wantedLabel.Key, *wantedLabel.Value) +} + +func FindManyWithLabel(nodes *devenv.DON, wantedLabel *ptypes.Label) ([]*devenv.Node, error) { + if wantedLabel == nil { + return nil, errors.New("label is nil") + } + + var foundNodes []*devenv.Node + + for _, node := range nodes.Nodes { + for _, label := range node.Labels() { + if wantedLabel.Key == label.Key && equalLabels(wantedLabel.Value, label.Value) { + foundNodes = append(foundNodes, &node) + } + } + } + + if len(foundNodes) == 0 { + return nil, fmt.Errorf("node with label %s=%s not found", wantedLabel.Key, *wantedLabel.Value) + } + + return foundNodes, nil +} + +func equalLabels(first, second *string) bool { + if first == nil && second == nil { + return true + } + if first == nil || second == nil { + return false + } + return *first == *second +} diff --git a/system-tests/lib/cre/don/peering.go b/system-tests/lib/cre/don/peering.go new file mode 100644 index 00000000000..0cac7ce5d51 --- /dev/null +++ b/system-tests/lib/cre/don/peering.go @@ -0,0 +1,82 @@ +package don + +import ( + "github.com/pkg/errors" + + "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/shared/ptypes" + "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/ptr" + "github.com/smartcontractkit/chainlink/deployment/environment/devenv" + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/don/node" + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/flags" + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/types" +) + +func globalBootstraperNodeData(donTopologies []*types.DonWithMetadata) (string, string, error) { + var findHost = func(n devenv.Node) string { + for _, label := range n.Labels() { + if label.Key == node.HostLabelKey { + return *label.Value + } + } + return "" + } + + if len(donTopologies) == 1 { + bootstrapNode, err := node.FindOneWithLabel(donTopologies[0].DON, &ptypes.Label{Key: node.RoleLabelKey, Value: ptr.Ptr(types.BootstrapNode)}) + if err != nil { + return "", "", errors.Wrap(err, "failed to find bootstrap node") + } + + // if there is only one DON, then the global bootstrapper is the bootstrap node of the DON + peerID, err := node.ToP2PID(*bootstrapNode, node.KeyExtractingTransformFn) + if err != nil { + return "", "", errors.Wrapf(err, "failed to get peer ID for node %s", donTopologies[0].DON.Nodes[0].Name) + } + + bootstrapNodeHost := findHost(*bootstrapNode) + if bootstrapNodeHost == "" { + return "", "", errors.New("failed to get bootstrap node host from labels") + } + + return peerID, bootstrapNodeHost, nil + } else if len(donTopologies) > 1 { + // if there's more than one DON, then peering capabilitity needs to point to the same bootstrap node + // for all the DONs, and so we need to find it first. For us, it will always be the bootstrap node of the workflow DON. + for _, donTopology := range donTopologies { + if flags.HasFlag(donTopology.Flags, types.WorkflowDON) { + bootstrapNode, err := node.FindOneWithLabel(donTopology.DON, &ptypes.Label{Key: node.RoleLabelKey, Value: ptr.Ptr(types.BootstrapNode)}) + if err != nil { + return "", "", errors.Wrap(err, "failed to find bootstrap node") + } + + peerID, err := node.ToP2PID(*bootstrapNode, node.KeyExtractingTransformFn) + if err != nil { + return "", "", errors.Wrapf(err, "failed to get peer ID for node %s", bootstrapNode.Name) + } + + bootstrapNodeHost := findHost(*bootstrapNode) + if bootstrapNodeHost == "" { + return "", "", errors.New("failed to get bootstrap node host from labels") + } + + return peerID, bootstrapNodeHost, nil + } + } + + return "", "", errors.New("expected at least one workflow DON") + } + + return "", "", errors.New("expected at least one DON topology") +} + +func FindPeeringData(donTopologies []*types.DonWithMetadata) (types.PeeringData, error) { + globalBootstraperPeerID, globalBootstraperHost, err := globalBootstraperNodeData(donTopologies) + if err != nil { + return types.PeeringData{}, err + } + + return types.PeeringData{ + GlobalBootstraperPeerID: globalBootstraperPeerID, + GlobalBootstraperHost: globalBootstraperHost, + }, nil +} diff --git a/system-tests/lib/cre/environment/environment.go b/system-tests/lib/cre/environment/environment.go new file mode 100644 index 00000000000..83f1194860d --- /dev/null +++ b/system-tests/lib/cre/environment/environment.go @@ -0,0 +1,101 @@ +package environment + +import ( + "context" + "strings" + + "github.com/pkg/errors" + "google.golang.org/grpc/credentials/insecure" + + "github.com/smartcontractkit/chainlink-testing-framework/framework/components/jd" + "github.com/smartcontractkit/chainlink-testing-framework/seth" + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/environment/devenv" + "github.com/smartcontractkit/chainlink/v2/core/logger" + + "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" + libdon "github.com/smartcontractkit/chainlink/system-tests/lib/cre/don" + libnode "github.com/smartcontractkit/chainlink/system-tests/lib/cre/don/node" + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/types" +) + +func BuildTopologyAndCLDEnvironment(lgr logger.Logger, nodeSetInput []*types.CapabilitiesAwareNodeSet, jdOutput *jd.Output, nodeSetOutput []*types.WrappedNodeOutput, blockchainOutput *blockchain.Output, sethClient *seth.Client) (*deployment.Environment, *types.DonTopology, error) { + env, dons, err := buildChainlinkDeploymentEnv(lgr, jdOutput, nodeSetOutput, blockchainOutput, sethClient) + if err != nil { + return nil, nil, errors.Wrap(err, "failed to build chainlink deployment environment") + } + donTopology, err := libdon.BuildDONTopology(dons, nodeSetInput, nodeSetOutput) + if err != nil { + return nil, nil, errors.Wrap(err, "failed to build DON topology") + } + + return env, donTopology, nil +} + +func buildChainlinkDeploymentEnv(lgr logger.Logger, jdOutput *jd.Output, nodeSetOutput []*types.WrappedNodeOutput, blockchainOutput *blockchain.Output, sethClient *seth.Client) (*deployment.Environment, []*devenv.DON, error) { + envs := make([]*deployment.Environment, len(nodeSetOutput)) + dons := make([]*devenv.DON, len(nodeSetOutput)) + + for i, nodeOutput := range nodeSetOutput { + // assume that each nodeset has only one bootstrap node + nodeInfo, err := libnode.GetNodeInfo(nodeOutput.Output, nodeOutput.NodeSetName, 1) + if err != nil { + return nil, nil, errors.Wrap(err, "failed to get node info") + } + + jdConfig := devenv.JDConfig{ + GRPC: jdOutput.HostGRPCUrl, + WSRPC: jdOutput.DockerWSRPCUrl, + Creds: insecure.NewCredentials(), + NodeInfo: nodeInfo, + } + + devenvConfig := devenv.EnvironmentConfig{ + JDConfig: jdConfig, + Chains: []devenv.ChainConfig{ + { + ChainID: sethClient.Cfg.Network.ChainID, + ChainName: sethClient.Cfg.Network.Name, + ChainType: strings.ToUpper(blockchainOutput.Family), + WSRPCs: []devenv.CribRPCs{{ + External: blockchainOutput.Nodes[0].HostWSUrl, + Internal: blockchainOutput.Nodes[0].DockerInternalWSUrl, + }}, + HTTPRPCs: []devenv.CribRPCs{{ + External: blockchainOutput.Nodes[0].HostHTTPUrl, + Internal: blockchainOutput.Nodes[0].DockerInternalHTTPUrl, + }}, + DeployerKey: sethClient.NewTXOpts(seth.WithNonce(nil)), // set nonce to nil, so that it will be fetched from the chain + }, + }, + } + + env, don, err := devenv.NewEnvironment(context.Background, lgr, devenvConfig) + if err != nil { + return nil, nil, errors.Wrap(err, "failed to create environment") + } + + envs[i] = env + dons[i] = don + } + + var nodeIDs []string + for _, env := range envs { + nodeIDs = append(nodeIDs, env.NodeIDs...) + } + + // we assume that all DONs run on the same chain and that there's only one chain + // also, we don't care which instance of offchain client we use, because we have + // only one instance of offchain client and we have just configured it to work + // with nodes from all DONs + return &deployment.Environment{ + Name: envs[0].Name, + Logger: envs[0].Logger, + ExistingAddresses: envs[0].ExistingAddresses, + Chains: envs[0].Chains, + Offchain: envs[0].Offchain, + OCRSecrets: envs[0].OCRSecrets, + GetContext: envs[0].GetContext, + NodeIDs: nodeIDs, + }, dons, nil +} diff --git a/system-tests/lib/cre/flags/flags.go b/system-tests/lib/cre/flags/flags.go new file mode 100644 index 00000000000..5bedcb8fd95 --- /dev/null +++ b/system-tests/lib/cre/flags/flags.go @@ -0,0 +1,45 @@ +package flags + +import ( + "slices" + + "github.com/pkg/errors" + + "github.com/smartcontractkit/chainlink/system-tests/lib/cre/types" +) + +func DONTopologyWithFlag(donTopologies []*types.DonWithMetadata, flag string) []*types.DonWithMetadata { + var result []*types.DonWithMetadata + + for _, donTopology := range donTopologies { + if HasFlag(donTopology.Flags, flag) { + result = append(result, donTopology) + } + } + + return result +} + +func HasFlag(values []string, flag string) bool { + return slices.Contains(values, flag) +} + +func OneDONTopologyWithFlag(donTopologies []*types.DonWithMetadata, flag string) (*types.DonWithMetadata, error) { + donTopologies = DONTopologyWithFlag(donTopologies, flag) + if len(donTopologies) != 1 { + return nil, errors.Errorf("expected exactly one DON topology with flag %s, got %d", flag, len(donTopologies)) + } + + return donTopologies[0], nil +} + +func NodeSetFlags(nodeSet *types.CapabilitiesAwareNodeSet) ([]string, error) { + var stringCaps []string + if len(nodeSet.Capabilities) == 0 && nodeSet.DONType == "" { + // if no flags are set, we assign all known capabilities to the DON + return types.SingleDonFlags, nil + } + + stringCaps = append(stringCaps, append(nodeSet.Capabilities, nodeSet.DONType)...) + return stringCaps, nil +} diff --git a/system-tests/lib/cre/types/flags.go b/system-tests/lib/cre/types/flags.go new file mode 100644 index 00000000000..63e6de7d2bd --- /dev/null +++ b/system-tests/lib/cre/types/flags.go @@ -0,0 +1,24 @@ +package types + +type CapabilityFlag = string + +// DON types +const ( + WorkflowDON CapabilityFlag = "workflow" + CapabilitiesDON CapabilityFlag = "capabilities" +) + +// Capabilities +const ( + OCR3Capability CapabilityFlag = "ocr3" + CronCapability CapabilityFlag = "cron" + CustomComputeCapability CapabilityFlag = "custom-compute" + WriteEVMCapability CapabilityFlag = "write-evm" + + // Add more capabilities as needed +) + +var ( + // Add new capabilities here as well, if single DON should have them by default + SingleDonFlags = []string{"workflow", "capabilities", "ocr3", "cron", "custom-compute", "write-evm"} +) diff --git a/system-tests/lib/cre/types/keystone.go b/system-tests/lib/cre/types/keystone.go new file mode 100644 index 00000000000..6ca3929d58f --- /dev/null +++ b/system-tests/lib/cre/types/keystone.go @@ -0,0 +1,377 @@ +package types + +import ( + "errors" + + "github.com/ethereum/go-ethereum/common" + + jobv1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/job" + "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" + "github.com/smartcontractkit/chainlink-testing-framework/framework/components/jd" + ns "github.com/smartcontractkit/chainlink-testing-framework/framework/components/simple_node_set" + "github.com/smartcontractkit/chainlink-testing-framework/seth" + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/environment/devenv" +) + +type NodeType = string + +const ( + BootstrapNode NodeType = "bootstrap" + WorkerNode NodeType = "worker" +) + +type JobDescription struct { + Flag CapabilityFlag + NodeType string +} + +type ConfigDescription struct { + Flag CapabilityFlag + NodeType string +} + +type DonJobs = map[JobDescription][]*jobv1.ProposeJobRequest +type DonsToJobSpecs = map[uint32]DonJobs + +type NodeIndexToConfigOverrides = map[int]string +type DonsToConfigOverrides = map[uint32]NodeIndexToConfigOverrides + +type KeystoneContractsInput struct { + ChainSelector uint64 `toml:"-"` + CldEnv *deployment.Environment `toml:"-"` + Out *KeystoneContractOutput `toml:"out"` +} + +func (k *KeystoneContractsInput) Validate() error { + if k.ChainSelector == 0 { + return errors.New("chain selector not set") + } + if k.CldEnv == nil { + return errors.New("chainlink deployment env not set") + } + return nil +} + +type KeystoneContractOutput struct { + UseCache bool `toml:"use_cache"` + CapabilitiesRegistryAddress common.Address `toml:"capabilities_registry_address"` + ForwarderAddress common.Address `toml:"forwarder_address"` + OCR3CapabilityAddress common.Address `toml:"ocr3_capability_address"` + WorkflowRegistryAddress common.Address `toml:"workflow_registry_address"` +} + +type WorkflowRegistryInput struct { + ChainSelector uint64 `toml:"-"` + CldEnv *deployment.Environment `toml:"-"` + AllowedDonIDs []uint32 `toml:"-"` + WorkflowOwners []common.Address `toml:"-"` + Out *WorkflowRegistryOutput `toml:"out"` +} + +func (w *WorkflowRegistryInput) Validate() error { + if w.ChainSelector == 0 { + return errors.New("chain selector not set") + } + if w.CldEnv == nil { + return errors.New("chainlink deployment env not set") + } + if len(w.AllowedDonIDs) == 0 { + return errors.New("allowed don ids not set") + } + if len(w.WorkflowOwners) == 0 { + return errors.New("workflow owners not set") + } + + return nil +} + +type WorkflowRegistryOutput struct { + UseCache bool `toml:"use_cache"` + ChainSelector uint64 `toml:"chain_selector"` + AllowedDonIDs []uint32 `toml:"allowed_don_ids"` + WorkflowOwners []common.Address `toml:"workflow_owners"` +} + +type DeployFeedConsumerInput struct { + ChainSelector uint64 `toml:"-"` + CldEnv *deployment.Environment `toml:"-"` + Out *DeployFeedConsumerOutput `toml:"out"` +} + +func (i *DeployFeedConsumerInput) Validate() error { + if i.ChainSelector == 0 { + return errors.New("chain selector not set") + } + if i.CldEnv == nil { + return errors.New("chainlink deployment env not set") + } + return nil +} + +type DeployFeedConsumerOutput struct { + UseCache bool `toml:"use_cache"` + FeedConsumerAddress common.Address `toml:"feed_consumer_address"` +} + +type ConfigureFeedConsumerInput struct { + SethClient *seth.Client `toml:"-"` + FeedConsumerAddress common.Address `toml:"-"` + AllowedSenders []common.Address `toml:"-"` + AllowedWorkflowOwners []common.Address `toml:"-"` + AllowedWorkflowNames []string `toml:"-"` + Out *ConfigureFeedConsumerOutput `toml:"out"` +} + +func (c *ConfigureFeedConsumerInput) Validate() error { + if c.SethClient == nil { + return errors.New("seth client not set") + } + if c.FeedConsumerAddress == (common.Address{}) { + return errors.New("feed consumer address not set") + } + if len(c.AllowedSenders) == 0 { + return errors.New("allowed senders not set") + } + if len(c.AllowedWorkflowOwners) == 0 { + return errors.New("allowed workflow owners not set") + } + if len(c.AllowedWorkflowNames) == 0 { + return errors.New("allowed workflow names not set") + } + + return nil +} + +type ConfigureFeedConsumerOutput struct { + UseCache bool `toml:"use_cache"` + FeedConsumerAddress common.Address `toml:"feed_consumer_address"` + AllowedSenders []common.Address `toml:"allowed_senders"` + AllowedWorkflowOwners []common.Address `toml:"allowed_workflow_owners"` + AllowedWorkflowNames []string `toml:"allowed_workflow_names"` +} + +type WrappedNodeOutput struct { + *ns.Output + NodeSetName string + Capabilities []string +} + +type ConfigureDonInput struct { + CldEnv *deployment.Environment + BlockchainOutput *blockchain.Output + DonTopology *DonTopology + JdOutput *jd.Output + DonToJobSpecs DonsToJobSpecs + DonToConfigOverrides DonsToConfigOverrides +} + +func (c *ConfigureDonInput) Validate() error { + if c.CldEnv == nil { + return errors.New("chainlink deployment env not set") + } + if c.BlockchainOutput == nil { + return errors.New("blockchain output not set") + } + if c.DonTopology == nil { + return errors.New("don topology not set") + } + if len(c.DonTopology.MetaDons) == 0 { + return errors.New("meta dons not set") + } + if c.JdOutput == nil { + return errors.New("jd output not set") + } + if len(c.DonToJobSpecs) == 0 { + return errors.New("don to job specs not set") + } + if len(c.DonToConfigOverrides) == 0 { + return errors.New("don to config overrides not set") + } + + return nil +} + +type ConfigureDonOutput struct { + JdOutput *deployment.OffchainClient +} + +type DebugInput struct { + DonTopology *DonTopology + BlockchainOutput *blockchain.Output +} + +func (d *DebugInput) Validate() error { + if d.DonTopology == nil { + return errors.New("don topology not set") + } + if len(d.DonTopology.MetaDons) == 0 { + return errors.New("meta dons not set") + } + if d.BlockchainOutput == nil { + return errors.New("blockchain output not set") + } + + return nil +} + +type ConfigureKeystoneInput struct { + ChainSelector uint64 + DonTopology *DonTopology + CldEnv *deployment.Environment +} + +func (c *ConfigureKeystoneInput) Validate() error { + if c.ChainSelector == 0 { + return errors.New("chain selector not set") + } + if c.DonTopology == nil { + return errors.New("don topology not set") + } + if len(c.DonTopology.MetaDons) == 0 { + return errors.New("meta dons not set") + } + if c.CldEnv == nil { + return errors.New("chainlink deployment env not set") + } + + return nil +} + +type GatewayConnectorOutput struct { + Host string // do not set, it will be set dynamically + Path string + Port int +} + +type GeneratePoRJobSpecsInput struct { + CldEnv *deployment.Environment + Don *devenv.DON + NodeOutput *WrappedNodeOutput + BlockchainOutput *blockchain.Output + DonID uint32 + Flags []string + OCR3CapabilityAddress common.Address + ExtraAllowedPorts []int + ExtraAllowedIPs []string + CronCapBinName string + GatewayConnectorOutput GatewayConnectorOutput +} + +func (g *GeneratePoRJobSpecsInput) Validate() error { + if g.CldEnv == nil { + return errors.New("chainlink deployment env not set") + } + if g.Don == nil { + return errors.New("don not set") + } + if len(g.Don.Nodes) == 0 { + return errors.New("don nodes not set") + } + if g.NodeOutput == nil { + return errors.New("node output not set") + } + if g.BlockchainOutput == nil { + return errors.New("blockchain output not set") + } + if g.DonID == 0 { + return errors.New("don id not set") + } + if len(g.Flags) == 0 { + return errors.New("flags not set") + } + if g.OCR3CapabilityAddress == (common.Address{}) { + return errors.New("ocr3 capability address not set") + } + if g.CronCapBinName == "" { + return errors.New("cron cap bin name not set") + } + if g.GatewayConnectorOutput == (GatewayConnectorOutput{}) { + return errors.New("gateway connector output not set") + } + + return nil +} + +type GeneratePoRConfigsInput struct { + Don *devenv.DON + NodeInput *CapabilitiesAwareNodeSet + BlockchainOutput *blockchain.Output + DonID uint32 + Flags []string + PeeringData PeeringData + CapabilitiesRegistryAddress common.Address + WorkflowRegistryAddress common.Address + ForwarderAddress common.Address + GatewayConnectorOutput *GatewayConnectorOutput +} + +func (g *GeneratePoRConfigsInput) Validate() error { + if g.Don == nil { + return errors.New("don not set") + } + if len(g.Don.Nodes) == 0 { + return errors.New("don nodes not set") + } + if g.NodeInput == nil { + return errors.New("node input not set") + } + if g.BlockchainOutput == nil { + return errors.New("blockchain output not set") + } + if g.DonID == 0 { + return errors.New("don id not set") + } + if len(g.Flags) == 0 { + return errors.New("flags not set") + } + if g.PeeringData == (PeeringData{}) { + return errors.New("peering data not set") + } + if g.CapabilitiesRegistryAddress == (common.Address{}) { + return errors.New("capabilities registry address not set") + } + if g.WorkflowRegistryAddress == (common.Address{}) { + return errors.New("workflow registry address not set") + } + if g.ForwarderAddress == (common.Address{}) { + return errors.New("forwarder address not set") + } + if g.GatewayConnectorOutput == nil { + return errors.New("gateway connector output not set") + } + + return nil +} + +// DonWithMetadata is a struct that holds the DON references and various metadata +type DonWithMetadata struct { + DON *devenv.DON + NodeInput *CapabilitiesAwareNodeSet + NodeOutput *WrappedNodeOutput + ID uint32 + Flags []string +} + +type DonTopology struct { + WorkflowDONID uint32 + MetaDons []*DonWithMetadata +} + +type CapabilitiesAwareNodeSet struct { + *ns.Input + Capabilities []string `toml:"capabilities"` + DONType string `toml:"don_type"` +} + +type PeeringData struct { + GlobalBootstraperPeerID string + GlobalBootstraperHost string + Port int +} + +type OCRPeeringData struct { + OCRBootstraperPeerID string + OCRBootstraperHost string + Port int +} diff --git a/system-tests/lib/crecli/commands.go b/system-tests/lib/crecli/commands.go new file mode 100644 index 00000000000..2081b36f418 --- /dev/null +++ b/system-tests/lib/crecli/commands.go @@ -0,0 +1,70 @@ +package crecli + +import ( + "bytes" + "fmt" + "os" + "os/exec" + "regexp" + + "github.com/pkg/errors" +) + +type CompilationResult struct { + WorkflowURL string + ConfigURL string + SecretsURL string +} + +func CompileWorkflow(creCLICommandPath, workflowFolder string, configFile, settingsFile *os.File) (CompilationResult, error) { + var outputBuffer bytes.Buffer + + // the CLI expects the workflow code to be located in the same directory as its `go.mod`` file. That's why we assume that the file, which + // contains the entrypoint method is always named `main.go`. This is a limitation of the CLI, which we can't change. + compileCmd := exec.Command(creCLICommandPath, "workflow", "compile", "-S", settingsFile.Name(), "-c", configFile.Name(), "main.go") // #nosec G204 + compileCmd.Stdout = &outputBuffer + compileCmd.Stderr = &outputBuffer + compileCmd.Dir = workflowFolder + err := compileCmd.Start() + if err != nil { + return CompilationResult{}, errors.Wrap(err, "failed to start compile command") + } + + err = compileCmd.Wait() + fmt.Println("Compile output:\n", outputBuffer.String()) + if err != nil { + return CompilationResult{}, errors.Wrap(err, "failed to wait for compile command") + } + + re := regexp.MustCompile(`Gist URL=([^\s]+)`) + matches := re.FindAllStringSubmatch(outputBuffer.String(), -1) + if len(matches) < 2 { + return CompilationResult{}, errors.New("failed to find gist URLs in compile output") + } + + ansiEscapePattern := `\x1b\[[0-9;]*m` + re = regexp.MustCompile(ansiEscapePattern) + + workflowGistURL := re.ReplaceAllString(matches[0][1], "") + workflowConfigURL := re.ReplaceAllString(matches[1][1], "") + + if workflowGistURL == "" || workflowConfigURL == "" { + return CompilationResult{}, errors.New("failed to find gist URLs in compile output") + } + + return CompilationResult{ + WorkflowURL: workflowGistURL, + ConfigURL: workflowConfigURL, + }, nil +} + +func RegisterWorkflow(creCLICommandPath, workflowName, workflowURL, configURL string, settingsFile *os.File) error { + registerCmd := exec.Command(creCLICommandPath, "workflow", "register", workflowName, "-b", workflowURL, "-c", configURL, "-S", settingsFile.Name(), "-v") // #nosec G204 + registerCmd.Stdout = os.Stdout + registerCmd.Stderr = os.Stderr + if err := registerCmd.Start(); err != nil { + return errors.Wrap(err, "failed to start register command") + } + + return nil +} diff --git a/system-tests/lib/crecli/download.go b/system-tests/lib/crecli/download.go new file mode 100644 index 00000000000..84d2a43639c --- /dev/null +++ b/system-tests/lib/crecli/download.go @@ -0,0 +1,75 @@ +package crecli + +import ( + "fmt" + "os" + "os/exec" + "path/filepath" + "runtime" + + "github.com/pkg/errors" + + "github.com/smartcontractkit/chainlink-testing-framework/lib/client" +) + +func DownloadAndInstallChainlinkCLI(ghToken, version string) (string, error) { + system := runtime.GOOS + arch := runtime.GOARCH + + switch system { + case "darwin", "linux": + // nothing to do, we have the binaries + default: + return "", fmt.Errorf("chainlnk-cli does not support OS: %s", system) + } + + switch arch { + case "amd64", "arm64": + // nothing to do, we have the binaries + default: + return "", fmt.Errorf("chainlnk-cli does not support arch: %s", arch) + } + + creCLIAssetFile := fmt.Sprintf("cre_%s_%s_%s.tar.gz", version, system, arch) + + ghClient := client.NewGithubClient(ghToken) + content, err := ghClient.DownloadAssetFromRelease("smartcontractkit", "dev-platform", version, creCLIAssetFile) + if err != nil { + return "", errors.Wrapf(err, "failed to download CRE CLI asset %s", creCLIAssetFile) + } + + tmpfile, err := os.CreateTemp("", creCLIAssetFile) + if err != nil { + return "", errors.Wrapf(err, "failed to create temp file for CRE CLI asset %s", creCLIAssetFile) + } + defer tmpfile.Close() + + if _, err = tmpfile.Write(content); err != nil { + return "", errors.Wrapf(err, "failed to write content to temp file for CRE CLI asset %s", creCLIAssetFile) + } + + cmd := exec.Command("tar", "-xvf", tmpfile.Name(), "-C", ".") // #nosec G204 + if cmd.Run() != nil { + return "", errors.Wrapf(err, "failed to extract CRE CLI asset %s", creCLIAssetFile) + } + + extractedFileName := fmt.Sprintf("cre_%s_%s_%s", version, system, arch) + cmd = exec.Command("chmod", "+x", extractedFileName) + if cmd.Run() != nil { + return "", errors.Wrapf(err, "failed to make %s executable", extractedFileName) + } + + // set it to absolute path, because some commands (e.g. compile) need to be executed in the context + // of the workflow directory + extractedFile, err := os.Open(extractedFileName) + if err != nil { + return "", errors.Wrapf(err, "failed to open %s", extractedFileName) + } + + creCLICommandPath, err := filepath.Abs(extractedFile.Name()) + if err != nil { + return "", errors.Wrapf(err, "failed to get absolute path for %s", tmpfile.Name()) + } + + return creCLICommandPath, nil +} diff --git a/system-tests/lib/crecli/por/por.go b/system-tests/lib/crecli/por/por.go new file mode 100644 index 00000000000..0bc9f55854d --- /dev/null +++ b/system-tests/lib/crecli/por/por.go @@ -0,0 +1,50 @@ +package por + +import ( + "encoding/json" + "os" + "strings" + + "github.com/ethereum/go-ethereum/common" + "github.com/pkg/errors" + + libcrecli "github.com/smartcontractkit/chainlink/system-tests/lib/crecli" +) + +func CreateConfigFile(feedsConsumerAddress common.Address, feedID, dataURL string) (*os.File, error) { + configFile, err := os.CreateTemp("", "config.json") + if err != nil { + return nil, errors.Wrapf(err, "failed to create workflow config file") + } + + cleanFeedID := strings.TrimPrefix(feedID, "0x") + feedLength := len(cleanFeedID) + + if feedLength < 32 { + return nil, errors.Errorf("feed ID must be at least 32 characters long, but was %d", feedLength) + } + + if feedLength > 32 { + cleanFeedID = cleanFeedID[:32] + } + + feedIDToUse := "0x" + cleanFeedID + + workflowConfig := libcrecli.PoRWorkflowConfig{ + FeedID: feedIDToUse, + URL: dataURL, + ConsumerAddress: feedsConsumerAddress.Hex(), + } + + configMarshalled, err := json.Marshal(workflowConfig) + if err != nil { + return nil, errors.Wrap(err, "failed to marshal workflow config") + } + + _, err = configFile.Write(configMarshalled) + if err != nil { + return nil, errors.Wrap(err, "failed to write workflow config file") + } + + return configFile, nil +} diff --git a/system-tests/lib/crecli/settings.go b/system-tests/lib/crecli/settings.go new file mode 100644 index 00000000000..a05f65061f0 --- /dev/null +++ b/system-tests/lib/crecli/settings.go @@ -0,0 +1,115 @@ +package crecli + +import ( + "os" + + "github.com/ethereum/go-ethereum/common" + "github.com/pkg/errors" + "gopkg.in/yaml.v3" +) + +const ( + CRECLISettingsFileName = ".cre-cli-settings.yaml" +) + +type Settings struct { + DevPlatform DevPlatform `yaml:"dev-platform"` + UserWorkflow UserWorkflow `yaml:"user-workflow"` + Logging Logging `yaml:"logging"` + McmsConfig McmsConfig `yaml:"mcms-config"` + Contracts Contracts `yaml:"contracts"` + Rpcs []RPC `yaml:"rpcs"` +} + +type DevPlatform struct { + CapabilitiesRegistryAddress string `yaml:"capabilities-registry-contract-address"` + DonID uint32 `yaml:"don-id"` + WorkflowRegistryAddress string `yaml:"workflow-registry-contract-address"` +} + +type UserWorkflow struct { + WorkflowOwnerAddress string `yaml:"workflow-owner-address"` +} + +type Logging struct { + SethConfigPath string `yaml:"seth-config-path"` +} + +type McmsConfig struct { + ProposalsDirectory string `yaml:"proposals-directory"` +} + +type Contracts struct { + ContractRegistry []ContractRegistry `yaml:"registries"` +} + +type ContractRegistry struct { + Name string `yaml:"name"` + Address string `yaml:"address"` + ChainSelector uint64 `yaml:"chain-selector"` +} + +type RPC struct { + ChainSelector uint64 `yaml:"chain-selector"` + URL string `yaml:"url"` +} + +type PoRWorkflowConfig struct { + FeedID string `json:"feed_id"` + URL string `json:"url"` + ConsumerAddress string `json:"consumer_address"` +} + +func PrepareCRECLISettingsFile(workflowOwner, capRegAddr, workflowRegistryAddr common.Address, donID uint32, chainSelector uint64, rpcHTTPURL string) (*os.File, error) { + settingsFile, err := os.CreateTemp("", CRECLISettingsFileName) + if err != nil { + return nil, errors.Wrap(err, "failed to create CRE CLI settings file") + } + + settings := Settings{ + DevPlatform: DevPlatform{ + CapabilitiesRegistryAddress: capRegAddr.Hex(), + DonID: donID, + WorkflowRegistryAddress: workflowRegistryAddr.Hex(), + }, + UserWorkflow: UserWorkflow{ + WorkflowOwnerAddress: workflowOwner.Hex(), + }, + Logging: Logging{}, + McmsConfig: McmsConfig{ + ProposalsDirectory: "./", + }, + Contracts: Contracts{ + ContractRegistry: []ContractRegistry{ + { + Name: "CapabilitiesRegistry", + Address: capRegAddr.Hex(), + ChainSelector: chainSelector, + }, + { + Name: "WorkflowRegistry", + Address: workflowRegistryAddr.Hex(), + ChainSelector: chainSelector, + }, + }, + }, + Rpcs: []RPC{ + { + ChainSelector: chainSelector, + URL: rpcHTTPURL, + }, + }, + } + + settingsMarshalled, err := yaml.Marshal(settings) + if err != nil { + return nil, errors.Wrap(err, "failed to marshal CRE CLI settings") + } + + _, err = settingsFile.Write(settingsMarshalled) + if err != nil { + return nil, errors.Wrapf(err, "failed to write %s settings file", CRECLISettingsFileName) + } + + return settingsFile, nil +} diff --git a/system-tests/lib/funding/funding.go b/system-tests/lib/funding/funding.go new file mode 100644 index 00000000000..2882123c9fb --- /dev/null +++ b/system-tests/lib/funding/funding.go @@ -0,0 +1,173 @@ +package funding + +import ( + "context" + "crypto/ecdsa" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/pkg/errors" + "github.com/rs/zerolog" + + "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/conversions" + "github.com/smartcontractkit/chainlink-testing-framework/seth" + + libtypes "github.com/smartcontractkit/chainlink/system-tests/lib/types" +) + +func PrivateKeyToAddress(privateKey *ecdsa.PrivateKey) (common.Address, error) { + publicKey := privateKey.Public() + publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey) + if !ok { + return common.Address{}, errors.New("error casting public key to ECDSA") + } + return crypto.PubkeyToAddress(*publicKeyECDSA), nil +} + +func SendFunds(logger zerolog.Logger, client *seth.Client, payload libtypes.FundsToSend) (*types.Receipt, error) { + fromAddress, err := PrivateKeyToAddress(payload.PrivateKey) + if err != nil { + return nil, err + } + + ctx, cancel := context.WithTimeout(context.Background(), client.Cfg.Network.TxnTimeout.Duration()) + nonce, err := client.Client.PendingNonceAt(ctx, fromAddress) + defer cancel() + if err != nil { + return nil, err + } + + gasLimit, err := client.EstimateGasLimitForFundTransfer(fromAddress, payload.ToAddress, payload.Amount) + if err != nil { + transferGasFee := client.Cfg.Network.TransferGasFee + if transferGasFee < 0 { + return nil, fmt.Errorf("negative transfer gas fee: %d", transferGasFee) + } + gasLimit = uint64(transferGasFee) + } + + gasPrice := big.NewInt(0) + gasFeeCap := big.NewInt(0) + gasTipCap := big.NewInt(0) + + if payload.GasLimit != nil { + if *payload.GasLimit < 0 { + return nil, fmt.Errorf("negative gas limit: %d", *payload.GasLimit) + } + gasLimit = uint64(*payload.GasLimit) + } + + if client.Cfg.Network.EIP1559DynamicFees { + // if any of the dynamic fees are not set, we need to either estimate them or read them from config + if payload.GasFeeCap == nil || payload.GasTipCap == nil { + // estimation or config reading happens here + txOptions := client.NewTXOpts(seth.WithGasLimit(gasLimit)) + gasFeeCap = txOptions.GasFeeCap + gasTipCap = txOptions.GasTipCap + } + + // override with payload values if they are set + if payload.GasFeeCap != nil { + gasFeeCap = payload.GasFeeCap + } + + if payload.GasTipCap != nil { + gasTipCap = payload.GasTipCap + } + } else { + if payload.GasPrice == nil { + txOptions := client.NewTXOpts(seth.WithGasLimit(gasLimit)) + gasPrice = txOptions.GasPrice + } else { + gasPrice = payload.GasPrice + } + } + + var rawTx types.TxData + + if client.Cfg.Network.EIP1559DynamicFees { + rawTx = &types.DynamicFeeTx{ + Nonce: nonce, + To: &payload.ToAddress, + Value: payload.Amount, + Gas: gasLimit, + GasFeeCap: gasFeeCap, + GasTipCap: gasTipCap, + } + } else { + rawTx = &types.LegacyTx{ + Nonce: nonce, + To: &payload.ToAddress, + Value: payload.Amount, + Gas: gasLimit, + GasPrice: gasPrice, + } + } + + signedTx, err := types.SignNewTx(payload.PrivateKey, types.LatestSignerForChainID(big.NewInt(client.ChainID)), rawTx) + + if err != nil { + return nil, errors.Wrap(err, "failed to sign tx") + } + + txTimeout := client.Cfg.Network.TxnTimeout.Duration() + if payload.TxTimeout != nil { + txTimeout = *payload.TxTimeout + } + + logger.Debug(). + Str("From", fromAddress.Hex()). + Str("To", payload.ToAddress.Hex()). + Str("Amount (wei/ether)", fmt.Sprintf("%s/%s", payload.Amount, conversions.WeiToEther(payload.Amount).Text('f', -1))). + Uint64("Nonce", nonce). + Uint64("Gas Limit", gasLimit). + Str("Gas Price", gasPrice.String()). + Str("Gas Fee Cap", gasFeeCap.String()). + Str("Gas Tip Cap", gasTipCap.String()). + Bool("Dynamic fees", client.Cfg.Network.EIP1559DynamicFees). + Msg("About to send funds") + + ctx, cancel = context.WithTimeout(ctx, txTimeout) + defer cancel() + err = client.Client.SendTransaction(ctx, signedTx) + if err != nil { + return nil, errors.Wrap(err, "failed to send transaction") + } + + logger.Debug(). + Str("From", fromAddress.Hex()). + Str("To", payload.ToAddress.Hex()). + Str("TxHash", signedTx.Hash().String()). + Str("Amount (wei/ether)", fmt.Sprintf("%s/%s", payload.Amount, conversions.WeiToEther(payload.Amount).Text('f', -1))). + Uint64("Nonce", nonce). + Uint64("Gas Limit", gasLimit). + Str("Gas Price", gasPrice.String()). + Str("Gas Fee Cap", gasFeeCap.String()). + Str("Gas Tip Cap", gasTipCap.String()). + Bool("Dynamic fees", client.Cfg.Network.EIP1559DynamicFees). + Msg("Sent funds") + + receipt, receiptErr := client.WaitMined(ctx, logger, client.Client, signedTx) + if receiptErr != nil { + return nil, errors.Wrap(receiptErr, "failed to wait for transaction to be mined") + } + + if receipt.Status == 1 { + return receipt, nil + } + + tx, _, err := client.Client.TransactionByHash(ctx, signedTx.Hash()) + if err != nil { + return nil, errors.Wrap(err, "failed to get transaction by hash ") + } + + _, err = client.Decode(tx, receiptErr) + if err != nil { + return nil, err + } + + return receipt, nil +} diff --git a/system-tests/lib/go.mod b/system-tests/lib/go.mod new file mode 100644 index 00000000000..0ccfb4ac000 --- /dev/null +++ b/system-tests/lib/go.mod @@ -0,0 +1,472 @@ +module github.com/smartcontractkit/chainlink/system-tests/lib + +go 1.23.3 + +require ( + github.com/smartcontractkit/chainlink/deployment v0.0.0-20250206093113-4e72c05bdba6 + github.com/smartcontractkit/chainlink/v2 v2.19.0-ccip1.5.16-alpha.0.0.20250206093113-4e72c05bdba6 +) + +// Make sure we're working with the latest chainlink libs +replace github.com/smartcontractkit/chainlink/v2 => ../../ + +replace github.com/smartcontractkit/chainlink/deployment => ../../deployment + +require ( + github.com/ethereum/go-ethereum v1.15.0 + github.com/google/uuid v1.6.0 + github.com/pkg/errors v0.9.1 + github.com/rs/zerolog v1.33.0 + github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea + github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 + github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.4 + github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.23 + github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 + google.golang.org/grpc v1.67.1 + gopkg.in/yaml.v3 v3.0.1 +) + +require ( + cosmossdk.io/errors v1.0.1 // indirect + cosmossdk.io/math v1.3.0 // indirect + dario.cat/mergo v1.0.1 // indirect + filippo.io/edwards25519 v1.1.0 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/99designs/keyring v1.2.1 // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect + github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect + github.com/DataDog/zstd v1.5.2 // indirect + github.com/Khan/genqlient v0.7.0 // indirect + github.com/MakeNowJust/heredoc v1.0.0 // indirect + github.com/Masterminds/semver/v3 v3.3.0 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/NethermindEth/juno v0.3.1 // indirect + github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect + github.com/XSAM/otelsql v0.29.0 // indirect + github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 // indirect + github.com/andybalholm/brotli v1.1.1 // indirect + github.com/apache/arrow-go/v18 v18.0.0 // indirect + github.com/aptos-labs/aptos-go-sdk v1.5.0 // indirect + github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c // indirect + github.com/avast/retry-go v3.0.0+incompatible // indirect + github.com/avast/retry-go/v4 v4.6.0 // indirect + github.com/awalterschulze/gographviz v2.0.3+incompatible // indirect + github.com/aws/aws-sdk-go v1.54.19 // indirect + github.com/aws/aws-sdk-go-v2 v1.32.2 // indirect + github.com/aws/aws-sdk-go-v2/config v1.28.0 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.41 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.2 // indirect + github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.2 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.32.2 // indirect + github.com/aws/constructs-go/constructs/v10 v10.4.2 // indirect + github.com/aws/jsii-runtime-go v1.104.0 // indirect + github.com/aws/smithy-go v1.22.0 // indirect + github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 // indirect + github.com/bahlo/generic-list-go v0.2.0 // indirect + github.com/benbjohnson/clock v1.3.5 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect + github.com/bits-and-blooms/bitset v1.17.0 // indirect + github.com/blang/semver/v4 v4.0.0 // indirect + github.com/blendle/zapdriver v1.3.1 // indirect + github.com/block-vision/sui-go-sdk v1.0.6 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect + github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129 // indirect + github.com/buger/jsonparser v1.1.1 // indirect + github.com/bytecodealliance/wasmtime-go/v28 v28.0.0 // indirect + github.com/bytedance/sonic v1.12.3 // indirect + github.com/bytedance/sonic/loader v0.2.0 // indirect + github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5 // indirect + github.com/cenkalti/backoff v2.2.1+incompatible // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cespare/xxhash v1.1.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/chai2010/gettext-go v1.0.2 // indirect + github.com/chaos-mesh/chaos-mesh/api v0.0.0-20240821051457-da69c6d9617a // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v1.1.2 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/coder/websocket v1.8.12 // indirect + github.com/cometbft/cometbft v0.37.5 // indirect + github.com/cometbft/cometbft-db v0.8.0 // indirect + github.com/confio/ics23/go v0.9.0 // indirect + github.com/consensys/bavard v0.1.22 // indirect + github.com/consensys/gnark-crypto v0.14.0 // indirect + github.com/containerd/log v0.1.0 // indirect + github.com/containerd/platforms v0.2.1 // indirect + github.com/cosmos/btcutil v1.0.5 // indirect + github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect + github.com/cosmos/cosmos-sdk v0.47.11 // indirect + github.com/cosmos/go-bip39 v1.0.0 // indirect + github.com/cosmos/gogoproto v1.4.11 // indirect + github.com/cosmos/ledger-cosmos-go v0.12.4 // indirect + github.com/cpuguy83/dockercfg v0.3.2 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect + github.com/crate-crypto/go-kzg-4844 v1.1.0 // indirect + github.com/danieljoos/wincred v1.1.2 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/dgraph-io/badger/v2 v2.2007.4 // indirect + github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/docker v27.3.1+incompatible // indirect + github.com/docker/go-connections v0.5.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/dominikbraun/graph v0.23.0 // indirect + github.com/doyensec/safeurl v0.2.1 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/dvsekhvalnov/jose2go v1.7.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.1 // indirect + github.com/esote/minmaxheap v1.0.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.2.2 // indirect + github.com/evanphx/json-patch/v5 v5.9.0 // indirect + github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect + github.com/fatih/camelcase v1.0.0 // indirect + 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/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.8 // indirect + github.com/gagliardetto/binary v0.8.0 // indirect + github.com/gagliardetto/solana-go v1.12.0 // indirect + github.com/gagliardetto/treeout v0.1.4 // indirect + github.com/gagliardetto/utilz v0.1.1 // indirect + github.com/getsentry/sentry-go v0.27.0 // indirect + github.com/gin-contrib/sessions v0.0.5 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/gin-gonic/gin v1.10.0 // indirect + github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect + github.com/go-errors/errors v1.4.2 // indirect + github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 // indirect + github.com/go-kit/kit v0.12.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-ldap/ldap/v3 v3.4.6 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/swag 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.24.0 // indirect + github.com/go-resty/resty/v2 v2.15.3 // 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.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 + github.com/gogo/protobuf v1.3.3 // indirect + github.com/golang-jwt/jwt/v4 v4.5.1 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect + github.com/golang/glog v1.2.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/btree v1.1.2 // indirect + github.com/google/flatbuffers v24.3.25+incompatible // indirect + github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/go-github/v41 v41.0.0 // indirect + github.com/google/go-querystring v1.1.0 // indirect + github.com/google/go-tpm v0.9.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect + github.com/gorilla/context v1.1.1 // indirect + github.com/gorilla/securecookie v1.1.2 // indirect + github.com/gorilla/sessions v1.2.2 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/grafana/pyroscope-go v1.1.2 // indirect + github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect + github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect + github.com/gtank/merlin v0.1.1 // indirect + github.com/gtank/ristretto255 v0.1.2 // indirect + github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 // indirect + github.com/hashicorp/consul/sdk v0.16.1 // indirect + github.com/hashicorp/go-bexpr v0.1.10 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-envparse v0.1.0 // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect + github.com/hashicorp/go-plugin v1.6.2 // indirect + github.com/hashicorp/go-retryablehttp v0.7.7 // indirect + github.com/hashicorp/golang-lru v0.6.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hasura/go-graphql-client v0.13.1 // indirect + github.com/hdevalence/ed25519consensus v0.2.0 // indirect + github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect + github.com/holiman/uint256 v1.3.2 // indirect + github.com/huin/goupnp v1.3.0 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect + github.com/imdario/mergo v0.3.16 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/invopop/jsonschema v0.12.0 // indirect + github.com/jackc/chunkreader/v2 v2.0.1 // indirect + github.com/jackc/pgconn v1.14.3 // indirect + github.com/jackc/pgio v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgproto3/v2 v2.3.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgtype v1.14.4 // indirect + github.com/jackc/pgx/v4 v4.18.3 // indirect + github.com/jackpal/go-nat-pmp v1.0.2 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/jmhodges/levigo v1.0.0 // indirect + github.com/jmoiron/sqlx v1.4.0 // indirect + github.com/joho/godotenv v1.5.1 // indirect + github.com/jonboulle/clockwork v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/jpillora/backoff v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52 // indirect + github.com/kelseyhightower/envconfig v1.4.0 // indirect + github.com/klauspost/compress v1.17.11 // 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 + github.com/leanovate/gopter v0.2.11 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect + github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect + github.com/linxGnu/grocksdb v1.7.16 // indirect + github.com/logrusorgru/aurora v2.0.3+incompatible // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/marcboeker/go-duckdb v1.8.3 // 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.16 // indirect + github.com/mfridman/interpolate v0.0.2 // indirect + github.com/miekg/dns v1.1.61 // indirect + github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/pointerstructure v1.2.0 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect + github.com/moby/patternmatcher v0.6.0 // indirect + github.com/moby/spdystream v0.4.0 // indirect + github.com/moby/sys/sequential v0.6.0 // indirect + github.com/moby/sys/user v0.3.0 // indirect + github.com/moby/sys/userns v0.1.0 // indirect + github.com/moby/term v0.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect + github.com/montanaflynn/stats v0.7.1 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1 // indirect + github.com/mr-tron/base58 v1.2.0 // indirect + github.com/mtibben/percent v0.2.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect + github.com/oklog/run v1.1.0 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect + github.com/otiai10/copy v1.14.0 // indirect + github.com/patrickmn/go-cache v2.1.0+incompatible // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/peterbourgon/diskv v2.0.1+incompatible // indirect + github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/pion/dtls/v2 v2.2.7 // indirect + github.com/pion/logging v0.2.2 // indirect + github.com/pion/stun/v2 v2.0.0 // indirect + github.com/pion/transport/v2 v2.2.1 // indirect + github.com/pion/transport/v3 v3.0.1 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/pressly/goose/v3 v3.21.1 // indirect + github.com/prometheus/client_golang v1.20.5 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.60.1 // indirect + github.com/prometheus/procfs v0.15.1 // 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 + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/ryanuber/go-glob v1.0.0 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sanity-io/litter v1.5.5 // indirect + github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect + github.com/sasha-s/go-deadlock v0.3.5 // indirect + github.com/scylladb/go-reflectx v1.0.1 // indirect + github.com/sethvargo/go-retry v0.2.4 // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/shirou/gopsutil/v3 v3.24.3 // indirect + github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/shopspring/decimal v1.4.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect + github.com/smartcontractkit/chain-selectors v1.0.40 // indirect + github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 // indirect + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect + github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect + github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect + github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect + github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb // indirect + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 // indirect + github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect + github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect + github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect + github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a // indirect + github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect + github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 // indirect + github.com/smartcontractkit/mcms v0.10.0 // indirect + github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect + github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de // indirect + github.com/smartcontractkit/wsrpc v0.8.3 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.7.1 // indirect + github.com/spf13/cobra v1.8.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.19.0 // indirect + github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/stretchr/testify v1.10.0 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/supranational/blst v0.3.13 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + github.com/tendermint/go-amino v0.16.0 // indirect + github.com/testcontainers/testcontainers-go v0.35.0 // indirect + github.com/theodesp/go-heaps v0.0.0-20190520121037-88e35354fe0a // indirect + github.com/tidwall/gjson v1.18.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.1 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + github.com/urfave/cli/v2 v2.27.5 // indirect + github.com/vektah/gqlparser/v2 v2.5.11 // indirect + github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect + github.com/x448/float16 v0.8.4 // indirect + github.com/xlab/treeprint v1.2.0 // indirect + github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + github.com/zeebo/xxh3 v1.0.2 // indirect + github.com/zondax/hid v0.9.2 // indirect + github.com/zondax/ledger-go v0.14.3 // indirect + go.dedis.ch/fixbuf v1.0.3 // indirect + go.dedis.ch/kyber/v3 v3.1.0 // indirect + go.etcd.io/bbolt v1.3.9 // indirect + go.mongodb.org/mongo-driver v1.15.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 // indirect + go.opentelemetry.io/otel/log v0.6.0 // indirect + go.opentelemetry.io/otel/metric v1.31.0 // indirect + go.opentelemetry.io/otel/sdk v1.31.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.6.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.31.0 // indirect + go.opentelemetry.io/otel/trace v1.31.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/ratelimit v0.3.1 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/arch v0.11.0 // indirect + golang.org/x/crypto v0.32.0 // indirect + golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.34.0 // indirect + golang.org/x/oauth2 v0.23.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.29.0 // indirect + golang.org/x/term v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/time v0.7.0 // indirect + golang.org/x/tools v0.29.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/protobuf v1.36.4 // indirect + gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect + gopkg.in/guregu/null.v4 v4.0.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + k8s.io/api v0.31.2 // indirect + k8s.io/apiextensions-apiserver v0.31.0 // indirect + k8s.io/apimachinery v0.31.2 // indirect + k8s.io/cli-runtime v0.31.2 // indirect + k8s.io/client-go v0.31.2 // indirect + k8s.io/component-base v0.31.2 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f // indirect + k8s.io/kubectl v0.31.2 // indirect + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect + pgregory.net/rapid v1.1.0 // indirect + rsc.io/tmplfunc v0.0.3 // indirect + sigs.k8s.io/controller-runtime v0.19.0 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/kustomize/api v0.17.2 // indirect + sigs.k8s.io/kustomize/kyaml v0.17.1 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) + +replace ( + // geth wants v2.3.4 but that is incompatible with github.com/cometbft/cometbft v0.37.5 which when bumped is incompatible with github.com/cosmos/cosmos-sdk + // This line can be removed after these imports are bumped or removed. + github.com/btcsuite/btcd/btcec/v2 => github.com/btcsuite/btcd/btcec/v2 v2.3.2 + // replicating the replace directive on cosmos SDK + github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 + + github.com/sourcegraph/sourcegraph/lib => github.com/sourcegraph/sourcegraph-public-snapshot/lib v0.0.0-20240822153003-c864f15af264 +) diff --git a/system-tests/lib/go.sum b/system-tests/lib/go.sum new file mode 100644 index 00000000000..40159d0f867 --- /dev/null +++ b/system-tests/lib/go.sum @@ -0,0 +1,1956 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cosmossdk.io/api v0.3.1 h1:NNiOclKRR0AOlO4KIqeaG6PS6kswOMhHD0ir0SscNXE= +cosmossdk.io/api v0.3.1/go.mod h1:DfHfMkiNA2Uhy8fj0JJlOCYOBp4eWUUJ1te5zBGNyIw= +cosmossdk.io/core v0.5.1 h1:vQVtFrIYOQJDV3f7rw4pjjVqc1id4+mE0L9hHP66pyI= +cosmossdk.io/core v0.5.1/go.mod h1:KZtwHCLjcFuo0nmDc24Xy6CRNEL9Vl/MeimQ2aC7NLE= +cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc= +cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= +cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= +cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= +cosmossdk.io/math v1.3.0 h1:RC+jryuKeytIiictDslBP9i1fhkVm6ZDmZEoNP316zE= +cosmossdk.io/math v1.3.0/go.mod h1:vnRTxewy+M7BtXBNFybkuhSH4WfedVAAnERHgVFhp3k= +dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= +dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= +github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AlekSi/pointer v1.1.0 h1:SSDMPcXD9jSl8FPy9cRzoRaMJtm9g9ggGTxecRUbQoI= +github.com/AlekSi/pointer v1.1.0/go.mod h1:y7BvfRI3wXPWKXEBhU71nbnIEEZX0QTSB2Bj48UJIZE= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8= +github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM= +github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= +github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= +github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Depado/ginprom v1.8.0 h1:zaaibRLNI1dMiiuj1MKzatm8qrcHzikMlCc1anqOdyo= +github.com/Depado/ginprom v1.8.0/go.mod h1:XBaKzeNBqPF4vxJpNLincSQZeMDnZp1tIbU0FU0UKgg= +github.com/Khan/genqlient v0.7.0 h1:GZ1meyRnzcDTK48EjqB8t3bcfYvHArCUUvgOwpz1D4w= +github.com/Khan/genqlient v0.7.0/go.mod h1:HNyy3wZvuYwmW3Y7mkoQLZsa/R5n5yIRajS1kPBvSFM= +github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= +github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= +github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/NethermindEth/juno v0.3.1 h1:AW72LiAm9gqUeCVJWvepnZcTnpU4Vkl0KzPMxS+42FA= +github.com/NethermindEth/juno v0.3.1/go.mod h1:SGbTpgGaCsxhFsKOid7Ylnz//WZ8swtILk+NbHGsk/Q= +github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb h1:Mv8SscePPyw2ju4igIJAjFgcq5zCQfjgbz53DwYu5mc= +github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb/go.mod h1:gQkhWpAs9/QR6reZU2xoi1UIYlMS64FLTlh9CrgHH/Y= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= +github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= +github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/XSAM/otelsql v0.29.0 h1:pEw9YXXs8ZrGRYfDc0cmArIz9lci5b42gmP5+tA1Huc= +github.com/XSAM/otelsql v0.29.0/go.mod h1:d3/0xGIGC5RVEE+Ld7KotwaLy6zDeaF3fLJHOPpdN2w= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= +github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA= +github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow-go/v18 v18.0.0 h1:1dBDaSbH3LtulTyOVYaBCHO3yVRwjV+TZaqn3g6V7ZM= +github.com/apache/arrow-go/v18 v18.0.0/go.mod h1:t6+cWRSmKgdQ6HsxisQjok+jBpKGhRDiqcf3p0p/F+A= +github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= +github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= +github.com/aptos-labs/aptos-go-sdk v1.5.0 h1:QMdYmeqMb/kc/tuKhLiXq4SpJtLLFIaEDLHx0Peg2iU= +github.com/aptos-labs/aptos-go-sdk v1.5.0/go.mod h1:BgddSKFtfWFLK+no8l+AwCcb/Lh1lv74ybYLzeonloo= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c h1:cxQVoh6kY+c4b0HUchHjGWBI8288VhH50qxKG3hdEg0= +github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c/go.mod h1:3XzxudkrYVUvbduN/uI2fl4lSrMSzU0+3RCu2mpnfx8= +github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0= +github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= +github.com/avast/retry-go/v4 v4.6.0 h1:K9xNA+KeB8HHc2aWFuLb25Offp+0iVRXEvFx8IinRJA= +github.com/avast/retry-go/v4 v4.6.0/go.mod h1:gvWlPhBVsvBbLkVGDg/KwvBv0bEkCOLRRSHKIr2PyOE= +github.com/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= +github.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= +github.com/aws/aws-sdk-go v1.54.19 h1:tyWV+07jagrNiCcGRzRhdtVjQs7Vy41NwsuOcl0IbVI= +github.com/aws/aws-sdk-go v1.54.19/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v1.32.2 h1:AkNLZEyYMLnx/Q/mSKkcMqwNFXMAvFto9bNsHqcTduI= +github.com/aws/aws-sdk-go-v2 v1.32.2/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= +github.com/aws/aws-sdk-go-v2/config v1.28.0 h1:FosVYWcqEtWNxHn8gB/Vs6jOlNwSoyOCA/g/sxyySOQ= +github.com/aws/aws-sdk-go-v2/config v1.28.0/go.mod h1:pYhbtvg1siOOg8h5an77rXle9tVG8T+BWLWAo7cOukc= +github.com/aws/aws-sdk-go-v2/credentials v1.17.41 h1:7gXo+Axmp+R4Z+AK8YFQO0ZV3L0gizGINCOWxSLY9W8= +github.com/aws/aws-sdk-go-v2/credentials v1.17.41/go.mod h1:u4Eb8d3394YLubphT4jLEwN1rLNq2wFOlT6OuxFwPzU= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.17 h1:TMH3f/SCAWdNtXXVPPu5D6wrr4G5hI1rAxbcocKfC7Q= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.17/go.mod h1:1ZRXLdTpzdJb9fwTMXiLipENRxkGMTn1sfKexGllQCw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21 h1:UAsR3xA31QGf79WzpG/ixT9FZvQlh5HY1NRqSHBNOCk= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21/go.mod h1:JNr43NFf5L9YaG3eKTm7HQzls9J+A9YYcGI5Quh1r2Y= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21 h1:6jZVETqmYCadGFvrYEQfC5fAQmlo80CeL5psbno6r0s= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21/go.mod h1:1SR0GbLlnN3QUmYaflZNiH1ql+1qrSiB2vwcJ+4UM60= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 h1:TToQNkvGguu209puTojY/ozlqy2d/SFNcoLIqTFi42g= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0/go.mod h1:0jp+ltwkf+SwG2fm/PKo8t4y8pJSgOCO4D8Lz3k0aHQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.2 h1:s7NA1SOw8q/5c0wr8477yOPp0z+uBaXBnLE0XYb0POA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.2/go.mod h1:fnjjWyAW/Pj5HYOxl9LJqWtEwS7W2qgcRLWP+uWbss0= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.2 h1:Rrqru2wYkKQCS2IM5/JrgKUQIoNTqA6y/iuxkjzxC6M= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.2/go.mod h1:QuCURO98Sqee2AXmqDNxKXYFm2OEDAVAPApMqO0Vqnc= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.2 h1:bSYXVyUzoTHoKalBmwaZxs97HU9DWWI3ehHSAMa7xOk= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.2/go.mod h1:skMqY7JElusiOUjMJMOv1jJsP7YUg7DrhgqZZWuzu1U= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.2 h1:AhmO1fHINP9vFYUE0LHzCWg/LfUWUF+zFPEcY9QXb7o= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.2/go.mod h1:o8aQygT2+MVP0NaV6kbdE1YnnIM8RRVQzoeUH45GOdI= +github.com/aws/aws-sdk-go-v2/service/sts v1.32.2 h1:CiS7i0+FUe+/YY1GvIBLLrR/XNGZ4CtM1Ll0XavNuVo= +github.com/aws/aws-sdk-go-v2/service/sts v1.32.2/go.mod h1:HtaiBI8CjYoNVde8arShXb94UbQQi9L4EMr6D+xGBwo= +github.com/aws/constructs-go/constructs/v10 v10.4.2 h1:+hDLTsFGLJmKIn0Dg20vWpKBrVnFrEWYgTEY5UiTEG8= +github.com/aws/constructs-go/constructs/v10 v10.4.2/go.mod h1:cXsNCKDV+9eR9zYYfwy6QuE4uPFp6jsq6TtH1MwBx9w= +github.com/aws/jsii-runtime-go v1.104.0 h1:651Sh6J2FtatfnVzlOQ3/Ye1WWPAseZ6E/tSQxEKdSI= +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/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 h1:WWB576BN5zNSZc/M9d/10pqEx5VHNhaQ/yOVAkmj5Yo= +github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= +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= +github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df/go.mod h1:hiVxq5OP2bUGBRNS3Z/bt/reCLFNbdcST6gISi1fiOM= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= +github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bits-and-blooms/bitset v1.17.0 h1:1X2TS7aHz1ELcC0yU1y2stUs/0ig5oMU6STFZGrhvHI= +github.com/bits-and-blooms/bitset v1.17.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= +github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= +github.com/block-vision/sui-go-sdk v1.0.6 h1:FysCc4TJC8v4BEBbCjJPDR4iR5eKqJT1dxGwsT67etg= +github.com/block-vision/sui-go-sdk v1.0.6/go.mod h1:FyK1vGE8lWm9QA1fdQpf1agfXQSMbPT8AV1BICgx6d8= +github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8= +github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= +github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= +github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129 h1:gfAMKE626QEuKG3si0pdTRcr/YEbBoxY+3GOH3gWvl4= +github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U= +github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/bxcodec/faker v2.0.1+incompatible h1:P0KUpUw5w6WJXwrPfv35oc91i4d8nf40Nwln+M/+faA= +github.com/bxcodec/faker v2.0.1+incompatible/go.mod h1:BNzfpVdTwnFJ6GtfYTcQu6l6rHShT+veBxNCnjCx5XM= +github.com/bytecodealliance/wasmtime-go/v28 v28.0.0 h1:aBU8cexP2rPZ0Qz488kvn2NXvWZHL2aG1/+n7Iv+xGc= +github.com/bytecodealliance/wasmtime-go/v28 v28.0.0/go.mod h1:4OCU0xAW9ycwtX4nMF4zxwgJBJ5/0eMfJiHB0wAmkV4= +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/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5 h1:rvc39Ol6z3MvaBzXkxFC6Nfsnixq/dRypushKDd7Nc0= +github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5/go.mod h1:R/pdNYDYFQk+tuuOo7QES1kkv6OLmp5ze2XBZQIVffM= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= +github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk= +github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= +github.com/chaos-mesh/chaos-mesh/api v0.0.0-20240821051457-da69c6d9617a h1:6Pg3a6j/41QDzH/oYcMLwwKsf3x/HXcu9W/dBaf2Hzs= +github.com/chaos-mesh/chaos-mesh/api v0.0.0-20240821051457-da69c6d9617a/go.mod h1:x11iCbZV6hzzSQWMq610B6Wl5Lg1dhwqcVfeiWQQnQQ= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= +github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/coder/websocket v1.8.12 h1:5bUXkEPPIbewrnkU8LTCLVaxi4N4J8ahufH2vlo4NAo= +github.com/coder/websocket v1.8.12/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs= +github.com/cometbft/cometbft v0.37.5 h1:/U/TlgMh4NdnXNo+YU9T2NMCWyhXNDF34Mx582jlvq0= +github.com/cometbft/cometbft v0.37.5/go.mod h1:QC+mU0lBhKn8r9qvmnq53Dmf3DWBt4VtkcKw2C81wxY= +github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= +github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= +github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= +github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak= +github.com/confluentinc/confluent-kafka-go/v2 v2.3.0 h1:icCHutJouWlQREayFwCc7lxDAhws08td+W3/gdqgZts= +github.com/confluentinc/confluent-kafka-go/v2 v2.3.0/go.mod h1:/VTy8iEpe6mD9pkCH5BhijlUl8ulUXymKv1Qig5Rgb8= +github.com/consensys/bavard v0.1.22 h1:Uw2CGvbXSZWhqK59X0VG/zOjpTFuOMcPLStrp1ihI0A= +github.com/consensys/bavard v0.1.22/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= +github.com/consensys/gnark-crypto v0.14.0 h1:DDBdl4HaBtdQsq/wfMwJvZNE80sHidrK3Nfrefatm0E= +github.com/consensys/gnark-crypto v0.14.0/go.mod h1:CU4UijNPsHawiVGNxe9co07FkzCeWHHrb1li/n1XoU0= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= +github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA= +github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= +github.com/cosmos/cosmos-sdk v0.47.11 h1:0Qx7eORw0RJqPv+mvDuU8NQ1LV3nJJKJnPoYblWHolc= +github.com/cosmos/cosmos-sdk v0.47.11/go.mod h1:ADjORYzUQqQv/FxDi0H0K5gW/rAk1CiDR3ZKsExfJV0= +github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= +github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= +github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= +github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.11 h1:LZcMHrx4FjUgrqQSWeaGC1v/TeuVFqSLa43CC6aWR2g= +github.com/cosmos/gogoproto v1.4.11/go.mod h1:/g39Mh8m17X8Q/GDEs5zYTSNaNnInBSohtaxzQnYq1Y= +github.com/cosmos/iavl v0.20.1 h1:rM1kqeG3/HBT85vsZdoSNsehciqUQPWrR4BYmqE2+zg= +github.com/cosmos/iavl v0.20.1/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= +github.com/cosmos/ledger-cosmos-go v0.12.4 h1:drvWt+GJP7Aiw550yeb3ON/zsrgW0jgh5saFCr7pDnw= +github.com/cosmos/ledger-cosmos-go v0.12.4/go.mod h1:fjfVWRf++Xkygt9wzCsjEBdjcf7wiiY35fv3ctT+k4M= +github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= +github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= +github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg= +github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwzHBvIzm2RfVCGNEBZgRyjwK40bVoun3ZnGOCafNM= +github.com/crate-crypto/go-kzg-4844 v1.1.0 h1:EN/u9k2TF6OWSHrCCDBBU6GLNMq88OspHHlMnHfoyU4= +github.com/crate-crypto/go-kzg-4844 v1.1.0/go.mod h1:JolLjpSff1tCCJKaJx4psrlEdlXuJEC996PL3tTAFks= +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.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= +github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/cucumber/gherkin/go/v26 v26.2.0 h1:EgIjePLWiPeslwIWmNQ3XHcypPsWAHoMCz/YEBKP4GI= +github.com/cucumber/gherkin/go/v26 v26.2.0/go.mod h1:t2GAPnB8maCT4lkHL99BDCVNzCh1d7dBhCLt150Nr/0= +github.com/cucumber/godog v0.15.0 h1:51AL8lBXF3f0cyA5CV4TnJFCTHpgiy+1x1Hb3TtZUmo= +github.com/cucumber/godog v0.15.0/go.mod h1:FX3rzIDybWABU4kuIXLZ/qtqEe1Ac5RdXmqvACJOces= +github.com/cucumber/messages/go/v21 v21.0.1 h1:wzA0LxwjlWQYZd32VTlAVDTkW6inOFmSM+RuOwHZiMI= +github.com/cucumber/messages/go/v21 v21.0.1/go.mod h1:zheH/2HS9JLVFukdrsPWoPdmUtmYQAQPLk7w5vWsk5s= +github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= +github.com/danielkov/gin-helmet v0.0.0-20171108135313-1387e224435e h1:5jVSh2l/ho6ajWhSPNN84eHEdq3dp0T7+f6r3Tc6hsk= +github.com/danielkov/gin-helmet v0.0.0-20171108135313-1387e224435e/go.mod h1:IJgIiGUARc4aOr4bOQ85klmjsShkEEfiRc6q/yBSfo8= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= +github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dominikbraun/graph v0.23.0 h1:TdZB4pPqCLFxYhdyMFb1TBdFxp8XLcJfTTBQucVPgCo= +github.com/dominikbraun/graph v0.23.0/go.mod h1:yOjYyogZLY1LSG9E33JWZJiq5k83Qy2C6POAuiViluc= +github.com/doyensec/safeurl v0.2.1 h1:DY15JorEfQsnpBWhBkVQIkaif2jfxCC14PIuGDsjDVs= +github.com/doyensec/safeurl v0.2.1/go.mod h1:wzSXqC/6Z410qHz23jtBWT+wQ8yTxcY0p8bZH/4EZIg= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= +github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= +github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/esote/minmaxheap v1.0.0 h1:rgA7StnXXpZG6qlM0S7pUmEv1KpWe32rYT4x8J8ntaA= +github.com/esote/minmaxheap v1.0.0/go.mod h1:Ln8+i7fS1k3PLgZI2JAo0iA1as95QnIYiGCrqSJ5FZk= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.15.0 h1:LLb2jCPsbJZcB4INw+E/MgzUX5wlR6SdwXcv09/1ME4= +github.com/ethereum/go-ethereum v1.15.0/go.mod h1:4q+4t48P2C03sjqGvTXix5lEOplf5dz4CTosbjt5tGs= +github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= +github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= +github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= +github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= +github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= +github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= +github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8= +github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +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.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= +github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= +github.com/gagliardetto/binary v0.8.0 h1:U9ahc45v9HW0d15LoN++vIXSJyqR/pWw8DDlhd7zvxg= +github.com/gagliardetto/binary v0.8.0/go.mod h1:2tfj51g5o9dnvsc+fL3Jxr22MuWzYXwx9wEoN0XQ7/c= +github.com/gagliardetto/gofuzz v1.2.2 h1:XL/8qDMzcgvR4+CyRQW9UGdwPRPMHVJfqQ/uMvSUuQw= +github.com/gagliardetto/gofuzz v1.2.2/go.mod h1:bkH/3hYLZrMLbfYWA0pWzXmi5TTRZnu4pMGZBkqMKvY= +github.com/gagliardetto/hashsearch v0.0.0-20191005111333-09dd671e19f9/go.mod h1:513DXpQPzeRo7d4dsCP3xO3XI8hgvruMl9njxyQeraQ= +github.com/gagliardetto/solana-go v1.12.0 h1:rzsbilDPj6p+/DOPXBMLhwMZeBgeRuXjm5zQFCoXgsg= +github.com/gagliardetto/solana-go v1.12.0/go.mod h1:l/qqqIN6qJJPtxW/G1PF4JtcE3Zg2vD2EliZrr9Gn5k= +github.com/gagliardetto/treeout v0.1.4 h1:ozeYerrLCmCubo1TcIjFiOWTTGteOOHND1twdFpgwaw= +github.com/gagliardetto/treeout v0.1.4/go.mod h1:loUefvXTrlRG5rYmJmExNryyBRh8f89VZhmMOyCyqok= +github.com/gagliardetto/utilz v0.1.1 h1:/etW4hl607emKg6R6Lj9jRJ9d6ue2AQOyjhuAwjzs1U= +github.com/gagliardetto/utilz v0.1.1/go.mod h1:b+rGFkRHz3HWJD0RYMzat47JyvbTtpE0iEcYTRJTLLA= +github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813 h1:Uc+IZ7gYqAf/rSGFplbWBSHaGolEQlNLgMgSE3ccnIQ= +github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813/go.mod h1:P+oSoE9yhSRvsmYyZsshflcR6ePWYLql6UU1amW13IM= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw= +github.com/gin-contrib/cors v1.7.2/go.mod h1:SUJVARKgQ40dmrzgXEVxj2m7Ig1v1qIboQkPDTQ9t2E= +github.com/gin-contrib/expvar v0.0.1 h1:IuU5ArEgihz50vG8Onrwz22kJr7Mcvgv9xSSpfU5g+w= +github.com/gin-contrib/expvar v0.0.1/go.mod h1:8o2CznfQi1JjktORdHr2/abg3wSV6OCnXh0yGypvvVw= +github.com/gin-contrib/sessions v0.0.5 h1:CATtfHmLMQrMNpJRgzjWXD7worTh7g7ritsQfmF+0jE= +github.com/gin-contrib/sessions v0.0.5/go.mod h1:vYAuaUPqie3WUSsft6HUlCjlwwoJQs97miaG2+7neKY= +github.com/gin-contrib/size v0.0.0-20230212012657-e14a14094dc4 h1:Z9J0PVIt1PuibOShaOw1jH8hUYz+Ak8NLsR/GI0Hv5I= +github.com/gin-contrib/size v0.0.0-20230212012657-e14a14094dc4/go.mod h1:CEPcgZiz8998l9E8fDm16h8UfHRL7b+5oG0j/0koeVw= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-asn1-ber/asn1-ber v1.5.5 h1:MNHlNMBDgEKD4TcKr36vQN68BA00aDfjIt3/bD50WnA= +github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 h1:ymLjT4f35nQbASLnvxEde4XOBL+Sn7rFuV+FOJqkljg= +github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0/go.mod h1:6daplAwHHGbUGib4990V3Il26O0OC4aRyvewaaAihaA= +github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-ldap/ldap/v3 v3.4.6 h1:ert95MdbiG7aWo/oPYp9btL3KJlMPKnP58r09rI8T+A= +github.com/go-ldap/ldap/v3 v3.4.6/go.mod h1:IGMQANNtxpsOzj7uUAMjpGBaOVTC4DYyIy8VsTdxmtc= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +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.24.0 h1:KHQckvo8G6hlWnrPX4NJJ+aBfWNAE/HH+qdL2cBpCmg= +github.com/go-playground/validator/v10 v10.24.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= +github.com/go-resty/resty/v2 v2.15.3 h1:bqff+hcqAflpiF591hhJzNdkRsFhlB96CYfBwSFvql8= +github.com/go-resty/resty/v2 v2.15.3/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpGyP1XxdC/w= +github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-webauthn/webauthn v0.9.4 h1:YxvHSqgUyc5AK2pZbqkWWR55qKeDPhP8zLDr6lpIc2g= +github.com/go-webauthn/webauthn v0.9.4/go.mod h1:LqupCtzSef38FcxzaklmOn7AykGKhAhr9xlRbdbgnTw= +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/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= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= +github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= +github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= +github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU= +github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49/go.mod h1:BkkQ4L1KS1xMt2aWSPStnn55ChGC0DPOn2FQYj+f25M= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-github/v41 v41.0.0 h1:HseJrM2JFf2vfiZJ8anY2hqBjdfY1Vlj/K27ueww4gg= +github.com/google/go-github/v41 v41.0.0/go.mod h1:XgmCA5H323A9rtgExdTcnDkcqp6S30AVACCBDOonIxg= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/go-tpm v0.9.0 h1:sQF6YqWMi+SCXpsmS3fd21oPy/vSddwZry4JnmltHVk= +github.com/google/go-tpm v0.9.0/go.mod h1:FkNVkc6C+IsvDI9Jw1OveJmxGZUUaKxtrpOS47QWKfU= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= +github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= +github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= +github.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY= +github.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grafana/pyroscope-go v1.1.2 h1:7vCfdORYQMCxIzI3NlYAs3FcBP760+gWuYWOyiVyYx8= +github.com/grafana/pyroscope-go v1.1.2/go.mod h1:HSSmHo2KRn6FasBA4vK7BMiQqyQq8KSuBKvrhkXxYPU= +github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= +github.com/grafana/pyroscope-go/godeltaprof v0.1.8/go.mod h1:2+l7K7twW49Ct4wFluZD3tZ6e0SjanjcUUBPVD/UuGU= +github.com/graph-gophers/dataloader v5.0.0+incompatible h1:R+yjsbrNq1Mo3aPG+Z/EKYrXrXXUNJHOgbRt+U6jOug= +github.com/graph-gophers/dataloader v5.0.0+incompatible/go.mod h1:jk4jk0c5ZISbKaMe8WsVopGB5/15GvGHMdMdPtwlRp4= +github.com/graph-gophers/graphql-go v1.5.0 h1:fDqblo50TEpD0LY7RXk/LFVYEVqo3+tXMNMPSVXA1yc= +github.com/graph-gophers/graphql-go v1.5.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= +github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= +github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= +github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 h1:BpJ2o0OR5FV7vrkDYfXYVJQeMNWa8RhklZOpW2ITAIQ= +github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.16.1 h1:V8TxTnImoPD5cj0U9Spl0TUxcytjcbbJeADFF07KdHg= +github.com/hashicorp/consul/sdk v0.16.1/go.mod h1:fSXvwxB2hmh1FMZCNl6PwX0Q/1wdWtHJcZ7Ea5tns0s= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-envparse v0.1.0 h1:bE++6bhIsNCPLvgDZkYqo3nA+/PFI51pkrHdmPSDFPY= +github.com/hashicorp/go-envparse v0.1.0/go.mod h1:OHheN1GoygLlAkTlXLXvAdnXdZxy8JUweQ1rAXx1xnc= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8IoK3c= +github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-plugin v1.6.2 h1:zdGAEd0V1lCaU0u+MxWQhtSDQmahpkwOun8U8EiRVog= +github.com/hashicorp/go-plugin v1.6.2/go.mod h1:CkgLQ5CZqNmdL9U9JzM532t8ZiYQ35+pj3b1FD37R0Q= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= +github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hasura/go-graphql-client v0.13.1 h1:kKbjhxhpwz58usVl+Xvgah/TDha5K2akNTRQdsEHN6U= +github.com/hasura/go-graphql-client v0.13.1/go.mod h1:k7FF7h53C+hSNFRG3++DdVZWIuHdCaTbI7siTJ//zGQ= +github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= +github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA= +github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= +github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= +github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgtype v1.14.4 h1:fKuNiCumbKTAIxQwXfB/nsrnkEI6bPJrrSiMKgbJ2j8= +github.com/jackc/pgtype v1.14.4/go.mod h1:aKeozOde08iifGosdJpz9MBZonJOUJxqNpPBcMJTlVA= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.18.2/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= +github.com/jackc/pgx/v4 v4.18.3 h1:dE2/TrEsGX3RBprb3qryqSV9Y60iZN1C6i8IrmW9/BA= +github.com/jackc/pgx/v4 v4.18.3/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= +github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= +github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= +github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52 h1:msKODTL1m0wigztaqILOtla9HeW1ciscYG4xjLtvk5I= +github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52/go.mod h1:qk1sX/IBgppQNcGCRoj90u6EGC056EBoIc1oEjCWla8= +github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= +github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4= +github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= +github.com/linkedin/goavro/v2 v2.12.0 h1:rIQQSj8jdAUlKQh6DttK8wCRv4t4QO09g1C4aBWXslg= +github.com/linkedin/goavro/v2 v2.12.0/go.mod h1:KXx+erlq+RPlGSPmLF7xGo6SAbh8sCQ53x064+ioxhk= +github.com/linxGnu/grocksdb v1.7.16 h1:Q2co1xrpdkr5Hx3Fp+f+f7fRGhQFQhvi/+226dtLmA8= +github.com/linxGnu/grocksdb v1.7.16/go.mod h1:JkS7pl5qWpGpuVb3bPqTz8nC12X3YtPZT+Xq7+QfQo4= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= +github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= +github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f h1:tVvGiZQFjOXP+9YyGqSA6jE55x1XVxmoPYudncxrZ8U= +github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f/go.mod h1:Z60vy0EZVSu0bOugCHdcN5ZxFMKSpjRgsnh0XKPFqqk= +github.com/marcboeker/go-duckdb v1.8.3 h1:ZkYwiIZhbYsT6MmJsZ3UPTHrTZccDdM4ztoqSlEMXiQ= +github.com/marcboeker/go-duckdb v1.8.3/go.mod h1:C9bYRE1dPYb1hhfu/SSomm78B0FXmNgRvv6YBW/Hooc= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +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.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= +github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= +github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= +github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= +github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= +github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= +github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/spdystream v0.4.0 h1:Vy79D6mHeJJjiPdFEL2yku1kl0chZpJfZcPpb16BRl8= +github.com/moby/spdystream v0.4.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= +github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= +github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= +github.com/moby/sys/user v0.3.0 h1:9ni5DlcW5an3SvRSx4MouotOygvzaXbaSrc/wGDFWPo= +github.com/moby/sys/user v0.3.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= +github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1 h1:mPMvm6X6tf4w8y7j9YIt6V9jfWhL6QlbEc7CCmeQlWk= +github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1/go.mod h1:ye2e/VUEtE2BHE+G/QcKkcLQVAEJoYRFj5VUOQatCRE= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +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/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-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= +github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= +github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= +github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks= +github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= +github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= +github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= +github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0= +github.com/pion/stun/v2 v2.0.0/go.mod h1:22qRSh08fSEttYUmJZGlriq9+03jtVmXNODgLccj8GQ= +github.com/pion/transport/v2 v2.2.1 h1:7qYnCBlpgSJNYMbLCKuSY9KbQdBFoETvPNETv0y4N7c= +github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= +github.com/pion/transport/v3 v3.0.1 h1:gDTlPJwROfSfz6QfSi0ZmeCSkFcnWWiiR9ES0ouANiM= +github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/pressly/goose/v3 v3.21.1 h1:5SSAKKWej8LVVzNLuT6KIvP1eFDuPvxa+B6H0w78buQ= +github.com/pressly/goose/v3 v3.21.1/go.mod h1:sqthmzV8PitchEkjecFJII//l43dLOCzfWh8pHEe+vE= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= +github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ= +github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +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/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/riferrei/srclient v0.5.4 h1:dfwyR5u23QF7beuVl2WemUY2KXh5+Sc4DHKyPXBNYuc= +github.com/riferrei/srclient v0.5.4/go.mod h1:vbkLmWcgYa7JgfPvuy/+K8fTS0p1bApqadxrxi/S1MI= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +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 v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= +github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo= +github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= +github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= +github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/scylladb/go-reflectx v1.0.1 h1:b917wZM7189pZdlND9PbIJ6NQxfDPfBvUaQ7cjj1iZQ= +github.com/scylladb/go-reflectx v1.0.1/go.mod h1:rWnOfDIRWBGN0miMLIcoPt/Dhi2doCMZqwMCJ3KupFc= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sethvargo/go-retry v0.2.4 h1:T+jHEQy/zKJf5s95UkguisicE0zuF9y7+/vgz08Ocec= +github.com/sethvargo/go-retry v0.2.4/go.mod h1:1afjQuvh7s4gflMObvjLPaWgluLLyhA1wmVZ6KLpICw= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.24.3 h1:eoUGJSmdfLzJ3mxIhmOAhgKEKgQkeOwKpz1NbhVnuPE= +github.com/shirou/gopsutil/v3 v3.24.3/go.mod h1:JpND7O217xa72ewWz9zN2eIIkPWsDN/3pl0H8Qt0uwg= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartcontractkit/ccip-owner-contracts v0.1.0 h1:GiBDtlx7539o7AKlDV+9LsA7vTMPv+0n7ClhSFnZFAk= +github.com/smartcontractkit/ccip-owner-contracts v0.1.0/go.mod h1:NnT6w4Kj42OFFXhSx99LvJZWPpMjmo4+CpDEWfw61xY= +github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0DF25d3mh+vsYeZQiSCE= +github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= +github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= +github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= +github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= +github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= +github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= +github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= +github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= +github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 h1:3icYNFldKQbs6Qrfai2LE+tKbNcE4tfgPRELF30mnEA= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02/go.mod h1:7DbPnG0E39eZaX1CXKxRiJ1NOWHwTZYDWR9ys3kZZuU= +github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 h1:hfMRj2ny6oNHd8w1rhJHdoX3YkoWJtCkBK6wTlCE4+c= +github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= +github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= +github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= +github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 h1:L6KJ4kGv/yNNoCk8affk7Y1vAY0qglPMXC/hevV/IsA= +github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6/go.mod h1:FRwzI3hGj4CJclNS733gfcffmqQ62ONCkbGi49s658w= +github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= +github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a h1:C+XavZQ0rBOpOrh45LUhdOsvtI8OQ0XZKI5pi+GP6h4= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a/go.mod h1:aFm1QC/n99mVeBDtv0SE0co56+IECY6Y1fR3OfNYy3c= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.4 h1:8R/xyOh/SaifOhhmOYNB3uv3sUzKeshILtVCqRgv7ck= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.4/go.mod h1:fAmPov5WZg2WjTRoUrz7fzcvD9b77ZOw5yPwJXI2IOE= +github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.23 h1:gji906uw6vkSPXUUBoRuFeeL/93l4YYZAQY4G03R1RM= +github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.23/go.mod h1:70JLBXQncNHyW63ik4PvPQGjQGZ1xK67MKrDanVAk2w= +github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 h1:Yf+n3T/fnUWcYyfe7bsygV4sWAkNo0QhN58APJFIKIc= +github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10/go.mod h1:05duR85P8YHuIfIkA7sn2bvrhKo/pDpFKV2rliYHNOo= +github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs= +github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= +github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg= +github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM= +github.com/smartcontractkit/mcms v0.10.0 h1:wkBAr8HLyHKwejdwsDOMvIwmzT83tKr3jjB9senLahM= +github.com/smartcontractkit/mcms v0.10.0/go.mod h1:3N7+yvkO3hIFXYRYm3hxKCE6qDWdOC/rZdvIrwzlLKk= +github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de h1:n0w0rKF+SVM+S3WNlup6uabXj2zFlFNfrlsKCMMb/co= +github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de/go.mod h1:Sl2MF/Fp3fgJIVzhdGhmZZX2BlnM0oUUyBP4s4xYb6o= +github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de h1:66VQxXx3lvTaAZrMBkIcdH9VEjujUEvmBQdnyOJnkOc= +github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de/go.mod h1:NSc7hgOQbXG3DAwkOdWnZzLTZENXSwDJ7Va1nBp0YU0= +github.com/smartcontractkit/wsrpc v0.8.3 h1:9tDf7Ut61g36RJIyxV9iI73SqoOMasKPfURV9oMLrPg= +github.com/smartcontractkit/wsrpc v0.8.3/go.mod h1:2u/wfnhl5R4RlSXseN4n6HHIWk8w1Am3AT6gWftQbNg= +github.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 h1:RN5mrigyirb8anBEtdjtHFIufXdacyTi6i4KBfeNXeo= +github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/supranational/blst v0.3.13 h1:AYeSxdOMacwu7FBmpfloBz5pbFXDmJL33RuwnKtmTjk= +github.com/supranational/blst v0.3.13/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= +github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= +github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= +github.com/testcontainers/testcontainers-go v0.35.0 h1:uADsZpTKFAtp8SLK+hMwSaa+X+JiERHtd4sQAFmXeMo= +github.com/testcontainers/testcontainers-go v0.35.0/go.mod h1:oEVBj5zrfJTrgjwONs1SsRbnBtH9OKl+IGl3UMcr2B4= +github.com/theodesp/go-heaps v0.0.0-20190520121037-88e35354fe0a h1:YuO+afVc3eqrjiCUizNCxI53bl/BnPiVwXqLzqYTqgU= +github.com/theodesp/go-heaps v0.0.0-20190520121037-88e35354fe0a/go.mod h1:/sfW47zCZp9FrtGcWyo1VjbgDaodxX9ovZvgLb/MxaA= +github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= +github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/ulule/limiter/v3 v3.11.2 h1:P4yOrxoEMJbOTfRJR2OzjL90oflzYPPmWg+dvwN2tHA= +github.com/ulule/limiter/v3 v3.11.2/go.mod h1:QG5GnFOCV+k7lrL5Y8kgEeeflPH3+Cviqlqa8SVSQxI= +github.com/umbracle/ethgo v0.1.3 h1:s8D7Rmphnt71zuqrgsGTMS5gTNbueGO1zKLh7qsFzTM= +github.com/umbracle/ethgo v0.1.3/go.mod h1:g9zclCLixH8liBI27Py82klDkW7Oo33AxUOr+M9lzrU= +github.com/umbracle/fastrlp v0.0.0-20220527094140-59d5dd30e722 h1:10Nbw6cACsnQm7r34zlpJky+IzxVLRk6MKTS2d3Vp0E= +github.com/umbracle/fastrlp v0.0.0-20220527094140-59d5dd30e722/go.mod h1:c8J0h9aULj2i3umrfyestM6jCq0LK0U6ly6bWy96nd4= +github.com/unrolled/secure v1.13.0 h1:sdr3Phw2+f8Px8HE5sd1EHdj1aV3yUwed/uZXChLFsk= +github.com/unrolled/secure v1.13.0/go.mod h1:BmF5hyM6tXczk3MpQkFf1hpKSRqCyhqcbiQtiAF7+40= +github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk= +github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= +github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w= +github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= +github.com/valyala/fastjson v1.4.1 h1:hrltpHpIpkaxll8QltMU8c3QZ5+qIiCL8yKqPFJI/yE= +github.com/valyala/fastjson v1.4.1/go.mod h1:nV6MsjxL2IMJQUoHDIrjEI7oLyeqK6aBD7EFWPsvP8o= +github.com/vektah/gqlparser/v2 v2.5.11 h1:JJxLtXIoN7+3x6MBdtIP59TP1RANnY7pXOaDnADQSf8= +github.com/vektah/gqlparser/v2 v2.5.11/go.mod h1:1rCcfwB2ekJofmluGWXMSEnPMZgbxzwj6FaZ/4OT8Cc= +github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= +github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= +github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= +github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= +github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= +go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= +go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= +go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ= +go.dedis.ch/kyber/v3 v3.0.9/go.mod h1:rhNjUUg6ahf8HEg5HUvVBYoWY4boAafX8tYxX+PS+qg= +go.dedis.ch/kyber/v3 v3.1.0 h1:ghu+kiRgM5JyD9TJ0hTIxTLQlJBR/ehjWvWwYW3XsC0= +go.dedis.ch/kyber/v3 v3.1.0/go.mod h1:kXy7p3STAurkADD+/aZcsznZGKVHEqbtmdIzvPfrs1U= +go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= +go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= +go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= +go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= +go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= +go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0 h1:1f31+6grJmV3X4lxcEvUy13i5/kfDw1nJZwhd8mA4tg= +go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0/go.mod h1:1P/02zM3OwkX9uki+Wmxw3a5GVb6KUXRsa7m7bOC9Fg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 h1:UiRNKd1OgqsLbFwE+wkAWTdiAxXtCBqKIHeBIse4FUA= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9/go.mod h1:eqZlW3pJWhjyexnDPrdQxix1pn0wwhI4AO4GKpP/bMI= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 h1:QSKmLBzbFULSyHzOdO9JsN9lpE4zkrz1byYGmJecdVE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0/go.mod h1:sTQ/NH8Yrirf0sJ5rWqVu+oT82i4zL9FaF6rWcqnptM= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0/go.mod h1:yeGZANgEcpdx/WK0IvvRFC+2oLiMS2u4L/0Rj2M2Qr0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 h1:VrMAbeJz4gnVDg2zEzjHG4dEH86j4jO6VYB+NgtGD8s= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0/go.mod h1:qqN/uFdpeitTvm+JDqqnjm517pmQRYxTORbETHq5tOc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 h1:0MH3f8lZrflbUWXVxyBg/zviDFdGE062uKh5+fu8Vv0= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0/go.mod h1:Vh68vYiHY5mPdekTr0ox0sALsqjoVy0w3Os278yX5SQ= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 h1:BJee2iLkfRfl9lc7aFmBwkWxY/RI1RDdXepSF6y8TPE= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0/go.mod h1:DIzlHs3DRscCIBU3Y9YSzPfScwnYnzfnCd4g8zA7bZc= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= +go.opentelemetry.io/otel/log v0.6.0 h1:nH66tr+dmEgW5y+F9LanGJUBYPrRgP4g2EkmPE3LeK8= +go.opentelemetry.io/otel/log v0.6.0/go.mod h1:KdySypjQHhP069JX0z/t26VHwa8vSwzgaKmXtIB3fJM= +go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= +go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= +go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= +go.opentelemetry.io/otel/sdk/log v0.6.0 h1:4J8BwXY4EeDE9Mowg+CyhWVBhTSLXVXodiXxS/+PGqI= +go.opentelemetry.io/otel/sdk/log v0.6.0/go.mod h1:L1DN8RMAduKkrwRAFDEX3E3TLOq46+XMGSbUfHU/+vE= +go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= +go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= +go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= +go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/ratelimit v0.3.1 h1:K4qVE+byfv/B3tC+4nYWP7v/6SimcO7HzHekoMNBma0= +go.uber.org/ratelimit v0.3.1/go.mod h1:6euWsTB6U/Nb3X++xEUXA8ciPJvr19Q/0h1+oDcJhRk= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +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-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= +golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc= +golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= +golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= +golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= +golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200324203455-a04cca1dde73/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU= +google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= +google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/guregu/null.v4 v4.0.0 h1:1Wm3S1WEA2I26Kq+6vcW+w0gcDo44YKYD7YIEJNHDjg= +gopkg.in/guregu/null.v4 v4.0.0/go.mod h1:YoQhUrADuG3i9WqesrCmpNRwm1ypAgSHYqoOcTu/JrI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +k8s.io/api v0.31.2 h1:3wLBbL5Uom/8Zy98GRPXpJ254nEFpl+hwndmk9RwmL0= +k8s.io/api v0.31.2/go.mod h1:bWmGvrGPssSK1ljmLzd3pwCQ9MgoTsRCuK35u6SygUk= +k8s.io/apiextensions-apiserver v0.31.0 h1:fZgCVhGwsclj3qCw1buVXCV6khjRzKC5eCFt24kyLSk= +k8s.io/apiextensions-apiserver v0.31.0/go.mod h1:b9aMDEYaEe5sdK+1T0KU78ApR/5ZVp4i56VacZYEHxk= +k8s.io/apimachinery v0.31.2 h1:i4vUt2hPK56W6mlT7Ry+AO8eEsyxMD1U44NR22CLTYw= +k8s.io/apimachinery v0.31.2/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/cli-runtime v0.31.2 h1:7FQt4C4Xnqx8V1GJqymInK0FFsoC+fAZtbLqgXYVOLQ= +k8s.io/cli-runtime v0.31.2/go.mod h1:XROyicf+G7rQ6FQJMbeDV9jqxzkWXTYD6Uxd15noe0Q= +k8s.io/client-go v0.31.2 h1:Y2F4dxU5d3AQj+ybwSMqQnpZH9F30//1ObxOKlTI9yc= +k8s.io/client-go v0.31.2/go.mod h1:NPa74jSVR/+eez2dFsEIHNa+3o09vtNaWwWwb1qSxSs= +k8s.io/component-base v0.31.2 h1:Z1J1LIaC0AV+nzcPRFqfK09af6bZ4D1nAOpWsy9owlA= +k8s.io/component-base v0.31.2/go.mod h1:9PeyyFN/drHjtJZMCTkSpQJS3U9OXORnHQqMLDz0sUQ= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f h1:2sXuKesAYbRHxL3aE2PN6zX/gcJr22cjrsej+W784Tc= +k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f/go.mod h1:UxDHUPsUwTOOxSU+oXURfFBcAS6JwiRXTYqYwfuGowc= +k8s.io/kubectl v0.31.2 h1:gTxbvRkMBwvTSAlobiTVqsH6S8Aa1aGyBcu5xYLsn8M= +k8s.io/kubectl v0.31.2/go.mod h1:EyASYVU6PY+032RrTh5ahtSOMgoDRIux9V1JLKtG5xM= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= +modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk= +modernc.org/libc v1.41.0/go.mod h1:w0eszPsiXoOnoMJgrXjglgLuDy/bt5RR4y3QzUUeodY= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/sqlite v1.29.6 h1:0lOXGrycJPptfHDuohfYgNqoe4hu+gYuN/pKgY5XjS4= +modernc.org/sqlite v1.29.6/go.mod h1:S02dvcmm7TnTRvGhv8IGYyLnIt7AS2KPaB1F/71p75U= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +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/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= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= +sigs.k8s.io/controller-runtime v0.19.0 h1:nWVM7aq+Il2ABxwiCizrVDSlmDcshi9llbaFbC0ji/Q= +sigs.k8s.io/controller-runtime v0.19.0/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/kustomize/api v0.17.2 h1:E7/Fjk7V5fboiuijoZHgs4aHuexi5Y2loXlVOAVAG5g= +sigs.k8s.io/kustomize/api v0.17.2/go.mod h1:UWTz9Ct+MvoeQsHcJ5e+vziRRkwimm3HytpZgIYqye0= +sigs.k8s.io/kustomize/kyaml v0.17.1 h1:TnxYQxFXzbmNG6gOINgGWQt09GghzgTP6mIurOgrLCQ= +sigs.k8s.io/kustomize/kyaml v0.17.1/go.mod h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/system-tests/lib/net/download.go b/system-tests/lib/net/download.go new file mode 100644 index 00000000000..d7032d05db2 --- /dev/null +++ b/system-tests/lib/net/download.go @@ -0,0 +1,51 @@ +package net + +import ( + "context" + "encoding/base64" + "fmt" + "io" + "net/http" + "time" +) + +func Download(url string) ([]byte, error) { + ctx, cancelFn := context.WithTimeout(context.Background(), 120*time.Second) + defer cancelFn() + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + return nil, err + } + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("received non-200 response: %d", resp.StatusCode) + } + + data, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("failed to read response body: %w", err) + } + + return data, nil +} + +func DownloadAndDecodeBase64(url string) ([]byte, error) { + data, err := Download(url) + if err != nil { + return nil, err + } + + decoded, err := base64.StdEncoding.DecodeString(string(data)) + if err != nil { + return nil, fmt.Errorf("failed to decode base64 content: %w", err) + } + + return decoded, nil +} diff --git a/system-tests/lib/types/funding.go b/system-tests/lib/types/funding.go new file mode 100644 index 00000000000..edda6a92d1f --- /dev/null +++ b/system-tests/lib/types/funding.go @@ -0,0 +1,20 @@ +package types + +import ( + "crypto/ecdsa" + "math/big" + "time" + + "github.com/ethereum/go-ethereum/common" +) + +type FundsToSend struct { + ToAddress common.Address + Amount *big.Int + PrivateKey *ecdsa.PrivateKey + GasLimit *int64 + GasPrice *big.Int + GasFeeCap *big.Int + GasTipCap *big.Int + TxTimeout *time.Duration +} diff --git a/integration-tests/smoke/capabilities/.gitignore b/system-tests/tests/.gitignore similarity index 100% rename from integration-tests/smoke/capabilities/.gitignore rename to system-tests/tests/.gitignore diff --git a/system-tests/tests/go.mod b/system-tests/tests/go.mod new file mode 100644 index 00000000000..70e47ee9479 --- /dev/null +++ b/system-tests/tests/go.mod @@ -0,0 +1,478 @@ +module github.com/smartcontractkit/chainlink/system-tests/tests + +go 1.23.3 + +// Using a separate `require` here to avoid surrounding line changes +// creating potential merge conflicts. +require ( + github.com/smartcontractkit/chainlink/deployment v0.0.0-20250206093113-4e72c05bdba6 + github.com/smartcontractkit/chainlink/v2 v2.19.0-ccip1.5.16-alpha.0.0.20250206093113-4e72c05bdba6 +) + +// Make sure we're working with the latest chainlink libs +replace github.com/smartcontractkit/chainlink/v2 => ../../ + +replace github.com/smartcontractkit/chainlink/deployment => ../../deployment + +replace github.com/smartcontractkit/chainlink/system-tests/lib => ../lib + +require ( + github.com/ethereum/go-ethereum v1.15.0 + github.com/gin-gonic/gin v1.10.0 + github.com/go-playground/universal-translator v0.18.1 + github.com/go-playground/validator/v10 v10.25.0 + github.com/pkg/errors v0.9.1 + github.com/rs/zerolog v1.33.0 + github.com/smartcontractkit/chain-selectors v1.0.40 + github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.4 + github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.23 + github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 + github.com/smartcontractkit/chainlink/system-tests/lib v0.0.0-00010101000000-000000000000 + github.com/stretchr/testify v1.10.0 +) + +require ( + cosmossdk.io/errors v1.0.1 // indirect + cosmossdk.io/math v1.3.0 // indirect + dario.cat/mergo v1.0.1 // indirect + filippo.io/edwards25519 v1.1.0 // indirect + github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect + github.com/99designs/keyring v1.2.1 // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect + github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect + github.com/DataDog/zstd v1.5.2 // indirect + github.com/Khan/genqlient v0.7.0 // indirect + github.com/MakeNowJust/heredoc v1.0.0 // indirect + github.com/Masterminds/semver/v3 v3.3.0 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/NethermindEth/juno v0.3.1 // indirect + github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect + github.com/XSAM/otelsql v0.29.0 // indirect + github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 // indirect + github.com/andybalholm/brotli v1.1.1 // indirect + github.com/apache/arrow-go/v18 v18.0.0 // indirect + github.com/aptos-labs/aptos-go-sdk v1.5.0 // indirect + github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c // indirect + github.com/avast/retry-go v3.0.0+incompatible // indirect + github.com/avast/retry-go/v4 v4.6.0 // indirect + github.com/awalterschulze/gographviz v2.0.3+incompatible // indirect + github.com/aws/aws-sdk-go v1.54.19 // indirect + github.com/aws/aws-sdk-go-v2 v1.32.2 // indirect + github.com/aws/aws-sdk-go-v2/config v1.28.0 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.41 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.2 // indirect + github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.2 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.32.2 // indirect + github.com/aws/constructs-go/constructs/v10 v10.4.2 // indirect + github.com/aws/jsii-runtime-go v1.104.0 // indirect + github.com/aws/smithy-go v1.22.0 // indirect + github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 // indirect + github.com/bahlo/generic-list-go v0.2.0 // indirect + github.com/benbjohnson/clock v1.3.5 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect + github.com/bits-and-blooms/bitset v1.17.0 // indirect + github.com/blang/semver/v4 v4.0.0 // indirect + github.com/blendle/zapdriver v1.3.1 // indirect + github.com/block-vision/sui-go-sdk v1.0.6 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect + github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129 // indirect + github.com/buger/jsonparser v1.1.1 // indirect + github.com/bytecodealliance/wasmtime-go/v28 v28.0.0 // indirect + github.com/bytedance/sonic v1.12.3 // indirect + github.com/bytedance/sonic/loader v0.2.0 // indirect + github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5 // indirect + github.com/cenkalti/backoff v2.2.1+incompatible // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cespare/xxhash v1.1.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/chai2010/gettext-go v1.0.2 // indirect + github.com/chaos-mesh/chaos-mesh/api v0.0.0-20240821051457-da69c6d9617a // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v1.1.2 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/coder/websocket v1.8.12 // indirect + github.com/cometbft/cometbft v0.37.5 // indirect + github.com/cometbft/cometbft-db v0.8.0 // indirect + github.com/confio/ics23/go v0.9.0 // indirect + github.com/consensys/bavard v0.1.22 // indirect + github.com/consensys/gnark-crypto v0.14.0 // indirect + github.com/containerd/log v0.1.0 // indirect + github.com/containerd/platforms v0.2.1 // indirect + github.com/cosmos/btcutil v1.0.5 // indirect + github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect + github.com/cosmos/cosmos-sdk v0.47.11 // indirect + github.com/cosmos/go-bip39 v1.0.0 // indirect + github.com/cosmos/gogoproto v1.4.11 // indirect + github.com/cosmos/ledger-cosmos-go v0.12.4 // indirect + github.com/cpuguy83/dockercfg v0.3.2 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect + github.com/crate-crypto/go-kzg-4844 v1.1.0 // indirect + github.com/danieljoos/wincred v1.1.2 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/dgraph-io/badger/v2 v2.2007.4 // indirect + github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/docker v27.3.1+incompatible // indirect + github.com/docker/go-connections v0.5.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/dominikbraun/graph v0.23.0 // indirect + github.com/doyensec/safeurl v0.2.1 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/dvsekhvalnov/jose2go v1.7.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.1 // indirect + github.com/esote/minmaxheap v1.0.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.2.2 // indirect + github.com/evanphx/json-patch/v5 v5.9.0 // indirect + github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect + github.com/fatih/camelcase v1.0.0 // indirect + 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/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.8 // indirect + github.com/gagliardetto/binary v0.8.0 // indirect + github.com/gagliardetto/solana-go v1.12.0 // indirect + github.com/gagliardetto/treeout v0.1.4 // indirect + github.com/gagliardetto/utilz v0.1.1 // indirect + github.com/getsentry/sentry-go v0.27.0 // indirect + github.com/gin-contrib/sessions v0.0.5 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect + github.com/go-errors/errors v1.4.2 // indirect + github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 // indirect + github.com/go-kit/kit v0.12.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-ldap/ldap/v3 v3.4.6 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-resty/resty/v2 v2.15.3 // 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.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 + github.com/gogo/protobuf v1.3.3 // indirect + github.com/golang-jwt/jwt/v4 v4.5.1 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect + github.com/golang/glog v1.2.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/btree v1.1.2 // indirect + github.com/google/flatbuffers v24.3.25+incompatible // indirect + github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/go-github/v41 v41.0.0 // indirect + github.com/google/go-querystring v1.1.0 // indirect + github.com/google/go-tpm v0.9.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/context v1.1.1 // indirect + github.com/gorilla/securecookie v1.1.2 // indirect + github.com/gorilla/sessions v1.2.2 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/grafana/pyroscope-go v1.1.2 // indirect + github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect + github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect + github.com/gtank/merlin v0.1.1 // indirect + github.com/gtank/ristretto255 v0.1.2 // indirect + github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 // indirect + github.com/hashicorp/consul/sdk v0.16.1 // indirect + github.com/hashicorp/go-bexpr v0.1.10 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-envparse v0.1.0 // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect + github.com/hashicorp/go-plugin v1.6.2 // indirect + github.com/hashicorp/go-retryablehttp v0.7.7 // indirect + github.com/hashicorp/golang-lru v0.6.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hasura/go-graphql-client v0.13.1 // indirect + github.com/hdevalence/ed25519consensus v0.2.0 // indirect + github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect + github.com/holiman/uint256 v1.3.2 // indirect + github.com/huin/goupnp v1.3.0 // indirect + github.com/iancoleman/strcase v0.3.0 // indirect + github.com/imdario/mergo v0.3.16 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/invopop/jsonschema v0.12.0 // indirect + github.com/jackc/chunkreader/v2 v2.0.1 // indirect + github.com/jackc/pgconn v1.14.3 // indirect + github.com/jackc/pgio v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgproto3/v2 v2.3.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgtype v1.14.4 // indirect + github.com/jackc/pgx/v4 v4.18.3 // indirect + github.com/jackpal/go-nat-pmp v1.0.2 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/jmhodges/levigo v1.0.0 // indirect + github.com/jmoiron/sqlx v1.4.0 // indirect + github.com/joho/godotenv v1.5.1 // indirect + github.com/jonboulle/clockwork v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/jpillora/backoff v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52 // indirect + github.com/kelseyhightower/envconfig v1.4.0 // indirect + github.com/klauspost/compress v1.17.11 // 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 + github.com/leanovate/gopter v0.2.11 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/libp2p/go-buffer-pool v0.1.0 // indirect + github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect + github.com/linxGnu/grocksdb v1.7.16 // indirect + github.com/logrusorgru/aurora v2.0.3+incompatible // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/marcboeker/go-duckdb v1.8.3 // 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.16 // indirect + github.com/mfridman/interpolate v0.0.2 // indirect + github.com/miekg/dns v1.1.61 // indirect + github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/go-testing-interface v1.14.1 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/pointerstructure v1.2.0 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect + github.com/moby/patternmatcher v0.6.0 // indirect + github.com/moby/spdystream v0.4.0 // indirect + github.com/moby/sys/sequential v0.6.0 // indirect + github.com/moby/sys/user v0.3.0 // indirect + github.com/moby/sys/userns v0.1.0 // indirect + github.com/moby/term v0.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect + github.com/montanaflynn/stats v0.7.1 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1 // indirect + github.com/mr-tron/base58 v1.2.0 // indirect + github.com/mtibben/percent v0.2.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect + github.com/oklog/run v1.1.0 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/onsi/ginkgo/v2 v2.20.1 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0 // indirect + github.com/otiai10/copy v1.14.0 // indirect + github.com/patrickmn/go-cache v2.1.0+incompatible // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/peterbourgon/diskv v2.0.1+incompatible // indirect + github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/pion/dtls/v2 v2.2.7 // indirect + github.com/pion/logging v0.2.2 // indirect + github.com/pion/stun/v2 v2.0.0 // indirect + github.com/pion/transport/v2 v2.2.1 // indirect + github.com/pion/transport/v3 v3.0.1 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/pressly/goose/v3 v3.21.1 // indirect + github.com/prometheus/client_golang v1.20.5 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.60.1 // indirect + github.com/prometheus/procfs v0.15.1 // 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 + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/ryanuber/go-glob v1.0.0 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sanity-io/litter v1.5.5 // indirect + github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect + github.com/sasha-s/go-deadlock v0.3.5 // indirect + github.com/scylladb/go-reflectx v1.0.1 // indirect + github.com/sethvargo/go-retry v0.2.4 // indirect + github.com/shirou/gopsutil v3.21.11+incompatible // indirect + github.com/shirou/gopsutil/v3 v3.24.3 // indirect + github.com/shoenig/go-m1cpu v0.1.6 // indirect + github.com/shopspring/decimal v1.4.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect + github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 // indirect + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect + github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea // indirect + github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect + github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect + github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect + github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb // indirect + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 // indirect + github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 // indirect + github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect + github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect + github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect + github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a // indirect + github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect + github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 // indirect + github.com/smartcontractkit/mcms v0.10.0 // indirect + github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect + github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de // indirect + github.com/smartcontractkit/wsrpc v0.8.3 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.7.1 // indirect + github.com/spf13/cobra v1.8.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.19.0 // indirect + github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/supranational/blst v0.3.13 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect + github.com/tendermint/go-amino v0.16.0 // indirect + github.com/testcontainers/testcontainers-go v0.35.0 // indirect + github.com/theodesp/go-heaps v0.0.0-20190520121037-88e35354fe0a // indirect + github.com/tidwall/gjson v1.18.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.1 // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + github.com/urfave/cli/v2 v2.27.5 // indirect + github.com/vektah/gqlparser/v2 v2.5.11 // indirect + github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect + github.com/x448/float16 v0.8.4 // indirect + github.com/xlab/treeprint v1.2.0 // indirect + github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + github.com/zeebo/xxh3 v1.0.2 // indirect + github.com/zondax/hid v0.9.2 // indirect + github.com/zondax/ledger-go v0.14.3 // indirect + go.dedis.ch/fixbuf v1.0.3 // indirect + go.dedis.ch/kyber/v3 v3.1.0 // indirect + go.etcd.io/bbolt v1.3.9 // indirect + go.mongodb.org/mongo-driver v1.15.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect + go.opentelemetry.io/otel v1.31.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 // indirect + go.opentelemetry.io/otel/log v0.6.0 // indirect + go.opentelemetry.io/otel/metric v1.31.0 // indirect + go.opentelemetry.io/otel/sdk v1.31.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.6.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.31.0 // indirect + go.opentelemetry.io/otel/trace v1.31.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/ratelimit v0.3.1 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/arch v0.11.0 // indirect + golang.org/x/crypto v0.32.0 // indirect + golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.34.0 // indirect + golang.org/x/oauth2 v0.23.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.29.0 // indirect + golang.org/x/term v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/time v0.7.0 // indirect + golang.org/x/tools v0.29.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/grpc v1.67.1 // indirect + google.golang.org/protobuf v1.36.4 // indirect + gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect + gopkg.in/guregu/null.v4 v4.0.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // 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 + k8s.io/api v0.31.2 // indirect + k8s.io/apiextensions-apiserver v0.31.0 // indirect + k8s.io/apimachinery v0.31.2 // indirect + k8s.io/cli-runtime v0.31.2 // indirect + k8s.io/client-go v0.31.2 // indirect + k8s.io/component-base v0.31.2 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f // indirect + k8s.io/kubectl v0.31.2 // indirect + k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect + pgregory.net/rapid v1.1.0 // indirect + rsc.io/tmplfunc v0.0.3 // indirect + sigs.k8s.io/controller-runtime v0.19.0 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/kustomize/api v0.17.2 // indirect + sigs.k8s.io/kustomize/kyaml v0.17.1 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) + +replace ( + // geth wants v2.3.4 but that is incompatible with github.com/cometbft/cometbft v0.37.5 which when bumped is incompatible with github.com/cosmos/cosmos-sdk + // This line can be removed after these imports are bumped or removed. + github.com/btcsuite/btcd/btcec/v2 => github.com/btcsuite/btcd/btcec/v2 v2.3.2 + // replicating the replace directive on cosmos SDK + github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 + + github.com/sourcegraph/sourcegraph/lib => github.com/sourcegraph/sourcegraph-public-snapshot/lib v0.0.0-20240822153003-c864f15af264 +) diff --git a/system-tests/tests/go.sum b/system-tests/tests/go.sum new file mode 100644 index 00000000000..6520f93d14b --- /dev/null +++ b/system-tests/tests/go.sum @@ -0,0 +1,1956 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cosmossdk.io/api v0.3.1 h1:NNiOclKRR0AOlO4KIqeaG6PS6kswOMhHD0ir0SscNXE= +cosmossdk.io/api v0.3.1/go.mod h1:DfHfMkiNA2Uhy8fj0JJlOCYOBp4eWUUJ1te5zBGNyIw= +cosmossdk.io/core v0.5.1 h1:vQVtFrIYOQJDV3f7rw4pjjVqc1id4+mE0L9hHP66pyI= +cosmossdk.io/core v0.5.1/go.mod h1:KZtwHCLjcFuo0nmDc24Xy6CRNEL9Vl/MeimQ2aC7NLE= +cosmossdk.io/depinject v1.0.0-alpha.4 h1:PLNp8ZYAMPTUKyG9IK2hsbciDWqna2z1Wsl98okJopc= +cosmossdk.io/depinject v1.0.0-alpha.4/go.mod h1:HeDk7IkR5ckZ3lMGs/o91AVUc7E596vMaOmslGFM3yU= +cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= +cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= +cosmossdk.io/math v1.3.0 h1:RC+jryuKeytIiictDslBP9i1fhkVm6ZDmZEoNP316zE= +cosmossdk.io/math v1.3.0/go.mod h1:vnRTxewy+M7BtXBNFybkuhSH4WfedVAAnERHgVFhp3k= +dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= +dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= +github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= +github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= +github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AlekSi/pointer v1.1.0 h1:SSDMPcXD9jSl8FPy9cRzoRaMJtm9g9ggGTxecRUbQoI= +github.com/AlekSi/pointer v1.1.0/go.mod h1:y7BvfRI3wXPWKXEBhU71nbnIEEZX0QTSB2Bj48UJIZE= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8= +github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM= +github.com/ChainSafe/go-schnorrkel v1.0.0/go.mod h1:dpzHYVxLZcp8pjlV+O+UR8K0Hp/z7vcchBSbMBEhCw4= +github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= +github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Depado/ginprom v1.8.0 h1:zaaibRLNI1dMiiuj1MKzatm8qrcHzikMlCc1anqOdyo= +github.com/Depado/ginprom v1.8.0/go.mod h1:XBaKzeNBqPF4vxJpNLincSQZeMDnZp1tIbU0FU0UKgg= +github.com/Khan/genqlient v0.7.0 h1:GZ1meyRnzcDTK48EjqB8t3bcfYvHArCUUvgOwpz1D4w= +github.com/Khan/genqlient v0.7.0/go.mod h1:HNyy3wZvuYwmW3Y7mkoQLZsa/R5n5yIRajS1kPBvSFM= +github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= +github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= +github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/NethermindEth/juno v0.3.1 h1:AW72LiAm9gqUeCVJWvepnZcTnpU4Vkl0KzPMxS+42FA= +github.com/NethermindEth/juno v0.3.1/go.mod h1:SGbTpgGaCsxhFsKOid7Ylnz//WZ8swtILk+NbHGsk/Q= +github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb h1:Mv8SscePPyw2ju4igIJAjFgcq5zCQfjgbz53DwYu5mc= +github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb/go.mod h1:gQkhWpAs9/QR6reZU2xoi1UIYlMS64FLTlh9CrgHH/Y= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= +github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= +github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/XSAM/otelsql v0.29.0 h1:pEw9YXXs8ZrGRYfDc0cmArIz9lci5b42gmP5+tA1Huc= +github.com/XSAM/otelsql v0.29.0/go.mod h1:d3/0xGIGC5RVEE+Ld7KotwaLy6zDeaF3fLJHOPpdN2w= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= +github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA= +github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow-go/v18 v18.0.0 h1:1dBDaSbH3LtulTyOVYaBCHO3yVRwjV+TZaqn3g6V7ZM= +github.com/apache/arrow-go/v18 v18.0.0/go.mod h1:t6+cWRSmKgdQ6HsxisQjok+jBpKGhRDiqcf3p0p/F+A= +github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= +github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= +github.com/aptos-labs/aptos-go-sdk v1.5.0 h1:QMdYmeqMb/kc/tuKhLiXq4SpJtLLFIaEDLHx0Peg2iU= +github.com/aptos-labs/aptos-go-sdk v1.5.0/go.mod h1:BgddSKFtfWFLK+no8l+AwCcb/Lh1lv74ybYLzeonloo= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c h1:cxQVoh6kY+c4b0HUchHjGWBI8288VhH50qxKG3hdEg0= +github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c/go.mod h1:3XzxudkrYVUvbduN/uI2fl4lSrMSzU0+3RCu2mpnfx8= +github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0= +github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= +github.com/avast/retry-go/v4 v4.6.0 h1:K9xNA+KeB8HHc2aWFuLb25Offp+0iVRXEvFx8IinRJA= +github.com/avast/retry-go/v4 v4.6.0/go.mod h1:gvWlPhBVsvBbLkVGDg/KwvBv0bEkCOLRRSHKIr2PyOE= +github.com/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= +github.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= +github.com/aws/aws-sdk-go v1.54.19 h1:tyWV+07jagrNiCcGRzRhdtVjQs7Vy41NwsuOcl0IbVI= +github.com/aws/aws-sdk-go v1.54.19/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v1.32.2 h1:AkNLZEyYMLnx/Q/mSKkcMqwNFXMAvFto9bNsHqcTduI= +github.com/aws/aws-sdk-go-v2 v1.32.2/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= +github.com/aws/aws-sdk-go-v2/config v1.28.0 h1:FosVYWcqEtWNxHn8gB/Vs6jOlNwSoyOCA/g/sxyySOQ= +github.com/aws/aws-sdk-go-v2/config v1.28.0/go.mod h1:pYhbtvg1siOOg8h5an77rXle9tVG8T+BWLWAo7cOukc= +github.com/aws/aws-sdk-go-v2/credentials v1.17.41 h1:7gXo+Axmp+R4Z+AK8YFQO0ZV3L0gizGINCOWxSLY9W8= +github.com/aws/aws-sdk-go-v2/credentials v1.17.41/go.mod h1:u4Eb8d3394YLubphT4jLEwN1rLNq2wFOlT6OuxFwPzU= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.17 h1:TMH3f/SCAWdNtXXVPPu5D6wrr4G5hI1rAxbcocKfC7Q= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.17/go.mod h1:1ZRXLdTpzdJb9fwTMXiLipENRxkGMTn1sfKexGllQCw= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21 h1:UAsR3xA31QGf79WzpG/ixT9FZvQlh5HY1NRqSHBNOCk= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21/go.mod h1:JNr43NFf5L9YaG3eKTm7HQzls9J+A9YYcGI5Quh1r2Y= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21 h1:6jZVETqmYCadGFvrYEQfC5fAQmlo80CeL5psbno6r0s= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21/go.mod h1:1SR0GbLlnN3QUmYaflZNiH1ql+1qrSiB2vwcJ+4UM60= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 h1:TToQNkvGguu209puTojY/ozlqy2d/SFNcoLIqTFi42g= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0/go.mod h1:0jp+ltwkf+SwG2fm/PKo8t4y8pJSgOCO4D8Lz3k0aHQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.2 h1:s7NA1SOw8q/5c0wr8477yOPp0z+uBaXBnLE0XYb0POA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.2/go.mod h1:fnjjWyAW/Pj5HYOxl9LJqWtEwS7W2qgcRLWP+uWbss0= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.2 h1:Rrqru2wYkKQCS2IM5/JrgKUQIoNTqA6y/iuxkjzxC6M= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.2/go.mod h1:QuCURO98Sqee2AXmqDNxKXYFm2OEDAVAPApMqO0Vqnc= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.2 h1:bSYXVyUzoTHoKalBmwaZxs97HU9DWWI3ehHSAMa7xOk= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.2/go.mod h1:skMqY7JElusiOUjMJMOv1jJsP7YUg7DrhgqZZWuzu1U= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.2 h1:AhmO1fHINP9vFYUE0LHzCWg/LfUWUF+zFPEcY9QXb7o= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.2/go.mod h1:o8aQygT2+MVP0NaV6kbdE1YnnIM8RRVQzoeUH45GOdI= +github.com/aws/aws-sdk-go-v2/service/sts v1.32.2 h1:CiS7i0+FUe+/YY1GvIBLLrR/XNGZ4CtM1Ll0XavNuVo= +github.com/aws/aws-sdk-go-v2/service/sts v1.32.2/go.mod h1:HtaiBI8CjYoNVde8arShXb94UbQQi9L4EMr6D+xGBwo= +github.com/aws/constructs-go/constructs/v10 v10.4.2 h1:+hDLTsFGLJmKIn0Dg20vWpKBrVnFrEWYgTEY5UiTEG8= +github.com/aws/constructs-go/constructs/v10 v10.4.2/go.mod h1:cXsNCKDV+9eR9zYYfwy6QuE4uPFp6jsq6TtH1MwBx9w= +github.com/aws/jsii-runtime-go v1.104.0 h1:651Sh6J2FtatfnVzlOQ3/Ye1WWPAseZ6E/tSQxEKdSI= +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/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 h1:WWB576BN5zNSZc/M9d/10pqEx5VHNhaQ/yOVAkmj5Yo= +github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= +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= +github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df/go.mod h1:hiVxq5OP2bUGBRNS3Z/bt/reCLFNbdcST6gISi1fiOM= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= +github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2gVpmOtVTJZNodLdLQLn/KsJqFvXwnd/s= +github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bits-and-blooms/bitset v1.17.0 h1:1X2TS7aHz1ELcC0yU1y2stUs/0ig5oMU6STFZGrhvHI= +github.com/bits-and-blooms/bitset v1.17.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= +github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= +github.com/block-vision/sui-go-sdk v1.0.6 h1:FysCc4TJC8v4BEBbCjJPDR4iR5eKqJT1dxGwsT67etg= +github.com/block-vision/sui-go-sdk v1.0.6/go.mod h1:FyK1vGE8lWm9QA1fdQpf1agfXQSMbPT8AV1BICgx6d8= +github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8= +github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= +github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= +github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= +github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129 h1:gfAMKE626QEuKG3si0pdTRcr/YEbBoxY+3GOH3gWvl4= +github.com/buger/goterm v0.0.0-20200322175922-2f3e71b85129/go.mod h1:u9UyCz2eTrSGy6fbupqJ54eY5c4IC8gREQ1053dK12U= +github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/bxcodec/faker v2.0.1+incompatible h1:P0KUpUw5w6WJXwrPfv35oc91i4d8nf40Nwln+M/+faA= +github.com/bxcodec/faker v2.0.1+incompatible/go.mod h1:BNzfpVdTwnFJ6GtfYTcQu6l6rHShT+veBxNCnjCx5XM= +github.com/bytecodealliance/wasmtime-go/v28 v28.0.0 h1:aBU8cexP2rPZ0Qz488kvn2NXvWZHL2aG1/+n7Iv+xGc= +github.com/bytecodealliance/wasmtime-go/v28 v28.0.0/go.mod h1:4OCU0xAW9ycwtX4nMF4zxwgJBJ5/0eMfJiHB0wAmkV4= +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/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5 h1:rvc39Ol6z3MvaBzXkxFC6Nfsnixq/dRypushKDd7Nc0= +github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5/go.mod h1:R/pdNYDYFQk+tuuOo7QES1kkv6OLmp5ze2XBZQIVffM= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= +github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk= +github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= +github.com/chaos-mesh/chaos-mesh/api v0.0.0-20240821051457-da69c6d9617a h1:6Pg3a6j/41QDzH/oYcMLwwKsf3x/HXcu9W/dBaf2Hzs= +github.com/chaos-mesh/chaos-mesh/api v0.0.0-20240821051457-da69c6d9617a/go.mod h1:x11iCbZV6hzzSQWMq610B6Wl5Lg1dhwqcVfeiWQQnQQ= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= +github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/coder/websocket v1.8.12 h1:5bUXkEPPIbewrnkU8LTCLVaxi4N4J8ahufH2vlo4NAo= +github.com/coder/websocket v1.8.12/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs= +github.com/cometbft/cometbft v0.37.5 h1:/U/TlgMh4NdnXNo+YU9T2NMCWyhXNDF34Mx582jlvq0= +github.com/cometbft/cometbft v0.37.5/go.mod h1:QC+mU0lBhKn8r9qvmnq53Dmf3DWBt4VtkcKw2C81wxY= +github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= +github.com/cometbft/cometbft-db v0.8.0/go.mod h1:6ASCP4pfhmrCBpfk01/9E1SI29nD3HfVHrY4PG8x5c0= +github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= +github.com/confio/ics23/go v0.9.0/go.mod h1:4LPZ2NYqnYIVRklaozjNR1FScgDJ2s5Xrp+e/mYVRak= +github.com/confluentinc/confluent-kafka-go/v2 v2.3.0 h1:icCHutJouWlQREayFwCc7lxDAhws08td+W3/gdqgZts= +github.com/confluentinc/confluent-kafka-go/v2 v2.3.0/go.mod h1:/VTy8iEpe6mD9pkCH5BhijlUl8ulUXymKv1Qig5Rgb8= +github.com/consensys/bavard v0.1.22 h1:Uw2CGvbXSZWhqK59X0VG/zOjpTFuOMcPLStrp1ihI0A= +github.com/consensys/bavard v0.1.22/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= +github.com/consensys/gnark-crypto v0.14.0 h1:DDBdl4HaBtdQsq/wfMwJvZNE80sHidrK3Nfrefatm0E= +github.com/consensys/gnark-crypto v0.14.0/go.mod h1:CU4UijNPsHawiVGNxe9co07FkzCeWHHrb1li/n1XoU0= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= +github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= +github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA= +github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= +github.com/cosmos/cosmos-sdk v0.47.11 h1:0Qx7eORw0RJqPv+mvDuU8NQ1LV3nJJKJnPoYblWHolc= +github.com/cosmos/cosmos-sdk v0.47.11/go.mod h1:ADjORYzUQqQv/FxDi0H0K5gW/rAk1CiDR3ZKsExfJV0= +github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= +github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= +github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= +github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= +github.com/cosmos/gogogateway v1.2.0/go.mod h1:iQpLkGWxYcnCdz5iAdLcRBSw3h7NXeOkZ4GUkT+tbFI= +github.com/cosmos/gogoproto v1.4.11 h1:LZcMHrx4FjUgrqQSWeaGC1v/TeuVFqSLa43CC6aWR2g= +github.com/cosmos/gogoproto v1.4.11/go.mod h1:/g39Mh8m17X8Q/GDEs5zYTSNaNnInBSohtaxzQnYq1Y= +github.com/cosmos/iavl v0.20.1 h1:rM1kqeG3/HBT85vsZdoSNsehciqUQPWrR4BYmqE2+zg= +github.com/cosmos/iavl v0.20.1/go.mod h1:WO7FyvaZJoH65+HFOsDir7xU9FWk2w9cHXNW1XHcl7A= +github.com/cosmos/ledger-cosmos-go v0.12.4 h1:drvWt+GJP7Aiw550yeb3ON/zsrgW0jgh5saFCr7pDnw= +github.com/cosmos/ledger-cosmos-go v0.12.4/go.mod h1:fjfVWRf++Xkygt9wzCsjEBdjcf7wiiY35fv3ctT+k4M= +github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= +github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= +github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg= +github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwzHBvIzm2RfVCGNEBZgRyjwK40bVoun3ZnGOCafNM= +github.com/crate-crypto/go-kzg-4844 v1.1.0 h1:EN/u9k2TF6OWSHrCCDBBU6GLNMq88OspHHlMnHfoyU4= +github.com/crate-crypto/go-kzg-4844 v1.1.0/go.mod h1:JolLjpSff1tCCJKaJx4psrlEdlXuJEC996PL3tTAFks= +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.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= +github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/cucumber/gherkin/go/v26 v26.2.0 h1:EgIjePLWiPeslwIWmNQ3XHcypPsWAHoMCz/YEBKP4GI= +github.com/cucumber/gherkin/go/v26 v26.2.0/go.mod h1:t2GAPnB8maCT4lkHL99BDCVNzCh1d7dBhCLt150Nr/0= +github.com/cucumber/godog v0.15.0 h1:51AL8lBXF3f0cyA5CV4TnJFCTHpgiy+1x1Hb3TtZUmo= +github.com/cucumber/godog v0.15.0/go.mod h1:FX3rzIDybWABU4kuIXLZ/qtqEe1Ac5RdXmqvACJOces= +github.com/cucumber/messages/go/v21 v21.0.1 h1:wzA0LxwjlWQYZd32VTlAVDTkW6inOFmSM+RuOwHZiMI= +github.com/cucumber/messages/go/v21 v21.0.1/go.mod h1:zheH/2HS9JLVFukdrsPWoPdmUtmYQAQPLk7w5vWsk5s= +github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= +github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= +github.com/danielkov/gin-helmet v0.0.0-20171108135313-1387e224435e h1:5jVSh2l/ho6ajWhSPNN84eHEdq3dp0T7+f6r3Tc6hsk= +github.com/danielkov/gin-helmet v0.0.0-20171108135313-1387e224435e/go.mod h1:IJgIiGUARc4aOr4bOQ85klmjsShkEEfiRc6q/yBSfo8= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= +github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= +github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dominikbraun/graph v0.23.0 h1:TdZB4pPqCLFxYhdyMFb1TBdFxp8XLcJfTTBQucVPgCo= +github.com/dominikbraun/graph v0.23.0/go.mod h1:yOjYyogZLY1LSG9E33JWZJiq5k83Qy2C6POAuiViluc= +github.com/doyensec/safeurl v0.2.1 h1:DY15JorEfQsnpBWhBkVQIkaif2jfxCC14PIuGDsjDVs= +github.com/doyensec/safeurl v0.2.1/go.mod h1:wzSXqC/6Z410qHz23jtBWT+wQ8yTxcY0p8bZH/4EZIg= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= +github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= +github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= +github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/esote/minmaxheap v1.0.0 h1:rgA7StnXXpZG6qlM0S7pUmEv1KpWe32rYT4x8J8ntaA= +github.com/esote/minmaxheap v1.0.0/go.mod h1:Ln8+i7fS1k3PLgZI2JAo0iA1as95QnIYiGCrqSJ5FZk= +github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= +github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.15.0 h1:LLb2jCPsbJZcB4INw+E/MgzUX5wlR6SdwXcv09/1ME4= +github.com/ethereum/go-ethereum v1.15.0/go.mod h1:4q+4t48P2C03sjqGvTXix5lEOplf5dz4CTosbjt5tGs= +github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= +github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= +github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= +github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= +github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= +github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= +github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8= +github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +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.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= +github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= +github.com/gagliardetto/binary v0.8.0 h1:U9ahc45v9HW0d15LoN++vIXSJyqR/pWw8DDlhd7zvxg= +github.com/gagliardetto/binary v0.8.0/go.mod h1:2tfj51g5o9dnvsc+fL3Jxr22MuWzYXwx9wEoN0XQ7/c= +github.com/gagliardetto/gofuzz v1.2.2 h1:XL/8qDMzcgvR4+CyRQW9UGdwPRPMHVJfqQ/uMvSUuQw= +github.com/gagliardetto/gofuzz v1.2.2/go.mod h1:bkH/3hYLZrMLbfYWA0pWzXmi5TTRZnu4pMGZBkqMKvY= +github.com/gagliardetto/hashsearch v0.0.0-20191005111333-09dd671e19f9/go.mod h1:513DXpQPzeRo7d4dsCP3xO3XI8hgvruMl9njxyQeraQ= +github.com/gagliardetto/solana-go v1.12.0 h1:rzsbilDPj6p+/DOPXBMLhwMZeBgeRuXjm5zQFCoXgsg= +github.com/gagliardetto/solana-go v1.12.0/go.mod h1:l/qqqIN6qJJPtxW/G1PF4JtcE3Zg2vD2EliZrr9Gn5k= +github.com/gagliardetto/treeout v0.1.4 h1:ozeYerrLCmCubo1TcIjFiOWTTGteOOHND1twdFpgwaw= +github.com/gagliardetto/treeout v0.1.4/go.mod h1:loUefvXTrlRG5rYmJmExNryyBRh8f89VZhmMOyCyqok= +github.com/gagliardetto/utilz v0.1.1 h1:/etW4hl607emKg6R6Lj9jRJ9d6ue2AQOyjhuAwjzs1U= +github.com/gagliardetto/utilz v0.1.1/go.mod h1:b+rGFkRHz3HWJD0RYMzat47JyvbTtpE0iEcYTRJTLLA= +github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813 h1:Uc+IZ7gYqAf/rSGFplbWBSHaGolEQlNLgMgSE3ccnIQ= +github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813/go.mod h1:P+oSoE9yhSRvsmYyZsshflcR6ePWYLql6UU1amW13IM= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw= +github.com/gin-contrib/cors v1.7.2/go.mod h1:SUJVARKgQ40dmrzgXEVxj2m7Ig1v1qIboQkPDTQ9t2E= +github.com/gin-contrib/expvar v0.0.1 h1:IuU5ArEgihz50vG8Onrwz22kJr7Mcvgv9xSSpfU5g+w= +github.com/gin-contrib/expvar v0.0.1/go.mod h1:8o2CznfQi1JjktORdHr2/abg3wSV6OCnXh0yGypvvVw= +github.com/gin-contrib/sessions v0.0.5 h1:CATtfHmLMQrMNpJRgzjWXD7worTh7g7ritsQfmF+0jE= +github.com/gin-contrib/sessions v0.0.5/go.mod h1:vYAuaUPqie3WUSsft6HUlCjlwwoJQs97miaG2+7neKY= +github.com/gin-contrib/size v0.0.0-20230212012657-e14a14094dc4 h1:Z9J0PVIt1PuibOShaOw1jH8hUYz+Ak8NLsR/GI0Hv5I= +github.com/gin-contrib/size v0.0.0-20230212012657-e14a14094dc4/go.mod h1:CEPcgZiz8998l9E8fDm16h8UfHRL7b+5oG0j/0koeVw= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-asn1-ber/asn1-ber v1.5.5 h1:MNHlNMBDgEKD4TcKr36vQN68BA00aDfjIt3/bD50WnA= +github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 h1:ymLjT4f35nQbASLnvxEde4XOBL+Sn7rFuV+FOJqkljg= +github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0/go.mod h1:6daplAwHHGbUGib4990V3Il26O0OC4aRyvewaaAihaA= +github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-ldap/ldap/v3 v3.4.6 h1:ert95MdbiG7aWo/oPYp9btL3KJlMPKnP58r09rI8T+A= +github.com/go-ldap/ldap/v3 v3.4.6/go.mod h1:IGMQANNtxpsOzj7uUAMjpGBaOVTC4DYyIy8VsTdxmtc= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +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.25.0 h1:5Dh7cjvzR7BRZadnsVOzPhWsrwUr0nmsZJxEAnFLNO8= +github.com/go-playground/validator/v10 v10.25.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= +github.com/go-resty/resty/v2 v2.15.3 h1:bqff+hcqAflpiF591hhJzNdkRsFhlB96CYfBwSFvql8= +github.com/go-resty/resty/v2 v2.15.3/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpGyP1XxdC/w= +github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-webauthn/webauthn v0.9.4 h1:YxvHSqgUyc5AK2pZbqkWWR55qKeDPhP8zLDr6lpIc2g= +github.com/go-webauthn/webauthn v0.9.4/go.mod h1:LqupCtzSef38FcxzaklmOn7AykGKhAhr9xlRbdbgnTw= +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/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= +github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= +github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= +github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= +github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= +github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU= +github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49/go.mod h1:BkkQ4L1KS1xMt2aWSPStnn55ChGC0DPOn2FQYj+f25M= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-github/v41 v41.0.0 h1:HseJrM2JFf2vfiZJ8anY2hqBjdfY1Vlj/K27ueww4gg= +github.com/google/go-github/v41 v41.0.0/go.mod h1:XgmCA5H323A9rtgExdTcnDkcqp6S30AVACCBDOonIxg= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/go-tpm v0.9.0 h1:sQF6YqWMi+SCXpsmS3fd21oPy/vSddwZry4JnmltHVk= +github.com/google/go-tpm v0.9.0/go.mod h1:FkNVkc6C+IsvDI9Jw1OveJmxGZUUaKxtrpOS47QWKfU= +github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= +github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= +github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= +github.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY= +github.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8LRvBeoNcQ= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grafana/pyroscope-go v1.1.2 h1:7vCfdORYQMCxIzI3NlYAs3FcBP760+gWuYWOyiVyYx8= +github.com/grafana/pyroscope-go v1.1.2/go.mod h1:HSSmHo2KRn6FasBA4vK7BMiQqyQq8KSuBKvrhkXxYPU= +github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= +github.com/grafana/pyroscope-go/godeltaprof v0.1.8/go.mod h1:2+l7K7twW49Ct4wFluZD3tZ6e0SjanjcUUBPVD/UuGU= +github.com/graph-gophers/dataloader v5.0.0+incompatible h1:R+yjsbrNq1Mo3aPG+Z/EKYrXrXXUNJHOgbRt+U6jOug= +github.com/graph-gophers/dataloader v5.0.0+incompatible/go.mod h1:jk4jk0c5ZISbKaMe8WsVopGB5/15GvGHMdMdPtwlRp4= +github.com/graph-gophers/graphql-go v1.5.0 h1:fDqblo50TEpD0LY7RXk/LFVYEVqo3+tXMNMPSVXA1yc= +github.com/graph-gophers/graphql-go v1.5.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= +github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= +github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= +github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/merlin v0.1.1 h1:eQ90iG7K9pOhtereWsmyRJ6RAwcP4tHTDBHXNg+u5is= +github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= +github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= +github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= +github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 h1:BpJ2o0OR5FV7vrkDYfXYVJQeMNWa8RhklZOpW2ITAIQ= +github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.16.1 h1:V8TxTnImoPD5cj0U9Spl0TUxcytjcbbJeADFF07KdHg= +github.com/hashicorp/consul/sdk v0.16.1/go.mod h1:fSXvwxB2hmh1FMZCNl6PwX0Q/1wdWtHJcZ7Ea5tns0s= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-envparse v0.1.0 h1:bE++6bhIsNCPLvgDZkYqo3nA+/PFI51pkrHdmPSDFPY= +github.com/hashicorp/go-envparse v0.1.0/go.mod h1:OHheN1GoygLlAkTlXLXvAdnXdZxy8JUweQ1rAXx1xnc= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8IoK3c= +github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-plugin v1.6.2 h1:zdGAEd0V1lCaU0u+MxWQhtSDQmahpkwOun8U8EiRVog= +github.com/hashicorp/go-plugin v1.6.2/go.mod h1:CkgLQ5CZqNmdL9U9JzM532t8ZiYQ35+pj3b1FD37R0Q= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= +github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hasura/go-graphql-client v0.13.1 h1:kKbjhxhpwz58usVl+Xvgah/TDha5K2akNTRQdsEHN6U= +github.com/hasura/go-graphql-client v0.13.1/go.mod h1:k7FF7h53C+hSNFRG3++DdVZWIuHdCaTbI7siTJ//zGQ= +github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= +github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA= +github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= +github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= +github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgtype v1.14.4 h1:fKuNiCumbKTAIxQwXfB/nsrnkEI6bPJrrSiMKgbJ2j8= +github.com/jackc/pgtype v1.14.4/go.mod h1:aKeozOde08iifGosdJpz9MBZonJOUJxqNpPBcMJTlVA= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.18.2/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= +github.com/jackc/pgx/v4 v4.18.3 h1:dE2/TrEsGX3RBprb3qryqSV9Y60iZN1C6i8IrmW9/BA= +github.com/jackc/pgx/v4 v4.18.3/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= +github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= +github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ= +github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= +github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52 h1:msKODTL1m0wigztaqILOtla9HeW1ciscYG4xjLtvk5I= +github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52/go.mod h1:qk1sX/IBgppQNcGCRoj90u6EGC056EBoIc1oEjCWla8= +github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= +github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4= +github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= +github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= +github.com/linkedin/goavro/v2 v2.12.0 h1:rIQQSj8jdAUlKQh6DttK8wCRv4t4QO09g1C4aBWXslg= +github.com/linkedin/goavro/v2 v2.12.0/go.mod h1:KXx+erlq+RPlGSPmLF7xGo6SAbh8sCQ53x064+ioxhk= +github.com/linxGnu/grocksdb v1.7.16 h1:Q2co1xrpdkr5Hx3Fp+f+f7fRGhQFQhvi/+226dtLmA8= +github.com/linxGnu/grocksdb v1.7.16/go.mod h1:JkS7pl5qWpGpuVb3bPqTz8nC12X3YtPZT+Xq7+QfQo4= +github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= +github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= +github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f h1:tVvGiZQFjOXP+9YyGqSA6jE55x1XVxmoPYudncxrZ8U= +github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f/go.mod h1:Z60vy0EZVSu0bOugCHdcN5ZxFMKSpjRgsnh0XKPFqqk= +github.com/marcboeker/go-duckdb v1.8.3 h1:ZkYwiIZhbYsT6MmJsZ3UPTHrTZccDdM4ztoqSlEMXiQ= +github.com/marcboeker/go-duckdb v1.8.3/go.mod h1:C9bYRE1dPYb1hhfu/SSomm78B0FXmNgRvv6YBW/Hooc= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +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.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= +github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= +github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= +github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= +github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= +github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= +github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/spdystream v0.4.0 h1:Vy79D6mHeJJjiPdFEL2yku1kl0chZpJfZcPpb16BRl8= +github.com/moby/spdystream v0.4.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= +github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= +github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= +github.com/moby/sys/user v0.3.0 h1:9ni5DlcW5an3SvRSx4MouotOygvzaXbaSrc/wGDFWPo= +github.com/moby/sys/user v0.3.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= +github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1 h1:mPMvm6X6tf4w8y7j9YIt6V9jfWhL6QlbEc7CCmeQlWk= +github.com/mostynb/zstdpool-freelist v0.0.0-20201229113212-927304c0c3b1/go.mod h1:ye2e/VUEtE2BHE+G/QcKkcLQVAEJoYRFj5VUOQatCRE= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +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/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-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= +github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/ginkgo/v2 v2.20.1 h1:YlVIbqct+ZmnEph770q9Q7NVAz4wwIiVNahee6JyUzo= +github.com/onsi/ginkgo/v2 v2.20.1/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= +github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= +github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks= +github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= +github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= +github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= +github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= +github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0= +github.com/pion/stun/v2 v2.0.0/go.mod h1:22qRSh08fSEttYUmJZGlriq9+03jtVmXNODgLccj8GQ= +github.com/pion/transport/v2 v2.2.1 h1:7qYnCBlpgSJNYMbLCKuSY9KbQdBFoETvPNETv0y4N7c= +github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= +github.com/pion/transport/v3 v3.0.1 h1:gDTlPJwROfSfz6QfSi0ZmeCSkFcnWWiiR9ES0ouANiM= +github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/pressly/goose/v3 v3.21.1 h1:5SSAKKWej8LVVzNLuT6KIvP1eFDuPvxa+B6H0w78buQ= +github.com/pressly/goose/v3 v3.21.1/go.mod h1:sqthmzV8PitchEkjecFJII//l43dLOCzfWh8pHEe+vE= +github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= +github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= +github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ= +github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +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/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/riferrei/srclient v0.5.4 h1:dfwyR5u23QF7beuVl2WemUY2KXh5+Sc4DHKyPXBNYuc= +github.com/riferrei/srclient v0.5.4/go.mod h1:vbkLmWcgYa7JgfPvuy/+K8fTS0p1bApqadxrxi/S1MI= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +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 v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= +github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= +github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo= +github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= +github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= +github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/scylladb/go-reflectx v1.0.1 h1:b917wZM7189pZdlND9PbIJ6NQxfDPfBvUaQ7cjj1iZQ= +github.com/scylladb/go-reflectx v1.0.1/go.mod h1:rWnOfDIRWBGN0miMLIcoPt/Dhi2doCMZqwMCJ3KupFc= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sethvargo/go-retry v0.2.4 h1:T+jHEQy/zKJf5s95UkguisicE0zuF9y7+/vgz08Ocec= +github.com/sethvargo/go-retry v0.2.4/go.mod h1:1afjQuvh7s4gflMObvjLPaWgluLLyhA1wmVZ6KLpICw= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/gopsutil/v3 v3.24.3 h1:eoUGJSmdfLzJ3mxIhmOAhgKEKgQkeOwKpz1NbhVnuPE= +github.com/shirou/gopsutil/v3 v3.24.3/go.mod h1:JpND7O217xa72ewWz9zN2eIIkPWsDN/3pl0H8Qt0uwg= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartcontractkit/ccip-owner-contracts v0.1.0 h1:GiBDtlx7539o7AKlDV+9LsA7vTMPv+0n7ClhSFnZFAk= +github.com/smartcontractkit/ccip-owner-contracts v0.1.0/go.mod h1:NnT6w4Kj42OFFXhSx99LvJZWPpMjmo4+CpDEWfw61xY= +github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0DF25d3mh+vsYeZQiSCE= +github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= +github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= +github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= +github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= +github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= +github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= +github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= +github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= +github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 h1:3icYNFldKQbs6Qrfai2LE+tKbNcE4tfgPRELF30mnEA= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02/go.mod h1:7DbPnG0E39eZaX1CXKxRiJ1NOWHwTZYDWR9ys3kZZuU= +github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 h1:hfMRj2ny6oNHd8w1rhJHdoX3YkoWJtCkBK6wTlCE4+c= +github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= +github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= +github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= +github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 h1:L6KJ4kGv/yNNoCk8affk7Y1vAY0qglPMXC/hevV/IsA= +github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6/go.mod h1:FRwzI3hGj4CJclNS733gfcffmqQ62ONCkbGi49s658w= +github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= +github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a h1:C+XavZQ0rBOpOrh45LUhdOsvtI8OQ0XZKI5pi+GP6h4= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a/go.mod h1:aFm1QC/n99mVeBDtv0SE0co56+IECY6Y1fR3OfNYy3c= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.4 h1:8R/xyOh/SaifOhhmOYNB3uv3sUzKeshILtVCqRgv7ck= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.4/go.mod h1:fAmPov5WZg2WjTRoUrz7fzcvD9b77ZOw5yPwJXI2IOE= +github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.23 h1:gji906uw6vkSPXUUBoRuFeeL/93l4YYZAQY4G03R1RM= +github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.23/go.mod h1:70JLBXQncNHyW63ik4PvPQGjQGZ1xK67MKrDanVAk2w= +github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 h1:Yf+n3T/fnUWcYyfe7bsygV4sWAkNo0QhN58APJFIKIc= +github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10/go.mod h1:05duR85P8YHuIfIkA7sn2bvrhKo/pDpFKV2rliYHNOo= +github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs= +github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= +github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg= +github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM= +github.com/smartcontractkit/mcms v0.10.0 h1:wkBAr8HLyHKwejdwsDOMvIwmzT83tKr3jjB9senLahM= +github.com/smartcontractkit/mcms v0.10.0/go.mod h1:3N7+yvkO3hIFXYRYm3hxKCE6qDWdOC/rZdvIrwzlLKk= +github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de h1:n0w0rKF+SVM+S3WNlup6uabXj2zFlFNfrlsKCMMb/co= +github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de/go.mod h1:Sl2MF/Fp3fgJIVzhdGhmZZX2BlnM0oUUyBP4s4xYb6o= +github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de h1:66VQxXx3lvTaAZrMBkIcdH9VEjujUEvmBQdnyOJnkOc= +github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de/go.mod h1:NSc7hgOQbXG3DAwkOdWnZzLTZENXSwDJ7Va1nBp0YU0= +github.com/smartcontractkit/wsrpc v0.8.3 h1:9tDf7Ut61g36RJIyxV9iI73SqoOMasKPfURV9oMLrPg= +github.com/smartcontractkit/wsrpc v0.8.3/go.mod h1:2u/wfnhl5R4RlSXseN4n6HHIWk8w1Am3AT6gWftQbNg= +github.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 h1:RN5mrigyirb8anBEtdjtHFIufXdacyTi6i4KBfeNXeo= +github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091/go.mod h1:VlduQ80JcGJSargkRU4Sg9Xo63wZD/l8A5NC/Uo1/uU= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/supranational/blst v0.3.13 h1:AYeSxdOMacwu7FBmpfloBz5pbFXDmJL33RuwnKtmTjk= +github.com/supranational/blst v0.3.13/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= +github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= +github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= +github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= +github.com/testcontainers/testcontainers-go v0.35.0 h1:uADsZpTKFAtp8SLK+hMwSaa+X+JiERHtd4sQAFmXeMo= +github.com/testcontainers/testcontainers-go v0.35.0/go.mod h1:oEVBj5zrfJTrgjwONs1SsRbnBtH9OKl+IGl3UMcr2B4= +github.com/theodesp/go-heaps v0.0.0-20190520121037-88e35354fe0a h1:YuO+afVc3eqrjiCUizNCxI53bl/BnPiVwXqLzqYTqgU= +github.com/theodesp/go-heaps v0.0.0-20190520121037-88e35354fe0a/go.mod h1:/sfW47zCZp9FrtGcWyo1VjbgDaodxX9ovZvgLb/MxaA= +github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= +github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/ulule/limiter/v3 v3.11.2 h1:P4yOrxoEMJbOTfRJR2OzjL90oflzYPPmWg+dvwN2tHA= +github.com/ulule/limiter/v3 v3.11.2/go.mod h1:QG5GnFOCV+k7lrL5Y8kgEeeflPH3+Cviqlqa8SVSQxI= +github.com/umbracle/ethgo v0.1.3 h1:s8D7Rmphnt71zuqrgsGTMS5gTNbueGO1zKLh7qsFzTM= +github.com/umbracle/ethgo v0.1.3/go.mod h1:g9zclCLixH8liBI27Py82klDkW7Oo33AxUOr+M9lzrU= +github.com/umbracle/fastrlp v0.0.0-20220527094140-59d5dd30e722 h1:10Nbw6cACsnQm7r34zlpJky+IzxVLRk6MKTS2d3Vp0E= +github.com/umbracle/fastrlp v0.0.0-20220527094140-59d5dd30e722/go.mod h1:c8J0h9aULj2i3umrfyestM6jCq0LK0U6ly6bWy96nd4= +github.com/unrolled/secure v1.13.0 h1:sdr3Phw2+f8Px8HE5sd1EHdj1aV3yUwed/uZXChLFsk= +github.com/unrolled/secure v1.13.0/go.mod h1:BmF5hyM6tXczk3MpQkFf1hpKSRqCyhqcbiQtiAF7+40= +github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk= +github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= +github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w= +github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= +github.com/valyala/fastjson v1.4.1 h1:hrltpHpIpkaxll8QltMU8c3QZ5+qIiCL8yKqPFJI/yE= +github.com/valyala/fastjson v1.4.1/go.mod h1:nV6MsjxL2IMJQUoHDIrjEI7oLyeqK6aBD7EFWPsvP8o= +github.com/vektah/gqlparser/v2 v2.5.11 h1:JJxLtXIoN7+3x6MBdtIP59TP1RANnY7pXOaDnADQSf8= +github.com/vektah/gqlparser/v2 v2.5.11/go.mod h1:1rCcfwB2ekJofmluGWXMSEnPMZgbxzwj6FaZ/4OT8Cc= +github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= +github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= +github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= +github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= +github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= +github.com/zondax/ledger-go v0.14.3/go.mod h1:IKKaoxupuB43g4NxeQmbLXv7T9AlQyie1UpHb342ycI= +go.dedis.ch/fixbuf v1.0.3 h1:hGcV9Cd/znUxlusJ64eAlExS+5cJDIyTyEG+otu5wQs= +go.dedis.ch/fixbuf v1.0.3/go.mod h1:yzJMt34Wa5xD37V5RTdmp38cz3QhMagdGoem9anUalw= +go.dedis.ch/kyber/v3 v3.0.4/go.mod h1:OzvaEnPvKlyrWyp3kGXlFdp7ap1VC6RkZDTaPikqhsQ= +go.dedis.ch/kyber/v3 v3.0.9/go.mod h1:rhNjUUg6ahf8HEg5HUvVBYoWY4boAafX8tYxX+PS+qg= +go.dedis.ch/kyber/v3 v3.1.0 h1:ghu+kiRgM5JyD9TJ0hTIxTLQlJBR/ehjWvWwYW3XsC0= +go.dedis.ch/kyber/v3 v3.1.0/go.mod h1:kXy7p3STAurkADD+/aZcsznZGKVHEqbtmdIzvPfrs1U= +go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= +go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= +go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= +go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= +go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= +go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0 h1:1f31+6grJmV3X4lxcEvUy13i5/kfDw1nJZwhd8mA4tg= +go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0/go.mod h1:1P/02zM3OwkX9uki+Wmxw3a5GVb6KUXRsa7m7bOC9Fg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 h1:UiRNKd1OgqsLbFwE+wkAWTdiAxXtCBqKIHeBIse4FUA= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9/go.mod h1:eqZlW3pJWhjyexnDPrdQxix1pn0wwhI4AO4GKpP/bMI= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 h1:QSKmLBzbFULSyHzOdO9JsN9lpE4zkrz1byYGmJecdVE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0/go.mod h1:sTQ/NH8Yrirf0sJ5rWqVu+oT82i4zL9FaF6rWcqnptM= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0/go.mod h1:yeGZANgEcpdx/WK0IvvRFC+2oLiMS2u4L/0Rj2M2Qr0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 h1:VrMAbeJz4gnVDg2zEzjHG4dEH86j4jO6VYB+NgtGD8s= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0/go.mod h1:qqN/uFdpeitTvm+JDqqnjm517pmQRYxTORbETHq5tOc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 h1:0MH3f8lZrflbUWXVxyBg/zviDFdGE062uKh5+fu8Vv0= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0/go.mod h1:Vh68vYiHY5mPdekTr0ox0sALsqjoVy0w3Os278yX5SQ= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 h1:BJee2iLkfRfl9lc7aFmBwkWxY/RI1RDdXepSF6y8TPE= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0/go.mod h1:DIzlHs3DRscCIBU3Y9YSzPfScwnYnzfnCd4g8zA7bZc= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= +go.opentelemetry.io/otel/log v0.6.0 h1:nH66tr+dmEgW5y+F9LanGJUBYPrRgP4g2EkmPE3LeK8= +go.opentelemetry.io/otel/log v0.6.0/go.mod h1:KdySypjQHhP069JX0z/t26VHwa8vSwzgaKmXtIB3fJM= +go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= +go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= +go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= +go.opentelemetry.io/otel/sdk/log v0.6.0 h1:4J8BwXY4EeDE9Mowg+CyhWVBhTSLXVXodiXxS/+PGqI= +go.opentelemetry.io/otel/sdk/log v0.6.0/go.mod h1:L1DN8RMAduKkrwRAFDEX3E3TLOq46+XMGSbUfHU/+vE= +go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= +go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= +go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= +go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/ratelimit v0.3.1 h1:K4qVE+byfv/B3tC+4nYWP7v/6SimcO7HzHekoMNBma0= +go.uber.org/ratelimit v0.3.1/go.mod h1:6euWsTB6U/Nb3X++xEUXA8ciPJvr19Q/0h1+oDcJhRk= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +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-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= +golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc= +golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210331175145-43e1dd70ce54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= +golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= +golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= +golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= +gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200324203455-a04cca1dde73/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU= +google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= +google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/guregu/null.v4 v4.0.0 h1:1Wm3S1WEA2I26Kq+6vcW+w0gcDo44YKYD7YIEJNHDjg= +gopkg.in/guregu/null.v4 v4.0.0/go.mod h1:YoQhUrADuG3i9WqesrCmpNRwm1ypAgSHYqoOcTu/JrI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +k8s.io/api v0.31.2 h1:3wLBbL5Uom/8Zy98GRPXpJ254nEFpl+hwndmk9RwmL0= +k8s.io/api v0.31.2/go.mod h1:bWmGvrGPssSK1ljmLzd3pwCQ9MgoTsRCuK35u6SygUk= +k8s.io/apiextensions-apiserver v0.31.0 h1:fZgCVhGwsclj3qCw1buVXCV6khjRzKC5eCFt24kyLSk= +k8s.io/apiextensions-apiserver v0.31.0/go.mod h1:b9aMDEYaEe5sdK+1T0KU78ApR/5ZVp4i56VacZYEHxk= +k8s.io/apimachinery v0.31.2 h1:i4vUt2hPK56W6mlT7Ry+AO8eEsyxMD1U44NR22CLTYw= +k8s.io/apimachinery v0.31.2/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/cli-runtime v0.31.2 h1:7FQt4C4Xnqx8V1GJqymInK0FFsoC+fAZtbLqgXYVOLQ= +k8s.io/cli-runtime v0.31.2/go.mod h1:XROyicf+G7rQ6FQJMbeDV9jqxzkWXTYD6Uxd15noe0Q= +k8s.io/client-go v0.31.2 h1:Y2F4dxU5d3AQj+ybwSMqQnpZH9F30//1ObxOKlTI9yc= +k8s.io/client-go v0.31.2/go.mod h1:NPa74jSVR/+eez2dFsEIHNa+3o09vtNaWwWwb1qSxSs= +k8s.io/component-base v0.31.2 h1:Z1J1LIaC0AV+nzcPRFqfK09af6bZ4D1nAOpWsy9owlA= +k8s.io/component-base v0.31.2/go.mod h1:9PeyyFN/drHjtJZMCTkSpQJS3U9OXORnHQqMLDz0sUQ= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f h1:2sXuKesAYbRHxL3aE2PN6zX/gcJr22cjrsej+W784Tc= +k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f/go.mod h1:UxDHUPsUwTOOxSU+oXURfFBcAS6JwiRXTYqYwfuGowc= +k8s.io/kubectl v0.31.2 h1:gTxbvRkMBwvTSAlobiTVqsH6S8Aa1aGyBcu5xYLsn8M= +k8s.io/kubectl v0.31.2/go.mod h1:EyASYVU6PY+032RrTh5ahtSOMgoDRIux9V1JLKtG5xM= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= +modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk= +modernc.org/libc v1.41.0/go.mod h1:w0eszPsiXoOnoMJgrXjglgLuDy/bt5RR4y3QzUUeodY= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/sqlite v1.29.6 h1:0lOXGrycJPptfHDuohfYgNqoe4hu+gYuN/pKgY5XjS4= +modernc.org/sqlite v1.29.6/go.mod h1:S02dvcmm7TnTRvGhv8IGYyLnIt7AS2KPaB1F/71p75U= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +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/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= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= +sigs.k8s.io/controller-runtime v0.19.0 h1:nWVM7aq+Il2ABxwiCizrVDSlmDcshi9llbaFbC0ji/Q= +sigs.k8s.io/controller-runtime v0.19.0/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/kustomize/api v0.17.2 h1:E7/Fjk7V5fboiuijoZHgs4aHuexi5Y2loXlVOAVAG5g= +sigs.k8s.io/kustomize/api v0.17.2/go.mod h1:UWTz9Ct+MvoeQsHcJ5e+vziRRkwimm3HytpZgIYqye0= +sigs.k8s.io/kustomize/kyaml v0.17.1 h1:TnxYQxFXzbmNG6gOINgGWQt09GghzgTP6mIurOgrLCQ= +sigs.k8s.io/kustomize/kyaml v0.17.1/go.mod h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/integration-tests/smoke/capabilities/environment-ci.toml b/system-tests/tests/smoke/capabilities/environment-ci.toml similarity index 80% rename from integration-tests/smoke/capabilities/environment-ci.toml rename to system-tests/tests/smoke/capabilities/environment-ci.toml index 67501f60eb7..9d4c8226956 100644 --- a/integration-tests/smoke/capabilities/environment-ci.toml +++ b/system-tests/tests/smoke/capabilities/environment-ci.toml @@ -6,19 +6,12 @@ [jd] image = "replace-me" -[price_provider] - # without 0x prefix! - feed_id = "018bfe8840700040000000000000000000000000000000000000000000000000" - # used only if [data_source_config.fake] is not present - # url = "api.real-time-reserves.verinumus.io/v1/chainlink/proof-of-reserves/TrueUSD" - - [price_provider.fake] - port = 8171 - # use only 1 price, so that test doesn't run too long in the CI - prices = [182.9] +[fake] + port = 8171 [workflow_config] workflow_name = "abcdefgasd" + feed_id = "018bfe8840700040000000000000000000000000000000000000000000000000" use_cre_cli = true should_compile_new_workflow = false @@ -29,10 +22,10 @@ cre_cli_version = "v0.0.2" [workflow_config.compiled_config] - binary_url = "https://gist.githubusercontent.com/Tofel/e5aef5a3e926a127f38174a6755382c5/raw/cb7b2a56b37e333fe0bdce07b79538c4ce332f5f/binary.wasm.br" + binary_url = "https://gist.githubusercontent.com/Tofel/0a595b92554b375415925749cc126969/raw/cb7b2a56b37e333fe0bdce07b79538c4ce332f5f/binary.wasm.br" # if fake is enabled AND we do not compile a new workflow, this config needs to use URL pointing to IP, on which Docker host is available in Linux systems # since that's the OS of our CI runners. - config_url = "https://gist.githubusercontent.com/Tofel/49308be74a7cc95bb50e4ab4f35fb49a/raw/aa893cc3412d66df214e1ad0af3d8b3533f796c2/config.json3083467369" + config_url = "https://gist.githubusercontent.com/Tofel/c95415db5613b9ecfe3f37e715d3359d/raw/173c07fd74a3c64a514ea37da2f5450514d08f19/config.json3062539291" [[nodesets]] nodes = 5 diff --git a/integration-tests/smoke/capabilities/environment-multi-don.toml b/system-tests/tests/smoke/capabilities/environment-multi-don.toml similarity index 58% rename from integration-tests/smoke/capabilities/environment-multi-don.toml rename to system-tests/tests/smoke/capabilities/environment-multi-don.toml index 9aa2d3f2c22..cfac5d5ca76 100644 --- a/integration-tests/smoke/capabilities/environment-multi-don.toml +++ b/system-tests/tests/smoke/capabilities/environment-multi-don.toml @@ -7,34 +7,23 @@ # change to your version image = "jd-test-1:latest" -[price_provider] - # without 0x prefix! - feed_id = "018bfe8840700040000000000000000000000000000000000000000000000000" - # used only if [data_source_config.fake] is not present - # url = "api.real-time-reserves.verinumus.io/v1/chainlink/proof-of-reserves/TrueUSD" - - [price_provider.fake] - port = 8171 - prices = [182.9, 162.71, 172.02] - [workflow_config] - workflow_name = "abcdefgasd" + workflow_name = "abcdefgasd" + feed_id = "018bfe8840700040000000000000000000000000000000000000000000000000" use_cre_cli = true - should_compile_new_workflow = true - workflow_folder_location = "/Users/bartektofel/Downloads/workflow_test" + should_compile_new_workflow = false + # workflow_folder_location = "path-to-folder-with-main.go-of-your-workflow" [workflow_config.dependencies] capabilities_version = "v1.0.0-alpha" cre_cli_version = "v0.0.2" [workflow_config.compiled_config] - binary_url = "https://gist.githubusercontent.com/Tofel/b6e7afd05de86ba0444d85894f58857b/raw/cb7b2a56b37e333fe0bdce07b79538c4ce332f5f/binary.wasm.br" - config_url = "https://gist.githubusercontent.com/Tofel/cdd80b48ef6c6faf44c10a6673043a4a/raw/871c0b69c032edb4c1371fe896c10b973a93eb06/config.json1025406406" + binary_url = "https://gist.githubusercontent.com/Tofel/73d703157bafe65ab51f7e619c589091/raw/cb7b2a56b37e333fe0bdce07b79538c4ce332f5f/binary.wasm.br" + config_url = "https://gist.githubusercontent.com/Tofel/a261990c5b177fe58f304a52d0998e51/raw/2e28ee10feacf4e451a38fdfbdff8a38cf2628d8/config.json2891974493" [[nodesets]] - capabilities = ["cron", "custom-compute", "ocr3"] - don_type = "workflow" nodes = 5 override_mode = "each" http_port_range_start = 10100 @@ -48,8 +37,9 @@ [[nodesets.node_specs]] [nodesets.node_specs.node] - docker_ctx = "../../.." - docker_file = "plugins/chainlink.Dockerfile" + # docker_ctx = "../../../.." + # docker_file = "plugins/chainlink.Dockerfile" + image = "chainlink-tmp" user_config_overrides = """ [Feature] LogPoller = true @@ -66,8 +56,9 @@ [[nodesets.node_specs]] [nodesets.node_specs.node] - docker_ctx = "../../.." - docker_file = "plugins/chainlink.Dockerfile" + # docker_ctx = "../../../.." + # docker_file = "plugins/chainlink.Dockerfile" + image = "chainlink-tmp" capabilities = ["./amd64_cron"] user_config_overrides = """ [Feature] @@ -85,8 +76,9 @@ [[nodesets.node_specs]] [nodesets.node_specs.node] - docker_ctx = "../../.." - docker_file = "plugins/chainlink.Dockerfile" + # docker_ctx = "../../../.." + # docker_file = "plugins/chainlink.Dockerfile" + image = "chainlink-tmp" capabilities = ["./amd64_cron"] user_config_overrides = """ [Feature] @@ -104,8 +96,9 @@ [[nodesets.node_specs]] [nodesets.node_specs.node] - docker_ctx = "../../.." - docker_file = "plugins/chainlink.Dockerfile" + # docker_ctx = "../../../.." + # docker_file = "plugins/chainlink.Dockerfile" + image = "chainlink-tmp" capabilities = ["./amd64_cron"] user_config_overrides = """ [Feature] @@ -123,8 +116,9 @@ [[nodesets.node_specs]] [nodesets.node_specs.node] - docker_ctx = "../../.." - docker_file = "plugins/chainlink.Dockerfile" + # docker_ctx = "../../../.." + # docker_file = "plugins/chainlink.Dockerfile" + image = "chainlink-tmp" capabilities = ["./amd64_cron"] user_config_overrides = """ [Feature] @@ -140,9 +134,7 @@ """ [[nodesets]] - don_type = "capabilities" - capabilities = ["write-evm"] - nodes = 5 + nodes = 3 override_mode = "each" http_port_range_start = 10200 name = "capabilities" @@ -155,44 +147,9 @@ [[nodesets.node_specs]] [nodesets.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:5001'] - """ - - [[nodesets.node_specs]] - - [nodesets.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:5001'] - """ - - [[nodesets.node_specs]] - - [nodesets.node_specs.node] - docker_ctx = "../../.." - docker_file = "plugins/chainlink.Dockerfile" + # docker_ctx = "../../../.." + # docker_file = "plugins/chainlink.Dockerfile" + image = "chainlink-tmp" user_config_overrides = """ [Feature] LogPoller = true @@ -209,8 +166,9 @@ [[nodesets.node_specs]] [nodesets.node_specs.node] - docker_ctx = "../../.." - docker_file = "plugins/chainlink.Dockerfile" + # docker_ctx = "../../../.." + # docker_file = "plugins/chainlink.Dockerfile" + image = "chainlink-tmp" user_config_overrides = """ [Feature] LogPoller = true @@ -227,8 +185,9 @@ [[nodesets.node_specs]] [nodesets.node_specs.node] - docker_ctx = "../../.." - docker_file = "plugins/chainlink.Dockerfile" + # docker_ctx = "../../../.." + # docker_file = "plugins/chainlink.Dockerfile" + image = "chainlink-tmp" user_config_overrides = """ [Feature] LogPoller = true diff --git a/integration-tests/smoke/capabilities/environment.toml b/system-tests/tests/smoke/capabilities/environment.toml similarity index 67% rename from integration-tests/smoke/capabilities/environment.toml rename to system-tests/tests/smoke/capabilities/environment.toml index 4eac613f261..2f7634c48e4 100644 --- a/integration-tests/smoke/capabilities/environment.toml +++ b/system-tests/tests/smoke/capabilities/environment.toml @@ -7,30 +7,25 @@ # change to your version image = "jd-test-1:latest" -[price_provider] - # without 0x prefix! - feed_id = "018bfe8840700040000000000000000000000000000000000000000000000000" - # used only if [data_source_config.fake] is not present - # url = "api.real-time-reserves.verinumus.io/v1/chainlink/proof-of-reserves/TrueUSD" - - [price_provider.fake] - port = 8171 - prices = [182.9, 162.71, 172.02] +# fake data provider used as a mocked price source +[fake] + port = 8171 [workflow_config] workflow_name = "abcdefgasd" + feed_id = "018bfe8840700040000000000000000000000000000000000000000000000000" use_cre_cli = true should_compile_new_workflow = false - workflow_folder_location = "path-to-folder-with-main.go-of-your-workflow" + # workflow_folder_location = "path-to-folder-with-main.go-of-your-workflow" [workflow_config.dependencies] capabilities_version = "v1.0.0-alpha" cre_cli_version = "v0.0.2" [workflow_config.compiled_config] - binary_url = "https://gist.githubusercontent.com/Tofel/a91a240f16bb64bd1be44c93a38e6703/raw/cb7b2a56b37e333fe0bdce07b79538c4ce332f5f/binary.wasm.br" - config_url = "https://gist.githubusercontent.com/Tofel/27c96141aac0c6eac832660c2abea6d4/raw/c8a3776ac34d484b81374bec01926619e1f54757/config.json2739136466" + binary_url = "https://gist.githubusercontent.com/Tofel/73d703157bafe65ab51f7e619c589091/raw/cb7b2a56b37e333fe0bdce07b79538c4ce332f5f/binary.wasm.br" + config_url = "https://gist.githubusercontent.com/Tofel/a261990c5b177fe58f304a52d0998e51/raw/2e28ee10feacf4e451a38fdfbdff8a38cf2628d8/config.json2891974493" [[nodesets]] nodes = 5 @@ -46,8 +41,9 @@ [[nodesets.node_specs]] [nodesets.node_specs.node] - docker_ctx = "../../.." - docker_file = "plugins/chainlink.Dockerfile" + # docker_ctx = "../../../.." + # docker_file = "plugins/chainlink.Dockerfile" + image = "chainlink-tmp" user_config_overrides = """ [Feature] LogPoller = true @@ -64,8 +60,9 @@ [[nodesets.node_specs]] [nodesets.node_specs.node] - docker_ctx = "../../.." - docker_file = "plugins/chainlink.Dockerfile" + # docker_ctx = "../../../.." + # docker_file = "plugins/chainlink.Dockerfile" + image = "chainlink-tmp" capabilities = ["./amd64_cron"] user_config_overrides = """ [Feature] @@ -83,8 +80,9 @@ [[nodesets.node_specs]] [nodesets.node_specs.node] - docker_ctx = "../../.." - docker_file = "plugins/chainlink.Dockerfile" + # docker_ctx = "../../../.." + # docker_file = "plugins/chainlink.Dockerfile" + image = "chainlink-tmp" capabilities = ["./amd64_cron"] user_config_overrides = """ [Feature] @@ -102,8 +100,9 @@ [[nodesets.node_specs]] [nodesets.node_specs.node] - docker_ctx = "../../.." - docker_file = "plugins/chainlink.Dockerfile" + # docker_ctx = "../../../.." + # docker_file = "plugins/chainlink.Dockerfile" + image = "chainlink-tmp" capabilities = ["./amd64_cron"] user_config_overrides = """ [Feature] @@ -121,8 +120,9 @@ [[nodesets.node_specs]] [nodesets.node_specs.node] - docker_ctx = "../../.." - docker_file = "plugins/chainlink.Dockerfile" + # docker_ctx = "../../../.." + # docker_file = "plugins/chainlink.Dockerfile" + image = "chainlink-tmp" capabilities = ["./amd64_cron"] user_config_overrides = """ [Feature] diff --git a/integration-tests/smoke/capabilities/guidelines.md b/system-tests/tests/smoke/capabilities/guidelines.md similarity index 100% rename from integration-tests/smoke/capabilities/guidelines.md rename to system-tests/tests/smoke/capabilities/guidelines.md diff --git a/system-tests/tests/smoke/capabilities/por_price_provider.go b/system-tests/tests/smoke/capabilities/por_price_provider.go new file mode 100644 index 00000000000..7fe4ce18cc7 --- /dev/null +++ b/system-tests/tests/smoke/capabilities/por_price_provider.go @@ -0,0 +1,195 @@ +package capabilities_test + +import ( + "encoding/json" + "fmt" + "math/big" + "time" + + "github.com/gin-gonic/gin" + "github.com/pkg/errors" + "github.com/rs/zerolog" + + "github.com/smartcontractkit/chainlink-testing-framework/framework" + "github.com/smartcontractkit/chainlink-testing-framework/framework/components/fake" + "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/ptr" + + libc "github.com/smartcontractkit/chainlink/system-tests/lib/conversions" +) + +func setupFakeDataProvider(testLogger zerolog.Logger, input *fake.Input, expectedPrices []float64, priceIndex *int) (string, error) { + _, err := fake.NewFakeDataProvider(input) + if err != nil { + return "", errors.Wrap(err, "failed to set up fake data provider") + } + fakeAPIPath := "/fake/api/price" + host := framework.HostDockerInternal() + fakeFinalURL := fmt.Sprintf("%s:%d%s", host, input.Port, fakeAPIPath) + + getPriceResponseFn := func() map[string]interface{} { + response := map[string]interface{}{ + "accountName": "TrueUSD", + "totalTrust": expectedPrices[*priceIndex], + "ripcord": false, + "updatedAt": time.Now().Format(time.RFC3339), + } + + marshalled, mErr := json.Marshal(response) + if mErr == nil { + testLogger.Info().Msgf("Returning response: %s", string(marshalled)) + } else { + testLogger.Info().Msgf("Returning response: %v", response) + } + + return response + } + + err = fake.Func("GET", fakeAPIPath, func(c *gin.Context) { + c.JSON(200, getPriceResponseFn()) + }) + if err != nil { + return "", errors.Wrap(err, "failed to set up fake data provider") + } + + return fakeFinalURL, nil +} + +// PriceProvider abstracts away the logic of checking whether the feed has been correctly updated +// and it also returns port and URL of the price provider. This is so, because when using a mocked +// price provider we need start a separate service and whitelist its port and IP with the gateway job. +// Also, since it's a mocked price provider we can now check whether the feed has been correctly updated +// instead of only checking whether it has some price that's != 0. +type PriceProvider interface { + URL() string + NextPrice(price *big.Int, elapsed time.Duration) bool + ExpectedPrices() []*big.Int + ActualPrices() []*big.Int +} + +// TrueUSDPriceProvider is a PriceProvider implementation that uses a live feed to get the price +type TrueUSDPriceProvider struct { + testLogger zerolog.Logger + url string + actualPrices []*big.Int +} + +func NewTrueUSDPriceProvider(testLogger zerolog.Logger) PriceProvider { + return &TrueUSDPriceProvider{ + testLogger: testLogger, + url: "https://api.real-time-reserves.verinumus.io/v1/chainlink/proof-of-reserves/TrueUSD", + } +} + +func (l *TrueUSDPriceProvider) NextPrice(price *big.Int, elapsed time.Duration) bool { + // if price is nil or 0 it means that the feed hasn't been updated yet + if price == nil || price.Cmp(big.NewInt(0)) == 0 { + return true + } + + l.testLogger.Info().Msgf("Feed updated after %s - price set, price=%s", elapsed, price) + l.actualPrices = append(l.actualPrices, price) + + // no other price to return, we are done + return false +} + +func (l *TrueUSDPriceProvider) URL() string { + return l.url +} + +func (l *TrueUSDPriceProvider) ExpectedPrices() []*big.Int { + // we don't have a way to check the price in the live feed, so we always assume it's correct + // as long as it's != 0. And we only wait for the first price to be set. + return l.actualPrices +} + +func (l *TrueUSDPriceProvider) ActualPrices() []*big.Int { + // we don't have a way to check the price in the live feed, so we always assume it's correct + // as long as it's != 0. And we only wait for the first price to be set. + return l.actualPrices +} + +// FakePriceProvider is a PriceProvider implementation that uses a mocked feed to get the price +// It returns a configured price sequence and makes sure that the feed has been correctly updated +type FakePriceProvider struct { + testLogger zerolog.Logger + priceIndex *int + url string + expectedPrices []*big.Int + actualPrices []*big.Int +} + +func NewFakePriceProvider(testLogger zerolog.Logger, input *fake.Input) (PriceProvider, error) { + priceIndex := ptr.Ptr(0) + // Add more prices here as needed + expectedPricesFloat64 := []float64{182.9} + expectedPrices := make([]*big.Int, len(expectedPricesFloat64)) + for i, p := range expectedPricesFloat64 { + // convert float64 to big.Int by multiplying by 100 + // just like the PoR workflow does + expectedPrices[i] = libc.Float64ToBigInt(p) + } + + url, err := setupFakeDataProvider(testLogger, input, expectedPricesFloat64, priceIndex) + if err != nil { + return nil, errors.Wrap(err, "failed to set up fake data provider") + } + + return &FakePriceProvider{ + testLogger: testLogger, + expectedPrices: expectedPrices, + priceIndex: priceIndex, + url: url, + }, nil +} + +func (f *FakePriceProvider) priceAlreadyFound(price *big.Int) bool { + for _, p := range f.actualPrices { + if p.Cmp(price) == 0 { + return true + } + } + + return false +} + +func (f *FakePriceProvider) NextPrice(price *big.Int, elapsed time.Duration) bool { + // if price is nil or 0 it means that the feed hasn't been updated yet + if price == nil || price.Cmp(big.NewInt(0)) == 0 { + return true + } + + if !f.priceAlreadyFound(price) { + f.testLogger.Info().Msgf("Feed updated after %s - price set, price=%s", elapsed, price) + f.actualPrices = append(f.actualPrices, price) + + if len(f.actualPrices) == len(f.expectedPrices) { + // all prices found, nothing more to check + return false + } + + if len(f.actualPrices) > len(f.expectedPrices) { + panic("more prices found than expected") + } + f.testLogger.Info().Msgf("Changing price provider price to %s", f.expectedPrices[len(f.actualPrices)].String()) + *f.priceIndex = len(f.actualPrices) + + // set new price and continue checking + return true + } + + // continue checking, price not updated yet + return true +} + +func (f *FakePriceProvider) ActualPrices() []*big.Int { + return f.actualPrices +} + +func (f *FakePriceProvider) ExpectedPrices() []*big.Int { + return f.expectedPrices +} + +func (f *FakePriceProvider) URL() string { + return f.url +} diff --git a/system-tests/tests/smoke/capabilities/workflow_test.go b/system-tests/tests/smoke/capabilities/workflow_test.go new file mode 100644 index 00000000000..eeed08ff176 --- /dev/null +++ b/system-tests/tests/smoke/capabilities/workflow_test.go @@ -0,0 +1,876 @@ +package capabilities_test + +import ( + "fmt" + "math/big" + "net" + "os" + "runtime" + "strings" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + ut "github.com/go-playground/universal-translator" + "github.com/go-playground/validator/v10" + "github.com/pkg/errors" + "github.com/rs/zerolog" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + chainselectors "github.com/smartcontractkit/chain-selectors" + + "github.com/smartcontractkit/chainlink-testing-framework/framework" + "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" + "github.com/smartcontractkit/chainlink-testing-framework/framework/components/fake" + "github.com/smartcontractkit/chainlink-testing-framework/framework/components/jd" + ns "github.com/smartcontractkit/chainlink-testing-framework/framework/components/simple_node_set" + "github.com/smartcontractkit/chainlink-testing-framework/seth" + + "github.com/smartcontractkit/chainlink/deployment" + cldlogger "github.com/smartcontractkit/chainlink/deployment/logger" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/feeds_consumer" + "github.com/smartcontractkit/chainlink/v2/core/logger" + + ctfconfig "github.com/smartcontractkit/chainlink-testing-framework/lib/config" + + keystonecapabilities "github.com/smartcontractkit/chainlink/system-tests/lib/cre/capabilities" + libcontracts "github.com/smartcontractkit/chainlink/system-tests/lib/cre/contracts" + lidebug "github.com/smartcontractkit/chainlink/system-tests/lib/cre/debug" + libdon "github.com/smartcontractkit/chainlink/system-tests/lib/cre/don" + keystoneporconfig "github.com/smartcontractkit/chainlink/system-tests/lib/cre/don/config/por" + libjobs "github.com/smartcontractkit/chainlink/system-tests/lib/cre/don/jobs" + keystonepor "github.com/smartcontractkit/chainlink/system-tests/lib/cre/don/jobs/por" + libenv "github.com/smartcontractkit/chainlink/system-tests/lib/cre/environment" + keystonetypes "github.com/smartcontractkit/chainlink/system-tests/lib/cre/types" + libcrecli "github.com/smartcontractkit/chainlink/system-tests/lib/crecli" + keystoneporcrecli "github.com/smartcontractkit/chainlink/system-tests/lib/crecli/por" + libfunding "github.com/smartcontractkit/chainlink/system-tests/lib/funding" + libtypes "github.com/smartcontractkit/chainlink/system-tests/lib/types" +) + +const ( + cronCapabilityAssetFile = "amd64_cron" + ghReadTokenEnvVarName = "GITHUB_READ_TOKEN" + E2eJobDistributorImageEnvVarName = "E2E_JD_IMAGE" + E2eJobDistributorVersionEnvVarName = "E2E_JD_VERSION" +) + +type TestConfig struct { + BlockchainA *blockchain.Input `toml:"blockchain_a" validate:"required"` + NodeSets []*ns.Input `toml:"nodesets" validate:"required"` + WorkflowConfig *WorkflowConfig `toml:"workflow_config" validate:"required"` + JD *jd.Input `toml:"jd" validate:"required"` + Fake *fake.Input `toml:"fake"` + KeystoneContracts *keystonetypes.KeystoneContractsInput `toml:"keystone_contracts"` + WorkflowRegistryConfiguration *keystonetypes.WorkflowRegistryInput `toml:"workflow_registry_configuration"` + FeedConsumer *keystonetypes.DeployFeedConsumerInput `toml:"feed_consumer"` +} + +type WorkflowConfig struct { + UseCRECLI bool `toml:"use_cre_cli"` + ShouldCompileNewWorkflow bool `toml:"should_compile_new_workflow" validate:"no_cre_no_compilation,disabled_in_ci"` + // Tells the test where the workflow to compile is located + WorkflowFolderLocation *string `toml:"workflow_folder_location" validate:"required_if=ShouldCompileNewWorkflow true"` + CompiledWorkflowConfig *CompiledConfig `toml:"compiled_config" validate:"required_if=ShouldCompileNewWorkflow false"` + DependenciesConfig *DependenciesConfig `toml:"dependencies" validate:"required"` + WorkflowName string `toml:"workflow_name" validate:"required" ` + FeedID string `toml:"feed_id" validate:"required,startsnotwith=0x"` +} + +// noCRENoCompilation is a custom validator for the tag "no_cre_no_compilation". +// It ensures that if UseCRECLI is false, then ShouldCompileNewWorkflow must also be false. +func noCRENoCompilation(fl validator.FieldLevel) bool { + // Use Parent() to access the WorkflowConfig struct. + wc, ok := fl.Parent().Interface().(WorkflowConfig) + if !ok { + return false + } + // If not using CRE CLI and ShouldCompileNewWorkflow is true, fail validation. + if !wc.UseCRECLI && fl.Field().Bool() { + return false + } + return true +} + +func disabledInCI(fl validator.FieldLevel) bool { + if os.Getenv("CI") == "true" { + return !fl.Field().Bool() + } + + return true +} + +func registerNoCRENoCompilationTranslation(v *validator.Validate, trans ut.Translator) { + _ = v.RegisterTranslation("no_cre_no_compilation", trans, func(ut ut.Translator) error { + return ut.Add("no_cre_no_compilation", "{0} must be false when UseCRECLI is false, it is not possible to compile a workflow without it", true) + }, func(ut ut.Translator, fe validator.FieldError) string { + t, _ := ut.T("no_cre_no_compilation", fe.Field()) + return t + }) +} + +func registerNoFolderLocationTranslation(v *validator.Validate, trans ut.Translator) { + _ = v.RegisterTranslation("folder_required_if_compiling", trans, func(ut ut.Translator) error { + return ut.Add("folder_required_if_compiling", "{0} must set, when compiling the workflow", true) + }, func(ut ut.Translator, fe validator.FieldError) string { + t, _ := ut.T("folder_required_if_compiling", fe.Field()) + return t + }) +} + +func init() { + err := framework.Validator.RegisterValidation("no_cre_no_compilation", noCRENoCompilation) + if err != nil { + panic(errors.Wrap(err, "failed to register no_cre_no_compilation validator")) + } + err = framework.Validator.RegisterValidation("disabled_in_ci", disabledInCI) + if err != nil { + panic(errors.Wrap(err, "failed to register disabled_in_ci validator")) + } + + if framework.ValidatorTranslator != nil { + registerNoCRENoCompilationTranslation(framework.Validator, framework.ValidatorTranslator) + registerNoFolderLocationTranslation(framework.Validator, framework.ValidatorTranslator) + } +} + +// Defines relases/versions of test dependencies that will be downloaded from Github +type DependenciesConfig struct { + CapabiltiesVersion string `toml:"capabilities_version" validate:"required"` + CRECLIVersion string `toml:"cre_cli_version" validate:"required"` +} + +// Defines the location of already compiled workflow binary and config files +// They will be used if WorkflowConfig.ShouldCompileNewWorkflow is `false` +// Otherwise test will compile and upload a new workflow +type CompiledConfig struct { + BinaryURL string `toml:"binary_url" validate:"required"` + ConfigURL string `toml:"config_url" validate:"required"` +} + +func validateEnvVars(t *testing.T, in *TestConfig) { + require.NotEmpty(t, os.Getenv("PRIVATE_KEY"), "PRIVATE_KEY env var must be set") + + var ghReadToken string + // this is a small hack to avoid changing the reusable workflow + if os.Getenv("CI") == "true" { + // This part should ideally happen outside of the test, but due to how our reusable e2e test workflow is structured now + // we cannot execute this part in workflow steps (it doesn't support any pre-execution hooks) + require.NotEmpty(t, os.Getenv(ctfconfig.E2E_TEST_CHAINLINK_IMAGE_ENV), "missing env var: "+ctfconfig.E2E_TEST_CHAINLINK_IMAGE_ENV) + require.NotEmpty(t, os.Getenv(ctfconfig.E2E_TEST_CHAINLINK_VERSION_ENV), "missing env var: "+ctfconfig.E2E_TEST_CHAINLINK_VERSION_ENV) + require.NotEmpty(t, os.Getenv(libjobs.E2eJobDistributorImageEnvVarName), "missing env var: "+libjobs.E2eJobDistributorImageEnvVarName) + require.NotEmpty(t, os.Getenv(libjobs.E2eJobDistributorVersionEnvVarName), "missing env var: "+libjobs.E2eJobDistributorVersionEnvVarName) + + // disabled until we can figure out how to generate a gist read:write token in CI + /* + This test can be run in two modes: + 1. `existing` mode: it uses a workflow binary (and configuration) file that is already uploaded to Gist + 2. `compile` mode: it compiles a new workflow binary and uploads it to Gist + + For the `new` mode to work, the `GITHUB_API_TOKEN` env var must be set to a token that has `gist:read` and `gist:write` permissions, but this permissions + are tied to account not to repository. Currently, we have no service account in the CI at all. And using a token that's tied to personal account of a developer + is not a good idea. So, for now, we are only allowing the `existing` mode in CI. + */ + + // we use this special function to subsitute a placeholder env variable with the actual environment variable name + // it is defined in .github/e2e-tests.yml as '{{ env.GITHUB_API_TOKEN }}' + ghReadToken = ctfconfig.MustReadEnvVar_String(ghReadTokenEnvVarName) + } else { + ghReadToken = os.Getenv(ghReadTokenEnvVarName) + } + + require.NotEmpty(t, ghReadToken, ghReadTokenEnvVarName+" env var must be set") + + if in.WorkflowConfig.UseCRECLI { + if in.WorkflowConfig.ShouldCompileNewWorkflow { + gistWriteToken := os.Getenv("GIST_WRITE_TOKEN") + require.NotEmpty(t, gistWriteToken, "GIST_WRITE_TOKEN must be set to use CRE CLI to compile workflows. It requires gist:read and gist:write permissions") + err := os.Setenv("GITHUB_API_TOKEN", gistWriteToken) + require.NoError(t, err, "failed to set GITHUB_API_TOKEN env var") + } + } +} + +type binaryDownloadOutput struct { + creCLIAbsPath string +} + +// this is a small hack to avoid changing the reusable workflow, which doesn't allow to run any pre-execution hooks +func downloadBinaryFiles(in *TestConfig) (*binaryDownloadOutput, error) { + var ghReadToken string + if os.Getenv("CI") == "true" { + ghReadToken = ctfconfig.MustReadEnvVar_String(ghReadTokenEnvVarName) + } else { + ghReadToken = os.Getenv(ghReadTokenEnvVarName) + } + + _, err := keystonecapabilities.DownloadCapabilityFromRelease(ghReadToken, in.WorkflowConfig.DependenciesConfig.CapabiltiesVersion, cronCapabilityAssetFile) + if err != nil { + return nil, errors.Wrap(err, "failed to download cron capability. Make sure token has content:read permissions to the capabilities repo") + } + + output := &binaryDownloadOutput{} + + if in.WorkflowConfig.UseCRECLI { + output.creCLIAbsPath, err = libcrecli.DownloadAndInstallChainlinkCLI(ghReadToken, in.WorkflowConfig.DependenciesConfig.CRECLIVersion) + if err != nil { + return nil, errors.Wrap(err, "failed to download and install CRE CLI. Make sure token has content:read permissions to the dev-platform repo") + } + } + + return output, nil +} + +type registerPoRWorkflowInput struct { + *WorkflowConfig + chainSelector uint64 + workflowDonID uint32 + feedID string + workflowRegistryAddress common.Address + feedConsumerAddress common.Address + capabilitiesRegistryAddress common.Address + priceProvider PriceProvider + sethClient *seth.Client + deployerPrivateKey string + blockchain *blockchain.Output + binaryDownloadOutput binaryDownloadOutput +} + +func registerPoRWorkflow(input registerPoRWorkflowInput) error { + // Register workflow directly using the provided binary and config URLs + // This is a legacy solution, probably we can remove it soon, but there's still quite a lot of people + // who have no access to dev-platform repo, so they cannot use the CRE CLI + if !input.WorkflowConfig.ShouldCompileNewWorkflow && !input.WorkflowConfig.UseCRECLI { + err := libcontracts.RegisterWorkflow(input.sethClient, input.workflowRegistryAddress, input.workflowDonID, input.WorkflowConfig.WorkflowName, input.WorkflowConfig.CompiledWorkflowConfig.BinaryURL, input.WorkflowConfig.CompiledWorkflowConfig.ConfigURL) + if err != nil { + return errors.Wrap(err, "failed to register workflow") + } + + return nil + } + + // These two env vars are required by the CRE CLI + err := os.Setenv("WORKFLOW_OWNER_ADDRESS", input.sethClient.MustGetRootKeyAddress().Hex()) + if err != nil { + return errors.Wrap(err, "failed to set WORKFLOW_OWNER_ADDRESS env var") + } + + err = os.Setenv("ETH_PRIVATE_KEY", input.deployerPrivateKey) + if err != nil { + return errors.Wrap(err, "failed to set ETH_PRIVATE_KEY") + } + + // create CRE CLI settings file + settingsFile, settingsErr := libcrecli.PrepareCRECLISettingsFile(input.sethClient.MustGetRootKeyAddress(), input.capabilitiesRegistryAddress, input.workflowRegistryAddress, input.workflowDonID, input.chainSelector, input.blockchain.Nodes[0].HostHTTPUrl) + if settingsErr != nil { + return errors.Wrap(settingsErr, "failed to create CRE CLI settings file") + } + + var workflowURL string + var workflowConfigURL string + + workflowConfigFile, configErr := keystoneporcrecli.CreateConfigFile(input.feedConsumerAddress, input.feedID, input.priceProvider.URL()) + if configErr != nil { + return errors.Wrap(configErr, "failed to create workflow config file") + } + + // compile and upload the workflow, if we are not using an existing one + if input.WorkflowConfig.ShouldCompileNewWorkflow { + compilationResult, err := libcrecli.CompileWorkflow(input.binaryDownloadOutput.creCLIAbsPath, *input.WorkflowConfig.WorkflowFolderLocation, workflowConfigFile, settingsFile) + if err != nil { + return errors.Wrap(err, "failed to compile workflow") + } + + workflowURL = compilationResult.WorkflowURL + workflowConfigURL = compilationResult.ConfigURL + } else { + workflowURL = input.WorkflowConfig.CompiledWorkflowConfig.BinaryURL + workflowConfigURL = input.WorkflowConfig.CompiledWorkflowConfig.ConfigURL + } + + registerErr := libcrecli.RegisterWorkflow(input.binaryDownloadOutput.creCLIAbsPath, input.WorkflowName, workflowURL, workflowConfigURL, settingsFile) + if registerErr != nil { + return errors.Wrap(registerErr, "failed to register workflow") + } + + return nil +} + +func logTestInfo(l zerolog.Logger, feedID, workflowName, feedConsumerAddr, forwarderAddr string) { + l.Info().Msg("------ Test configuration:") + l.Info().Msgf("Feed ID: %s", feedID) + l.Info().Msgf("Workflow name: %s", workflowName) + l.Info().Msgf("FeedConsumer address: %s", feedConsumerAddr) + l.Info().Msgf("KeystoneForwarder address: %s", forwarderAddr) +} + +func extraAllowedPortsAndIps(testLogger zerolog.Logger, fakePort int, nodeOutput *ns.Output) ([]string, []int, error) { + // we need to explicitly allow the port used by the fake data provider + // and IP corresponding to host.docker.internal or the IP of the host machine, if we are running on Linux, + // because that's where the fake data provider is running + var hostIP string + var err error + + system := runtime.GOOS + switch system { + case "darwin": + hostIP, err = libdon.ResolveHostDockerInternaIP(testLogger, nodeOutput) + case "linux": + // for linux framework already returns an IP, so we don't need to resolve it, + // but we need to remove the http:// prefix + hostIP = strings.ReplaceAll(framework.HostDockerInternal(), "http://", "") + default: + err = fmt.Errorf("unsupported OS: %s", system) + } + if err != nil { + return nil, nil, errors.Wrap(err, "failed to resolve host.docker.internal IP") + } + + testLogger.Info().Msgf("Will allow IP %s and port %d for the fake data provider", hostIP, fakePort) + + ips, err := net.LookupIP("gist.githubusercontent.com") + if err != nil { + return nil, nil, errors.Wrap(err, "failed to resolve IP for gist.githubusercontent.com") + } + + gistIPs := make([]string, len(ips)) + for i, ip := range ips { + gistIPs[i] = ip.To4().String() + testLogger.Debug().Msgf("Resolved IP for gist.githubusercontent.com: %s", gistIPs[i]) + } + + // we also need to explicitly allow Gist's IP + return append(gistIPs, hostIP), []int{fakePort}, nil +} + +type InfrastructureInput struct { + jdInput *jd.Input + nodeSetInput []*keystonetypes.CapabilitiesAwareNodeSet + blockchainInput *blockchain.Input +} + +type InfrastructureOutput struct { + chainSelector uint64 + nodeOuput []*keystonetypes.WrappedNodeOutput + blockchainOutput *blockchain.Output + jdOutput *jd.Output + cldEnv *deployment.Environment + donTopology *keystonetypes.DonTopology + sethClient *seth.Client + deployerPrivateKey string + gatewayConnector *keystonetypes.GatewayConnectorOutput +} + +func CreateInfrastructure( + cldLogger logger.Logger, + testLogger zerolog.Logger, + input InfrastructureInput, +) (*InfrastructureOutput, error) { + if input.blockchainInput == nil { + return nil, errors.New("blockchain input is nil") + } + + if input.jdInput == nil { + return nil, errors.New("JD input is nil") + } + + if len(input.nodeSetInput) == 0 { + return nil, errors.New("node set input is empty") + } + + // Create a new blockchain network and Seth client to interact with it + blockchainOutput, err := blockchain.NewBlockchainNetwork(input.blockchainInput) + if err != nil { + return nil, errors.Wrap(err, "failed to create blockchain network") + } + + pkey := os.Getenv("PRIVATE_KEY") + if pkey == "" { + return nil, errors.New("PRIVATE_KEY env var must be set") + } + + sethClient, err := seth.NewClientBuilder(). + WithRpcUrl(blockchainOutput.Nodes[0].HostWSUrl). + WithPrivateKeys([]string{pkey}). + // do not check if there's a pending nonce nor check node health + WithProtections(false, false, seth.MustMakeDuration(time.Second)). + Build() + if err != nil { + return nil, errors.Wrap(err, "failed to create seth client") + } + + chainSelector, err := chainselectors.SelectorFromChainId(sethClient.Cfg.Network.ChainID) + if err != nil { + return nil, errors.Wrapf(err, "failed to get chain selector for chain id %d", sethClient.Cfg.Network.ChainID) + } + + // Start job distributor + if os.Getenv("CI") == "true" { + jdImage := ctfconfig.MustReadEnvVar_String(E2eJobDistributorImageEnvVarName) + jdVersion := os.Getenv(E2eJobDistributorVersionEnvVarName) + input.jdInput.Image = fmt.Sprintf("%s:%s", jdImage, jdVersion) + } + + jdOutput, err := jd.NewJD(input.jdInput) + if err != nil { + return nil, errors.Wrap(err, "failed to create new job distributor") + } + + // Deploy the DONs + // Hack for CI that allows us to dynamically set the chainlink image and version + // CTFv2 currently doesn't support dynamic image and version setting + if os.Getenv("CI") == "true" { + // Due to how we pass custom env vars to reusable workflow we need to use placeholders, so first we need to resolve what's the name of the target environment variable + // that stores chainlink version and then we can use it to resolve the image name + for i := range input.nodeSetInput { + image := fmt.Sprintf("%s:%s", os.Getenv(ctfconfig.E2E_TEST_CHAINLINK_IMAGE_ENV), ctfconfig.MustReadEnvVar_String(ctfconfig.E2E_TEST_CHAINLINK_VERSION_ENV)) + for j := range input.nodeSetInput[i].NodeSpecs { + input.nodeSetInput[i].NodeSpecs[j].Node.Image = image + } + } + } + + nodeOutput := make([]*keystonetypes.WrappedNodeOutput, 0, len(input.nodeSetInput)) + for _, nsInput := range input.nodeSetInput { + nodeset, nodesetErr := ns.NewSharedDBNodeSet(nsInput.Input, blockchainOutput) + if nodesetErr != nil { + return nil, errors.Wrapf(nodesetErr, "failed to deploy node set names %s", nsInput.Name) + } + + nodeOutput = append(nodeOutput, &keystonetypes.WrappedNodeOutput{ + Output: nodeset, + NodeSetName: nsInput.Name, + Capabilities: nsInput.Capabilities, + }) + } + + // Prepare the CLD environment and figure out DON topology; configure chains for nodes and job distributor + // Ugly glue hack ¯\_(ツ)_/¯ + cldEnv, donTopology, err := libenv.BuildTopologyAndCLDEnvironment(cldLogger, input.nodeSetInput, jdOutput, nodeOutput, blockchainOutput, sethClient) + if err != nil { + return nil, errors.Wrap(err, "failed to build topology and CLD environment") + } + + // Fund the nodes + for _, metaDon := range donTopology.MetaDons { + for _, node := range metaDon.DON.Nodes { + _, err := libfunding.SendFunds(zerolog.Logger{}, sethClient, libtypes.FundsToSend{ + ToAddress: common.HexToAddress(node.AccountAddr[sethClient.Cfg.Network.ChainID]), + Amount: big.NewInt(5000000000000000000), + PrivateKey: sethClient.MustGetRootPrivateKey(), + }) + if err != nil { + return nil, errors.Wrapf(err, "failed to send funds to node %s", node.AccountAddr[sethClient.Cfg.Network.ChainID]) + } + } + } + + return &InfrastructureOutput{ + chainSelector: chainSelector, + nodeOuput: nodeOutput, + blockchainOutput: blockchainOutput, + jdOutput: jdOutput, + cldEnv: cldEnv, + donTopology: donTopology, + sethClient: sethClient, + deployerPrivateKey: pkey, + gatewayConnector: &keystonetypes.GatewayConnectorOutput{ + Path: "/node", + Port: 5003, + // do not set the host, it will be resolved automatically + }, + }, nil +} + +type setupOutput struct { + priceProvider PriceProvider + feedsConsumerAddress common.Address + forwarderAddress common.Address + sethClient *seth.Client + blockchainOutput *blockchain.Output + donTopology *keystonetypes.DonTopology +} + +func setupTestEnvironment(t *testing.T, testLogger zerolog.Logger, in *TestConfig, priceProvider PriceProvider, binaryDownloadOutput binaryDownloadOutput, mustSetCapabilitiesFn func(input []*ns.Input) []*keystonetypes.CapabilitiesAwareNodeSet) *setupOutput { + // Universal setup -- START + envInput := InfrastructureInput{ + jdInput: in.JD, + nodeSetInput: mustSetCapabilitiesFn(in.NodeSets), + blockchainInput: in.BlockchainA, + } + envOutput, err := CreateInfrastructure(cldlogger.NewSingleFileLogger(t), testLogger, envInput) + require.NoError(t, err, "failed to start environment") + + // Deploy keystone contracts (forwarder, capability registry, ocr3 capability, workflow registry) + keystoneContractsInput := &keystonetypes.KeystoneContractsInput{ + ChainSelector: envOutput.chainSelector, + CldEnv: envOutput.cldEnv, + } + + keystoneContractsOutput, err := libcontracts.DeployKeystone(testLogger, keystoneContractsInput) + require.NoError(t, err, "failed to deploy keystone contracts") + + // Configure Workflow Registry + workflowRegistryInput := &keystonetypes.WorkflowRegistryInput{ + ChainSelector: envOutput.chainSelector, + CldEnv: envOutput.cldEnv, + AllowedDonIDs: []uint32{envOutput.donTopology.WorkflowDONID}, + WorkflowOwners: []common.Address{envOutput.sethClient.MustGetRootKeyAddress()}, + } + + _, err = libcontracts.ConfigureWorkflowRegistry(testLogger, workflowRegistryInput) + require.NoError(t, err, "failed to configure workflow registry") + // Universal setup -- END + + // Workflow-specific configuration -- START + deployFeedConsumerInput := &keystonetypes.DeployFeedConsumerInput{ + ChainSelector: envOutput.chainSelector, + CldEnv: envOutput.cldEnv, + } + deployFeedsConsumerOutput, err := libcontracts.DeployFeedsConsumer(testLogger, deployFeedConsumerInput) + require.NoError(t, err, "failed to deploy feeds consumer") + + configureFeedConsumerInput := &keystonetypes.ConfigureFeedConsumerInput{ + SethClient: envOutput.sethClient, + FeedConsumerAddress: deployFeedsConsumerOutput.FeedConsumerAddress, + AllowedSenders: []common.Address{keystoneContractsOutput.ForwarderAddress}, + AllowedWorkflowOwners: []common.Address{envOutput.sethClient.MustGetRootKeyAddress()}, + AllowedWorkflowNames: []string{in.WorkflowConfig.WorkflowName}, + } + _, err = libcontracts.ConfigureFeedsConsumer(testLogger, configureFeedConsumerInput) + require.NoError(t, err, "failed to configure feeds consumer") + + registerInput := registerPoRWorkflowInput{ + WorkflowConfig: in.WorkflowConfig, + chainSelector: envOutput.chainSelector, + workflowDonID: envOutput.donTopology.WorkflowDONID, + feedID: in.WorkflowConfig.FeedID, + workflowRegistryAddress: keystoneContractsOutput.WorkflowRegistryAddress, + feedConsumerAddress: deployFeedsConsumerOutput.FeedConsumerAddress, + capabilitiesRegistryAddress: keystoneContractsOutput.CapabilitiesRegistryAddress, + priceProvider: priceProvider, + sethClient: envOutput.sethClient, + deployerPrivateKey: envOutput.deployerPrivateKey, + blockchain: envOutput.blockchainOutput, + binaryDownloadOutput: binaryDownloadOutput, + } + + err = registerPoRWorkflow(registerInput) + require.NoError(t, err, "failed to register PoR workflow") + // Workflow-specific configuration -- END + + // Universal setup -- CONTINUED + // Allow extra IPs and ports for the fake data provider, which is running on host machine and requires explicit whitelisting + var extraAllowedIPs []string + var extraAllowedPorts []int + if _, ok := priceProvider.(*FakePriceProvider); ok { + extraAllowedIPs, extraAllowedPorts, err = extraAllowedPortsAndIps(testLogger, in.Fake.Port, envOutput.donTopology.MetaDons[0].NodeOutput.Output) + require.NoError(t, err, "failed to get extra allowed ports and IPs") + } + + // Prepare job specs and node configs + configsAndJobsInput := jobsAndConfigsInput{ + donTopology: envOutput.donTopology, + blockchainOutput: envOutput.blockchainOutput, + gatewayConnectorOutput: envOutput.gatewayConnector, + workflowRegistryAddress: keystoneContractsOutput.WorkflowRegistryAddress, + forwarderAddress: keystoneContractsOutput.ForwarderAddress, + capabilitiesRegistryAddress: keystoneContractsOutput.CapabilitiesRegistryAddress, + ocr3capabilityAddress: keystoneContractsOutput.OCR3CapabilityAddress, + cldEnv: envOutput.cldEnv, + extraAllowedIPs: extraAllowedIPs, + extraAllowedPorts: extraAllowedPorts, + } + + configsAndJobsOutput, err := prepareJobSpecsAndNodeConfigs(configsAndJobsInput) + require.NoError(t, err, "failed to prepare job specs and node configs") + + // Configure nodes and create jobs + configureDonInput := keystonetypes.ConfigureDonInput{ + CldEnv: envOutput.cldEnv, + BlockchainOutput: envOutput.blockchainOutput, + JdOutput: envOutput.jdOutput, + DonTopology: envOutput.donTopology, + DonToJobSpecs: configsAndJobsOutput.donToJobSpecs, + DonToConfigOverrides: configsAndJobsOutput.nodeToConfigOverrides, + } + _, err = libdon.Configure(t, testLogger, configureDonInput) + require.NoError(t, err, "failed to configure nodes and create jobs") + + // CAUTION: It is crucial to configure OCR3 jobs on nodes before configuring the workflow contracts. + // Wait for OCR listeners to be ready before setting the configuration. + // If the ConfigSet event is missed, OCR protocol will not start. + testLogger.Info().Msg("Waiting 30s for OCR listeners to be ready...") + time.Sleep(30 * time.Second) + testLogger.Info().Msg("Proceeding to set OCR3 configuration.") + + // Configure the Forwarder, OCR3 and Capabilities contracts + configureKeystoneInput := keystonetypes.ConfigureKeystoneInput{ + ChainSelector: envOutput.chainSelector, + CldEnv: envOutput.cldEnv, + DonTopology: envOutput.donTopology, + } + err = libcontracts.ConfigureKeystone(configureKeystoneInput) + require.NoError(t, err, "failed to configure keystone contracts") + + // Set inputs in the test config, so that they can be saved + in.KeystoneContracts = keystoneContractsInput + in.FeedConsumer = deployFeedConsumerInput + in.WorkflowRegistryConfiguration = workflowRegistryInput + + return &setupOutput{ + priceProvider: priceProvider, + feedsConsumerAddress: deployFeedsConsumerOutput.FeedConsumerAddress, + forwarderAddress: keystoneContractsOutput.ForwarderAddress, + sethClient: envOutput.sethClient, + blockchainOutput: envOutput.blockchainOutput, + donTopology: envOutput.donTopology, + } +} + +type jobsAndConfigsInput struct { + donTopology *keystonetypes.DonTopology + blockchainOutput *blockchain.Output + gatewayConnectorOutput *keystonetypes.GatewayConnectorOutput + workflowRegistryAddress common.Address + forwarderAddress common.Address + capabilitiesRegistryAddress common.Address + ocr3capabilityAddress common.Address + cldEnv *deployment.Environment + extraAllowedIPs []string + extraAllowedPorts []int +} + +type jobsAndConfigsOutput struct { + donToJobSpecs keystonetypes.DonsToJobSpecs + nodeToConfigOverrides keystonetypes.DonsToConfigOverrides +} + +func prepareJobSpecsAndNodeConfigs(input jobsAndConfigsInput) (*jobsAndConfigsOutput, error) { + peeringData, err := libdon.FindPeeringData(input.donTopology.MetaDons) + if err != nil { + return nil, errors.Wrap(err, "failed to get peering data") + } + + // prepare node configs + donToConfigs := make(keystonetypes.DonsToConfigOverrides) + var configErr error + for _, donTopology := range input.donTopology.MetaDons { + donToConfigs[donTopology.ID], configErr = keystoneporconfig.GenerateConfigs( + keystonetypes.GeneratePoRConfigsInput{ + Don: donTopology.DON, + NodeInput: donTopology.NodeInput, + BlockchainOutput: input.blockchainOutput, + DonID: donTopology.ID, + Flags: donTopology.Flags, + PeeringData: peeringData, + CapabilitiesRegistryAddress: input.capabilitiesRegistryAddress, + WorkflowRegistryAddress: input.workflowRegistryAddress, + ForwarderAddress: input.forwarderAddress, + GatewayConnectorOutput: input.gatewayConnectorOutput, + }, + ) + if configErr != nil { + return nil, errors.Wrapf(configErr, "failed to define config for DON %d", donTopology.ID) + } + } + + // define jobs + donToJobSpecs := make(map[uint32]keystonetypes.DonJobs) + var jobSpecsErr error + for _, donTopology := range input.donTopology.MetaDons { + donToJobSpecs[donTopology.ID], jobSpecsErr = keystonepor.GenerateJobSpecs( + keystonetypes.GeneratePoRJobSpecsInput{ + CldEnv: input.cldEnv, + Don: donTopology.DON, + NodeOutput: donTopology.NodeOutput, + BlockchainOutput: input.blockchainOutput, + DonID: donTopology.ID, + Flags: donTopology.Flags, + OCR3CapabilityAddress: input.ocr3capabilityAddress, + ExtraAllowedPorts: input.extraAllowedPorts, + ExtraAllowedIPs: input.extraAllowedIPs, + CronCapBinName: cronCapabilityAssetFile, + GatewayConnectorOutput: *input.gatewayConnectorOutput, + }, + ) + if jobSpecsErr != nil { + return nil, errors.Wrapf(jobSpecsErr, "failed to define job specs for DON %d", donTopology.ID) + } + } + + return &jobsAndConfigsOutput{ + nodeToConfigOverrides: donToConfigs, + donToJobSpecs: donToJobSpecs, + }, nil +} +func TestKeystoneWithOCR3Workflow_SingleDon_MockedPrice(t *testing.T) { + testLogger := framework.L + + // Load and validate test configuration + in, err := framework.Load[TestConfig](t) + require.NoError(t, err, "couldn't load test config") + validateEnvVars(t, in) + require.Len(t, in.NodeSets, 1, "expected 1 node set in the test config") + + binaryDownloadOutput, err := downloadBinaryFiles(in) + require.NoError(t, err, "failed to download binary files") + + // Assign all capabilities to the single node set + mustSetCapabilitiesFn := func(input []*ns.Input) []*keystonetypes.CapabilitiesAwareNodeSet { + return []*keystonetypes.CapabilitiesAwareNodeSet{ + { + Input: input[0], + Capabilities: keystonetypes.SingleDonFlags, + DONType: keystonetypes.WorkflowDON, + }, + } + } + + priceProvider, priceErr := NewFakePriceProvider(testLogger, in.Fake) + require.NoError(t, priceErr, "failed to create fake price provider") + + setupOutput := setupTestEnvironment(t, testLogger, in, priceProvider, *binaryDownloadOutput, mustSetCapabilitiesFn) + + // Log extra information that might help debugging + t.Cleanup(func() { + if t.Failed() { + logTestInfo(testLogger, in.WorkflowConfig.FeedID, in.WorkflowConfig.WorkflowName, setupOutput.feedsConsumerAddress.Hex(), setupOutput.forwarderAddress.Hex()) + + logDir := fmt.Sprintf("%s-%s", framework.DefaultCTFLogsDir, t.Name()) + + removeErr := os.RemoveAll(logDir) + if removeErr != nil { + testLogger.Error().Err(removeErr).Msg("failed to remove log directory") + return + } + + _, saveErr := framework.SaveContainerLogs(logDir) + if saveErr != nil { + testLogger.Error().Err(saveErr).Msg("failed to save container logs") + return + } + + debugInput := keystonetypes.DebugInput{ + DonTopology: setupOutput.donTopology, + BlockchainOutput: setupOutput.blockchainOutput, + } + lidebug.PrintTestDebug(t.Name(), testLogger, debugInput) + } + }) + + testLogger.Info().Msg("Waiting for feed to update...") + timeout := 5 * time.Minute // It can take a while before the first report is produced, particularly on CI. + + feedsConsumerInstance, err := feeds_consumer.NewKeystoneFeedsConsumer(setupOutput.feedsConsumerAddress, setupOutput.sethClient.Client) + require.NoError(t, err, "failed to create feeds consumer instance") + + startTime := time.Now() + feedBytes := common.HexToHash(in.WorkflowConfig.FeedID) + + assert.Eventually(t, func() bool { + elapsed := time.Since(startTime).Round(time.Second) + price, _, err := feedsConsumerInstance.GetPrice( + setupOutput.sethClient.NewCallOpts(), + feedBytes, + ) + require.NoError(t, err, "failed to get price from Keystone Consumer contract") + + hasNextPrice := setupOutput.priceProvider.NextPrice(price, elapsed) + if !hasNextPrice { + testLogger.Info().Msgf("Feed not updated yet, waiting for %s", elapsed) + } + + return !hasNextPrice + }, timeout, 10*time.Second, "feed did not update, timeout after: %s", timeout) + + require.EqualValues(t, priceProvider.ExpectedPrices(), priceProvider.ActualPrices(), "prices do not match") + testLogger.Info().Msgf("All %d prices were found in the feed", len(priceProvider.ExpectedPrices())) +} + +func TestKeystoneWithOCR3Workflow_TwoDons_LivePrice(t *testing.T) { + testLogger := framework.L + + // Load and validate test configuration + in, err := framework.Load[TestConfig](t) + require.NoError(t, err, "couldn't load test config") + validateEnvVars(t, in) + require.Len(t, in.NodeSets, 2, "expected 2 node sets in the test config") + + binaryDownloadOutput, err := downloadBinaryFiles(in) + require.NoError(t, err, "failed to download binary files") + + mustSetCapabilitiesFn := func(input []*ns.Input) []*keystonetypes.CapabilitiesAwareNodeSet { + return []*keystonetypes.CapabilitiesAwareNodeSet{ + { + Input: input[0], + Capabilities: []string{keystonetypes.OCR3Capability, keystonetypes.CustomComputeCapability, keystonetypes.CronCapability}, + DONType: keystonetypes.WorkflowDON, + }, + { + Input: input[1], + Capabilities: []string{keystonetypes.WriteEVMCapability}, + DONType: keystonetypes.CapabilitiesDON, // <----- it's crucial to set the correct DON type + }, + } + } + + priceProvider := NewTrueUSDPriceProvider(testLogger) + setupOutput := setupTestEnvironment(t, testLogger, in, priceProvider, *binaryDownloadOutput, mustSetCapabilitiesFn) + + // Log extra information that might help debugging + t.Cleanup(func() { + if t.Failed() { + logTestInfo(testLogger, in.WorkflowConfig.FeedID, in.WorkflowConfig.WorkflowName, setupOutput.feedsConsumerAddress.Hex(), setupOutput.forwarderAddress.Hex()) + + logDir := fmt.Sprintf("%s-%s", framework.DefaultCTFLogsDir, t.Name()) + + removeErr := os.RemoveAll(logDir) + if removeErr != nil { + testLogger.Error().Err(removeErr).Msg("failed to remove log directory") + return + } + + _, saveErr := framework.SaveContainerLogs(logDir) + if saveErr != nil { + testLogger.Error().Err(saveErr).Msg("failed to save container logs") + return + } + + debugInput := keystonetypes.DebugInput{ + DonTopology: setupOutput.donTopology, + BlockchainOutput: setupOutput.blockchainOutput, + } + lidebug.PrintTestDebug(t.Name(), testLogger, debugInput) + } + }) + + testLogger.Info().Msg("Waiting for feed to update...") + timeout := 5 * time.Minute // It can take a while before the first report is produced, particularly on CI. + + feedsConsumerInstance, err := feeds_consumer.NewKeystoneFeedsConsumer(setupOutput.feedsConsumerAddress, setupOutput.sethClient.Client) + require.NoError(t, err, "failed to create feeds consumer instance") + + startTime := time.Now() + feedBytes := common.HexToHash(in.WorkflowConfig.FeedID) + + assert.Eventually(t, func() bool { + elapsed := time.Since(startTime).Round(time.Second) + price, _, err := feedsConsumerInstance.GetPrice( + setupOutput.sethClient.NewCallOpts(), + feedBytes, + ) + require.NoError(t, err, "failed to get price from Keystone Consumer contract") + + hasNextPrice := setupOutput.priceProvider.NextPrice(price, elapsed) + if !hasNextPrice { + testLogger.Info().Msgf("Feed not updated yet, waiting for %s", elapsed) + } + + return !hasNextPrice + }, timeout, 10*time.Second, "feed did not update, timeout after: %s", timeout) + + require.EqualValues(t, priceProvider.ExpectedPrices(), priceProvider.ActualPrices(), "prices do not match") + testLogger.Info().Msgf("All %d prices were found in the feed", len(priceProvider.ExpectedPrices())) +} From 8d2b90ce5208f1dc7dfedadbd6356bab5f3ebc55 Mon Sep 17 00:00:00 2001 From: Street <5597260+MStreet3@users.noreply.github.com> Date: Thu, 20 Feb 2025 09:59:35 -0500 Subject: [PATCH 10/58] Feat/filter labeled addresses (#16464) * feat(deployment): adds LabeledAddresses type * chore(deployment): filters addresses by labels * adds error for missing contracts * refactor(common/changeset): removes bundle check Removes check that the addresses contains all the types and versions defined in a bundle. It is not required that the MCMS state contracts be non-nil. There is a Validate() method and the docstring states that nil values are possible. * chore: adds unit test on GetContractSet * fix(solana): removes unnecessary bundle check * fix(common): removes unnecessary test * chore: fix tests * refactor: renames function * refactor: cleans up implementation * adds changeset * adds mcms state test * fix: prevents multiple labeled MCMS contracts * fix flakey test of slice --- .changeset/young-poems-tan.md | 5 + deployment/address_book.go | 47 ++-- deployment/address_book_labels.go | 4 + deployment/address_book_test.go | 57 ++++- deployment/common/changeset/state.go | 74 +++--- deployment/common/changeset/state/evm.go | 6 +- deployment/common/changeset/state/solana.go | 2 +- deployment/common/changeset/state_test.go | 223 ++++++++++++++++++ .../common/proposalutils/mcms_helpers.go | 2 +- .../keystone/changeset/internal/state.go | 66 ++++-- .../keystone/changeset/internal/state_test.go | 139 +++++++++++ deployment/labeled_addresses.go | 43 ++++ deployment/labeled_addresses_test.go | 81 +++++++ 13 files changed, 676 insertions(+), 73 deletions(-) create mode 100644 .changeset/young-poems-tan.md create mode 100644 deployment/common/changeset/state_test.go create mode 100644 deployment/keystone/changeset/internal/state_test.go create mode 100644 deployment/labeled_addresses.go create mode 100644 deployment/labeled_addresses_test.go diff --git a/.changeset/young-poems-tan.md b/.changeset/young-poems-tan.md new file mode 100644 index 00000000000..69be92c1649 --- /dev/null +++ b/.changeset/young-poems-tan.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +fix(chainlink/deployment): loads unlabeled contracts from address book by default diff --git a/deployment/address_book.go b/deployment/address_book.go index 191c43b9867..5fe06d152c5 100644 --- a/deployment/address_book.go +++ b/deployment/address_book.go @@ -315,28 +315,37 @@ func tvKey(tv TypeAndVersion) typeVersionKey { } } -// AddressesContainBundle checks if the addresses -// contains a single instance of all the addresses in the bundle. -// It returns an error if there are more than one instance of a contract. -func AddressesContainBundle(addrs map[string]TypeAndVersion, wantTypes []TypeAndVersion) (bool, error) { - // Count how many times each wanted TypeAndVersion is found - counts := make(map[typeVersionKey]int) - for _, wantTV := range wantTypes { - wantKey := tvKey(wantTV) - for _, haveTV := range addrs { - if wantTV.Equal(haveTV) { - // They match exactly (Type, Version, Labels) - counts[wantKey]++ - if counts[wantKey] > 1 { - return false, fmt.Errorf("found more than one instance of contract %s %s (labels=%s)", - wantTV.Type, wantTV.Version.String(), wantTV.Labels.String()) - } - } +// EnsureDeduped ensures that each contract in the bundle only appears once +// in the address map. It returns an error if there are more than one instance of a contract. +// Returns true if every value in the bundle is found once, false otherwise. +func EnsureDeduped(addrs map[string]TypeAndVersion, bundle []TypeAndVersion) (bool, error) { + var ( + grouped = toTypeAndVersionMap(addrs) + found = make([]TypeAndVersion, 0) + ) + for _, btv := range bundle { + key := tvKey(btv) + matched, ok := grouped[key] + if ok { + found = append(found, btv) + } + if len(matched) > 1 { + return false, fmt.Errorf("found more than one instance of contract %s v%s (labels=%s)", + key.Type, key.Version, key.Labels) } } - // Ensure we found *all* wantTypes exactly once - return len(counts) == len(wantTypes), nil + // Indicate if each TypeAndVersion in the bundle is found at least once + return len(found) == len(bundle), nil +} + +// toTypeAndVersionMap groups contract addresses by unique TypeAndVersion. +func toTypeAndVersionMap(addrs map[string]TypeAndVersion) map[typeVersionKey][]string { + tvkMap := make(map[typeVersionKey][]string) + for k, v := range addrs { + tvkMap[tvKey(v)] = append(tvkMap[tvKey(v)], k) + } + return tvkMap } // AddLabel adds a string to the LabelSet in the TypeAndVersion. diff --git a/deployment/address_book_labels.go b/deployment/address_book_labels.go index f559a39078a..bfdb60438fd 100644 --- a/deployment/address_book_labels.go +++ b/deployment/address_book_labels.go @@ -65,3 +65,7 @@ func (ls LabelSet) Equal(other LabelSet) bool { } return true } + +func (ls LabelSet) IsEmpty() bool { + return len(ls) == 0 +} diff --git a/deployment/address_book_test.go b/deployment/address_book_test.go index 0c6b228da2e..fa9bebccac6 100644 --- a/deployment/address_book_test.go +++ b/deployment/address_book_test.go @@ -244,7 +244,7 @@ func TestAddressBook_ConcurrencyAndDeadlock(t *testing.T) { wg.Wait() } -func TestAddressesContainBundle(t *testing.T) { +func Test_EnsureDeduped(t *testing.T) { t.Parallel() // Define some TypeAndVersion values @@ -336,7 +336,7 @@ func TestAddressesContainBundle(t *testing.T) { t.Run(tt.name, func(t *testing.T) { t.Parallel() - gotResult, gotErr := AddressesContainBundle(tt.addrs, tt.wantTypes) + gotResult, gotErr := EnsureDeduped(tt.addrs, tt.wantTypes) if tt.wantErr { require.Error(t, gotErr, "expected an error but got none") @@ -491,3 +491,56 @@ func TestTypeAndVersion_AddLabels(t *testing.T) { }) } } + +func Test_toTypeAndVersionMap(t *testing.T) { + v100 := semver.MustParse("1.0.0") + + tests := []struct { + name string + addrs map[string]TypeAndVersion + want map[typeVersionKey][]string + }{ + { + name: "OK_single entry", + addrs: map[string]TypeAndVersion{ + "addr1": {Type: "type1", Version: *v100}, + }, + want: map[typeVersionKey][]string{ + {Type: "type1", Version: "1.0.0", Labels: ""}: {"addr1"}, + }, + }, + { + name: "OK_multiple entries same type no labels", + addrs: map[string]TypeAndVersion{ + "addr1": {Type: "type1", Version: *v100}, + "addr2": {Type: "type1", Version: *v100}, + }, + want: map[typeVersionKey][]string{ + {Type: "type1", Version: "1.0.0", Labels: ""}: {"addr1", "addr2"}, + }, + }, + { + name: "OK_multiple entries same type with labels", + addrs: map[string]TypeAndVersion{ + "addr1": {Type: "type1", Version: *v100, Labels: NewLabelSet("test")}, + "addr2": {Type: "type1", Version: *v100}, + }, + want: map[typeVersionKey][]string{ + {Type: "type1", Version: "1.0.0", Labels: "test"}: {"addr1"}, + {Type: "type1", Version: "1.0.0", Labels: ""}: {"addr2"}, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := toTypeAndVersionMap(tt.addrs) + require.Equal(t, len(tt.want), len(got)) + for k, gotAddresses := range got { + wantAddresses, ok := tt.want[k] + require.True(t, ok) + require.ElementsMatch(t, wantAddresses, gotAddresses) + } + }) + } +} diff --git a/deployment/common/changeset/state.go b/deployment/common/changeset/state.go index f081907d319..5dabf1447e3 100644 --- a/deployment/common/changeset/state.go +++ b/deployment/common/changeset/state.go @@ -79,78 +79,96 @@ func MaybeLoadMCMSWithTimelockState(env deployment.Environment, chainSelectors [ // MaybeLoadMCMSWithTimelockChainState looks for the addresses corresponding to // contracts deployed with DeployMCMSWithTimelock and loads them into a -// MCMSWithTimelockState struct. If none of the contracts are found, the state struct will be nil. +// MCMSWithTimelockState struct. If none of the contracts are found, the state struct will be nil. +// // An error indicates: // - Found but was unable to load a contract // - It only found part of the bundle of contracts // - If found more than one instance of a contract (we expect one bundle in the given addresses) -func MaybeLoadMCMSWithTimelockChainState(chain deployment.Chain, addresses map[string]deployment.TypeAndVersion) (*MCMSWithTimelockState, error) { - state := MCMSWithTimelockState{ - MCMSWithTimelockContracts: &proposalutils.MCMSWithTimelockContracts{}, - } - // We expect one of each contract on the chain. - timelock := deployment.NewTypeAndVersion(types.RBACTimelock, deployment.Version1_0_0) - callProxy := deployment.NewTypeAndVersion(types.CallProxy, deployment.Version1_0_0) - proposer := deployment.NewTypeAndVersion(types.ProposerManyChainMultisig, deployment.Version1_0_0) - canceller := deployment.NewTypeAndVersion(types.CancellerManyChainMultisig, deployment.Version1_0_0) - bypasser := deployment.NewTypeAndVersion(types.BypasserManyChainMultisig, deployment.Version1_0_0) - // the same contract can have different roles - multichain := deployment.NewTypeAndVersion(types.ManyChainMultisig, deployment.Version1_0_0) +func MaybeLoadMCMSWithTimelockChainState( + chain deployment.Chain, + addresses map[string]deployment.TypeAndVersion, +) (*MCMSWithTimelockState, error) { + var ( + state = MCMSWithTimelockState{ + MCMSWithTimelockContracts: &proposalutils.MCMSWithTimelockContracts{}, + } + + // We expect one of each contract on the chain. + timelock = deployment.NewTypeAndVersion(types.RBACTimelock, deployment.Version1_0_0) + callProxy = deployment.NewTypeAndVersion(types.CallProxy, deployment.Version1_0_0) + proposer = deployment.NewTypeAndVersion(types.ProposerManyChainMultisig, deployment.Version1_0_0) + canceller = deployment.NewTypeAndVersion(types.CancellerManyChainMultisig, deployment.Version1_0_0) + bypasser = deployment.NewTypeAndVersion(types.BypasserManyChainMultisig, deployment.Version1_0_0) + + // the same contract can have different roles + multichain = deployment.NewTypeAndVersion(types.ManyChainMultisig, deployment.Version1_0_0) + proposerMCMS = deployment.NewTypeAndVersion(types.ManyChainMultisig, deployment.Version1_0_0) + bypasserMCMS = deployment.NewTypeAndVersion(types.ManyChainMultisig, deployment.Version1_0_0) + cancellerMCMS = deployment.NewTypeAndVersion(types.ManyChainMultisig, deployment.Version1_0_0) + ) // Convert map keys to a slice - wantTypes := []deployment.TypeAndVersion{timelock, proposer, canceller, bypasser, callProxy} + proposerMCMS.Labels.Add(types.ProposerRole.String()) + bypasserMCMS.Labels.Add(types.BypasserRole.String()) + cancellerMCMS.Labels.Add(types.CancellerRole.String()) + wantTypes := []deployment.TypeAndVersion{timelock, proposer, canceller, bypasser, callProxy, + proposerMCMS, bypasserMCMS, cancellerMCMS, + } // Ensure we either have the bundle or not. - _, err := deployment.AddressesContainBundle(addresses, wantTypes) + _, err := deployment.EnsureDeduped(addresses, wantTypes) if err != nil { return nil, fmt.Errorf("unable to check MCMS contracts on chain %s error: %w", chain.Name(), err) } - for address, tvStr := range addresses { + for address, tv := range addresses { switch { - case tvStr.Type == timelock.Type && tvStr.Version.String() == timelock.Version.String(): + case tv.Type == timelock.Type && tv.Version.String() == timelock.Version.String(): tl, err := owner_helpers.NewRBACTimelock(common.HexToAddress(address), chain.Client) if err != nil { return nil, err } state.Timelock = tl - case tvStr.Type == callProxy.Type && tvStr.Version.String() == callProxy.Version.String(): + case tv.Type == callProxy.Type && tv.Version.String() == callProxy.Version.String(): cp, err := owner_helpers.NewCallProxy(common.HexToAddress(address), chain.Client) if err != nil { return nil, err } state.CallProxy = cp - case tvStr.Type == proposer.Type && tvStr.Version.String() == proposer.Version.String(): + case tv.Type == proposer.Type && tv.Version.String() == proposer.Version.String(): mcms, err := owner_helpers.NewManyChainMultiSig(common.HexToAddress(address), chain.Client) if err != nil { return nil, err } state.ProposerMcm = mcms - case tvStr.Type == bypasser.Type && tvStr.Version.String() == bypasser.Version.String(): + case tv.Type == bypasser.Type && tv.Version.String() == bypasser.Version.String(): mcms, err := owner_helpers.NewManyChainMultiSig(common.HexToAddress(address), chain.Client) if err != nil { return nil, err } state.BypasserMcm = mcms - case tvStr.Type == canceller.Type && tvStr.Version.String() == canceller.Version.String(): + case tv.Type == canceller.Type && tv.Version.String() == canceller.Version.String(): mcms, err := owner_helpers.NewManyChainMultiSig(common.HexToAddress(address), chain.Client) if err != nil { return nil, err } state.CancellerMcm = mcms - case tvStr.Type == multichain.Type && tvStr.Version.String() == multichain.Version.String(): - // the same contract can have different roles so we use the labels to determine which role it is + case tv.Type == multichain.Type && tv.Version.String() == multichain.Version.String(): + // Contract of type ManyChainMultiSig must be labeled to assign to the proper state + // field. If a specifically typed contract already occupies the field, then this + // contract will be ignored. mcms, err := owner_helpers.NewManyChainMultiSig(common.HexToAddress(address), chain.Client) if err != nil { return nil, err } - if tvStr.Labels.Contains(types.ProposerRole.String()) { + if tv.Labels.Contains(types.ProposerRole.String()) && state.ProposerMcm == nil { state.ProposerMcm = mcms } - if tvStr.Labels.Contains(types.BypasserRole.String()) { + if tv.Labels.Contains(types.BypasserRole.String()) && state.BypasserMcm == nil { state.BypasserMcm = mcms } - if tvStr.Labels.Contains(types.CancellerRole.String()) { + if tv.Labels.Contains(types.CancellerRole.String()) && state.CancellerMcm == nil { state.CancellerMcm = mcms } } @@ -199,7 +217,7 @@ func MaybeLoadLinkTokenChainState(chain deployment.Chain, addresses map[string]d wantTypes := []deployment.TypeAndVersion{linkToken} // Ensure we either have the bundle or not. - _, err := deployment.AddressesContainBundle(addresses, wantTypes) + _, err := deployment.EnsureDeduped(addresses, wantTypes) if err != nil { return nil, fmt.Errorf("unable to check link token on chain %s error: %w", chain.Name(), err) } @@ -235,7 +253,7 @@ func MaybeLoadStaticLinkTokenState(chain deployment.Chain, addresses map[string] wantTypes := []deployment.TypeAndVersion{staticLinkToken} // Ensure we either have the bundle or not. - _, err := deployment.AddressesContainBundle(addresses, wantTypes) + _, err := deployment.EnsureDeduped(addresses, wantTypes) if err != nil { return nil, fmt.Errorf("unable to check static link token on chain %s error: %w", chain.Name(), err) } diff --git a/deployment/common/changeset/state/evm.go b/deployment/common/changeset/state/evm.go index c81f6d1a453..56aec845339 100644 --- a/deployment/common/changeset/state/evm.go +++ b/deployment/common/changeset/state/evm.go @@ -77,7 +77,7 @@ func MaybeLoadMCMSWithTimelockChainState(chain deployment.Chain, addresses map[s wantTypes := []deployment.TypeAndVersion{timelock, proposer, canceller, bypasser, callProxy} // Ensure we either have the bundle or not. - _, err := deployment.AddressesContainBundle(addresses, wantTypes) + _, err := deployment.EnsureDeduped(addresses, wantTypes) if err != nil { return nil, fmt.Errorf("unable to check MCMS contracts on chain %s error: %w", chain.Name(), err) } @@ -175,7 +175,7 @@ func MaybeLoadLinkTokenChainState(chain deployment.Chain, addresses map[string]d wantTypes := []deployment.TypeAndVersion{linkToken} // Ensure we either have the bundle or not. - _, err := deployment.AddressesContainBundle(addresses, wantTypes) + _, err := deployment.EnsureDeduped(addresses, wantTypes) if err != nil { return nil, fmt.Errorf("unable to check link token on chain %s error: %w", chain.Name(), err) } @@ -211,7 +211,7 @@ func MaybeLoadStaticLinkTokenState(chain deployment.Chain, addresses map[string] wantTypes := []deployment.TypeAndVersion{staticLinkToken} // Ensure we either have the bundle or not. - _, err := deployment.AddressesContainBundle(addresses, wantTypes) + _, err := deployment.EnsureDeduped(addresses, wantTypes) if err != nil { return nil, fmt.Errorf("unable to check static link token on chain %s error: %w", chain.Name(), err) } diff --git a/deployment/common/changeset/state/solana.go b/deployment/common/changeset/state/solana.go index 772c2482ced..ac6aa080a91 100644 --- a/deployment/common/changeset/state/solana.go +++ b/deployment/common/changeset/state/solana.go @@ -216,7 +216,7 @@ func MaybeLoadMCMSWithTimelockChainStateSolana(chain deployment.SolChain, addres } // Ensure we either have the bundle or not. - _, err := deployment.AddressesContainBundle(addresses, wantTypes) + _, err := deployment.EnsureDeduped(addresses, wantTypes) if err != nil { return nil, fmt.Errorf("unable to check MCMS contracts on chain %s error: %w", chain.Name(), err) } diff --git a/deployment/common/changeset/state_test.go b/deployment/common/changeset/state_test.go new file mode 100644 index 00000000000..4c477a87c68 --- /dev/null +++ b/deployment/common/changeset/state_test.go @@ -0,0 +1,223 @@ +package changeset + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" + + owner_helpers "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers" + chainsel "github.com/smartcontractkit/chain-selectors" + + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" + "github.com/smartcontractkit/chainlink/deployment/common/types" + + "github.com/stretchr/testify/require" +) + +func TestMaybeLoadMCMSWithTimelockChainState(t *testing.T) { + type testCase struct { + name string + chain deployment.Chain + addresses map[string]deployment.TypeAndVersion + wantState *MCMSWithTimelockState // Expected state + wantErr string + } + + defaultChain := deployment.Chain{ + Selector: chainsel.ETHEREUM_TESTNET_SEPOLIA.Selector, + } + tests := []testCase{ + { + name: "OK_load all contracts from address book", + chain: defaultChain, + addresses: map[string]deployment.TypeAndVersion{ + "0x123": deployment.NewTypeAndVersion(types.RBACTimelock, deployment.Version1_0_0), + "0x456": deployment.NewTypeAndVersion(types.CallProxy, deployment.Version1_0_0), + "0x789": deployment.NewTypeAndVersion(types.ProposerManyChainMultisig, deployment.Version1_0_0), + "0xabc": deployment.NewTypeAndVersion(types.CancellerManyChainMultisig, deployment.Version1_0_0), + "0xdef": deployment.NewTypeAndVersion(types.BypasserManyChainMultisig, deployment.Version1_0_0), + }, + wantState: &MCMSWithTimelockState{ + MCMSWithTimelockContracts: &proposalutils.MCMSWithTimelockContracts{ + Timelock: func() *owner_helpers.RBACTimelock { + tl, err := owner_helpers.NewRBACTimelock(common.HexToAddress("0x123"), nil) + require.NoError(t, err) + return tl + }(), + CallProxy: func() *owner_helpers.CallProxy { + cp, err := owner_helpers.NewCallProxy(common.HexToAddress("0x456"), nil) + require.NoError(t, err) + return cp + }(), + ProposerMcm: func() *owner_helpers.ManyChainMultiSig { + mcms, err := owner_helpers.NewManyChainMultiSig(common.HexToAddress("0x789"), nil) + require.NoError(t, err) + return mcms + }(), + CancellerMcm: func() *owner_helpers.ManyChainMultiSig { + mcms, err := owner_helpers.NewManyChainMultiSig(common.HexToAddress("0xabc"), nil) + require.NoError(t, err) + return mcms + }(), + BypasserMcm: func() *owner_helpers.ManyChainMultiSig { + mcms, err := owner_helpers.NewManyChainMultiSig(common.HexToAddress("0xdef"), nil) + require.NoError(t, err) + return mcms + }(), + }, + }, + wantErr: "", + }, + { + name: "OK_labelled multichain contract is selected if only option", + chain: defaultChain, + addresses: map[string]deployment.TypeAndVersion{ + "0x123": deployment.NewTypeAndVersion(types.RBACTimelock, deployment.Version1_0_0), + "0x456": deployment.NewTypeAndVersion(types.CallProxy, deployment.Version1_0_0), + "0xabc": deployment.NewTypeAndVersion(types.CancellerManyChainMultisig, deployment.Version1_0_0), + "0xdef": deployment.NewTypeAndVersion(types.BypasserManyChainMultisig, deployment.Version1_0_0), + "0xaaa": func() deployment.TypeAndVersion { + tv := deployment.NewTypeAndVersion(types.ManyChainMultisig, deployment.Version1_0_0) + tv.Labels.Add(types.ProposerRole.String()) + return tv + }(), + }, + wantState: &MCMSWithTimelockState{ + MCMSWithTimelockContracts: &proposalutils.MCMSWithTimelockContracts{ + Timelock: func() *owner_helpers.RBACTimelock { + tl, err := owner_helpers.NewRBACTimelock(common.HexToAddress("0x123"), nil) + require.NoError(t, err) + return tl + }(), + CallProxy: func() *owner_helpers.CallProxy { + cp, err := owner_helpers.NewCallProxy(common.HexToAddress("0x456"), nil) + require.NoError(t, err) + return cp + }(), + CancellerMcm: func() *owner_helpers.ManyChainMultiSig { + mcms, err := owner_helpers.NewManyChainMultiSig(common.HexToAddress("0xabc"), nil) + require.NoError(t, err) + return mcms + }(), + BypasserMcm: func() *owner_helpers.ManyChainMultiSig { + mcms, err := owner_helpers.NewManyChainMultiSig(common.HexToAddress("0xdef"), nil) + require.NoError(t, err) + return mcms + }(), + ProposerMcm: func() *owner_helpers.ManyChainMultiSig { + mcms, err := owner_helpers.NewManyChainMultiSig(common.HexToAddress("0xaaa"), nil) + require.NoError(t, err) + return mcms + }(), + }, + }, + }, + { + // A ManyChainMultiSig contract can be labeled or it can be typed. A typed contract should be selected + // over a labeled contract. + name: "OK_labelled multichain contract has lower selection precedence", + chain: defaultChain, + addresses: map[string]deployment.TypeAndVersion{ + "0x123": deployment.NewTypeAndVersion(types.RBACTimelock, deployment.Version1_0_0), + "0x456": deployment.NewTypeAndVersion(types.CallProxy, deployment.Version1_0_0), + "0xabc": deployment.NewTypeAndVersion(types.CancellerManyChainMultisig, deployment.Version1_0_0), + "0xdef": deployment.NewTypeAndVersion(types.BypasserManyChainMultisig, deployment.Version1_0_0), + + // Two contracts can satisfy the ProposerMcm field. This test ensures that the typed contract is + // returned over the labeled contract. + "0x789": deployment.NewTypeAndVersion(types.ProposerManyChainMultisig, deployment.Version1_0_0), + "0xaaa": func() deployment.TypeAndVersion { + tv := deployment.NewTypeAndVersion(types.ManyChainMultisig, deployment.Version1_0_0) + tv.Labels.Add(types.ProposerRole.String()) + return tv + }(), + }, + wantState: &MCMSWithTimelockState{ + MCMSWithTimelockContracts: &proposalutils.MCMSWithTimelockContracts{ + Timelock: func() *owner_helpers.RBACTimelock { + tl, err := owner_helpers.NewRBACTimelock(common.HexToAddress("0x123"), nil) + require.NoError(t, err) + return tl + }(), + CallProxy: func() *owner_helpers.CallProxy { + cp, err := owner_helpers.NewCallProxy(common.HexToAddress("0x456"), nil) + require.NoError(t, err) + return cp + }(), + CancellerMcm: func() *owner_helpers.ManyChainMultiSig { + mcms, err := owner_helpers.NewManyChainMultiSig(common.HexToAddress("0xabc"), nil) + require.NoError(t, err) + return mcms + }(), + BypasserMcm: func() *owner_helpers.ManyChainMultiSig { + mcms, err := owner_helpers.NewManyChainMultiSig(common.HexToAddress("0xdef"), nil) + require.NoError(t, err) + return mcms + }(), + ProposerMcm: func() *owner_helpers.ManyChainMultiSig { + mcms, err := owner_helpers.NewManyChainMultiSig(common.HexToAddress("0x789"), nil) + require.NoError(t, err) + return mcms + }(), + }, + }, + }, + { + name: "NOK_multiple contracts of same type", + chain: defaultChain, + addresses: map[string]deployment.TypeAndVersion{ + "0x123": deployment.NewTypeAndVersion(types.RBACTimelock, deployment.Version1_0_0), + "0x456": deployment.NewTypeAndVersion(types.CallProxy, deployment.Version1_0_0), + "0xabc": deployment.NewTypeAndVersion(types.CancellerManyChainMultisig, deployment.Version1_0_0), + "0xdef": deployment.NewTypeAndVersion(types.BypasserManyChainMultisig, deployment.Version1_0_0), + + "0x789": deployment.NewTypeAndVersion(types.ProposerManyChainMultisig, deployment.Version1_0_0), + "0xaaa": deployment.NewTypeAndVersion(types.RBACTimelock, deployment.Version1_0_0), // duplicate + }, + wantErr: "unable to check MCMS contracts", + }, + { + name: "NOK_multiple generic MCMS contracts with same label", + chain: defaultChain, + addresses: map[string]deployment.TypeAndVersion{ + "0x123": deployment.NewTypeAndVersion(types.RBACTimelock, deployment.Version1_0_0), + "0x456": deployment.NewTypeAndVersion(types.CallProxy, deployment.Version1_0_0), + "0xabc": deployment.NewTypeAndVersion(types.CancellerManyChainMultisig, deployment.Version1_0_0), + "0xdef": deployment.NewTypeAndVersion(types.BypasserManyChainMultisig, deployment.Version1_0_0), + + "0x789": deployment.NewTypeAndVersion(types.ProposerManyChainMultisig, deployment.Version1_0_0), + "0xaaa": func() deployment.TypeAndVersion { + tv := deployment.NewTypeAndVersion(types.ManyChainMultisig, deployment.Version1_0_0) + tv.Labels.Add(types.ProposerRole.String()) + return tv + }(), + "0xbbb": func() deployment.TypeAndVersion { + tv := deployment.NewTypeAndVersion(types.ManyChainMultisig, deployment.Version1_0_0) + tv.Labels.Add(types.ProposerRole.String()) + return tv + }(), + }, + wantErr: "unable to check MCMS contracts", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotState, err := MaybeLoadMCMSWithTimelockChainState(tt.chain, tt.addresses) + + if tt.wantErr != "" { + require.Error(t, err) + require.ErrorContains(t, err, tt.wantErr) + return + } + + require.NoError(t, err) + require.Equal(t, tt.wantState.MCMSWithTimelockContracts.Timelock.Address(), gotState.MCMSWithTimelockContracts.Timelock.Address()) + require.Equal(t, tt.wantState.MCMSWithTimelockContracts.CallProxy.Address(), gotState.MCMSWithTimelockContracts.CallProxy.Address()) + require.Equal(t, tt.wantState.MCMSWithTimelockContracts.ProposerMcm.Address(), gotState.MCMSWithTimelockContracts.ProposerMcm.Address()) + require.Equal(t, tt.wantState.MCMSWithTimelockContracts.CancellerMcm.Address(), gotState.MCMSWithTimelockContracts.CancellerMcm.Address()) + require.Equal(t, tt.wantState.MCMSWithTimelockContracts.BypasserMcm.Address(), gotState.MCMSWithTimelockContracts.BypasserMcm.Address()) + }) + } +} diff --git a/deployment/common/proposalutils/mcms_helpers.go b/deployment/common/proposalutils/mcms_helpers.go index 5ee4a1aa554..2d9f28d7ef9 100644 --- a/deployment/common/proposalutils/mcms_helpers.go +++ b/deployment/common/proposalutils/mcms_helpers.go @@ -239,7 +239,7 @@ func MaybeLoadMCMSWithTimelockContracts(chain deployment.Chain, addresses map[st // Convert map keys to a slice wantTypes := []deployment.TypeAndVersion{timelock, proposer, canceller, bypasser, callProxy} - _, err := deployment.AddressesContainBundle(addresses, wantTypes) + _, err := deployment.EnsureDeduped(addresses, wantTypes) if err != nil { return nil, fmt.Errorf("unable to check MCMS contracts on chain %s error: %w", chain.Name(), err) } diff --git a/deployment/keystone/changeset/internal/state.go b/deployment/keystone/changeset/internal/state.go index 61b4af862ab..1a4a1ea34aa 100644 --- a/deployment/keystone/changeset/internal/state.go +++ b/deployment/keystone/changeset/internal/state.go @@ -21,6 +21,11 @@ import ( type GetContractSetsRequest struct { Chains map[uint64]deployment.Chain AddressBook deployment.AddressBook + + // Labels indicates the label set that a contract must include to be considered as a member + // of the returned contract set. By default, an empty label set implies that only contracts without + // labels will be considered. Otherwise, all labels must be on the contract (e.g., "label1" AND "label2"). + Labels []string } type GetContractSetsResponse struct { @@ -94,7 +99,10 @@ func GetContractSets(lggr logger.Logger, req *GetContractSetsRequest) (*GetContr if err != nil { return nil, fmt.Errorf("failed to get addresses for chain %d: %w", id, err) } - cs, err := loadContractSet(lggr, chain, addrs) + + filtered := deployment.LabeledAddresses(addrs).And(req.Labels...) + + cs, err := loadContractSet(lggr, chain, filtered) if err != nil { return nil, fmt.Errorf("failed to load contract set for chain %d: %w", id, err) } @@ -103,7 +111,12 @@ func GetContractSets(lggr logger.Logger, req *GetContractSetsRequest) (*GetContr return resp, nil } -func loadContractSet(lggr logger.Logger, chain deployment.Chain, addresses map[string]deployment.TypeAndVersion) (*ContractSet, error) { +// loadContractSet loads the MCMS state and then sets the Keystone contract state. +func loadContractSet( + lggr logger.Logger, + chain deployment.Chain, + addresses map[string]deployment.TypeAndVersion, +) (*ContractSet, error) { var out ContractSet mcmsWithTimelock, err := commonchangeset.MaybeLoadMCMSWithTimelockChainState(chain, addresses) if err != nil { @@ -111,42 +124,57 @@ func loadContractSet(lggr logger.Logger, chain deployment.Chain, addresses map[s } out.MCMSWithTimelockState = *mcmsWithTimelock + if err := setContracts(lggr, addresses, chain.Client, &out); err != nil { + return nil, err + } + + return &out, nil +} + +// setContracts sets the Keystone contract state. Non-Keystone contracts (e.g., MCMS contracts) are +// ignored. +func setContracts( + lggr logger.Logger, + addresses map[string]deployment.TypeAndVersion, + client deployment.OnchainClient, + set *ContractSet, +) error { for addr, tv := range addresses { // todo handle versions switch tv.Type { case CapabilitiesRegistry: - c, err := capabilities_registry.NewCapabilitiesRegistry(common.HexToAddress(addr), chain.Client) + c, err := capabilities_registry.NewCapabilitiesRegistry(common.HexToAddress(addr), client) if err != nil { - return nil, fmt.Errorf("failed to create capability registry contract from address %s: %w", addr, err) + return fmt.Errorf("failed to create capability registry contract from address %s: %w", addr, err) } - out.CapabilitiesRegistry = c + set.CapabilitiesRegistry = c case KeystoneForwarder: - c, err := forwarder.NewKeystoneForwarder(common.HexToAddress(addr), chain.Client) + c, err := forwarder.NewKeystoneForwarder(common.HexToAddress(addr), client) if err != nil { - return nil, fmt.Errorf("failed to create forwarder contract from address %s: %w", addr, err) + return fmt.Errorf("failed to create forwarder contract from address %s: %w", addr, err) } - out.Forwarder = c + set.Forwarder = c case OCR3Capability: - c, err := ocr3_capability.NewOCR3Capability(common.HexToAddress(addr), chain.Client) + c, err := ocr3_capability.NewOCR3Capability(common.HexToAddress(addr), client) if err != nil { - return nil, fmt.Errorf("failed to create OCR3Capability contract from address %s: %w", addr, err) + return fmt.Errorf("failed to create OCR3Capability contract from address %s: %w", addr, err) } - if out.OCR3 == nil { - out.OCR3 = make(map[common.Address]*ocr3_capability.OCR3Capability) + if set.OCR3 == nil { + set.OCR3 = make(map[common.Address]*ocr3_capability.OCR3Capability) } - out.OCR3[common.HexToAddress(addr)] = c + set.OCR3[common.HexToAddress(addr)] = c case WorkflowRegistry: - c, err := workflow_registry.NewWorkflowRegistry(common.HexToAddress(addr), chain.Client) + c, err := workflow_registry.NewWorkflowRegistry(common.HexToAddress(addr), client) if err != nil { - return nil, fmt.Errorf("failed to create OCR3Capability contract from address %s: %w", addr, err) + return fmt.Errorf("failed to create OCR3Capability contract from address %s: %w", addr, err) } - out.WorkflowRegistry = c + set.WorkflowRegistry = c default: - lggr.Warnw("unknown contract type", "type", tv.Type) - // ignore unknown contract types + // do nothing, non-exhaustive + lggr.Warnf("skipping contract of type : %s", tv.Type) } } - return &out, nil + return nil } // getOCR3Contract returns the OCR3 contract from the contract set. By default, it returns the only diff --git a/deployment/keystone/changeset/internal/state_test.go b/deployment/keystone/changeset/internal/state_test.go new file mode 100644 index 00000000000..bfed62266ca --- /dev/null +++ b/deployment/keystone/changeset/internal/state_test.go @@ -0,0 +1,139 @@ +package internal + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" + + chainsel "github.com/smartcontractkit/chain-selectors" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/deployment" + commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" + kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" + + "github.com/stretchr/testify/require" +) + +func Test_GetContractSet(t *testing.T) { + type testCase struct { + name string + giveRequest *GetContractSetsRequest + wantResp *GetContractSetsResponse + wantErr string + } + lggr := logger.Test(t) + chain := chainsel.ETHEREUM_TESTNET_SEPOLIA + + tt := []testCase{ + { + name: "OK_picks unlabeled contracts by default", + giveRequest: func() *GetContractSetsRequest { + giveAB := map[uint64]map[string]deployment.TypeAndVersion{ + chain.Selector: { + "0xabc": deployment.NewTypeAndVersion( + deployment.ContractType("CapabilitiesRegistry"), + deployment.Version1_0_0, + ), + "0x123": func() deployment.TypeAndVersion { + tv := deployment.NewTypeAndVersion( + deployment.ContractType("CapabilitiesRegistry"), + deployment.Version1_0_0, + ) + tv.Labels.Add("SA") + return tv + }(), + }, + } + ab := deployment.NewMemoryAddressBookFromMap( + giveAB, + ) + req := &GetContractSetsRequest{ + Chains: map[uint64]deployment.Chain{ + chain.Selector: { + Selector: chain.Selector, + }, + }, + AddressBook: ab, + } + return req + }(), + wantResp: &GetContractSetsResponse{ + ContractSets: map[uint64]ContractSet{ + chain.Selector: { + MCMSWithTimelockState: commonchangeset.MCMSWithTimelockState{ + MCMSWithTimelockContracts: &proposalutils.MCMSWithTimelockContracts{}, + }, + CapabilitiesRegistry: func() *kcr.CapabilitiesRegistry { + cr, err := kcr.NewCapabilitiesRegistry(common.HexToAddress("0xabc"), nil) + require.NoError(t, err) + return cr + }(), + }, + }, + }, + }, + { + name: "OK_resolves labeled contracts", + giveRequest: func() *GetContractSetsRequest { + giveAB := map[uint64]map[string]deployment.TypeAndVersion{ + chain.Selector: { + "0xabc": deployment.NewTypeAndVersion( + deployment.ContractType("CapabilitiesRegistry"), + deployment.Version1_0_0, + ), + "0x123": func() deployment.TypeAndVersion { + tv := deployment.NewTypeAndVersion( + deployment.ContractType("CapabilitiesRegistry"), + deployment.Version1_0_0, + ) + tv.Labels.Add("SA") + return tv + }(), + }, + } + ab := deployment.NewMemoryAddressBookFromMap( + giveAB, + ) + req := &GetContractSetsRequest{ + Chains: map[uint64]deployment.Chain{ + chain.Selector: { + Selector: chain.Selector, + }, + }, + Labels: []string{"SA"}, + AddressBook: ab, + } + return req + }(), + wantResp: &GetContractSetsResponse{ + ContractSets: map[uint64]ContractSet{ + chain.Selector: { + MCMSWithTimelockState: commonchangeset.MCMSWithTimelockState{ + MCMSWithTimelockContracts: &proposalutils.MCMSWithTimelockContracts{}, + }, + CapabilitiesRegistry: func() *kcr.CapabilitiesRegistry { + cr, err := kcr.NewCapabilitiesRegistry(common.HexToAddress("0x123"), nil) + require.NoError(t, err) + return cr + }(), + }, + }, + }, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + gotResp, err := GetContractSets(lggr, tc.giveRequest) + if tc.wantErr != "" { + require.Error(t, err) + require.ErrorContains(t, err, tc.wantErr) + return + } + + require.Equal(t, tc.wantResp, gotResp) + }) + } +} diff --git a/deployment/labeled_addresses.go b/deployment/labeled_addresses.go new file mode 100644 index 00000000000..03d7fcb9757 --- /dev/null +++ b/deployment/labeled_addresses.go @@ -0,0 +1,43 @@ +package deployment + +// LabeledAddresses is an alias to a map whose keys are contract addresses +type LabeledAddresses map[string]TypeAndVersion + +// And filters the LabeledAddresses to only include those entries that contain all +// labels. If labels is empty, then only unlabeled entries are returned. +func (la LabeledAddresses) And(labels ...string) LabeledAddresses { + var ( + filtered = make(LabeledAddresses, 0) + selectUnlabeled = len(labels) == 0 + filterByLabels = len(labels) > 0 + ) + + for addr, tv := range la { + // ignore labeled contracts by default + if selectUnlabeled && !tv.Labels.IsEmpty() { + continue + } + + // ingore unlabeled contracts if labels are received + if filterByLabels && tv.Labels.IsEmpty() { + continue + } + + if selectUnlabeled && tv.Labels.IsEmpty() { + filtered[addr] = tv + continue + } + + if filterByLabels { + keep := true + for _, label := range labels { + keep = keep && tv.Labels.Contains(label) + } + if keep { + filtered[addr] = tv + } + } + } + + return filtered +} diff --git a/deployment/labeled_addresses_test.go b/deployment/labeled_addresses_test.go new file mode 100644 index 00000000000..e643e8b897c --- /dev/null +++ b/deployment/labeled_addresses_test.go @@ -0,0 +1,81 @@ +package deployment + +import ( + "testing" + + "github.com/Masterminds/semver/v3" + "github.com/stretchr/testify/require" +) + +func TestLabeledAddresses_And(t *testing.T) { + tests := []struct { + name string + give LabeledAddresses + labels []string + want LabeledAddresses + }{ + { + name: "No labels returns unlabeled", + give: LabeledAddresses{ + "addr1": {Type: "type1", Version: *semver.MustParse("1.0.0"), Labels: nil}, + "addr2": {Type: "type2", Version: *semver.MustParse("2.0.0"), Labels: NewLabelSet("label1")}, + }, + labels: nil, + want: LabeledAddresses{ + "addr1": {Type: "type1", Version: *semver.MustParse("1.0.0"), Labels: nil}, + }, + }, + { + name: "One label", + give: LabeledAddresses{ + "addr1": {Type: "type1", Version: *semver.MustParse("1.0.0"), Labels: NewLabelSet("label1")}, + "addr2": {Type: "type2", Version: *semver.MustParse("2.0.0"), Labels: NewLabelSet("label2")}, + "addr3": {Type: "type3", Version: *semver.MustParse("3.0.0"), Labels: NewLabelSet("label1", "label2")}, + }, + labels: []string{"label1"}, + want: LabeledAddresses{ + "addr1": {Type: "type1", Version: *semver.MustParse("1.0.0"), Labels: NewLabelSet("label1")}, + "addr3": {Type: "type3", Version: *semver.MustParse("3.0.0"), Labels: NewLabelSet("label1", "label2")}, + }, + }, + { + name: "Multiple labels", + give: LabeledAddresses{ + "addr1": {Type: "type1", Version: *semver.MustParse("1.0.0"), Labels: NewLabelSet("label1", "label2")}, + "addr2": {Type: "type2", Version: *semver.MustParse("2.0.0"), Labels: NewLabelSet("label1")}, + "addr3": {Type: "type3", Version: *semver.MustParse("3.0.0"), Labels: NewLabelSet("label2")}, + }, + labels: []string{"label1", "label2"}, + want: LabeledAddresses{ + "addr1": {Type: "type1", Version: *semver.MustParse("1.0.0"), Labels: NewLabelSet("label1", "label2")}, + }, + }, + { + name: "Empty LabeledAddresses", + give: LabeledAddresses{}, + labels: []string{"label1"}, + want: LabeledAddresses{}, + }, + { + name: "No matching labels", + give: LabeledAddresses{ + "addr1": {Type: "type1", Version: *semver.MustParse("1.0.0"), Labels: NewLabelSet("label1")}, + }, + labels: []string{"label2"}, + want: LabeledAddresses{}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := tt.give.And(tt.labels...) + require.Equal(t, len(tt.want), len(got), "len of got != len of want") + + for addr, lsa := range tt.want { + lsb, exists := got[addr] + require.Truef(t, exists, "key %s is missing from got", addr) + require.True(t, lsa.Equal(lsb), "label sets differ from got and want") + } + }) + } +} From a510315fb978e9437baa815d58755f51a02519bb Mon Sep 17 00:00:00 2001 From: msuchacz-cll <170782674+msuchacz-cll@users.noreply.github.com> Date: Thu, 20 Feb 2025 16:06:03 +0100 Subject: [PATCH 11/58] feat(MERC-6807): added orphaned transaction cleanup (#16432) * feat(MERC-6807): added orphaned transaction cleanup * added limit when deleting orphaned transmissions * switched to using DB time when reaping stale transmissions * cleanup of the reap function and test covering an existing ocr2 oracle spec with donId * lintfix --- core/services/llo/cleanup.go | 90 +++++++++++++++++++++---------- core/services/llo/cleanup_test.go | 38 +++++++++++-- 2 files changed, 97 insertions(+), 31 deletions(-) diff --git a/core/services/llo/cleanup.go b/core/services/llo/cleanup.go index dab00965809..1bd7207cf2c 100644 --- a/core/services/llo/cleanup.go +++ b/core/services/llo/cleanup.go @@ -86,7 +86,7 @@ func (t *transmissionReaper) runLoop(ctx context.Context) { // make a final effort to clear the database that goes into // overtime overtimeCtx, cancel := context.WithTimeout(context.Background(), OvertimeDeleteTimeout) - if n, err := t.reapStale(overtimeCtx, TransmissionReaperBatchSize); err != nil { + if n, err := t.reap(overtimeCtx, TransmissionReaperBatchSize, "stale"); err != nil { t.lggr.Errorw("Failed to reap stale transmissions on exit", "err", err) } else if n > 0 { t.lggr.Infow("Reaped stale transmissions on exit", "nDeleted", n) @@ -94,46 +94,45 @@ func (t *transmissionReaper) runLoop(ctx context.Context) { cancel() return case <-ticker.C: - // TODO: Could also automatically reap orphaned transmissions - // that don't have a job with a matching DON ID (from job - // deletion) - // - // https://smartcontract-it.atlassian.net/browse/MERC-6807 // TODO: Should also reap other LLO garbage that can be left // behind e.g. channel definitions etc - n, err := t.reapStale(ctx, TransmissionReaperBatchSize) - if err != nil { - t.lggr.Errorw("Failed to reap", "err", err) - continue - } - if n > 0 { - t.lggr.Infow("Reaped stale transmissions", "nDeleted", n) - } + t.reapAndLog(ctx, TransmissionReaperBatchSize, "stale") + t.reapAndLog(ctx, TransmissionReaperBatchSize, "orphaned") } } } -func (t *transmissionReaper) reapStale(ctx context.Context, batchSize int) (rowsDeleted int64, err error) { +func (t *transmissionReaper) reapAndLog(ctx context.Context, batchSize int, reapType string) { + n, err := t.reap(ctx, batchSize, reapType) + if err != nil { + t.lggr.Errorw("Failed to reap", "type", reapType, "err", err) + return + } + if n > 0 { + t.lggr.Infow("Reaped transmissions", "type", reapType, "nDeleted", n) + } +} + +func (t *transmissionReaper) reap(ctx context.Context, batchSize int, reapType string) (rowsDeleted int64, err error) { for { var res sql.Result - res, err = t.ds.ExecContext(ctx, ` -DELETE FROM llo_mercury_transmit_queue AS q -USING ( - SELECT transmission_hash - FROM llo_mercury_transmit_queue - WHERE inserted_at < $1 - ORDER BY inserted_at ASC - LIMIT $2 -) AS to_delete -WHERE q.transmission_hash = to_delete.transmission_hash; - `, time.Now().Add(-t.maxAge), batchSize) + switch reapType { + case "stale": + res, err = t.reapStale(ctx, batchSize) + case "orphaned": + res, err = t.reapOrphaned(ctx, batchSize) + default: + return 0, fmt.Errorf("transmissionReaper: unknown reap type: %s", reapType) + } + if err != nil { - return rowsDeleted, fmt.Errorf("transmissionReaper: failed to delete stale transmissions: %w", err) + return rowsDeleted, fmt.Errorf("transmissionReaper: failed to delete %s transmissions: %w", reapType, err) } + var rowsAffected int64 rowsAffected, err = res.RowsAffected() if err != nil { - return rowsDeleted, fmt.Errorf("transmissionReaper: failed to get rows affected: %w", err) + return rowsDeleted, fmt.Errorf("transmissionReaper: failed to get %s rows affected: %w", reapType, err) } if rowsAffected == 0 { break @@ -142,3 +141,38 @@ WHERE q.transmission_hash = to_delete.transmission_hash; } return rowsDeleted, nil } + +func (t *transmissionReaper) reapStale(ctx context.Context, batchSize int) (sql.Result, error) { + return t.ds.ExecContext(ctx, ` +DELETE FROM llo_mercury_transmit_queue AS q +USING ( + SELECT transmission_hash + FROM llo_mercury_transmit_queue + WHERE inserted_at < NOW() - ($1 * INTERVAL '1 MICROSECOND') + ORDER BY inserted_at ASC + LIMIT $2 +) AS to_delete +WHERE q.transmission_hash = to_delete.transmission_hash; +`, t.maxAge.Microseconds(), batchSize) +} + +func (t *transmissionReaper) reapOrphaned(ctx context.Context, batchSize int) (sql.Result, error) { + return t.ds.ExecContext(ctx, ` +WITH activeDonIds AS ( + SELECT DISTINCT cast(relay_config->>'lloDonID' as bigint) as don_id + FROM ocr2_oracle_specs + WHERE + relay_config->>'lloDonID' IS NOT NULL + AND relay_config->>'lloDonID' <> '' +) +DELETE FROM llo_mercury_transmit_queue as q +USING ( + SELECT transmission_hash + FROM llo_mercury_transmit_queue + WHERE don_id NOT IN (SELECT don_id FROM activeDonIds) + ORDER BY inserted_at ASC + LIMIT $1 +) AS to_delete +WHERE q.transmission_hash = to_delete.transmission_hash; +`, batchSize) +} diff --git a/core/services/llo/cleanup_test.go b/core/services/llo/cleanup_test.go index f53a6e083f2..f8f19cf2d20 100644 --- a/core/services/llo/cleanup_test.go +++ b/core/services/llo/cleanup_test.go @@ -111,7 +111,7 @@ func Test_Cleanup(t *testing.T) { }) } -func Test_TransmissionReaper(t *testing.T) { +func Test_StaleTransmissionReaper(t *testing.T) { ds := pgtest.NewSqlxDB(t) lggr := logger.TestLogger(t) tr := &transmissionReaper{ds: ds, lggr: lggr, maxAge: 24 * time.Hour} @@ -133,13 +133,45 @@ WHERE transmission_hash IN ( `) // test batching - d, err := tr.reapStale(ctx, n/3) + d, err := tr.reap(ctx, n/3, "stale") require.NoError(t, err) assert.Equal(t, int64(5), d) pgtest.MustExec(t, ds, "UPDATE llo_mercury_transmit_queue SET inserted_at = NOW() - INTERVAL '48 hours'") - d, err = tr.reapStale(ctx, n/3) + d, err = tr.reap(ctx, n/3, "stale") require.NoError(t, err) assert.Equal(t, int64(n-5), d) } + +func Test_OrphanedTransmissionReaper(t *testing.T) { + ds := pgtest.NewSqlxDB(t) + lggr := logger.TestLogger(t) + tr := &transmissionReaper{ds: ds, lggr: lggr, maxAge: 24 * time.Hour} + ctx := testutils.Context(t) + + const n = 13 + + pgtest.MustExec(t, ds, ` + INSERT INTO ocr2_oracle_specs (contract_id, p2pv2_bootstrappers, contract_config_confirmations, created_at, + updated_at, relay, relay_config, plugin_config, plugin_type, onchain_signing_strategy, allow_no_bootstrappers + ) VALUES ('0x','{}', 0, NOW(), NOW(), 'evm', '{"chainID": 421614, "lloDonID": 2}', '{"donID": 2}', 'llo', '{}', FALSE);`) + + // add transmissions from a DON not present in ocr2 specs + transmissions := makeSampleTransmissions(n) + torm := mercurytransmitter.NewORM(ds, 1) + err := torm.Insert(testutils.Context(t), transmissions) + require.NoError(t, err) + + d, err := tr.reap(ctx, n, "orphaned") + require.NoError(t, err) + assert.Equal(t, int64(n), d) + + torm2 := mercurytransmitter.NewORM(ds, 2) + err = torm2.Insert(testutils.Context(t), transmissions) + require.NoError(t, err) + + d, err = tr.reap(ctx, n, "orphaned") + require.NoError(t, err) + assert.Equal(t, int64(0), d) +} From 110da7d998b5c176f89db6441a901a5aac1871dc Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 20 Feb 2025 11:21:35 -0500 Subject: [PATCH 12/58] Bump libocr to latest master f3b940c4f298f8652c03cd5cd0d0496eec93432a (#16495) --- core/scripts/go.mod | 4 ++-- core/scripts/go.sum | 8 ++++---- deployment/go.mod | 4 ++-- deployment/go.sum | 8 ++++---- go.mod | 4 ++-- go.sum | 8 ++++---- integration-tests/go.mod | 4 ++-- integration-tests/go.sum | 8 ++++---- integration-tests/load/go.mod | 4 ++-- integration-tests/load/go.sum | 8 ++++---- system-tests/lib/go.mod | 4 ++-- system-tests/lib/go.sum | 8 ++++---- system-tests/tests/go.mod | 4 ++-- system-tests/tests/go.sum | 8 ++++---- 14 files changed, 42 insertions(+), 42 deletions(-) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 4abaebcec06..75002bce440 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -38,7 +38,7 @@ require ( github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 - github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 + github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 github.com/spf13/cobra v1.8.1 github.com/spf13/viper v1.19.0 github.com/stretchr/testify v1.10.0 @@ -151,7 +151,7 @@ require ( github.com/dvsekhvalnov/jose2go v1.7.0 // indirect github.com/emicklei/go-restful/v3 v3.12.1 // indirect github.com/esote/minmaxheap v1.0.0 // indirect - github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.3 // indirect github.com/ethereum/go-verkle v0.2.2 // indirect github.com/fatih/color v1.17.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 1f3dc61b15b..2bf26fdb88e 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -345,8 +345,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/esote/minmaxheap v1.0.0 h1:rgA7StnXXpZG6qlM0S7pUmEv1KpWe32rYT4x8J8ntaA= github.com/esote/minmaxheap v1.0.0/go.mod h1:Ln8+i7fS1k3PLgZI2JAo0iA1as95QnIYiGCrqSJ5FZk= -github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= -github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/c-kzg-4844 v1.0.3 h1:IEnbOHwjixW2cTvKRUlAAUOeleV7nNM/umJR+qy4WDs= +github.com/ethereum/c-kzg-4844 v1.0.3/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.15.0 h1:LLb2jCPsbJZcB4INw+E/MgzUX5wlR6SdwXcv09/1ME4= github.com/ethereum/go-ethereum v1.15.0/go.mod h1:4q+4t48P2C03sjqGvTXix5lEOplf5dz4CTosbjt5tGs= github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= @@ -1118,8 +1118,8 @@ github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 h1:W3doYLVo github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22/go.mod h1:70JLBXQncNHyW63ik4PvPQGjQGZ1xK67MKrDanVAk2w= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= -github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg= -github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM= +github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 h1:PKiqnVOTChlH4a4ljJKL3OKGRgYfIpJS4YD1daAIKks= +github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298/go.mod h1:Mb7+/LC4edz7HyHxX4QkE42pSuov4AV68+AxBXAap0o= github.com/smartcontractkit/mcms v0.10.0 h1:wkBAr8HLyHKwejdwsDOMvIwmzT83tKr3jjB9senLahM= github.com/smartcontractkit/mcms v0.10.0/go.mod h1:3N7+yvkO3hIFXYRYm3hxKCE6qDWdOC/rZdvIrwzlLKk= github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de h1:n0w0rKF+SVM+S3WNlup6uabXj2zFlFNfrlsKCMMb/co= diff --git a/deployment/go.mod b/deployment/go.mod index 5f2c01cd595..41757b66c87 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -39,7 +39,7 @@ require ( github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 - github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 + github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 github.com/smartcontractkit/mcms v0.10.0 github.com/stretchr/testify v1.10.0 github.com/testcontainers/testcontainers-go v0.35.0 @@ -160,7 +160,7 @@ require ( github.com/dvsekhvalnov/jose2go v1.7.0 // indirect github.com/emicklei/go-restful/v3 v3.12.1 // indirect github.com/esote/minmaxheap v1.0.0 // indirect - github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.3 // indirect github.com/ethereum/go-verkle v0.2.2 // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect diff --git a/deployment/go.sum b/deployment/go.sum index c899c4da9ba..a3681927276 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -379,8 +379,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/esote/minmaxheap v1.0.0 h1:rgA7StnXXpZG6qlM0S7pUmEv1KpWe32rYT4x8J8ntaA= github.com/esote/minmaxheap v1.0.0/go.mod h1:Ln8+i7fS1k3PLgZI2JAo0iA1as95QnIYiGCrqSJ5FZk= -github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= -github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/c-kzg-4844 v1.0.3 h1:IEnbOHwjixW2cTvKRUlAAUOeleV7nNM/umJR+qy4WDs= +github.com/ethereum/c-kzg-4844 v1.0.3/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.15.0 h1:LLb2jCPsbJZcB4INw+E/MgzUX5wlR6SdwXcv09/1ME4= github.com/ethereum/go-ethereum v1.15.0/go.mod h1:4q+4t48P2C03sjqGvTXix5lEOplf5dz4CTosbjt5tGs= github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= @@ -1168,8 +1168,8 @@ github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 h1:Yf+n3T/ github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10/go.mod h1:05duR85P8YHuIfIkA7sn2bvrhKo/pDpFKV2rliYHNOo= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= -github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg= -github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM= +github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 h1:PKiqnVOTChlH4a4ljJKL3OKGRgYfIpJS4YD1daAIKks= +github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298/go.mod h1:Mb7+/LC4edz7HyHxX4QkE42pSuov4AV68+AxBXAap0o= github.com/smartcontractkit/mcms v0.10.0 h1:wkBAr8HLyHKwejdwsDOMvIwmzT83tKr3jjB9senLahM= github.com/smartcontractkit/mcms v0.10.0/go.mod h1:3N7+yvkO3hIFXYRYm3hxKCE6qDWdOC/rZdvIrwzlLKk= github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de h1:n0w0rKF+SVM+S3WNlup6uabXj2zFlFNfrlsKCMMb/co= diff --git a/go.mod b/go.mod index 61064f2e11f..2c5c589d471 100644 --- a/go.mod +++ b/go.mod @@ -86,7 +86,7 @@ require ( github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a - github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 + github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de github.com/smartcontractkit/wsrpc v0.8.2 @@ -198,7 +198,7 @@ require ( github.com/docker/go-connections v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.7.0 // indirect - github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.3 // indirect github.com/ethereum/go-verkle v0.2.2 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.8 // indirect diff --git a/go.sum b/go.sum index 2a317acb602..a7434ea52bc 100644 --- a/go.sum +++ b/go.sum @@ -309,8 +309,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/esote/minmaxheap v1.0.0 h1:rgA7StnXXpZG6qlM0S7pUmEv1KpWe32rYT4x8J8ntaA= github.com/esote/minmaxheap v1.0.0/go.mod h1:Ln8+i7fS1k3PLgZI2JAo0iA1as95QnIYiGCrqSJ5FZk= -github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= -github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/c-kzg-4844 v1.0.3 h1:IEnbOHwjixW2cTvKRUlAAUOeleV7nNM/umJR+qy4WDs= +github.com/ethereum/c-kzg-4844 v1.0.3/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.15.0 h1:LLb2jCPsbJZcB4INw+E/MgzUX5wlR6SdwXcv09/1ME4= github.com/ethereum/go-ethereum v1.15.0/go.mod h1:4q+4t48P2C03sjqGvTXix5lEOplf5dz4CTosbjt5tGs= github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= @@ -1044,8 +1044,8 @@ github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14 github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a/go.mod h1:aFm1QC/n99mVeBDtv0SE0co56+IECY6Y1fR3OfNYy3c= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= -github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg= -github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM= +github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 h1:PKiqnVOTChlH4a4ljJKL3OKGRgYfIpJS4YD1daAIKks= +github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298/go.mod h1:Mb7+/LC4edz7HyHxX4QkE42pSuov4AV68+AxBXAap0o= github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de h1:n0w0rKF+SVM+S3WNlup6uabXj2zFlFNfrlsKCMMb/co= github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de/go.mod h1:Sl2MF/Fp3fgJIVzhdGhmZZX2BlnM0oUUyBP4s4xYb6o= github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de h1:66VQxXx3lvTaAZrMBkIcdH9VEjujUEvmBQdnyOJnkOc= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 55f992dda69..b9ece46dab3 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -56,7 +56,7 @@ require ( github.com/smartcontractkit/chainlink-testing-framework/sentinel v0.1.2 github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2 - github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 + github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 github.com/spf13/cobra v1.8.1 github.com/stretchr/testify v1.10.0 github.com/subosito/gotenv v1.6.0 @@ -195,7 +195,7 @@ require ( github.com/edsrzf/mmap-go v1.1.0 // indirect github.com/emicklei/go-restful/v3 v3.12.1 // indirect github.com/esote/minmaxheap v1.0.0 // indirect - github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.3 // indirect github.com/ethereum/go-verkle v0.2.2 // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index d33f50ae8ec..7b34c6c9eab 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -451,8 +451,8 @@ github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6 github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/esote/minmaxheap v1.0.0 h1:rgA7StnXXpZG6qlM0S7pUmEv1KpWe32rYT4x8J8ntaA= github.com/esote/minmaxheap v1.0.0/go.mod h1:Ln8+i7fS1k3PLgZI2JAo0iA1as95QnIYiGCrqSJ5FZk= -github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= -github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/c-kzg-4844 v1.0.3 h1:IEnbOHwjixW2cTvKRUlAAUOeleV7nNM/umJR+qy4WDs= +github.com/ethereum/c-kzg-4844 v1.0.3/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.15.0 h1:LLb2jCPsbJZcB4INw+E/MgzUX5wlR6SdwXcv09/1ME4= github.com/ethereum/go-ethereum v1.15.0/go.mod h1:4q+4t48P2C03sjqGvTXix5lEOplf5dz4CTosbjt5tGs= github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= @@ -1426,8 +1426,8 @@ github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2 h1:7bCdbTUW github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2/go.mod h1:MltlNu3jcXm/DyLN98I5TFNtu/o1NNAcaPAFKMXWk70= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= -github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg= -github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM= +github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 h1:PKiqnVOTChlH4a4ljJKL3OKGRgYfIpJS4YD1daAIKks= +github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298/go.mod h1:Mb7+/LC4edz7HyHxX4QkE42pSuov4AV68+AxBXAap0o= github.com/smartcontractkit/mcms v0.10.0 h1:wkBAr8HLyHKwejdwsDOMvIwmzT83tKr3jjB9senLahM= github.com/smartcontractkit/mcms v0.10.0/go.mod h1:3N7+yvkO3hIFXYRYm3hxKCE6qDWdOC/rZdvIrwzlLKk= github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de h1:n0w0rKF+SVM+S3WNlup6uabXj2zFlFNfrlsKCMMb/co= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 8ca24e49805..a34331353ba 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -171,7 +171,7 @@ require ( github.com/edsrzf/mmap-go v1.1.0 // indirect github.com/emicklei/go-restful/v3 v3.12.1 // indirect github.com/esote/minmaxheap v1.0.0 // indirect - github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.3 // indirect github.com/ethereum/go-verkle v0.2.2 // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect @@ -432,7 +432,7 @@ require ( github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 // indirect github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect - github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 // indirect + github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 // indirect github.com/smartcontractkit/mcms v0.10.0 // indirect github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect github.com/smartcontractkit/wsrpc v0.8.3 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 1c6a4dee4a4..3f9cc996a52 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -441,8 +441,8 @@ github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6 github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/esote/minmaxheap v1.0.0 h1:rgA7StnXXpZG6qlM0S7pUmEv1KpWe32rYT4x8J8ntaA= github.com/esote/minmaxheap v1.0.0/go.mod h1:Ln8+i7fS1k3PLgZI2JAo0iA1as95QnIYiGCrqSJ5FZk= -github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= -github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/c-kzg-4844 v1.0.3 h1:IEnbOHwjixW2cTvKRUlAAUOeleV7nNM/umJR+qy4WDs= +github.com/ethereum/c-kzg-4844 v1.0.3/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.15.0 h1:LLb2jCPsbJZcB4INw+E/MgzUX5wlR6SdwXcv09/1ME4= github.com/ethereum/go-ethereum v1.15.0/go.mod h1:4q+4t48P2C03sjqGvTXix5lEOplf5dz4CTosbjt5tGs= github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= @@ -1409,8 +1409,8 @@ github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2 h1:7bCdbTUW github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2/go.mod h1:MltlNu3jcXm/DyLN98I5TFNtu/o1NNAcaPAFKMXWk70= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= -github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg= -github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM= +github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 h1:PKiqnVOTChlH4a4ljJKL3OKGRgYfIpJS4YD1daAIKks= +github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298/go.mod h1:Mb7+/LC4edz7HyHxX4QkE42pSuov4AV68+AxBXAap0o= github.com/smartcontractkit/mcms v0.10.0 h1:wkBAr8HLyHKwejdwsDOMvIwmzT83tKr3jjB9senLahM= github.com/smartcontractkit/mcms v0.10.0/go.mod h1:3N7+yvkO3hIFXYRYm3hxKCE6qDWdOC/rZdvIrwzlLKk= github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de h1:n0w0rKF+SVM+S3WNlup6uabXj2zFlFNfrlsKCMMb/co= diff --git a/system-tests/lib/go.mod b/system-tests/lib/go.mod index 0ccfb4ac000..c25ae1332ba 100644 --- a/system-tests/lib/go.mod +++ b/system-tests/lib/go.mod @@ -136,7 +136,7 @@ require ( github.com/dvsekhvalnov/jose2go v1.7.0 // indirect github.com/emicklei/go-restful/v3 v3.12.1 // indirect github.com/esote/minmaxheap v1.0.0 // indirect - github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.3 // indirect github.com/ethereum/go-verkle v0.2.2 // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect @@ -350,7 +350,7 @@ require ( github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect - github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 // indirect + github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 // indirect github.com/smartcontractkit/mcms v0.10.0 // indirect github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de // indirect diff --git a/system-tests/lib/go.sum b/system-tests/lib/go.sum index 40159d0f867..4cb01fe5701 100644 --- a/system-tests/lib/go.sum +++ b/system-tests/lib/go.sum @@ -367,8 +367,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/esote/minmaxheap v1.0.0 h1:rgA7StnXXpZG6qlM0S7pUmEv1KpWe32rYT4x8J8ntaA= github.com/esote/minmaxheap v1.0.0/go.mod h1:Ln8+i7fS1k3PLgZI2JAo0iA1as95QnIYiGCrqSJ5FZk= -github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= -github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/c-kzg-4844 v1.0.3 h1:IEnbOHwjixW2cTvKRUlAAUOeleV7nNM/umJR+qy4WDs= +github.com/ethereum/c-kzg-4844 v1.0.3/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.15.0 h1:LLb2jCPsbJZcB4INw+E/MgzUX5wlR6SdwXcv09/1ME4= github.com/ethereum/go-ethereum v1.15.0/go.mod h1:4q+4t48P2C03sjqGvTXix5lEOplf5dz4CTosbjt5tGs= github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= @@ -1156,8 +1156,8 @@ github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 h1:Yf+n3T/ github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10/go.mod h1:05duR85P8YHuIfIkA7sn2bvrhKo/pDpFKV2rliYHNOo= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= -github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg= -github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM= +github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 h1:PKiqnVOTChlH4a4ljJKL3OKGRgYfIpJS4YD1daAIKks= +github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298/go.mod h1:Mb7+/LC4edz7HyHxX4QkE42pSuov4AV68+AxBXAap0o= github.com/smartcontractkit/mcms v0.10.0 h1:wkBAr8HLyHKwejdwsDOMvIwmzT83tKr3jjB9senLahM= github.com/smartcontractkit/mcms v0.10.0/go.mod h1:3N7+yvkO3hIFXYRYm3hxKCE6qDWdOC/rZdvIrwzlLKk= github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de h1:n0w0rKF+SVM+S3WNlup6uabXj2zFlFNfrlsKCMMb/co= diff --git a/system-tests/tests/go.mod b/system-tests/tests/go.mod index 70e47ee9479..e0cad6ddfa9 100644 --- a/system-tests/tests/go.mod +++ b/system-tests/tests/go.mod @@ -141,7 +141,7 @@ require ( github.com/dvsekhvalnov/jose2go v1.7.0 // indirect github.com/emicklei/go-restful/v3 v3.12.1 // indirect github.com/esote/minmaxheap v1.0.0 // indirect - github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/c-kzg-4844 v1.0.3 // indirect github.com/ethereum/go-verkle v0.2.2 // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect @@ -355,7 +355,7 @@ require ( github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect - github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 // indirect + github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 // indirect github.com/smartcontractkit/mcms v0.10.0 // indirect github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de // indirect diff --git a/system-tests/tests/go.sum b/system-tests/tests/go.sum index 6520f93d14b..ef5989154aa 100644 --- a/system-tests/tests/go.sum +++ b/system-tests/tests/go.sum @@ -367,8 +367,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/esote/minmaxheap v1.0.0 h1:rgA7StnXXpZG6qlM0S7pUmEv1KpWe32rYT4x8J8ntaA= github.com/esote/minmaxheap v1.0.0/go.mod h1:Ln8+i7fS1k3PLgZI2JAo0iA1as95QnIYiGCrqSJ5FZk= -github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= -github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/c-kzg-4844 v1.0.3 h1:IEnbOHwjixW2cTvKRUlAAUOeleV7nNM/umJR+qy4WDs= +github.com/ethereum/c-kzg-4844 v1.0.3/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= github.com/ethereum/go-ethereum v1.15.0 h1:LLb2jCPsbJZcB4INw+E/MgzUX5wlR6SdwXcv09/1ME4= github.com/ethereum/go-ethereum v1.15.0/go.mod h1:4q+4t48P2C03sjqGvTXix5lEOplf5dz4CTosbjt5tGs= github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= @@ -1156,8 +1156,8 @@ github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 h1:Yf+n3T/ github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10/go.mod h1:05duR85P8YHuIfIkA7sn2bvrhKo/pDpFKV2rliYHNOo= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= -github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg= -github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM= +github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 h1:PKiqnVOTChlH4a4ljJKL3OKGRgYfIpJS4YD1daAIKks= +github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298/go.mod h1:Mb7+/LC4edz7HyHxX4QkE42pSuov4AV68+AxBXAap0o= github.com/smartcontractkit/mcms v0.10.0 h1:wkBAr8HLyHKwejdwsDOMvIwmzT83tKr3jjB9senLahM= github.com/smartcontractkit/mcms v0.10.0/go.mod h1:3N7+yvkO3hIFXYRYm3hxKCE6qDWdOC/rZdvIrwzlLKk= github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de h1:n0w0rKF+SVM+S3WNlup6uabXj2zFlFNfrlsKCMMb/co= From b7a6083f5b8fe3fade39dc4917a32e61a1ca2f4b Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 20 Feb 2025 11:40:54 -0500 Subject: [PATCH 13/58] Bump default LLO queue size to 250k; set grpc as default protocol (#16483) * Bump default LLO queue size to 250k * Set default protocol to grpc --- core/config/docs/core.toml | 4 ++-- .../chainlink/testdata/config-empty-effective.toml | 4 ++-- .../chainlink/testdata/config-multi-chain-effective.toml | 4 ++-- core/web/resolver/testdata/config-empty-effective.toml | 4 ++-- .../resolver/testdata/config-multi-chain-effective.toml | 4 ++-- docs/CONFIG.md | 8 ++++---- testdata/scripts/config/merge_raw_configs.txtar | 4 ++-- testdata/scripts/node/validate/default.txtar | 4 ++-- testdata/scripts/node/validate/defaults-override.txtar | 4 ++-- .../node/validate/disk-based-logging-disabled.txtar | 4 ++-- .../scripts/node/validate/disk-based-logging-no-dir.txtar | 4 ++-- testdata/scripts/node/validate/disk-based-logging.txtar | 4 ++-- testdata/scripts/node/validate/fallback-override.txtar | 4 ++-- testdata/scripts/node/validate/invalid-ocr-p2p.txtar | 4 ++-- testdata/scripts/node/validate/invalid.txtar | 4 ++-- testdata/scripts/node/validate/valid.txtar | 4 ++-- testdata/scripts/node/validate/warnings.txtar | 4 ++-- 17 files changed, 36 insertions(+), 36 deletions(-) diff --git a/core/config/docs/core.toml b/core/config/docs/core.toml index 7579b7133e5..cb3fd3ec151 100644 --- a/core/config/docs/core.toml +++ b/core/config/docs/core.toml @@ -709,14 +709,14 @@ CertFile = "/path/to/client/certs.pem" # Example # Options are either: # - "wsrpc" for the legacy websocket protocol # - "grpc" for the gRPC protocol -Protocol = "wsrpc" # Default +Protocol = "grpc" # Default # TransmitQueueMaxSize controls the size of the transmit queue. This is scoped # per OCR instance. If the queue is full, the transmitter will start dropping # the oldest messages in order to make space. # # This is useful if mercury server goes offline and the nop needs to buffer # transmissions. -TransmitQueueMaxSize = 100_000 # Default +TransmitQueueMaxSize = 250_000 # Default # TransmitTimeout controls how long the transmitter will wait for a response # when sending a message to the mercury server, before aborting and considering # the transmission to be failed. diff --git a/core/services/chainlink/testdata/config-empty-effective.toml b/core/services/chainlink/testdata/config-empty-effective.toml index c592e0e5fd5..e0ac0520bd7 100644 --- a/core/services/chainlink/testdata/config-empty-effective.toml +++ b/core/services/chainlink/testdata/config-empty-effective.toml @@ -236,8 +236,8 @@ LatestReportDeadline = '5s' CertFile = '' [Mercury.Transmitter] -Protocol = 'wsrpc' -TransmitQueueMaxSize = 100000 +Protocol = 'grpc' +TransmitQueueMaxSize = 250000 TransmitTimeout = '5s' TransmitConcurrency = 100 ReaperFrequency = '1h0m0s' diff --git a/core/services/chainlink/testdata/config-multi-chain-effective.toml b/core/services/chainlink/testdata/config-multi-chain-effective.toml index 60d38ad85e0..a7a561ecd28 100644 --- a/core/services/chainlink/testdata/config-multi-chain-effective.toml +++ b/core/services/chainlink/testdata/config-multi-chain-effective.toml @@ -236,8 +236,8 @@ LatestReportDeadline = '5s' CertFile = '' [Mercury.Transmitter] -Protocol = 'wsrpc' -TransmitQueueMaxSize = 100000 +Protocol = 'grpc' +TransmitQueueMaxSize = 250000 TransmitTimeout = '5s' TransmitConcurrency = 100 ReaperFrequency = '1h0m0s' diff --git a/core/web/resolver/testdata/config-empty-effective.toml b/core/web/resolver/testdata/config-empty-effective.toml index c592e0e5fd5..e0ac0520bd7 100644 --- a/core/web/resolver/testdata/config-empty-effective.toml +++ b/core/web/resolver/testdata/config-empty-effective.toml @@ -236,8 +236,8 @@ LatestReportDeadline = '5s' CertFile = '' [Mercury.Transmitter] -Protocol = 'wsrpc' -TransmitQueueMaxSize = 100000 +Protocol = 'grpc' +TransmitQueueMaxSize = 250000 TransmitTimeout = '5s' TransmitConcurrency = 100 ReaperFrequency = '1h0m0s' diff --git a/core/web/resolver/testdata/config-multi-chain-effective.toml b/core/web/resolver/testdata/config-multi-chain-effective.toml index 54d9527801f..d4e7d543cdd 100644 --- a/core/web/resolver/testdata/config-multi-chain-effective.toml +++ b/core/web/resolver/testdata/config-multi-chain-effective.toml @@ -236,8 +236,8 @@ LatestReportDeadline = '5s' CertFile = '' [Mercury.Transmitter] -Protocol = 'wsrpc' -TransmitQueueMaxSize = 100000 +Protocol = 'grpc' +TransmitQueueMaxSize = 250000 TransmitTimeout = '5s' TransmitConcurrency = 100 ReaperFrequency = '1h0m0s' diff --git a/docs/CONFIG.md b/docs/CONFIG.md index 8657f1d6328..a4fdeb20b5d 100644 --- a/docs/CONFIG.md +++ b/docs/CONFIG.md @@ -1962,8 +1962,8 @@ CertFile is the path to a PEM file of trusted root certificate authority certifi ## Mercury.Transmitter ```toml [Mercury.Transmitter] -Protocol = "wsrpc" # Default -TransmitQueueMaxSize = 100_000 # Default +Protocol = "grpc" # Default +TransmitQueueMaxSize = 250_000 # Default TransmitTimeout = "5s" # Default TransmitConcurrency = 100 # Default ReaperFrequency = "1h" # Default @@ -1973,7 +1973,7 @@ Mercury.Transmitter controls settings for the mercury transmitter ### Protocol ```toml -Protocol = "wsrpc" # Default +Protocol = "grpc" # Default ``` Protocol is the protocol to use for the transmitter. @@ -1983,7 +1983,7 @@ Options are either: ### TransmitQueueMaxSize ```toml -TransmitQueueMaxSize = 100_000 # Default +TransmitQueueMaxSize = 250_000 # Default ``` TransmitQueueMaxSize controls the size of the transmit queue. This is scoped per OCR instance. If the queue is full, the transmitter will start dropping diff --git a/testdata/scripts/config/merge_raw_configs.txtar b/testdata/scripts/config/merge_raw_configs.txtar index 629c900062f..361d7717a6f 100644 --- a/testdata/scripts/config/merge_raw_configs.txtar +++ b/testdata/scripts/config/merge_raw_configs.txtar @@ -383,8 +383,8 @@ LatestReportDeadline = '5s' CertFile = '' [Mercury.Transmitter] -Protocol = 'wsrpc' -TransmitQueueMaxSize = 100000 +Protocol = 'grpc' +TransmitQueueMaxSize = 250000 TransmitTimeout = '5s' TransmitConcurrency = 100 ReaperFrequency = '1h0m0s' diff --git a/testdata/scripts/node/validate/default.txtar b/testdata/scripts/node/validate/default.txtar index 0fac0605378..feab98e51aa 100644 --- a/testdata/scripts/node/validate/default.txtar +++ b/testdata/scripts/node/validate/default.txtar @@ -248,8 +248,8 @@ LatestReportDeadline = '5s' CertFile = '' [Mercury.Transmitter] -Protocol = 'wsrpc' -TransmitQueueMaxSize = 100000 +Protocol = 'grpc' +TransmitQueueMaxSize = 250000 TransmitTimeout = '5s' TransmitConcurrency = 100 ReaperFrequency = '1h0m0s' diff --git a/testdata/scripts/node/validate/defaults-override.txtar b/testdata/scripts/node/validate/defaults-override.txtar index a8f6e49d7ad..46de7109da5 100644 --- a/testdata/scripts/node/validate/defaults-override.txtar +++ b/testdata/scripts/node/validate/defaults-override.txtar @@ -309,8 +309,8 @@ LatestReportDeadline = '5s' CertFile = '' [Mercury.Transmitter] -Protocol = 'wsrpc' -TransmitQueueMaxSize = 100000 +Protocol = 'grpc' +TransmitQueueMaxSize = 250000 TransmitTimeout = '5s' TransmitConcurrency = 100 ReaperFrequency = '1h0m0s' diff --git a/testdata/scripts/node/validate/disk-based-logging-disabled.txtar b/testdata/scripts/node/validate/disk-based-logging-disabled.txtar index 1710fcbda3c..32744204203 100644 --- a/testdata/scripts/node/validate/disk-based-logging-disabled.txtar +++ b/testdata/scripts/node/validate/disk-based-logging-disabled.txtar @@ -292,8 +292,8 @@ LatestReportDeadline = '5s' CertFile = '' [Mercury.Transmitter] -Protocol = 'wsrpc' -TransmitQueueMaxSize = 100000 +Protocol = 'grpc' +TransmitQueueMaxSize = 250000 TransmitTimeout = '5s' TransmitConcurrency = 100 ReaperFrequency = '1h0m0s' diff --git a/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar b/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar index c7130459520..9939a6cb020 100644 --- a/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar +++ b/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar @@ -292,8 +292,8 @@ LatestReportDeadline = '5s' CertFile = '' [Mercury.Transmitter] -Protocol = 'wsrpc' -TransmitQueueMaxSize = 100000 +Protocol = 'grpc' +TransmitQueueMaxSize = 250000 TransmitTimeout = '5s' TransmitConcurrency = 100 ReaperFrequency = '1h0m0s' diff --git a/testdata/scripts/node/validate/disk-based-logging.txtar b/testdata/scripts/node/validate/disk-based-logging.txtar index 38b1a862264..46343b6001f 100644 --- a/testdata/scripts/node/validate/disk-based-logging.txtar +++ b/testdata/scripts/node/validate/disk-based-logging.txtar @@ -292,8 +292,8 @@ LatestReportDeadline = '5s' CertFile = '' [Mercury.Transmitter] -Protocol = 'wsrpc' -TransmitQueueMaxSize = 100000 +Protocol = 'grpc' +TransmitQueueMaxSize = 250000 TransmitTimeout = '5s' TransmitConcurrency = 100 ReaperFrequency = '1h0m0s' diff --git a/testdata/scripts/node/validate/fallback-override.txtar b/testdata/scripts/node/validate/fallback-override.txtar index 5d2b722a524..b28d2e2eb0c 100644 --- a/testdata/scripts/node/validate/fallback-override.txtar +++ b/testdata/scripts/node/validate/fallback-override.txtar @@ -386,8 +386,8 @@ LatestReportDeadline = '5s' CertFile = '' [Mercury.Transmitter] -Protocol = 'wsrpc' -TransmitQueueMaxSize = 100000 +Protocol = 'grpc' +TransmitQueueMaxSize = 250000 TransmitTimeout = '5s' TransmitConcurrency = 100 ReaperFrequency = '1h0m0s' diff --git a/testdata/scripts/node/validate/invalid-ocr-p2p.txtar b/testdata/scripts/node/validate/invalid-ocr-p2p.txtar index 8f88cce9eed..1472205fc19 100644 --- a/testdata/scripts/node/validate/invalid-ocr-p2p.txtar +++ b/testdata/scripts/node/validate/invalid-ocr-p2p.txtar @@ -277,8 +277,8 @@ LatestReportDeadline = '5s' CertFile = '' [Mercury.Transmitter] -Protocol = 'wsrpc' -TransmitQueueMaxSize = 100000 +Protocol = 'grpc' +TransmitQueueMaxSize = 250000 TransmitTimeout = '5s' TransmitConcurrency = 100 ReaperFrequency = '1h0m0s' diff --git a/testdata/scripts/node/validate/invalid.txtar b/testdata/scripts/node/validate/invalid.txtar index 87628948b54..09e142c8e82 100644 --- a/testdata/scripts/node/validate/invalid.txtar +++ b/testdata/scripts/node/validate/invalid.txtar @@ -282,8 +282,8 @@ LatestReportDeadline = '5s' CertFile = '' [Mercury.Transmitter] -Protocol = 'wsrpc' -TransmitQueueMaxSize = 100000 +Protocol = 'grpc' +TransmitQueueMaxSize = 250000 TransmitTimeout = '5s' TransmitConcurrency = 100 ReaperFrequency = '1h0m0s' diff --git a/testdata/scripts/node/validate/valid.txtar b/testdata/scripts/node/validate/valid.txtar index 4695a4ac99b..236e2980e34 100644 --- a/testdata/scripts/node/validate/valid.txtar +++ b/testdata/scripts/node/validate/valid.txtar @@ -289,8 +289,8 @@ LatestReportDeadline = '5s' CertFile = '' [Mercury.Transmitter] -Protocol = 'wsrpc' -TransmitQueueMaxSize = 100000 +Protocol = 'grpc' +TransmitQueueMaxSize = 250000 TransmitTimeout = '5s' TransmitConcurrency = 100 ReaperFrequency = '1h0m0s' diff --git a/testdata/scripts/node/validate/warnings.txtar b/testdata/scripts/node/validate/warnings.txtar index ce0a094de79..f49f448a7ac 100644 --- a/testdata/scripts/node/validate/warnings.txtar +++ b/testdata/scripts/node/validate/warnings.txtar @@ -271,8 +271,8 @@ LatestReportDeadline = '5s' CertFile = '' [Mercury.Transmitter] -Protocol = 'wsrpc' -TransmitQueueMaxSize = 100000 +Protocol = 'grpc' +TransmitQueueMaxSize = 250000 TransmitTimeout = '5s' TransmitConcurrency = 100 ReaperFrequency = '1h0m0s' From c822f92ad6afd3d0757199219aa01350eafce1aa Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 20 Feb 2025 11:44:03 -0500 Subject: [PATCH 14/58] Reduce volume of log errors on transmission failure (#16498) - Since we run 100 transmit threads and retry on a very short backoff (starting at 40ms) transmit errors can be extremely verbose even on short network interruptions. - This PR adds batching so we log first every 100 then every 10,000 errors to avoid overloading logging ingestion. --- .../services/llo/mercurytransmitter/server.go | 55 +++++++++++++++++-- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/core/services/llo/mercurytransmitter/server.go b/core/services/llo/mercurytransmitter/server.go index c572d61d6c1..ebfdd69933d 100644 --- a/core/services/llo/mercurytransmitter/server.go +++ b/core/services/llo/mercurytransmitter/server.go @@ -3,6 +3,8 @@ package mercurytransmitter import ( "context" "fmt" + "maps" + "slices" "strconv" "sync" "sync/atomic" @@ -92,7 +94,10 @@ type server struct { transmitQueuePushErrorCount prometheus.Counter transmitConcurrentTransmitGauge prometheus.Gauge - transmitThreadBusyCount atomic.Int32 + transmitThreadBusyCount atomic.Int32 + consecutiveTransmitErrorCount int + consecutiveTransmitUniqueErrors map[string]struct{} + consecutiveTransmitErrorMu sync.Mutex } type QueueConfig interface { @@ -103,7 +108,7 @@ type QueueConfig interface { func newServer(lggr logger.Logger, verboseLogging bool, cfg QueueConfig, client grpc.Client, orm ORM, serverURL string) *server { pm := NewPersistenceManager(lggr, orm, serverURL, int(cfg.TransmitQueueMaxSize()), FlushDeletesFrequency, PruneFrequency, cfg.ReaperMaxAge().Duration()) - donIDStr := fmt.Sprintf("%d", pm.DonID()) + donIDStr := strconv.FormatUint(uint64(pm.DonID()), 10) var codecLggr logger.Logger if verboseLogging { codecLggr = lggr @@ -128,6 +133,9 @@ func newServer(lggr logger.Logger, verboseLogging bool, cfg QueueConfig, client promTransmitQueuePushErrorCount.WithLabelValues(donIDStr, serverURL), promTransmitConcurrentTransmitGauge.WithLabelValues(donIDStr, serverURL), atomic.Int32{}, + 0, + make(map[string]struct{}), + sync.Mutex{}, } return s @@ -199,7 +207,7 @@ func (s *server) spawnTransmitLoop(stopCh services.StopChan, wg *sync.WaitGroup, return false } else if err != nil { s.transmitConnectionErrorCount.Inc() - lggr.Errorw("Transmit report failed", "err", err) + s.rateLimitedLogError(lggr, "Transmit report failed", err.Error()) if ok := s.q.Push(t); !ok { s.lggr.Error("Failed to push report to transmit queue; queue is closed") return false @@ -217,6 +225,7 @@ func (s *server) spawnTransmitLoop(stopCh services.StopChan, wg *sync.WaitGroup, b.Reset() if res.Error == "" { s.transmitSuccessCount.Inc() + s.resetConsecutiveTransmitFailures() lggr.Debug("Transmit report success") } else { // We don't need to retry here because the mercury server @@ -226,10 +235,11 @@ func (s *server) spawnTransmitLoop(stopCh services.StopChan, wg *sync.WaitGroup, case DuplicateReport: s.transmitSuccessCount.Inc() s.transmitDuplicateCount.Inc() + s.resetConsecutiveTransmitFailures() lggr.Debug("Transmit report success; duplicate report") default: promTransmitServerErrorCount.WithLabelValues(donIDStr, s.url, strconv.FormatInt(int64(res.Code), 10)).Inc() - lggr.Errorw("Transmit report failed; mercury server returned error", "err", res.Error, "code", res.Code) + s.rateLimitedLogError(lggr, "Transmit report failed; mercury server returned error", fmt.Sprintf("mercury server returned error: %q, statusCode: %d", res.Error, res.Code)) } } @@ -239,6 +249,43 @@ func (s *server) spawnTransmitLoop(stopCh services.StopChan, wg *sync.WaitGroup, } } +func (s *server) rateLimitedLogError(lggr logger.Logger, msg string, err string) { + cnt, uniqueErrors := s.incConsecutiveTransmitErrorCount(err) + switch { + case cnt < 10: + // Log first 10 errors individually + lggr.Errorw(msg, "nErrs", 1, "err", err) + return + case cnt < 10_000: + // Log errors up to 10k in batches of 100 + if cnt%100 == 0 { + lggr.Errorw(msg+" (100 failures)", "nErrs", 100, "uniqueErrors", uniqueErrors) + } + return + default: + // After that, log every 10k errors + if cnt%10_000 == 0 { + lggr.Errorw(msg+" (10,000 failures)", "nErrs", 10_000, "uniqueErrors", uniqueErrors) + } + return + } +} + +func (s *server) incConsecutiveTransmitErrorCount(errStr string) (int, []string) { + s.consecutiveTransmitErrorMu.Lock() + defer s.consecutiveTransmitErrorMu.Unlock() + s.consecutiveTransmitErrorCount++ + s.consecutiveTransmitUniqueErrors[errStr] = struct{}{} + return s.consecutiveTransmitErrorCount, slices.Sorted(maps.Keys(s.consecutiveTransmitUniqueErrors)) +} + +func (s *server) resetConsecutiveTransmitFailures() { + s.consecutiveTransmitErrorMu.Lock() + s.consecutiveTransmitErrorCount = 0 + s.consecutiveTransmitUniqueErrors = make(map[string]struct{}) + s.consecutiveTransmitErrorMu.Unlock() +} + func (s *server) transmit(ctx context.Context, t *Transmission) (*rpc.TransmitRequest, *rpc.TransmitResponse, error) { var payload []byte var err error From 5a92e3fafa21cd9577244e21c3032bb721519d06 Mon Sep 17 00:00:00 2001 From: Anindita Ghosh <88458927+AnieeG@users.noreply.github.com> Date: Thu, 20 Feb 2025 09:45:13 -0800 Subject: [PATCH 15/58] Ccip-5023 Remaining FeeQuoterChangesets with new mcms lib (#16466) * 1st update * feequoter changeset with new mcms lib * lint fix * review comments * tests * replace with changeset * fix tests * fix lint * fix compile error * review comments * one more * try to reduce flakes --- deployment/address_book.go | 4 + deployment/ccip/changeset/cs_ccip_home.go | 12 +- .../ccip/changeset/cs_chain_contracts.go | 642 +++++++++++++++++- .../ccip/changeset/cs_chain_contracts_test.go | 423 ++++++++++++ deployment/ccip/changeset/deployer_group.go | 18 +- deployment/ccip/changeset/globals/config.go | 6 + deployment/ccip/changeset/state.go | 162 +++-- .../testhelpers/test_usdc_helpers.go | 56 +- deployment/ccip/changeset/token_info.go | 7 + .../smoke/ccip/ccip_ooo_execution_test.go | 5 +- .../smoke/ccip/ccip_usdc_test.go | 11 +- 11 files changed, 1223 insertions(+), 123 deletions(-) diff --git a/deployment/address_book.go b/deployment/address_book.go index 5fe06d152c5..dcf2d6194c4 100644 --- a/deployment/address_book.go +++ b/deployment/address_book.go @@ -22,6 +22,10 @@ var ( // ContractType is a simple string type for identifying contract types. type ContractType string +func (ct ContractType) String() string { + return string(ct) +} + var ( Version1_0_0 = *semver.MustParse("1.0.0") Version1_1_0 = *semver.MustParse("1.1.0") diff --git a/deployment/ccip/changeset/cs_ccip_home.go b/deployment/ccip/changeset/cs_ccip_home.go index 763f7791efe..e7b3b10e046 100644 --- a/deployment/ccip/changeset/cs_ccip_home.go +++ b/deployment/ccip/changeset/cs_ccip_home.go @@ -45,13 +45,7 @@ var ( _ deployment.ChangeSet[UpdateChainConfigConfig] = UpdateChainConfigChangeset ) -type tokenInfo interface { - Address() common.Address - Symbol(opts *bind.CallOpts) (string, error) - Decimals(opts *bind.CallOpts) (uint8, error) -} - -func findTokenInfo(tokens []tokenInfo, address common.Address) (string, uint8, error) { +func findTokenInfo(tokens []TokenDetails, address common.Address) (string, uint8, error) { for _, token := range tokens { if token.Address() == address { tokenSymbol, err := token.Symbol(nil) @@ -109,7 +103,7 @@ func validateCommitOffchainConfig(c *pluginconfig.CommitOffchainConfig, selector aggregatorAddr := common.HexToAddress(string(tokenConfig.AggregatorAddress)) token := common.HexToAddress(tokenUnknownAddr.String()) - tokenInfos := make([]tokenInfo, 0) + tokenInfos := make([]TokenDetails, 0) onchainState := state.Chains[selector] for _, tk := range onchainState.BurnMintTokens677 { tokenInfos = append(tokenInfos, tk) @@ -120,7 +114,7 @@ func validateCommitOffchainConfig(c *pluginconfig.CommitOffchainConfig, selector for _, tk := range onchainState.ERC677Tokens { tokenInfos = append(tokenInfos, tk) } - var linkTokenInfo tokenInfo + var linkTokenInfo TokenDetails linkTokenInfo = onchainState.LinkToken if onchainState.LinkToken == nil { linkTokenInfo = onchainState.StaticLinkToken diff --git a/deployment/ccip/changeset/cs_chain_contracts.go b/deployment/ccip/changeset/cs_chain_contracts.go index 4a0c15d4ff5..af9aae04338 100644 --- a/deployment/ccip/changeset/cs_chain_contracts.go +++ b/deployment/ccip/changeset/cs_chain_contracts.go @@ -13,6 +13,7 @@ import ( "github.com/ethereum/go-ethereum/core/types" chain_selectors "github.com/smartcontractkit/chain-selectors" mcmslib "github.com/smartcontractkit/mcms" + mcmssdk "github.com/smartcontractkit/mcms/sdk" mcmstypes "github.com/smartcontractkit/mcms/types" @@ -49,17 +50,21 @@ const ( ) var ( - _ deployment.ChangeSet[UpdateOnRampDestsConfig] = UpdateOnRampsDestsChangeset - _ deployment.ChangeSet[UpdateOnRampDynamicConfig] = UpdateOnRampDynamicConfigChangeset - _ deployment.ChangeSet[UpdateOnRampAllowListConfig] = UpdateOnRampAllowListChangeset - _ deployment.ChangeSet[WithdrawOnRampFeeTokensConfig] = WithdrawOnRampFeeTokensChangeset - _ deployment.ChangeSet[UpdateOffRampSourcesConfig] = UpdateOffRampSourcesChangeset - _ deployment.ChangeSet[UpdateRouterRampsConfig] = UpdateRouterRampsChangeset - _ deployment.ChangeSet[UpdateFeeQuoterDestsConfig] = UpdateFeeQuoterDestsChangeset - _ deployment.ChangeSet[SetOCR3OffRampConfig] = SetOCR3OffRampChangeset - _ deployment.ChangeSet[UpdateDynamicConfigOffRampConfig] = UpdateDynamicConfigOffRampChangeset - _ deployment.ChangeSet[UpdateFeeQuoterPricesConfig] = UpdateFeeQuoterPricesChangeset - _ deployment.ChangeSet[UpdateNonceManagerConfig] = UpdateNonceManagersChangeset + _ deployment.ChangeSet[UpdateOnRampDestsConfig] = UpdateOnRampsDestsChangeset + _ deployment.ChangeSet[UpdateOnRampDynamicConfig] = UpdateOnRampDynamicConfigChangeset + _ deployment.ChangeSet[UpdateOnRampAllowListConfig] = UpdateOnRampAllowListChangeset + _ deployment.ChangeSet[WithdrawOnRampFeeTokensConfig] = WithdrawOnRampFeeTokensChangeset + _ deployment.ChangeSet[UpdateOffRampSourcesConfig] = UpdateOffRampSourcesChangeset + _ deployment.ChangeSet[UpdateRouterRampsConfig] = UpdateRouterRampsChangeset + _ deployment.ChangeSet[UpdateFeeQuoterDestsConfig] = UpdateFeeQuoterDestsChangeset + _ deployment.ChangeSet[SetOCR3OffRampConfig] = SetOCR3OffRampChangeset + _ deployment.ChangeSet[UpdateDynamicConfigOffRampConfig] = UpdateDynamicConfigOffRampChangeset + _ deployment.ChangeSet[UpdateFeeQuoterPricesConfig] = UpdateFeeQuoterPricesChangeset + _ deployment.ChangeSet[UpdateNonceManagerConfig] = UpdateNonceManagersChangeset + _ deployment.ChangeSet[ApplyFeeTokensUpdatesConfig] = ApplyFeeTokensUpdatesFeeQuoterChangeset + _ deployment.ChangeSet[UpdateTokenPriceFeedsConfig] = UpdateTokenPriceFeedsFeeQuoterChangeset + _ deployment.ChangeSet[PremiumMultiplierWeiPerEthUpdatesConfig] = ApplyPremiumMultiplierWeiPerEthUpdatesFeeQuoterChangeset + _ deployment.ChangeSet[ApplyTokenTransferFeeConfigUpdatesConfig] = ApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset ) type UpdateNonceManagerConfig struct { @@ -281,7 +286,7 @@ func (cfg UpdateOnRampDestsConfig) Validate(e deployment.Environment) error { } supportedChains := state.SupportedChains() for chainSel, updates := range cfg.UpdatesByChain { - if err := ValidateChain(e, state, chainSel, cfg.MCMS != nil); err != nil { + if err := ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { return err } chainState, ok := state.Chains[chainSel] @@ -419,7 +424,7 @@ type UpdateOnRampDynamicConfig struct { func (cfg UpdateOnRampDynamicConfig) Validate(e deployment.Environment, state CCIPOnChainState) error { for chainSel, config := range cfg.UpdatesByChain { - if err := ValidateChain(e, state, chainSel, cfg.MCMS != nil); err != nil { + if err := ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { return err } if err := commoncs.ValidateOwnership(e.GetContext(), cfg.MCMS != nil, e.Chains[chainSel].DeployerKey.From, state.Chains[chainSel].Timelock.Address(), state.Chains[chainSel].OnRamp); err != nil { @@ -533,7 +538,7 @@ func (cfg UpdateOnRampAllowListConfig) Validate(env deployment.Environment) erro return fmt.Errorf("failed to load onchain state: %w", err) } for srcSel, updates := range cfg.UpdatesByChain { - if err := ValidateChain(env, state, srcSel, cfg.MCMS != nil); err != nil { + if err := ValidateChain(env, state, srcSel, cfg.MCMS); err != nil { return err } onRamp := state.Chains[srcSel].OnRamp @@ -561,7 +566,7 @@ func (cfg UpdateOnRampAllowListConfig) Validate(env deployment.Environment) erro } } for destSel, update := range updates { - if err := ValidateChain(env, state, srcSel, false); err != nil { + if err := ValidateChain(env, state, srcSel, cfg.MCMS); err != nil { return err } if len(update.AddedAllowlistedSenders) > 0 && !update.AllowListEnabled { @@ -683,7 +688,7 @@ type WithdrawOnRampFeeTokensConfig struct { func (cfg WithdrawOnRampFeeTokensConfig) Validate(e deployment.Environment, state CCIPOnChainState) error { for chainSel, feeTokens := range cfg.FeeTokensByChain { - if err := ValidateChain(e, state, chainSel, cfg.MCMS != nil); err != nil { + if err := ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { return err } if err := commoncs.ValidateOwnership(e.GetContext(), cfg.MCMS != nil, e.Chains[chainSel].DeployerKey.From, state.Chains[chainSel].Timelock.Address(), state.Chains[chainSel].OnRamp); err != nil { @@ -1229,7 +1234,7 @@ type UpdateRouterRampsConfig struct { func (cfg UpdateRouterRampsConfig) Validate(e deployment.Environment, state CCIPOnChainState) error { supportedChains := state.SupportedChains() for chainSel, update := range cfg.UpdatesByChain { - if err := ValidateChain(e, state, chainSel, cfg.MCMS != nil); err != nil { + if err := ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { return err } chainState, ok := state.Chains[chainSel] @@ -1401,10 +1406,7 @@ type SetOCR3OffRampConfig struct { } func (c SetOCR3OffRampConfig) Validate(e deployment.Environment, state CCIPOnChainState) error { - if _, ok := state.Chains[c.HomeChainSel]; !ok { - return fmt.Errorf("home chain %d not found in onchain state", c.HomeChainSel) - } - if err := ValidateChain(e, state, c.HomeChainSel, c.MCMS != nil); err != nil { + if err := ValidateChain(e, state, c.HomeChainSel, c.MCMS); err != nil { return err } if c.CCIPHomeConfigType != globals.ConfigTypeActive && @@ -1562,11 +1564,8 @@ func (cfg UpdateDynamicConfigOffRampConfig) Validate(e deployment.Environment) e return err } for chainSel, params := range cfg.Updates { - if deployment.IsValidChainSelector(chainSel) != nil { - return fmt.Errorf("invalid chain selector %d", chainSel) - } - if _, ok := state.Chains[chainSel]; !ok { - return fmt.Errorf("chain %d not found in onchain state", chainSel) + if err := ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { + return fmt.Errorf("chain %d: %w", chainSel, err) } if state.Chains[chainSel].OffRamp == nil { return fmt.Errorf("missing offramp for chain %d", chainSel) @@ -1574,9 +1573,6 @@ func (cfg UpdateDynamicConfigOffRampConfig) Validate(e deployment.Environment) e if state.Chains[chainSel].FeeQuoter == nil { return fmt.Errorf("missing fee quoter for chain %d", chainSel) } - if state.Chains[chainSel].Timelock == nil { - return fmt.Errorf("missing timelock for chain %d", chainSel) - } if params.GasForCallExactCheck > 0 { e.Logger.Infow( "GasForCallExactCheck is set, please note it's a static config and will be ignored for this changeset", @@ -1761,3 +1757,591 @@ func DefaultFeeQuoterDestChainConfig(configEnabled bool, destChainSelector ...ui ChainFamilySelector: [4]byte(familySelector), } } + +type ApplyFeeTokensUpdatesConfig struct { + UpdatesByChain map[uint64]ApplyFeeTokensUpdatesConfigPerChain + MCMSConfig *MCMSConfig +} + +type ApplyFeeTokensUpdatesConfigPerChain struct { + TokensToRemove []TokenSymbol + TokensToAdd []TokenSymbol +} + +func (cfg ApplyFeeTokensUpdatesConfig) Validate(e deployment.Environment) error { + state, err := LoadOnchainState(e) + if err != nil { + return err + } + if cfg.MCMSConfig != nil { + if err := cfg.MCMSConfig.Validate(); err != nil { + return err + } + } + for chainSel, updates := range cfg.UpdatesByChain { + if err := ValidateChain(e, state, chainSel, cfg.MCMSConfig); err != nil { + return err + } + chainState := state.Chains[chainSel] + if chainState.FeeQuoter == nil { + return fmt.Errorf("missing fee quoter for chain %d", chainSel) + } + tokenAddresses, err := chainState.TokenAddressBySymbol() + if err != nil { + return fmt.Errorf("error getting token addresses for chain %d: %w", chainSel, err) + } + for _, token := range updates.TokensToRemove { + if _, ok := tokenAddresses[token]; !ok { + return fmt.Errorf("token %s not found in state for chain %d", token, chainSel) + } + } + for _, token := range updates.TokensToAdd { + if _, ok := tokenAddresses[token]; !ok { + return fmt.Errorf("token %s not found for in state chain %d", token, chainSel) + } + } + if err := commoncs.ValidateOwnership( + e.GetContext(), + cfg.MCMSConfig != nil, + e.Chains[chainSel].DeployerKey.From, + state.Chains[chainSel].Timelock.Address(), + state.Chains[chainSel].FeeQuoter, + ); err != nil { + return err + } + } + return nil +} + +// ApplyFeeTokensUpdatesFeeQuoterChangeset applies the token updates to the fee quoter to add or remove fee tokens. +// If MCMSConfig is provided, it will create a proposal to apply the changes assuming the fee quoter is owned by the timelock. +// If MCMSConfig is nil, it will apply the changes directly using the deployer key for each chain. +func ApplyFeeTokensUpdatesFeeQuoterChangeset(e deployment.Environment, cfg ApplyFeeTokensUpdatesConfig) (deployment.ChangesetOutput, error) { + if err := cfg.Validate(e); err != nil { + return deployment.ChangesetOutput{}, err + } + state, err := LoadOnchainState(e) + if err != nil { + return deployment.ChangesetOutput{}, err + } + var batches []mcmstypes.BatchOperation + timelocks := make(map[uint64]string) + proposers := make(map[uint64]string) + inspectorPerChain := map[uint64]mcmssdk.Inspector{} + for chainSel, updates := range cfg.UpdatesByChain { + txOpts := e.Chains[chainSel].DeployerKey + if cfg.MCMSConfig != nil { + txOpts = deployment.SimTransactOpts() + } + fq := state.Chains[chainSel].FeeQuoter + tokenAddresses, err := state.Chains[chainSel].TokenAddressBySymbol() + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error getting token addresses for chain %d: %w", chainSel, err) + } + var tokensToRemove, tokensToAdd []common.Address + for _, token := range updates.TokensToRemove { + tokensToRemove = append(tokensToRemove, tokenAddresses[token]) + } + for _, token := range updates.TokensToAdd { + tokensToAdd = append(tokensToAdd, tokenAddresses[token]) + } + tx, err := fq.ApplyFeeTokensUpdates(txOpts, tokensToRemove, tokensToAdd) + if cfg.MCMSConfig == nil { + if _, err := deployment.ConfirmIfNoErrorWithABI(e.Chains[chainSel], tx, fee_quoter.FeeQuoterABI, err); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error applying token updates for chain %d: %w", chainSel, err) + } + } else { + if err != nil { + return deployment.ChangesetOutput{}, err + } + op, err := proposalutils.BatchOperationForChain( + chainSel, fq.Address().String(), tx.Data(), big.NewInt(0), FeeQuoter.String(), nil) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error creating batch operation for chain %d: %w", chainSel, err) + } + batches = append(batches, op) + timelocks[chainSel] = state.Chains[chainSel].Timelock.Address().String() + proposers[chainSel] = state.Chains[chainSel].ProposerMcm.Address().String() + inspector, err := proposalutils.McmsInspectorForChain(e, chainSel) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error creating inspector for chain %d: %w", chainSel, err) + } + inspectorPerChain[chainSel] = inspector + } + } + if cfg.MCMSConfig == nil { + return deployment.ChangesetOutput{}, nil + } + p, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), + timelocks, + proposers, + inspectorPerChain, + batches, + "Apply fee tokens updates", + cfg.MCMSConfig.MinDelay, + ) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error building proposal: %w", err) + } + return deployment.ChangesetOutput{ + MCMSTimelockProposals: []mcmslib.TimelockProposal{*p}, + }, nil +} + +type UpdateTokenPriceFeedsConfig struct { + Updates map[uint64][]UpdateTokenPriceFeedsConfigPerChain + FeedChainSelector uint64 + MCMS *MCMSConfig +} + +type UpdateTokenPriceFeedsConfigPerChain struct { + SourceToken TokenSymbol + IsEnabled bool +} + +func (cfg UpdateTokenPriceFeedsConfig) Validate(e deployment.Environment) error { + state, err := LoadOnchainState(e) + if err != nil { + return err + } + feedChainState, ok := state.Chains[cfg.FeedChainSelector] + if !ok { + return fmt.Errorf("feed chain %d not found in state", cfg.FeedChainSelector) + } + for chainSel, updates := range cfg.Updates { + if err := ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { + return err + } + chainState := state.Chains[chainSel] + if chainState.FeeQuoter == nil { + return fmt.Errorf("missing fee quoter for chain %d", chainSel) + } + if feedChainState.USDFeeds == nil { + return fmt.Errorf("missing token price feed for chain %d", chainSel) + } + tokenAddresses, err := chainState.TokenAddressBySymbol() + if err != nil { + return fmt.Errorf("error getting token addresses for chain %d: %w", chainSel, err) + } + for _, update := range updates { + if _, ok := tokenAddresses[update.SourceToken]; !ok { + return fmt.Errorf("token %s not found in state for chain %d", update.SourceToken, chainSel) + } + if _, ok := feedChainState.USDFeeds[update.SourceToken]; !ok { + return fmt.Errorf("price feed for token %s not found in state for chain %d", update.SourceToken, chainSel) + } + } + if err := commoncs.ValidateOwnership( + e.GetContext(), + cfg.MCMS != nil, + e.Chains[chainSel].DeployerKey.From, + state.Chains[chainSel].Timelock.Address(), + state.Chains[chainSel].FeeQuoter, + ); err != nil { + return err + } + } + return nil +} + +// UpdateTokenPriceFeedsFeeQuoterChangeset applies the token price feed updates to the fee quoter. +// Before applying the changeset, ensure that the environment state/addressbook is up to date with latest token and price feed addresses. +// If MCMS is provided, it will create a proposal to apply the changes assuming the fee quoter is owned by the timelock. +// If MCMS is nil, it will apply the changes directly using the deployer key for each chain. +func UpdateTokenPriceFeedsFeeQuoterChangeset(e deployment.Environment, cfg UpdateTokenPriceFeedsConfig) (deployment.ChangesetOutput, error) { + if err := cfg.Validate(e); err != nil { + return deployment.ChangesetOutput{}, err + } + + state, err := LoadOnchainState(e) + if err != nil { + return deployment.ChangesetOutput{}, err + } + var batches []mcmstypes.BatchOperation + timelocks := make(map[uint64]string) + proposers := make(map[uint64]string) + inspectorPerChain := map[uint64]mcmssdk.Inspector{} + for chainSel, updates := range cfg.Updates { + txOpts := e.Chains[chainSel].DeployerKey + if cfg.MCMS != nil { + txOpts = deployment.SimTransactOpts() + } + fq := state.Chains[chainSel].FeeQuoter + tokenAddresses, err := state.Chains[chainSel].TokenAddressBySymbol() + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error getting token addresses for chain %d: %w", chainSel, err) + } + tokenDetails, err := state.Chains[chainSel].TokenDetailsBySymbol() + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error getting token decimal for chain %d: %w", chainSel, err) + } + var priceFeedUpdates []fee_quoter.FeeQuoterTokenPriceFeedUpdate + for _, update := range updates { + _, ok := tokenDetails[update.SourceToken] + if !ok { + return deployment.ChangesetOutput{}, fmt.Errorf("token details %s not found in state for chain %d", update.SourceToken, chainSel) + } + decimal, err := tokenDetails[update.SourceToken].Decimals(&bind.CallOpts{ + Context: e.GetContext(), + }) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error getting token decimal for chain %d: %w", chainSel, err) + } + feed := state.Chains[cfg.FeedChainSelector].USDFeeds[update.SourceToken] + priceFeedUpdates = append(priceFeedUpdates, fee_quoter.FeeQuoterTokenPriceFeedUpdate{ + SourceToken: tokenAddresses[update.SourceToken], + FeedConfig: fee_quoter.FeeQuoterTokenPriceFeedConfig{ + DataFeedAddress: feed.Address(), + TokenDecimals: decimal, + IsEnabled: update.IsEnabled, + }, + }) + } + tx, err := fq.UpdateTokenPriceFeeds(txOpts, priceFeedUpdates) + if cfg.MCMS == nil { + if _, err := deployment.ConfirmIfNoErrorWithABI(e.Chains[chainSel], tx, fee_quoter.FeeQuoterABI, err); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error applying token price feed update for chain %d: %w", chainSel, err) + } + } else { + if err != nil { + return deployment.ChangesetOutput{}, err + } + op, err := proposalutils.BatchOperationForChain( + chainSel, fq.Address().String(), tx.Data(), big.NewInt(0), FeeQuoter.String(), nil) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error creating batch operation for chain %d: %w", chainSel, err) + } + batches = append(batches, op) + timelocks[chainSel] = state.Chains[chainSel].Timelock.Address().String() + proposers[chainSel] = state.Chains[chainSel].ProposerMcm.Address().String() + inspector, err := proposalutils.McmsInspectorForChain(e, chainSel) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error getting inspector for chain %d: %w", chainSel, err) + } + inspectorPerChain[chainSel] = inspector + } + } + if cfg.MCMS == nil { + return deployment.ChangesetOutput{}, nil + } + p, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), + timelocks, + proposers, + inspectorPerChain, + batches, + "Update token price feeds", + cfg.MCMS.MinDelay, + ) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error building proposal: %w", err) + } + return deployment.ChangesetOutput{ + MCMSTimelockProposals: []mcmslib.TimelockProposal{*p}, + }, nil +} + +type PremiumMultiplierWeiPerEthUpdatesConfig struct { + Updates map[uint64][]PremiumMultiplierWeiPerEthUpdatesConfigPerChain + MCMS *MCMSConfig +} + +func (cfg PremiumMultiplierWeiPerEthUpdatesConfig) Validate(e deployment.Environment) error { + state, err := LoadOnchainState(e) + if err != nil { + return err + } + for chainSel, updates := range cfg.Updates { + if err := ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { + return err + } + chainState := state.Chains[chainSel] + if chainState.FeeQuoter == nil { + return fmt.Errorf("missing fee quoter for chain %d", chainSel) + } + tokenAddresses, err := chainState.TokenAddressBySymbol() + if err != nil { + return fmt.Errorf("error getting token addresses for chain %d: %w", chainSel, err) + } + for _, update := range updates { + if _, ok := tokenAddresses[update.Token]; !ok { + return fmt.Errorf("token %s not found in state for chain %d", update.Token, chainSel) + } + if update.PremiumMultiplierWeiPerEth == 0 { + return fmt.Errorf("missing premium multiplier for chain %d", chainSel) + } + } + if err := commoncs.ValidateOwnership( + e.GetContext(), + cfg.MCMS != nil, + e.Chains[chainSel].DeployerKey.From, + state.Chains[chainSel].Timelock.Address(), + state.Chains[chainSel].FeeQuoter, + ); err != nil { + return err + } + } + return nil +} + +type PremiumMultiplierWeiPerEthUpdatesConfigPerChain struct { + Token TokenSymbol + PremiumMultiplierWeiPerEth uint64 +} + +// ApplyPremiumMultiplierWeiPerEthUpdatesFeeQuoterChangeset applies the premium multiplier updates for mentioned tokens to the fee quoter. +// If MCMS is provided, it will create a proposal to apply the changes assuming the fee quoter is owned by the timelock. +// If MCMS is nil, it will apply the changes directly using the deployer key for each chain. +func ApplyPremiumMultiplierWeiPerEthUpdatesFeeQuoterChangeset(e deployment.Environment, cfg PremiumMultiplierWeiPerEthUpdatesConfig) (deployment.ChangesetOutput, error) { + if err := cfg.Validate(e); err != nil { + return deployment.ChangesetOutput{}, err + } + state, err := LoadOnchainState(e) + if err != nil { + return deployment.ChangesetOutput{}, err + } + var batches []mcmstypes.BatchOperation + timelocks := make(map[uint64]string) + proposers := make(map[uint64]string) + inspectorPerChain := map[uint64]mcmssdk.Inspector{} + for chainSel, updates := range cfg.Updates { + txOpts := e.Chains[chainSel].DeployerKey + if cfg.MCMS != nil { + txOpts = deployment.SimTransactOpts() + } + fq := state.Chains[chainSel].FeeQuoter + tokenAddresses, err := state.Chains[chainSel].TokenAddressBySymbol() + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error getting token addresses for chain %d: %w", chainSel, err) + } + var premiumMultiplierUpdates []fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthArgs + for _, update := range updates { + premiumMultiplierUpdates = append(premiumMultiplierUpdates, fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthArgs{ + Token: tokenAddresses[update.Token], + PremiumMultiplierWeiPerEth: update.PremiumMultiplierWeiPerEth, + }) + } + tx, err := fq.ApplyPremiumMultiplierWeiPerEthUpdates(txOpts, premiumMultiplierUpdates) + if cfg.MCMS == nil { + if _, err := deployment.ConfirmIfNoErrorWithABI(e.Chains[chainSel], tx, fee_quoter.FeeQuoterABI, err); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error applying premium multiplier updates for chain %d: %w", chainSel, err) + } + } else { + if err != nil { + return deployment.ChangesetOutput{}, err + } + op, err := proposalutils.BatchOperationForChain( + chainSel, fq.Address().String(), tx.Data(), big.NewInt(0), FeeQuoter.String(), nil) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error creating batch operation for chain %d: %w", chainSel, err) + } + batches = append(batches, op) + timelocks[chainSel] = state.Chains[chainSel].Timelock.Address().String() + proposers[chainSel] = state.Chains[chainSel].ProposerMcm.Address().String() + inspector, err := proposalutils.McmsInspectorForChain(e, chainSel) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error getting inspector for chain %d: %w", chainSel, err) + } + inspectorPerChain[chainSel] = inspector + } + } + if cfg.MCMS == nil { + return deployment.ChangesetOutput{}, nil + } + p, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), + timelocks, + proposers, + inspectorPerChain, + batches, + "Apply premium multiplier updates", + cfg.MCMS.MinDelay, + ) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error building proposal: %w", err) + } + return deployment.ChangesetOutput{ + MCMSTimelockProposals: []mcmslib.TimelockProposal{*p}, + }, nil +} + +type ApplyTokenTransferFeeConfigUpdatesConfig struct { + UpdatesByChain map[uint64]ApplyTokenTransferFeeConfigUpdatesConfigPerChain + MCMS *MCMSConfig +} + +func (cfg ApplyTokenTransferFeeConfigUpdatesConfig) Validate(e deployment.Environment) error { + state, err := LoadOnchainState(e) + if err != nil { + return err + } + for chainSel, updates := range cfg.UpdatesByChain { + if err := ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { + return err + } + chainState := state.Chains[chainSel] + if chainState.FeeQuoter == nil { + return fmt.Errorf("missing fee quoter for chain %d", chainSel) + } + tokenAddresses, err := chainState.TokenAddressBySymbol() + if err != nil { + return fmt.Errorf("error getting token addresses for chain %d: %w", chainSel, err) + } + for _, update := range updates.TokenTransferFeeConfigArgs { + if update.DestChain == chainSel { + return fmt.Errorf("dest chain %d cannot be the same as source chain %d", update.DestChain, chainSel) + } + for token, feeConfig := range update.TokenTransferFeeConfigPerToken { + if _, ok := tokenAddresses[token]; !ok { + return fmt.Errorf("token %s not found in state for chain %d", token, chainSel) + } + if feeConfig.MinFeeUSDCents >= feeConfig.MaxFeeUSDCents { + return fmt.Errorf("min fee must be less than max fee for token %s in chain %d", token, chainSel) + } + if feeConfig.DestBytesOverhead < globals.CCIPLockOrBurnV1RetBytes { + return fmt.Errorf("dest bytes overhead must be at least %d for token %s in chain %d", globals.CCIPLockOrBurnV1RetBytes, token, chainSel) + } + } + if err := ValidateChain(e, state, update.DestChain, nil); err != nil { + return fmt.Errorf("dest chain %d: %w", update.DestChain, err) + } + } + for _, remove := range updates.TokenTransferFeeConfigRemoveArgs { + if remove.DestChain == chainSel { + return fmt.Errorf("dest chain %d cannot be the same as source chain %d", remove.DestChain, chainSel) + } + if _, ok := tokenAddresses[remove.Token]; !ok { + return fmt.Errorf("token %s not found in state for chain %d", remove.Token, chainSel) + } + if err := ValidateChain(e, state, remove.DestChain, nil); err != nil { + return fmt.Errorf("dest chain %d: %w", remove.DestChain, err) + } + _, err := chainState.FeeQuoter.GetTokenTransferFeeConfig(&bind.CallOpts{ + Context: e.GetContext(), + }, remove.DestChain, tokenAddresses[remove.Token]) + if err != nil { + return fmt.Errorf("is the token already updated with token transfer fee config ?"+ + "error getting token transfer fee config for token %s in chain %d: %w", remove.Token, chainSel, err) + } + } + if err := commoncs.ValidateOwnership( + e.GetContext(), + cfg.MCMS != nil, + e.Chains[chainSel].DeployerKey.From, + chainState.Timelock.Address(), + chainState.FeeQuoter, + ); err != nil { + return err + } + } + return nil +} + +type ApplyTokenTransferFeeConfigUpdatesConfigPerChain struct { + TokenTransferFeeConfigArgs []TokenTransferFeeConfigArg + TokenTransferFeeConfigRemoveArgs []TokenTransferFeeConfigRemoveArg +} + +type TokenTransferFeeConfigArg struct { + DestChain uint64 + TokenTransferFeeConfigPerToken map[TokenSymbol]fee_quoter.FeeQuoterTokenTransferFeeConfig +} + +type TokenTransferFeeConfigRemoveArg struct { + DestChain uint64 + Token TokenSymbol +} + +// ApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset applies the token transfer fee config updates for provided tokens to the fee quoter. +// If TokenTransferFeeConfigRemoveArgs is provided, it will remove the token transfer fee config for the provided tokens and dest chains. +// If TokenTransferFeeConfigArgs is provided, it will update the token transfer fee config for the provided tokens and dest chains. +// Use this changeset whenever there is a need to update custom token transfer fee config for a chain, dest chain and token. +// If MCMS is provided, it will create a proposal to apply the changes assuming the fee quoter is owned by the timelock. +// If MCMS is nil, it will apply the changes directly using the deployer key for each chain. +func ApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset(e deployment.Environment, cfg ApplyTokenTransferFeeConfigUpdatesConfig) (deployment.ChangesetOutput, error) { + if err := cfg.Validate(e); err != nil { + return deployment.ChangesetOutput{}, err + } + state, err := LoadOnchainState(e) + if err != nil { + return deployment.ChangesetOutput{}, err + } + var batches []mcmstypes.BatchOperation + timelocks := make(map[uint64]string) + proposers := make(map[uint64]string) + inspectorPerChain := map[uint64]mcmssdk.Inspector{} + for chainSel, updates := range cfg.UpdatesByChain { + txOpts := e.Chains[chainSel].DeployerKey + if cfg.MCMS != nil { + txOpts = deployment.SimTransactOpts() + } + fq := state.Chains[chainSel].FeeQuoter + tokenAddresses, err := state.Chains[chainSel].TokenAddressBySymbol() + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error getting token addresses for chain %d: %w", chainSel, err) + } + var tokenTransferFeeConfigs []fee_quoter.FeeQuoterTokenTransferFeeConfigArgs + for _, update := range updates.TokenTransferFeeConfigArgs { + var tokenTransferFeeConfigPerToken []fee_quoter.FeeQuoterTokenTransferFeeConfigSingleTokenArgs + for token, feeConfig := range update.TokenTransferFeeConfigPerToken { + tokenTransferFeeConfigPerToken = append(tokenTransferFeeConfigPerToken, fee_quoter.FeeQuoterTokenTransferFeeConfigSingleTokenArgs{ + Token: tokenAddresses[token], + TokenTransferFeeConfig: feeConfig, + }) + } + tokenTransferFeeConfigs = append(tokenTransferFeeConfigs, fee_quoter.FeeQuoterTokenTransferFeeConfigArgs{ + DestChainSelector: update.DestChain, + TokenTransferFeeConfigs: tokenTransferFeeConfigPerToken, + }) + } + var tokenTransferFeeConfigsRemove []fee_quoter.FeeQuoterTokenTransferFeeConfigRemoveArgs + for _, remove := range updates.TokenTransferFeeConfigRemoveArgs { + tokenTransferFeeConfigsRemove = append(tokenTransferFeeConfigsRemove, fee_quoter.FeeQuoterTokenTransferFeeConfigRemoveArgs{ + DestChainSelector: remove.DestChain, + Token: tokenAddresses[remove.Token], + }) + } + tx, err := fq.ApplyTokenTransferFeeConfigUpdates(txOpts, tokenTransferFeeConfigs, tokenTransferFeeConfigsRemove) + if cfg.MCMS == nil { + if _, err := deployment.ConfirmIfNoErrorWithABI(e.Chains[chainSel], tx, fee_quoter.FeeQuoterABI, err); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error applying token transfer fee config updates for chain %d: %w", chainSel, err) + } + } else { + if err != nil { + return deployment.ChangesetOutput{}, err + } + op, err := proposalutils.BatchOperationForChain( + chainSel, fq.Address().String(), tx.Data(), big.NewInt(0), FeeQuoter.String(), nil) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error creating batch operation for chain %d: %w", chainSel, err) + } + batches = append(batches, op) + timelocks[chainSel] = state.Chains[chainSel].Timelock.Address().String() + proposers[chainSel] = state.Chains[chainSel].ProposerMcm.Address().String() + inspector, err := proposalutils.McmsInspectorForChain(e, chainSel) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error getting inspector for chain %d: %w", chainSel, err) + } + inspectorPerChain[chainSel] = inspector + } + } + if cfg.MCMS == nil { + return deployment.ChangesetOutput{}, nil + } + p, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), + timelocks, + proposers, + inspectorPerChain, + batches, + "Apply token transfer fee config updates", + cfg.MCMS.MinDelay, + ) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error building proposal: %w", err) + } + return deployment.ChangesetOutput{ + MCMSTimelockProposals: []mcmslib.TimelockProposal{*p}, + }, nil +} diff --git a/deployment/ccip/changeset/cs_chain_contracts_test.go b/deployment/ccip/changeset/cs_chain_contracts_test.go index 6bf532e9a72..54ce6e6bbc8 100644 --- a/deployment/ccip/changeset/cs_chain_contracts_test.go +++ b/deployment/ccip/changeset/cs_chain_contracts_test.go @@ -21,6 +21,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers/v1_5" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" "github.com/smartcontractkit/chainlink-integrations/evm/utils" @@ -905,3 +906,425 @@ func TestSetOCR3ConfigValidations(t *testing.T) { require.Error(t, err) require.Contains(t, err.Error(), "OCR3 config FRoleDON is lower than chainConfig FChain") } + +func TestApplyFeeTokensUpdatesFeeQuoterChangeset(t *testing.T) { + for _, tc := range []struct { + name string + mcmsEnabled bool + }{ + { + name: "MCMS enabled", + mcmsEnabled: true, + }, + { + name: "MCMS disabled", + mcmsEnabled: false, + }, + } { + t.Run(tc.name, func(t *testing.T) { + tenv, _ := testhelpers.NewMemoryEnvironment(t) + allChains := maps.Keys(tenv.Env.Chains) + // deploy a new token + ab := deployment.NewMemoryAddressBook() + for _, selector := range allChains { + _, err := deployment.DeployContract(tenv.Env.Logger, tenv.Env.Chains[selector], ab, + func(chain deployment.Chain) deployment.ContractDeploy[*burn_mint_erc677.BurnMintERC677] { + tokenAddress, tx, token, err := burn_mint_erc677.DeployBurnMintERC677( + tenv.Env.Chains[selector].DeployerKey, + tenv.Env.Chains[selector].Client, + string(testhelpers.TestTokenSymbol), + string(testhelpers.TestTokenSymbol), + testhelpers.LocalTokenDecimals, + big.NewInt(0).Mul(big.NewInt(1e9), big.NewInt(1e18)), + ) + return deployment.ContractDeploy[*burn_mint_erc677.BurnMintERC677]{ + Address: tokenAddress, + Contract: token, + Tv: deployment.NewTypeAndVersion(changeset.BurnMintToken, deployment.Version1_0_0), + Tx: tx, + Err: err, + } + }, + ) + require.NoError(t, err) + } + require.NoError(t, tenv.Env.ExistingAddresses.Merge(ab)) + state, err := changeset.LoadOnchainState(tenv.Env) + require.NoError(t, err) + source := allChains[0] + dest := allChains[1] + + if tc.mcmsEnabled { + // Transfer ownership to timelock so that we can promote the zero digest later down the line. + transferToTimelock(t, tenv, state, source, dest) + } + + var mcmsConfig *changeset.MCMSConfig + if tc.mcmsEnabled { + mcmsConfig = &changeset.MCMSConfig{ + MinDelay: 0, + } + } + + _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ApplyFeeTokensUpdatesFeeQuoterChangeset), + changeset.ApplyFeeTokensUpdatesConfig{ + UpdatesByChain: map[uint64]changeset.ApplyFeeTokensUpdatesConfigPerChain{ + source: { + TokensToAdd: []changeset.TokenSymbol{testhelpers.TestTokenSymbol}, + TokensToRemove: []changeset.TokenSymbol{changeset.LinkSymbol}, + }, + }, + MCMSConfig: mcmsConfig, + }, + ), + ) + require.NoError(t, err) + // Assert the fee quoter configuration is as we expect. + feeTokens, err := state.Chains[source].FeeQuoter.GetFeeTokens(nil) + require.NoError(t, err) + tokenAddresses, err := state.Chains[source].TokenAddressBySymbol() + require.NoError(t, err) + require.Contains(t, feeTokens, tokenAddresses[testhelpers.TestTokenSymbol]) + require.NotContains(t, feeTokens, tokenAddresses[changeset.LinkSymbol]) + }) + } +} + +func TestApplyPremiumMultiplierWeiPerEthUpdatesFeeQuoterChangeset(t *testing.T) { + for _, tc := range []struct { + name string + mcmsEnabled bool + }{ + { + name: "MCMS enabled", + mcmsEnabled: true, + }, + { + name: "MCMS disabled", + mcmsEnabled: false, + }, + } { + t.Run(tc.name, func(t *testing.T) { + tenv, _ := testhelpers.NewMemoryEnvironment(t) + allChains := maps.Keys(tenv.Env.Chains) + source := allChains[0] + dest := allChains[1] + state, err := changeset.LoadOnchainState(tenv.Env) + require.NoError(t, err) + if tc.mcmsEnabled { + // Transfer ownership to timelock so that we can promote the zero digest later down the line. + transferToTimelock(t, tenv, state, source, dest) + } + + var mcmsConfig *changeset.MCMSConfig + if tc.mcmsEnabled { + mcmsConfig = &changeset.MCMSConfig{ + MinDelay: 0, + } + } + + // try to update PremiumMultiplierWeiPerEth for a token that does not exist + _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ApplyPremiumMultiplierWeiPerEthUpdatesFeeQuoterChangeset), + changeset.PremiumMultiplierWeiPerEthUpdatesConfig{ + Updates: map[uint64][]changeset.PremiumMultiplierWeiPerEthUpdatesConfigPerChain{ + source: { + { + Token: testhelpers.TestTokenSymbol, + PremiumMultiplierWeiPerEth: 1e18, + }, + }, + }, + MCMS: mcmsConfig, + }), + ) + require.Error(t, err) + require.Contains(t, err.Error(), "token TEST not found in state for chain") + // deploy test new token + ab := deployment.NewMemoryAddressBook() + for _, selector := range allChains { + _, err := deployment.DeployContract(tenv.Env.Logger, tenv.Env.Chains[selector], ab, + func(chain deployment.Chain) deployment.ContractDeploy[*burn_mint_erc677.BurnMintERC677] { + tokenAddress, tx, token, err := burn_mint_erc677.DeployBurnMintERC677( + tenv.Env.Chains[selector].DeployerKey, + tenv.Env.Chains[selector].Client, + string(testhelpers.TestTokenSymbol), + string(testhelpers.TestTokenSymbol), + testhelpers.LocalTokenDecimals, + big.NewInt(0).Mul(big.NewInt(1e9), big.NewInt(1e18)), + ) + return deployment.ContractDeploy[*burn_mint_erc677.BurnMintERC677]{ + Address: tokenAddress, + Contract: token, + Tv: deployment.NewTypeAndVersion(changeset.BurnMintToken, deployment.Version1_0_0), + Tx: tx, + Err: err, + } + }, + ) + require.NoError(t, err) + } + require.NoError(t, tenv.Env.ExistingAddresses.Merge(ab)) + state, err = changeset.LoadOnchainState(tenv.Env) + require.NoError(t, err) + // now try to apply the changeset for TEST token + _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ApplyPremiumMultiplierWeiPerEthUpdatesFeeQuoterChangeset), + changeset.PremiumMultiplierWeiPerEthUpdatesConfig{ + Updates: map[uint64][]changeset.PremiumMultiplierWeiPerEthUpdatesConfigPerChain{ + source: { + { + Token: testhelpers.TestTokenSymbol, + PremiumMultiplierWeiPerEth: 1e18, + }, + }, + dest: { + { + Token: testhelpers.TestTokenSymbol, + PremiumMultiplierWeiPerEth: 1e18, + }, + }, + }, + MCMS: mcmsConfig, + }), + ) + require.NoError(t, err) + tokenAddress, err := state.Chains[source].TokenAddressBySymbol() + require.NoError(t, err) + config, err := state.Chains[source].FeeQuoter.GetPremiumMultiplierWeiPerEth(&bind.CallOpts{ + Context: testcontext.Get(t), + }, tokenAddress[testhelpers.TestTokenSymbol]) + require.NoError(t, err) + require.Equal(t, uint64(1e18), config) + }) + } +} + +func TestUpdateTokenPriceFeedsFeeQuoterChangeset(t *testing.T) { + for _, tc := range []struct { + name string + mcmsEnabled bool + }{ + { + name: "MCMS enabled", + mcmsEnabled: true, + }, + { + name: "MCMS disabled", + mcmsEnabled: false, + }, + } { + t.Run(tc.name, func(t *testing.T) { + tenv, _ := testhelpers.NewMemoryEnvironment(t) + allChains := maps.Keys(tenv.Env.Chains) + source := allChains[0] + dest := allChains[1] + // deploy a new token + ab := deployment.NewMemoryAddressBook() + _, err := deployment.DeployContract(tenv.Env.Logger, tenv.Env.Chains[source], ab, + func(chain deployment.Chain) deployment.ContractDeploy[*burn_mint_erc677.BurnMintERC677] { + tokenAddress, tx, token, err := burn_mint_erc677.DeployBurnMintERC677( + tenv.Env.Chains[source].DeployerKey, + tenv.Env.Chains[source].Client, + string(testhelpers.TestTokenSymbol), + string(testhelpers.TestTokenSymbol), + testhelpers.LocalTokenDecimals, + big.NewInt(0).Mul(big.NewInt(1e9), big.NewInt(1e18)), + ) + return deployment.ContractDeploy[*burn_mint_erc677.BurnMintERC677]{ + Address: tokenAddress, + Contract: token, + Tv: deployment.NewTypeAndVersion(changeset.BurnMintToken, deployment.Version1_0_0), + Tx: tx, + Err: err, + } + }, + ) + require.NoError(t, err) + require.NoError(t, tenv.Env.ExistingAddresses.Merge(ab)) + state, err := changeset.LoadOnchainState(tenv.Env) + require.NoError(t, err) + + if tc.mcmsEnabled { + // Transfer ownership to timelock so that we can promote the zero digest later down the line. + transferToTimelock(t, tenv, state, source, dest) + } + + var mcmsConfig *changeset.MCMSConfig + if tc.mcmsEnabled { + mcmsConfig = &changeset.MCMSConfig{ + MinDelay: 0, + } + } + + // try to update price feed for this it will fail as there is no price feed deployed for this token + _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateTokenPriceFeedsFeeQuoterChangeset), + changeset.UpdateTokenPriceFeedsConfig{ + Updates: map[uint64][]changeset.UpdateTokenPriceFeedsConfigPerChain{ + source: { + { + SourceToken: testhelpers.TestTokenSymbol, + IsEnabled: true, + }, + }, + }, + FeedChainSelector: tenv.FeedChainSel, + MCMS: mcmsConfig, + }), + ) + require.Error(t, err) + require.Contains(t, err.Error(), "price feed for token TEST not found in state for chain") + // now try to apply the changeset for link token, there is already a price feed deployed for link token + _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateTokenPriceFeedsFeeQuoterChangeset), + changeset.UpdateTokenPriceFeedsConfig{ + Updates: map[uint64][]changeset.UpdateTokenPriceFeedsConfigPerChain{ + source: { + { + SourceToken: changeset.LinkSymbol, + IsEnabled: true, + }, + }, + dest: { + { + SourceToken: changeset.LinkSymbol, + IsEnabled: true, + }, + }, + }, + FeedChainSelector: tenv.FeedChainSel, + MCMS: mcmsConfig, + }), + ) + require.NoError(t, err) + tokenAddress, err := state.Chains[source].TokenAddressBySymbol() + require.NoError(t, err) + tokenDetails, err := state.Chains[source].TokenDetailsBySymbol() + require.NoError(t, err) + decimals, err := tokenDetails[changeset.LinkSymbol].Decimals(&bind.CallOpts{Context: testcontext.Get(t)}) + require.NoError(t, err) + config, err := state.Chains[source].FeeQuoter.GetTokenPriceFeedConfig(&bind.CallOpts{ + Context: testcontext.Get(t), + }, tokenAddress[changeset.LinkSymbol]) + require.NoError(t, err) + require.True(t, config.IsEnabled) + require.Equal(t, state.Chains[tenv.FeedChainSel].USDFeeds[changeset.LinkSymbol].Address(), config.DataFeedAddress) + require.Equal(t, decimals, config.TokenDecimals) + }) + } +} + +func TestApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset(t *testing.T) { + for _, tc := range []struct { + name string + mcmsEnabled bool + }{ + { + name: "MCMS enabled", + mcmsEnabled: true, + }, + { + name: "MCMS disabled", + mcmsEnabled: false, + }, + } { + t.Run(tc.name, func(t *testing.T) { + tenv, _ := testhelpers.NewMemoryEnvironment(t) + allChains := maps.Keys(tenv.Env.Chains) + source := allChains[0] + dest := allChains[1] + state, err := changeset.LoadOnchainState(tenv.Env) + require.NoError(t, err) + if tc.mcmsEnabled { + // Transfer ownership to timelock so that we can promote the zero digest later down the line. + transferToTimelock(t, tenv, state, source, dest) + } + + var mcmsConfig *changeset.MCMSConfig + if tc.mcmsEnabled { + mcmsConfig = &changeset.MCMSConfig{ + MinDelay: 0, + } + } + + _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset), + changeset.ApplyTokenTransferFeeConfigUpdatesConfig{ + UpdatesByChain: map[uint64]changeset.ApplyTokenTransferFeeConfigUpdatesConfigPerChain{ + source: { + TokenTransferFeeConfigRemoveArgs: []changeset.TokenTransferFeeConfigRemoveArg{ + { + DestChain: dest, + Token: changeset.LinkSymbol, + }, + }, + }, + dest: { + TokenTransferFeeConfigArgs: []changeset.TokenTransferFeeConfigArg{ + { + DestChain: source, + TokenTransferFeeConfigPerToken: map[changeset.TokenSymbol]fee_quoter.FeeQuoterTokenTransferFeeConfig{ + changeset.LinkSymbol: { + MinFeeUSDCents: 1, + MaxFeeUSDCents: 1, + DeciBps: 1, + DestGasOverhead: 1, + DestBytesOverhead: 1, + IsEnabled: true, + }, + }, + }, + }, + }, + }, + MCMS: mcmsConfig, + }), + ) + require.Error(t, err) + require.Contains(t, err.Error(), "min fee must be less than max fee for token") + _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset), + changeset.ApplyTokenTransferFeeConfigUpdatesConfig{ + UpdatesByChain: map[uint64]changeset.ApplyTokenTransferFeeConfigUpdatesConfigPerChain{ + source: { + TokenTransferFeeConfigRemoveArgs: []changeset.TokenTransferFeeConfigRemoveArg{ + { + DestChain: dest, + Token: changeset.LinkSymbol, + }, + }, + }, + dest: { + TokenTransferFeeConfigArgs: []changeset.TokenTransferFeeConfigArg{ + { + DestChain: source, + TokenTransferFeeConfigPerToken: map[changeset.TokenSymbol]fee_quoter.FeeQuoterTokenTransferFeeConfig{ + changeset.LinkSymbol: { + MinFeeUSDCents: 1, + MaxFeeUSDCents: 2, + DeciBps: 1, + DestGasOverhead: 1, + DestBytesOverhead: 64, + IsEnabled: true, + }, + }, + }, + }, + }, + }, + MCMS: mcmsConfig, + }), + ) + require.NoError(t, err) + }) + } +} diff --git a/deployment/ccip/changeset/deployer_group.go b/deployment/ccip/changeset/deployer_group.go index 84610b4b007..ca6828f6aa4 100644 --- a/deployment/ccip/changeset/deployer_group.go +++ b/deployment/ccip/changeset/deployer_group.go @@ -7,6 +7,7 @@ import ( "slices" "time" + "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" "golang.org/x/sync/errgroup" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -21,7 +22,22 @@ import ( // MCMSConfig defines timelock duration. type MCMSConfig struct { - MinDelay time.Duration + MinDelay time.Duration + MCMSAction timelock.TimelockOperation +} + +func (mcmsConfig *MCMSConfig) Validate() error { + // to make it backwards compatible with the old MCMSConfig , if MCMSAction is not set, default to timelock.Schedule + // TODO remove this after all the usages are updated to reflect canceller and bypasser with new mcmslib + if mcmsConfig.MCMSAction == "" { + mcmsConfig.MCMSAction = timelock.Schedule + } + if mcmsConfig.MCMSAction != timelock.Schedule && + mcmsConfig.MCMSAction != timelock.Cancel && + mcmsConfig.MCMSAction != timelock.Bypass { + return fmt.Errorf("invalid MCMS type %s", mcmsConfig.MCMSAction) + } + return nil } type DeployerGroup struct { diff --git a/deployment/ccip/changeset/globals/config.go b/deployment/ccip/changeset/globals/config.go index 569f593fe3b..cc74a3059d4 100644 --- a/deployment/ccip/changeset/globals/config.go +++ b/deployment/ccip/changeset/globals/config.go @@ -34,4 +34,10 @@ const ( DAGasPriceDeviationPPB = 0 OptimisticConfirmations = 1 // ====================================== + + // ========= Onchain consts ========= + // CCIPLockOrBurnV1RetBytes Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES + // Reference: https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/ccip/libraries/Pool.sol#L17 + CCIPLockOrBurnV1RetBytes = 32 + // ====================================== ) diff --git a/deployment/ccip/changeset/state.go b/deployment/ccip/changeset/state.go index 96cdd7a10ae..f11cd4434ae 100644 --- a/deployment/ccip/changeset/state.go +++ b/deployment/ccip/changeset/state.go @@ -7,6 +7,8 @@ import ( "github.com/Masterminds/semver/v3" "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers" + "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" + solOffRamp "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" @@ -166,6 +168,58 @@ type CCIPChainState struct { RMN *rmn_contract.RMNContract } +func (c CCIPChainState) TokenAddressBySymbol() (map[TokenSymbol]common.Address, error) { + tokenAddresses := make(map[TokenSymbol]common.Address) + for symbol, token := range c.ERC20Tokens { + tokenAddresses[symbol] = token.Address() + } + for symbol, token := range c.ERC677Tokens { + tokenAddresses[symbol] = token.Address() + } + for symbol, token := range c.BurnMintTokens677 { + tokenAddresses[symbol] = token.Address() + } + var err error + tokenAddresses[LinkSymbol], err = c.LinkTokenAddress() + if err != nil { + return nil, err + } + if c.Weth9 == nil { + return nil, errors.New("no WETH contract found in the state") + } + tokenAddresses[WethSymbol] = c.Weth9.Address() + return tokenAddresses, nil +} + +func (c CCIPChainState) TokenDetailsBySymbol() (map[TokenSymbol]TokenDetails, error) { + tokenDetails := make(map[TokenSymbol]TokenDetails) + for symbol, token := range c.ERC20Tokens { + tokenDetails[symbol] = token + } + for symbol, token := range c.ERC677Tokens { + tokenDetails[symbol] = token + } + for symbol, token := range c.BurnMintTokens677 { + tokenDetails[symbol] = token + } + if c.LinkToken != nil { + tokenDetails[LinkSymbol] = c.LinkToken + } + if c.StaticLinkToken != nil { + tokenDetails[LinkSymbol] = c.StaticLinkToken + } + + if _, ok := tokenDetails[LinkSymbol]; !ok { + return nil, errors.New("no LINK contract found in the state") + } + + if c.Weth9 == nil { + return nil, errors.New("no WETH contract found in the state") + } + tokenDetails[WethSymbol] = c.Weth9 + return tokenDetails, nil +} + func (c CCIPChainState) LinkTokenAddress() (common.Address, error) { if c.LinkToken != nil { return c.LinkToken.Address(), nil @@ -539,6 +593,54 @@ func (s CCIPOnChainState) GetOffRampAddress(chainSelector uint64) ([]byte, error return offRampAddress, nil } +func (s CCIPOnChainState) ValidateRamp(chainSelector uint64, rampType deployment.ContractType) error { + family, err := chain_selectors.GetSelectorFamily(chainSelector) + if err != nil { + return err + } + switch family { + case chain_selectors.FamilyEVM: + chainState, exists := s.Chains[chainSelector] + if !exists { + return fmt.Errorf("chain %d does not exist", chainSelector) + } + switch rampType { + case OffRamp: + if chainState.OffRamp == nil { + return fmt.Errorf("offramp contract does not exist on evm chain %d", chainSelector) + } + case OnRamp: + if chainState.OnRamp == nil { + return fmt.Errorf("onramp contract does not exist on evm chain %d", chainSelector) + } + default: + return fmt.Errorf("unknown ramp type %s", rampType) + } + + case chain_selectors.FamilySolana: + chainState, exists := s.SolChains[chainSelector] + if !exists { + return fmt.Errorf("chain %d does not exist", chainSelector) + } + switch rampType { + case OffRamp: + if chainState.OffRamp.IsZero() { + return fmt.Errorf("offramp contract does not exist on solana chain %d", chainSelector) + } + case OnRamp: + if chainState.Router.IsZero() { + return fmt.Errorf("router contract does not exist on solana chain %d", chainSelector) + } + default: + return fmt.Errorf("unknown ramp type %s", rampType) + } + + default: + return fmt.Errorf("unknown chain family %s", family) + } + return nil +} + func LoadOnchainState(e deployment.Environment) (CCIPOnChainState, error) { solState, err := LoadOnchainStateSolana(e) if err != nil { @@ -886,55 +988,7 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s return state, nil } -func (s CCIPOnChainState) ValidateRamp(chainSelector uint64, rampType deployment.ContractType) error { - family, err := chain_selectors.GetSelectorFamily(chainSelector) - if err != nil { - return err - } - switch family { - case chain_selectors.FamilyEVM: - chainState, exists := s.Chains[chainSelector] - if !exists { - return fmt.Errorf("chain %d does not exist", chainSelector) - } - switch rampType { - case OffRamp: - if chainState.OffRamp == nil { - return fmt.Errorf("offramp contract does not exist on evm chain %d", chainSelector) - } - case OnRamp: - if chainState.OnRamp == nil { - return fmt.Errorf("onramp contract does not exist on evm chain %d", chainSelector) - } - default: - return fmt.Errorf("unknown ramp type %s", rampType) - } - - case chain_selectors.FamilySolana: - chainState, exists := s.SolChains[chainSelector] - if !exists { - return fmt.Errorf("chain %d does not exist", chainSelector) - } - switch rampType { - case OffRamp: - if chainState.OffRamp.IsZero() { - return fmt.Errorf("offramp contract does not exist on solana chain %d", chainSelector) - } - case OnRamp: - if chainState.Router.IsZero() { - return fmt.Errorf("router contract does not exist on solana chain %d", chainSelector) - } - default: - return fmt.Errorf("unknown ramp type %s", rampType) - } - - default: - return fmt.Errorf("unknown chain family %s", family) - } - return nil -} - -func ValidateChain(env deployment.Environment, state CCIPOnChainState, chainSel uint64, checkMcms bool) error { +func ValidateChain(env deployment.Environment, state CCIPOnChainState, chainSel uint64, mcmsCfg *MCMSConfig) error { err := deployment.IsValidChainSelector(chainSel) if err != nil { return fmt.Errorf("is not valid chain selector %d: %w", chainSel, err) @@ -947,13 +1001,19 @@ func ValidateChain(env deployment.Environment, state CCIPOnChainState, chainSel if !ok { return fmt.Errorf("%s does not exist in state", chain) } - if checkMcms { + if mcmsCfg != nil { if chainState.Timelock == nil { return fmt.Errorf("missing timelock on %s", chain) } - if chainState.ProposerMcm == nil { + if mcmsCfg.MCMSAction == timelock.Schedule && chainState.ProposerMcm == nil { return fmt.Errorf("missing proposerMcm on %s", chain) } + if mcmsCfg.MCMSAction == timelock.Cancel && chainState.CancellerMcm == nil { + return fmt.Errorf("missing cancellerMcm on %s", chain) + } + if mcmsCfg.MCMSAction == timelock.Bypass && chainState.BypasserMcm == nil { + return fmt.Errorf("missing bypasserMcm on %s", chain) + } } return nil } diff --git a/deployment/ccip/changeset/testhelpers/test_usdc_helpers.go b/deployment/ccip/changeset/testhelpers/test_usdc_helpers.go index 4d0d4c4c8b8..911250bb7d9 100644 --- a/deployment/ccip/changeset/testhelpers/test_usdc_helpers.go +++ b/deployment/ccip/changeset/testhelpers/test_usdc_helpers.go @@ -1,6 +1,8 @@ package testhelpers import ( + "testing" + "golang.org/x/sync/errgroup" "github.com/ethereum/go-ethereum/common" @@ -9,6 +11,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/usdc_token_pool" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" @@ -100,41 +103,42 @@ func configureSingleChain( } func UpdateFeeQuoterForUSDC( + t *testing.T, + e deployment.Environment, lggr logger.Logger, chain deployment.Chain, - state changeset.CCIPChainState, dstChain uint64, - usdcToken *burn_mint_erc677.BurnMintERC677, ) error { - config := []fee_quoter.FeeQuoterTokenTransferFeeConfigArgs{ - { - DestChainSelector: dstChain, - TokenTransferFeeConfigs: []fee_quoter.FeeQuoterTokenTransferFeeConfigSingleTokenArgs{ - { - Token: usdcToken.Address(), - TokenTransferFeeConfig: fee_quoter.FeeQuoterTokenTransferFeeConfig{ - MinFeeUSDCents: 50, - MaxFeeUSDCents: 50_000, - DeciBps: 0, - DestGasOverhead: 180_000, - DestBytesOverhead: 640, - IsEnabled: true, + config := fee_quoter.FeeQuoterTokenTransferFeeConfig{ + MinFeeUSDCents: 50, + MaxFeeUSDCents: 50_000, + DeciBps: 0, + DestGasOverhead: 180_000, + DestBytesOverhead: 640, + IsEnabled: true, + } + _, err := commonchangeset.Apply(t, e, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset), + changeset.ApplyTokenTransferFeeConfigUpdatesConfig{ + UpdatesByChain: map[uint64]changeset.ApplyTokenTransferFeeConfigUpdatesConfigPerChain{ + chain.Selector: { + TokenTransferFeeConfigArgs: []changeset.TokenTransferFeeConfigArg{ + { + DestChain: dstChain, + TokenTransferFeeConfigPerToken: map[changeset.TokenSymbol]fee_quoter.FeeQuoterTokenTransferFeeConfig{ + changeset.USDCSymbol: config, + }, + }, + }, }, }, - }, - }, - } - - tx, err := state.FeeQuoter.ApplyTokenTransferFeeConfigUpdates( - chain.DeployerKey, - config, - []fee_quoter.FeeQuoterTokenTransferFeeConfigRemoveArgs{}, + }), ) + if err != nil { lggr.Errorw("Failed to apply token transfer fee config updates", "err", err, "config", config) return err } - - _, err = chain.Confirm(tx) - return err + return nil } diff --git a/deployment/ccip/changeset/token_info.go b/deployment/ccip/changeset/token_info.go index d11ebe2758a..57144bded9f 100644 --- a/deployment/ccip/changeset/token_info.go +++ b/deployment/ccip/changeset/token_info.go @@ -3,6 +3,7 @@ package changeset import ( "math/big" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" @@ -127,3 +128,9 @@ func (tc *TokenConfig) GetTokenInfo( return tokenToAggregate } + +type TokenDetails interface { + Address() common.Address + Symbol(opts *bind.CallOpts) (string, error) + Decimals(opts *bind.CallOpts) (uint8, error) +} diff --git a/integration-tests/smoke/ccip/ccip_ooo_execution_test.go b/integration-tests/smoke/ccip/ccip_ooo_execution_test.go index 04afceebe49..aea97dcaf64 100644 --- a/integration-tests/smoke/ccip/ccip_ooo_execution_test.go +++ b/integration-tests/smoke/ccip/ccip_ooo_execution_test.go @@ -14,6 +14,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" @@ -71,9 +72,9 @@ func Test_OutOfOrderExecution(t *testing.T) { srcUSDC, destUSDC, err := testhelpers.ConfigureUSDCTokenPools(lggr, e.Chains, sourceChain, destChain, state) require.NoError(t, err) - err = testhelpers.UpdateFeeQuoterForUSDC(lggr, e.Chains[sourceChain], state.Chains[sourceChain], destChain, srcUSDC) + err = testhelpers.UpdateFeeQuoterForUSDC(t, e, lggr, e.Chains[sourceChain], destChain) require.NoError(t, err) - err = testhelpers.UpdateFeeQuoterForUSDC(lggr, e.Chains[destChain], state.Chains[destChain], sourceChain, destUSDC) + err = testhelpers.UpdateFeeQuoterForUSDC(t, e, lggr, e.Chains[destChain], sourceChain) require.NoError(t, err) testhelpers.MintAndAllow( diff --git a/integration-tests/smoke/ccip/ccip_usdc_test.go b/integration-tests/smoke/ccip/ccip_usdc_test.go index 22c8ecec061..e7af88ceedc 100644 --- a/integration-tests/smoke/ccip/ccip_usdc_test.go +++ b/integration-tests/smoke/ccip/ccip_usdc_test.go @@ -93,7 +93,7 @@ func TestUSDCTokenTransfer(t *testing.T) { }, ) - err = updateFeeQuoters(lggr, e, state, chainA, chainB, chainC, aChainUSDC, bChainUSDC, cChainUSDC) + err = updateFeeQuoters(t, lggr, e, state, chainA, chainB, chainC, aChainUSDC, bChainUSDC, cChainUSDC) require.NoError(t, err) // MockE2EUSDCTransmitter always mint 1, see MockE2EUSDCTransmitter.sol for more details @@ -237,6 +237,7 @@ func TestUSDCTokenTransfer(t *testing.T) { } func updateFeeQuoters( + t *testing.T, lggr logger.Logger, e deployment.Environment, state changeset.CCIPOnChainState, @@ -245,17 +246,17 @@ func updateFeeQuoters( ) error { updateFeeQtrGrp := errgroup.Group{} updateFeeQtrGrp.Go(func() error { - return testhelpers.UpdateFeeQuoterForUSDC(lggr, e.Chains[chainA], state.Chains[chainA], chainC, aChainUSDC) + return testhelpers.UpdateFeeQuoterForUSDC(t, e, lggr, e.Chains[chainA], chainC) }) updateFeeQtrGrp.Go(func() error { - return testhelpers.UpdateFeeQuoterForUSDC(lggr, e.Chains[chainB], state.Chains[chainB], chainC, bChainUSDC) + return testhelpers.UpdateFeeQuoterForUSDC(t, e, lggr, e.Chains[chainB], chainC) }) updateFeeQtrGrp.Go(func() error { - err1 := testhelpers.UpdateFeeQuoterForUSDC(lggr, e.Chains[chainC], state.Chains[chainC], chainA, cChainUSDC) + err1 := testhelpers.UpdateFeeQuoterForUSDC(t, e, lggr, e.Chains[chainC], chainA) if err1 != nil { return err1 } - return testhelpers.UpdateFeeQuoterForUSDC(lggr, e.Chains[chainC], state.Chains[chainC], chainB, cChainUSDC) + return testhelpers.UpdateFeeQuoterForUSDC(t, e, lggr, e.Chains[chainC], chainB) }) return updateFeeQtrGrp.Wait() } From 74dcd7508724cf6f4ac6223af1b571558ebc90e1 Mon Sep 17 00:00:00 2001 From: Adam Hamrick Date: Thu, 20 Feb 2025 15:08:17 -0500 Subject: [PATCH 16/58] Disables CCIP Load Tests in CI (#16494) * Adds team to CCIP load tests * Sets CCIP user team for more tests * A few more * Disables no-longer-needed CCIP tests * Disables load test auto-runs --- .github/e2e-tests.yml | 44 ++------------------------- .github/workflows/ccip-load-tests.yml | 19 ++++++------ 2 files changed, 12 insertions(+), 51 deletions(-) diff --git a/.github/e2e-tests.yml b/.github/e2e-tests.yml index 335bacf1d14..3bb3f6b2023 100644 --- a/.github/e2e-tests.yml +++ b/.github/e2e-tests.yml @@ -1227,6 +1227,7 @@ runner-test-matrix: test_cmd: cd integration-tests/ccip-tests/smoke && go test -test.run ^TestSmokeCCIPForBidirectionalLane$ -timeout 30m -count=1 -test.parallel=1 -json test_env_vars: E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2 + CHAINLINK_USER_TEAM: CCIP test_config_override_path: integration-tests/ccip-tests/testconfig/tomls/leader-lane.toml - id: ccip-tests/smoke/ccip_test.go:^TestSmokeCCIPTokenPoolRateLimits$ @@ -1345,34 +1346,6 @@ runner-test-matrix: CHAINLINK_USER_TEAM: CCIP test_config_override_path: integration-tests/ccip-tests/testconfig/tomls/ccip-reorg.toml - - id: integration-tests/ccip-tests/load/ccip_test.go:TestLoadCCIPStableRPS - path: integration-tests/ccip-tests/load/ccip_test.go - test_env_type: k8s-remote-runner - runs_on: ubuntu-latest - test_cmd: cd integration-tests/ccip-tests/load && DETACH_RUNNER=false go test -test.run ^TestLoadCCIPStableRPS$ -timeout 70m -count=1 -test.parallel=1 -json - test_env_vars: - TEST_SUITE: ccip-load - E2E_TEST_GRAFANA_DASHBOARD_URL: "/d/6vjVx-1V8/ccip-long-running-tests" - triggers: - - E2E CCIP Load Tests - test_artifacts_on_failure: - - ./integration-tests/load/logs/payload_ccip.json - - # Enable when CCIP-2277 is resolved - # - # - id: integration-tests/ccip-tests/load/ccip_test.go:TestLoadCCIPStableRPSAfterARMCurseAndUncurse - # path: integration-tests/ccip-tests/load/ccip_test.go - # test_env_type: k8s-remote-runner - # runs_on: ubuntu-latest - # test_cmd: cd integration-tests/ccip-tests/load && DETACH_RUNNER=false go test -test.run $TestLoadCCIPStableRPSAfterARMCurseAndUncurse$ -timeout 70m -count=1 -test.parallel=1 -json - # test_config_override_path: integration-tests/ccip-tests/testconfig/tomls/load-with-arm-curse-uncurse.toml - # test_env_vars: - # E2E_TEST_GRAFANA_DASHBOARD_URL: "/d/6vjVx-1V8/ccip-long-running-tests" - # triggers: - # - E2E CCIP Load Tests - # test_artifacts_on_failure: - # - ./integration-tests/load/logs/payload_ccip.json - - id: ccip-tests/chaos/ccip_test.go path: integration-tests/ccip-tests/chaos/ccip_test.go test_env_type: k8s-remote-runner @@ -1384,19 +1357,6 @@ runner-test-matrix: TEST_SUITE: chaos TEST_TRIGGERED_BY: ccip-cron-chaos-eth TEST_LOG_LEVEL: debug - - - id: ccip-tests/load/ccip_test.go:^TestLoadCCIPStableWithPodChaosDiffCommitAndExec - path: integration-tests/ccip-tests/load/ccip_test.go - test_env_type: k8s-remote-runner - runs_on: ubuntu-latest - triggers: - # Disabled until CCIP-2555 is resolved - # - E2E CCIP Chaos Tests - test_cmd: cd integration-tests/ccip-tests/load && DETACH_RUNNER=false go test -run '^TestLoadCCIPStableWithPodChaosDiffCommitAndExec' -v -test.parallel=4 -timeout 120m -count=1 -json - test_env_vars: - TEST_SUITE: chaos - TEST_TRIGGERED_BY: ccip-cron-chaos-eth - TEST_LOG_LEVEL: debug - E2E_TEST_GRAFANA_DASHBOARD_URL: /d/6vjVx-1V8/ccip-long-running-tests + CHAINLINK_USER_TEAM: CCIP # END: CCIP tests diff --git a/.github/workflows/ccip-load-tests.yml b/.github/workflows/ccip-load-tests.yml index c73653a913d..a9689f3ae26 100644 --- a/.github/workflows/ccip-load-tests.yml +++ b/.github/workflows/ccip-load-tests.yml @@ -1,13 +1,14 @@ +# CCIP rarely runs these anymore. Leaving for now, but can likely be removed in the future. name: CCIP Load Test on: - push: - paths: - - '**/*ccip*' - - '**/*ccip*/**' - branches: - - develop - tags: - - '*' +# push: +# paths: +# - '**/*ccip*' +# - '**/*ccip*/**' +# branches: +# - develop +# tags: +# - '*' workflow_dispatch: inputs: test_config_override_path: @@ -46,7 +47,7 @@ jobs: slack_notification_after_tests_channel_id: '#ccip-testing' slack_notification_after_tests_name: CCIP E2E Load Tests test_image_suites: ccip-load - team: ${{ inputs.team }} + team: ${{ inputs.team || 'ccip' }} test_secrets_override_key: ${{ github.event.inputs.test_secrets_override_key }} secrets: QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }} From 5b5f2a1cd1cc453a98d6b7ed259fe62f42e8a12f Mon Sep 17 00:00:00 2001 From: chainchad <96362174+chainchad@users.noreply.github.com> Date: Thu, 20 Feb 2025 17:08:43 -0500 Subject: [PATCH 17/58] CI fixes for CCIP Contracts (#16434) * Install additional dev deps * Copy over lockfile * Simplify script command for copying ccip release files --- contracts/package.json | 2 +- contracts/release/ccip/package.json | 15 + contracts/release/ccip/pnpm-lock.yaml | 946 ++++++++++++++++++++++++++ 3 files changed, 962 insertions(+), 1 deletion(-) diff --git a/contracts/package.json b/contracts/package.json index 0fe5dcbce6f..27741479909 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -21,7 +21,7 @@ "solhint": "solhint --max-warnings 0 \"./src/v0.8/**/*.sol\"", "solhint-test": "solhint --config \".solhint-test.json\" --ignore-path \".solhintignore-test\" --max-warnings 0 \"./src/v0.8/**/*.sol\"", "changeset:ccip": "pushd . && cd ./release/ccip && changeset && popd", - "copy:ccip-files": "cp ./release/ccip/package.json ./ && cp ./release/ccip/README.md ./" + "copy:ccip-files": "cp ./release/ccip/package.json release/ccip/pnpm-lock.yaml ./release/ccip/README.md ./" }, "files": [ "src/v0.8", diff --git a/contracts/release/ccip/package.json b/contracts/release/ccip/package.json index dee0d987930..8f7ece9703f 100644 --- a/contracts/release/ccip/package.json +++ b/contracts/release/ccip/package.json @@ -6,6 +6,9 @@ "license": "BUSL-1.1", "private": false, "scripts": { + "lint": "eslint --ext js,ts .", + "prettier:check": "prettier '**/*' --check --ignore-unknown", + "prettier:write": "prettier '**/*' --write --ignore-unknown", "publish-beta": "pnpm publish --tag beta", "publish-prod": "npm dist-tag add @chainlink/contracts-ccip@1.6.0 latest", "compile": "./scripts/native_solc_compile_all_ccip", @@ -51,5 +54,17 @@ "@changesets/cli": "~2.27.8", "@changesets/get-github-info": "^0.6.0", "semver": "^7.6.3" + }, + "devDependencies": { + "@types/node": "^20.17.17", + "@typescript-eslint/eslint-plugin": "^7.18.0", + "@typescript-eslint/parser": "^7.18.0", + "eslint": "^8.57.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.3", + "prettier": "^3.5.0", + "prettier-plugin-solidity": "^1.4.2", + "solhint-plugin-prettier": "^0.1.0", + "typescript": "^5.7.3" } } diff --git a/contracts/release/ccip/pnpm-lock.yaml b/contracts/release/ccip/pnpm-lock.yaml index f8bedad8e52..c13396ebdf1 100644 --- a/contracts/release/ccip/pnpm-lock.yaml +++ b/contracts/release/ccip/pnpm-lock.yaml @@ -17,6 +17,37 @@ importers: semver: specifier: ^7.6.3 version: 7.7.1 + devDependencies: + '@types/node': + specifier: ^20.17.17 + version: 20.17.19 + '@typescript-eslint/eslint-plugin': + specifier: ^7.18.0 + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/parser': + specifier: ^7.18.0 + version: 7.18.0(eslint@8.57.1)(typescript@5.7.3) + eslint: + specifier: ^8.57.1 + version: 8.57.1 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.1) + eslint-plugin-prettier: + specifier: ^5.2.3 + version: 5.2.3(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.5.1) + prettier: + specifier: ^3.5.0 + version: 3.5.1 + prettier-plugin-solidity: + specifier: ^1.4.2 + version: 1.4.2(prettier@3.5.1) + solhint-plugin-prettier: + specifier: ^0.1.0 + version: 0.1.0(prettier-plugin-solidity@1.4.2(prettier@3.5.1))(prettier@3.5.1) + typescript: + specifier: ^5.7.3 + version: 5.7.3 packages: @@ -82,6 +113,37 @@ packages: '@changesets/write@0.3.2': resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -100,9 +162,98 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@prettier/sync@0.3.0': + resolution: {integrity: sha512-3dcmCyAxIcxy036h1I7MQU/uEEBq8oLwf1CE3xeze+MPlgkdlb/+w6rGR/1dhp6Hqi17fRS6nvwnOzkESxEkOw==} + peerDependencies: + prettier: ^3.0.0 + + '@solidity-parser/parser@0.19.0': + resolution: {integrity: sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA==} + '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@20.17.19': + resolution: {integrity: sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A==} + + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -111,21 +262,45 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -133,6 +308,16 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -140,6 +325,18 @@ packages: dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -148,15 +345,77 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.2.3: + resolution: {integrity: sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -164,13 +423,29 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fastq@1.19.0: resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -179,6 +454,17 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -187,10 +473,25 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -198,6 +499,13 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} @@ -209,6 +517,21 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -221,6 +544,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} @@ -236,13 +563,40 @@ packages: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} @@ -254,10 +608,23 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -267,6 +634,13 @@ packages: encoding: optional: true + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -282,10 +656,18 @@ packages: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} @@ -297,10 +679,18 @@ packages: package-manager-detector@0.2.9: resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -320,11 +710,34 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier-plugin-solidity@1.4.2: + resolution: {integrity: sha512-VVD/4XlDjSzyPWWCPW8JEleFa8JNKFYac5kNlMjVXemQyQZKfpekPMhFZSePuXB6L+RixlFvWe20iacGjFYrLw==} + engines: {node: '>=18'} + peerDependencies: + prettier: '>=2.3.0' + prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true + prettier@3.5.1: + resolution: {integrity: sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==} + engines: {node: '>=14'} + hasBin: true + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -335,6 +748,10 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -343,6 +760,11 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -370,6 +792,12 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + solhint-plugin-prettier@0.1.0: + resolution: {integrity: sha512-SDOTSM6tZxZ6hamrzl3GUgzF77FM6jZplgL2plFBclj/OjKP8Z3eIPojKU73gRr0MvOS8ACZILn8a5g0VTz/Gw==} + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-solidity: ^1.0.0 + spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -384,10 +812,25 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + engines: {node: ^14.18.0 || >=16.0.0} + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -399,10 +842,38 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -414,6 +885,17 @@ packages: engines: {node: '>= 8'} hasBin: true + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + snapshots: '@babel/runtime@7.26.7': @@ -569,6 +1051,41 @@ snapshots: human-id: 1.0.2 prettier: 2.8.8 + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.26.7 @@ -597,30 +1114,170 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.0 + '@pkgr/core@0.1.1': {} + + '@prettier/sync@0.3.0(prettier@3.5.1)': + dependencies: + prettier: 3.5.1 + + '@solidity-parser/parser@0.19.0': {} + '@types/node@12.20.55': {} + '@types/node@20.17.19': + dependencies: + undici-types: 6.19.8 + + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + debug: 4.4.0 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@7.18.0': {} + + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.3)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 1.4.3(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.7.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.3.0': {} + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 + argparse@2.0.1: {} + array-union@2.1.0: {} + balanced-match@1.0.2: {} + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + braces@3.0.3: dependencies: fill-range: 7.1.1 + callsites@3.1.0: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + chardet@0.7.0: {} ci-info@3.9.0: {} + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + concat-map@0.0.1: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -629,19 +1286,112 @@ snapshots: dataloader@1.4.0: {} + debug@4.4.0: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + detect-indent@6.1.0: {} dir-glob@3.0.1: dependencies: path-type: 4.0.0 + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@9.1.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-prettier@5.2.3(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.5.1): + dependencies: + eslint: 8.57.1 + prettier: 3.5.1 + prettier-linter-helpers: 1.0.0 + synckit: 0.9.2 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@8.57.1) + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 3.4.3 + esprima@4.0.1: {} + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + extendable-error@0.1.7: {} external-editor@3.1.0: @@ -650,6 +1400,10 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -658,10 +1412,18 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + fastq@1.19.0: dependencies: reusify: 1.0.4 + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -671,6 +1433,19 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.2: {} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -683,10 +1458,29 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fs.realpath@1.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -698,6 +1492,10 @@ snapshots: graceful-fs@4.2.11: {} + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + human-id@1.0.2: {} iconv-lite@0.4.24: @@ -706,6 +1504,20 @@ snapshots: ignore@5.3.2: {} + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + is-extglob@2.1.1: {} is-glob@4.0.3: @@ -714,6 +1526,8 @@ snapshots: is-number@7.0.0: {} + is-path-inside@3.0.3: {} + is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 @@ -727,14 +1541,39 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + lodash.startcase@4.4.0: {} merge2@1.4.1: {} @@ -744,12 +1583,37 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + mri@1.2.0: {} + ms@2.1.3: {} + + natural-compare@1.4.0: {} + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + os-tmpdir@1.0.2: {} outdent@0.5.0: {} @@ -762,18 +1626,32 @@ snapshots: dependencies: p-try: 2.2.0 + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + p-map@2.1.0: {} p-try@2.2.0: {} package-manager-detector@0.2.9: {} + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + path-exists@4.0.0: {} + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} path-type@4.0.0: {} @@ -784,8 +1662,24 @@ snapshots: pify@4.0.1: {} + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier-plugin-solidity@1.4.2(prettier@3.5.1): + dependencies: + '@solidity-parser/parser': 0.19.0 + prettier: 3.5.1 + semver: 7.7.1 + prettier@2.8.8: {} + prettier@3.5.1: {} + + punycode@2.3.1: {} + queue-microtask@1.2.3: {} read-yaml-file@1.1.0: @@ -797,10 +1691,16 @@ snapshots: regenerator-runtime@0.14.1: {} + resolve-from@4.0.0: {} + resolve-from@5.0.0: {} reusify@1.0.4: {} + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -819,6 +1719,13 @@ snapshots: slash@3.0.0: {} + solhint-plugin-prettier@0.1.0(prettier-plugin-solidity@1.4.2(prettier@3.5.1))(prettier@3.5.1): + dependencies: + '@prettier/sync': 0.3.0(prettier@3.5.1) + prettier: 3.5.1 + prettier-linter-helpers: 1.0.0 + prettier-plugin-solidity: 1.4.2(prettier@3.5.1) + spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -832,8 +1739,21 @@ snapshots: strip-bom@3.0.0: {} + strip-json-comments@3.1.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + synckit@0.9.2: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.8.1 + term-size@2.2.1: {} + text-table@0.2.0: {} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -844,8 +1764,28 @@ snapshots: tr46@0.0.3: {} + ts-api-utils@1.4.3(typescript@5.7.3): + dependencies: + typescript: 5.7.3 + + tslib@2.8.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + typescript@5.7.3: {} + + undici-types@6.19.8: {} + universalify@0.1.2: {} + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + webidl-conversions@3.0.1: {} whatwg-url@5.0.0: @@ -856,3 +1796,9 @@ snapshots: which@2.0.2: dependencies: isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrappy@1.0.2: {} + + yocto-queue@0.1.0: {} From 82fade97ba57a8242abcf0c7d828f6137b17dd76 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Thu, 20 Feb 2025 16:42:40 -0600 Subject: [PATCH 18/58] support address codec implementation (#16485) * support address codec implementation * changeset * fix * goimport * add test * update * fix test * address comments * udpate mod * remove unused * fix test * fix go mod * comments plus test * tidy * update mod * mod tidy --- .changeset/forty-taxis-bake.md | 5 + .../capabilities/ccip/ccipevm/addresscodec.go | 24 +++++ .../ccip/ccipevm/addresscodec_test.go | 55 +++++++++++ .../ccip/ccipsolana/addresscodec.go | 24 +++++ .../ccip/ccipsolana/addresscodec_test.go | 96 +++++++++++++++++++ .../ccip/ccipsolana/executecodec_test.go | 6 +- core/capabilities/ccip/common/addresscodec.go | 81 ++++++++++++++++ core/capabilities/ccip/delegate.go | 7 ++ .../capabilities/ccip/oraclecreator/plugin.go | 49 ++++------ core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 +- deployment/go.mod | 2 +- deployment/go.sum | 4 +- go.mod | 2 +- go.sum | 4 +- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 +- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 +- .../smoke/ccip/ccip_reader_test.go | 15 ++- system-tests/lib/go.mod | 2 +- system-tests/lib/go.sum | 4 +- system-tests/tests/go.mod | 2 +- system-tests/tests/go.sum | 4 +- 24 files changed, 347 insertions(+), 57 deletions(-) create mode 100644 .changeset/forty-taxis-bake.md create mode 100644 core/capabilities/ccip/ccipevm/addresscodec.go create mode 100644 core/capabilities/ccip/ccipevm/addresscodec_test.go create mode 100644 core/capabilities/ccip/ccipsolana/addresscodec.go create mode 100644 core/capabilities/ccip/ccipsolana/addresscodec_test.go create mode 100644 core/capabilities/ccip/common/addresscodec.go diff --git a/.changeset/forty-taxis-bake.md b/.changeset/forty-taxis-bake.md new file mode 100644 index 00000000000..93de8eea83f --- /dev/null +++ b/.changeset/forty-taxis-bake.md @@ -0,0 +1,5 @@ +--- +"chainlink": minor +--- + +address codec implementation #added diff --git a/core/capabilities/ccip/ccipevm/addresscodec.go b/core/capabilities/ccip/ccipevm/addresscodec.go new file mode 100644 index 00000000000..faf2ceaf291 --- /dev/null +++ b/core/capabilities/ccip/ccipevm/addresscodec.go @@ -0,0 +1,24 @@ +package ccipevm + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/common" +) + +type AddressCodec struct{} + +func (a AddressCodec) AddressBytesToString(addr []byte) (string, error) { + if len(addr) != common.AddressLength { + return "", fmt.Errorf("invalid EVM address length, expected %v, got %d", common.AddressLength, len(addr)) + } + + return common.BytesToAddress(addr).Hex(), nil +} + +func (a AddressCodec) AddressStringToBytes(addr string) ([]byte, error) { + if !common.IsHexAddress(addr) { + return nil, fmt.Errorf("invalid EVM address %s", addr) + } + return common.HexToAddress(addr).Bytes(), nil +} diff --git a/core/capabilities/ccip/ccipevm/addresscodec_test.go b/core/capabilities/ccip/ccipevm/addresscodec_test.go new file mode 100644 index 00000000000..8b717458ff2 --- /dev/null +++ b/core/capabilities/ccip/ccipevm/addresscodec_test.go @@ -0,0 +1,55 @@ +package ccipevm + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestAddressBytesToString(t *testing.T) { + addressCodec := AddressCodec{} + addr := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13} + want := "0x000102030405060708090a0b0c0d0e0f10111213" + got, err := addressCodec.AddressBytesToString(addr) + require.NoError(t, err) + require.Equal(t, want, got) +} + +func TestAddressStringToBytes(t *testing.T) { + addressCodec := AddressCodec{} + addr := "0x000102030405060708090a0b0c0d0e0f10111213" + want := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13} + got, err := addressCodec.AddressStringToBytes(addr) + require.NoError(t, err) + require.Equal(t, want, got) +} + +func TestInvalidAddressBytesToString(t *testing.T) { + addressCodec := AddressCodec{} + addr := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12} + _, err := addressCodec.AddressBytesToString(addr) + require.Error(t, err) +} + +func TestInvalidAddressStringToBytes(t *testing.T) { + addressCodec := AddressCodec{} + addr := "0x000102030405060708090a0b0c0d0e0f1011121" + _, err := addressCodec.AddressStringToBytes(addr) + require.Error(t, err) +} + +func TestValidEVMAddress(t *testing.T) { + addressCodec := AddressCodec{} + addr := []byte{0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef} + want := "0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF" + got, err := addressCodec.AddressBytesToString(addr) + require.NoError(t, err) + require.Equal(t, want, got) +} + +func TestInvalidHexString(t *testing.T) { + addressCodec := AddressCodec{} + addr := "0xZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" + _, err := addressCodec.AddressStringToBytes(addr) + require.Error(t, err) +} diff --git a/core/capabilities/ccip/ccipsolana/addresscodec.go b/core/capabilities/ccip/ccipsolana/addresscodec.go new file mode 100644 index 00000000000..74ae2835214 --- /dev/null +++ b/core/capabilities/ccip/ccipsolana/addresscodec.go @@ -0,0 +1,24 @@ +package ccipsolana + +import ( + "fmt" + + "github.com/gagliardetto/solana-go" +) + +type AddressCodec struct{} + +func (a AddressCodec) AddressBytesToString(addr []byte) (string, error) { + if len(addr) != solana.PublicKeyLength { + return "", fmt.Errorf("invalid SVM address length, expected %v, got %d", solana.PublicKeyLength, len(addr)) + } + return solana.PublicKeyFromBytes(addr).String(), nil +} + +func (a AddressCodec) AddressStringToBytes(addr string) ([]byte, error) { + pk, err := solana.PublicKeyFromBase58(addr) + if err != nil { + return nil, fmt.Errorf("failed to decode SVM address '%s': %w", addr, err) + } + return pk.Bytes(), nil +} diff --git a/core/capabilities/ccip/ccipsolana/addresscodec_test.go b/core/capabilities/ccip/ccipsolana/addresscodec_test.go new file mode 100644 index 00000000000..6d19bf8ecf0 --- /dev/null +++ b/core/capabilities/ccip/ccipsolana/addresscodec_test.go @@ -0,0 +1,96 @@ +package ccipsolana + +import ( + "encoding/hex" + "errors" + "testing" + + "github.com/gagliardetto/solana-go" + "github.com/stretchr/testify/require" +) + +func TestPublicKeyFromBytes(t *testing.T) { + tests := []struct { + name string + inHex string + isErr bool + expected string + }{ + { + "empty", + "", + true, + solana.PublicKey{}.String(), + }, + { + "smaller than required", + "010203040506", + true, + solana.PublicKey{}.String(), + }, + { + "equal to 32 bytes", + "0102030405060102030405060102030405060102030405060102030405060101", + false, + solana.MustPublicKeyFromBase58("4wBqpZM9msxygzsdeLPq6Zw3LoiAxJk3GjtKPpqkcsi").String(), + }, + { + "longer than required", + "0102030405060102030405060102030405060102030405060102030405060101FFFFFFFFFF", + true, + solana.PublicKey{}.String(), + }, + } + + codec := AddressCodec{} + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + bytes, err := hex.DecodeString(test.inHex) + require.NoError(t, err) + + if test.isErr { + _, err := codec.AddressBytesToString(bytes) + require.Error(t, err) + } else { + actual, err := codec.AddressBytesToString(bytes) + require.NoError(t, err) + require.Equal(t, test.expected, actual) + } + }) + } +} + +func TestPublicKeyFromBase58(t *testing.T) { + tests := []struct { + name string + in string + expected []byte + expectedErr error + }{ + { + "hand crafted", + "SerumkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + solana.MustPublicKeyFromBase58("SerumkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA").Bytes(), + nil, + }, + { + "hand crafted error", + "SerkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + solana.PublicKey{}.Bytes(), + errors.New("invalid length, expected 32, got 30"), + }, + } + + codec := AddressCodec{} + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + actual, err := codec.AddressStringToBytes(test.in) + if test.expectedErr == nil { + require.NoError(t, err) + require.Equal(t, test.expected, actual) + } else { + require.Error(t, err) + } + }) + } +} diff --git a/core/capabilities/ccip/ccipsolana/executecodec_test.go b/core/capabilities/ccip/ccipsolana/executecodec_test.go index ba3b9ff49f6..e7b90396e02 100644 --- a/core/capabilities/ccip/ccipsolana/executecodec_test.go +++ b/core/capabilities/ccip/ccipsolana/executecodec_test.go @@ -13,8 +13,6 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common/mocks" - "github.com/smartcontractkit/chainlink-ccip/mocks/pkg/types/ccipocr3" - "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" @@ -142,7 +140,7 @@ func TestExecutePluginCodecV1(t *testing.T) { } ctx := testutils.Context(t) - mockExtraDataCodec := &mocks.ExtraDataCodec{} + mockExtraDataCodec := mocks.NewExtraDataCodec(t) mockExtraDataCodec.On("DecodeTokenAmountDestExecData", mock.Anything, mock.Anything).Return(map[string]any{ "destGasAmount": uint32(10), }, nil) @@ -181,7 +179,7 @@ func TestExecutePluginCodecV1(t *testing.T) { } func Test_DecodingExecuteReport(t *testing.T) { - mockExtraDataCodec := ccipocr3.NewMockExtraDataCodec(t) + mockExtraDataCodec := mocks.NewExtraDataCodec(t) mockExtraDataCodec.On("DecodeTokenAmountDestExecData", mock.Anything, mock.Anything).Return(map[string]any{ "destGasAmount": uint32(10), }, nil) diff --git a/core/capabilities/ccip/common/addresscodec.go b/core/capabilities/ccip/common/addresscodec.go new file mode 100644 index 00000000000..3440ec4c391 --- /dev/null +++ b/core/capabilities/ccip/common/addresscodec.go @@ -0,0 +1,81 @@ +package common + +import ( + "fmt" + + chainsel "github.com/smartcontractkit/chain-selectors" + + cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" +) + +// ChainSpecificAddressCodec is an interface that defines the methods for encoding and decoding addresses +type ChainSpecificAddressCodec interface { + AddressBytesToString([]byte) (string, error) + AddressStringToBytes(string) ([]byte, error) +} + +// AddressCodec is a struct that holds the chain specific address codecs +type AddressCodec struct { + EVMAddressCodec ChainSpecificAddressCodec + SolanaAddressCodec ChainSpecificAddressCodec +} + +// AddressCodecParams is a struct that holds the parameters for creating a AddressCodec +type AddressCodecParams struct { + evmAddressCodec ChainSpecificAddressCodec + solanaAddressCodec ChainSpecificAddressCodec +} + +// NewAddressCodecParams is a constructor for AddressCodecParams +func NewAddressCodecParams(evmAddressCodec ChainSpecificAddressCodec, solanaAddressCodec ChainSpecificAddressCodec) AddressCodecParams { + return AddressCodecParams{ + evmAddressCodec: evmAddressCodec, + solanaAddressCodec: solanaAddressCodec, + } +} + +// NewAddressCodec is a constructor for AddressCodec +func NewAddressCodec(params AddressCodecParams) AddressCodec { + return AddressCodec{ + EVMAddressCodec: params.evmAddressCodec, + SolanaAddressCodec: params.solanaAddressCodec, + } +} + +// AddressBytesToString converts an address from bytes to string +func (ac AddressCodec) AddressBytesToString(addr cciptypes.UnknownAddress, chainSelector cciptypes.ChainSelector) (string, error) { + family, err := chainsel.GetSelectorFamily(uint64(chainSelector)) + if err != nil { + return "", fmt.Errorf("failed to get chain family for selector %d: %w", chainSelector, err) + } + + switch family { + case chainsel.FamilyEVM: + return ac.EVMAddressCodec.AddressBytesToString(addr) + + case chainsel.FamilySolana: + return ac.SolanaAddressCodec.AddressBytesToString(addr) + + default: + return "", fmt.Errorf("unsupported family for address encode type %s", family) + } +} + +// AddressStringToBytes converts an address from string to bytes +func (ac AddressCodec) AddressStringToBytes(addr string, chainSelector cciptypes.ChainSelector) (cciptypes.UnknownAddress, error) { + family, err := chainsel.GetSelectorFamily(uint64(chainSelector)) + if err != nil { + return nil, fmt.Errorf("failed to get chain family for selector %d: %w", chainSelector, err) + } + + switch family { + case chainsel.FamilyEVM: + return ac.EVMAddressCodec.AddressStringToBytes(addr) + + case chainsel.FamilySolana: + return ac.SolanaAddressCodec.AddressStringToBytes(addr) + + default: + return nil, fmt.Errorf("unsupported family for address decode type %s", family) + } +} diff --git a/core/capabilities/ccip/delegate.go b/core/capabilities/ccip/delegate.go index 02d5688868c..1d2f09753bd 100644 --- a/core/capabilities/ccip/delegate.go +++ b/core/capabilities/ccip/delegate.go @@ -7,6 +7,8 @@ import ( "strconv" "time" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipsolana" "golang.org/x/exp/maps" "github.com/avast/retry-go/v4" @@ -224,6 +226,11 @@ func (d *Delegate) ServicesForSpec(ctx context.Context, spec job.Job) (services bootstrapperLocators, hcr, cciptypes.ChainSelector(homeChainChainSelector), + common.NewAddressCodec( + common.NewAddressCodecParams( + ccipevm.AddressCodec{}, + ccipsolana.AddressCodec{}, + )), ) } else { oracleCreator = oraclecreator.NewBootstrapOracleCreator( diff --git a/core/capabilities/ccip/oraclecreator/plugin.go b/core/capabilities/ccip/oraclecreator/plugin.go index 581a3570026..baea4697039 100644 --- a/core/capabilities/ccip/oraclecreator/plugin.go +++ b/core/capabilities/ccip/oraclecreator/plugin.go @@ -8,7 +8,6 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" "github.com/gagliardetto/solana-go" "github.com/google/uuid" "github.com/prometheus/client_golang/prometheus" @@ -64,7 +63,6 @@ var plugins = map[string]plugin{ chainsel.FamilyEVM: { CommitPluginCodec: ccipevm.NewCommitPluginCodecV1(), ExecutePluginCodec: ccipevm.NewExecutePluginCodecV1(extraDataCodec), - ExtraArgsCodec: extraDataCodec, MessageHasher: func(lggr logger.Logger) cciptypes.MessageHasher { return ccipevm.NewMessageHasherV1(lggr, extraDataCodec) }, @@ -75,7 +73,6 @@ var plugins = map[string]plugin{ chainsel.FamilySolana: { CommitPluginCodec: ccipsolana.NewCommitPluginCodecV1(), ExecutePluginCodec: ccipsolana.NewExecutePluginCodecV1(extraDataCodec), - ExtraArgsCodec: extraDataCodec, MessageHasher: func(lggr logger.Logger) cciptypes.MessageHasher { return ccipsolana.NewMessageHasherV1(lggr, extraDataCodec) }, @@ -93,7 +90,6 @@ const ( type plugin struct { CommitPluginCodec cciptypes.CommitPluginCodec ExecutePluginCodec cciptypes.ExecutePluginCodec - ExtraArgsCodec ccipcommon.ExtraDataCodec MessageHasher func(lggr logger.Logger) cciptypes.MessageHasher TokenDataEncoder cciptypes.TokenDataEncoder GasEstimateProvider cciptypes.EstimateProvider @@ -117,6 +113,7 @@ type pluginOracleCreator struct { homeChainReader ccipreaderpkg.HomeChain homeChainSelector cciptypes.ChainSelector relayers map[types.RelayID]loop.Relayer + addressCodec cciptypes.AddressCodec } func NewPluginOracleCreator( @@ -134,6 +131,7 @@ func NewPluginOracleCreator( bootstrapperLocators []commontypes.BootstrapperLocator, homeChainReader ccipreaderpkg.HomeChain, homeChainSelector cciptypes.ChainSelector, + addressCodec cciptypes.AddressCodec, ) cctypes.OracleCreator { return &pluginOracleCreator{ ocrKeyBundles: ocrKeyBundles, @@ -150,6 +148,7 @@ func NewPluginOracleCreator( bootstrapperLocators: bootstrapperLocators, homeChainReader: homeChainReader, homeChainSelector: homeChainSelector, + addressCodec: addressCodec, } } @@ -179,6 +178,11 @@ func (i *pluginOracleCreator) Create(ctx context.Context, donID uint32, config c return nil, fmt.Errorf("failed to get public config from OCR config: %w", err) } + offrampAddrStr, err := i.addressCodec.AddressBytesToString(config.Config.OfframpAddress, cciptypes.ChainSelector(chainSelector)) + if err != nil { + return nil, err + } + contractReaders, chainWriters, err := i.createReadersAndWriters( ctx, destChainID, @@ -186,6 +190,7 @@ func (i *pluginOracleCreator) Create(ctx context.Context, donID uint32, config c config, publicConfig, destChainFamily, + offrampAddrStr, ) if err != nil { return nil, fmt.Errorf("failed to create readers and writers: %w", err) @@ -214,7 +219,7 @@ func (i *pluginOracleCreator) Create(ctx context.Context, donID uint32, config c // TODO: Extract the correct transmitter address from the destsFromAccount factory, transmitter, err := i.createFactoryAndTransmitter( - donID, config, destRelayID, contractReaders, chainWriters, destChainWriter, destFromAccounts, publicConfig, destChainFamily) + donID, config, destRelayID, contractReaders, chainWriters, destChainWriter, destFromAccounts, publicConfig, offrampAddrStr) if err != nil { return nil, fmt.Errorf("failed to create factory and transmitter: %w", err) } @@ -232,7 +237,7 @@ func (i *pluginOracleCreator) Create(ctx context.Context, donID uint32, config c i.lggr. Named(fmt.Sprintf("CCIP%sOCR3", pluginType.String())). Named(destRelayID.String()). - Named(encodeOffRampAddr(config.Config.OfframpAddress, destChainFamily, false)), + Named(offrampAddrStr), false, func(ctx context.Context, msg string) {}), MetricsRegisterer: prometheus.WrapRegistererWith(map[string]string{"name": fmt.Sprintf("commit-%d", config.Config.ChainSelector)}, prometheus.DefaultRegisterer), @@ -262,23 +267,6 @@ func (i *pluginOracleCreator) Create(ctx context.Context, donID uint32, config c return newWrappedOracle(oracle, closers), nil } -func encodeOffRampAddr(addr []byte, chainFamily string, checkSum bool) string { - var offRampAddr string - switch chainFamily { - case relay.NetworkEVM: - offRampAddr = common.BytesToAddress(addr).Hex() - if !checkSum { - offRampAddr = hexutil.Encode(addr) - } - case relay.NetworkSolana: - offRampAddr = solana.PublicKeyFromBytes(addr).String() - default: - panic(fmt.Errorf("unsupported chain family: %s", chainFamily)) - } - - return offRampAddr -} - func (i *pluginOracleCreator) createFactoryAndTransmitter( donID uint32, config cctypes.OCR3ConfigWithMeta, @@ -288,7 +276,7 @@ func (i *pluginOracleCreator) createFactoryAndTransmitter( destChainWriter types.ContractWriter, destFromAccounts []string, publicConfig ocr3confighelper.PublicConfig, - destChainFamily string, + offrampAddrStr string, ) (ocr3types.ReportingPluginFactory[[]byte], ocr3types.ContractTransmitter[[]byte], error) { var factory ocr3types.ReportingPluginFactory[[]byte] var transmitter ocr3types.ContractTransmitter[[]byte] @@ -330,11 +318,12 @@ func (i *pluginOracleCreator) createFactoryAndTransmitter( Named("CCIPCommitPlugin"). Named(destRelayID.String()). Named(fmt.Sprintf("%d", config.Config.ChainSelector)). - Named(encodeOffRampAddr(config.Config.OfframpAddress, destChainFamily, false)), + Named(offrampAddrStr), DonID: donID, OcrConfig: ccipreaderpkg.OCR3ConfigWithMeta(config), CommitCodec: plugin.CommitPluginCodec, MsgHasher: messageHasher, + AddrCodec: i.addressCodec, HomeChainReader: i.homeChainReader, HomeChainSelector: i.homeChainSelector, ContractReaders: contractReaders, @@ -344,7 +333,7 @@ func (i *pluginOracleCreator) createFactoryAndTransmitter( factory = promwrapper.NewReportingPluginFactory[[]byte](factory, i.lggr, chainID, "CCIPCommit") transmitter = ocrimpls.NewCommitContractTransmitter(destChainWriter, ocrtypes.Account(destFromAccounts[0]), - encodeOffRampAddr(config.Config.OfframpAddress, destChainFamily, false), + offrampAddrStr, ) } else if config.Config.PluginType == uint8(cctypes.PluginTypeCCIPExec) { factory = execocr3.NewExecutePluginFactory( @@ -352,11 +341,12 @@ func (i *pluginOracleCreator) createFactoryAndTransmitter( Lggr: i.lggr. Named("CCIPExecPlugin"). Named(destRelayID.String()). - Named(encodeOffRampAddr(config.Config.OfframpAddress, destChainFamily, false)), + Named(offrampAddrStr), DonID: donID, OcrConfig: ccipreaderpkg.OCR3ConfigWithMeta(config), ExecCodec: plugin.ExecutePluginCodec, MsgHasher: messageHasher, + AddrCodec: i.addressCodec, HomeChainReader: i.homeChainReader, TokenDataEncoder: plugin.TokenDataEncoder, EstimateProvider: plugin.GasEstimateProvider, @@ -366,7 +356,7 @@ func (i *pluginOracleCreator) createFactoryAndTransmitter( factory = promwrapper.NewReportingPluginFactory[[]byte](factory, i.lggr, chainID, "CCIPExec") transmitter = ocrimpls.NewExecContractTransmitter(destChainWriter, ocrtypes.Account(destFromAccounts[0]), - encodeOffRampAddr(config.Config.OfframpAddress, destChainFamily, false), + offrampAddrStr, ) } else { return nil, nil, fmt.Errorf("unsupported plugin type %d", config.Config.PluginType) @@ -381,6 +371,7 @@ func (i *pluginOracleCreator) createReadersAndWriters( config cctypes.OCR3ConfigWithMeta, publicCfg ocr3confighelper.PublicConfig, destChainFamily string, + destAddrStr string, ) ( map[cciptypes.ChainSelector]types.ContractReader, map[cciptypes.ChainSelector]types.ContractWriter, @@ -427,7 +418,7 @@ func (i *pluginOracleCreator) createReadersAndWriters( } if chainID == destChainID && destChainFamily == relayChainFamily { - offrampAddress := encodeOffRampAddr(config.Config.OfframpAddress, relayChainFamily, true) + offrampAddress := destAddrStr err2 := cr.Bind(ctx, []types.BoundContract{ { Address: offrampAddress, diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 75002bce440..5829e8c76a6 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -340,7 +340,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 2bf26fdb88e..3589fe814ae 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1086,8 +1086,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/deployment/go.mod b/deployment/go.mod index 41757b66c87..7a1634a033d 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -30,7 +30,7 @@ require ( github.com/sethvargo/go-retry v0.2.4 github.com/smartcontractkit/ccip-owner-contracts v0.1.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb diff --git a/deployment/go.sum b/deployment/go.sum index a3681927276..a066916174f 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1134,8 +1134,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/go.mod b/go.mod index 2c5c589d471..4a4e2f41812 100644 --- a/go.mod +++ b/go.mod @@ -76,7 +76,7 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 diff --git a/go.sum b/go.sum index a7434ea52bc..49e1045580e 100644 --- a/go.sum +++ b/go.sum @@ -1018,8 +1018,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index b9ece46dab3..6d477166e3f 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -46,7 +46,7 @@ require ( github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 7b34c6c9eab..89f15414c6e 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1384,8 +1384,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index a34331353ba..3c86d062a19 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -28,7 +28,7 @@ require ( github.com/rs/zerolog v1.33.0 github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 3f9cc996a52..c161a370a7b 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1369,8 +1369,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/integration-tests/smoke/ccip/ccip_reader_test.go b/integration-tests/smoke/ccip/ccip_reader_test.go index 816112294bc..7d07fa92ade 100644 --- a/integration-tests/smoke/ccip/ccip_reader_test.go +++ b/integration-tests/smoke/ccip/ccip_reader_test.go @@ -19,6 +19,10 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/zap/zapcore" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipsolana" + ccipcommon "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common" + readermocks "github.com/smartcontractkit/chainlink-ccip/mocks/pkg/contractreader" "github.com/smartcontractkit/chainlink-ccip/pkg/consts" "github.com/smartcontractkit/chainlink-ccip/pkg/contractreader" @@ -283,6 +287,7 @@ func TestCCIPReader_GetRMNRemoteConfig(t *testing.T) { }) require.NoError(t, err) + addrCodec := ccipcommon.NewAddressCodec(ccipcommon.NewAddressCodecParams(ccipevm.AddressCodec{}, ccipsolana.AddressCodec{})) reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders( ctx, lggr, @@ -292,6 +297,7 @@ func TestCCIPReader_GetRMNRemoteConfig(t *testing.T) { nil, chainD, rmnRemoteAddr.Bytes(), + addrCodec, ) exp, err := rmnRemote.GetVersionedConfig(&bind.CallOpts{ @@ -405,7 +411,7 @@ func TestCCIPReader_GetOffRampConfigDigest(t *testing.T) { }, }) require.NoError(t, err) - + addrCodec := ccipcommon.NewAddressCodec(ccipcommon.NewAddressCodecParams(ccipevm.AddressCodec{}, ccipsolana.AddressCodec{})) reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders( ctx, lggr, @@ -415,6 +421,7 @@ func TestCCIPReader_GetOffRampConfigDigest(t *testing.T) { nil, chainD, addr.Bytes(), + addrCodec, ) ccipReaderCommitDigest, err := reader.GetOffRampConfigDigest(ctx, consts.PluginTypeCommit) @@ -1541,7 +1548,8 @@ func testSetupRealContracts( contractReaders[chain] = cr } contractWriters := make(map[cciptypes.ChainSelector]types.ContractWriter) - reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders(ctx, lggr, contractReaders, contractWriters, cciptypes.ChainSelector(destChain), nil) + addrCodec := ccipcommon.NewAddressCodec(ccipcommon.NewAddressCodecParams(ccipevm.AddressCodec{}, ccipsolana.AddressCodec{})) + reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders(ctx, lggr, contractReaders, contractWriters, cciptypes.ChainSelector(destChain), nil, addrCodec) return reader } @@ -1656,7 +1664,8 @@ func testSetup( contractReaders[chain] = cr } contractWriters := make(map[cciptypes.ChainSelector]types.ContractWriter) - reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders(ctx, lggr, contractReaders, contractWriters, params.DestChain, nil) + addrCodec := ccipcommon.NewAddressCodec(ccipcommon.NewAddressCodecParams(ccipevm.AddressCodec{}, ccipsolana.AddressCodec{})) + reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders(ctx, lggr, contractReaders, contractWriters, params.DestChain, nil, addrCodec) t.Cleanup(func() { require.NoError(t, cr.Close()) diff --git a/system-tests/lib/go.mod b/system-tests/lib/go.mod index c25ae1332ba..7a4d6e8458a 100644 --- a/system-tests/lib/go.mod +++ b/system-tests/lib/go.mod @@ -338,7 +338,7 @@ require ( github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect diff --git a/system-tests/lib/go.sum b/system-tests/lib/go.sum index 4cb01fe5701..f77bce8596b 100644 --- a/system-tests/lib/go.sum +++ b/system-tests/lib/go.sum @@ -1122,8 +1122,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/system-tests/tests/go.mod b/system-tests/tests/go.mod index e0cad6ddfa9..c7d561e335d 100644 --- a/system-tests/tests/go.mod +++ b/system-tests/tests/go.mod @@ -341,7 +341,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect diff --git a/system-tests/tests/go.sum b/system-tests/tests/go.sum index ef5989154aa..c4a0b2e12fb 100644 --- a/system-tests/tests/go.sum +++ b/system-tests/tests/go.sum @@ -1122,8 +1122,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8 h1:pNFnF8XRKfGRm8MgxfBSNkI3Qar12ZsL+cPexpOt4f8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250219203739-f89656f952a8/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= From fcd2f44fbf9413d0a3d9cc74da1aaed5fa7e6efa Mon Sep 17 00:00:00 2001 From: Graham Goh Date: Fri, 21 Feb 2025 13:19:21 +1100 Subject: [PATCH 19/58] fix(ccip): readjust error check (#16506) In the previous [PR](https://github.com/smartcontractkit/chainlink/pull/16458/files#diff-f6eeb14804b5d16769abc3f48ad18187965263d5e5d29345e4079e85199de731R127), there was a bug that was introduced that made the code to exit early and did not fall in to the `ConfirmIfNoErrorWithABI` so better error message can be decoded when mcms is not enabled. This commit brings back that behaviour. --- deployment/ccip/changeset/cs_ccip_home.go | 32 +++++++++---------- .../ccip/changeset/cs_update_rmn_config.go | 7 ++-- deployment/ccip/changeset/v1_5/cs_rmn.go | 6 ++-- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/deployment/ccip/changeset/cs_ccip_home.go b/deployment/ccip/changeset/cs_ccip_home.go index e7b3b10e046..ccf937e4906 100644 --- a/deployment/ccip/changeset/cs_ccip_home.go +++ b/deployment/ccip/changeset/cs_ccip_home.go @@ -735,17 +735,17 @@ func newDonWithCandidateOp( false, // acceptsWorkflows nodes.DefaultF(), ) - if err != nil { - return mcmstypes.Transaction{}, fmt.Errorf("failed to call AddDON (ptype: %s): %w", - types.PluginType(pluginConfig.PluginType).String(), err) - } + // note: error check is handled below if !mcmsEnabled { _, err = deployment.ConfirmIfNoErrorWithABI( homeChain, addDonTx, ccip_home.CCIPHomeABI, err) if err != nil { return mcmstypes.Transaction{}, fmt.Errorf("error confirming addDon call: %w", err) } + } else if err != nil { + return mcmstypes.Transaction{}, fmt.Errorf("failed to call AddDON (ptype: %s): %w", + types.PluginType(pluginConfig.PluginType).String(), err) } tx, err := proposalutils.TransactionForChain(homeChain.Selector, capReg.Address().Hex(), addDonTx.Data(), @@ -928,11 +928,8 @@ func setCandidateOnExistingDon( false, nodes.DefaultF(), ) - if err != nil { - return nil, fmt.Errorf("failed to call UpdateDON in set candidate (don: %d; ptype: %s): %w", - donID, types.PluginType(pluginConfig.PluginType).String(), err) - } + // note: error check is handled below if !mcmsEnabled { _, err = deployment.ConfirmIfNoErrorWithABI( homeChain, updateDonTx, ccip_home.CCIPHomeABI, err) @@ -940,6 +937,9 @@ func setCandidateOnExistingDon( return nil, fmt.Errorf("error confirming UpdateDON call in set candidate (don: %d; ptype: %s): %w", donID, types.PluginType(pluginConfig.PluginType).String(), err) } + } else if err != nil { + return nil, fmt.Errorf("failed to call UpdateDON in set candidate (don: %d; ptype: %s): %w", + donID, types.PluginType(pluginConfig.PluginType).String(), err) } tx, err := proposalutils.TransactionForChain(homeChain.Selector, capReg.Address().Hex(), updateDonTx.Data(), big.NewInt(0), string(CapabilitiesRegistry), []string{}) @@ -991,11 +991,8 @@ func promoteCandidateOp( false, nodes.DefaultF(), ) - if err != nil { - return mcmstypes.Transaction{}, fmt.Errorf("failed to call UpdateDON in promote candidate (don: %d; ptype: %s): %w", - donID, types.PluginType(pluginType).String(), err) - } + // note: error check is handled below if !mcmsEnabled { _, err = deployment.ConfirmIfNoErrorWithABI( homeChain, updateDonTx, ccip_home.CCIPHomeABI, err) @@ -1003,6 +1000,9 @@ func promoteCandidateOp( return mcmstypes.Transaction{}, fmt.Errorf("error confirming UpdateDON call in promote candidate (don: %d; ptype: %s): %w", donID, types.PluginType(pluginType).String(), err) } + } else if err != nil { + return mcmstypes.Transaction{}, fmt.Errorf("failed to call UpdateDON in promote candidate (don: %d; ptype: %s): %w", + donID, types.PluginType(pluginType).String(), err) } tx, err := proposalutils.TransactionForChain(homeChain.Selector, capReg.Address().Hex(), updateDonTx.Data(), @@ -1218,11 +1218,8 @@ func revokeCandidateOps( false, // isPublic nodes.DefaultF(), ) - if err != nil { - return nil, fmt.Errorf("failed to call UpdateDON in revoke candidate (don: %d; ptype: %s): %w", - donID, types.PluginType(pluginType).String(), err) - } + // note: error check is handled below if !mcmsEnabled { _, err = deployment.ConfirmIfNoErrorWithABI( homeChain, updateDonTx, @@ -1231,6 +1228,9 @@ func revokeCandidateOps( return nil, fmt.Errorf("error confirming UpdateDON call in revoke candidate (don: %d; ptype: %s): %w", donID, types.PluginType(pluginType).String(), err) } + } else if err != nil { + return nil, fmt.Errorf("failed to call UpdateDON in revoke candidate (don: %d; ptype: %s): %w", + donID, types.PluginType(pluginType).String(), err) } tx, err := proposalutils.TransactionForChain(homeChain.Selector, capReg.Address().Hex(), updateDonTx.Data(), diff --git a/deployment/ccip/changeset/cs_update_rmn_config.go b/deployment/ccip/changeset/cs_update_rmn_config.go index b935190fc62..f6cc6f18744 100644 --- a/deployment/ccip/changeset/cs_update_rmn_config.go +++ b/deployment/ccip/changeset/cs_update_rmn_config.go @@ -123,14 +123,15 @@ func setRMNRemoteOnRMNProxyOp( rmnProxy := chainState.RMNProxy rmnRemoteAddr := chainState.RMNRemote.Address() setRMNTx, err := rmnProxy.SetARM(txOpts, rmnRemoteAddr) - if err != nil { - return mcmstypes.BatchOperation{}, fmt.Errorf("failed to build call data/transaction to set RMNRemote on RMNProxy for chain %s: %w", chain.String(), err) - } + + // note: error check is handled below if !mcmsEnabled { _, err = deployment.ConfirmIfNoErrorWithABI(chain, setRMNTx, rmn_proxy_contract.RMNProxyABI, err) if err != nil { return mcmstypes.BatchOperation{}, fmt.Errorf("failed to confirm tx to set RMNRemote on RMNProxy for chain %s: %w", chain.String(), deployment.MaybeDataErr(err)) } + } else if err != nil { + return mcmstypes.BatchOperation{}, fmt.Errorf("failed to build call data/transaction to set RMNRemote on RMNProxy for chain %s: %w", chain.String(), err) } batchOperation, err := proposalutils.BatchOperationForChain(chain.Selector, rmnProxy.Address().Hex(), diff --git a/deployment/ccip/changeset/v1_5/cs_rmn.go b/deployment/ccip/changeset/v1_5/cs_rmn.go index 1245d907d81..7f9e2cdc092 100644 --- a/deployment/ccip/changeset/v1_5/cs_rmn.go +++ b/deployment/ccip/changeset/v1_5/cs_rmn.go @@ -134,10 +134,8 @@ func PermaBlessCommitStoreChangeset(env deployment.Environment, c PermaBlessComm txOpts = deployment.SimTransactOpts() } tx, err := RMN.OwnerRemoveThenAddPermaBlessedCommitStores(txOpts, removes, adds) - if err != nil { - return deployment.ChangesetOutput{}, err - } + // note: error check is handled below if c.MCMSConfig == nil { _, err = deployment.ConfirmIfNoErrorWithABI(env.Chains[destChain], tx, rmn_contract.RMNContractABI, err) if err != nil { @@ -145,6 +143,8 @@ func PermaBlessCommitStoreChangeset(env deployment.Environment, c PermaBlessComm } env.Logger.Infof("PermaBlessed commit stores on chain %d removed %v, added %v", destChain, removes, adds) continue + } else if err != nil { + return deployment.ChangesetOutput{}, err } timelocks[destChain] = destState.Timelock.Address().Hex() From 895522200bd08123a3401b7056ad0c3d648c4e72 Mon Sep 17 00:00:00 2001 From: karen-stepanyan <91897037+karen-stepanyan@users.noreply.github.com> Date: Fri, 21 Feb 2025 12:31:31 +0400 Subject: [PATCH 20/58] add data-feeds deployment folder and codeowner (#16500) * add data-feeds deployment folder and codeowner * README change --- .github/CODEOWNERS | 1 + deployment/data-feeds/README.md | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 deployment/data-feeds/README.md diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 3a8c82cffae..854437a44b6 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -148,6 +148,7 @@ core/scripts/gateway @smartcontractkit/dev-services /deployment/ccip @smartcontractkit/ccip-tooling @smartcontractkit/ccip-offchain @smartcontractkit/core @smartcontractkit/deployment-automation /deployment/keystone @smartcontractkit/keystone @smartcontractkit/core @smartcontractkit/deployment-automation /deployment/ccip/changeset/solana @smartcontractkit/solana-tooling @smartcontractkit/core @smartcontractkit/deployment-automation +/deployment/data-feeds @smartcontractkit/data-feeds-engineers @smartcontractkit/core @smartcontractkit/deployment-automation # TODO: As more products add their deployment logic here, add the team as an owner # CI/CD diff --git a/deployment/data-feeds/README.md b/deployment/data-feeds/README.md new file mode 100644 index 00000000000..c9d8d96f6ed --- /dev/null +++ b/deployment/data-feeds/README.md @@ -0,0 +1,3 @@ +### Data Feeds Deployments and Configurations + +This folder contains workflows for deploying and configuring Data Feeds contracts. From 944f84d3d7b2b0b14840dbe6745ee90f2267ab3f Mon Sep 17 00:00:00 2001 From: "Abdelrahman Soliman (Boda)" <2677789+asoliman92@users.noreply.github.com> Date: Fri, 21 Feb 2025 15:34:38 +0400 Subject: [PATCH 21/58] Remove DestGasOverhead from CalculateMessageMaxGasWithError (#16501) * Remove DestGasOverhead from CalculateMessageMaxGasWithError This was wrongly added as we already have enough overhead added from other fields which made the estimation very high * fix gas overhead * fix tests * fix tests --- core/capabilities/ccip/ccipevm/gas_helpers.go | 9 +++------ .../ccip/ccipevm/gas_helpers_test.go | 18 +++++++++--------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/core/capabilities/ccip/ccipevm/gas_helpers.go b/core/capabilities/ccip/ccipevm/gas_helpers.go index 838c78f8fb8..7266f7da6e7 100644 --- a/core/capabilities/ccip/ccipevm/gas_helpers.go +++ b/core/capabilities/ccip/ccipevm/gas_helpers.go @@ -23,16 +23,14 @@ const ( 30_000*3 // supportsInterface of ERC165Checker library performs 3 static-calls of 30k gas each PerTokenOverheadGas = TokenAdminRegistryPoolLookupGas + SupportsInterfaceCheck + - 200_000 + // releaseOrMint using callWithExactGas - 50_000 // transfer using callWithExactGas + 200_000 // releaseOrMint using callWithExactGas RateLimiterOverheadGas = 2_100 + // COLD_SLOAD_COST for accessing token bucket 5_000 // SSTORE_RESET_GAS for updating & decreasing token bucket ConstantMessagePartBytes = 10 * 32 // A message consists of 10 abi encoded fields 32B each (after encoding) ExecutionStateProcessingOverheadGas = 2_100 + // COLD_SLOAD_COST for first reading the state 20_000 + // SSTORE_SET_GAS for writing from 0 (untouched) to non-zero (in-progress) 100 //# SLOAD_GAS = WARM_STORAGE_READ_COST for rewriting from non-zero (in-progress) to non-zero (success/failure) - // TODO: investigate the write overhead for v1.6 - DestGasOverhead = 110_000 + 110_000 + 130_000 // 110K for commit, 110K for RMN, 130K for Exec + DestGasOverhead = 300_000 // Commit and Exec costs ) func NewGasEstimateProvider() EstimateProvider { @@ -106,8 +104,7 @@ func (gp EstimateProvider) CalculateMessageMaxGasWithError(msg cciptypes.Message adminRegistryOverhead = TokenAdminRegistryWarmupCost } - return DestGasOverhead + - messageGasLimit.Uint64() + + return messageGasLimit.Uint64() + messageCallDataGas + ExecutionStateProcessingOverheadGas + SupportsInterfaceCheck + diff --git a/core/capabilities/ccip/ccipevm/gas_helpers_test.go b/core/capabilities/ccip/ccipevm/gas_helpers_test.go index 570e7377d34..3a95dd40613 100644 --- a/core/capabilities/ccip/ccipevm/gas_helpers_test.go +++ b/core/capabilities/ccip/ccipevm/gas_helpers_test.go @@ -26,17 +26,17 @@ func Test_calculateMessageMaxGas(t *testing.T) { { name: "base", args: args{dataLen: 5, numTokens: 2, extraArgs: makeExtraArgsV1(200_000), tokenGasOverhead: 10}, - want: 1_372_284, + want: 922_284, }, { name: "large", args: args{dataLen: 1000, numTokens: 1000, extraArgs: makeExtraArgsV1(200_000), tokenGasOverhead: 1}, - want: 347_028_520, + want: 296_678_520, }, { name: "overheadGas test 1", args: args{dataLen: 0, numTokens: 0, extraArgs: makeExtraArgsV1(200_000), tokenGasOverhead: 100}, - want: 669_920, + want: 319_920, }, { name: "overheadGas test 2", @@ -46,7 +46,7 @@ func Test_calculateMessageMaxGas(t *testing.T) { extraArgs: makeExtraArgsV1(200_000), tokenGasOverhead: 2, }, - want: 1_025_950, + want: 625_950, }, { name: "allowOOO set to true makes no difference to final gas estimate", @@ -56,7 +56,7 @@ func Test_calculateMessageMaxGas(t *testing.T) { extraArgs: makeExtraArgsV2(200_000, true), tokenGasOverhead: 100, }, - want: 1_372_464, + want: 922_464, }, { name: "allowOOO set to false makes no difference to final gas estimate", @@ -66,7 +66,7 @@ func Test_calculateMessageMaxGas(t *testing.T) { extraArgs: makeExtraArgsV2(200_000, false), tokenGasOverhead: 100, }, - want: 1_372_464, + want: 922_464, }, } @@ -104,7 +104,7 @@ func TestCalculateMaxGas(t *testing.T) { numberOfTokens: 0, extraArgs: makeExtraArgsV1(200_000), tokenGasOverhead: 10, - want: 672_992, + want: 322_992, }, { name: "maxGasOverheadGas 2", @@ -113,7 +113,7 @@ func TestCalculateMaxGas(t *testing.T) { numberOfTokens: 1, extraArgs: makeExtraArgsV1(200_000), tokenGasOverhead: 10, - want: 1_028_518, + want: 628_518, }, { name: "v2 extra args", @@ -122,7 +122,7 @@ func TestCalculateMaxGas(t *testing.T) { numberOfTokens: 1, extraArgs: makeExtraArgsV2(200_000, true), tokenGasOverhead: 10, - want: 1_028_518, + want: 628_518, }, } From c23f77cec9add1f4ad59b9d6b8476b1b9c9a167f Mon Sep 17 00:00:00 2001 From: Makram Date: Fri, 21 Feb 2025 14:32:16 +0200 Subject: [PATCH 22/58] [CCIP-5117] integration-tests/smoke/ccip: factor out fee test helpers (#16496) * integration-tests/smoke/ccip: factor out fee test helpers * goimports * fix comment --- .github/integration-in-memory-tests.yml | 2 +- .../changeset/testhelpers/feestest/helpers.go | 228 ++++++++++++ .../changeset/testhelpers/test_helpers.go | 5 +- .../smoke/ccip/ccip_fees_test.go | 344 +++++------------- 4 files changed, 316 insertions(+), 263 deletions(-) create mode 100644 deployment/ccip/changeset/testhelpers/feestest/helpers.go diff --git a/.github/integration-in-memory-tests.yml b/.github/integration-in-memory-tests.yml index 32a510c95c6..39d61cd03e7 100644 --- a/.github/integration-in-memory-tests.yml +++ b/.github/integration-in-memory-tests.yml @@ -21,7 +21,7 @@ runner-test-matrix: runs_on: ubuntu-latest triggers: - PR Integration CCIP Tests - test_cmd: cd integration-tests/smoke/ccip && go test ccip_fees_test.go -timeout 12m -test.parallel=2 -count=1 -json + test_cmd: cd integration-tests/smoke/ccip && go test ccip_fees_test.go -timeout 20m -test.parallel=2 -count=1 -json - id: smoke/ccip/ccip_messaging_test.go:* path: integration-tests/smoke/ccip/ccip_messaging_test.go diff --git a/deployment/ccip/changeset/testhelpers/feestest/helpers.go b/deployment/ccip/changeset/testhelpers/feestest/helpers.go new file mode 100644 index 00000000000..f939c7b91bd --- /dev/null +++ b/deployment/ccip/changeset/testhelpers/feestest/helpers.go @@ -0,0 +1,228 @@ +package feestest + +import ( + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" + "github.com/smartcontractkit/chainlink-integrations/evm/assets" + "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/weth9" +) + +// NewFeeTokenTestCase creates a new FeeTokenTestCase to test fee token usage scenarios. +func NewFeeTokenTestCase( + t *testing.T, + env deployment.Environment, + src, dst uint64, + feeToken common.Address, + tokenAmounts []router.ClientEVMTokenAmount, + srcToken, dstToken *burn_mint_erc677.BurnMintERC677, + receiver []byte, + data []byte, + assertTokenBalance, assertExecution bool, +) FeeTokenTestCase { + return FeeTokenTestCase{ + t: t, + src: src, + dst: dst, + env: env, + srcToken: srcToken, + dstToken: dstToken, + tokenAmounts: tokenAmounts, + feeToken: feeToken, + receiver: receiver, + data: data, + assertTokenBalance: assertTokenBalance, + assertExecution: assertExecution, + } +} + +type FeeTokenTestCase struct { + t *testing.T + src, dst uint64 + env deployment.Environment + srcToken, dstToken *burn_mint_erc677.BurnMintERC677 + tokenAmounts []router.ClientEVMTokenAmount + feeToken common.Address + receiver []byte + data []byte + assertTokenBalance bool + assertExecution bool +} + +func RunFeeTokenTestCase(tc FeeTokenTestCase) { + ctx := tests.Context(tc.t) + // Need to keep track of the block number for each chain so that event subscription can be done from that block. + startBlocks := make(map[uint64]*uint64) + expectedSeqNum := make(map[testhelpers.SourceDestPair]uint64) + expectedSeqNumExec := make(map[testhelpers.SourceDestPair][]uint64) + + srcChain := tc.env.Chains[tc.src] + dstChain := tc.env.Chains[tc.dst] + + state, err := changeset.LoadOnchainState(tc.env) + require.NoError(tc.t, err) + + var dstTokBalanceBefore *big.Int + if tc.assertTokenBalance { + var err error + dstTokBalanceBefore, err = tc.dstToken.BalanceOf(nil, state.Chains[tc.dst].Receiver.Address()) + require.NoError(tc.t, err) + tc.t.Logf("destination token balance before of receiver %s: %s", + state.Chains[tc.dst].Receiver.Address(), + dstTokBalanceBefore.String()) + } + + // if fee token is not native then approve the router to spend the fee token from the sender. + var feeTokenWrapper *burn_mint_erc677.BurnMintERC677 + if tc.feeToken != common.HexToAddress("0x0") { + if tc.feeToken == state.Chains[tc.src].Weth9.Address() { + // Deposit some ETH into the WETH contract + weth9, err := weth9.NewWETH9(state.Chains[tc.src].Weth9.Address(), srcChain.Client) + require.NoError(tc.t, err) + + balance, err := srcChain.Client.BalanceAt(ctx, srcChain.DeployerKey.From, nil) + require.NoError(tc.t, err) + + tc.t.Logf("balance before deposit: %s", balance.String()) + + srcChain.DeployerKey.Value = assets.Ether(100).ToInt() + tx, err := weth9.Deposit(srcChain.DeployerKey) + _, err = deployment.ConfirmIfNoError(srcChain, tx, err) + require.NoError(tc.t, err) + srcChain.DeployerKey.Value = big.NewInt(0) + } + + var err error + feeTokenWrapper, err = burn_mint_erc677.NewBurnMintERC677(tc.feeToken, srcChain.Client) + require.NoError(tc.t, err) + + bal, err := feeTokenWrapper.BalanceOf(&bind.CallOpts{ + Context: ctx, + }, srcChain.DeployerKey.From) + require.NoError(tc.t, err) + + tc.t.Logf("fee token balance before approval: %s", bal.String()) + + // Approve the router to spend fee token + tx, err := feeTokenWrapper.Approve(srcChain.DeployerKey, state.Chains[tc.src].Router.Address(), math.MaxBig256) + + _, err = deployment.ConfirmIfNoError(srcChain, tx, err) + require.NoError(tc.t, err) + } + + // get the header for the destination chain and the relevant block number + latesthdr, err := dstChain.Client.HeaderByNumber(testcontext.Get(tc.t), nil) + require.NoError(tc.t, err) + block := latesthdr.Number.Uint64() + startBlocks[tc.dst] = &block + + // Get the fee Token Balance Before, if not fee token set get native balance. + var feeTokenBalanceBefore *big.Int + if feeTokenWrapper != nil { + feeTokenBalanceBefore, err = feeTokenWrapper.BalanceOf(&bind.CallOpts{ + Context: ctx, + }, srcChain.DeployerKey.From) + require.NoError(tc.t, err) + } else { + feeTokenBalanceBefore, err = srcChain.Client.BalanceAt(ctx, srcChain.DeployerKey.From, nil) + require.NoError(tc.t, err) + } + tc.t.Logf("fee token balance before: %s, fee token enabled: %s", + feeTokenBalanceBefore.String(), tc.feeToken.String()) + + msgSentEvent := testhelpers.TestSendRequest( + tc.t, + tc.env, + state, + tc.src, + tc.dst, + false, + router.ClientEVM2AnyMessage{ + Receiver: tc.receiver, + Data: tc.data, + TokenAmounts: tc.tokenAmounts, + FeeToken: tc.feeToken, + ExtraArgs: nil, + }, + ) + + expectedSeqNum[testhelpers.SourceDestPair{ + SourceChainSelector: tc.src, + DestChainSelector: tc.dst, + }] = msgSentEvent.SequenceNumber + expectedSeqNumExec[testhelpers.SourceDestPair{ + SourceChainSelector: tc.src, + DestChainSelector: tc.dst, + }] = []uint64{msgSentEvent.SequenceNumber} + + // Check the fee token balance after the request and ensure fee tokens were spent + var feeTokenBalanceAfter *big.Int + if feeTokenWrapper != nil { + feeTokenBalanceAfter, err = feeTokenWrapper.BalanceOf(&bind.CallOpts{ + Context: ctx, + }, srcChain.DeployerKey.From) + require.NoError(tc.t, err) + } else { + feeTokenBalanceAfter, err = srcChain.Client.BalanceAt(ctx, srcChain.DeployerKey.From, nil) + require.NoError(tc.t, err) + } + tc.t.Logf("fee token balance after: %s, fee token: %s, fee paid: %s", + feeTokenBalanceAfter.String(), tc.feeToken.String(), msgSentEvent.Message.FeeTokenAmount) + // in the case we have no fee token, native is also used to pay for the tx, + // so we have to subtract that as well + if feeTokenWrapper == nil { + receipt, err := srcChain.Client.TransactionReceipt(ctx, msgSentEvent.Raw.TxHash) + require.NoError(tc.t, err) + txCostWei := new(big.Int).Mul(new(big.Int).SetUint64(receipt.GasUsed), receipt.EffectiveGasPrice) + feeTokenBalanceBefore.Sub(feeTokenBalanceBefore, txCostWei) + } + require.Equal( + tc.t, + feeTokenBalanceAfter, + new(big.Int).Sub(feeTokenBalanceBefore, msgSentEvent.Message.FeeTokenAmount), + ) + + if tc.assertExecution { + // Wait for all commit reports to land. + testhelpers.ConfirmCommitForAllWithExpectedSeqNums(tc.t, tc.env, state, expectedSeqNum, startBlocks) + + // After commit is reported on all chains, token prices should be updated in FeeQuoter. + linkAddress := state.Chains[tc.dst].LinkToken.Address() + feeQuoter := state.Chains[tc.dst].FeeQuoter + timestampedPrice, err := feeQuoter.GetTokenPrice(&bind.CallOpts{ + Context: ctx, + }, linkAddress) + require.NoError(tc.t, err) + require.Equal(tc.t, changeset.MockLinkPrice, timestampedPrice.Value) + + // Wait for all exec reports to land + testhelpers.ConfirmExecWithSeqNrsForAll(tc.t, tc.env, state, expectedSeqNumExec, startBlocks) + } + + if tc.assertTokenBalance { + require.Len(tc.t, tc.tokenAmounts, 1) + expectedTransferAmount := tc.tokenAmounts[0].Amount + + balanceAfter, err := tc.dstToken.BalanceOf(&bind.CallOpts{ + Context: ctx, + }, state.Chains[tc.dst].Receiver.Address()) + require.NoError(tc.t, err) + require.Equal( + tc.t, + new(big.Int).Add(dstTokBalanceBefore, expectedTransferAmount), + balanceAfter, + ) + } +} diff --git a/deployment/ccip/changeset/testhelpers/test_helpers.go b/deployment/ccip/changeset/testhelpers/test_helpers.go index 2d9aeca97a8..1127e34a89b 100644 --- a/deployment/ccip/changeset/testhelpers/test_helpers.go +++ b/deployment/ccip/changeset/testhelpers/test_helpers.go @@ -221,10 +221,7 @@ func CCIPSendRequest( } tx, err := r.CcipSend(cfg.Sender, cfg.DestChain, msg) - if err != nil { - return nil, 0, errors.Wrap(err, "failed to send CCIP message") - } - blockNum, err := e.Chains[cfg.SourceChain].Confirm(tx) + blockNum, err := deployment.ConfirmIfNoErrorWithABI(e.Chains[cfg.SourceChain], tx, router.RouterABI, err) if err != nil { return tx, 0, errors.Wrap(err, "failed to confirm CCIP message") } diff --git a/integration-tests/smoke/ccip/ccip_fees_test.go b/integration-tests/smoke/ccip/ccip_fees_test.go index 5507f92096a..bcad18b508d 100644 --- a/integration-tests/smoke/ccip/ccip_fees_test.go +++ b/integration-tests/smoke/ccip/ccip_fees_test.go @@ -4,24 +4,18 @@ import ( "math/big" "testing" - "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" "github.com/stretchr/testify/require" - "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" - "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" - "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers/feestest" testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" - "github.com/smartcontractkit/chainlink-integrations/evm/assets" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/weth9" "github.com/smartcontractkit/chainlink/v2/core/logger" ) @@ -110,7 +104,7 @@ func Test_CCIPFees(t *testing.T) { ) e := tenv.Env - allChains := tenv.Env.AllChainSelectors() + allChains := e.AllChainSelectors() require.Len(t, allChains, 2, "need two chains for this test") sourceChain := allChains[0] destChain := allChains[1] @@ -136,71 +130,71 @@ func Test_CCIPFees(t *testing.T) { testhelpers.AddLanesForAll(t, &tenv, state) t.Run("Send programmable token transfer pay with Link token", func(t *testing.T) { - runFeeTokenTestCase(feeTokenTestCase{ - t: t, - dst: destChain, - src: sourceChain, - env: tenv, - tokenAmounts: []router.ClientEVMTokenAmount{ + feestest.RunFeeTokenTestCase(feestest.NewFeeTokenTestCase( + t, + e, + sourceChain, + destChain, + state.Chains[sourceChain].LinkToken.Address(), // feeToken + []router.ClientEVMTokenAmount{ { Token: srcToken.Address(), Amount: deployment.E18Mult(2), }, }, - feeToken: state.Chains[sourceChain].LinkToken.Address(), - data: []byte("hello ptt world"), - receiver: common.LeftPadBytes(state.Chains[destChain].Receiver.Address().Bytes(), 32), - srcToken: srcToken, - dstToken: dstToken, - assertTokenBalance: true, - }) + srcToken, + dstToken, + common.LeftPadBytes(state.Chains[destChain].Receiver.Address().Bytes(), 32), // receiver + []byte("hello ptt world"), // data + true, // assertTokenBalance + true, // assertExecution + )) }) t.Run("Send programmable token transfer pay with native", func(t *testing.T) { - runFeeTokenTestCase(feeTokenTestCase{ - t: t, - + feestest.RunFeeTokenTestCase(feestest.NewFeeTokenTestCase( + t, + e, // note the order of src and dest is reversed here - src: destChain, - dst: sourceChain, - - env: tenv, - tokenAmounts: []router.ClientEVMTokenAmount{ + destChain, + sourceChain, + common.HexToAddress("0x0"), // feeToken + []router.ClientEVMTokenAmount{ { Token: dstToken.Address(), Amount: deployment.E18Mult(2), }, }, - feeToken: common.HexToAddress("0x0"), - data: []byte("hello ptt world"), - receiver: common.LeftPadBytes(state.Chains[sourceChain].Receiver.Address().Bytes(), 32), - // note the order of src and dest is reversed here - srcToken: dstToken, - dstToken: srcToken, - assertTokenBalance: true, - }) + dstToken, + srcToken, + common.LeftPadBytes(state.Chains[sourceChain].Receiver.Address().Bytes(), 32), // receiver + []byte("hello ptt world"), // data + true, // assertTokenBalance + true, // assertExecution + )) }) t.Run("Send programmable token transfer pay with wrapped native", func(t *testing.T) { - runFeeTokenTestCase(feeTokenTestCase{ - t: t, - src: sourceChain, - dst: destChain, - env: tenv, - tokenAmounts: []router.ClientEVMTokenAmount{ + feestest.RunFeeTokenTestCase(feestest.NewFeeTokenTestCase( + t, + e, + sourceChain, + destChain, + state.Chains[sourceChain].Weth9.Address(), // feeToken + []router.ClientEVMTokenAmount{ { Token: srcToken.Address(), Amount: deployment.E18Mult(2), }, }, - feeToken: state.Chains[sourceChain].Weth9.Address(), - data: []byte("hello ptt world"), - receiver: common.LeftPadBytes(state.Chains[destChain].Receiver.Address().Bytes(), 32), - srcToken: srcToken, - dstToken: dstToken, - assertTokenBalance: true, - }) + srcToken, + dstToken, + common.LeftPadBytes(state.Chains[destChain].Receiver.Address().Bytes(), 32), // receiver + []byte("hello ptt world"), // data + true, // assertTokenBalance + true, // assertExecution + )) }) t.Run("Send programmable token transfer but revert not enough tokens", func(t *testing.T) { @@ -240,222 +234,56 @@ func Test_CCIPFees(t *testing.T) { }) t.Run("Send data-only message pay with link token", func(t *testing.T) { - runFeeTokenTestCase(feeTokenTestCase{ - t: t, - src: sourceChain, - dst: destChain, - env: tenv, + feestest.RunFeeTokenTestCase(feestest.NewFeeTokenTestCase( + t, + e, + sourceChain, + destChain, // no tokens, only data - tokenAmounts: nil, - feeToken: state.Chains[sourceChain].LinkToken.Address(), - data: []byte("hello link world"), - receiver: common.LeftPadBytes(state.Chains[destChain].Receiver.Address().Bytes(), 32), - srcToken: srcToken, - dstToken: dstToken, - assertTokenBalance: false, - }) + state.Chains[sourceChain].LinkToken.Address(), // feeToken + nil, // tokenAmounts + srcToken, + dstToken, + common.LeftPadBytes(state.Chains[destChain].Receiver.Address().Bytes(), 32), // receiver + []byte("hello link world"), // data + false, // assertTokenBalance + true, // assertExecution + )) }) t.Run("Send message pay with native", func(t *testing.T) { - runFeeTokenTestCase(feeTokenTestCase{ - t: t, - src: sourceChain, - dst: destChain, - env: tenv, + feestest.RunFeeTokenTestCase(feestest.NewFeeTokenTestCase( + t, + e, + sourceChain, + destChain, + common.HexToAddress("0x0"), // feeToken // no tokens, only data - tokenAmounts: nil, - feeToken: common.HexToAddress("0x0"), - data: []byte("hello native world"), - receiver: common.LeftPadBytes(state.Chains[destChain].Receiver.Address().Bytes(), 32), - srcToken: srcToken, - dstToken: dstToken, - assertTokenBalance: false, - }) + nil, // tokenAmounts + srcToken, + dstToken, + common.LeftPadBytes(state.Chains[destChain].Receiver.Address().Bytes(), 32), // receiver + []byte("hello native world"), // data + false, // assertTokenBalance + true, // assertExecution + )) }) t.Run("Send message pay with wrapped native", func(t *testing.T) { - runFeeTokenTestCase(feeTokenTestCase{ - t: t, - src: sourceChain, - dst: destChain, - env: tenv, + feestest.RunFeeTokenTestCase(feestest.NewFeeTokenTestCase( + t, + e, + sourceChain, + destChain, + state.Chains[sourceChain].Weth9.Address(), // feeToken // no tokens, only data - tokenAmounts: nil, - feeToken: state.Chains[sourceChain].Weth9.Address(), - data: []byte("hello wrapped native world"), - receiver: common.LeftPadBytes(state.Chains[destChain].Receiver.Address().Bytes(), 32), - srcToken: srcToken, - dstToken: dstToken, - assertTokenBalance: false, - }) + nil, // tokenAmounts + srcToken, + dstToken, + common.LeftPadBytes(state.Chains[destChain].Receiver.Address().Bytes(), 32), // receiver + []byte("hello wrapped native world"), // data + false, // assertTokenBalance + true, // assertExecution + )) }) } - -type feeTokenTestCase struct { - t *testing.T - src, dst uint64 - env testhelpers.DeployedEnv - srcToken, dstToken *burn_mint_erc677.BurnMintERC677 - tokenAmounts []router.ClientEVMTokenAmount - feeToken common.Address - receiver []byte - data []byte - assertTokenBalance bool -} - -func runFeeTokenTestCase(tc feeTokenTestCase) { - ctx := tests.Context(tc.t) - // Need to keep track of the block number for each chain so that event subscription can be done from that block. - startBlocks := make(map[uint64]*uint64) - expectedSeqNum := make(map[testhelpers.SourceDestPair]uint64) - expectedSeqNumExec := make(map[testhelpers.SourceDestPair][]uint64) - - srcChain := tc.env.Env.Chains[tc.src] - dstChain := tc.env.Env.Chains[tc.dst] - - state, err := changeset.LoadOnchainState(tc.env.Env) - require.NoError(tc.t, err) - - var dstTokBalanceBefore *big.Int - if tc.assertTokenBalance { - var err error - dstTokBalanceBefore, err = tc.dstToken.BalanceOf(nil, state.Chains[tc.dst].Receiver.Address()) - require.NoError(tc.t, err) - tc.t.Logf("destination token balance before of receiver %s: %s", - state.Chains[tc.dst].Receiver.Address(), - dstTokBalanceBefore.String()) - } - - // if fee token is not native then approve the router to spend the fee token from the sender. - var feeTokenWrapper *burn_mint_erc677.BurnMintERC677 - if tc.feeToken != common.HexToAddress("0x0") { - if tc.feeToken == state.Chains[tc.src].Weth9.Address() { - // Deposit some ETH into the WETH contract - weth9, err := weth9.NewWETH9(state.Chains[tc.src].Weth9.Address(), srcChain.Client) - require.NoError(tc.t, err) - - balance, err := srcChain.Client.BalanceAt(ctx, srcChain.DeployerKey.From, nil) - require.NoError(tc.t, err) - - tc.t.Logf("balance before deposit: %s", balance.String()) - - srcChain.DeployerKey.Value = assets.Ether(100).ToInt() - tx, err := weth9.Deposit(srcChain.DeployerKey) - _, err = deployment.ConfirmIfNoError(srcChain, tx, err) - require.NoError(tc.t, err) - srcChain.DeployerKey.Value = big.NewInt(0) - } - - var err error - feeTokenWrapper, err = burn_mint_erc677.NewBurnMintERC677(tc.feeToken, srcChain.Client) - require.NoError(tc.t, err) - - // Approve the router to spend fee token - tx, err := feeTokenWrapper.Approve(srcChain.DeployerKey, state.Chains[tc.src].Router.Address(), math.MaxBig256) - - _, err = deployment.ConfirmIfNoError(srcChain, tx, err) - require.NoError(tc.t, err) - } - - // get the header for the destination chain and the relevant block number - latesthdr, err := dstChain.Client.HeaderByNumber(testcontext.Get(tc.t), nil) - require.NoError(tc.t, err) - block := latesthdr.Number.Uint64() - startBlocks[tc.dst] = &block - - // Get the fee Token Balance Before, if not fee token set get native balance. - var feeTokenBalanceBefore *big.Int - if feeTokenWrapper != nil { - feeTokenBalanceBefore, err = feeTokenWrapper.BalanceOf(&bind.CallOpts{ - Context: ctx, - }, srcChain.DeployerKey.From) - require.NoError(tc.t, err) - } else { - feeTokenBalanceBefore, err = srcChain.Client.BalanceAt(ctx, srcChain.DeployerKey.From, nil) - require.NoError(tc.t, err) - } - tc.t.Logf("fee token balance before: %s, fee token enabled: %s", - feeTokenBalanceBefore.String(), tc.feeToken.String()) - - msgSentEvent := testhelpers.TestSendRequest( - tc.t, - tc.env.Env, - state, - tc.src, - tc.dst, - false, - router.ClientEVM2AnyMessage{ - Receiver: tc.receiver, - Data: tc.data, - TokenAmounts: tc.tokenAmounts, - FeeToken: tc.feeToken, - ExtraArgs: nil, - }, - ) - - expectedSeqNum[testhelpers.SourceDestPair{ - SourceChainSelector: tc.src, - DestChainSelector: tc.dst, - }] = msgSentEvent.SequenceNumber - expectedSeqNumExec[testhelpers.SourceDestPair{ - SourceChainSelector: tc.src, - DestChainSelector: tc.dst, - }] = []uint64{msgSentEvent.SequenceNumber} - - // Check the fee token balance after the request and ensure fee tokens were spent - var feeTokenBalanceAfter *big.Int - if feeTokenWrapper != nil { - feeTokenBalanceAfter, err = feeTokenWrapper.BalanceOf(&bind.CallOpts{ - Context: ctx, - }, srcChain.DeployerKey.From) - require.NoError(tc.t, err) - } else { - feeTokenBalanceAfter, err = srcChain.Client.BalanceAt(ctx, srcChain.DeployerKey.From, nil) - require.NoError(tc.t, err) - } - tc.t.Logf("fee token balance after: %s, fee token: %s, fee paid: %s", - feeTokenBalanceAfter.String(), tc.feeToken.String(), msgSentEvent.Message.FeeTokenAmount) - // in the case we have no fee token, native is also used to pay for the tx, - // so we have to subtract that as well - if feeTokenWrapper == nil { - receipt, err := srcChain.Client.TransactionReceipt(ctx, msgSentEvent.Raw.TxHash) - require.NoError(tc.t, err) - txCostWei := new(big.Int).Mul(new(big.Int).SetUint64(receipt.GasUsed), receipt.EffectiveGasPrice) - feeTokenBalanceBefore.Sub(feeTokenBalanceBefore, txCostWei) - } - require.Equal( - tc.t, - feeTokenBalanceAfter, - new(big.Int).Sub(feeTokenBalanceBefore, msgSentEvent.Message.FeeTokenAmount), - ) - - // Wait for all commit reports to land. - testhelpers.ConfirmCommitForAllWithExpectedSeqNums(tc.t, tc.env.Env, state, expectedSeqNum, startBlocks) - - // After commit is reported on all chains, token prices should be updated in FeeQuoter. - linkAddress := state.Chains[tc.dst].LinkToken.Address() - feeQuoter := state.Chains[tc.dst].FeeQuoter - timestampedPrice, err := feeQuoter.GetTokenPrice(&bind.CallOpts{ - Context: ctx, - }, linkAddress) - require.NoError(tc.t, err) - require.Equal(tc.t, changeset.MockLinkPrice, timestampedPrice.Value) - - // Wait for all exec reports to land - testhelpers.ConfirmExecWithSeqNrsForAll(tc.t, tc.env.Env, state, expectedSeqNumExec, startBlocks) - - if tc.assertTokenBalance { - require.Len(tc.t, tc.tokenAmounts, 1) - expectedTransferAmount := tc.tokenAmounts[0].Amount - - balanceAfter, err := tc.dstToken.BalanceOf(&bind.CallOpts{ - Context: ctx, - }, state.Chains[tc.dst].Receiver.Address()) - require.NoError(tc.t, err) - require.Equal( - tc.t, - new(big.Int).Add(dstTokBalanceBefore, expectedTransferAmount), - balanceAfter, - ) - } -} From 60d011a0d5236e3db66af9eb153c02aa569c57a7 Mon Sep 17 00:00:00 2001 From: pavel-raykov <165708424+pavel-raykov@users.noreply.github.com> Date: Fri, 21 Feb 2025 13:59:57 +0100 Subject: [PATCH 23/58] Move BoxOutput util function to the only place it is called. (#16513) * Minor * Minor * Minor --- .changeset/itchy-cameras-scream.md | 5 +++++ core/gethwrappers/go_generate_test.go | 6 ++---- core/gethwrappers/utils.go | 29 +++++++++++++++++++++++++++ core/gethwrappers/utils_test.go | 27 +++++++++++++++++++++++++ core/utils/utils.go | 28 -------------------------- core/utils/utils_test.go | 18 ----------------- 6 files changed, 63 insertions(+), 50 deletions(-) create mode 100644 .changeset/itchy-cameras-scream.md create mode 100644 core/gethwrappers/utils_test.go diff --git a/.changeset/itchy-cameras-scream.md b/.changeset/itchy-cameras-scream.md new file mode 100644 index 00000000000..01a3eca84ad --- /dev/null +++ b/.changeset/itchy-cameras-scream.md @@ -0,0 +1,5 @@ +--- +"chainlink": minor +--- + +#updated Move BoxOutput util function to the only place it is called. diff --git a/core/gethwrappers/go_generate_test.go b/core/gethwrappers/go_generate_test.go index ff53cf715e3..bbe328a6726 100644 --- a/core/gethwrappers/go_generate_test.go +++ b/core/gethwrappers/go_generate_test.go @@ -17,8 +17,6 @@ import ( cutils "github.com/smartcontractkit/chainlink-common/pkg/utils" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" - "github.com/smartcontractkit/chainlink/v2/core/utils" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -39,7 +37,7 @@ func TestCheckContractHashesFromLastGoGenerate(t *testing.T) { wd = "" } require.Equal(t, versions.GethVersion, GethVersion, - color.HiRedString(utils.BoxOutput("please re-run `go generate %s` and commit the"+ + color.HiRedString(BoxOutput("please re-run `go generate %s` and commit the"+ "changes", wd))) for _, contractVersionInfo := range versions.ContractVersions { @@ -96,7 +94,7 @@ func compareCurrentCompilerArtifactAgainstRecordsAndSoliditySources( require.NoError(t, err) recompileCommand := fmt.Sprintf("(cd %s/contracts; make wrappers-all)", rootDir) assert.Equal(t, versionInfo.Hash, hash, - utils.BoxOutput(`compiled %s and/or %s has changed; please rerun + BoxOutput(`compiled %s and/or %s has changed; please rerun %s, and commit the changes`, versionInfo.AbiPath, versionInfo.BinaryPath, recompileCommand)) } diff --git a/core/gethwrappers/utils.go b/core/gethwrappers/utils.go index 59268c295e2..b46fbfae6e5 100644 --- a/core/gethwrappers/utils.go +++ b/core/gethwrappers/utils.go @@ -5,6 +5,7 @@ import ( "fmt" "os" "path/filepath" + "strings" ) // VersionHash is the hash used to detect changes in the underlying contract @@ -61,3 +62,31 @@ func TempDir(dirPrefix string) (string, func()) { } } } + +// BoxOutput formats its arguments as fmt.Printf, and encloses them in a box of +// arrows pointing at their content, in order to better highlight it. See +// ExampleBoxOutput +func BoxOutput(errorMsgTemplate string, errorMsgValues ...interface{}) string { + errorMsgTemplate = fmt.Sprintf(errorMsgTemplate, errorMsgValues...) + lines := strings.Split(errorMsgTemplate, "\n") + maxlen := 0 + for _, line := range lines { + if len(line) > maxlen { + maxlen = len(line) + } + } + internalLength := maxlen + 4 + output := "↘" + strings.Repeat("↓", internalLength) + "↙\n" // top line + output += "→ " + strings.Repeat(" ", maxlen) + " ←\n" + readme := strings.Repeat("README ", maxlen/7) + output += "→ " + readme + strings.Repeat(" ", maxlen-len(readme)) + " ←\n" + output += "→ " + strings.Repeat(" ", maxlen) + " ←\n" + for _, line := range lines { + output += "→ " + line + strings.Repeat(" ", maxlen-len(line)) + " ←\n" + } + output += "→ " + strings.Repeat(" ", maxlen) + " ←\n" + output += "→ " + readme + strings.Repeat(" ", maxlen-len(readme)) + " ←\n" + output += "→ " + strings.Repeat(" ", maxlen) + " ←\n" + return "\n" + output + "↗" + strings.Repeat("↑", internalLength) + "↖" + // bottom line + "\n\n" +} diff --git a/core/gethwrappers/utils_test.go b/core/gethwrappers/utils_test.go new file mode 100644 index 00000000000..671cd8b0d51 --- /dev/null +++ b/core/gethwrappers/utils_test.go @@ -0,0 +1,27 @@ +package gethwrappers_test + +import ( + "testing" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers" + + "github.com/stretchr/testify/assert" +) + +func TestBoxOutput(t *testing.T) { + t.Parallel() + + output := gethwrappers.BoxOutput("some error %d %s", 123, "foo") + const expected = "\n" + + "↘↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↙\n" + + "→ ←\n" + + "→ README README ←\n" + + "→ ←\n" + + "→ some error 123 foo ←\n" + + "→ ←\n" + + "→ README README ←\n" + + "→ ←\n" + + "↗↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↖\n" + + "\n" + assert.Equal(t, expected, output) +} diff --git a/core/utils/utils.go b/core/utils/utils.go index 98c2607baff..5f0954df1d0 100644 --- a/core/utils/utils.go +++ b/core/utils/utils.go @@ -513,34 +513,6 @@ func (m *KeyedMutex) LockInt64(key int64) func() { return mtx.Unlock } -// BoxOutput formats its arguments as fmt.Printf, and encloses them in a box of -// arrows pointing at their content, in order to better highlight it. See -// ExampleBoxOutput -func BoxOutput(errorMsgTemplate string, errorMsgValues ...interface{}) string { - errorMsgTemplate = fmt.Sprintf(errorMsgTemplate, errorMsgValues...) - lines := strings.Split(errorMsgTemplate, "\n") - maxlen := 0 - for _, line := range lines { - if len(line) > maxlen { - maxlen = len(line) - } - } - internalLength := maxlen + 4 - output := "↘" + strings.Repeat("↓", internalLength) + "↙\n" // top line - output += "→ " + strings.Repeat(" ", maxlen) + " ←\n" - readme := strings.Repeat("README ", maxlen/7) - output += "→ " + readme + strings.Repeat(" ", maxlen-len(readme)) + " ←\n" - output += "→ " + strings.Repeat(" ", maxlen) + " ←\n" - for _, line := range lines { - output += "→ " + line + strings.Repeat(" ", maxlen-len(line)) + " ←\n" - } - output += "→ " + strings.Repeat(" ", maxlen) + " ←\n" - output += "→ " + readme + strings.Repeat(" ", maxlen-len(readme)) + " ←\n" - output += "→ " + strings.Repeat(" ", maxlen) + " ←\n" - return "\n" + output + "↗" + strings.Repeat("↑", internalLength) + "↖" + // bottom line - "\n\n" -} - // ConcatBytes appends a bunch of byte arrays into a single byte array func ConcatBytes(bufs ...[]byte) []byte { return bytes.Join(bufs, []byte{}) diff --git a/core/utils/utils_test.go b/core/utils/utils_test.go index 587bd46efb9..d1dd829ef64 100644 --- a/core/utils/utils_test.go +++ b/core/utils/utils_test.go @@ -205,24 +205,6 @@ func TestHashPassword(t *testing.T) { assert.False(t, ok) } -func TestBoxOutput(t *testing.T) { - t.Parallel() - - output := utils.BoxOutput("some error %d %s", 123, "foo") - const expected = "\n" + - "↘↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↙\n" + - "→ ←\n" + - "→ README README ←\n" + - "→ ←\n" + - "→ some error 123 foo ←\n" + - "→ ←\n" + - "→ README README ←\n" + - "→ ←\n" + - "↗↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↖\n" + - "\n" - assert.Equal(t, expected, output) -} - func TestISO8601UTC(t *testing.T) { t.Parallel() From 3b871a786056dbdb6caa573ba67b2ed0637964ec Mon Sep 17 00:00:00 2001 From: "Abdelrahman Soliman (Boda)" <2677789+asoliman92@users.noreply.github.com> Date: Fri, 21 Feb 2025 21:41:18 +0400 Subject: [PATCH 24/58] bump cl-ccip with fix for exec consensus (#16514) * bump cl-ccip with fix for exec consensus https://github.com/smartcontractkit/chainlink-ccip/commit/dd0db587bff45ae96b21e8c40b5c937f34910995 * F Chain is number of nodes divided by 3 * fix linting * fix linting * fix linting * fix linting --- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 ++-- deployment/environment/crib/ccip_deployer.go | 4 +++- deployment/go.mod | 2 +- deployment/go.sum | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 ++-- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 ++-- system-tests/lib/go.mod | 2 +- system-tests/lib/go.sum | 4 ++-- system-tests/tests/go.mod | 2 +- system-tests/tests/go.sum | 4 ++-- 15 files changed, 24 insertions(+), 22 deletions(-) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 5829e8c76a6..1f2e0a7dd94 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -340,7 +340,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 3589fe814ae..f2f5275541e 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1086,8 +1086,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 h1:voKtyPNWsT4o/IilRbkEMsvYEWhYMpkl94mi3fDQz60= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/deployment/environment/crib/ccip_deployer.go b/deployment/environment/crib/ccip_deployer.go index 49e3fae4678..da8da727013 100644 --- a/deployment/environment/crib/ccip_deployer.go +++ b/deployment/environment/crib/ccip_deployer.go @@ -273,7 +273,9 @@ func setupChains(lggr logger.Logger, e *deployment.Environment, homeChainSel uin }) chainConfigs[chain] = changeset.ChainConfig{ Readers: nodeInfo.NonBootstraps().PeerIDs(), - FChain: 1, + // Number of nodes is 3f+1 + //nolint:gosec // this should always be less than max uint8 + FChain: uint8(len(nodeInfo.NonBootstraps().PeerIDs()) / 3), EncodableChainConfig: chainconfig.ChainConfig{ GasPriceDeviationPPB: cciptypes.BigInt{Int: big.NewInt(1000)}, DAGasPriceDeviationPPB: cciptypes.BigInt{Int: big.NewInt(1_000_000)}, diff --git a/deployment/go.mod b/deployment/go.mod index 7a1634a033d..0d72033e49c 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -30,7 +30,7 @@ require ( github.com/sethvargo/go-retry v0.2.4 github.com/smartcontractkit/ccip-owner-contracts v0.1.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb diff --git a/deployment/go.sum b/deployment/go.sum index a066916174f..e8571db66f3 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1134,8 +1134,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 h1:voKtyPNWsT4o/IilRbkEMsvYEWhYMpkl94mi3fDQz60= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/go.mod b/go.mod index 4a4e2f41812..70e2667a0dc 100644 --- a/go.mod +++ b/go.mod @@ -76,7 +76,7 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 diff --git a/go.sum b/go.sum index 49e1045580e..d99750cf925 100644 --- a/go.sum +++ b/go.sum @@ -1018,8 +1018,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 h1:voKtyPNWsT4o/IilRbkEMsvYEWhYMpkl94mi3fDQz60= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 6d477166e3f..899a705d0e7 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -46,7 +46,7 @@ require ( github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 89f15414c6e..f45367d862b 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1384,8 +1384,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 h1:voKtyPNWsT4o/IilRbkEMsvYEWhYMpkl94mi3fDQz60= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 3c86d062a19..052043bfe7f 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -28,7 +28,7 @@ require ( github.com/rs/zerolog v1.33.0 github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index c161a370a7b..67c6aae0077 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1369,8 +1369,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 h1:voKtyPNWsT4o/IilRbkEMsvYEWhYMpkl94mi3fDQz60= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/system-tests/lib/go.mod b/system-tests/lib/go.mod index 7a4d6e8458a..bb0dfe89443 100644 --- a/system-tests/lib/go.mod +++ b/system-tests/lib/go.mod @@ -338,7 +338,7 @@ require ( github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect diff --git a/system-tests/lib/go.sum b/system-tests/lib/go.sum index f77bce8596b..4bcb3866c1c 100644 --- a/system-tests/lib/go.sum +++ b/system-tests/lib/go.sum @@ -1122,8 +1122,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 h1:voKtyPNWsT4o/IilRbkEMsvYEWhYMpkl94mi3fDQz60= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/system-tests/tests/go.mod b/system-tests/tests/go.mod index c7d561e335d..395b0882f5d 100644 --- a/system-tests/tests/go.mod +++ b/system-tests/tests/go.mod @@ -341,7 +341,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect diff --git a/system-tests/tests/go.sum b/system-tests/tests/go.sum index c4a0b2e12fb..d2bd8b1075e 100644 --- a/system-tests/tests/go.sum +++ b/system-tests/tests/go.sum @@ -1122,8 +1122,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051 h1:RhCgqArY5iaNK8YFYfAzV3FLOHVkXkML7abVRsW7ID8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250220215921-f69bcbaa0051/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 h1:voKtyPNWsT4o/IilRbkEMsvYEWhYMpkl94mi3fDQz60= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= From bedf9410d7a44e68d659ec3eea69262d8c2c7290 Mon Sep 17 00:00:00 2001 From: Anindita Ghosh <88458927+AnieeG@users.noreply.github.com> Date: Fri, 21 Feb 2025 09:43:29 -0800 Subject: [PATCH 25/58] CCIP - Version based changesets (#16504) * versioned changesets * changes * crib * review comments --- .../ccip/changeset/deployer_group_test.go | 10 +- .../changeset/solana/cs_chain_contracts.go | 13 +- .../solana/cs_chain_contracts_test.go | 8 +- .../ccip/changeset/solana/cs_deploy_chain.go | 21 ++- .../changeset/solana/cs_deploy_chain_test.go | 25 +-- .../ccip/changeset/solana/cs_set_ocr3.go | 9 +- .../changeset/solana/cs_solana_token_test.go | 1 + .../ccip/changeset/solana/cs_token_pool.go | 21 ++- .../solana/ownership_transfer_helpers.go | 14 +- .../transfer_ccip_to_mcms_with_timelock.go | 8 +- ...ransfer_ccip_to_mcms_with_timelock_test.go | 17 +- deployment/ccip/changeset/state.go | 50 ++--- .../changeset/testhelpers/test_environment.go | 97 +++++----- .../changeset/testhelpers/test_helpers.go | 55 +++--- .../testhelpers/test_token_helpers.go | 12 +- .../testhelpers/test_usdc_helpers.go | 9 +- deployment/ccip/changeset/token_pools.go | 20 +- .../{ => v1_5_1}/cs_accept_admin_role.go | 13 +- .../{ => v1_5_1}/cs_accept_admin_role_test.go | 23 +-- .../{ => v1_5_1}/cs_configure_token_pools.go | 29 +-- .../cs_configure_token_pools_test.go | 115 ++++++------ .../{ => v1_5_1}/cs_deploy_token_pools.go | 35 ++-- .../cs_deploy_token_pools_test.go | 70 +++---- .../cs_deploy_usdc_token_pools.go | 14 +- .../cs_deploy_usdc_token_pools_test.go | 46 ++--- .../{ => v1_5_1}/cs_propose_admin_role.go | 13 +- .../cs_propose_admin_role_test.go | 44 ++--- .../changeset/{ => v1_5_1}/cs_set_pool.go | 13 +- .../{ => v1_5_1}/cs_set_pool_test.go | 37 ++-- .../cs_sync_usdc_domains_with_chains.go | 11 +- .../cs_sync_usdc_domains_with_chains_test.go | 71 +++---- .../{ => v1_5_1}/cs_transfer_admin_role.go | 13 +- .../cs_transfer_admin_role_test.go | 40 ++-- .../{ => v1_6}/accept_ownership_test.go | 2 +- .../{ => v1_6}/cs_active_candidate_test.go | 56 +++--- .../changeset/{ => v1_6}/cs_add_lane_test.go | 2 +- .../ccip/changeset/{ => v1_6}/cs_ccip_home.go | 67 +++---- .../changeset/{ => v1_6}/cs_ccip_home_test.go | 111 +++++------ .../{ => v1_6}/cs_chain_contracts.go | 173 ++++++++--------- .../{ => v1_6}/cs_chain_contracts_test.go | 177 +++++++++--------- .../changeset/{ => v1_6}/cs_deploy_chain.go | 24 +-- .../{ => v1_6}/cs_deploy_chain_test.go | 19 +- .../changeset/{ => v1_6}/cs_home_chain.go | 23 +-- .../{ => v1_6}/cs_home_chain_test.go | 29 +-- .../ccip/changeset/{ => v1_6}/cs_jobspec.go | 2 +- .../changeset/{ => v1_6}/cs_jobspec_test.go | 12 +- .../{ => v1_6}/cs_rmn_curse_uncurse.go | 15 +- .../{ => v1_6}/cs_update_rmn_config.go | 72 +++---- deployment/ccip/changeset/view.go | 1 + deployment/environment/crib/ccip_deployer.go | 151 +++++++-------- integration-tests/load/ccip/ccip_test.go | 3 +- .../load/ccip/destination_gun.go | 2 +- .../smoke/ccip/ccip_add_chain_test.go | 85 +++++---- .../smoke/ccip/ccip_batching_test.go | 2 +- .../ccip/ccip_cs_rmn_curse_uncurse_test.go | 69 +++---- .../ccip/ccip_cs_update_rmn_config_test.go | 77 ++++---- .../smoke/ccip/ccip_disable_lane_test.go | 3 +- .../smoke/ccip/ccip_fee_boosting_test.go | 19 +- .../smoke/ccip/ccip_gas_price_updates_test.go | 3 +- .../ccip/ccip_migration_to_v_1_6_test.go | 38 ++-- .../smoke/ccip/ccip_reader_test.go | 13 +- integration-tests/smoke/ccip/ccip_rmn_test.go | 29 +-- .../ccip/ccip_token_price_updates_test.go | 3 +- .../testsetups/ccip/test_helpers.go | 1 + 64 files changed, 1165 insertions(+), 1095 deletions(-) rename deployment/ccip/changeset/{ => v1_5_1}/cs_accept_admin_role.go (78%) rename deployment/ccip/changeset/{ => v1_5_1}/cs_accept_admin_role_test.go (88%) rename deployment/ccip/changeset/{ => v1_5_1}/cs_configure_token_pools.go (94%) rename deployment/ccip/changeset/{ => v1_5_1}/cs_configure_token_pools_test.go (84%) rename deployment/ccip/changeset/{ => v1_5_1}/cs_deploy_token_pools.go (89%) rename deployment/ccip/changeset/{ => v1_5_1}/cs_deploy_token_pools_test.go (82%) rename deployment/ccip/changeset/{ => v1_5_1}/cs_deploy_usdc_token_pools.go (94%) rename deployment/ccip/changeset/{ => v1_5_1}/cs_deploy_usdc_token_pools_test.go (86%) rename deployment/ccip/changeset/{ => v1_5_1}/cs_propose_admin_role.go (81%) rename deployment/ccip/changeset/{ => v1_5_1}/cs_propose_admin_role_test.go (85%) rename deployment/ccip/changeset/{ => v1_5_1}/cs_set_pool.go (78%) rename deployment/ccip/changeset/{ => v1_5_1}/cs_set_pool_test.go (83%) rename deployment/ccip/changeset/{ => v1_5_1}/cs_sync_usdc_domains_with_chains.go (94%) rename deployment/ccip/changeset/{ => v1_5_1}/cs_sync_usdc_domains_with_chains_test.go (78%) rename deployment/ccip/changeset/{ => v1_5_1}/cs_transfer_admin_role.go (79%) rename deployment/ccip/changeset/{ => v1_5_1}/cs_transfer_admin_role_test.go (83%) rename deployment/ccip/changeset/{ => v1_6}/accept_ownership_test.go (98%) rename deployment/ccip/changeset/{ => v1_6}/cs_active_candidate_test.go (82%) rename deployment/ccip/changeset/{ => v1_6}/cs_add_lane_test.go (99%) rename deployment/ccip/changeset/{ => v1_6}/cs_ccip_home.go (96%) rename deployment/ccip/changeset/{ => v1_6}/cs_ccip_home_test.go (85%) rename deployment/ccip/changeset/{ => v1_6}/cs_chain_contracts.go (94%) rename deployment/ccip/changeset/{ => v1_6}/cs_chain_contracts_test.go (87%) rename deployment/ccip/changeset/{ => v1_6}/cs_deploy_chain.go (96%) rename deployment/ccip/changeset/{ => v1_6}/cs_deploy_chain_test.go (88%) rename deployment/ccip/changeset/{ => v1_6}/cs_home_chain.go (96%) rename deployment/ccip/changeset/{ => v1_6}/cs_home_chain_test.go (89%) rename deployment/ccip/changeset/{ => v1_6}/cs_jobspec.go (99%) rename deployment/ccip/changeset/{ => v1_6}/cs_jobspec_test.go (87%) rename deployment/ccip/changeset/{ => v1_6}/cs_rmn_curse_uncurse.go (95%) rename deployment/ccip/changeset/{ => v1_6}/cs_update_rmn_config.go (91%) diff --git a/deployment/ccip/changeset/deployer_group_test.go b/deployment/ccip/changeset/deployer_group_test.go index cd58633df7c..edacadb5de1 100644 --- a/deployment/ccip/changeset/deployer_group_test.go +++ b/deployment/ccip/changeset/deployer_group_test.go @@ -360,14 +360,14 @@ func TestDeployerGroupMultipleProposalsMCMS(t *testing.T) { e, _ := testhelpers.NewMemoryEnvironment(t, testhelpers.WithNumOfChains(2)) - state, err := changeset.LoadOnchainState(e.Env) + currentState, err := changeset.LoadOnchainState(e.Env) require.NoError(t, err) - timelocksPerChain := changeset.BuildTimelockPerChain(e.Env, state) + timelocksPerChain := changeset.BuildTimelockPerChain(e.Env, currentState) contractsByChain := make(map[uint64][]common.Address) for _, chain := range e.Env.AllChainSelectors() { - contractsByChain[chain] = []common.Address{state.Chains[chain].LinkToken.Address()} + contractsByChain[chain] = []common.Address{currentState.Chains[chain].LinkToken.Address()} } _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, @@ -397,10 +397,10 @@ func TestDeployerGroupMultipleProposalsMCMS(t *testing.T) { ) require.NoError(t, err) - state, err = changeset.LoadOnchainState(e.Env) + currentState, err = changeset.LoadOnchainState(e.Env) require.NoError(t, err) - token := state.Chains[e.HomeChainSel].LinkToken + token := currentState.Chains[e.HomeChainSel].LinkToken amount, err := token.BalanceOf(nil, cfg.address) require.NoError(t, err) diff --git a/deployment/ccip/changeset/solana/cs_chain_contracts.go b/deployment/ccip/changeset/solana/cs_chain_contracts.go index cd54f7d76e0..a7978504c06 100644 --- a/deployment/ccip/changeset/solana/cs_chain_contracts.go +++ b/deployment/ccip/changeset/solana/cs_chain_contracts.go @@ -12,10 +12,11 @@ import ( solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" "github.com/smartcontractkit/chainlink/deployment" - cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" ) -var _ deployment.ChangeSet[cs.SetOCR3OffRampConfig] = SetOCR3ConfigSolana +var _ deployment.ChangeSet[v1_6.SetOCR3OffRampConfig] = SetOCR3ConfigSolana var _ deployment.ChangeSet[AddRemoteChainToSolanaConfig] = AddRemoteChainToSolana var _ deployment.ChangeSet[BillingTokenConfig] = AddBillingToken var _ deployment.ChangeSet[BillingTokenForRemoteChainConfig] = AddBillingTokenForRemoteChain @@ -44,7 +45,7 @@ func commonValidation(e deployment.Environment, selector uint64, tokenPubKey sol if !ok { return fmt.Errorf("chain selector %d not found in environment", selector) } - state, err := cs.LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return fmt.Errorf("failed to load onchain state: %w", err) } @@ -68,7 +69,7 @@ func commonValidation(e deployment.Environment, selector uint64, tokenPubKey sol return nil } -func validateRouterConfig(chain deployment.SolChain, chainState cs.SolCCIPChainState) error { +func validateRouterConfig(chain deployment.SolChain, chainState changeset.SolCCIPChainState) error { if chainState.Router.IsZero() { return fmt.Errorf("router not found in existing state, deploy the router first for chain %d", chain.Selector) } @@ -81,7 +82,7 @@ func validateRouterConfig(chain deployment.SolChain, chainState cs.SolCCIPChainS return nil } -func validateFeeQuoterConfig(chain deployment.SolChain, chainState cs.SolCCIPChainState) error { +func validateFeeQuoterConfig(chain deployment.SolChain, chainState changeset.SolCCIPChainState) error { if chainState.FeeQuoter.IsZero() { return fmt.Errorf("fee quoter not found in existing state, deploy the fee quoter first for chain %d", chain.Selector) } @@ -94,7 +95,7 @@ func validateFeeQuoterConfig(chain deployment.SolChain, chainState cs.SolCCIPCha return nil } -func validateOffRampConfig(chain deployment.SolChain, chainState cs.SolCCIPChainState) error { +func validateOffRampConfig(chain deployment.SolChain, chainState changeset.SolCCIPChainState) error { if chainState.OffRamp.IsZero() { return fmt.Errorf("offramp not found in existing state, deploy the offramp first for chain %d", chain.Selector) } diff --git a/deployment/ccip/changeset/solana/cs_chain_contracts_test.go b/deployment/ccip/changeset/solana/cs_chain_contracts_test.go index 5734604e730..a9ce0721c7a 100644 --- a/deployment/ccip/changeset/solana/cs_chain_contracts_test.go +++ b/deployment/ccip/changeset/solana/cs_chain_contracts_test.go @@ -15,9 +15,11 @@ import ( solTokenUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/tokens" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" + ccipChangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" changeset_solana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" "github.com/smartcontractkit/chainlink/deployment" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" @@ -38,9 +40,9 @@ func TestAddRemoteChain(t *testing.T) { tenv.Env, err = commonchangeset.Apply(t, tenv.Env, nil, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(ccipChangeset.UpdateOnRampsDestsChangeset), - ccipChangeset.UpdateOnRampDestsConfig{ - UpdatesByChain: map[uint64]map[uint64]ccipChangeset.OnRampDestinationUpdate{ + deployment.CreateLegacyChangeSet(v1_6.UpdateOnRampsDestsChangeset), + v1_6.UpdateOnRampDestsConfig{ + UpdatesByChain: map[uint64]map[uint64]v1_6.OnRampDestinationUpdate{ evmChain: { solChain: { IsEnabled: true, diff --git a/deployment/ccip/changeset/solana/cs_deploy_chain.go b/deployment/ccip/changeset/solana/cs_deploy_chain.go index 6badbd6aaba..c93d98ca248 100644 --- a/deployment/ccip/changeset/solana/cs_deploy_chain.go +++ b/deployment/ccip/changeset/solana/cs_deploy_chain.go @@ -9,7 +9,8 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + state2 "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" solBinary "github.com/gagliardetto/binary" solRpc "github.com/gagliardetto/solana-go/rpc" @@ -21,20 +22,20 @@ import ( solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" ) -var _ deployment.ChangeSet[changeset.DeployChainContractsConfig] = DeployChainContractsChangesetSolana +var _ deployment.ChangeSet[v1_6.DeployChainContractsConfig] = DeployChainContractsChangesetSolana -func DeployChainContractsChangesetSolana(e deployment.Environment, c changeset.DeployChainContractsConfig) (deployment.ChangesetOutput, error) { +func DeployChainContractsChangesetSolana(e deployment.Environment, c v1_6.DeployChainContractsConfig) (deployment.ChangesetOutput, error) { if err := c.Validate(); err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("invalid DeployChainContractsConfig: %w", err) } newAddresses := deployment.NewMemoryAddressBook() - existingState, err := changeset.LoadOnchainState(e) + existingState, err := state2.LoadOnchainState(e) if err != nil { e.Logger.Errorw("Failed to load existing onchain state", "err", err) return deployment.ChangesetOutput{}, err } - err = changeset.ValidateHomeChainState(e, c.HomeChainSelector, existingState) + err = v1_6.ValidateHomeChainState(e, c.HomeChainSelector, existingState) if err != nil { return deployment.ChangesetOutput{}, err } @@ -282,7 +283,7 @@ func deployChainContractsSolana( return fmt.Errorf("failed to deploy program: %w", err) } - tv := deployment.NewTypeAndVersion(changeset.FeeQuoter, deployment.Version1_0_0) + tv := deployment.NewTypeAndVersion(state2.FeeQuoter, deployment.Version1_0_0) e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", programID, "chain", chain.String()) feeQuoterAddress = solana.MustPublicKeyFromBase58(programID) @@ -305,7 +306,7 @@ func deployChainContractsSolana( return fmt.Errorf("failed to deploy program: %w", err) } - tv := deployment.NewTypeAndVersion(changeset.Router, deployment.Version1_0_0) + tv := deployment.NewTypeAndVersion(state2.Router, deployment.Version1_0_0) e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", programID, "chain", chain.String()) ccipRouterProgram = solana.MustPublicKeyFromBase58(programID) @@ -327,7 +328,7 @@ func deployChainContractsSolana( if err != nil { return fmt.Errorf("failed to deploy program: %w", err) } - tv := deployment.NewTypeAndVersion(changeset.OffRamp, deployment.Version1_0_0) + tv := deployment.NewTypeAndVersion(state2.OffRamp, deployment.Version1_0_0) e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", programID, "chain", chain.String()) offRampAddress = solana.MustPublicKeyFromBase58(programID) err = ab.Save(chain.Selector, programID, tv) @@ -437,7 +438,7 @@ type SetFeeAggregatorConfig struct { } func (cfg SetFeeAggregatorConfig) Validate(e deployment.Environment) error { - state, err := cs.LoadOnchainState(e) + state, err := state2.LoadOnchainState(e) if err != nil { return fmt.Errorf("failed to load onchain state: %w", err) } @@ -468,7 +469,7 @@ func SetFeeAggregator(e deployment.Environment, cfg SetFeeAggregatorConfig) (dep return deployment.ChangesetOutput{}, err } - state, _ := cs.LoadOnchainState(e) + state, _ := state2.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] chain := e.SolChains[cfg.ChainSelector] diff --git a/deployment/ccip/changeset/solana/cs_deploy_chain_test.go b/deployment/ccip/changeset/solana/cs_deploy_chain_test.go index 5be5006d6b4..f9068a64653 100644 --- a/deployment/ccip/changeset/solana/cs_deploy_chain_test.go +++ b/deployment/ccip/changeset/solana/cs_deploy_chain_test.go @@ -11,6 +11,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" cs_solana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/environment/memory" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -34,12 +35,12 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { nodes, err := deployment.NodeInfo(e.NodeIDs, e.Offchain) require.NoError(t, err) cfg := make(map[uint64]commontypes.MCMSWithTimelockConfigV2) - contractParams := make(map[uint64]changeset.ChainContractParams) + contractParams := make(map[uint64]v1_6.ChainContractParams) for _, chain := range e.AllChainSelectors() { cfg[chain] = proposalutils.SingleGroupTimelockConfigV2(t) - contractParams[chain] = changeset.ChainContractParams{ - FeeQuoterParams: changeset.DefaultFeeQuoterParams(), - OffRampParams: changeset.DefaultOffRampParams(), + contractParams[chain] = v1_6.ChainContractParams{ + FeeQuoterParams: v1_6.DefaultFeeQuoterParams(), + OffRampParams: v1_6.DefaultOffRampParams(), } } prereqCfg := make([]changeset.DeployPrerequisiteConfigPerChain, 0) @@ -55,8 +56,8 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { testhelpers.SavePreloadedSolAddresses(t, e, solChainSelectors[0]) e, err = commonchangeset.Apply(t, e, nil, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployHomeChainChangeset), - changeset.DeployHomeChainConfig{ + deployment.CreateLegacyChangeSet(v1_6.DeployHomeChainChangeset), + v1_6.DeployHomeChainConfig{ HomeChainSel: homeChainSel, RMNStaticConfig: testhelpers.NewTestRMNStaticConfig(), RMNDynamicConfig: testhelpers.NewTestRMNDynamicConfig(), @@ -86,20 +87,20 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployChainContractsChangeset), - changeset.DeployChainContractsConfig{ + deployment.CreateLegacyChangeSet(v1_6.DeployChainContractsChangeset), + v1_6.DeployChainContractsConfig{ HomeChainSelector: homeChainSel, ContractParamsPerChain: contractParams, }, ), commonchangeset.Configure( deployment.CreateLegacyChangeSet(cs_solana.DeployChainContractsChangesetSolana), - changeset.DeployChainContractsConfig{ + v1_6.DeployChainContractsConfig{ HomeChainSelector: homeChainSel, - ContractParamsPerChain: map[uint64]changeset.ChainContractParams{ + ContractParamsPerChain: map[uint64]v1_6.ChainContractParams{ solChainSelectors[0]: { - FeeQuoterParams: changeset.DefaultFeeQuoterParams(), - OffRampParams: changeset.DefaultOffRampParams(), + FeeQuoterParams: v1_6.DefaultFeeQuoterParams(), + OffRampParams: v1_6.DefaultOffRampParams(), }, }, }, diff --git a/deployment/ccip/changeset/solana/cs_set_ocr3.go b/deployment/ccip/changeset/solana/cs_set_ocr3.go index 1dd2145b920..2c71cb28fc8 100644 --- a/deployment/ccip/changeset/solana/cs_set_ocr3.go +++ b/deployment/ccip/changeset/solana/cs_set_ocr3.go @@ -9,8 +9,9 @@ import ( solOffRamp "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" "github.com/smartcontractkit/chainlink/deployment" - cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" ) const ( @@ -32,8 +33,8 @@ func btoi(b bool) uint8 { // run after the candidate is confirmed to be working correctly. // Multichain is especially helpful for NOP rotations where we have // to touch all the chain to change signers. -func SetOCR3ConfigSolana(e deployment.Environment, cfg cs.SetOCR3OffRampConfig) (deployment.ChangesetOutput, error) { - state, err := cs.LoadOnchainState(e) +func SetOCR3ConfigSolana(e deployment.Environment, cfg v1_6.SetOCR3OffRampConfig) (deployment.ChangesetOutput, error) { + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } @@ -105,7 +106,7 @@ func SetOCR3ConfigSolana(e deployment.Environment, cfg cs.SetOCR3OffRampConfig) func isOCR3ConfigSetOnOffRampSolana( e deployment.Environment, chain deployment.SolChain, - chainState cs.SolCCIPChainState, + chainState changeset.SolCCIPChainState, args []internal.MultiOCR3BaseOCRConfigArgsSolana, ) (bool, error) { var configAccount solOffRamp.Config diff --git a/deployment/ccip/changeset/solana/cs_solana_token_test.go b/deployment/ccip/changeset/solana/cs_solana_token_test.go index c46e7eae7ad..d50eee74360 100644 --- a/deployment/ccip/changeset/solana/cs_solana_token_test.go +++ b/deployment/ccip/changeset/solana/cs_solana_token_test.go @@ -10,6 +10,7 @@ import ( "go.uber.org/zap/zapcore" solTokenUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/tokens" + "github.com/smartcontractkit/chainlink/deployment" ccipChangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" changeset_solana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" diff --git a/deployment/ccip/changeset/solana/cs_token_pool.go b/deployment/ccip/changeset/solana/cs_token_pool.go index 5e6315eba18..cdf61704cf9 100644 --- a/deployment/ccip/changeset/solana/cs_token_pool.go +++ b/deployment/ccip/changeset/solana/cs_token_pool.go @@ -13,7 +13,8 @@ import ( solTokenUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/tokens" "github.com/smartcontractkit/chainlink/deployment" - cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + state2 "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" ) var _ deployment.ChangeSet[TokenPoolConfig] = AddTokenPool @@ -32,7 +33,7 @@ func (cfg TokenPoolConfig) Validate(e deployment.Environment) error { if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { return err } - state, _ := cs.LoadOnchainState(e) + state, _ := state2.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] if chainState.TokenPool.IsZero() { return fmt.Errorf("token pool not found in existing state, deploy the token pool first for chain %d", cfg.ChainSelector) @@ -59,7 +60,7 @@ func AddTokenPool(e deployment.Environment, cfg TokenPoolConfig) (deployment.Cha return deployment.ChangesetOutput{}, err } chain := e.SolChains[cfg.ChainSelector] - state, _ := cs.LoadOnchainState(e) + state, _ := state2.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] authorityPubKey := solana.MustPublicKeyFromBase58(cfg.Authority) tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) @@ -136,7 +137,7 @@ func (cfg RemoteChainTokenPoolConfig) Validate(e deployment.Environment) error { if err := commonValidation(e, cfg.SolChainSelector, tokenPubKey); err != nil { return err } - state, _ := cs.LoadOnchainState(e) + state, _ := state2.LoadOnchainState(e) chainState := state.SolChains[cfg.SolChainSelector] if chainState.TokenPool.IsZero() { return fmt.Errorf("token pool not found in existing state, deploy token pool for chain %d", cfg.SolChainSelector) @@ -173,7 +174,7 @@ func SetupTokenPoolForRemoteChain(e deployment.Environment, cfg RemoteChainToken } tokenPubKey := solana.MustPublicKeyFromBase58(cfg.SolTokenPubKey) chain := e.SolChains[cfg.SolChainSelector] - state, _ := cs.LoadOnchainState(e) + state, _ := state2.LoadOnchainState(e) chainState := state.SolChains[cfg.SolChainSelector] // verified poolConfigPDA, _ := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, chainState.TokenPool) @@ -240,7 +241,7 @@ func (cfg TokenPoolLookupTableConfig) Validate(e deployment.Environment) error { if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { return err } - state, _ := cs.LoadOnchainState(e) + state, _ := state2.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] if chainState.TokenPool.IsZero() { return fmt.Errorf("token pool not found in existing state, deploy the token pool first for chain %d", cfg.ChainSelector) @@ -256,7 +257,7 @@ func AddTokenPoolLookupTable(e deployment.Environment, cfg TokenPoolLookupTableC chain := e.SolChains[cfg.ChainSelector] ctx := e.GetContext() client := chain.Client - state, _ := cs.LoadOnchainState(e) + state, _ := state2.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] authorityPrivKey := chain.DeployerKey // assuming the authority is the deployer key tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) @@ -293,7 +294,7 @@ func AddTokenPoolLookupTable(e deployment.Environment, cfg TokenPoolLookupTableC return deployment.ChangesetOutput{}, fmt.Errorf("failed to await slot change while extending lookup table: %w", err) } newAddressBook := deployment.NewMemoryAddressBook() - tv := deployment.NewTypeAndVersion(cs.TokenPoolLookupTable, deployment.Version1_0_0) + tv := deployment.NewTypeAndVersion(changeset.TokenPoolLookupTable, deployment.Version1_0_0) tv.Labels.Add(tokenPubKey.String()) if err := newAddressBook.Save(cfg.ChainSelector, table.String(), tv); err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to save tokenpool address lookup table: %w", err) @@ -317,7 +318,7 @@ func (cfg SetPoolConfig) Validate(e deployment.Environment) error { if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { return err } - state, _ := cs.LoadOnchainState(e) + state, _ := state2.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] chain := e.SolChains[cfg.ChainSelector] if chainState.TokenPool.IsZero() { @@ -344,7 +345,7 @@ func SetPool(e deployment.Environment, cfg SetPoolConfig) (deployment.ChangesetO } chain := e.SolChains[cfg.ChainSelector] - state, _ := cs.LoadOnchainState(e) + state, _ := state2.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) routerConfigPDA, _, _ := solState.FindConfigPDA(chainState.Router) diff --git a/deployment/ccip/changeset/solana/ownership_transfer_helpers.go b/deployment/ccip/changeset/solana/ownership_transfer_helpers.go index 07b7c2a5dbe..094c3d3bc75 100644 --- a/deployment/ccip/changeset/solana/ownership_transfer_helpers.go +++ b/deployment/ccip/changeset/solana/ownership_transfer_helpers.go @@ -13,7 +13,7 @@ import ( "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + state2 "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" ) @@ -83,7 +83,7 @@ func transferAndWrapAcceptOwnership( // transferOwnershipRouter transfers ownership of the router to the timelock. func transferOwnershipRouter( - ccipState changeset.CCIPOnChainState, + ccipState state2.CCIPOnChainState, chainSelector uint64, solChain deployment.SolChain, timelockProgramID solana.PublicKey, @@ -130,7 +130,7 @@ func transferOwnershipRouter( routerConfigPDA, // config PDA solChain.DeployerKey.PublicKey(), solChain, - changeset.Router, + state2.Router, ) if err != nil { @@ -143,7 +143,7 @@ func transferOwnershipRouter( // transferOwnershipFeeQuoter transfers ownership of the fee quoter to the timelock. func transferOwnershipFeeQuoter( - ccipState changeset.CCIPOnChainState, + ccipState state2.CCIPOnChainState, chainSelector uint64, solChain deployment.SolChain, timelockProgramID solana.PublicKey, @@ -190,7 +190,7 @@ func transferOwnershipFeeQuoter( feeQuoterConfigPDA, // config PDA solChain.DeployerKey.PublicKey(), solChain, - changeset.FeeQuoter, + state2.FeeQuoter, ) if err != nil { @@ -203,7 +203,7 @@ func transferOwnershipFeeQuoter( // transferOwnershipOffRamp transfers ownership of the offRamp to the timelock. func transferOwnershipOffRamp( - ccipState changeset.CCIPOnChainState, + ccipState state2.CCIPOnChainState, chainSelector uint64, solChain deployment.SolChain, timelockProgramID solana.PublicKey, @@ -250,7 +250,7 @@ func transferOwnershipOffRamp( offRampConfigPDA, // config PDA solChain.DeployerKey.PublicKey(), solChain, - changeset.OffRamp, + state2.OffRamp, ) if err != nil { diff --git a/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock.go b/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock.go index 25fc6e9c90b..6a71f10f8c8 100644 --- a/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock.go +++ b/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock.go @@ -13,7 +13,7 @@ import ( mcmsTypes "github.com/smartcontractkit/mcms/types" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + state2 "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/common/types" @@ -37,7 +37,7 @@ type TransferCCIPToMCMSWithTimelockSolanaConfig struct { } // ValidateContracts checks if the required contracts are present on the chain -func ValidateContracts(state changeset.SolCCIPChainState, chainSelector uint64, contracts CCIPContractsToTransfer) error { +func ValidateContracts(state state2.SolCCIPChainState, chainSelector uint64, contracts CCIPContractsToTransfer) error { contractChecks := []struct { enabled bool value solana.PublicKey @@ -58,7 +58,7 @@ func ValidateContracts(state changeset.SolCCIPChainState, chainSelector uint64, } func (cfg TransferCCIPToMCMSWithTimelockSolanaConfig) Validate(e deployment.Environment) error { - ccipState, err := changeset.LoadOnchainStateSolana(e) + ccipState, err := state2.LoadOnchainStateSolana(e) if err != nil { return fmt.Errorf("failed to load onchain state: %w", err) } @@ -131,7 +131,7 @@ func TransferCCIPToMCMSWithTimelockSolana( } var batches []mcmsTypes.BatchOperation - ccipState, err := changeset.LoadOnchainStateSolana(e) + ccipState, err := state2.LoadOnchainStateSolana(e) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } diff --git a/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock_test.go b/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock_test.go index d1deb8b6ada..3b17643bbad 100644 --- a/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock_test.go +++ b/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock_test.go @@ -18,10 +18,11 @@ import ( "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/test_token_pool" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" solanachangesets "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" @@ -202,11 +203,11 @@ func prepareEnvironmentForOwnershipTransfer(t *testing.T) (deployment.Environmen // Fund account for fees testutils.FundAccounts(e.GetContext(), []solana.PrivateKey{*solChain.DeployerKey}, solChain.Client, t) cfg := make(map[uint64]commontypes.MCMSWithTimelockConfig) - contractParams := make(map[uint64]changeset.ChainContractParams) + contractParams := make(map[uint64]v1_6.ChainContractParams) for _, chain := range solChainSelectors { - contractParams[chain] = changeset.ChainContractParams{ - FeeQuoterParams: changeset.DefaultFeeQuoterParams(), - OffRampParams: changeset.DefaultOffRampParams(), + contractParams[chain] = v1_6.ChainContractParams{ + FeeQuoterParams: v1_6.DefaultFeeQuoterParams(), + OffRampParams: v1_6.DefaultOffRampParams(), } } prereqCfg := make([]changeset.DeployPrerequisiteConfigPerChain, 0) @@ -218,8 +219,8 @@ func prepareEnvironmentForOwnershipTransfer(t *testing.T) (deployment.Environmen testhelpers.SavePreloadedSolAddresses(t, e, solChainSelectors[0]) e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ConfiguredChangeSet{ commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployHomeChainChangeset), - changeset.DeployHomeChainConfig{ + deployment.CreateLegacyChangeSet(v1_6.DeployHomeChainChangeset), + v1_6.DeployHomeChainConfig{ HomeChainSel: homeChainSel, RMNStaticConfig: testhelpers.NewTestRMNStaticConfig(), RMNDynamicConfig: testhelpers.NewTestRMNDynamicConfig(), @@ -245,7 +246,7 @@ func prepareEnvironmentForOwnershipTransfer(t *testing.T) (deployment.Environmen ), commonchangeset.Configure( deployment.CreateLegacyChangeSet(solanachangesets.DeployChainContractsChangesetSolana), - changeset.DeployChainContractsConfig{ + v1_6.DeployChainContractsConfig{ HomeChainSelector: homeChainSel, ContractParamsPerChain: contractParams, }, diff --git a/deployment/ccip/changeset/state.go b/deployment/ccip/changeset/state.go index f11cd4434ae..d813fb97d74 100644 --- a/deployment/ccip/changeset/state.go +++ b/deployment/ccip/changeset/state.go @@ -37,11 +37,11 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/view" - "github.com/smartcontractkit/chainlink/deployment/ccip/view/v1_0" + viewv1_0 "github.com/smartcontractkit/chainlink/deployment/ccip/view/v1_0" "github.com/smartcontractkit/chainlink/deployment/ccip/view/v1_2" - "github.com/smartcontractkit/chainlink/deployment/ccip/view/v1_5" - "github.com/smartcontractkit/chainlink/deployment/ccip/view/v1_5_1" - "github.com/smartcontractkit/chainlink/deployment/ccip/view/v1_6" + viewv1_5 "github.com/smartcontractkit/chainlink/deployment/ccip/view/v1_5" + viewv1_5_1 "github.com/smartcontractkit/chainlink/deployment/ccip/view/v1_5_1" + viewv1_6 "github.com/smartcontractkit/chainlink/deployment/ccip/view/v1_6" commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" common_v1_0 "github.com/smartcontractkit/chainlink/deployment/common/view/v1_0" @@ -247,7 +247,7 @@ func (c CCIPChainState) GenerateView() (view.ChainView, error) { chainView.Router[c.Router.Address().Hex()] = routerView } if c.TokenAdminRegistry != nil { - taView, err := v1_5.GenerateTokenAdminRegistryView(c.TokenAdminRegistry) + taView, err := viewv1_5.GenerateTokenAdminRegistryView(c.TokenAdminRegistry) if err != nil { return chainView, errors.Wrapf(err, "failed to generate token admin registry view for token admin registry %s", c.TokenAdminRegistry.Address().String()) } @@ -255,7 +255,7 @@ func (c CCIPChainState) GenerateView() (view.ChainView, error) { } for tokenSymbol, versionToPool := range c.BurnMintTokenPools { for _, tokenPool := range versionToPool { - tokenPoolView, err := v1_5_1.GenerateTokenPoolView(tokenPool) + tokenPoolView, err := viewv1_5_1.GenerateTokenPoolView(tokenPool) if err != nil { return chainView, errors.Wrapf(err, "failed to generate burn mint token pool view for %s", tokenPool.Address().String()) } @@ -264,7 +264,7 @@ func (c CCIPChainState) GenerateView() (view.ChainView, error) { } for tokenSymbol, versionToPool := range c.BurnWithFromMintTokenPools { for _, tokenPool := range versionToPool { - tokenPoolView, err := v1_5_1.GenerateTokenPoolView(tokenPool) + tokenPoolView, err := viewv1_5_1.GenerateTokenPoolView(tokenPool) if err != nil { return chainView, errors.Wrapf(err, "failed to generate burn mint token pool view for %s", tokenPool.Address().String()) } @@ -273,7 +273,7 @@ func (c CCIPChainState) GenerateView() (view.ChainView, error) { } for tokenSymbol, versionToPool := range c.BurnFromMintTokenPools { for _, tokenPool := range versionToPool { - tokenPoolView, err := v1_5_1.GenerateTokenPoolView(tokenPool) + tokenPoolView, err := viewv1_5_1.GenerateTokenPoolView(tokenPool) if err != nil { return chainView, errors.Wrapf(err, "failed to generate burn mint token pool view for %s", tokenPool.Address().String()) } @@ -282,7 +282,7 @@ func (c CCIPChainState) GenerateView() (view.ChainView, error) { } for tokenSymbol, versionToPool := range c.LockReleaseTokenPools { for _, tokenPool := range versionToPool { - tokenPoolView, err := v1_5_1.GenerateLockReleaseTokenPoolView(tokenPool) + tokenPoolView, err := viewv1_5_1.GenerateLockReleaseTokenPoolView(tokenPool) if err != nil { return chainView, errors.Wrapf(err, "failed to generate lock release token pool view for %s", tokenPool.Address().String()) } @@ -290,14 +290,14 @@ func (c CCIPChainState) GenerateView() (view.ChainView, error) { } } if c.NonceManager != nil { - nmView, err := v1_6.GenerateNonceManagerView(c.NonceManager) + nmView, err := viewv1_6.GenerateNonceManagerView(c.NonceManager) if err != nil { return chainView, errors.Wrapf(err, "failed to generate nonce manager view for nonce manager %s", c.NonceManager.Address().String()) } chainView.NonceManager[c.NonceManager.Address().Hex()] = nmView } if c.RMNRemote != nil { - rmnView, err := v1_6.GenerateRMNRemoteView(c.RMNRemote) + rmnView, err := viewv1_6.GenerateRMNRemoteView(c.RMNRemote) if err != nil { return chainView, errors.Wrapf(err, "failed to generate rmn remote view for rmn remote %s", c.RMNRemote.Address().String()) } @@ -305,7 +305,7 @@ func (c CCIPChainState) GenerateView() (view.ChainView, error) { } if c.RMNHome != nil { - rmnHomeView, err := v1_6.GenerateRMNHomeView(c.RMNHome) + rmnHomeView, err := viewv1_6.GenerateRMNHomeView(c.RMNHome) if err != nil { return chainView, errors.Wrapf(err, "failed to generate rmn home view for rmn home %s", c.RMNHome.Address().String()) } @@ -313,7 +313,7 @@ func (c CCIPChainState) GenerateView() (view.ChainView, error) { } if c.FeeQuoter != nil && c.Router != nil && c.TokenAdminRegistry != nil { - fqView, err := v1_6.GenerateFeeQuoterView(c.FeeQuoter, c.Router, c.TokenAdminRegistry) + fqView, err := viewv1_6.GenerateFeeQuoterView(c.FeeQuoter, c.Router, c.TokenAdminRegistry) if err != nil { return chainView, errors.Wrapf(err, "failed to generate fee quoter view for fee quoter %s", c.FeeQuoter.Address().String()) } @@ -321,7 +321,7 @@ func (c CCIPChainState) GenerateView() (view.ChainView, error) { } if c.OnRamp != nil && c.Router != nil && c.TokenAdminRegistry != nil { - onRampView, err := v1_6.GenerateOnRampView( + onRampView, err := viewv1_6.GenerateOnRampView( c.OnRamp, c.Router, c.TokenAdminRegistry, @@ -333,7 +333,7 @@ func (c CCIPChainState) GenerateView() (view.ChainView, error) { } if c.OffRamp != nil && c.Router != nil { - offRampView, err := v1_6.GenerateOffRampView( + offRampView, err := viewv1_6.GenerateOffRampView( c.OffRamp, c.Router, ) @@ -344,14 +344,14 @@ func (c CCIPChainState) GenerateView() (view.ChainView, error) { } if c.RMNProxy != nil { - rmnProxyView, err := v1_0.GenerateRMNProxyView(c.RMNProxy) + rmnProxyView, err := viewv1_0.GenerateRMNProxyView(c.RMNProxy) if err != nil { return chainView, errors.Wrapf(err, "failed to generate rmn proxy view for rmn proxy %s", c.RMNProxy.Address().String()) } chainView.RMNProxy[c.RMNProxy.Address().Hex()] = rmnProxyView } if c.CCIPHome != nil && c.CapabilityRegistry != nil { - chView, err := v1_6.GenerateCCIPHomeView(c.CapabilityRegistry, c.CCIPHome) + chView, err := viewv1_6.GenerateCCIPHomeView(c.CapabilityRegistry, c.CCIPHome) if err != nil { return chainView, errors.Wrapf(err, "failed to generate CCIP home view for CCIP home %s", c.CCIPHome.Address()) } @@ -388,7 +388,7 @@ func (c CCIPChainState) GenerateView() (view.ChainView, error) { // Legacy contracts if c.CommitStore != nil { for source, commitStore := range c.CommitStore { - commitStoreView, err := v1_5.GenerateCommitStoreView(commitStore) + commitStoreView, err := viewv1_5.GenerateCommitStoreView(commitStore) if err != nil { return chainView, errors.Wrapf(err, "failed to generate commit store view for commit store %s for source %d", commitStore.Address().String(), source) } @@ -405,7 +405,7 @@ func (c CCIPChainState) GenerateView() (view.ChainView, error) { } if c.RMN != nil { - rmnView, err := v1_5.GenerateRMNView(c.RMN) + rmnView, err := viewv1_5.GenerateRMNView(c.RMN) if err != nil { return chainView, errors.Wrapf(err, "failed to generate rmn view for rmn %s", c.RMN.Address().String()) } @@ -414,7 +414,7 @@ func (c CCIPChainState) GenerateView() (view.ChainView, error) { if c.EVM2EVMOffRamp != nil { for source, offRamp := range c.EVM2EVMOffRamp { - offRampView, err := v1_5.GenerateOffRampView(offRamp) + offRampView, err := viewv1_5.GenerateOffRampView(offRamp) if err != nil { return chainView, errors.Wrapf(err, "failed to generate off ramp view for off ramp %s for source %d", offRamp.Address().String(), source) } @@ -424,7 +424,7 @@ func (c CCIPChainState) GenerateView() (view.ChainView, error) { if c.EVM2EVMOnRamp != nil { for dest, onRamp := range c.EVM2EVMOnRamp { - onRampView, err := v1_5.GenerateOnRampView(onRamp) + onRampView, err := viewv1_5.GenerateOnRampView(onRamp) if err != nil { return chainView, errors.Wrapf(err, "failed to generate on ramp view for on ramp %s for dest %d", onRamp.Address().String(), dest) } @@ -858,28 +858,28 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s state.USDFeeds[key] = feed case deployment.NewTypeAndVersion(BurnMintTokenPool, deployment.Version1_5_1).String(): ethAddress := common.HexToAddress(address) - pool, metadata, err := newTokenPoolWithMetadata(ctx, burn_mint_token_pool.NewBurnMintTokenPool, ethAddress, chain.Client) + pool, metadata, err := NewTokenPoolWithMetadata(ctx, burn_mint_token_pool.NewBurnMintTokenPool, ethAddress, chain.Client) if err != nil { return state, fmt.Errorf("failed to connect address %s with token pool bindings and get token symbol: %w", ethAddress, err) } state.BurnMintTokenPools = helpers.AddValueToNestedMap(state.BurnMintTokenPools, metadata.Symbol, metadata.Version, pool) case deployment.NewTypeAndVersion(BurnWithFromMintTokenPool, deployment.Version1_5_1).String(): ethAddress := common.HexToAddress(address) - pool, metadata, err := newTokenPoolWithMetadata(ctx, burn_with_from_mint_token_pool.NewBurnWithFromMintTokenPool, ethAddress, chain.Client) + pool, metadata, err := NewTokenPoolWithMetadata(ctx, burn_with_from_mint_token_pool.NewBurnWithFromMintTokenPool, ethAddress, chain.Client) if err != nil { return state, fmt.Errorf("failed to connect address %s with token pool bindings and get token symbol: %w", ethAddress, err) } state.BurnWithFromMintTokenPools = helpers.AddValueToNestedMap(state.BurnWithFromMintTokenPools, metadata.Symbol, metadata.Version, pool) case deployment.NewTypeAndVersion(BurnFromMintTokenPool, deployment.Version1_5_1).String(): ethAddress := common.HexToAddress(address) - pool, metadata, err := newTokenPoolWithMetadata(ctx, burn_from_mint_token_pool.NewBurnFromMintTokenPool, ethAddress, chain.Client) + pool, metadata, err := NewTokenPoolWithMetadata(ctx, burn_from_mint_token_pool.NewBurnFromMintTokenPool, ethAddress, chain.Client) if err != nil { return state, fmt.Errorf("failed to connect address %s with token pool bindings and get token symbol: %w", ethAddress, err) } state.BurnFromMintTokenPools = helpers.AddValueToNestedMap(state.BurnFromMintTokenPools, metadata.Symbol, metadata.Version, pool) case deployment.NewTypeAndVersion(LockReleaseTokenPool, deployment.Version1_5_1).String(): ethAddress := common.HexToAddress(address) - pool, metadata, err := newTokenPoolWithMetadata(ctx, lock_release_token_pool.NewLockReleaseTokenPool, ethAddress, chain.Client) + pool, metadata, err := NewTokenPoolWithMetadata(ctx, lock_release_token_pool.NewLockReleaseTokenPool, ethAddress, chain.Client) if err != nil { return state, fmt.Errorf("failed to connect address %s with token pool bindings and get token symbol: %w", ethAddress, err) } diff --git a/deployment/ccip/changeset/testhelpers/test_environment.go b/deployment/ccip/changeset/testhelpers/test_environment.go index 2bcc8d3ddb4..5779cbecf5a 100644 --- a/deployment/ccip/changeset/testhelpers/test_environment.go +++ b/deployment/ccip/changeset/testhelpers/test_environment.go @@ -17,6 +17,7 @@ import ( "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" @@ -60,7 +61,7 @@ type TestConfigs struct { IsUSDCAttestationMissing bool IsMultiCall3 bool IsStaticLink bool - OCRConfigOverride func(*changeset.CCIPOCRParams) + OCRConfigOverride func(*v1_6.CCIPOCRParams) RMNEnabled bool NumOfRMNNodes int LinkPrice *big.Int @@ -171,7 +172,7 @@ func WithRMNEnabled(numOfNode int) TestOps { } } -func WithOCRConfigOverride(override func(*changeset.CCIPOCRParams)) TestOps { +func WithOCRConfigOverride(override func(*v1_6.CCIPOCRParams)) TestOps { return func(testCfg *TestConfigs) { testCfg.OCRConfigOverride = override } @@ -252,7 +253,7 @@ func (d *DeployedEnv) TimelockContracts(t *testing.T) map[uint64]*proposalutils. } func (d *DeployedEnv) SetupJobs(t *testing.T) { - out, err := changeset.CCIPCapabilityJobspecChangeset(d.Env, struct{}{}) + out, err := v1_6.CCIPCapabilityJobspecChangeset(d.Env, struct{}{}) require.NoError(t, err) require.NotEmpty(t, out.Jobs) for _, job := range out.Jobs { @@ -505,8 +506,8 @@ func NewEnvironmentWithJobsAndContracts(t *testing.T, tEnv TestEnvironment) Depl // now we update RMNProxy to point to RMNRemote e.Env, err = commonchangeset.Apply(t, e.Env, nil, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.SetRMNRemoteOnRMNProxyChangeset), - changeset.SetRMNRemoteOnRMNProxyConfig{ + deployment.CreateLegacyChangeSet(v1_6.SetRMNRemoteOnRMNProxyChangeset), + v1_6.SetRMNRemoteOnRMNProxyConfig{ ChainSelectors: evmChains, }, ), @@ -524,8 +525,8 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn // Need to deploy prerequisites first so that we can form the USDC config // no proposals to be made, timelock can be passed as nil here var apps []commonchangeset.ConfiguredChangeSet - evmContractParams := make(map[uint64]changeset.ChainContractParams) - solContractParams := make(map[uint64]changeset.ChainContractParams) + evmContractParams := make(map[uint64]v1_6.ChainContractParams) + solContractParams := make(map[uint64]v1_6.ChainContractParams) evmChains := []uint64{} for _, chain := range allChains { if _, ok := e.Env.Chains[chain]; ok { @@ -541,23 +542,23 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn } for _, chain := range evmChains { - evmContractParams[chain] = changeset.ChainContractParams{ - FeeQuoterParams: changeset.DefaultFeeQuoterParams(), - OffRampParams: changeset.DefaultOffRampParams(), + evmContractParams[chain] = v1_6.ChainContractParams{ + FeeQuoterParams: v1_6.DefaultFeeQuoterParams(), + OffRampParams: v1_6.DefaultOffRampParams(), } } for _, chain := range solChains { - solContractParams[chain] = changeset.ChainContractParams{ - FeeQuoterParams: changeset.DefaultFeeQuoterParams(), - OffRampParams: changeset.DefaultOffRampParams(), + solContractParams[chain] = v1_6.ChainContractParams{ + FeeQuoterParams: v1_6.DefaultFeeQuoterParams(), + OffRampParams: v1_6.DefaultOffRampParams(), } } apps = append(apps, []commonchangeset.ConfiguredChangeSet{ commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployHomeChainChangeset), - changeset.DeployHomeChainConfig{ + deployment.CreateLegacyChangeSet(v1_6.DeployHomeChainChangeset), + v1_6.DeployHomeChainConfig{ HomeChainSel: e.HomeChainSel, RMNDynamicConfig: NewTestRMNDynamicConfig(), RMNStaticConfig: NewTestRMNStaticConfig(), @@ -568,15 +569,15 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployChainContractsChangeset), - changeset.DeployChainContractsConfig{ + deployment.CreateLegacyChangeSet(v1_6.DeployChainContractsChangeset), + v1_6.DeployChainContractsConfig{ HomeChainSelector: e.HomeChainSel, ContractParamsPerChain: evmContractParams, }, ), commonchangeset.Configure( deployment.CreateLegacyChangeSet(solana.DeployChainContractsChangesetSolana), - changeset.DeployChainContractsConfig{ + v1_6.DeployChainContractsConfig{ HomeChainSelector: e.HomeChainSel, ContractParamsPerChain: solContractParams, }, @@ -628,8 +629,8 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn nodeInfo, err := deployment.NodeInfo(e.Env.NodeIDs, e.Env.Offchain) require.NoError(t, err) // Build the per chain config. - chainConfigs := make(map[uint64]changeset.ChainConfig) - ocrConfigs := make(map[uint64]changeset.CCIPOCRParams) + chainConfigs := make(map[uint64]v1_6.ChainConfig) + ocrConfigs := make(map[uint64]v1_6.CCIPOCRParams) for _, chain := range evmChains { timelockContractsPerChain[chain] = &proposalutils.TimelockExecutionContracts{ Timelock: state.Chains[chain].Timelock, @@ -644,20 +645,20 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn tokenInfo := tokenConfig.GetTokenInfo(e.Env.Logger, linkTokenAddr, state.Chains[chain].Weth9.Address()) ocrOverride := tc.OCRConfigOverride if tc.RMNEnabled { - ocrOverride = func(ocrParams *changeset.CCIPOCRParams) { + ocrOverride = func(ocrParams *v1_6.CCIPOCRParams) { if tc.OCRConfigOverride != nil { tc.OCRConfigOverride(ocrParams) } ocrParams.CommitOffChainConfig.RMNEnabled = true } } - ocrParams := changeset.DeriveCCIPOCRParams( - changeset.WithDefaultCommitOffChainConfig(e.FeedChainSel, tokenInfo), - changeset.WithDefaultExecuteOffChainConfig(tokenDataProviders), - changeset.WithOCRParamOverride(ocrOverride), + ocrParams := v1_6.DeriveCCIPOCRParams( + v1_6.WithDefaultCommitOffChainConfig(e.FeedChainSel, tokenInfo), + v1_6.WithDefaultExecuteOffChainConfig(tokenDataProviders), + v1_6.WithOCRParamOverride(ocrOverride), ) ocrConfigs[chain] = ocrParams - chainConfigs[chain] = changeset.ChainConfig{ + chainConfigs[chain] = v1_6.ChainConfig{ Readers: nodeInfo.NonBootstraps().PeerIDs(), FChain: uint8(len(nodeInfo.NonBootstraps().PeerIDs()) / 3), EncodableChainConfig: chainconfig.ChainConfig{ @@ -670,14 +671,14 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn for _, chain := range solChains { ocrOverride := tc.OCRConfigOverride - ocrParams := changeset.DeriveCCIPOCRParams( + ocrParams := v1_6.DeriveCCIPOCRParams( // TODO: tokenInfo is nil for solana - changeset.WithDefaultCommitOffChainConfig(e.FeedChainSel, nil), - changeset.WithDefaultExecuteOffChainConfig(tokenDataProviders), - changeset.WithOCRParamOverride(ocrOverride), + v1_6.WithDefaultCommitOffChainConfig(e.FeedChainSel, nil), + v1_6.WithDefaultExecuteOffChainConfig(tokenDataProviders), + v1_6.WithOCRParamOverride(ocrOverride), ) ocrConfigs[chain] = ocrParams - chainConfigs[chain] = changeset.ChainConfig{ + chainConfigs[chain] = v1_6.ChainConfig{ Readers: nodeInfo.NonBootstraps().PeerIDs(), // #nosec G115 - Overflow is not a concern in this test scenario FChain: uint8(len(nodeInfo.NonBootstraps().PeerIDs()) / 3), @@ -699,8 +700,8 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn apps = []commonchangeset.ConfiguredChangeSet{ commonchangeset.Configure( // Add the chain configs for the new chains. - deployment.CreateLegacyChangeSet(changeset.UpdateChainConfigChangeset), - changeset.UpdateChainConfigConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateChainConfigChangeset), + v1_6.UpdateChainConfigConfig{ HomeChainSelector: e.HomeChainSel, RemoteChainAdds: chainConfigs, MCMS: mcmsConfig, @@ -708,15 +709,15 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn ), commonchangeset.Configure( // Add the DONs and candidate commit OCR instances for the chain. - deployment.CreateLegacyChangeSet(changeset.AddDonAndSetCandidateChangeset), - changeset.AddDonAndSetCandidateChangesetConfig{ - SetCandidateConfigBase: changeset.SetCandidateConfigBase{ + deployment.CreateLegacyChangeSet(v1_6.AddDonAndSetCandidateChangeset), + v1_6.AddDonAndSetCandidateChangesetConfig{ + SetCandidateConfigBase: v1_6.SetCandidateConfigBase{ HomeChainSelector: e.HomeChainSel, // TODO: we dont know what this means for solana FeedChainSelector: e.FeedChainSel, MCMS: mcmsConfig, }, - PluginInfo: changeset.SetCandidatePluginInfo{ + PluginInfo: v1_6.SetCandidatePluginInfo{ OCRConfigPerRemoteChainSelector: ocrConfigs, PluginType: types.PluginTypeCCIPCommit, }, @@ -724,15 +725,15 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn ), commonchangeset.Configure( // Add the exec OCR instances for the new chains. - deployment.CreateLegacyChangeSet(changeset.SetCandidateChangeset), - changeset.SetCandidateChangesetConfig{ - SetCandidateConfigBase: changeset.SetCandidateConfigBase{ + deployment.CreateLegacyChangeSet(v1_6.SetCandidateChangeset), + v1_6.SetCandidateChangesetConfig{ + SetCandidateConfigBase: v1_6.SetCandidateConfigBase{ HomeChainSelector: e.HomeChainSel, // TODO: we dont know what this means for solana FeedChainSelector: e.FeedChainSel, MCMS: mcmsConfig, }, - PluginInfo: []changeset.SetCandidatePluginInfo{ + PluginInfo: []v1_6.SetCandidatePluginInfo{ { OCRConfigPerRemoteChainSelector: ocrConfigs, PluginType: types.PluginTypeCCIPExec, @@ -742,10 +743,10 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn ), commonchangeset.Configure( // Promote everything - deployment.CreateLegacyChangeSet(changeset.PromoteCandidateChangeset), - changeset.PromoteCandidateChangesetConfig{ + deployment.CreateLegacyChangeSet(v1_6.PromoteCandidateChangeset), + v1_6.PromoteCandidateChangesetConfig{ HomeChainSelector: e.HomeChainSel, - PluginInfo: []changeset.PromoteCandidatePluginInfo{ + PluginInfo: []v1_6.PromoteCandidatePluginInfo{ { PluginType: types.PluginTypeCCIPCommit, RemoteChainSelectors: allChains, @@ -760,8 +761,8 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn ), commonchangeset.Configure( // Enable the OCR config on the remote chains. - deployment.CreateLegacyChangeSet(changeset.SetOCR3OffRampChangeset), - changeset.SetOCR3OffRampConfig{ + deployment.CreateLegacyChangeSet(v1_6.SetOCR3OffRampChangeset), + v1_6.SetOCR3OffRampConfig{ HomeChainSel: e.HomeChainSel, RemoteChainSels: evmChains, CCIPHomeConfigType: globals.ConfigTypeActive, @@ -770,14 +771,14 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn commonchangeset.Configure( // Enable the OCR config on the remote chains. deployment.CreateLegacyChangeSet(changeset_solana.SetOCR3ConfigSolana), - changeset.SetOCR3OffRampConfig{ + v1_6.SetOCR3OffRampConfig{ HomeChainSel: e.HomeChainSel, RemoteChainSels: solChains, CCIPHomeConfigType: globals.ConfigTypeActive, }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.CCIPCapabilityJobspecChangeset), + deployment.CreateLegacyChangeSet(v1_6.CCIPCapabilityJobspecChangeset), nil, // Changeset ignores any config ), } diff --git a/deployment/ccip/changeset/testhelpers/test_helpers.go b/deployment/ccip/changeset/testhelpers/test_helpers.go index 1127e34a89b..608789485a0 100644 --- a/deployment/ccip/changeset/testhelpers/test_helpers.go +++ b/deployment/ccip/changeset/testhelpers/test_helpers.go @@ -21,6 +21,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" changeset_solana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" @@ -481,9 +482,9 @@ func addLaneSolanaChangesets(t *testing.T, solChainSelector, remoteChainSelector func addEVMSrcChangesets(from, to uint64, isTestRouter bool, gasprice map[uint64]*big.Int, tokenPrices map[common.Address]*big.Int, fqCfg fee_quoter.FeeQuoterDestChainConfig) []commoncs.ConfiguredChangeSet { evmSrcChangesets := []commoncs.ConfiguredChangeSet{ commoncs.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateOnRampsDestsChangeset), - changeset.UpdateOnRampDestsConfig{ - UpdatesByChain: map[uint64]map[uint64]changeset.OnRampDestinationUpdate{ + deployment.CreateLegacyChangeSet(v1_6.UpdateOnRampsDestsChangeset), + v1_6.UpdateOnRampDestsConfig{ + UpdatesByChain: map[uint64]map[uint64]v1_6.OnRampDestinationUpdate{ from: { to: { IsEnabled: true, @@ -495,9 +496,9 @@ func addEVMSrcChangesets(from, to uint64, isTestRouter bool, gasprice map[uint64 }, ), commoncs.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterPricesChangeset), - changeset.UpdateFeeQuoterPricesConfig{ - PricesByChain: map[uint64]changeset.FeeQuoterPriceUpdatePerSource{ + deployment.CreateLegacyChangeSet(v1_6.UpdateFeeQuoterPricesChangeset), + v1_6.UpdateFeeQuoterPricesConfig{ + PricesByChain: map[uint64]v1_6.FeeQuoterPriceUpdatePerSource{ from: { TokenPrices: tokenPrices, GasPrices: gasprice, @@ -506,8 +507,8 @@ func addEVMSrcChangesets(from, to uint64, isTestRouter bool, gasprice map[uint64 }, ), commoncs.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterDestsChangeset), - changeset.UpdateFeeQuoterDestsConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateFeeQuoterDestsChangeset), + v1_6.UpdateFeeQuoterDestsConfig{ UpdatesByChain: map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig{ from: { to: fqCfg, @@ -516,10 +517,10 @@ func addEVMSrcChangesets(from, to uint64, isTestRouter bool, gasprice map[uint64 }, ), commoncs.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateRouterRampsChangeset), - changeset.UpdateRouterRampsConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateRouterRampsChangeset), + v1_6.UpdateRouterRampsConfig{ TestRouter: isTestRouter, - UpdatesByChain: map[uint64]changeset.RouterUpdates{ + UpdatesByChain: map[uint64]v1_6.RouterUpdates{ // onRamp update on source chain from: { OnRampUpdates: map[uint64]bool{ @@ -536,9 +537,9 @@ func addEVMSrcChangesets(from, to uint64, isTestRouter bool, gasprice map[uint64 func addEVMDestChangesets(e *DeployedEnv, to, from uint64, isTestRouter bool) []commoncs.ConfiguredChangeSet { evmDstChangesets := []commoncs.ConfiguredChangeSet{ commoncs.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateOffRampSourcesChangeset), - changeset.UpdateOffRampSourcesConfig{ - UpdatesByChain: map[uint64]map[uint64]changeset.OffRampSourceUpdate{ + deployment.CreateLegacyChangeSet(v1_6.UpdateOffRampSourcesChangeset), + v1_6.UpdateOffRampSourcesConfig{ + UpdatesByChain: map[uint64]map[uint64]v1_6.OffRampSourceUpdate{ to: { from: { IsEnabled: true, @@ -550,10 +551,10 @@ func addEVMDestChangesets(e *DeployedEnv, to, from uint64, isTestRouter bool) [] }, ), commoncs.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateRouterRampsChangeset), - changeset.UpdateRouterRampsConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateRouterRampsChangeset), + v1_6.UpdateRouterRampsConfig{ TestRouter: isTestRouter, - UpdatesByChain: map[uint64]changeset.RouterUpdates{ + UpdatesByChain: map[uint64]v1_6.RouterUpdates{ // offramp update on dest chain to: { OffRampUpdates: map[uint64]bool{ @@ -572,9 +573,9 @@ func RemoveLane(t *testing.T, e *DeployedEnv, src, dest uint64, isTestRouter boo var err error apps := []commoncs.ConfiguredChangeSet{ commoncs.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateRouterRampsChangeset), - changeset.UpdateRouterRampsConfig{ - UpdatesByChain: map[uint64]changeset.RouterUpdates{ + deployment.CreateLegacyChangeSet(v1_6.UpdateRouterRampsChangeset), + v1_6.UpdateRouterRampsConfig{ + UpdatesByChain: map[uint64]v1_6.RouterUpdates{ // onRamp update on source chain src: { OnRampUpdates: map[uint64]bool{ @@ -585,19 +586,19 @@ func RemoveLane(t *testing.T, e *DeployedEnv, src, dest uint64, isTestRouter boo }, ), commoncs.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterDestsChangeset), - changeset.UpdateFeeQuoterDestsConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateFeeQuoterDestsChangeset), + v1_6.UpdateFeeQuoterDestsConfig{ UpdatesByChain: map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig{ src: { - dest: changeset.DefaultFeeQuoterDestChainConfig(false), + dest: v1_6.DefaultFeeQuoterDestChainConfig(false), }, }, }, ), commoncs.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateOnRampsDestsChangeset), - changeset.UpdateOnRampDestsConfig{ - UpdatesByChain: map[uint64]map[uint64]changeset.OnRampDestinationUpdate{ + deployment.CreateLegacyChangeSet(v1_6.UpdateOnRampsDestsChangeset), + v1_6.UpdateOnRampDestsConfig{ + UpdatesByChain: map[uint64]map[uint64]v1_6.OnRampDestinationUpdate{ src: { dest: { IsEnabled: false, @@ -626,7 +627,7 @@ func AddLaneWithDefaultPricesAndFeeQuoterConfig(t *testing.T, e *DeployedEnv, st stateChainFrom.Weth9.Address(): DefaultWethPrice, } } - fqCfg := changeset.DefaultFeeQuoterDestChainConfig(true, to) + fqCfg := v1_6.DefaultFeeQuoterDestChainConfig(true, to) AddLane( t, e, diff --git a/deployment/ccip/changeset/testhelpers/test_token_helpers.go b/deployment/ccip/changeset/testhelpers/test_token_helpers.go index 8e56d040018..8cbe7f7b094 100644 --- a/deployment/ccip/changeset/testhelpers/test_token_helpers.go +++ b/deployment/ccip/changeset/testhelpers/test_token_helpers.go @@ -10,8 +10,10 @@ import ( "go.uber.org/zap/zapcore" "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5_1" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" @@ -27,8 +29,8 @@ const ( ) // CreateSymmetricRateLimits is a utility to quickly create a rate limiter config with equal inbound and outbound values. -func CreateSymmetricRateLimits(rate int64, capacity int64) changeset.RateLimiterConfig { - return changeset.RateLimiterConfig{ +func CreateSymmetricRateLimits(rate int64, capacity int64) v1_5_1.RateLimiterConfig { + return v1_5_1.RateLimiterConfig{ Inbound: token_pool.RateLimiterConfig{ IsEnabled: rate != 0 || capacity != 0, Rate: big.NewInt(rate), @@ -157,15 +159,15 @@ func getPoolsOwnedByDeployer[T commonchangeset.Ownable](t *testing.T, contracts func DeployTestTokenPools( t *testing.T, e deployment.Environment, - newPools map[uint64]changeset.DeployTokenPoolInput, + newPools map[uint64]v1_5_1.DeployTokenPoolInput, transferToTimelock bool, ) deployment.Environment { selectors := e.AllChainSelectors() e, err := commonchangeset.Apply(t, e, nil, commoncs.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployTokenPoolContractsChangeset), - changeset.DeployTokenPoolContractsConfig{ + deployment.CreateLegacyChangeSet(v1_5_1.DeployTokenPoolContractsChangeset), + v1_5_1.DeployTokenPoolContractsConfig{ TokenSymbol: TestTokenSymbol, NewPools: newPools, }, diff --git a/deployment/ccip/changeset/testhelpers/test_usdc_helpers.go b/deployment/ccip/changeset/testhelpers/test_usdc_helpers.go index 911250bb7d9..b16095d6638 100644 --- a/deployment/ccip/changeset/testhelpers/test_usdc_helpers.go +++ b/deployment/ccip/changeset/testhelpers/test_usdc_helpers.go @@ -11,6 +11,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/usdc_token_pool" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" @@ -119,11 +120,11 @@ func UpdateFeeQuoterForUSDC( } _, err := commonchangeset.Apply(t, e, nil, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset), - changeset.ApplyTokenTransferFeeConfigUpdatesConfig{ - UpdatesByChain: map[uint64]changeset.ApplyTokenTransferFeeConfigUpdatesConfigPerChain{ + deployment.CreateLegacyChangeSet(v1_6.ApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset), + v1_6.ApplyTokenTransferFeeConfigUpdatesConfig{ + UpdatesByChain: map[uint64]v1_6.ApplyTokenTransferFeeConfigUpdatesConfigPerChain{ chain.Selector: { - TokenTransferFeeConfigArgs: []changeset.TokenTransferFeeConfigArg{ + TokenTransferFeeConfigArgs: []v1_6.TokenTransferFeeConfigArg{ { DestChain: dstChain, TokenTransferFeeConfigPerToken: map[changeset.TokenSymbol]fee_quoter.FeeQuoterTokenTransferFeeConfig{ diff --git a/deployment/ccip/changeset/token_pools.go b/deployment/ccip/changeset/token_pools.go index bff248d35eb..ba75b3601a7 100644 --- a/deployment/ccip/changeset/token_pools.go +++ b/deployment/ccip/changeset/token_pools.go @@ -18,9 +18,9 @@ import ( ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" ) -var currentTokenPoolVersion semver.Version = deployment.Version1_5_1 +var CurrentTokenPoolVersion semver.Version = deployment.Version1_5_1 -var tokenPoolTypes map[deployment.ContractType]struct{} = map[deployment.ContractType]struct{}{ +var TokenPoolTypes map[deployment.ContractType]struct{} = map[deployment.ContractType]struct{}{ BurnMintTokenPool: struct{}{}, BurnWithFromMintTokenPool: struct{}{}, BurnFromMintTokenPool: struct{}{}, @@ -29,7 +29,7 @@ var tokenPoolTypes map[deployment.ContractType]struct{} = map[deployment.Contrac HybridLockReleaseUSDCTokenPool: struct{}{}, } -var tokenPoolVersions map[semver.Version]struct{} = map[semver.Version]struct{}{ +var TokenPoolVersions map[semver.Version]struct{} = map[semver.Version]struct{}{ deployment.Version1_5_1: struct{}{}, } @@ -45,12 +45,12 @@ type TokenPoolInfo struct { func (t TokenPoolInfo) Validate() error { // Ensure that the inputted type is known - if _, ok := tokenPoolTypes[t.Type]; !ok { + if _, ok := TokenPoolTypes[t.Type]; !ok { return fmt.Errorf("%s is not a known token pool type", t.Type) } // Ensure that the inputted version is known - if _, ok := tokenPoolVersions[t.Version]; !ok { + if _, ok := TokenPoolVersions[t.Version]; !ok { return fmt.Errorf("%s is not a known token pool version", t.Version) } @@ -83,7 +83,7 @@ func (t TokenPoolInfo) GetPoolAndTokenAddress( chain deployment.Chain, state CCIPChainState, ) (*token_pool.TokenPool, common.Address, error) { - tokenPoolAddress, ok := getTokenPoolAddressFromSymbolTypeAndVersion(state, chain, symbol, t.Type, t.Version) + tokenPoolAddress, ok := GetTokenPoolAddressFromSymbolTypeAndVersion(state, chain, symbol, t.Type, t.Version) if !ok { return nil, utils.ZeroAddress, fmt.Errorf("token pool does not exist on %s with symbol %s, type %s, and version %s", chain, symbol, t.Type, t.Version) } @@ -110,8 +110,8 @@ type tokenPoolMetadata struct { Symbol TokenSymbol } -// newTokenPoolWithMetadata returns a token pool along with its metadata. -func newTokenPoolWithMetadata[P tokenPool]( +// NewTokenPoolWithMetadata returns a token pool along with its metadata. +func NewTokenPoolWithMetadata[P tokenPool]( ctx context.Context, newTokenPool func(address common.Address, backend bind.ContractBackend) (P, error), poolAddress common.Address, @@ -151,8 +151,8 @@ func newTokenPoolWithMetadata[P tokenPool]( }, nil } -// getTokenPoolAddressFromSymbolTypeAndVersion returns the token pool address in the environment linked to a particular symbol, type, and version -func getTokenPoolAddressFromSymbolTypeAndVersion( +// GetTokenPoolAddressFromSymbolTypeAndVersion returns the token pool address in the environment linked to a particular symbol, type, and version +func GetTokenPoolAddressFromSymbolTypeAndVersion( chainState CCIPChainState, chain deployment.Chain, symbol TokenSymbol, diff --git a/deployment/ccip/changeset/cs_accept_admin_role.go b/deployment/ccip/changeset/v1_5_1/cs_accept_admin_role.go similarity index 78% rename from deployment/ccip/changeset/cs_accept_admin_role.go rename to deployment/ccip/changeset/v1_5_1/cs_accept_admin_role.go index fd66a575671..fbe1216c94b 100644 --- a/deployment/ccip/changeset/cs_accept_admin_role.go +++ b/deployment/ccip/changeset/v1_5_1/cs_accept_admin_role.go @@ -1,4 +1,4 @@ -package changeset +package v1_5_1 import ( "fmt" @@ -6,16 +6,17 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" ) -var _ deployment.ChangeSet[TokenAdminRegistryChangesetConfig] = AcceptAdminRoleChangeset +var _ deployment.ChangeSet[changeset.TokenAdminRegistryChangesetConfig] = AcceptAdminRoleChangeset func validateAcceptAdminRole( config token_admin_registry.TokenAdminRegistryTokenConfig, sender common.Address, externalAdmin common.Address, - symbol TokenSymbol, + symbol changeset.TokenSymbol, chain deployment.Chain, ) error { // We must be the pending administrator @@ -26,16 +27,16 @@ func validateAcceptAdminRole( } // AcceptAdminRoleChangeset accepts admin rights for tokens on the token admin registry. -func AcceptAdminRoleChangeset(env deployment.Environment, c TokenAdminRegistryChangesetConfig) (deployment.ChangesetOutput, error) { +func AcceptAdminRoleChangeset(env deployment.Environment, c changeset.TokenAdminRegistryChangesetConfig) (deployment.ChangesetOutput, error) { if err := c.Validate(env, false, validateAcceptAdminRole); err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("invalid TokenAdminRegistryChangesetConfig: %w", err) } - state, err := LoadOnchainState(env) + state, err := changeset.LoadOnchainState(env) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } - deployerGroup := NewDeployerGroup(env, state, c.MCMS).WithDeploymentContext("accept admin role for tokens on token admin registries") + deployerGroup := changeset.NewDeployerGroup(env, state, c.MCMS).WithDeploymentContext("accept admin role for tokens on token admin registries") for chainSelector, tokenSymbolToPoolInfo := range c.Pools { chain := env.Chains[chainSelector] diff --git a/deployment/ccip/changeset/cs_accept_admin_role_test.go b/deployment/ccip/changeset/v1_5_1/cs_accept_admin_role_test.go similarity index 88% rename from deployment/ccip/changeset/cs_accept_admin_role_test.go rename to deployment/ccip/changeset/v1_5_1/cs_accept_admin_role_test.go index bea9b9fcdc0..09b8e5bbfb9 100644 --- a/deployment/ccip/changeset/cs_accept_admin_role_test.go +++ b/deployment/ccip/changeset/v1_5_1/cs_accept_admin_role_test.go @@ -1,4 +1,4 @@ -package changeset_test +package v1_5_1_test import ( "testing" @@ -9,6 +9,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5_1" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/v2/core/logger" ) @@ -18,7 +19,7 @@ func TestAcceptAdminRoleChangeset_Validations(t *testing.T) { e, selectorA, _, tokens, timelockContracts := testhelpers.SetupTwoChainEnvironmentWithTokens(t, logger.TestLogger(t), true) - e = testhelpers.DeployTestTokenPools(t, e, map[uint64]changeset.DeployTokenPoolInput{ + e = testhelpers.DeployTestTokenPools(t, e, map[uint64]v1_5_1.DeployTokenPoolInput{ selectorA: { Type: changeset.BurnMintTokenPool, TokenAddress: tokens[selectorA].Address, @@ -88,7 +89,7 @@ func TestAcceptAdminRoleChangeset_Validations(t *testing.T) { Config: changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, @@ -104,7 +105,7 @@ func TestAcceptAdminRoleChangeset_Validations(t *testing.T) { t.Run(test.Msg, func(t *testing.T) { _, err := commonchangeset.Apply(t, e, timelockContracts, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.AcceptAdminRoleChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.AcceptAdminRoleChangeset), test.Config, ), ) @@ -124,7 +125,7 @@ func TestAcceptAdminRoleChangeset_Execution(t *testing.T) { t.Run(msg, func(t *testing.T) { e, selectorA, selectorB, tokens, timelockContracts := testhelpers.SetupTwoChainEnvironmentWithTokens(t, logger.TestLogger(t), mcmsConfig != nil) - e = testhelpers.DeployTestTokenPools(t, e, map[uint64]changeset.DeployTokenPoolInput{ + e = testhelpers.DeployTestTokenPools(t, e, map[uint64]v1_5_1.DeployTokenPoolInput{ selectorA: { Type: changeset.BurnMintTokenPool, TokenAddress: tokens[selectorA].Address, @@ -145,17 +146,17 @@ func TestAcceptAdminRoleChangeset_Execution(t *testing.T) { e, err = commonchangeset.Apply(t, e, timelockContracts, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ProposeAdminRoleChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.ProposeAdminRoleChangeset), changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, }, }, - selectorB: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorB: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, @@ -165,17 +166,17 @@ func TestAcceptAdminRoleChangeset_Execution(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.AcceptAdminRoleChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.AcceptAdminRoleChangeset), changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, }, }, - selectorB: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorB: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, diff --git a/deployment/ccip/changeset/cs_configure_token_pools.go b/deployment/ccip/changeset/v1_5_1/cs_configure_token_pools.go similarity index 94% rename from deployment/ccip/changeset/cs_configure_token_pools.go rename to deployment/ccip/changeset/v1_5_1/cs_configure_token_pools.go index 40a566d6e76..3385ec7817a 100644 --- a/deployment/ccip/changeset/cs_configure_token_pools.go +++ b/deployment/ccip/changeset/v1_5_1/cs_configure_token_pools.go @@ -1,4 +1,4 @@ -package changeset +package v1_5_1 import ( "bytes" @@ -13,6 +13,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/token_pool" "github.com/smartcontractkit/chainlink/deployment" @@ -71,19 +72,19 @@ type TokenPoolConfig struct { Version semver.Version } -func (c TokenPoolConfig) Validate(ctx context.Context, chain deployment.Chain, state CCIPChainState, useMcms bool, tokenSymbol TokenSymbol) error { +func (c TokenPoolConfig) Validate(ctx context.Context, chain deployment.Chain, state changeset.CCIPChainState, useMcms bool, tokenSymbol changeset.TokenSymbol) error { // Ensure that the inputted type is known - if _, ok := tokenPoolTypes[c.Type]; !ok { + if _, ok := changeset.TokenPoolTypes[c.Type]; !ok { return fmt.Errorf("%s is not a known token pool type", c.Type) } // Ensure that the inputted version is known - if _, ok := tokenPoolVersions[c.Version]; !ok { + if _, ok := changeset.TokenPoolVersions[c.Version]; !ok { return fmt.Errorf("%s is not a known token pool version", c.Version) } // Ensure that a pool with given symbol, type and version is known to the environment - tokenPoolAddress, ok := getTokenPoolAddressFromSymbolTypeAndVersion(state, chain, tokenSymbol, c.Type, c.Version) + tokenPoolAddress, ok := changeset.GetTokenPoolAddressFromSymbolTypeAndVersion(state, chain, tokenSymbol, c.Type, c.Version) if !ok { return fmt.Errorf("token pool does not exist on %s with symbol %s, type %s, and version %s", chain.String(), tokenSymbol, c.Type, c.Version) } @@ -108,18 +109,18 @@ func (c TokenPoolConfig) Validate(ctx context.Context, chain deployment.Chain, s // ConfigureTokenPoolContractsConfig is the configuration for the ConfigureTokenPoolContractsConfig changeset. type ConfigureTokenPoolContractsConfig struct { // MCMS defines the delay to use for Timelock (if absent, the changeset will attempt to use the deployer key). - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig // PoolUpdates defines the changes that we want to make to the token pool on a chain PoolUpdates map[uint64]TokenPoolConfig // Symbol is the symbol of the token of interest. - TokenSymbol TokenSymbol + TokenSymbol changeset.TokenSymbol } func (c ConfigureTokenPoolContractsConfig) Validate(env deployment.Environment) error { if c.TokenSymbol == "" { return errors.New("token symbol must be defined") } - state, err := LoadOnchainState(env) + state, err := changeset.LoadOnchainState(env) if err != nil { return fmt.Errorf("failed to load onchain state: %w", err) } @@ -175,12 +176,12 @@ func ConfigureTokenPoolContractsChangeset(env deployment.Environment, c Configur if err := c.Validate(env); err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("invalid ConfigureTokenPoolContractsConfig: %w", err) } - state, err := LoadOnchainState(env) + state, err := changeset.LoadOnchainState(env) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } - deployerGroup := NewDeployerGroup(env, state, c.MCMS).WithDeploymentContext(fmt.Sprintf("configure %s token pools", c.TokenSymbol)) + deployerGroup := changeset.NewDeployerGroup(env, state, c.MCMS).WithDeploymentContext(fmt.Sprintf("configure %s token pools", c.TokenSymbol)) for chainSelector := range c.PoolUpdates { chain := env.Chains[chainSelector] @@ -204,7 +205,7 @@ func configureTokenPool( ctx context.Context, opts *bind.TransactOpts, chains map[uint64]deployment.Chain, - state CCIPOnChainState, + state changeset.CCIPOnChainState, config ConfigureTokenPoolContractsConfig, chainSelector uint64, ) error { @@ -307,13 +308,13 @@ func configureTokenPool( // getTokenStateFromPool fetches the token config from the registry given the pool address func getTokenStateFromPool( ctx context.Context, - symbol TokenSymbol, + symbol changeset.TokenSymbol, poolType deployment.ContractType, version semver.Version, chain deployment.Chain, - state CCIPChainState, + state changeset.CCIPChainState, ) (*token_pool.TokenPool, common.Address, token_admin_registry.TokenAdminRegistryTokenConfig, error) { - tokenPoolAddress, ok := getTokenPoolAddressFromSymbolTypeAndVersion(state, chain, symbol, poolType, version) + tokenPoolAddress, ok := changeset.GetTokenPoolAddressFromSymbolTypeAndVersion(state, chain, symbol, poolType, version) if !ok { return nil, utils.ZeroAddress, token_admin_registry.TokenAdminRegistryTokenConfig{}, fmt.Errorf("token pool does not exist on %s with symbol %s, type %s, and version %s", chain.String(), symbol, poolType, version) } diff --git a/deployment/ccip/changeset/cs_configure_token_pools_test.go b/deployment/ccip/changeset/v1_5_1/cs_configure_token_pools_test.go similarity index 84% rename from deployment/ccip/changeset/cs_configure_token_pools_test.go rename to deployment/ccip/changeset/v1_5_1/cs_configure_token_pools_test.go index 682a84254fa..09ba7f5f980 100644 --- a/deployment/ccip/changeset/cs_configure_token_pools_test.go +++ b/deployment/ccip/changeset/v1_5_1/cs_configure_token_pools_test.go @@ -1,4 +1,4 @@ -package changeset_test +package v1_5_1_test import ( "bytes" @@ -14,6 +14,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5_1" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/environment/memory" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/token_pool" @@ -22,8 +23,8 @@ import ( ) // createSymmetricRateLimits is a utility to quickly create a rate limiter config with equal inbound and outbound values. -func createSymmetricRateLimits(rate int64, capacity int64) changeset.RateLimiterConfig { - return changeset.RateLimiterConfig{ +func createSymmetricRateLimits(rate int64, capacity int64) v1_5_1.RateLimiterConfig { + return v1_5_1.RateLimiterConfig{ Inbound: token_pool.RateLimiterConfig{ IsEnabled: rate != 0 || capacity != 0, Rate: big.NewInt(rate), @@ -128,7 +129,7 @@ func TestValidateRemoteChains(t *testing.T) { for _, test := range tests { t.Run(test.ErrStr, func(t *testing.T) { - remoteChains := changeset.RateLimiterPerChain{ + remoteChains := v1_5_1.RateLimiterPerChain{ 1: { Inbound: token_pool.RateLimiterConfig{ IsEnabled: test.IsEnabled, @@ -155,7 +156,7 @@ func TestValidateTokenPoolConfig(t *testing.T) { e, selectorA, _, tokens, _ := testhelpers.SetupTwoChainEnvironmentWithTokens(t, logger.TestLogger(t), true) - e = testhelpers.DeployTestTokenPools(t, e, map[uint64]changeset.DeployTokenPoolInput{ + e = testhelpers.DeployTestTokenPools(t, e, map[uint64]v1_5_1.DeployTokenPoolInput{ selectorA: { Type: changeset.BurnMintTokenPool, TokenAddress: tokens[selectorA].Address, @@ -168,25 +169,25 @@ func TestValidateTokenPoolConfig(t *testing.T) { tests := []struct { UseMcms bool - TokenPoolConfig changeset.TokenPoolConfig + TokenPoolConfig v1_5_1.TokenPoolConfig ErrStr string Msg string }{ { Msg: "Pool type is invalid", - TokenPoolConfig: changeset.TokenPoolConfig{}, + TokenPoolConfig: v1_5_1.TokenPoolConfig{}, ErrStr: "is not a known token pool type", }, { Msg: "Pool version is invalid", - TokenPoolConfig: changeset.TokenPoolConfig{ + TokenPoolConfig: v1_5_1.TokenPoolConfig{ Type: changeset.BurnMintTokenPool, }, ErrStr: "is not a known token pool version", }, { Msg: "Pool is not owned by required address", - TokenPoolConfig: changeset.TokenPoolConfig{ + TokenPoolConfig: v1_5_1.TokenPoolConfig{ Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, }, @@ -213,43 +214,43 @@ func TestValidateConfigureTokenPoolContractsConfig(t *testing.T) { tests := []struct { TokenSymbol changeset.TokenSymbol - Input changeset.ConfigureTokenPoolContractsConfig + Input v1_5_1.ConfigureTokenPoolContractsConfig ErrStr string Msg string }{ { Msg: "Token symbol is missing", - Input: changeset.ConfigureTokenPoolContractsConfig{}, + Input: v1_5_1.ConfigureTokenPoolContractsConfig{}, ErrStr: "token symbol must be defined", }, { Msg: "Chain selector is invalid", - Input: changeset.ConfigureTokenPoolContractsConfig{ + Input: v1_5_1.ConfigureTokenPoolContractsConfig{ TokenSymbol: testhelpers.TestTokenSymbol, - PoolUpdates: map[uint64]changeset.TokenPoolConfig{ - 0: changeset.TokenPoolConfig{}, + PoolUpdates: map[uint64]v1_5_1.TokenPoolConfig{ + 0: v1_5_1.TokenPoolConfig{}, }, }, ErrStr: "failed to validate chain selector 0", }, { Msg: "Chain selector doesn't exist in environment", - Input: changeset.ConfigureTokenPoolContractsConfig{ + Input: v1_5_1.ConfigureTokenPoolContractsConfig{ TokenSymbol: testhelpers.TestTokenSymbol, - PoolUpdates: map[uint64]changeset.TokenPoolConfig{ - 5009297550715157269: changeset.TokenPoolConfig{}, + PoolUpdates: map[uint64]v1_5_1.TokenPoolConfig{ + 5009297550715157269: v1_5_1.TokenPoolConfig{}, }, }, ErrStr: "does not exist in environment", }, { Msg: "Corresponding pool update missing", - Input: changeset.ConfigureTokenPoolContractsConfig{ + Input: v1_5_1.ConfigureTokenPoolContractsConfig{ TokenSymbol: testhelpers.TestTokenSymbol, - PoolUpdates: map[uint64]changeset.TokenPoolConfig{ - e.AllChainSelectors()[0]: changeset.TokenPoolConfig{ - ChainUpdates: changeset.RateLimiterPerChain{ - e.AllChainSelectors()[1]: changeset.RateLimiterConfig{}, + PoolUpdates: map[uint64]v1_5_1.TokenPoolConfig{ + e.AllChainSelectors()[0]: v1_5_1.TokenPoolConfig{ + ChainUpdates: v1_5_1.RateLimiterPerChain{ + e.AllChainSelectors()[1]: v1_5_1.RateLimiterConfig{}, }, }, }, @@ -275,17 +276,17 @@ func TestValidateConfigureTokenPoolContractsConfig(t *testing.T) { */ { Msg: "Token admin registry is missing", - Input: changeset.ConfigureTokenPoolContractsConfig{ + Input: v1_5_1.ConfigureTokenPoolContractsConfig{ TokenSymbol: testhelpers.TestTokenSymbol, - PoolUpdates: map[uint64]changeset.TokenPoolConfig{ - e.AllChainSelectors()[0]: changeset.TokenPoolConfig{ - ChainUpdates: changeset.RateLimiterPerChain{ - e.AllChainSelectors()[1]: changeset.RateLimiterConfig{}, + PoolUpdates: map[uint64]v1_5_1.TokenPoolConfig{ + e.AllChainSelectors()[0]: v1_5_1.TokenPoolConfig{ + ChainUpdates: v1_5_1.RateLimiterPerChain{ + e.AllChainSelectors()[1]: v1_5_1.RateLimiterConfig{}, }, }, - e.AllChainSelectors()[1]: changeset.TokenPoolConfig{ - ChainUpdates: changeset.RateLimiterPerChain{ - e.AllChainSelectors()[0]: changeset.RateLimiterConfig{}, + e.AllChainSelectors()[1]: v1_5_1.TokenPoolConfig{ + ChainUpdates: v1_5_1.RateLimiterPerChain{ + e.AllChainSelectors()[0]: v1_5_1.RateLimiterConfig{}, }, }, }, @@ -306,15 +307,15 @@ func TestValidateConfigureTokenPoolContracts(t *testing.T) { t.Parallel() type regPass struct { - SelectorA2B changeset.RateLimiterConfig - SelectorB2A changeset.RateLimiterConfig + SelectorA2B v1_5_1.RateLimiterConfig + SelectorB2A v1_5_1.RateLimiterConfig } type updatePass struct { UpdatePoolOnA bool UpdatePoolOnB bool - SelectorA2B changeset.RateLimiterConfig - SelectorB2A changeset.RateLimiterConfig + SelectorA2B v1_5_1.RateLimiterConfig + SelectorB2A v1_5_1.RateLimiterConfig } type tokenPools struct { @@ -382,7 +383,7 @@ func TestValidateConfigureTokenPoolContracts(t *testing.T) { t.Run(test.Msg, func(t *testing.T) { e, selectorA, selectorB, tokens, timelockContracts := testhelpers.SetupTwoChainEnvironmentWithTokens(t, logger.TestLogger(t), mcmsConfig != nil) - e = testhelpers.DeployTestTokenPools(t, e, map[uint64]changeset.DeployTokenPoolInput{ + e = testhelpers.DeployTestTokenPools(t, e, map[uint64]v1_5_1.DeployTokenPoolInput{ selectorA: { Type: changeset.BurnMintTokenPool, TokenAddress: tokens[selectorA].Address, @@ -395,7 +396,7 @@ func TestValidateConfigureTokenPoolContracts(t *testing.T) { }, }, mcmsConfig != nil) - e = testhelpers.DeployTestTokenPools(t, e, map[uint64]changeset.DeployTokenPoolInput{ + e = testhelpers.DeployTestTokenPools(t, e, map[uint64]v1_5_1.DeployTokenPoolInput{ selectorA: { Type: changeset.LockReleaseTokenPool, TokenAddress: tokens[selectorA].Address, @@ -442,22 +443,22 @@ func TestValidateConfigureTokenPoolContracts(t *testing.T) { // Configure & set the active pools on the registry e, err = commonchangeset.Apply(t, e, timelockContracts, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ConfigureTokenPoolContractsChangeset), - changeset.ConfigureTokenPoolContractsConfig{ + deployment.CreateLegacyChangeSet(v1_5_1.ConfigureTokenPoolContractsChangeset), + v1_5_1.ConfigureTokenPoolContractsConfig{ TokenSymbol: testhelpers.TestTokenSymbol, MCMS: mcmsConfig, - PoolUpdates: map[uint64]changeset.TokenPoolConfig{ + PoolUpdates: map[uint64]v1_5_1.TokenPoolConfig{ selectorA: { Type: changeset.LockReleaseTokenPool, Version: deployment.Version1_5_1, - ChainUpdates: changeset.RateLimiterPerChain{ + ChainUpdates: v1_5_1.RateLimiterPerChain{ selectorB: test.RegistrationPass.SelectorA2B, }, }, selectorB: { Type: changeset.LockReleaseTokenPool, Version: deployment.Version1_5_1, - ChainUpdates: changeset.RateLimiterPerChain{ + ChainUpdates: v1_5_1.RateLimiterPerChain{ selectorA: test.RegistrationPass.SelectorB2A, }, }, @@ -465,17 +466,17 @@ func TestValidateConfigureTokenPoolContracts(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ProposeAdminRoleChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.ProposeAdminRoleChangeset), changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.LockReleaseTokenPool, Version: deployment.Version1_5_1, }, }, - selectorB: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorB: { testhelpers.TestTokenSymbol: { Type: changeset.LockReleaseTokenPool, Version: deployment.Version1_5_1, @@ -485,17 +486,17 @@ func TestValidateConfigureTokenPoolContracts(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.AcceptAdminRoleChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.AcceptAdminRoleChangeset), changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.LockReleaseTokenPool, Version: deployment.Version1_5_1, }, }, - selectorB: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorB: { testhelpers.TestTokenSymbol: { Type: changeset.LockReleaseTokenPool, Version: deployment.Version1_5_1, @@ -505,17 +506,17 @@ func TestValidateConfigureTokenPoolContracts(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.SetPoolChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.SetPoolChangeset), changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.LockReleaseTokenPool, Version: deployment.Version1_5_1, }, }, - selectorB: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorB: { testhelpers.TestTokenSymbol: { Type: changeset.LockReleaseTokenPool, Version: deployment.Version1_5_1, @@ -529,7 +530,7 @@ func TestValidateConfigureTokenPoolContracts(t *testing.T) { for _, selector := range e.AllChainSelectors() { var remoteChainSelector uint64 - var rateLimiterConfig changeset.RateLimiterConfig + var rateLimiterConfig v1_5_1.RateLimiterConfig switch selector { case selectorA: remoteChainSelector = selectorB @@ -565,22 +566,22 @@ func TestValidateConfigureTokenPoolContracts(t *testing.T) { } e, err = commonchangeset.Apply(t, e, timelockContracts, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ConfigureTokenPoolContractsChangeset), - changeset.ConfigureTokenPoolContractsConfig{ + deployment.CreateLegacyChangeSet(v1_5_1.ConfigureTokenPoolContractsChangeset), + v1_5_1.ConfigureTokenPoolContractsConfig{ TokenSymbol: testhelpers.TestTokenSymbol, MCMS: mcmsConfig, - PoolUpdates: map[uint64]changeset.TokenPoolConfig{ + PoolUpdates: map[uint64]v1_5_1.TokenPoolConfig{ selectorA: { Type: aType, Version: deployment.Version1_5_1, - ChainUpdates: changeset.RateLimiterPerChain{ + ChainUpdates: v1_5_1.RateLimiterPerChain{ selectorB: test.UpdatePass.SelectorA2B, }, }, selectorB: { Type: bType, Version: deployment.Version1_5_1, - ChainUpdates: changeset.RateLimiterPerChain{ + ChainUpdates: v1_5_1.RateLimiterPerChain{ selectorA: test.UpdatePass.SelectorB2A, }, }, @@ -594,7 +595,7 @@ func TestValidateConfigureTokenPoolContracts(t *testing.T) { var updatePool bool var updateRemotePool bool var remoteChainSelector uint64 - var rateLimiterConfig changeset.RateLimiterConfig + var rateLimiterConfig v1_5_1.RateLimiterConfig switch selector { case selectorA: remoteChainSelector = selectorB diff --git a/deployment/ccip/changeset/cs_deploy_token_pools.go b/deployment/ccip/changeset/v1_5_1/cs_deploy_token_pools.go similarity index 89% rename from deployment/ccip/changeset/cs_deploy_token_pools.go rename to deployment/ccip/changeset/v1_5_1/cs_deploy_token_pools.go index 94afb0a35f7..1f184252bcf 100644 --- a/deployment/ccip/changeset/cs_deploy_token_pools.go +++ b/deployment/ccip/changeset/v1_5_1/cs_deploy_token_pools.go @@ -1,4 +1,4 @@ -package changeset +package v1_5_1 import ( "context" @@ -15,6 +15,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/utils" "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/burn_from_mint_token_pool" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/burn_mint_token_pool" @@ -41,7 +42,7 @@ type DeployTokenPoolInput struct { AcceptLiquidity *bool } -func (i DeployTokenPoolInput) Validate(ctx context.Context, chain deployment.Chain, state CCIPChainState, tokenSymbol TokenSymbol) error { +func (i DeployTokenPoolInput) Validate(ctx context.Context, chain deployment.Chain, state changeset.CCIPChainState, tokenSymbol changeset.TokenSymbol) error { // Ensure that required fields are populated if i.TokenAddress == utils.ZeroAddress { return errors.New("token address must be defined") @@ -51,7 +52,7 @@ func (i DeployTokenPoolInput) Validate(ctx context.Context, chain deployment.Cha } // Validate that the type is known - if _, ok := tokenPoolTypes[i.Type]; !ok { + if _, ok := changeset.TokenPoolTypes[i.Type]; !ok { return fmt.Errorf("requested token pool type %s is unknown", i.Type) } @@ -78,17 +79,17 @@ func (i DeployTokenPoolInput) Validate(ctx context.Context, chain deployment.Cha } // Validate acceptLiquidity based on requested pool type - if i.Type == LockReleaseTokenPool && i.AcceptLiquidity == nil { + if i.Type == changeset.LockReleaseTokenPool && i.AcceptLiquidity == nil { return errors.New("accept liquidity must be defined for lock release pools") } - if i.Type != LockReleaseTokenPool && i.AcceptLiquidity != nil { + if i.Type != changeset.LockReleaseTokenPool && i.AcceptLiquidity != nil { return errors.New("accept liquidity must be nil for burn mint pools") } // We should check if a token pool with this type, version, and symbol already exists - _, ok := getTokenPoolAddressFromSymbolTypeAndVersion(state, chain, tokenSymbol, i.Type, currentTokenPoolVersion) + _, ok := changeset.GetTokenPoolAddressFromSymbolTypeAndVersion(state, chain, tokenSymbol, i.Type, changeset.CurrentTokenPoolVersion) if ok { - return fmt.Errorf("token pool with type %s and version %s already exists for %s on %s", i.Type, currentTokenPoolVersion, tokenSymbol, chain) + return fmt.Errorf("token pool with type %s and version %s already exists for %s on %s", i.Type, changeset.CurrentTokenPoolVersion, tokenSymbol, chain) } return nil @@ -97,7 +98,7 @@ func (i DeployTokenPoolInput) Validate(ctx context.Context, chain deployment.Cha // DeployTokenPoolContractsConfig defines the token pool contracts that need to be deployed on each chain. type DeployTokenPoolContractsConfig struct { // Symbol is the symbol of the token for which we are deploying a pool. - TokenSymbol TokenSymbol + TokenSymbol changeset.TokenSymbol // NewPools defines the per-chain configuration of each new pool NewPools map[uint64]DeployTokenPoolInput // IsTestRouter indicates whether or not the test router should be used. @@ -106,11 +107,11 @@ type DeployTokenPoolContractsConfig struct { func (c DeployTokenPoolContractsConfig) Validate(env deployment.Environment) error { // Ensure that required fields are populated - if c.TokenSymbol == TokenSymbol("") { + if c.TokenSymbol == changeset.TokenSymbol("") { return errors.New("token symbol must be defined") } - state, err := LoadOnchainState(env) + state, err := changeset.LoadOnchainState(env) if err != nil { return fmt.Errorf("failed to load onchain state: %w", err) } @@ -154,7 +155,7 @@ func DeployTokenPoolContractsChangeset(env deployment.Environment, c DeployToken } newAddresses := deployment.NewMemoryAddressBook() - state, err := LoadOnchainState(env) + state, err := changeset.LoadOnchainState(env) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } @@ -185,7 +186,7 @@ func DeployTokenPoolContractsChangeset(env deployment.Environment, c DeployToken func deployTokenPool( logger logger.Logger, chain deployment.Chain, - chainState CCIPChainState, + chainState changeset.CCIPChainState, addressBook deployment.AddressBook, poolConfig DeployTokenPoolInput, isTestRouter bool, @@ -202,22 +203,22 @@ func deployTokenPool( var tx *types.Transaction var err error switch poolConfig.Type { - case BurnMintTokenPool: + case changeset.BurnMintTokenPool: tpAddr, tx, _, err = burn_mint_token_pool.DeployBurnMintTokenPool( chain.DeployerKey, chain.Client, poolConfig.TokenAddress, poolConfig.LocalTokenDecimals, poolConfig.AllowList, rmnProxy.Address(), router.Address(), ) - case BurnWithFromMintTokenPool: + case changeset.BurnWithFromMintTokenPool: tpAddr, tx, _, err = burn_with_from_mint_token_pool.DeployBurnWithFromMintTokenPool( chain.DeployerKey, chain.Client, poolConfig.TokenAddress, poolConfig.LocalTokenDecimals, poolConfig.AllowList, rmnProxy.Address(), router.Address(), ) - case BurnFromMintTokenPool: + case changeset.BurnFromMintTokenPool: tpAddr, tx, _, err = burn_from_mint_token_pool.DeployBurnFromMintTokenPool( chain.DeployerKey, chain.Client, poolConfig.TokenAddress, poolConfig.LocalTokenDecimals, poolConfig.AllowList, rmnProxy.Address(), router.Address(), ) - case LockReleaseTokenPool: + case changeset.LockReleaseTokenPool: tpAddr, tx, _, err = lock_release_token_pool.DeployLockReleaseTokenPool( chain.DeployerKey, chain.Client, poolConfig.TokenAddress, poolConfig.LocalTokenDecimals, poolConfig.AllowList, rmnProxy.Address(), *poolConfig.AcceptLiquidity, router.Address(), @@ -230,7 +231,7 @@ func deployTokenPool( return deployment.ContractDeploy[*token_pool.TokenPool]{ Address: tpAddr, Contract: tp, - Tv: deployment.NewTypeAndVersion(poolConfig.Type, currentTokenPoolVersion), + Tv: deployment.NewTypeAndVersion(poolConfig.Type, changeset.CurrentTokenPoolVersion), Tx: tx, Err: err, } diff --git a/deployment/ccip/changeset/cs_deploy_token_pools_test.go b/deployment/ccip/changeset/v1_5_1/cs_deploy_token_pools_test.go similarity index 82% rename from deployment/ccip/changeset/cs_deploy_token_pools_test.go rename to deployment/ccip/changeset/v1_5_1/cs_deploy_token_pools_test.go index 8e129cfbed9..546ee19c8a3 100644 --- a/deployment/ccip/changeset/cs_deploy_token_pools_test.go +++ b/deployment/ccip/changeset/v1_5_1/cs_deploy_token_pools_test.go @@ -1,4 +1,4 @@ -package changeset_test +package v1_5_1_test import ( "context" @@ -11,9 +11,11 @@ import ( "go.uber.org/zap/zapcore" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5_1" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/environment/memory" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -30,50 +32,50 @@ func TestValidateDeployTokenPoolContractsConfig(t *testing.T) { tests := []struct { Msg string TokenSymbol changeset.TokenSymbol - Input changeset.DeployTokenPoolContractsConfig + Input v1_5_1.DeployTokenPoolContractsConfig ErrStr string }{ { Msg: "Token symbol is missing", - Input: changeset.DeployTokenPoolContractsConfig{}, + Input: v1_5_1.DeployTokenPoolContractsConfig{}, ErrStr: "token symbol must be defined", }, { Msg: "Chain selector is not valid", - Input: changeset.DeployTokenPoolContractsConfig{ + Input: v1_5_1.DeployTokenPoolContractsConfig{ TokenSymbol: "TEST", - NewPools: map[uint64]changeset.DeployTokenPoolInput{ - 0: changeset.DeployTokenPoolInput{}, + NewPools: map[uint64]v1_5_1.DeployTokenPoolInput{ + 0: v1_5_1.DeployTokenPoolInput{}, }, }, ErrStr: "failed to validate chain selector 0", }, { Msg: "Chain selector doesn't exist in environment", - Input: changeset.DeployTokenPoolContractsConfig{ + Input: v1_5_1.DeployTokenPoolContractsConfig{ TokenSymbol: "TEST", - NewPools: map[uint64]changeset.DeployTokenPoolInput{ - 5009297550715157269: changeset.DeployTokenPoolInput{}, + NewPools: map[uint64]v1_5_1.DeployTokenPoolInput{ + 5009297550715157269: v1_5_1.DeployTokenPoolInput{}, }, }, ErrStr: "does not exist in environment", }, { Msg: "Router contract is missing from chain", - Input: changeset.DeployTokenPoolContractsConfig{ + Input: v1_5_1.DeployTokenPoolContractsConfig{ TokenSymbol: "TEST", - NewPools: map[uint64]changeset.DeployTokenPoolInput{ - e.AllChainSelectors()[0]: changeset.DeployTokenPoolInput{}, + NewPools: map[uint64]v1_5_1.DeployTokenPoolInput{ + e.AllChainSelectors()[0]: v1_5_1.DeployTokenPoolInput{}, }, }, ErrStr: "missing router", }, { Msg: "Test router contract is missing from chain", - Input: changeset.DeployTokenPoolContractsConfig{ + Input: v1_5_1.DeployTokenPoolContractsConfig{ TokenSymbol: "TEST", - NewPools: map[uint64]changeset.DeployTokenPoolInput{ - e.AllChainSelectors()[0]: changeset.DeployTokenPoolInput{}, + NewPools: map[uint64]v1_5_1.DeployTokenPoolInput{ + e.AllChainSelectors()[0]: v1_5_1.DeployTokenPoolInput{}, }, IsTestRouter: true, }, @@ -96,7 +98,7 @@ func TestValidateDeployTokenPoolInput(t *testing.T) { acceptLiquidity := false invalidAddress := utils.RandomAddress() - e = testhelpers.DeployTestTokenPools(t, e, map[uint64]changeset.DeployTokenPoolInput{ + e = testhelpers.DeployTestTokenPools(t, e, map[uint64]v1_5_1.DeployTokenPoolInput{ selectorA: { Type: changeset.BurnMintTokenPool, TokenAddress: tokens[selectorA].Address, @@ -107,24 +109,24 @@ func TestValidateDeployTokenPoolInput(t *testing.T) { tests := []struct { Msg string Symbol changeset.TokenSymbol - Input changeset.DeployTokenPoolInput + Input v1_5_1.DeployTokenPoolInput ErrStr string }{ { Msg: "Token address is missing", - Input: changeset.DeployTokenPoolInput{}, + Input: v1_5_1.DeployTokenPoolInput{}, ErrStr: "token address must be defined", }, { Msg: "Token pool type is missing", - Input: changeset.DeployTokenPoolInput{ + Input: v1_5_1.DeployTokenPoolInput{ TokenAddress: invalidAddress, }, ErrStr: "type must be defined", }, { Msg: "Token pool type is invalid", - Input: changeset.DeployTokenPoolInput{ + Input: v1_5_1.DeployTokenPoolInput{ TokenAddress: invalidAddress, Type: deployment.ContractType("InvalidTokenPool"), }, @@ -132,7 +134,7 @@ func TestValidateDeployTokenPoolInput(t *testing.T) { }, { Msg: "Token address is invalid", - Input: changeset.DeployTokenPoolInput{ + Input: v1_5_1.DeployTokenPoolInput{ Type: changeset.BurnMintTokenPool, TokenAddress: invalidAddress, }, @@ -141,7 +143,7 @@ func TestValidateDeployTokenPoolInput(t *testing.T) { { Msg: "Token symbol mismatch", Symbol: "WRONG", - Input: changeset.DeployTokenPoolInput{ + Input: v1_5_1.DeployTokenPoolInput{ Type: changeset.BurnMintTokenPool, TokenAddress: tokens[selectorA].Address, }, @@ -150,7 +152,7 @@ func TestValidateDeployTokenPoolInput(t *testing.T) { { Msg: "Token decimal mismatch", Symbol: testhelpers.TestTokenSymbol, - Input: changeset.DeployTokenPoolInput{ + Input: v1_5_1.DeployTokenPoolInput{ Type: changeset.BurnMintTokenPool, TokenAddress: tokens[selectorA].Address, LocalTokenDecimals: 17, @@ -160,7 +162,7 @@ func TestValidateDeployTokenPoolInput(t *testing.T) { { Msg: "Accept liquidity should be defined", Symbol: testhelpers.TestTokenSymbol, - Input: changeset.DeployTokenPoolInput{ + Input: v1_5_1.DeployTokenPoolInput{ Type: changeset.LockReleaseTokenPool, TokenAddress: tokens[selectorA].Address, LocalTokenDecimals: testhelpers.LocalTokenDecimals, @@ -170,7 +172,7 @@ func TestValidateDeployTokenPoolInput(t *testing.T) { { Msg: "Accept liquidity should be omitted", Symbol: testhelpers.TestTokenSymbol, - Input: changeset.DeployTokenPoolInput{ + Input: v1_5_1.DeployTokenPoolInput{ Type: changeset.BurnMintTokenPool, TokenAddress: tokens[selectorA].Address, LocalTokenDecimals: testhelpers.LocalTokenDecimals, @@ -181,7 +183,7 @@ func TestValidateDeployTokenPoolInput(t *testing.T) { { Msg: "Token pool already exists", Symbol: testhelpers.TestTokenSymbol, - Input: changeset.DeployTokenPoolInput{ + Input: v1_5_1.DeployTokenPoolInput{ Type: changeset.BurnMintTokenPool, TokenAddress: tokens[selectorA].Address, LocalTokenDecimals: testhelpers.LocalTokenDecimals, @@ -212,12 +214,12 @@ func TestDeployTokenPoolContracts(t *testing.T) { tests := []struct { Msg string - Input changeset.DeployTokenPoolInput + Input v1_5_1.DeployTokenPoolInput GetPool func(changeset.CCIPChainState) Ownable }{ { Msg: "BurnMint", - Input: changeset.DeployTokenPoolInput{ + Input: v1_5_1.DeployTokenPoolInput{ Type: changeset.BurnMintTokenPool, LocalTokenDecimals: testhelpers.LocalTokenDecimals, AllowList: []common.Address{}, @@ -231,7 +233,7 @@ func TestDeployTokenPoolContracts(t *testing.T) { }, { Msg: "BurnWithFromMint", - Input: changeset.DeployTokenPoolInput{ + Input: v1_5_1.DeployTokenPoolInput{ Type: changeset.BurnWithFromMintTokenPool, LocalTokenDecimals: testhelpers.LocalTokenDecimals, AllowList: []common.Address{}, @@ -245,7 +247,7 @@ func TestDeployTokenPoolContracts(t *testing.T) { }, { Msg: "BurnFromMint", - Input: changeset.DeployTokenPoolInput{ + Input: v1_5_1.DeployTokenPoolInput{ Type: changeset.BurnFromMintTokenPool, LocalTokenDecimals: testhelpers.LocalTokenDecimals, AllowList: []common.Address{}, @@ -259,7 +261,7 @@ func TestDeployTokenPoolContracts(t *testing.T) { }, { Msg: "LockRelease", - Input: changeset.DeployTokenPoolInput{ + Input: v1_5_1.DeployTokenPoolInput{ Type: changeset.LockReleaseTokenPool, LocalTokenDecimals: testhelpers.LocalTokenDecimals, AllowList: []common.Address{}, @@ -282,10 +284,10 @@ func TestDeployTokenPoolContracts(t *testing.T) { e, err := commonchangeset.Apply(t, e, timelockContracts, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployTokenPoolContractsChangeset), - changeset.DeployTokenPoolContractsConfig{ + deployment.CreateLegacyChangeSet(v1_5_1.DeployTokenPoolContractsChangeset), + v1_5_1.DeployTokenPoolContractsConfig{ TokenSymbol: testhelpers.TestTokenSymbol, - NewPools: map[uint64]changeset.DeployTokenPoolInput{ + NewPools: map[uint64]v1_5_1.DeployTokenPoolInput{ selectorA: test.Input, }, }, diff --git a/deployment/ccip/changeset/cs_deploy_usdc_token_pools.go b/deployment/ccip/changeset/v1_5_1/cs_deploy_usdc_token_pools.go similarity index 94% rename from deployment/ccip/changeset/cs_deploy_usdc_token_pools.go rename to deployment/ccip/changeset/v1_5_1/cs_deploy_usdc_token_pools.go index 36c41a819a9..68ae0f08a40 100644 --- a/deployment/ccip/changeset/cs_deploy_usdc_token_pools.go +++ b/deployment/ccip/changeset/v1_5_1/cs_deploy_usdc_token_pools.go @@ -1,4 +1,4 @@ -package changeset +package v1_5_1 import ( "context" @@ -9,7 +9,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/mock_usdc_token_messenger" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/usdc_token_pool" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/erc20" @@ -28,7 +30,7 @@ type DeployUSDCTokenPoolInput struct { AllowList []common.Address } -func (i DeployUSDCTokenPoolInput) Validate(ctx context.Context, chain deployment.Chain, state CCIPChainState) error { +func (i DeployUSDCTokenPoolInput) Validate(ctx context.Context, chain deployment.Chain, state changeset.CCIPChainState) error { // Ensure that required fields are populated if i.TokenAddress == utils.ZeroAddress { return errors.New("token address must be defined") @@ -46,7 +48,7 @@ func (i DeployUSDCTokenPoolInput) Validate(ctx context.Context, chain deployment if err != nil { return fmt.Errorf("failed to fetch symbol from token with address %s: %w", i.TokenAddress, err) } - if symbol != string(USDCSymbol) { + if symbol != string(changeset.USDCSymbol) { return fmt.Errorf("symbol of token with address %s (%s) is not USDC", i.TokenAddress, symbol) } @@ -82,7 +84,7 @@ type DeployUSDCTokenPoolContractsConfig struct { } func (c DeployUSDCTokenPoolContractsConfig) Validate(env deployment.Environment) error { - state, err := LoadOnchainState(env) + state, err := changeset.LoadOnchainState(env) if err != nil { return fmt.Errorf("failed to load onchain state: %w", err) } @@ -120,7 +122,7 @@ func DeployUSDCTokenPoolContractsChangeset(env deployment.Environment, c DeployU } newAddresses := deployment.NewMemoryAddressBook() - state, err := LoadOnchainState(env) + state, err := changeset.LoadOnchainState(env) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } @@ -138,7 +140,7 @@ func DeployUSDCTokenPoolContractsChangeset(env deployment.Environment, c DeployU return deployment.ContractDeploy[*usdc_token_pool.USDCTokenPool]{ Address: poolAddress, Contract: usdcTokenPool, - Tv: deployment.NewTypeAndVersion(USDCTokenPool, deployment.Version1_5_1), + Tv: deployment.NewTypeAndVersion(changeset.USDCTokenPool, deployment.Version1_5_1), Tx: tx, Err: err, } diff --git a/deployment/ccip/changeset/cs_deploy_usdc_token_pools_test.go b/deployment/ccip/changeset/v1_5_1/cs_deploy_usdc_token_pools_test.go similarity index 86% rename from deployment/ccip/changeset/cs_deploy_usdc_token_pools_test.go rename to deployment/ccip/changeset/v1_5_1/cs_deploy_usdc_token_pools_test.go index 5477fe76d09..de887fcbc9c 100644 --- a/deployment/ccip/changeset/cs_deploy_usdc_token_pools_test.go +++ b/deployment/ccip/changeset/v1_5_1/cs_deploy_usdc_token_pools_test.go @@ -1,4 +1,4 @@ -package changeset_test +package v1_5_1_test import ( "fmt" @@ -9,8 +9,10 @@ import ( "go.uber.org/zap/zapcore" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5_1" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/environment/memory" @@ -88,32 +90,32 @@ func TestValidateDeployUSDCTokenPoolContractsConfig(t *testing.T) { tests := []struct { Msg string - Input changeset.DeployUSDCTokenPoolContractsConfig + Input v1_5_1.DeployUSDCTokenPoolContractsConfig ErrStr string }{ { Msg: "Chain selector is not valid", - Input: changeset.DeployUSDCTokenPoolContractsConfig{ - USDCPools: map[uint64]changeset.DeployUSDCTokenPoolInput{ - 0: changeset.DeployUSDCTokenPoolInput{}, + Input: v1_5_1.DeployUSDCTokenPoolContractsConfig{ + USDCPools: map[uint64]v1_5_1.DeployUSDCTokenPoolInput{ + 0: v1_5_1.DeployUSDCTokenPoolInput{}, }, }, ErrStr: "failed to validate chain selector 0", }, { Msg: "Chain selector doesn't exist in environment", - Input: changeset.DeployUSDCTokenPoolContractsConfig{ - USDCPools: map[uint64]changeset.DeployUSDCTokenPoolInput{ - 5009297550715157269: changeset.DeployUSDCTokenPoolInput{}, + Input: v1_5_1.DeployUSDCTokenPoolContractsConfig{ + USDCPools: map[uint64]v1_5_1.DeployUSDCTokenPoolInput{ + 5009297550715157269: v1_5_1.DeployUSDCTokenPoolInput{}, }, }, ErrStr: "does not exist in environment", }, { Msg: "Missing router", - Input: changeset.DeployUSDCTokenPoolContractsConfig{ - USDCPools: map[uint64]changeset.DeployUSDCTokenPoolInput{ - e.AllChainSelectors()[0]: changeset.DeployUSDCTokenPoolInput{}, + Input: v1_5_1.DeployUSDCTokenPoolContractsConfig{ + USDCPools: map[uint64]v1_5_1.DeployUSDCTokenPoolInput{ + e.AllChainSelectors()[0]: v1_5_1.DeployUSDCTokenPoolInput{}, }, }, ErrStr: "missing router", @@ -167,24 +169,24 @@ func TestValidateDeployUSDCTokenPoolInput(t *testing.T) { tests := []struct { Msg string - Input changeset.DeployUSDCTokenPoolInput + Input v1_5_1.DeployUSDCTokenPoolInput ErrStr string }{ { Msg: "Missing token address", - Input: changeset.DeployUSDCTokenPoolInput{}, + Input: v1_5_1.DeployUSDCTokenPoolInput{}, ErrStr: "token address must be defined", }, { Msg: "Missing token messenger", - Input: changeset.DeployUSDCTokenPoolInput{ + Input: v1_5_1.DeployUSDCTokenPoolInput{ TokenAddress: utils.RandomAddress(), }, ErrStr: "token messenger must be defined", }, { Msg: "Can't reach token", - Input: changeset.DeployUSDCTokenPoolInput{ + Input: v1_5_1.DeployUSDCTokenPoolInput{ TokenAddress: utils.RandomAddress(), TokenMessenger: utils.RandomAddress(), }, @@ -192,7 +194,7 @@ func TestValidateDeployUSDCTokenPoolInput(t *testing.T) { }, { Msg: "Symbol is wrong", - Input: changeset.DeployUSDCTokenPoolInput{ + Input: v1_5_1.DeployUSDCTokenPoolInput{ TokenAddress: nonUsdcToken.Address, TokenMessenger: utils.RandomAddress(), }, @@ -200,7 +202,7 @@ func TestValidateDeployUSDCTokenPoolInput(t *testing.T) { }, { Msg: "Can't reach token messenger", - Input: changeset.DeployUSDCTokenPoolInput{ + Input: v1_5_1.DeployUSDCTokenPoolInput{ TokenAddress: usdcToken.Address, TokenMessenger: utils.RandomAddress(), }, @@ -208,7 +210,7 @@ func TestValidateDeployUSDCTokenPoolInput(t *testing.T) { }, { Msg: "No error", - Input: changeset.DeployUSDCTokenPoolInput{ + Input: v1_5_1.DeployUSDCTokenPoolInput{ TokenAddress: usdcToken.Address, TokenMessenger: tokenMessenger.Address, }, @@ -257,11 +259,11 @@ func TestDeployUSDCTokenPoolContracts(t *testing.T) { ) require.NoError(t, err) - newUSDCTokenPools := make(map[uint64]changeset.DeployUSDCTokenPoolInput, len(selectors)) + newUSDCTokenPools := make(map[uint64]v1_5_1.DeployUSDCTokenPoolInput, len(selectors)) for _, selector := range selectors { usdcToken, tokenMessenger := deployUSDCPrerequisites(t, lggr, e.Chains[selector], addressBook) - newUSDCTokenPools[selector] = changeset.DeployUSDCTokenPoolInput{ + newUSDCTokenPools[selector] = v1_5_1.DeployUSDCTokenPoolInput{ TokenAddress: usdcToken.Address, TokenMessenger: tokenMessenger.Address, } @@ -270,8 +272,8 @@ func TestDeployUSDCTokenPoolContracts(t *testing.T) { for i := range numRuns { e, err = commoncs.Apply(t, e, nil, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployUSDCTokenPoolContractsChangeset), - changeset.DeployUSDCTokenPoolContractsConfig{ + deployment.CreateLegacyChangeSet(v1_5_1.DeployUSDCTokenPoolContractsChangeset), + v1_5_1.DeployUSDCTokenPoolContractsConfig{ USDCPools: newUSDCTokenPools, }, ), diff --git a/deployment/ccip/changeset/cs_propose_admin_role.go b/deployment/ccip/changeset/v1_5_1/cs_propose_admin_role.go similarity index 81% rename from deployment/ccip/changeset/cs_propose_admin_role.go rename to deployment/ccip/changeset/v1_5_1/cs_propose_admin_role.go index b04fd6b74b1..c026f98ae0b 100644 --- a/deployment/ccip/changeset/cs_propose_admin_role.go +++ b/deployment/ccip/changeset/v1_5_1/cs_propose_admin_role.go @@ -1,4 +1,4 @@ -package changeset +package v1_5_1 import ( "fmt" @@ -8,16 +8,17 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/utils" "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" ) -var _ deployment.ChangeSet[TokenAdminRegistryChangesetConfig] = ProposeAdminRoleChangeset +var _ deployment.ChangeSet[changeset.TokenAdminRegistryChangesetConfig] = ProposeAdminRoleChangeset func validateProposeAdminRole( config token_admin_registry.TokenAdminRegistryTokenConfig, sender common.Address, externalAdmin common.Address, - symbol TokenSymbol, + symbol changeset.TokenSymbol, chain deployment.Chain, ) error { // To propose ourselves as admin of the token, two things must be true. @@ -31,16 +32,16 @@ func validateProposeAdminRole( } // ProposeAdminRoleChangeset proposes admin rights for tokens on the token admin registry. -func ProposeAdminRoleChangeset(env deployment.Environment, c TokenAdminRegistryChangesetConfig) (deployment.ChangesetOutput, error) { +func ProposeAdminRoleChangeset(env deployment.Environment, c changeset.TokenAdminRegistryChangesetConfig) (deployment.ChangesetOutput, error) { if err := c.Validate(env, true, validateProposeAdminRole); err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("invalid TokenAdminRegistryChangesetConfig: %w", err) } - state, err := LoadOnchainState(env) + state, err := changeset.LoadOnchainState(env) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } - deployerGroup := NewDeployerGroup(env, state, c.MCMS).WithDeploymentContext("propose admin role for tokens on token admin registries") + deployerGroup := changeset.NewDeployerGroup(env, state, c.MCMS).WithDeploymentContext("propose admin role for tokens on token admin registries") for chainSelector, tokenSymbolToPoolInfo := range c.Pools { chain := env.Chains[chainSelector] diff --git a/deployment/ccip/changeset/cs_propose_admin_role_test.go b/deployment/ccip/changeset/v1_5_1/cs_propose_admin_role_test.go similarity index 85% rename from deployment/ccip/changeset/cs_propose_admin_role_test.go rename to deployment/ccip/changeset/v1_5_1/cs_propose_admin_role_test.go index 37ea908087b..864a4e2cd91 100644 --- a/deployment/ccip/changeset/cs_propose_admin_role_test.go +++ b/deployment/ccip/changeset/v1_5_1/cs_propose_admin_role_test.go @@ -1,4 +1,4 @@ -package changeset_test +package v1_5_1_test import ( "testing" @@ -7,9 +7,11 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5_1" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/v2/core/logger" ) @@ -19,7 +21,7 @@ func TestProposeAdminRoleChangeset_Validations(t *testing.T) { e, selectorA, _, tokens, timelockContracts := testhelpers.SetupTwoChainEnvironmentWithTokens(t, logger.TestLogger(t), true) - e = testhelpers.DeployTestTokenPools(t, e, map[uint64]changeset.DeployTokenPoolInput{ + e = testhelpers.DeployTestTokenPools(t, e, map[uint64]v1_5_1.DeployTokenPoolInput{ selectorA: { Type: changeset.BurnMintTokenPool, TokenAddress: tokens[selectorA].Address, @@ -34,11 +36,11 @@ func TestProposeAdminRoleChangeset_Validations(t *testing.T) { // We want an administrator to exist to force failure in the last test e, err := commonchangeset.Apply(t, e, timelockContracts, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ProposeAdminRoleChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.ProposeAdminRoleChangeset), changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, @@ -48,11 +50,11 @@ func TestProposeAdminRoleChangeset_Validations(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.AcceptAdminRoleChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.AcceptAdminRoleChangeset), changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, @@ -73,7 +75,7 @@ func TestProposeAdminRoleChangeset_Validations(t *testing.T) { Msg: "Chain selector is invalid", Config: changeset.TokenAdminRegistryChangesetConfig{ Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - 0: map[changeset.TokenSymbol]changeset.TokenPoolInfo{}, + 0: {}, }, }, ErrStr: "failed to validate chain selector 0", @@ -82,7 +84,7 @@ func TestProposeAdminRoleChangeset_Validations(t *testing.T) { Msg: "Chain selector doesn't exist in environment", Config: changeset.TokenAdminRegistryChangesetConfig{ Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - 5009297550715157269: map[changeset.TokenSymbol]changeset.TokenPoolInfo{}, + 5009297550715157269: {}, }, }, ErrStr: "does not exist in environment", @@ -91,7 +93,7 @@ func TestProposeAdminRoleChangeset_Validations(t *testing.T) { Msg: "Ownership validation failure", Config: changeset.TokenAdminRegistryChangesetConfig{ Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{}, + selectorA: {}, }, }, ErrStr: "token admin registry failed ownership validation", @@ -101,7 +103,7 @@ func TestProposeAdminRoleChangeset_Validations(t *testing.T) { Config: changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: "InvalidType", Version: deployment.Version1_5_1, @@ -116,7 +118,7 @@ func TestProposeAdminRoleChangeset_Validations(t *testing.T) { Config: changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_0_0, @@ -131,7 +133,7 @@ func TestProposeAdminRoleChangeset_Validations(t *testing.T) { Config: changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, @@ -147,7 +149,7 @@ func TestProposeAdminRoleChangeset_Validations(t *testing.T) { t.Run(test.Msg, func(t *testing.T) { _, err = commonchangeset.Apply(t, e, timelockContracts, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ProposeAdminRoleChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.ProposeAdminRoleChangeset), test.Config, ), ) @@ -167,7 +169,7 @@ func TestProposeAdminRoleChangeset_ExecutionWithoutExternalAdmin(t *testing.T) { t.Run(msg, func(t *testing.T) { e, selectorA, selectorB, tokens, timelockContracts := testhelpers.SetupTwoChainEnvironmentWithTokens(t, logger.TestLogger(t), mcmsConfig != nil) - e = testhelpers.DeployTestTokenPools(t, e, map[uint64]changeset.DeployTokenPoolInput{ + e = testhelpers.DeployTestTokenPools(t, e, map[uint64]v1_5_1.DeployTokenPoolInput{ selectorA: { Type: changeset.BurnMintTokenPool, TokenAddress: tokens[selectorA].Address, @@ -188,17 +190,17 @@ func TestProposeAdminRoleChangeset_ExecutionWithoutExternalAdmin(t *testing.T) { e, err = commonchangeset.Apply(t, e, timelockContracts, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ProposeAdminRoleChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.ProposeAdminRoleChangeset), changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, }, }, - selectorB: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorB: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, @@ -241,7 +243,7 @@ func TestProposeAdminRoleChangeset_ExecutionWithExternalAdmin(t *testing.T) { externalAdminA := utils.RandomAddress() externalAdminB := utils.RandomAddress() - e = testhelpers.DeployTestTokenPools(t, e, map[uint64]changeset.DeployTokenPoolInput{ + e = testhelpers.DeployTestTokenPools(t, e, map[uint64]v1_5_1.DeployTokenPoolInput{ selectorA: { Type: changeset.BurnMintTokenPool, TokenAddress: tokens[selectorA].Address, @@ -262,18 +264,18 @@ func TestProposeAdminRoleChangeset_ExecutionWithExternalAdmin(t *testing.T) { _, err = commonchangeset.Apply(t, e, timelockContracts, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ProposeAdminRoleChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.ProposeAdminRoleChangeset), changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, ExternalAdmin: externalAdminA, }, }, - selectorB: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorB: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, diff --git a/deployment/ccip/changeset/cs_set_pool.go b/deployment/ccip/changeset/v1_5_1/cs_set_pool.go similarity index 78% rename from deployment/ccip/changeset/cs_set_pool.go rename to deployment/ccip/changeset/v1_5_1/cs_set_pool.go index 6e2f9feb755..fd72a9c9f26 100644 --- a/deployment/ccip/changeset/cs_set_pool.go +++ b/deployment/ccip/changeset/v1_5_1/cs_set_pool.go @@ -1,4 +1,4 @@ -package changeset +package v1_5_1 import ( "fmt" @@ -6,16 +6,17 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" ) -var _ deployment.ChangeSet[TokenAdminRegistryChangesetConfig] = SetPoolChangeset +var _ deployment.ChangeSet[changeset.TokenAdminRegistryChangesetConfig] = SetPoolChangeset func validateSetPool( config token_admin_registry.TokenAdminRegistryTokenConfig, sender common.Address, externalAdmin common.Address, - symbol TokenSymbol, + symbol changeset.TokenSymbol, chain deployment.Chain, ) error { // We must be the administrator @@ -26,16 +27,16 @@ func validateSetPool( } // SetPoolChangeset sets pools for tokens on the token admin registry. -func SetPoolChangeset(env deployment.Environment, c TokenAdminRegistryChangesetConfig) (deployment.ChangesetOutput, error) { +func SetPoolChangeset(env deployment.Environment, c changeset.TokenAdminRegistryChangesetConfig) (deployment.ChangesetOutput, error) { if err := c.Validate(env, false, validateSetPool); err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("invalid TokenAdminRegistryChangesetConfig: %w", err) } - state, err := LoadOnchainState(env) + state, err := changeset.LoadOnchainState(env) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } - deployerGroup := NewDeployerGroup(env, state, c.MCMS).WithDeploymentContext("set pool for tokens on token admin registries") + deployerGroup := changeset.NewDeployerGroup(env, state, c.MCMS).WithDeploymentContext("set pool for tokens on token admin registries") for chainSelector, tokenSymbolToPoolInfo := range c.Pools { chain := env.Chains[chainSelector] diff --git a/deployment/ccip/changeset/cs_set_pool_test.go b/deployment/ccip/changeset/v1_5_1/cs_set_pool_test.go similarity index 83% rename from deployment/ccip/changeset/cs_set_pool_test.go rename to deployment/ccip/changeset/v1_5_1/cs_set_pool_test.go index e19c15c4db5..04ffbda64ad 100644 --- a/deployment/ccip/changeset/cs_set_pool_test.go +++ b/deployment/ccip/changeset/v1_5_1/cs_set_pool_test.go @@ -1,4 +1,4 @@ -package changeset_test +package v1_5_1_test import ( "testing" @@ -9,6 +9,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5_1" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/v2/core/logger" ) @@ -18,7 +19,7 @@ func TestSetPoolChangeset_Validations(t *testing.T) { e, selectorA, _, tokens, timelockContracts := testhelpers.SetupTwoChainEnvironmentWithTokens(t, logger.TestLogger(t), true) - e = testhelpers.DeployTestTokenPools(t, e, map[uint64]changeset.DeployTokenPoolInput{ + e = testhelpers.DeployTestTokenPools(t, e, map[uint64]v1_5_1.DeployTokenPoolInput{ selectorA: { Type: changeset.BurnMintTokenPool, TokenAddress: tokens[selectorA].Address, @@ -39,7 +40,7 @@ func TestSetPoolChangeset_Validations(t *testing.T) { Msg: "Chain selector is invalid", Config: changeset.TokenAdminRegistryChangesetConfig{ Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - 0: map[changeset.TokenSymbol]changeset.TokenPoolInfo{}, + 0: {}, }, }, ErrStr: "failed to validate chain selector 0", @@ -48,7 +49,7 @@ func TestSetPoolChangeset_Validations(t *testing.T) { Msg: "Chain selector doesn't exist in environment", Config: changeset.TokenAdminRegistryChangesetConfig{ Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - 5009297550715157269: map[changeset.TokenSymbol]changeset.TokenPoolInfo{}, + 5009297550715157269: {}, }, }, ErrStr: "does not exist in environment", @@ -58,7 +59,7 @@ func TestSetPoolChangeset_Validations(t *testing.T) { Config: changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: "InvalidType", Version: deployment.Version1_5_1, @@ -73,7 +74,7 @@ func TestSetPoolChangeset_Validations(t *testing.T) { Config: changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_0_0, @@ -88,7 +89,7 @@ func TestSetPoolChangeset_Validations(t *testing.T) { Config: changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, @@ -104,7 +105,7 @@ func TestSetPoolChangeset_Validations(t *testing.T) { t.Run(test.Msg, func(t *testing.T) { _, err := commonchangeset.Apply(t, e, timelockContracts, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.SetPoolChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.SetPoolChangeset), test.Config, ), ) @@ -124,7 +125,7 @@ func TestSetPoolChangeset_Execution(t *testing.T) { t.Run(msg, func(t *testing.T) { e, selectorA, selectorB, tokens, timelockContracts := testhelpers.SetupTwoChainEnvironmentWithTokens(t, logger.TestLogger(t), mcmsConfig != nil) - e = testhelpers.DeployTestTokenPools(t, e, map[uint64]changeset.DeployTokenPoolInput{ + e = testhelpers.DeployTestTokenPools(t, e, map[uint64]v1_5_1.DeployTokenPoolInput{ selectorA: { Type: changeset.BurnMintTokenPool, TokenAddress: tokens[selectorA].Address, @@ -145,17 +146,17 @@ func TestSetPoolChangeset_Execution(t *testing.T) { _, err = commonchangeset.Apply(t, e, timelockContracts, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ProposeAdminRoleChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.ProposeAdminRoleChangeset), changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, }, }, - selectorB: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorB: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, @@ -165,17 +166,17 @@ func TestSetPoolChangeset_Execution(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.AcceptAdminRoleChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.AcceptAdminRoleChangeset), changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, }, }, - selectorB: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorB: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, @@ -185,17 +186,17 @@ func TestSetPoolChangeset_Execution(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.SetPoolChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.SetPoolChangeset), changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, }, }, - selectorB: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorB: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, diff --git a/deployment/ccip/changeset/cs_sync_usdc_domains_with_chains.go b/deployment/ccip/changeset/v1_5_1/cs_sync_usdc_domains_with_chains.go similarity index 94% rename from deployment/ccip/changeset/cs_sync_usdc_domains_with_chains.go rename to deployment/ccip/changeset/v1_5_1/cs_sync_usdc_domains_with_chains.go index 7203d6043bb..1783c9e75e7 100644 --- a/deployment/ccip/changeset/cs_sync_usdc_domains_with_chains.go +++ b/deployment/ccip/changeset/v1_5_1/cs_sync_usdc_domains_with_chains.go @@ -1,4 +1,4 @@ -package changeset +package v1_5_1 import ( "errors" @@ -9,6 +9,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/usdc_token_pool" ) @@ -22,10 +23,10 @@ type SyncUSDCDomainsWithChainsConfig struct { // ChainSelectorToUSDCDomain maps chains selectors to their USDC domain identifiers. ChainSelectorToUSDCDomain map[uint64]uint32 // MCMS defines the delay to use for Timelock (if absent, the changeset will attempt to use the deployer key). - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } -func (c SyncUSDCDomainsWithChainsConfig) Validate(env deployment.Environment, state CCIPOnChainState) error { +func (c SyncUSDCDomainsWithChainsConfig) Validate(env deployment.Environment, state changeset.CCIPOnChainState) error { ctx := env.GetContext() if c.ChainSelectorToUSDCDomain == nil { @@ -90,7 +91,7 @@ func (c SyncUSDCDomainsWithChainsConfig) Validate(env deployment.Environment, st // SyncUSDCDomainsWithChainsChangeset syncs domain support on specified USDC token pools with its chain support. // As such, it is expected that ConfigureTokenPoolContractsChangeset is executed before running this changeset. func SyncUSDCDomainsWithChainsChangeset(env deployment.Environment, c SyncUSDCDomainsWithChainsConfig) (deployment.ChangesetOutput, error) { - state, err := LoadOnchainState(env) + state, err := changeset.LoadOnchainState(env) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } @@ -99,7 +100,7 @@ func SyncUSDCDomainsWithChainsChangeset(env deployment.Environment, c SyncUSDCDo } readOpts := &bind.CallOpts{Context: env.GetContext()} - deployerGroup := NewDeployerGroup(env, state, c.MCMS).WithDeploymentContext("sync domain support with chain support on USDC token pools") + deployerGroup := changeset.NewDeployerGroup(env, state, c.MCMS).WithDeploymentContext("sync domain support with chain support on USDC token pools") for chainSelector, version := range c.USDCVersionByChain { chain := env.Chains[chainSelector] diff --git a/deployment/ccip/changeset/cs_sync_usdc_domains_with_chains_test.go b/deployment/ccip/changeset/v1_5_1/cs_sync_usdc_domains_with_chains_test.go similarity index 78% rename from deployment/ccip/changeset/cs_sync_usdc_domains_with_chains_test.go rename to deployment/ccip/changeset/v1_5_1/cs_sync_usdc_domains_with_chains_test.go index 53c589ec99b..bbbdc033310 100644 --- a/deployment/ccip/changeset/cs_sync_usdc_domains_with_chains_test.go +++ b/deployment/ccip/changeset/v1_5_1/cs_sync_usdc_domains_with_chains_test.go @@ -1,4 +1,4 @@ -package changeset_test +package v1_5_1_test import ( "testing" @@ -11,6 +11,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5_1" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" @@ -21,21 +22,21 @@ func TestValidateSyncUSDCDomainsWithChainsConfig(t *testing.T) { tests := []struct { Msg string - Input func(selector uint64) changeset.SyncUSDCDomainsWithChainsConfig + Input func(selector uint64) v1_5_1.SyncUSDCDomainsWithChainsConfig ErrStr string DeployUSDC bool }{ { Msg: "Domain mapping not defined", - Input: func(selector uint64) changeset.SyncUSDCDomainsWithChainsConfig { - return changeset.SyncUSDCDomainsWithChainsConfig{} + Input: func(selector uint64) v1_5_1.SyncUSDCDomainsWithChainsConfig { + return v1_5_1.SyncUSDCDomainsWithChainsConfig{} }, ErrStr: "chain selector to usdc domain must be defined", }, { Msg: "Chain selector is not valid", - Input: func(selector uint64) changeset.SyncUSDCDomainsWithChainsConfig { - return changeset.SyncUSDCDomainsWithChainsConfig{ + Input: func(selector uint64) v1_5_1.SyncUSDCDomainsWithChainsConfig { + return v1_5_1.SyncUSDCDomainsWithChainsConfig{ USDCVersionByChain: map[uint64]semver.Version{ 0: deployment.Version1_5_1, }, @@ -46,8 +47,8 @@ func TestValidateSyncUSDCDomainsWithChainsConfig(t *testing.T) { }, { Msg: "Chain selector doesn't exist in environment", - Input: func(selector uint64) changeset.SyncUSDCDomainsWithChainsConfig { - return changeset.SyncUSDCDomainsWithChainsConfig{ + Input: func(selector uint64) v1_5_1.SyncUSDCDomainsWithChainsConfig { + return v1_5_1.SyncUSDCDomainsWithChainsConfig{ USDCVersionByChain: map[uint64]semver.Version{ 5009297550715157269: deployment.Version1_5_1, }, @@ -57,8 +58,8 @@ func TestValidateSyncUSDCDomainsWithChainsConfig(t *testing.T) { ErrStr: "does not exist in environment", }, { - Input: func(selector uint64) changeset.SyncUSDCDomainsWithChainsConfig { - return changeset.SyncUSDCDomainsWithChainsConfig{ + Input: func(selector uint64) v1_5_1.SyncUSDCDomainsWithChainsConfig { + return v1_5_1.SyncUSDCDomainsWithChainsConfig{ USDCVersionByChain: map[uint64]semver.Version{ selector: deployment.Version1_5_1, }, @@ -69,8 +70,8 @@ func TestValidateSyncUSDCDomainsWithChainsConfig(t *testing.T) { }, { Msg: "No USDC token pool found with version", - Input: func(selector uint64) changeset.SyncUSDCDomainsWithChainsConfig { - return changeset.SyncUSDCDomainsWithChainsConfig{ + Input: func(selector uint64) v1_5_1.SyncUSDCDomainsWithChainsConfig { + return v1_5_1.SyncUSDCDomainsWithChainsConfig{ USDCVersionByChain: map[uint64]semver.Version{ selector: deployment.Version1_0_0, }, @@ -82,8 +83,8 @@ func TestValidateSyncUSDCDomainsWithChainsConfig(t *testing.T) { }, { Msg: "Not owned by expected owner", - Input: func(selector uint64) changeset.SyncUSDCDomainsWithChainsConfig { - return changeset.SyncUSDCDomainsWithChainsConfig{ + Input: func(selector uint64) v1_5_1.SyncUSDCDomainsWithChainsConfig { + return v1_5_1.SyncUSDCDomainsWithChainsConfig{ USDCVersionByChain: map[uint64]semver.Version{ selector: deployment.Version1_5_1, }, @@ -96,8 +97,8 @@ func TestValidateSyncUSDCDomainsWithChainsConfig(t *testing.T) { }, { Msg: "No domain ID found for selector", - Input: func(selector uint64) changeset.SyncUSDCDomainsWithChainsConfig { - return changeset.SyncUSDCDomainsWithChainsConfig{ + Input: func(selector uint64) v1_5_1.SyncUSDCDomainsWithChainsConfig { + return v1_5_1.SyncUSDCDomainsWithChainsConfig{ USDCVersionByChain: map[uint64]semver.Version{ selector: deployment.Version1_5_1, }, @@ -109,8 +110,8 @@ func TestValidateSyncUSDCDomainsWithChainsConfig(t *testing.T) { }, { Msg: "Missing USDC in input", - Input: func(selector uint64) changeset.SyncUSDCDomainsWithChainsConfig { - return changeset.SyncUSDCDomainsWithChainsConfig{ + Input: func(selector uint64) v1_5_1.SyncUSDCDomainsWithChainsConfig { + return v1_5_1.SyncUSDCDomainsWithChainsConfig{ USDCVersionByChain: map[uint64]semver.Version{}, ChainSelectorToUSDCDomain: map[uint64]uint32{}, } @@ -134,18 +135,18 @@ func TestValidateSyncUSDCDomainsWithChainsConfig(t *testing.T) { var err error e, err = commoncs.Apply(t, e, nil, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ConfigureTokenPoolContractsChangeset), - changeset.ConfigureTokenPoolContractsConfig{ - PoolUpdates: map[uint64]changeset.TokenPoolConfig{ - selectors[0]: changeset.TokenPoolConfig{ - ChainUpdates: changeset.RateLimiterPerChain{ + deployment.CreateLegacyChangeSet(v1_5_1.ConfigureTokenPoolContractsChangeset), + v1_5_1.ConfigureTokenPoolContractsConfig{ + PoolUpdates: map[uint64]v1_5_1.TokenPoolConfig{ + selectors[0]: { + ChainUpdates: v1_5_1.RateLimiterPerChain{ selectors[1]: testhelpers.CreateSymmetricRateLimits(0, 0), }, Type: changeset.USDCTokenPool, Version: deployment.Version1_5_1, }, - selectors[1]: changeset.TokenPoolConfig{ - ChainUpdates: changeset.RateLimiterPerChain{ + selectors[1]: { + ChainUpdates: v1_5_1.RateLimiterPerChain{ selectors[0]: testhelpers.CreateSymmetricRateLimits(0, 0), }, Type: changeset.USDCTokenPool, @@ -217,19 +218,19 @@ func TestSyncUSDCDomainsWithChainsChangeset(t *testing.T) { e, err = commoncs.Apply(t, e, timelockContracts, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ConfigureTokenPoolContractsChangeset), - changeset.ConfigureTokenPoolContractsConfig{ + deployment.CreateLegacyChangeSet(v1_5_1.ConfigureTokenPoolContractsChangeset), + v1_5_1.ConfigureTokenPoolContractsConfig{ MCMS: mcmsConfig, - PoolUpdates: map[uint64]changeset.TokenPoolConfig{ - selectors[0]: changeset.TokenPoolConfig{ - ChainUpdates: changeset.RateLimiterPerChain{ + PoolUpdates: map[uint64]v1_5_1.TokenPoolConfig{ + selectors[0]: { + ChainUpdates: v1_5_1.RateLimiterPerChain{ selectors[1]: testhelpers.CreateSymmetricRateLimits(0, 0), }, Type: changeset.USDCTokenPool, Version: deployment.Version1_5_1, }, - selectors[1]: changeset.TokenPoolConfig{ - ChainUpdates: changeset.RateLimiterPerChain{ + selectors[1]: { + ChainUpdates: v1_5_1.RateLimiterPerChain{ selectors[0]: testhelpers.CreateSymmetricRateLimits(0, 0), }, Type: changeset.USDCTokenPool, @@ -244,8 +245,8 @@ func TestSyncUSDCDomainsWithChainsChangeset(t *testing.T) { e, err = commoncs.Apply(t, e, timelockContracts, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.SyncUSDCDomainsWithChainsChangeset), - changeset.SyncUSDCDomainsWithChainsConfig{ + deployment.CreateLegacyChangeSet(v1_5_1.SyncUSDCDomainsWithChainsChangeset), + v1_5_1.SyncUSDCDomainsWithChainsConfig{ MCMS: mcmsConfig, USDCVersionByChain: map[uint64]semver.Version{ selectors[0]: deployment.Version1_5_1, @@ -285,7 +286,7 @@ func TestSyncUSDCDomainsWithChainsChangeset(t *testing.T) { } // Idempotency check - output, err := changeset.SyncUSDCDomainsWithChainsChangeset(e, changeset.SyncUSDCDomainsWithChainsConfig{ + output, err := v1_5_1.SyncUSDCDomainsWithChainsChangeset(e, v1_5_1.SyncUSDCDomainsWithChainsConfig{ MCMS: mcmsConfig, USDCVersionByChain: map[uint64]semver.Version{ selectors[0]: deployment.Version1_5_1, diff --git a/deployment/ccip/changeset/cs_transfer_admin_role.go b/deployment/ccip/changeset/v1_5_1/cs_transfer_admin_role.go similarity index 79% rename from deployment/ccip/changeset/cs_transfer_admin_role.go rename to deployment/ccip/changeset/v1_5_1/cs_transfer_admin_role.go index fe82d8d0d41..ffd34f43854 100644 --- a/deployment/ccip/changeset/cs_transfer_admin_role.go +++ b/deployment/ccip/changeset/v1_5_1/cs_transfer_admin_role.go @@ -1,4 +1,4 @@ -package changeset +package v1_5_1 import ( "errors" @@ -9,16 +9,17 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/utils" "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" ) -var _ deployment.ChangeSet[TokenAdminRegistryChangesetConfig] = TransferAdminRoleChangeset +var _ deployment.ChangeSet[changeset.TokenAdminRegistryChangesetConfig] = TransferAdminRoleChangeset func validateTransferAdminRole( config token_admin_registry.TokenAdminRegistryTokenConfig, sender common.Address, externalAdmin common.Address, - symbol TokenSymbol, + symbol changeset.TokenSymbol, chain deployment.Chain, ) error { if externalAdmin == utils.ZeroAddress { @@ -32,16 +33,16 @@ func validateTransferAdminRole( } // TransferAdminRoleChangeset transfers the admin role for tokens on the token admin registry to 3rd parties. -func TransferAdminRoleChangeset(env deployment.Environment, c TokenAdminRegistryChangesetConfig) (deployment.ChangesetOutput, error) { +func TransferAdminRoleChangeset(env deployment.Environment, c changeset.TokenAdminRegistryChangesetConfig) (deployment.ChangesetOutput, error) { if err := c.Validate(env, false, validateTransferAdminRole); err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("invalid TokenAdminRegistryChangesetConfig: %w", err) } - state, err := LoadOnchainState(env) + state, err := changeset.LoadOnchainState(env) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } - deployerGroup := NewDeployerGroup(env, state, c.MCMS).WithDeploymentContext("transfer admin role for tokens on token admin registries") + deployerGroup := changeset.NewDeployerGroup(env, state, c.MCMS).WithDeploymentContext("transfer admin role for tokens on token admin registries") for chainSelector, tokenSymbolToPoolInfo := range c.Pools { chain := env.Chains[chainSelector] diff --git a/deployment/ccip/changeset/cs_transfer_admin_role_test.go b/deployment/ccip/changeset/v1_5_1/cs_transfer_admin_role_test.go similarity index 83% rename from deployment/ccip/changeset/cs_transfer_admin_role_test.go rename to deployment/ccip/changeset/v1_5_1/cs_transfer_admin_role_test.go index 8fca285acfd..cf9d22e6f53 100644 --- a/deployment/ccip/changeset/cs_transfer_admin_role_test.go +++ b/deployment/ccip/changeset/v1_5_1/cs_transfer_admin_role_test.go @@ -1,4 +1,4 @@ -package changeset_test +package v1_5_1_test import ( "testing" @@ -7,9 +7,11 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5_1" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/v2/core/logger" ) @@ -19,7 +21,7 @@ func TestTransferAdminRoleChangeset_Validations(t *testing.T) { e, selectorA, _, tokens, timelockContracts := testhelpers.SetupTwoChainEnvironmentWithTokens(t, logger.TestLogger(t), true) - e = testhelpers.DeployTestTokenPools(t, e, map[uint64]changeset.DeployTokenPoolInput{ + e = testhelpers.DeployTestTokenPools(t, e, map[uint64]v1_5_1.DeployTokenPoolInput{ selectorA: { Type: changeset.BurnMintTokenPool, TokenAddress: tokens[selectorA].Address, @@ -40,7 +42,7 @@ func TestTransferAdminRoleChangeset_Validations(t *testing.T) { Msg: "Chain selector is invalid", Config: changeset.TokenAdminRegistryChangesetConfig{ Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - 0: map[changeset.TokenSymbol]changeset.TokenPoolInfo{}, + 0: {}, }, }, ErrStr: "failed to validate chain selector 0", @@ -49,7 +51,7 @@ func TestTransferAdminRoleChangeset_Validations(t *testing.T) { Msg: "Chain selector doesn't exist in environment", Config: changeset.TokenAdminRegistryChangesetConfig{ Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - 5009297550715157269: map[changeset.TokenSymbol]changeset.TokenPoolInfo{}, + 5009297550715157269: {}, }, }, ErrStr: "does not exist in environment", @@ -59,7 +61,7 @@ func TestTransferAdminRoleChangeset_Validations(t *testing.T) { Config: changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: "InvalidType", Version: deployment.Version1_5_1, @@ -74,7 +76,7 @@ func TestTransferAdminRoleChangeset_Validations(t *testing.T) { Config: changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_0_0, @@ -89,7 +91,7 @@ func TestTransferAdminRoleChangeset_Validations(t *testing.T) { Config: changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, @@ -104,7 +106,7 @@ func TestTransferAdminRoleChangeset_Validations(t *testing.T) { Config: changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, @@ -121,7 +123,7 @@ func TestTransferAdminRoleChangeset_Validations(t *testing.T) { t.Run(test.Msg, func(t *testing.T) { _, err := commonchangeset.Apply(t, e, timelockContracts, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.TransferAdminRoleChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.TransferAdminRoleChangeset), test.Config, ), ) @@ -143,7 +145,7 @@ func TestTransferAdminRoleChangeset_Execution(t *testing.T) { externalAdminA := utils.RandomAddress() externalAdminB := utils.RandomAddress() - e = testhelpers.DeployTestTokenPools(t, e, map[uint64]changeset.DeployTokenPoolInput{ + e = testhelpers.DeployTestTokenPools(t, e, map[uint64]v1_5_1.DeployTokenPoolInput{ selectorA: { Type: changeset.BurnMintTokenPool, TokenAddress: tokens[selectorA].Address, @@ -164,17 +166,17 @@ func TestTransferAdminRoleChangeset_Execution(t *testing.T) { _, err = commonchangeset.Apply(t, e, timelockContracts, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ProposeAdminRoleChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.ProposeAdminRoleChangeset), changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, }, }, - selectorB: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorB: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, @@ -184,17 +186,17 @@ func TestTransferAdminRoleChangeset_Execution(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.AcceptAdminRoleChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.AcceptAdminRoleChangeset), changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, }, }, - selectorB: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorB: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, @@ -204,18 +206,18 @@ func TestTransferAdminRoleChangeset_Execution(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.TransferAdminRoleChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.TransferAdminRoleChangeset), changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ - selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorA: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, ExternalAdmin: externalAdminA, }, }, - selectorB: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + selectorB: { testhelpers.TestTokenSymbol: { Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, diff --git a/deployment/ccip/changeset/accept_ownership_test.go b/deployment/ccip/changeset/v1_6/accept_ownership_test.go similarity index 98% rename from deployment/ccip/changeset/accept_ownership_test.go rename to deployment/ccip/changeset/v1_6/accept_ownership_test.go index 1cbb55ed1cc..5a9af9db1bc 100644 --- a/deployment/ccip/changeset/accept_ownership_test.go +++ b/deployment/ccip/changeset/v1_6/accept_ownership_test.go @@ -1,4 +1,4 @@ -package changeset_test +package v1_6_test import ( "testing" diff --git a/deployment/ccip/changeset/cs_active_candidate_test.go b/deployment/ccip/changeset/v1_6/cs_active_candidate_test.go similarity index 82% rename from deployment/ccip/changeset/cs_active_candidate_test.go rename to deployment/ccip/changeset/v1_6/cs_active_candidate_test.go index abf87355398..55326fd7111 100644 --- a/deployment/ccip/changeset/cs_active_candidate_test.go +++ b/deployment/ccip/changeset/v1_6/cs_active_candidate_test.go @@ -1,4 +1,4 @@ -package changeset_test +package v1_6_test import ( "math/big" @@ -9,9 +9,11 @@ import ( "golang.org/x/exp/maps" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" - "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" @@ -44,9 +46,9 @@ func Test_ActiveCandidate(t *testing.T) { sourceState := state.Chains[source] tenv.Env, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateOnRampsDestsChangeset), - changeset.UpdateOnRampDestsConfig{ - UpdatesByChain: map[uint64]map[uint64]changeset.OnRampDestinationUpdate{ + deployment.CreateLegacyChangeSet(v1_6.UpdateOnRampsDestsChangeset), + v1_6.UpdateOnRampDestsConfig{ + UpdatesByChain: map[uint64]map[uint64]v1_6.OnRampDestinationUpdate{ source: { dest: { IsEnabled: true, @@ -57,9 +59,9 @@ func Test_ActiveCandidate(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterPricesChangeset), - changeset.UpdateFeeQuoterPricesConfig{ - PricesByChain: map[uint64]changeset.FeeQuoterPriceUpdatePerSource{ + deployment.CreateLegacyChangeSet(v1_6.UpdateFeeQuoterPricesChangeset), + v1_6.UpdateFeeQuoterPricesConfig{ + PricesByChain: map[uint64]v1_6.FeeQuoterPriceUpdatePerSource{ source: { TokenPrices: map[common.Address]*big.Int{ sourceState.LinkToken.Address(): testhelpers.DefaultLinkPrice, @@ -73,19 +75,19 @@ func Test_ActiveCandidate(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterDestsChangeset), - changeset.UpdateFeeQuoterDestsConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateFeeQuoterDestsChangeset), + v1_6.UpdateFeeQuoterDestsConfig{ UpdatesByChain: map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig{ source: { - dest: changeset.DefaultFeeQuoterDestChainConfig(true), + dest: v1_6.DefaultFeeQuoterDestChainConfig(true), }, }, }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateOffRampSourcesChangeset), - changeset.UpdateOffRampSourcesConfig{ - UpdatesByChain: map[uint64]map[uint64]changeset.OffRampSourceUpdate{ + deployment.CreateLegacyChangeSet(v1_6.UpdateOffRampSourcesChangeset), + v1_6.UpdateOffRampSourcesConfig{ + UpdatesByChain: map[uint64]map[uint64]v1_6.OffRampSourceUpdate{ dest: { source: { IsEnabled: true, @@ -96,9 +98,9 @@ func Test_ActiveCandidate(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateRouterRampsChangeset), - changeset.UpdateRouterRampsConfig{ - UpdatesByChain: map[uint64]changeset.RouterUpdates{ + deployment.CreateLegacyChangeSet(v1_6.UpdateRouterRampsChangeset), + v1_6.UpdateRouterRampsConfig{ + UpdatesByChain: map[uint64]v1_6.RouterUpdates{ // onRamp update on source chain source: { OnRampUpdates: map[uint64]bool{ @@ -195,21 +197,21 @@ func Test_ActiveCandidate(t *testing.T) { tokenConfig := changeset.NewTestTokenConfig(state.Chains[tenv.FeedChainSel].USDFeeds) _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.SetCandidateChangeset), - changeset.SetCandidateChangesetConfig{ - SetCandidateConfigBase: changeset.SetCandidateConfigBase{ + deployment.CreateLegacyChangeSet(v1_6.SetCandidateChangeset), + v1_6.SetCandidateChangesetConfig{ + SetCandidateConfigBase: v1_6.SetCandidateConfigBase{ HomeChainSelector: tenv.HomeChainSel, FeedChainSelector: tenv.FeedChainSel, MCMS: &changeset.MCMSConfig{ MinDelay: 0, }, }, - PluginInfo: []changeset.SetCandidatePluginInfo{ + PluginInfo: []v1_6.SetCandidatePluginInfo{ { // NOTE: this is technically not a new chain, but needed for validation. - OCRConfigPerRemoteChainSelector: map[uint64]changeset.CCIPOCRParams{ - dest: changeset.DeriveCCIPOCRParams( - changeset.WithDefaultCommitOffChainConfig(tenv.FeedChainSel, + OCRConfigPerRemoteChainSelector: map[uint64]v1_6.CCIPOCRParams{ + dest: v1_6.DeriveCCIPOCRParams( + v1_6.WithDefaultCommitOffChainConfig(tenv.FeedChainSel, tokenConfig.GetTokenInfo(logger.TestLogger(t), state.Chains[dest].LinkToken.Address(), state.Chains[dest].Weth9.Address())), @@ -219,9 +221,9 @@ func Test_ActiveCandidate(t *testing.T) { }, { // NOTE: this is technically not a new chain, but needed for validation. - OCRConfigPerRemoteChainSelector: map[uint64]changeset.CCIPOCRParams{ - dest: changeset.DeriveCCIPOCRParams( - changeset.WithDefaultExecuteOffChainConfig(nil), + OCRConfigPerRemoteChainSelector: map[uint64]v1_6.CCIPOCRParams{ + dest: v1_6.DeriveCCIPOCRParams( + v1_6.WithDefaultExecuteOffChainConfig(nil), ), }, PluginType: types.PluginTypeCCIPExec, diff --git a/deployment/ccip/changeset/cs_add_lane_test.go b/deployment/ccip/changeset/v1_6/cs_add_lane_test.go similarity index 99% rename from deployment/ccip/changeset/cs_add_lane_test.go rename to deployment/ccip/changeset/v1_6/cs_add_lane_test.go index 8f395ea0ec9..175a16e9c31 100644 --- a/deployment/ccip/changeset/cs_add_lane_test.go +++ b/deployment/ccip/changeset/v1_6/cs_add_lane_test.go @@ -1,4 +1,4 @@ -package changeset_test +package v1_6_test import ( "testing" diff --git a/deployment/ccip/changeset/cs_ccip_home.go b/deployment/ccip/changeset/v1_6/cs_ccip_home.go similarity index 96% rename from deployment/ccip/changeset/cs_ccip_home.go rename to deployment/ccip/changeset/v1_6/cs_ccip_home.go index ccf937e4906..bec314b4518 100644 --- a/deployment/ccip/changeset/cs_ccip_home.go +++ b/deployment/ccip/changeset/v1_6/cs_ccip_home.go @@ -1,4 +1,4 @@ -package changeset +package v1_6 import ( "bytes" @@ -26,6 +26,7 @@ import ( "github.com/smartcontractkit/chainlink-ccip/pluginconfig" "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" @@ -45,7 +46,7 @@ var ( _ deployment.ChangeSet[UpdateChainConfigConfig] = UpdateChainConfigChangeset ) -func findTokenInfo(tokens []TokenDetails, address common.Address) (string, uint8, error) { +func findTokenInfo(tokens []changeset.TokenDetails, address common.Address) (string, uint8, error) { for _, token := range tokens { if token.Address() == address { tokenSymbol, err := token.Symbol(nil) @@ -62,12 +63,12 @@ func findTokenInfo(tokens []TokenDetails, address common.Address) (string, uint8 return "", 0, fmt.Errorf("token %s not found in available tokens", address) } -func validateExecOffchainConfig(e deployment.Environment, c *pluginconfig.ExecuteOffchainConfig, selector uint64, state CCIPOnChainState) error { +func validateExecOffchainConfig(e deployment.Environment, c *pluginconfig.ExecuteOffchainConfig, selector uint64, state changeset.CCIPOnChainState) error { if err := c.Validate(); err != nil { return fmt.Errorf("invalid execute off-chain config: %w", err) } // get offRamp - if err := state.ValidateRamp(selector, OffRamp); err != nil { + if err := state.ValidateRamp(selector, changeset.OffRamp); err != nil { return fmt.Errorf("validate offRamp: %w", err) } permissionLessExecutionThresholdSeconds, err := state.OffRampPermissionLessExecutionThresholdSeconds(e.GetContext(), e, selector) @@ -91,7 +92,7 @@ func validateExecOffchainConfig(e deployment.Environment, c *pluginconfig.Execut return nil } -func validateCommitOffchainConfig(c *pluginconfig.CommitOffchainConfig, selector uint64, feedChainSel uint64, state CCIPOnChainState) error { +func validateCommitOffchainConfig(c *pluginconfig.CommitOffchainConfig, selector uint64, feedChainSel uint64, state changeset.CCIPOnChainState) error { if err := c.Validate(); err != nil { return fmt.Errorf("invalid commit off-chain config: %w", err) } @@ -103,7 +104,7 @@ func validateCommitOffchainConfig(c *pluginconfig.CommitOffchainConfig, selector aggregatorAddr := common.HexToAddress(string(tokenConfig.AggregatorAddress)) token := common.HexToAddress(tokenUnknownAddr.String()) - tokenInfos := make([]TokenDetails, 0) + tokenInfos := make([]changeset.TokenDetails, 0) onchainState := state.Chains[selector] for _, tk := range onchainState.BurnMintTokens677 { tokenInfos = append(tokenInfos, tk) @@ -114,7 +115,7 @@ func validateCommitOffchainConfig(c *pluginconfig.CommitOffchainConfig, selector for _, tk := range onchainState.ERC677Tokens { tokenInfos = append(tokenInfos, tk) } - var linkTokenInfo TokenDetails + var linkTokenInfo changeset.TokenDetails linkTokenInfo = onchainState.LinkToken if onchainState.LinkToken == nil { linkTokenInfo = onchainState.StaticLinkToken @@ -130,7 +131,7 @@ func validateCommitOffchainConfig(c *pluginconfig.CommitOffchainConfig, selector symbol, token.String(), tokenConfig.Decimals, decimal) } feedChainState := state.Chains[feedChainSel] - aggregatorInState := feedChainState.USDFeeds[TokenSymbol(symbol)] + aggregatorInState := feedChainState.USDFeeds[changeset.TokenSymbol(symbol)] if aggregatorAddr == (common.Address{}) { return fmt.Errorf("token %s -address %s has no aggregator in provided token config", symbol, token.String()) } @@ -146,7 +147,7 @@ func validateCommitOffchainConfig(c *pluginconfig.CommitOffchainConfig, selector return nil } -func validateUSDCConfig(usdcConfig *pluginconfig.USDCCCTPObserverConfig, state CCIPOnChainState) error { +func validateUSDCConfig(usdcConfig *pluginconfig.USDCCCTPObserverConfig, state changeset.CCIPOnChainState) error { for sel, token := range usdcConfig.Tokens { onchainState, ok := state.Chains[uint64(sel)] if !ok { @@ -172,7 +173,7 @@ type CCIPOCRParams struct { ExecuteOffChainConfig *pluginconfig.ExecuteOffchainConfig } -func (c CCIPOCRParams) Validate(e deployment.Environment, selector uint64, feedChainSel uint64, state CCIPOnChainState) error { +func (c CCIPOCRParams) Validate(e deployment.Environment, selector uint64, feedChainSel uint64, state changeset.CCIPOnChainState) error { if err := c.OCRParameters.Validate(); err != nil { return fmt.Errorf("invalid OCR parameters: %w", err) } @@ -293,11 +294,11 @@ type PromoteCandidateChangesetConfig struct { // MCMS is optional MCMS configuration, if provided the changeset will generate an MCMS proposal. // If nil, the changeset will execute the commands directly using the deployer key // of the provided environment. - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } func (p PromoteCandidateChangesetConfig) Validate(e deployment.Environment) (map[uint64]uint32, error) { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return nil, err } @@ -322,7 +323,7 @@ func (p PromoteCandidateChangesetConfig) Validate(e deployment.Environment) (map if err := deployment.IsValidChainSelector(chainSelector); err != nil { return nil, fmt.Errorf("don chain selector invalid: %w", err) } - if err := state.ValidateRamp(chainSelector, OffRamp); err != nil { + if err := state.ValidateRamp(chainSelector, changeset.OffRamp); err != nil { return nil, err } @@ -386,7 +387,7 @@ func PromoteCandidateChangeset( if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("%w: %w", deployment.ErrInvalidConfig, err) } - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -461,7 +462,7 @@ func (p SetCandidatePluginInfo) String() string { return fmt.Sprintf("PluginType: %s, Chains: %v", p.PluginType.String(), allchains) } -func (p SetCandidatePluginInfo) Validate(e deployment.Environment, state CCIPOnChainState, homeChain uint64, feedChain uint64) error { +func (p SetCandidatePluginInfo) Validate(e deployment.Environment, state changeset.CCIPOnChainState, homeChain uint64, feedChain uint64) error { if p.PluginType != types.PluginTypeCCIPCommit && p.PluginType != types.PluginTypeCCIPExec { return errors.New("PluginType must be set to either CCIPCommit or CCIPExec") @@ -473,7 +474,7 @@ func (p SetCandidatePluginInfo) Validate(e deployment.Environment, state CCIPOnC if err := deployment.IsValidChainSelector(chainSelector); err != nil { return fmt.Errorf("don chain selector invalid: %w", err) } - if err := state.ValidateRamp(chainSelector, OffRamp); err != nil { + if err := state.ValidateRamp(chainSelector, changeset.OffRamp); err != nil { return err } if p.PluginType == types.PluginTypeCCIPCommit && params.CommitOffChainConfig == nil { @@ -519,10 +520,10 @@ type SetCandidateConfigBase struct { // MCMS is optional MCMS configuration, if provided the changeset will generate an MCMS proposal. // If nil, the changeset will execute the commands directly using the deployer key // of the provided environment. - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } -func (s SetCandidateConfigBase) Validate(e deployment.Environment, state CCIPOnChainState) error { +func (s SetCandidateConfigBase) Validate(e deployment.Environment, state changeset.CCIPOnChainState) error { if err := deployment.IsValidChainSelector(s.HomeChainSelector); err != nil { return fmt.Errorf("home chain selector invalid: %w", err) } @@ -565,7 +566,7 @@ type AddDonAndSetCandidateChangesetConfig struct { PluginInfo SetCandidatePluginInfo } -func (a AddDonAndSetCandidateChangesetConfig) Validate(e deployment.Environment, state CCIPOnChainState) error { +func (a AddDonAndSetCandidateChangesetConfig) Validate(e deployment.Environment, state changeset.CCIPOnChainState) error { if err := a.SetCandidateConfigBase.Validate(e, state); err != nil { return err } @@ -608,7 +609,7 @@ func AddDonAndSetCandidateChangeset( e deployment.Environment, cfg AddDonAndSetCandidateChangesetConfig, ) (deployment.ChangesetOutput, error) { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -749,7 +750,7 @@ func newDonWithCandidateOp( } tx, err := proposalutils.TransactionForChain(homeChain.Selector, capReg.Address().Hex(), addDonTx.Data(), - big.NewInt(0), string(CapabilitiesRegistry), []string{}) + big.NewInt(0), string(changeset.CapabilitiesRegistry), []string{}) if err != nil { return mcmstypes.Transaction{}, fmt.Errorf("failed to create AddDON mcms tx (don: %d; ptype: %s): %w", donID, types.PluginType(pluginConfig.PluginType).String(), err) @@ -764,7 +765,7 @@ type SetCandidateChangesetConfig struct { PluginInfo []SetCandidatePluginInfo } -func (s SetCandidateChangesetConfig) Validate(e deployment.Environment, state CCIPOnChainState) (map[uint64]uint32, error) { +func (s SetCandidateChangesetConfig) Validate(e deployment.Environment, state changeset.CCIPOnChainState) (map[uint64]uint32, error) { err := s.SetCandidateConfigBase.Validate(e, state) if err != nil { return nil, err @@ -800,7 +801,7 @@ func SetCandidateChangeset( e deployment.Environment, cfg SetCandidateChangesetConfig, ) (deployment.ChangesetOutput, error) { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -942,7 +943,7 @@ func setCandidateOnExistingDon( donID, types.PluginType(pluginConfig.PluginType).String(), err) } - tx, err := proposalutils.TransactionForChain(homeChain.Selector, capReg.Address().Hex(), updateDonTx.Data(), big.NewInt(0), string(CapabilitiesRegistry), []string{}) + tx, err := proposalutils.TransactionForChain(homeChain.Selector, capReg.Address().Hex(), updateDonTx.Data(), big.NewInt(0), string(changeset.CapabilitiesRegistry), []string{}) if err != nil { return nil, fmt.Errorf("failed to create UpdateDON mcms tx in set candidate (don: %d; ptype: %s): %w", donID, types.PluginType(pluginConfig.PluginType).String(), err) @@ -1006,7 +1007,7 @@ func promoteCandidateOp( } tx, err := proposalutils.TransactionForChain(homeChain.Selector, capReg.Address().Hex(), updateDonTx.Data(), - big.NewInt(0), string(CapabilitiesRegistry), []string{}) + big.NewInt(0), string(changeset.CapabilitiesRegistry), []string{}) if err != nil { return mcmstypes.Transaction{}, fmt.Errorf("failed to create UpdateDON mcms tx in promote candidate (don: %d; ptype: %s): %w", donID, types.PluginType(pluginType).String(), err) @@ -1064,10 +1065,10 @@ type RevokeCandidateChangesetConfig struct { // MCMS is optional MCMS configuration, if provided the changeset will generate an MCMS proposal. // If nil, the changeset will execute the commands directly using the deployer key // of the provided environment. - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } -func (r RevokeCandidateChangesetConfig) Validate(e deployment.Environment, state CCIPOnChainState) (donID uint32, err error) { +func (r RevokeCandidateChangesetConfig) Validate(e deployment.Environment, state changeset.CCIPOnChainState) (donID uint32, err error) { if err := deployment.IsValidChainSelector(r.HomeChainSelector); err != nil { return 0, fmt.Errorf("home chain selector invalid: %w", err) } @@ -1117,7 +1118,7 @@ func (r RevokeCandidateChangesetConfig) Validate(e deployment.Environment, state } func RevokeCandidateChangeset(e deployment.Environment, cfg RevokeCandidateChangesetConfig) (deployment.ChangesetOutput, error) { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -1234,7 +1235,7 @@ func revokeCandidateOps( } tx, err := proposalutils.TransactionForChain(homeChain.Selector, capReg.Address().Hex(), updateDonTx.Data(), - big.NewInt(0), string(CapabilitiesRegistry), []string{}) + big.NewInt(0), string(changeset.CapabilitiesRegistry), []string{}) if err != nil { return nil, fmt.Errorf("failed to create UpdateDON mcms tx in revoke candidate (don: %d; ptype: %s): %w", donID, types.PluginType(pluginType).String(), err) @@ -1253,11 +1254,11 @@ type UpdateChainConfigConfig struct { HomeChainSelector uint64 RemoteChainRemoves []uint64 RemoteChainAdds map[uint64]ChainConfig - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } func (c UpdateChainConfigConfig) Validate(e deployment.Environment) error { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return err } @@ -1306,7 +1307,7 @@ func UpdateChainConfigChangeset(e deployment.Environment, cfg UpdateChainConfigC if err := cfg.Validate(e); err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("%w: %w", deployment.ErrInvalidConfig, err) } - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -1361,7 +1362,7 @@ func UpdateChainConfigChangeset(e deployment.Environment, cfg UpdateChainConfigC proposers := map[uint64]string{cfg.HomeChainSelector: state.Chains[cfg.HomeChainSelector].ProposerMcm.Address().Hex()} inspectors := map[uint64]mcmssdk.Inspector{cfg.HomeChainSelector: mcmsevmsdk.NewInspector(e.Chains[cfg.HomeChainSelector].Client)} batchOp, err := proposalutils.BatchOperationForChain(cfg.HomeChainSelector, state.Chains[cfg.HomeChainSelector].CCIPHome.Address().Hex(), - tx.Data(), big.NewInt(0), string(CCIPHome), []string{}) + tx.Data(), big.NewInt(0), string(changeset.CCIPHome), []string{}) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to create batch operation: %w", err) } diff --git a/deployment/ccip/changeset/cs_ccip_home_test.go b/deployment/ccip/changeset/v1_6/cs_ccip_home_test.go similarity index 85% rename from deployment/ccip/changeset/cs_ccip_home_test.go rename to deployment/ccip/changeset/v1_6/cs_ccip_home_test.go index 9a2fbd49e36..254c69e37c1 100644 --- a/deployment/ccip/changeset/cs_ccip_home_test.go +++ b/deployment/ccip/changeset/v1_6/cs_ccip_home_test.go @@ -1,4 +1,4 @@ -package changeset_test +package v1_6_test import ( "math/big" @@ -21,6 +21,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -40,8 +41,8 @@ func TestInvalidOCR3Params(t *testing.T) { // no proposals to be made, timelock can be passed as nil here e.Env, err = commonchangeset.Apply(t, e.Env, nil, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployHomeChainChangeset), - changeset.DeployHomeChainConfig{ + deployment.CreateLegacyChangeSet(v1_6.DeployHomeChainChangeset), + v1_6.DeployHomeChainConfig{ HomeChainSel: e.HomeChainSel, RMNDynamicConfig: testhelpers.NewTestRMNDynamicConfig(), RMNStaticConfig: testhelpers.NewTestRMNStaticConfig(), @@ -52,13 +53,13 @@ func TestInvalidOCR3Params(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployChainContractsChangeset), - changeset.DeployChainContractsConfig{ + deployment.CreateLegacyChangeSet(v1_6.DeployChainContractsChangeset), + v1_6.DeployChainContractsConfig{ HomeChainSelector: e.HomeChainSel, - ContractParamsPerChain: map[uint64]changeset.ChainContractParams{ + ContractParamsPerChain: map[uint64]v1_6.ChainContractParams{ chain1: { - FeeQuoterParams: changeset.DefaultFeeQuoterParams(), - OffRampParams: changeset.DefaultOffRampParams(), + FeeQuoterParams: v1_6.DefaultFeeQuoterParams(), + OffRampParams: v1_6.DefaultOffRampParams(), }, }, }, @@ -70,9 +71,9 @@ func TestInvalidOCR3Params(t *testing.T) { require.NoError(t, err) nodes, err := deployment.NodeInfo(e.Env.NodeIDs, e.Env.Offchain) require.NoError(t, err) - params := changeset.DeriveCCIPOCRParams( - changeset.WithDefaultCommitOffChainConfig(e.FeedChainSel, nil), - changeset.WithDefaultExecuteOffChainConfig(nil), + params := v1_6.DeriveCCIPOCRParams( + v1_6.WithDefaultCommitOffChainConfig(e.FeedChainSel, nil), + v1_6.WithDefaultExecuteOffChainConfig(nil), ) // tweak params to have invalid config // make DeltaRound greater than DeltaProgress @@ -161,10 +162,10 @@ func Test_PromoteCandidate(t *testing.T) { }, }, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.PromoteCandidateChangeset), - changeset.PromoteCandidateChangesetConfig{ + deployment.CreateLegacyChangeSet(v1_6.PromoteCandidateChangeset), + v1_6.PromoteCandidateChangesetConfig{ HomeChainSelector: tenv.HomeChainSel, - PluginInfo: []changeset.PromoteCandidatePluginInfo{ + PluginInfo: []v1_6.PromoteCandidatePluginInfo{ { RemoteChainSelectors: []uint64{dest}, PluginType: types.PluginTypeCCIPCommit, @@ -259,18 +260,18 @@ func Test_SetCandidate(t *testing.T) { }, }, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.SetCandidateChangeset), - changeset.SetCandidateChangesetConfig{ - SetCandidateConfigBase: changeset.SetCandidateConfigBase{ + deployment.CreateLegacyChangeSet(v1_6.SetCandidateChangeset), + v1_6.SetCandidateChangesetConfig{ + SetCandidateConfigBase: v1_6.SetCandidateConfigBase{ HomeChainSelector: tenv.HomeChainSel, FeedChainSelector: tenv.FeedChainSel, MCMS: mcmsConfig, }, - PluginInfo: []changeset.SetCandidatePluginInfo{ + PluginInfo: []v1_6.SetCandidatePluginInfo{ { - OCRConfigPerRemoteChainSelector: map[uint64]changeset.CCIPOCRParams{ - dest: changeset.DeriveCCIPOCRParams( - changeset.WithDefaultCommitOffChainConfig( + OCRConfigPerRemoteChainSelector: map[uint64]v1_6.CCIPOCRParams{ + dest: v1_6.DeriveCCIPOCRParams( + v1_6.WithDefaultCommitOffChainConfig( tenv.FeedChainSel, tokenConfig.GetTokenInfo(logger.TestLogger(t), state.Chains[dest].LinkToken.Address(), @@ -280,11 +281,11 @@ func Test_SetCandidate(t *testing.T) { PluginType: types.PluginTypeCCIPCommit, }, { - OCRConfigPerRemoteChainSelector: map[uint64]changeset.CCIPOCRParams{ - dest: changeset.DeriveCCIPOCRParams( - changeset.WithDefaultExecuteOffChainConfig(nil), + OCRConfigPerRemoteChainSelector: map[uint64]v1_6.CCIPOCRParams{ + dest: v1_6.DeriveCCIPOCRParams( + v1_6.WithDefaultExecuteOffChainConfig(nil), // change the default config to make MessageVisibilityInterval != PermissionLessExecutionThresholdSeconds - changeset.WithOCRParamOverride(func(params *changeset.CCIPOCRParams) { + v1_6.WithOCRParamOverride(func(params *v1_6.CCIPOCRParams) { dCfg, err := state.Chains[dest].OffRamp.GetDynamicConfig(&bind.CallOpts{ Context: ctx, }) @@ -313,18 +314,18 @@ func Test_SetCandidate(t *testing.T) { }, }, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.SetCandidateChangeset), - changeset.SetCandidateChangesetConfig{ - SetCandidateConfigBase: changeset.SetCandidateConfigBase{ + deployment.CreateLegacyChangeSet(v1_6.SetCandidateChangeset), + v1_6.SetCandidateChangesetConfig{ + SetCandidateConfigBase: v1_6.SetCandidateConfigBase{ HomeChainSelector: tenv.HomeChainSel, FeedChainSelector: tenv.FeedChainSel, MCMS: mcmsConfig, }, - PluginInfo: []changeset.SetCandidatePluginInfo{ + PluginInfo: []v1_6.SetCandidatePluginInfo{ { - OCRConfigPerRemoteChainSelector: map[uint64]changeset.CCIPOCRParams{ - dest: changeset.DeriveCCIPOCRParams( - changeset.WithDefaultCommitOffChainConfig( + OCRConfigPerRemoteChainSelector: map[uint64]v1_6.CCIPOCRParams{ + dest: v1_6.DeriveCCIPOCRParams( + v1_6.WithDefaultCommitOffChainConfig( tenv.FeedChainSel, tokenConfig.GetTokenInfo(logger.TestLogger(t), state.Chains[dest].LinkToken.Address(), @@ -334,9 +335,9 @@ func Test_SetCandidate(t *testing.T) { PluginType: types.PluginTypeCCIPCommit, }, { - OCRConfigPerRemoteChainSelector: map[uint64]changeset.CCIPOCRParams{ - dest: changeset.DeriveCCIPOCRParams( - changeset.WithDefaultExecuteOffChainConfig(nil), + OCRConfigPerRemoteChainSelector: map[uint64]v1_6.CCIPOCRParams{ + dest: v1_6.DeriveCCIPOCRParams( + v1_6.WithDefaultExecuteOffChainConfig(nil), ), }, PluginType: types.PluginTypeCCIPExec, @@ -430,18 +431,18 @@ func Test_RevokeCandidate(t *testing.T) { }, }, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.SetCandidateChangeset), - changeset.SetCandidateChangesetConfig{ - SetCandidateConfigBase: changeset.SetCandidateConfigBase{ + deployment.CreateLegacyChangeSet(v1_6.SetCandidateChangeset), + v1_6.SetCandidateChangesetConfig{ + SetCandidateConfigBase: v1_6.SetCandidateConfigBase{ HomeChainSelector: tenv.HomeChainSel, FeedChainSelector: tenv.FeedChainSel, MCMS: mcmsConfig, }, - PluginInfo: []changeset.SetCandidatePluginInfo{ + PluginInfo: []v1_6.SetCandidatePluginInfo{ { - OCRConfigPerRemoteChainSelector: map[uint64]changeset.CCIPOCRParams{ - dest: changeset.DeriveCCIPOCRParams( - changeset.WithDefaultCommitOffChainConfig( + OCRConfigPerRemoteChainSelector: map[uint64]v1_6.CCIPOCRParams{ + dest: v1_6.DeriveCCIPOCRParams( + v1_6.WithDefaultCommitOffChainConfig( tenv.FeedChainSel, tokenConfig.GetTokenInfo(logger.TestLogger(t), state.Chains[dest].LinkToken.Address(), @@ -451,9 +452,9 @@ func Test_RevokeCandidate(t *testing.T) { PluginType: types.PluginTypeCCIPCommit, }, { - OCRConfigPerRemoteChainSelector: map[uint64]changeset.CCIPOCRParams{ - dest: changeset.DeriveCCIPOCRParams( - changeset.WithDefaultExecuteOffChainConfig(nil), + OCRConfigPerRemoteChainSelector: map[uint64]v1_6.CCIPOCRParams{ + dest: v1_6.DeriveCCIPOCRParams( + v1_6.WithDefaultExecuteOffChainConfig(nil), ), }, PluginType: types.PluginTypeCCIPExec, @@ -489,8 +490,8 @@ func Test_RevokeCandidate(t *testing.T) { }, }, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.RevokeCandidateChangeset), - changeset.RevokeCandidateChangesetConfig{ + deployment.CreateLegacyChangeSet(v1_6.RevokeCandidateChangeset), + v1_6.RevokeCandidateChangesetConfig{ HomeChainSelector: tenv.HomeChainSel, RemoteChainSelector: dest, PluginType: types.PluginTypeCCIPCommit, @@ -498,8 +499,8 @@ func Test_RevokeCandidate(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.RevokeCandidateChangeset), - changeset.RevokeCandidateChangesetConfig{ + deployment.CreateLegacyChangeSet(v1_6.RevokeCandidateChangeset), + v1_6.RevokeCandidateChangesetConfig{ HomeChainSelector: tenv.HomeChainSel, RemoteChainSelector: dest, PluginType: types.PluginTypeCCIPExec, @@ -604,11 +605,11 @@ func Test_UpdateChainConfigs(t *testing.T) { }, }, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateChainConfigChangeset), - changeset.UpdateChainConfigConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateChainConfigChangeset), + v1_6.UpdateChainConfigConfig{ HomeChainSelector: tenv.HomeChainSel, RemoteChainRemoves: []uint64{otherChain}, - RemoteChainAdds: make(map[uint64]changeset.ChainConfig), + RemoteChainAdds: make(map[uint64]v1_6.ChainConfig), MCMS: mcmsConfig, }, ), @@ -629,11 +630,11 @@ func Test_UpdateChainConfigs(t *testing.T) { }, }, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateChainConfigChangeset), - changeset.UpdateChainConfigConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateChainConfigChangeset), + v1_6.UpdateChainConfigConfig{ HomeChainSelector: tenv.HomeChainSel, RemoteChainRemoves: []uint64{}, - RemoteChainAdds: map[uint64]changeset.ChainConfig{ + RemoteChainAdds: map[uint64]v1_6.ChainConfig{ otherChain: { EncodableChainConfig: chainconfig.ChainConfig{ GasPriceDeviationPPB: cciptypes.BigInt{Int: big.NewInt(globals.GasPriceDeviationPPB)}, diff --git a/deployment/ccip/changeset/cs_chain_contracts.go b/deployment/ccip/changeset/v1_6/cs_chain_contracts.go similarity index 94% rename from deployment/ccip/changeset/cs_chain_contracts.go rename to deployment/ccip/changeset/v1_6/cs_chain_contracts.go index af9aae04338..bd45ea24e94 100644 --- a/deployment/ccip/changeset/cs_chain_contracts.go +++ b/deployment/ccip/changeset/v1_6/cs_chain_contracts.go @@ -1,4 +1,4 @@ -package changeset +package v1_6 import ( "bytes" @@ -19,6 +19,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" commonState "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" @@ -69,7 +70,7 @@ var ( type UpdateNonceManagerConfig struct { UpdatesByChain map[uint64]NonceManagerUpdate // source -> dest -> update - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } type NonceManagerUpdate struct { @@ -89,7 +90,7 @@ type PreviousRampCfg struct { } func (cfg UpdateNonceManagerConfig) Validate(e deployment.Environment) error { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return err } @@ -144,7 +145,7 @@ func UpdateNonceManagersChangeset(e deployment.Environment, cfg UpdateNonceManag if err := cfg.Validate(e); err != nil { return deployment.ChangesetOutput{}, err } - s, err := LoadOnchainState(e) + s, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -211,7 +212,7 @@ func UpdateNonceManagersChangeset(e deployment.Environment, cfg UpdateNonceManag mcmsTransactions := make([]mcmstypes.Transaction, 0) if authTx != nil { mcmsTx, err := proposalutils.TransactionForChain(chainSel, nm.Address().Hex(), authTx.Data(), big.NewInt(0), - string(NonceManager), []string{}) + string(changeset.NonceManager), []string{}) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to create transaction for chain %d: %w", chainSel, err) } @@ -220,7 +221,7 @@ func UpdateNonceManagersChangeset(e deployment.Environment, cfg UpdateNonceManag } if prevRampsTx != nil { mcmsTx, err := proposalutils.TransactionForChain(chainSel, nm.Address().Hex(), prevRampsTx.Data(), big.NewInt(0), - string(NonceManager), []string{}) + string(changeset.NonceManager), []string{}) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to create transaction for chain %d: %w", chainSel, err) } @@ -276,17 +277,17 @@ type UpdateOnRampDestsConfig struct { // Disallow mixing MCMS/non-MCMS per chain for simplicity. // (can still be achieved by calling this function multiple times) - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } func (cfg UpdateOnRampDestsConfig) Validate(e deployment.Environment) error { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return err } supportedChains := state.SupportedChains() for chainSel, updates := range cfg.UpdatesByChain { - if err := ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { + if err := changeset.ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { return err } chainState, ok := state.Chains[chainSel] @@ -329,7 +330,7 @@ func UpdateOnRampsDestsChangeset(e deployment.Environment, cfg UpdateOnRampDests if err := cfg.Validate(e); err != nil { return deployment.ChangesetOutput{}, err } - s, err := LoadOnchainState(e) + s, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -374,7 +375,7 @@ func UpdateOnRampsDestsChangeset(e deployment.Environment, cfg UpdateOnRampDests } batchOperation, err := proposalutils.BatchOperationForChain(chainSel, onRamp.Address().Hex(), tx.Data(), - big.NewInt(0), string(OnRamp), []string{}) + big.NewInt(0), string(changeset.OnRamp), []string{}) if err != nil { return deployment.ChangesetOutput{}, err } @@ -419,12 +420,12 @@ type UpdateOnRampDynamicConfig struct { UpdatesByChain map[uint64]OnRampDynamicConfigUpdate // Disallow mixing MCMS/non-MCMS per chain for simplicity. // (can still be achieved by calling this function multiple times) - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } -func (cfg UpdateOnRampDynamicConfig) Validate(e deployment.Environment, state CCIPOnChainState) error { +func (cfg UpdateOnRampDynamicConfig) Validate(e deployment.Environment, state changeset.CCIPOnChainState) error { for chainSel, config := range cfg.UpdatesByChain { - if err := ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { + if err := changeset.ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { return err } if err := commoncs.ValidateOwnership(e.GetContext(), cfg.MCMS != nil, e.Chains[chainSel].DeployerKey.From, state.Chains[chainSel].Timelock.Address(), state.Chains[chainSel].OnRamp); err != nil { @@ -441,7 +442,7 @@ func (cfg UpdateOnRampDynamicConfig) Validate(e deployment.Environment, state CC } func UpdateOnRampDynamicConfigChangeset(e deployment.Environment, cfg UpdateOnRampDynamicConfig) (deployment.ChangesetOutput, error) { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -489,7 +490,7 @@ func UpdateOnRampDynamicConfigChangeset(e deployment.Environment, cfg UpdateOnRa } batchOperation, err := proposalutils.BatchOperationForChain(chainSel, onRamp.Address().Hex(), tx.Data(), - big.NewInt(0), string(OnRamp), []string{}) + big.NewInt(0), string(changeset.OnRamp), []string{}) if err != nil { return deployment.ChangesetOutput{}, err } @@ -529,16 +530,16 @@ type UpdateOnRampAllowListConfig struct { UpdatesByChain map[uint64]map[uint64]OnRampAllowListUpdate // Disallow mixing MCMS/non-MCMS per chain for simplicity. // (can still be achieved by calling this function multiple times) - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } func (cfg UpdateOnRampAllowListConfig) Validate(env deployment.Environment) error { - state, err := LoadOnchainState(env) + state, err := changeset.LoadOnchainState(env) if err != nil { return fmt.Errorf("failed to load onchain state: %w", err) } for srcSel, updates := range cfg.UpdatesByChain { - if err := ValidateChain(env, state, srcSel, cfg.MCMS); err != nil { + if err := changeset.ValidateChain(env, state, srcSel, cfg.MCMS); err != nil { return err } onRamp := state.Chains[srcSel].OnRamp @@ -566,7 +567,7 @@ func (cfg UpdateOnRampAllowListConfig) Validate(env deployment.Environment) erro } } for destSel, update := range updates { - if err := ValidateChain(env, state, srcSel, cfg.MCMS); err != nil { + if err := changeset.ValidateChain(env, state, srcSel, cfg.MCMS); err != nil { return err } if len(update.AddedAllowlistedSenders) > 0 && !update.AllowListEnabled { @@ -586,7 +587,7 @@ func UpdateOnRampAllowListChangeset(e deployment.Environment, cfg UpdateOnRampAl if err := cfg.Validate(e); err != nil { return deployment.ChangesetOutput{}, err } - onchain, err := LoadOnchainState(e) + onchain, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -647,7 +648,7 @@ func UpdateOnRampAllowListChangeset(e deployment.Environment, cfg UpdateOnRampAl } batchOperation, err := proposalutils.BatchOperationForChain(srcSel, onRamp.Address().Hex(), tx.Data(), - big.NewInt(0), string(OnRamp), []string{}) + big.NewInt(0), string(changeset.OnRamp), []string{}) if err != nil { return deployment.ChangesetOutput{}, err } @@ -683,12 +684,12 @@ func UpdateOnRampAllowListChangeset(e deployment.Environment, cfg UpdateOnRampAl type WithdrawOnRampFeeTokensConfig struct { FeeTokensByChain map[uint64][]common.Address - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } -func (cfg WithdrawOnRampFeeTokensConfig) Validate(e deployment.Environment, state CCIPOnChainState) error { +func (cfg WithdrawOnRampFeeTokensConfig) Validate(e deployment.Environment, state changeset.CCIPOnChainState) error { for chainSel, feeTokens := range cfg.FeeTokensByChain { - if err := ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { + if err := changeset.ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { return err } if err := commoncs.ValidateOwnership(e.GetContext(), cfg.MCMS != nil, e.Chains[chainSel].DeployerKey.From, state.Chains[chainSel].Timelock.Address(), state.Chains[chainSel].OnRamp); err != nil { @@ -722,7 +723,7 @@ func (cfg WithdrawOnRampFeeTokensConfig) Validate(e deployment.Environment, stat } func WithdrawOnRampFeeTokensChangeset(e deployment.Environment, cfg WithdrawOnRampFeeTokensConfig) (deployment.ChangesetOutput, error) { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -749,7 +750,7 @@ func WithdrawOnRampFeeTokensChangeset(e deployment.Environment, cfg WithdrawOnRa } batchOperation, err := proposalutils.BatchOperationForChain(chainSel, onRamp.Address().Hex(), tx.Data(), - big.NewInt(0), string(OnRamp), []string{}) + big.NewInt(0), string(changeset.OnRamp), []string{}) if err != nil { return deployment.ChangesetOutput{}, err } @@ -785,7 +786,7 @@ func WithdrawOnRampFeeTokensChangeset(e deployment.Environment, cfg WithdrawOnRa type UpdateFeeQuoterPricesConfig struct { PricesByChain map[uint64]FeeQuoterPriceUpdatePerSource // source -> PriceDetails - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } type FeeQuoterPriceUpdatePerSource struct { @@ -794,7 +795,7 @@ type FeeQuoterPriceUpdatePerSource struct { } func (cfg UpdateFeeQuoterPricesConfig) Validate(e deployment.Environment) error { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return err } @@ -872,7 +873,7 @@ func UpdateFeeQuoterPricesChangeset(e deployment.Environment, cfg UpdateFeeQuote if err := cfg.Validate(e); err != nil { return deployment.ChangesetOutput{}, err } - s, err := LoadOnchainState(e) + s, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -916,7 +917,7 @@ func UpdateFeeQuoterPricesChangeset(e deployment.Environment, cfg UpdateFeeQuote } batchOperation, err := proposalutils.BatchOperationForChain(chainSel, fq.Address().Hex(), tx.Data(), - big.NewInt(0), string(FeeQuoter), []string{}) + big.NewInt(0), string(changeset.FeeQuoter), []string{}) if err != nil { return deployment.ChangesetOutput{}, err } @@ -955,11 +956,11 @@ type UpdateFeeQuoterDestsConfig struct { UpdatesByChain map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig // Disallow mixing MCMS/non-MCMS per chain for simplicity. // (can still be achieved by calling this function multiple times) - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } func (cfg UpdateFeeQuoterDestsConfig) Validate(e deployment.Environment) error { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return err } @@ -1003,7 +1004,7 @@ func UpdateFeeQuoterDestsChangeset(e deployment.Environment, cfg UpdateFeeQuoter if err := cfg.Validate(e); err != nil { return deployment.ChangesetOutput{}, err } - s, err := LoadOnchainState(e) + s, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -1037,7 +1038,7 @@ func UpdateFeeQuoterDestsChangeset(e deployment.Environment, cfg UpdateFeeQuoter } } else { batchOperation, err := proposalutils.BatchOperationForChain(chainSel, fq.Address().Hex(), tx.Data(), - big.NewInt(0), string(FeeQuoter), []string{}) + big.NewInt(0), string(changeset.FeeQuoter), []string{}) if err != nil { return deployment.ChangesetOutput{}, err } @@ -1082,10 +1083,10 @@ type UpdateOffRampSourcesConfig struct { // UpdatesByChain is a mapping from dest chain -> source chain -> source chain // update on the dest chain offramp. UpdatesByChain map[uint64]map[uint64]OffRampSourceUpdate - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } -func (cfg UpdateOffRampSourcesConfig) Validate(e deployment.Environment, state CCIPOnChainState) error { +func (cfg UpdateOffRampSourcesConfig) Validate(e deployment.Environment, state changeset.CCIPOnChainState) error { supportedChains := state.SupportedChains() for chainSel, updates := range cfg.UpdatesByChain { chainState, ok := state.Chains[chainSel] @@ -1115,7 +1116,7 @@ func (cfg UpdateOffRampSourcesConfig) Validate(e deployment.Environment, state C return fmt.Errorf("cannot update offramp source to the same chain %d", source) } - if err := state.ValidateRamp(source, OnRamp); err != nil { + if err := state.ValidateRamp(source, changeset.OnRamp); err != nil { return err } } @@ -1125,7 +1126,7 @@ func (cfg UpdateOffRampSourcesConfig) Validate(e deployment.Environment, state C // UpdateOffRampSourcesChangeset updates the offramp sources for each offramp. func UpdateOffRampSourcesChangeset(e deployment.Environment, cfg UpdateOffRampSourcesConfig) (deployment.ChangesetOutput, error) { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -1184,7 +1185,7 @@ func UpdateOffRampSourcesChangeset(e deployment.Environment, cfg UpdateOffRampSo } batchOperation, err := proposalutils.BatchOperationForChain(chainSel, offRamp.Address().Hex(), tx.Data(), - big.NewInt(0), string(OffRamp), []string{}) + big.NewInt(0), string(changeset.OffRamp), []string{}) if err != nil { return deployment.ChangesetOutput{}, err } @@ -1228,13 +1229,13 @@ type UpdateRouterRampsConfig struct { // on all chains. Disallow mixing test router/non-test router per chain for simplicity. TestRouter bool UpdatesByChain map[uint64]RouterUpdates - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } -func (cfg UpdateRouterRampsConfig) Validate(e deployment.Environment, state CCIPOnChainState) error { +func (cfg UpdateRouterRampsConfig) Validate(e deployment.Environment, state changeset.CCIPOnChainState) error { supportedChains := state.SupportedChains() for chainSel, update := range cfg.UpdatesByChain { - if err := ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { + if err := changeset.ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { return err } chainState, ok := state.Chains[chainSel] @@ -1268,7 +1269,7 @@ func (cfg UpdateRouterRampsConfig) Validate(e deployment.Environment, state CCIP if source == chainSel { return fmt.Errorf("cannot update offramp source to the same chain %d", source) } - if err := state.ValidateRamp(source, OnRamp); err != nil { + if err := state.ValidateRamp(source, changeset.OnRamp); err != nil { return err } } @@ -1280,7 +1281,7 @@ func (cfg UpdateRouterRampsConfig) Validate(e deployment.Environment, state CCIP if destination == chainSel { return fmt.Errorf("cannot update onRamp dest to the same chain %d", destination) } - if err := state.ValidateRamp(destination, OffRamp); err != nil { + if err := state.ValidateRamp(destination, changeset.OffRamp); err != nil { return err } } @@ -1296,7 +1297,7 @@ func (cfg UpdateRouterRampsConfig) Validate(e deployment.Environment, state CCIP // on all chains to support the new chain through the test router first. Once tested, // Enable the new destination on the real router. func UpdateRouterRampsChangeset(e deployment.Environment, cfg UpdateRouterRampsConfig) (deployment.ChangesetOutput, error) { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -1364,7 +1365,7 @@ func UpdateRouterRampsChangeset(e deployment.Environment, cfg UpdateRouterRampsC } batchOperation, err := proposalutils.BatchOperationForChain(chainSel, routerC.Address().Hex(), tx.Data(), - big.NewInt(0), string(Router), []string{}) + big.NewInt(0), string(changeset.Router), []string{}) if err != nil { return deployment.ChangesetOutput{}, err } @@ -1402,11 +1403,11 @@ type SetOCR3OffRampConfig struct { HomeChainSel uint64 RemoteChainSels []uint64 CCIPHomeConfigType globals.ConfigType - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } -func (c SetOCR3OffRampConfig) Validate(e deployment.Environment, state CCIPOnChainState) error { - if err := ValidateChain(e, state, c.HomeChainSel, c.MCMS); err != nil { +func (c SetOCR3OffRampConfig) Validate(e deployment.Environment, state changeset.CCIPOnChainState) error { + if err := changeset.ValidateChain(e, state, c.HomeChainSel, c.MCMS); err != nil { return err } if c.CCIPHomeConfigType != globals.ConfigTypeActive && @@ -1421,7 +1422,7 @@ func (c SetOCR3OffRampConfig) Validate(e deployment.Environment, state CCIPOnCha return nil } -func (c SetOCR3OffRampConfig) validateRemoteChain(e *deployment.Environment, state *CCIPOnChainState, chainSelector uint64) error { +func (c SetOCR3OffRampConfig) validateRemoteChain(e *deployment.Environment, state *changeset.CCIPOnChainState, chainSelector uint64) error { family, err := chain_selectors.GetSelectorFamily(chainSelector) if err != nil { return err @@ -1468,7 +1469,7 @@ func (c SetOCR3OffRampConfig) validateRemoteChain(e *deployment.Environment, sta // Multichain is especially helpful for NOP rotations where we have // to touch all the chain to change signers. func SetOCR3OffRampChangeset(e deployment.Environment, cfg SetOCR3OffRampConfig) (deployment.ChangesetOutput, error) { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -1518,7 +1519,7 @@ func SetOCR3OffRampChangeset(e deployment.Environment, cfg SetOCR3OffRampConfig) } batchOperation, err := proposalutils.BatchOperationForChain(remote, offRamp.Address().Hex(), tx.Data(), - big.NewInt(0), string(OffRamp), []string{}) + big.NewInt(0), string(changeset.OffRamp), []string{}) if err != nil { return deployment.ChangesetOutput{}, err } @@ -1555,16 +1556,16 @@ func SetOCR3OffRampChangeset(e deployment.Environment, cfg SetOCR3OffRampConfig) type UpdateDynamicConfigOffRampConfig struct { Updates map[uint64]OffRampParams - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } func (cfg UpdateDynamicConfigOffRampConfig) Validate(e deployment.Environment) error { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return err } for chainSel, params := range cfg.Updates { - if err := ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { + if err := changeset.ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { return fmt.Errorf("chain %d: %w", chainSel, err) } if state.Chains[chainSel].OffRamp == nil { @@ -1598,7 +1599,7 @@ func UpdateDynamicConfigOffRampChangeset(e deployment.Environment, cfg UpdateDyn if err := cfg.Validate(e); err != nil { return deployment.ChangesetOutput{}, err } - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -1632,7 +1633,7 @@ func UpdateDynamicConfigOffRampChangeset(e deployment.Environment, cfg UpdateDyn } batchOperation, err := proposalutils.BatchOperationForChain(chainSel, offRamp.Address().Hex(), tx.Data(), - big.NewInt(0), string(OffRamp), []string{}) + big.NewInt(0), string(changeset.OffRamp), []string{}) if err != nil { return deployment.ChangesetOutput{}, err } @@ -1760,16 +1761,16 @@ func DefaultFeeQuoterDestChainConfig(configEnabled bool, destChainSelector ...ui type ApplyFeeTokensUpdatesConfig struct { UpdatesByChain map[uint64]ApplyFeeTokensUpdatesConfigPerChain - MCMSConfig *MCMSConfig + MCMSConfig *changeset.MCMSConfig } type ApplyFeeTokensUpdatesConfigPerChain struct { - TokensToRemove []TokenSymbol - TokensToAdd []TokenSymbol + TokensToRemove []changeset.TokenSymbol + TokensToAdd []changeset.TokenSymbol } func (cfg ApplyFeeTokensUpdatesConfig) Validate(e deployment.Environment) error { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return err } @@ -1779,7 +1780,7 @@ func (cfg ApplyFeeTokensUpdatesConfig) Validate(e deployment.Environment) error } } for chainSel, updates := range cfg.UpdatesByChain { - if err := ValidateChain(e, state, chainSel, cfg.MCMSConfig); err != nil { + if err := changeset.ValidateChain(e, state, chainSel, cfg.MCMSConfig); err != nil { return err } chainState := state.Chains[chainSel] @@ -1820,7 +1821,7 @@ func ApplyFeeTokensUpdatesFeeQuoterChangeset(e deployment.Environment, cfg Apply if err := cfg.Validate(e); err != nil { return deployment.ChangesetOutput{}, err } - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -1855,7 +1856,7 @@ func ApplyFeeTokensUpdatesFeeQuoterChangeset(e deployment.Environment, cfg Apply return deployment.ChangesetOutput{}, err } op, err := proposalutils.BatchOperationForChain( - chainSel, fq.Address().String(), tx.Data(), big.NewInt(0), FeeQuoter.String(), nil) + chainSel, fq.Address().String(), tx.Data(), big.NewInt(0), changeset.FeeQuoter.String(), nil) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("error creating batch operation for chain %d: %w", chainSel, err) } @@ -1892,16 +1893,16 @@ func ApplyFeeTokensUpdatesFeeQuoterChangeset(e deployment.Environment, cfg Apply type UpdateTokenPriceFeedsConfig struct { Updates map[uint64][]UpdateTokenPriceFeedsConfigPerChain FeedChainSelector uint64 - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } type UpdateTokenPriceFeedsConfigPerChain struct { - SourceToken TokenSymbol + SourceToken changeset.TokenSymbol IsEnabled bool } func (cfg UpdateTokenPriceFeedsConfig) Validate(e deployment.Environment) error { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return err } @@ -1910,7 +1911,7 @@ func (cfg UpdateTokenPriceFeedsConfig) Validate(e deployment.Environment) error return fmt.Errorf("feed chain %d not found in state", cfg.FeedChainSelector) } for chainSel, updates := range cfg.Updates { - if err := ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { + if err := changeset.ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { return err } chainState := state.Chains[chainSel] @@ -1954,7 +1955,7 @@ func UpdateTokenPriceFeedsFeeQuoterChangeset(e deployment.Environment, cfg Updat return deployment.ChangesetOutput{}, err } - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -2008,7 +2009,7 @@ func UpdateTokenPriceFeedsFeeQuoterChangeset(e deployment.Environment, cfg Updat return deployment.ChangesetOutput{}, err } op, err := proposalutils.BatchOperationForChain( - chainSel, fq.Address().String(), tx.Data(), big.NewInt(0), FeeQuoter.String(), nil) + chainSel, fq.Address().String(), tx.Data(), big.NewInt(0), changeset.FeeQuoter.String(), nil) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("error creating batch operation for chain %d: %w", chainSel, err) } @@ -2044,16 +2045,16 @@ func UpdateTokenPriceFeedsFeeQuoterChangeset(e deployment.Environment, cfg Updat type PremiumMultiplierWeiPerEthUpdatesConfig struct { Updates map[uint64][]PremiumMultiplierWeiPerEthUpdatesConfigPerChain - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } func (cfg PremiumMultiplierWeiPerEthUpdatesConfig) Validate(e deployment.Environment) error { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return err } for chainSel, updates := range cfg.Updates { - if err := ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { + if err := changeset.ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { return err } chainState := state.Chains[chainSel] @@ -2086,7 +2087,7 @@ func (cfg PremiumMultiplierWeiPerEthUpdatesConfig) Validate(e deployment.Environ } type PremiumMultiplierWeiPerEthUpdatesConfigPerChain struct { - Token TokenSymbol + Token changeset.TokenSymbol PremiumMultiplierWeiPerEth uint64 } @@ -2097,7 +2098,7 @@ func ApplyPremiumMultiplierWeiPerEthUpdatesFeeQuoterChangeset(e deployment.Envir if err := cfg.Validate(e); err != nil { return deployment.ChangesetOutput{}, err } - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -2132,7 +2133,7 @@ func ApplyPremiumMultiplierWeiPerEthUpdatesFeeQuoterChangeset(e deployment.Envir return deployment.ChangesetOutput{}, err } op, err := proposalutils.BatchOperationForChain( - chainSel, fq.Address().String(), tx.Data(), big.NewInt(0), FeeQuoter.String(), nil) + chainSel, fq.Address().String(), tx.Data(), big.NewInt(0), changeset.FeeQuoter.String(), nil) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("error creating batch operation for chain %d: %w", chainSel, err) } @@ -2168,16 +2169,16 @@ func ApplyPremiumMultiplierWeiPerEthUpdatesFeeQuoterChangeset(e deployment.Envir type ApplyTokenTransferFeeConfigUpdatesConfig struct { UpdatesByChain map[uint64]ApplyTokenTransferFeeConfigUpdatesConfigPerChain - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } func (cfg ApplyTokenTransferFeeConfigUpdatesConfig) Validate(e deployment.Environment) error { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return err } for chainSel, updates := range cfg.UpdatesByChain { - if err := ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { + if err := changeset.ValidateChain(e, state, chainSel, cfg.MCMS); err != nil { return err } chainState := state.Chains[chainSel] @@ -2203,7 +2204,7 @@ func (cfg ApplyTokenTransferFeeConfigUpdatesConfig) Validate(e deployment.Enviro return fmt.Errorf("dest bytes overhead must be at least %d for token %s in chain %d", globals.CCIPLockOrBurnV1RetBytes, token, chainSel) } } - if err := ValidateChain(e, state, update.DestChain, nil); err != nil { + if err := changeset.ValidateChain(e, state, update.DestChain, nil); err != nil { return fmt.Errorf("dest chain %d: %w", update.DestChain, err) } } @@ -2214,7 +2215,7 @@ func (cfg ApplyTokenTransferFeeConfigUpdatesConfig) Validate(e deployment.Enviro if _, ok := tokenAddresses[remove.Token]; !ok { return fmt.Errorf("token %s not found in state for chain %d", remove.Token, chainSel) } - if err := ValidateChain(e, state, remove.DestChain, nil); err != nil { + if err := changeset.ValidateChain(e, state, remove.DestChain, nil); err != nil { return fmt.Errorf("dest chain %d: %w", remove.DestChain, err) } _, err := chainState.FeeQuoter.GetTokenTransferFeeConfig(&bind.CallOpts{ @@ -2245,12 +2246,12 @@ type ApplyTokenTransferFeeConfigUpdatesConfigPerChain struct { type TokenTransferFeeConfigArg struct { DestChain uint64 - TokenTransferFeeConfigPerToken map[TokenSymbol]fee_quoter.FeeQuoterTokenTransferFeeConfig + TokenTransferFeeConfigPerToken map[changeset.TokenSymbol]fee_quoter.FeeQuoterTokenTransferFeeConfig } type TokenTransferFeeConfigRemoveArg struct { DestChain uint64 - Token TokenSymbol + Token changeset.TokenSymbol } // ApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset applies the token transfer fee config updates for provided tokens to the fee quoter. @@ -2263,7 +2264,7 @@ func ApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset(e deployment.Environme if err := cfg.Validate(e); err != nil { return deployment.ChangesetOutput{}, err } - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -2312,7 +2313,7 @@ func ApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset(e deployment.Environme return deployment.ChangesetOutput{}, err } op, err := proposalutils.BatchOperationForChain( - chainSel, fq.Address().String(), tx.Data(), big.NewInt(0), FeeQuoter.String(), nil) + chainSel, fq.Address().String(), tx.Data(), big.NewInt(0), changeset.FeeQuoter.String(), nil) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("error creating batch operation for chain %d: %w", chainSel, err) } diff --git a/deployment/ccip/changeset/cs_chain_contracts_test.go b/deployment/ccip/changeset/v1_6/cs_chain_contracts_test.go similarity index 87% rename from deployment/ccip/changeset/cs_chain_contracts_test.go rename to deployment/ccip/changeset/v1_6/cs_chain_contracts_test.go index 54ce6e6bbc8..b8430355012 100644 --- a/deployment/ccip/changeset/cs_chain_contracts_test.go +++ b/deployment/ccip/changeset/v1_6/cs_chain_contracts_test.go @@ -1,4 +1,4 @@ -package changeset_test +package v1_6_test import ( "math/big" @@ -17,15 +17,16 @@ import ( "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers/v1_5" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" @@ -70,9 +71,9 @@ func TestUpdateOnRampsDests(t *testing.T) { } _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateOnRampsDestsChangeset), - changeset.UpdateOnRampDestsConfig{ - UpdatesByChain: map[uint64]map[uint64]changeset.OnRampDestinationUpdate{ + deployment.CreateLegacyChangeSet(v1_6.UpdateOnRampsDestsChangeset), + v1_6.UpdateOnRampDestsConfig{ + UpdatesByChain: map[uint64]map[uint64]v1_6.OnRampDestinationUpdate{ source: { dest: { IsEnabled: true, @@ -146,9 +147,9 @@ func TestUpdateOnRampDynamicConfig(t *testing.T) { } _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateOnRampDynamicConfigChangeset), - changeset.UpdateOnRampDynamicConfig{ - UpdatesByChain: map[uint64]changeset.OnRampDynamicConfigUpdate{ + deployment.CreateLegacyChangeSet(v1_6.UpdateOnRampDynamicConfigChangeset), + v1_6.UpdateOnRampDynamicConfig{ + UpdatesByChain: map[uint64]v1_6.OnRampDynamicConfigUpdate{ source: { FeeAggregator: common.HexToAddress("0x1002"), }, @@ -214,9 +215,9 @@ func TestUpdateOnRampAllowList(t *testing.T) { } _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateOnRampAllowListChangeset), - changeset.UpdateOnRampAllowListConfig{ - UpdatesByChain: map[uint64]map[uint64]changeset.OnRampAllowListUpdate{ + deployment.CreateLegacyChangeSet(v1_6.UpdateOnRampAllowListChangeset), + v1_6.UpdateOnRampAllowListConfig{ + UpdatesByChain: map[uint64]map[uint64]v1_6.OnRampAllowListUpdate{ source: { dest: { AllowListEnabled: true, @@ -344,8 +345,8 @@ func TestWithdrawOnRampFeeTokens(t *testing.T) { _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.WithdrawOnRampFeeTokensChangeset), - changeset.WithdrawOnRampFeeTokensConfig{ + deployment.CreateLegacyChangeSet(v1_6.WithdrawOnRampFeeTokensChangeset), + v1_6.WithdrawOnRampFeeTokensConfig{ FeeTokensByChain: map[uint64][]common.Address{ source: {linkToken.Address(), weth9.Address()}, dest: {state.Chains[dest].LinkToken.Address(), state.Chains[dest].Weth9.Address()}, @@ -404,9 +405,9 @@ func TestUpdateOffRampsSources(t *testing.T) { } _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateOffRampSourcesChangeset), - changeset.UpdateOffRampSourcesConfig{ - UpdatesByChain: map[uint64]map[uint64]changeset.OffRampSourceUpdate{ + deployment.CreateLegacyChangeSet(v1_6.UpdateOffRampSourcesChangeset), + v1_6.UpdateOffRampSourcesConfig{ + UpdatesByChain: map[uint64]map[uint64]v1_6.OffRampSourceUpdate{ source: { dest: { IsEnabled: true, @@ -479,13 +480,13 @@ func TestUpdateFQDests(t *testing.T) { } } - fqCfg1 := changeset.DefaultFeeQuoterDestChainConfig(true) - fqCfg2 := changeset.DefaultFeeQuoterDestChainConfig(true) + fqCfg1 := v1_6.DefaultFeeQuoterDestChainConfig(true) + fqCfg2 := v1_6.DefaultFeeQuoterDestChainConfig(true) fqCfg2.DestGasOverhead = 1000 _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterDestsChangeset), - changeset.UpdateFeeQuoterDestsConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateFeeQuoterDestsChangeset), + v1_6.UpdateFeeQuoterDestsConfig{ UpdatesByChain: map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig{ source: { dest: fqCfg1, @@ -550,10 +551,10 @@ func TestUpdateRouterRamps(t *testing.T) { // Updates test router. _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateRouterRampsChangeset), - changeset.UpdateRouterRampsConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateRouterRampsChangeset), + v1_6.UpdateRouterRampsConfig{ TestRouter: true, - UpdatesByChain: map[uint64]changeset.RouterUpdates{ + UpdatesByChain: map[uint64]v1_6.RouterUpdates{ source: { OffRampUpdates: map[uint64]bool{ dest: true, @@ -625,9 +626,9 @@ func TestUpdateDynamicConfigOffRampChangeset(t *testing.T) { msgInterceptor := utils.RandomAddress() _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateDynamicConfigOffRampChangeset), - changeset.UpdateDynamicConfigOffRampConfig{ - Updates: map[uint64]changeset.OffRampParams{ + deployment.CreateLegacyChangeSet(v1_6.UpdateDynamicConfigOffRampChangeset), + v1_6.UpdateDynamicConfigOffRampConfig{ + Updates: map[uint64]v1_6.OffRampParams{ source: { PermissionLessExecutionThresholdSeconds: uint32(2 * 60 * 60), MessageInterceptor: msgInterceptor, @@ -685,9 +686,9 @@ func TestUpdateNonceManagersCS(t *testing.T) { _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateNonceManagersChangeset), - changeset.UpdateNonceManagerConfig{ - UpdatesByChain: map[uint64]changeset.NonceManagerUpdate{ + deployment.CreateLegacyChangeSet(v1_6.UpdateNonceManagersChangeset), + v1_6.UpdateNonceManagerConfig{ + UpdatesByChain: map[uint64]v1_6.NonceManagerUpdate{ source: { RemovedAuthCallers: []common.Address{state.Chains[source].OnRamp.Address()}, }, @@ -743,11 +744,11 @@ func TestUpdateNonceManagersCSApplyPreviousRampsUpdates(t *testing.T) { // it should fail _, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateNonceManagersChangeset), - changeset.UpdateNonceManagerConfig{ - UpdatesByChain: map[uint64]changeset.NonceManagerUpdate{ + deployment.CreateLegacyChangeSet(v1_6.UpdateNonceManagersChangeset), + v1_6.UpdateNonceManagerConfig{ + UpdatesByChain: map[uint64]v1_6.NonceManagerUpdate{ srcChain.Selector: { - PreviousRampsArgs: []changeset.PreviousRampCfg{ + PreviousRampsArgs: []v1_6.PreviousRampCfg{ { RemoteChainSelector: destChain.Selector, }, @@ -764,11 +765,11 @@ func TestUpdateNonceManagersCSApplyPreviousRampsUpdates(t *testing.T) { // it should fail again as there is no offramp for the source chain _, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateNonceManagersChangeset), - changeset.UpdateNonceManagerConfig{ - UpdatesByChain: map[uint64]changeset.NonceManagerUpdate{ + deployment.CreateLegacyChangeSet(v1_6.UpdateNonceManagersChangeset), + v1_6.UpdateNonceManagerConfig{ + UpdatesByChain: map[uint64]v1_6.NonceManagerUpdate{ srcChain.Selector: { - PreviousRampsArgs: []changeset.PreviousRampCfg{ + PreviousRampsArgs: []v1_6.PreviousRampCfg{ { RemoteChainSelector: destChain.Selector, }, @@ -783,11 +784,11 @@ func TestUpdateNonceManagersCSApplyPreviousRampsUpdates(t *testing.T) { // Now apply the update with AllowEmptyOffRamp and it should pass _, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateNonceManagersChangeset), - changeset.UpdateNonceManagerConfig{ - UpdatesByChain: map[uint64]changeset.NonceManagerUpdate{ + deployment.CreateLegacyChangeSet(v1_6.UpdateNonceManagersChangeset), + v1_6.UpdateNonceManagerConfig{ + UpdatesByChain: map[uint64]v1_6.NonceManagerUpdate{ srcChain.Selector: { - PreviousRampsArgs: []changeset.PreviousRampCfg{ + PreviousRampsArgs: []v1_6.PreviousRampCfg{ { RemoteChainSelector: destChain.Selector, AllowEmptyOffRamp: true, @@ -808,19 +809,19 @@ func TestSetOCR3ConfigValidations(t *testing.T) { envNodes, err := deployment.NodeInfo(e.Env.NodeIDs, e.Env.Offchain) require.NoError(t, err) allChains := e.Env.AllChainSelectors() - evmContractParams := make(map[uint64]changeset.ChainContractParams) + evmContractParams := make(map[uint64]v1_6.ChainContractParams) for _, chain := range allChains { - evmContractParams[chain] = changeset.ChainContractParams{ - FeeQuoterParams: changeset.DefaultFeeQuoterParams(), - OffRampParams: changeset.DefaultOffRampParams(), + evmContractParams[chain] = v1_6.ChainContractParams{ + FeeQuoterParams: v1_6.DefaultFeeQuoterParams(), + OffRampParams: v1_6.DefaultOffRampParams(), } } var apps []commonchangeset.ConfiguredChangeSet // now deploy contracts apps = append(apps, []commonchangeset.ConfiguredChangeSet{ commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployHomeChainChangeset), - changeset.DeployHomeChainConfig{ + deployment.CreateLegacyChangeSet(v1_6.DeployHomeChainChangeset), + v1_6.DeployHomeChainConfig{ HomeChainSel: e.HomeChainSel, RMNDynamicConfig: testhelpers.NewTestRMNDynamicConfig(), RMNStaticConfig: testhelpers.NewTestRMNStaticConfig(), @@ -831,8 +832,8 @@ func TestSetOCR3ConfigValidations(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployChainContractsChangeset), - changeset.DeployChainContractsConfig{ + deployment.CreateLegacyChangeSet(v1_6.DeployChainContractsChangeset), + v1_6.DeployChainContractsConfig{ HomeChainSelector: e.HomeChainSel, ContractParamsPerChain: evmContractParams, }, @@ -844,8 +845,8 @@ func TestSetOCR3ConfigValidations(t *testing.T) { _, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), commonchangeset.Configure( // Enable the OCR config on the remote chains. - deployment.CreateLegacyChangeSet(changeset.SetOCR3OffRampChangeset), - changeset.SetOCR3OffRampConfig{ + deployment.CreateLegacyChangeSet(v1_6.SetOCR3OffRampChangeset), + v1_6.SetOCR3OffRampConfig{ HomeChainSel: e.HomeChainSel, RemoteChainSels: allChains, CCIPHomeConfigType: globals.ConfigTypeActive, @@ -857,16 +858,16 @@ func TestSetOCR3ConfigValidations(t *testing.T) { require.Contains(t, err.Error(), "invalid OCR3 config state, expected active config") // Build the per chain config. - wrongChainConfigs := make(map[uint64]changeset.ChainConfig) - ocrConfigs := make(map[uint64]changeset.CCIPOCRParams) + wrongChainConfigs := make(map[uint64]v1_6.ChainConfig) + ocrConfigs := make(map[uint64]v1_6.CCIPOCRParams) for _, chain := range allChains { - ocrParams := changeset.DeriveCCIPOCRParams( - changeset.WithDefaultCommitOffChainConfig(e.FeedChainSel, nil), - changeset.WithDefaultExecuteOffChainConfig(nil), + ocrParams := v1_6.DeriveCCIPOCRParams( + v1_6.WithDefaultCommitOffChainConfig(e.FeedChainSel, nil), + v1_6.WithDefaultExecuteOffChainConfig(nil), ) ocrConfigs[chain] = ocrParams // set wrong chain config with incorrect value of FChain - wrongChainConfigs[chain] = changeset.ChainConfig{ + wrongChainConfigs[chain] = v1_6.ChainConfig{ Readers: envNodes.NonBootstraps().PeerIDs(), //nolint:gosec // disable G115 FChain: uint8(len(envNodes.NonBootstraps().PeerIDs())), @@ -882,21 +883,21 @@ func TestSetOCR3ConfigValidations(t *testing.T) { e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, nil, []commonchangeset.ConfiguredChangeSet{ commonchangeset.Configure( // Add the chain configs for the new chains. - deployment.CreateLegacyChangeSet(changeset.UpdateChainConfigChangeset), - changeset.UpdateChainConfigConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateChainConfigChangeset), + v1_6.UpdateChainConfigConfig{ HomeChainSelector: e.HomeChainSel, RemoteChainAdds: wrongChainConfigs, }, ), commonchangeset.Configure( // Add the DONs and candidate commit OCR instances for the chain. - deployment.CreateLegacyChangeSet(changeset.AddDonAndSetCandidateChangeset), - changeset.AddDonAndSetCandidateChangesetConfig{ - SetCandidateConfigBase: changeset.SetCandidateConfigBase{ + deployment.CreateLegacyChangeSet(v1_6.AddDonAndSetCandidateChangeset), + v1_6.AddDonAndSetCandidateChangesetConfig{ + SetCandidateConfigBase: v1_6.SetCandidateConfigBase{ HomeChainSelector: e.HomeChainSel, FeedChainSelector: e.FeedChainSel, }, - PluginInfo: changeset.SetCandidatePluginInfo{ + PluginInfo: v1_6.SetCandidatePluginInfo{ OCRConfigPerRemoteChainSelector: ocrConfigs, PluginType: types.PluginTypeCCIPCommit, }, @@ -968,9 +969,9 @@ func TestApplyFeeTokensUpdatesFeeQuoterChangeset(t *testing.T) { _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ApplyFeeTokensUpdatesFeeQuoterChangeset), - changeset.ApplyFeeTokensUpdatesConfig{ - UpdatesByChain: map[uint64]changeset.ApplyFeeTokensUpdatesConfigPerChain{ + deployment.CreateLegacyChangeSet(v1_6.ApplyFeeTokensUpdatesFeeQuoterChangeset), + v1_6.ApplyFeeTokensUpdatesConfig{ + UpdatesByChain: map[uint64]v1_6.ApplyFeeTokensUpdatesConfigPerChain{ source: { TokensToAdd: []changeset.TokenSymbol{testhelpers.TestTokenSymbol}, TokensToRemove: []changeset.TokenSymbol{changeset.LinkSymbol}, @@ -1028,9 +1029,9 @@ func TestApplyPremiumMultiplierWeiPerEthUpdatesFeeQuoterChangeset(t *testing.T) // try to update PremiumMultiplierWeiPerEth for a token that does not exist _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ApplyPremiumMultiplierWeiPerEthUpdatesFeeQuoterChangeset), - changeset.PremiumMultiplierWeiPerEthUpdatesConfig{ - Updates: map[uint64][]changeset.PremiumMultiplierWeiPerEthUpdatesConfigPerChain{ + deployment.CreateLegacyChangeSet(v1_6.ApplyPremiumMultiplierWeiPerEthUpdatesFeeQuoterChangeset), + v1_6.PremiumMultiplierWeiPerEthUpdatesConfig{ + Updates: map[uint64][]v1_6.PremiumMultiplierWeiPerEthUpdatesConfigPerChain{ source: { { Token: testhelpers.TestTokenSymbol, @@ -1073,9 +1074,9 @@ func TestApplyPremiumMultiplierWeiPerEthUpdatesFeeQuoterChangeset(t *testing.T) // now try to apply the changeset for TEST token _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ApplyPremiumMultiplierWeiPerEthUpdatesFeeQuoterChangeset), - changeset.PremiumMultiplierWeiPerEthUpdatesConfig{ - Updates: map[uint64][]changeset.PremiumMultiplierWeiPerEthUpdatesConfigPerChain{ + deployment.CreateLegacyChangeSet(v1_6.ApplyPremiumMultiplierWeiPerEthUpdatesFeeQuoterChangeset), + v1_6.PremiumMultiplierWeiPerEthUpdatesConfig{ + Updates: map[uint64][]v1_6.PremiumMultiplierWeiPerEthUpdatesConfigPerChain{ source: { { Token: testhelpers.TestTokenSymbol, @@ -1164,9 +1165,9 @@ func TestUpdateTokenPriceFeedsFeeQuoterChangeset(t *testing.T) { // try to update price feed for this it will fail as there is no price feed deployed for this token _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateTokenPriceFeedsFeeQuoterChangeset), - changeset.UpdateTokenPriceFeedsConfig{ - Updates: map[uint64][]changeset.UpdateTokenPriceFeedsConfigPerChain{ + deployment.CreateLegacyChangeSet(v1_6.UpdateTokenPriceFeedsFeeQuoterChangeset), + v1_6.UpdateTokenPriceFeedsConfig{ + Updates: map[uint64][]v1_6.UpdateTokenPriceFeedsConfigPerChain{ source: { { SourceToken: testhelpers.TestTokenSymbol, @@ -1183,9 +1184,9 @@ func TestUpdateTokenPriceFeedsFeeQuoterChangeset(t *testing.T) { // now try to apply the changeset for link token, there is already a price feed deployed for link token _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateTokenPriceFeedsFeeQuoterChangeset), - changeset.UpdateTokenPriceFeedsConfig{ - Updates: map[uint64][]changeset.UpdateTokenPriceFeedsConfigPerChain{ + deployment.CreateLegacyChangeSet(v1_6.UpdateTokenPriceFeedsFeeQuoterChangeset), + v1_6.UpdateTokenPriceFeedsConfig{ + Updates: map[uint64][]v1_6.UpdateTokenPriceFeedsConfigPerChain{ source: { { SourceToken: changeset.LinkSymbol, @@ -1256,11 +1257,11 @@ func TestApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset(t *testing.T) { _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset), - changeset.ApplyTokenTransferFeeConfigUpdatesConfig{ - UpdatesByChain: map[uint64]changeset.ApplyTokenTransferFeeConfigUpdatesConfigPerChain{ + deployment.CreateLegacyChangeSet(v1_6.ApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset), + v1_6.ApplyTokenTransferFeeConfigUpdatesConfig{ + UpdatesByChain: map[uint64]v1_6.ApplyTokenTransferFeeConfigUpdatesConfigPerChain{ source: { - TokenTransferFeeConfigRemoveArgs: []changeset.TokenTransferFeeConfigRemoveArg{ + TokenTransferFeeConfigRemoveArgs: []v1_6.TokenTransferFeeConfigRemoveArg{ { DestChain: dest, Token: changeset.LinkSymbol, @@ -1268,7 +1269,7 @@ func TestApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset(t *testing.T) { }, }, dest: { - TokenTransferFeeConfigArgs: []changeset.TokenTransferFeeConfigArg{ + TokenTransferFeeConfigArgs: []v1_6.TokenTransferFeeConfigArg{ { DestChain: source, TokenTransferFeeConfigPerToken: map[changeset.TokenSymbol]fee_quoter.FeeQuoterTokenTransferFeeConfig{ @@ -1292,11 +1293,11 @@ func TestApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset(t *testing.T) { require.Contains(t, err.Error(), "min fee must be less than max fee for token") _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset), - changeset.ApplyTokenTransferFeeConfigUpdatesConfig{ - UpdatesByChain: map[uint64]changeset.ApplyTokenTransferFeeConfigUpdatesConfigPerChain{ + deployment.CreateLegacyChangeSet(v1_6.ApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset), + v1_6.ApplyTokenTransferFeeConfigUpdatesConfig{ + UpdatesByChain: map[uint64]v1_6.ApplyTokenTransferFeeConfigUpdatesConfigPerChain{ source: { - TokenTransferFeeConfigRemoveArgs: []changeset.TokenTransferFeeConfigRemoveArg{ + TokenTransferFeeConfigRemoveArgs: []v1_6.TokenTransferFeeConfigRemoveArg{ { DestChain: dest, Token: changeset.LinkSymbol, @@ -1304,7 +1305,7 @@ func TestApplyTokenTransferFeeConfigUpdatesFeeQuoterChangeset(t *testing.T) { }, }, dest: { - TokenTransferFeeConfigArgs: []changeset.TokenTransferFeeConfigArg{ + TokenTransferFeeConfigArgs: []v1_6.TokenTransferFeeConfigArg{ { DestChain: source, TokenTransferFeeConfigPerToken: map[changeset.TokenSymbol]fee_quoter.FeeQuoterTokenTransferFeeConfig{ diff --git a/deployment/ccip/changeset/cs_deploy_chain.go b/deployment/ccip/changeset/v1_6/cs_deploy_chain.go similarity index 96% rename from deployment/ccip/changeset/cs_deploy_chain.go rename to deployment/ccip/changeset/v1_6/cs_deploy_chain.go index 47143fd5a44..5b50b9ca06b 100644 --- a/deployment/ccip/changeset/cs_deploy_chain.go +++ b/deployment/ccip/changeset/v1_6/cs_deploy_chain.go @@ -1,4 +1,4 @@ -package changeset +package v1_6 import ( "errors" @@ -14,6 +14,8 @@ import ( chainsel "github.com/smartcontractkit/chain-selectors" "github.com/smartcontractkit/chainlink/deployment" + + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" @@ -155,8 +157,8 @@ func DefaultOffRampParams() OffRampParams { } } -func ValidateHomeChainState(e deployment.Environment, homeChainSel uint64, existingState CCIPOnChainState) error { - existingState, err := LoadOnchainState(e) +func ValidateHomeChainState(e deployment.Environment, homeChainSel uint64, existingState changeset.CCIPOnChainState) error { + existingState, err := changeset.LoadOnchainState(e) if err != nil { e.Logger.Errorw("Failed to load existing onchain state", "err", err) return err @@ -203,7 +205,7 @@ func deployChainContractsForChains( ab deployment.AddressBook, homeChainSel uint64, contractParamsPerChain map[uint64]ChainContractParams) error { - existingState, err := LoadOnchainState(e) + existingState, err := changeset.LoadOnchainState(e) if err != nil { e.Logger.Errorw("Failed to load existing onchain state", "err", err) return err @@ -257,7 +259,7 @@ func deployChainContractsForChains( func deployChainContractsEVM(e deployment.Environment, chain deployment.Chain, ab deployment.AddressBook, rmnHome *rmn_home.RMNHome, contractParams ChainContractParams) error { // check for existing contracts - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { e.Logger.Errorw("Failed to load existing onchain state", "err", err) return err @@ -315,7 +317,7 @@ func deployChainContractsEVM(e deployment.Environment, chain deployment.Chain, a rmnLegacyAddr, ) return deployment.ContractDeploy[*rmn_remote.RMNRemote]{ - Address: rmnRemoteAddr, Contract: rmnRemote, Tx: tx, Tv: deployment.NewTypeAndVersion(RMNRemote, deployment.Version1_6_0), Err: err2, + Address: rmnRemoteAddr, Contract: rmnRemote, Tx: tx, Tv: deployment.NewTypeAndVersion(changeset.RMNRemote, deployment.Version1_6_0), Err: err2, } }) if err != nil { @@ -355,7 +357,7 @@ func deployChainContractsEVM(e deployment.Environment, chain deployment.Chain, a RMNProxy.Address(), ) return deployment.ContractDeploy[*router.Router]{ - Address: routerAddr, Contract: routerC, Tx: tx2, Tv: deployment.NewTypeAndVersion(TestRouter, deployment.Version1_2_0), Err: err2, + Address: routerAddr, Contract: routerC, Tx: tx2, Tv: deployment.NewTypeAndVersion(changeset.TestRouter, deployment.Version1_2_0), Err: err2, } }) if err != nil { @@ -376,7 +378,7 @@ func deployChainContractsEVM(e deployment.Environment, chain deployment.Chain, a []common.Address{}, // Need to add onRamp after ) return deployment.ContractDeploy[*nonce_manager.NonceManager]{ - Address: nonceManagerAddr, Contract: nonceManager, Tx: tx2, Tv: deployment.NewTypeAndVersion(NonceManager, deployment.Version1_6_0), Err: err2, + Address: nonceManagerAddr, Contract: nonceManager, Tx: tx2, Tv: deployment.NewTypeAndVersion(changeset.NonceManager, deployment.Version1_6_0), Err: err2, } }) if err != nil { @@ -416,7 +418,7 @@ func deployChainContractsEVM(e deployment.Environment, chain deployment.Chain, a contractParams.FeeQuoterParams.DestChainConfigArgs, ) return deployment.ContractDeploy[*fee_quoter.FeeQuoter]{ - Address: prAddr, Contract: pr, Tx: tx2, Tv: deployment.NewTypeAndVersion(FeeQuoter, deployment.Version1_6_0), Err: err2, + Address: prAddr, Contract: pr, Tx: tx2, Tv: deployment.NewTypeAndVersion(changeset.FeeQuoter, deployment.Version1_6_0), Err: err2, } }) if err != nil { @@ -447,7 +449,7 @@ func deployChainContractsEVM(e deployment.Environment, chain deployment.Chain, a []onramp.OnRampDestChainConfigArgs{}, ) return deployment.ContractDeploy[*onramp.OnRamp]{ - Address: onRampAddr, Contract: onRamp, Tx: tx2, Tv: deployment.NewTypeAndVersion(OnRamp, deployment.Version1_6_0), Err: err2, + Address: onRampAddr, Contract: onRamp, Tx: tx2, Tv: deployment.NewTypeAndVersion(changeset.OnRamp, deployment.Version1_6_0), Err: err2, } }) if err != nil { @@ -480,7 +482,7 @@ func deployChainContractsEVM(e deployment.Environment, chain deployment.Chain, a []offramp.OffRampSourceChainConfigArgs{}, ) return deployment.ContractDeploy[*offramp.OffRamp]{ - Address: offRampAddr, Contract: offRamp, Tx: tx2, Tv: deployment.NewTypeAndVersion(OffRamp, deployment.Version1_6_0), Err: err2, + Address: offRampAddr, Contract: offRamp, Tx: tx2, Tv: deployment.NewTypeAndVersion(changeset.OffRamp, deployment.Version1_6_0), Err: err2, } }) if err != nil { diff --git a/deployment/ccip/changeset/cs_deploy_chain_test.go b/deployment/ccip/changeset/v1_6/cs_deploy_chain_test.go similarity index 88% rename from deployment/ccip/changeset/cs_deploy_chain_test.go rename to deployment/ccip/changeset/v1_6/cs_deploy_chain_test.go index 8802a935a2a..def897868f0 100644 --- a/deployment/ccip/changeset/cs_deploy_chain_test.go +++ b/deployment/ccip/changeset/v1_6/cs_deploy_chain_test.go @@ -1,4 +1,4 @@ -package changeset_test +package v1_6_test import ( "testing" @@ -9,6 +9,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" @@ -30,12 +31,12 @@ func TestDeployChainContractsChangeset(t *testing.T) { require.NoError(t, err) p2pIds := nodes.NonBootstraps().PeerIDs() cfg := make(map[uint64]commontypes.MCMSWithTimelockConfigV2) - contractParams := make(map[uint64]changeset.ChainContractParams) + contractParams := make(map[uint64]v1_6.ChainContractParams) for _, chain := range e.AllChainSelectors() { cfg[chain] = proposalutils.SingleGroupTimelockConfigV2(t) - contractParams[chain] = changeset.ChainContractParams{ - FeeQuoterParams: changeset.DefaultFeeQuoterParams(), - OffRampParams: changeset.DefaultOffRampParams(), + contractParams[chain] = v1_6.ChainContractParams{ + FeeQuoterParams: v1_6.DefaultFeeQuoterParams(), + OffRampParams: v1_6.DefaultOffRampParams(), } } prereqCfg := make([]changeset.DeployPrerequisiteConfigPerChain, 0) @@ -47,8 +48,8 @@ func TestDeployChainContractsChangeset(t *testing.T) { e, err = commonchangeset.Apply(t, e, nil, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployHomeChainChangeset), - changeset.DeployHomeChainConfig{ + deployment.CreateLegacyChangeSet(v1_6.DeployHomeChainChangeset), + v1_6.DeployHomeChainConfig{ HomeChainSel: homeChainSel, RMNStaticConfig: testhelpers.NewTestRMNStaticConfig(), RMNDynamicConfig: testhelpers.NewTestRMNDynamicConfig(), @@ -73,8 +74,8 @@ func TestDeployChainContractsChangeset(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployChainContractsChangeset), - changeset.DeployChainContractsConfig{ + deployment.CreateLegacyChangeSet(v1_6.DeployChainContractsChangeset), + v1_6.DeployChainContractsConfig{ HomeChainSelector: homeChainSel, ContractParamsPerChain: contractParams, }, diff --git a/deployment/ccip/changeset/cs_home_chain.go b/deployment/ccip/changeset/v1_6/cs_home_chain.go similarity index 96% rename from deployment/ccip/changeset/cs_home_chain.go rename to deployment/ccip/changeset/v1_6/cs_home_chain.go index 458356ae25c..62f14432d22 100644 --- a/deployment/ccip/changeset/cs_home_chain.go +++ b/deployment/ccip/changeset/v1_6/cs_home_chain.go @@ -1,4 +1,4 @@ -package changeset +package v1_6 import ( "bytes" @@ -18,6 +18,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment" @@ -91,7 +92,7 @@ func (c DeployHomeChainConfig) Validate() error { // and returns a deployment.ContractDeploy struct with the address and contract instance. func deployCapReg( lggr logger.Logger, - state CCIPOnChainState, + state changeset.CCIPOnChainState, ab deployment.AddressBook, chain deployment.Chain, ) (*deployment.ContractDeploy[*capabilities_registry.CapabilitiesRegistry], error) { @@ -101,7 +102,7 @@ func deployCapReg( if cr != nil { lggr.Infow("Found CapabilitiesRegistry in chain state", "address", cr.Address().String()) return &deployment.ContractDeploy[*capabilities_registry.CapabilitiesRegistry]{ - Address: cr.Address(), Contract: cr, Tv: deployment.NewTypeAndVersion(CapabilitiesRegistry, deployment.Version1_0_0), + Address: cr.Address(), Contract: cr, Tv: deployment.NewTypeAndVersion(changeset.CapabilitiesRegistry, deployment.Version1_0_0), }, nil } } @@ -112,7 +113,7 @@ func deployCapReg( chain.Client, ) return deployment.ContractDeploy[*capabilities_registry.CapabilitiesRegistry]{ - Address: crAddr, Contract: cr, Tv: deployment.NewTypeAndVersion(CapabilitiesRegistry, deployment.Version1_0_0), Tx: tx, Err: err2, + Address: crAddr, Contract: cr, Tv: deployment.NewTypeAndVersion(changeset.CapabilitiesRegistry, deployment.Version1_0_0), Tx: tx, Err: err2, } }) if err != nil { @@ -133,7 +134,7 @@ func deployHomeChain( nodeP2PIDsPerNodeOpAdmin map[string][][32]byte, ) (*deployment.ContractDeploy[*capabilities_registry.CapabilitiesRegistry], error) { // load existing state - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return nil, fmt.Errorf("failed to load onchain state: %w", err) } @@ -158,7 +159,7 @@ func deployHomeChain( capReg.Address, ) return deployment.ContractDeploy[*ccip_home.CCIPHome]{ - Address: ccAddr, Tv: deployment.NewTypeAndVersion(CCIPHome, deployment.Version1_6_0), Tx: tx, Err: err2, Contract: cc, + Address: ccAddr, Tv: deployment.NewTypeAndVersion(changeset.CCIPHome, deployment.Version1_6_0), Tx: tx, Err: err2, Contract: cc, } }) if err != nil { @@ -179,7 +180,7 @@ func deployHomeChain( chain.Client, ) return deployment.ContractDeploy[*rmn_home.RMNHome]{ - Address: rmnAddr, Tv: deployment.NewTypeAndVersion(RMNHome, deployment.Version1_6_0), Tx: tx, Err: err2, Contract: rmn, + Address: rmnAddr, Tv: deployment.NewTypeAndVersion(changeset.RMNHome, deployment.Version1_6_0), Tx: tx, Err: err2, Contract: rmn, } }, ) @@ -445,10 +446,10 @@ func addNodes( type RemoveDONsConfig struct { HomeChainSel uint64 DonIDs []uint32 - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } -func (c RemoveDONsConfig) Validate(homeChain CCIPChainState) error { +func (c RemoveDONsConfig) Validate(homeChain changeset.CCIPChainState) error { if err := deployment.IsValidChainSelector(c.HomeChainSel); err != nil { return fmt.Errorf("home chain selector must be set %w", err) } @@ -471,7 +472,7 @@ func (c RemoveDONsConfig) Validate(homeChain CCIPChainState) error { // RemoveDONs removes DONs from the CapabilitiesRegistry contract. // TODO: Could likely be moved to common, but needs a common state struct first. func RemoveDONs(e deployment.Environment, cfg RemoveDONsConfig) (deployment.ChangesetOutput, error) { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -503,7 +504,7 @@ func RemoveDONs(e deployment.Environment, cfg RemoveDONsConfig) (deployment.Chan batchOperation, err := proposalutils.BatchOperationForChain(cfg.HomeChainSel, homeChainState.CapabilityRegistry.Address().Hex(), tx.Data(), big.NewInt(0), - string(CapabilitiesRegistry), []string{}) + string(changeset.CapabilitiesRegistry), []string{}) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to create batch operation for home chain: %w", err) } diff --git a/deployment/ccip/changeset/cs_home_chain_test.go b/deployment/ccip/changeset/v1_6/cs_home_chain_test.go similarity index 89% rename from deployment/ccip/changeset/cs_home_chain_test.go rename to deployment/ccip/changeset/v1_6/cs_home_chain_test.go index c4cf086ebea..77cfd8c8d2d 100644 --- a/deployment/ccip/changeset/cs_home_chain_test.go +++ b/deployment/ccip/changeset/v1_6/cs_home_chain_test.go @@ -1,4 +1,4 @@ -package changeset_test +package v1_6_test import ( "testing" @@ -10,6 +10,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/common/view/v1_0" @@ -29,7 +30,7 @@ func TestDeployHomeChain(t *testing.T) { nodes, err := deployment.NodeInfo(e.NodeIDs, e.Offchain) require.NoError(t, err) p2pIds := nodes.NonBootstraps().PeerIDs() - homeChainCfg := changeset.DeployHomeChainConfig{ + homeChainCfg := v1_6.DeployHomeChainConfig{ HomeChainSel: homeChainSel, RMNStaticConfig: testhelpers.NewTestRMNStaticConfig(), RMNDynamicConfig: testhelpers.NewTestRMNDynamicConfig(), @@ -38,7 +39,7 @@ func TestDeployHomeChain(t *testing.T) { "NodeOperator": p2pIds, }, } - output, err := changeset.DeployHomeChainChangeset(e, homeChainCfg) + output, err := v1_6.DeployHomeChainChangeset(e, homeChainCfg) require.NoError(t, err) require.NoError(t, e.ExistingAddresses.Merge(output.AddressBook)) state, err := changeset.LoadOnchainState(e) @@ -67,7 +68,7 @@ func TestDeployHomeChainIdempotent(t *testing.T) { e, _ := testhelpers.NewMemoryEnvironment(t) nodes, err := deployment.NodeInfo(e.Env.NodeIDs, e.Env.Offchain) require.NoError(t, err) - homeChainCfg := changeset.DeployHomeChainConfig{ + homeChainCfg := v1_6.DeployHomeChainConfig{ HomeChainSel: e.HomeChainSel, RMNStaticConfig: testhelpers.NewTestRMNStaticConfig(), RMNDynamicConfig: testhelpers.NewTestRMNDynamicConfig(), @@ -77,7 +78,7 @@ func TestDeployHomeChainIdempotent(t *testing.T) { }, } // apply the changeset once again to ensure idempotency - output, err := changeset.DeployHomeChainChangeset(e.Env, homeChainCfg) + output, err := v1_6.DeployHomeChainChangeset(e.Env, homeChainCfg) require.NoError(t, err) require.NoError(t, e.Env.ExistingAddresses.Merge(output.AddressBook)) _, err = changeset.LoadOnchainState(e.Env) @@ -91,12 +92,12 @@ func TestRemoveDonsValidate(t *testing.T) { homeChain := s.Chains[e.HomeChainSel] var tt = []struct { name string - config changeset.RemoveDONsConfig + config v1_6.RemoveDONsConfig expectErr bool }{ { name: "invalid home", - config: changeset.RemoveDONsConfig{ + config: v1_6.RemoveDONsConfig{ HomeChainSel: 0, DonIDs: []uint32{1}, }, @@ -104,7 +105,7 @@ func TestRemoveDonsValidate(t *testing.T) { }, { name: "invalid dons", - config: changeset.RemoveDONsConfig{ + config: v1_6.RemoveDONsConfig{ HomeChainSel: e.HomeChainSel, DonIDs: []uint32{1377}, }, @@ -112,7 +113,7 @@ func TestRemoveDonsValidate(t *testing.T) { }, { name: "no dons", - config: changeset.RemoveDONsConfig{ + config: v1_6.RemoveDONsConfig{ HomeChainSel: e.HomeChainSel, DonIDs: []uint32{}, }, @@ -120,7 +121,7 @@ func TestRemoveDonsValidate(t *testing.T) { }, { name: "success", - config: changeset.RemoveDONsConfig{ + config: v1_6.RemoveDONsConfig{ HomeChainSel: e.HomeChainSel, DonIDs: []uint32{1}, }, @@ -150,8 +151,8 @@ func TestRemoveDons(t *testing.T) { require.NoError(t, err) e.Env, err = commoncs.Apply(t, e.Env, nil, commoncs.Configure( - deployment.CreateLegacyChangeSet(changeset.RemoveDONs), - changeset.RemoveDONsConfig{ + deployment.CreateLegacyChangeSet(v1_6.RemoveDONs), + v1_6.RemoveDONsConfig{ HomeChainSel: e.HomeChainSel, DonIDs: []uint32{donsBefore[0].Id}, }, @@ -182,8 +183,8 @@ func TestRemoveDons(t *testing.T) { }, ), commoncs.Configure( - deployment.CreateLegacyChangeSet(changeset.RemoveDONs), - changeset.RemoveDONsConfig{ + deployment.CreateLegacyChangeSet(v1_6.RemoveDONs), + v1_6.RemoveDONsConfig{ HomeChainSel: e.HomeChainSel, DonIDs: []uint32{donsBefore[0].Id}, MCMS: &changeset.MCMSConfig{MinDelay: 0}, diff --git a/deployment/ccip/changeset/cs_jobspec.go b/deployment/ccip/changeset/v1_6/cs_jobspec.go similarity index 99% rename from deployment/ccip/changeset/cs_jobspec.go rename to deployment/ccip/changeset/v1_6/cs_jobspec.go index 051402b5194..ccff971441b 100644 --- a/deployment/ccip/changeset/cs_jobspec.go +++ b/deployment/ccip/changeset/v1_6/cs_jobspec.go @@ -1,4 +1,4 @@ -package changeset +package v1_6 import ( "bytes" diff --git a/deployment/ccip/changeset/cs_jobspec_test.go b/deployment/ccip/changeset/v1_6/cs_jobspec_test.go similarity index 87% rename from deployment/ccip/changeset/cs_jobspec_test.go rename to deployment/ccip/changeset/v1_6/cs_jobspec_test.go index 96b86eaeb2d..a98320c031c 100644 --- a/deployment/ccip/changeset/cs_jobspec_test.go +++ b/deployment/ccip/changeset/v1_6/cs_jobspec_test.go @@ -1,4 +1,4 @@ -package changeset_test +package v1_6_test import ( "testing" @@ -6,8 +6,8 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" ccip "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/validate" ) @@ -21,8 +21,8 @@ func TestJobSpecChangeset(t *testing.T) { require.NoError(t, err) e, err = commonchangeset.Apply(t, e, nil, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployHomeChainChangeset), - changeset.DeployHomeChainConfig{ + deployment.CreateLegacyChangeSet(v1_6.DeployHomeChainChangeset), + v1_6.DeployHomeChainConfig{ HomeChainSel: tenv.HomeChainSel, RMNDynamicConfig: testhelpers.NewTestRMNDynamicConfig(), RMNStaticConfig: testhelpers.NewTestRMNStaticConfig(), @@ -34,7 +34,7 @@ func TestJobSpecChangeset(t *testing.T) { ), ) require.NoError(t, err) - output, err := changeset.CCIPCapabilityJobspecChangeset(e, nil) + output, err := v1_6.CCIPCapabilityJobspecChangeset(e, nil) require.NoError(t, err) require.NotEmpty(t, output.Jobs) nodeIDs := make(map[string]struct{}) @@ -56,7 +56,7 @@ func TestJobSpecChangesetIdempotent(t *testing.T) { e, _ := testhelpers.NewMemoryEnvironment(t) // we call the changeset again to ensure that it doesn't return any new job specs // as the job specs are already created in the first call - output, err := changeset.CCIPCapabilityJobspecChangeset(e.Env, nil) + output, err := v1_6.CCIPCapabilityJobspecChangeset(e.Env, nil) require.NoError(t, err) require.Empty(t, output.Jobs) } diff --git a/deployment/ccip/changeset/cs_rmn_curse_uncurse.go b/deployment/ccip/changeset/v1_6/cs_rmn_curse_uncurse.go similarity index 95% rename from deployment/ccip/changeset/cs_rmn_curse_uncurse.go rename to deployment/ccip/changeset/v1_6/cs_rmn_curse_uncurse.go index 3f382549996..63ac89689ae 100644 --- a/deployment/ccip/changeset/cs_rmn_curse_uncurse.go +++ b/deployment/ccip/changeset/v1_6/cs_rmn_curse_uncurse.go @@ -1,4 +1,4 @@ -package changeset +package v1_6 import ( "encoding/binary" @@ -6,6 +6,7 @@ import ( "fmt" "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" ) @@ -31,13 +32,13 @@ type RMNCurseAction struct { type CurseAction func(e deployment.Environment) []RMNCurseAction type RMNCurseConfig struct { - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig CurseActions []CurseAction Reason string } func (c RMNCurseConfig) Validate(e deployment.Environment) error { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return fmt.Errorf("failed to load onchain state: %w", err) @@ -215,12 +216,12 @@ func RMNCurseChangeset(e deployment.Environment, cfg RMNCurseConfig) (deployment return deployment.ChangesetOutput{}, err } - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } - deployerGroup := NewDeployerGroup(e, state, cfg.MCMS).WithDeploymentContext("proposal to curse RMNs: " + cfg.Reason) + deployerGroup := changeset.NewDeployerGroup(e, state, cfg.MCMS).WithDeploymentContext("proposal to curse RMNs: " + cfg.Reason) // Generate curse actions var curseActions []RMNCurseAction @@ -286,12 +287,12 @@ func RMNUncurseChangeset(e deployment.Environment, cfg RMNCurseConfig) (deployme return deployment.ChangesetOutput{}, err } - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } - deployerGroup := NewDeployerGroup(e, state, cfg.MCMS).WithDeploymentContext("proposal to uncurse RMNs: " + cfg.Reason) + deployerGroup := changeset.NewDeployerGroup(e, state, cfg.MCMS).WithDeploymentContext("proposal to uncurse RMNs: " + cfg.Reason) // Generate curse actions var curseActions []RMNCurseAction diff --git a/deployment/ccip/changeset/cs_update_rmn_config.go b/deployment/ccip/changeset/v1_6/cs_update_rmn_config.go similarity index 91% rename from deployment/ccip/changeset/cs_update_rmn_config.go rename to deployment/ccip/changeset/v1_6/cs_update_rmn_config.go index f6cc6f18744..e6a452b7d96 100644 --- a/deployment/ccip/changeset/cs_update_rmn_config.go +++ b/deployment/ccip/changeset/v1_6/cs_update_rmn_config.go @@ -1,4 +1,4 @@ -package changeset +package v1_6 import ( "bytes" @@ -14,6 +14,8 @@ import ( mcmstypes "github.com/smartcontractkit/mcms/types" "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_0_0/rmn_proxy_contract" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_home" @@ -32,10 +34,10 @@ var ( type SetRMNRemoteOnRMNProxyConfig struct { ChainSelectors []uint64 - MCMSConfig *MCMSConfig + MCMSConfig *changeset.MCMSConfig } -func (c SetRMNRemoteOnRMNProxyConfig) Validate(state CCIPOnChainState) error { +func (c SetRMNRemoteOnRMNProxyConfig) Validate(state changeset.CCIPOnChainState) error { for _, chain := range c.ChainSelectors { err := deployment.IsValidChainSelector(chain) if err != nil { @@ -56,7 +58,7 @@ func (c SetRMNRemoteOnRMNProxyConfig) Validate(state CCIPOnChainState) error { } func SetRMNRemoteOnRMNProxyChangeset(e deployment.Environment, cfg SetRMNRemoteOnRMNProxyConfig) (deployment.ChangesetOutput, error) { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } @@ -64,8 +66,8 @@ func SetRMNRemoteOnRMNProxyChangeset(e deployment.Environment, cfg SetRMNRemoteO return deployment.ChangesetOutput{}, err } - timelocks := BuildTimelockAddressPerChain(e, state) - proposerMcms := BuildProposerMcmAddressesPerChain(e, state) + timelocks := changeset.BuildTimelockAddressPerChain(e, state) + proposerMcms := changeset.BuildProposerMcmAddressesPerChain(e, state) inspectors := map[uint64]mcmssdk.Inspector{} timelockBatch := []mcmstypes.BatchOperation{} @@ -118,7 +120,7 @@ func SetRMNRemoteOnRMNProxyChangeset(e deployment.Environment, cfg SetRMNRemoteO } func setRMNRemoteOnRMNProxyOp( - txOpts *bind.TransactOpts, chain deployment.Chain, chainState CCIPChainState, mcmsEnabled bool, + txOpts *bind.TransactOpts, chain deployment.Chain, chainState changeset.CCIPChainState, mcmsEnabled bool, ) (mcmstypes.BatchOperation, error) { rmnProxy := chainState.RMNProxy rmnRemoteAddr := chainState.RMNRemote.Address() @@ -135,7 +137,7 @@ func setRMNRemoteOnRMNProxyOp( } batchOperation, err := proposalutils.BatchOperationForChain(chain.Selector, rmnProxy.Address().Hex(), - setRMNTx.Data(), big.NewInt(0), string(RMN), []string{}) + setRMNTx.Data(), big.NewInt(0), string(changeset.RMN), []string{}) if err != nil { return mcmstypes.BatchOperation{}, fmt.Errorf("failed to create batch operation for chain%s: %w", chain.String(), err) } @@ -172,7 +174,7 @@ func (c RMNNopConfig) SetBit(bitmap *big.Int, value bool) { } } -func getDeployer(e deployment.Environment, chain uint64, mcmConfig *MCMSConfig) *bind.TransactOpts { +func getDeployer(e deployment.Environment, chain uint64, mcmConfig *changeset.MCMSConfig) *bind.TransactOpts { if mcmConfig == nil { return e.Chains[chain].DeployerKey } @@ -185,10 +187,10 @@ type SetRMNHomeCandidateConfig struct { RMNStaticConfig rmn_home.RMNHomeStaticConfig RMNDynamicConfig rmn_home.RMNHomeDynamicConfig DigestToOverride [32]byte - MCMSConfig *MCMSConfig + MCMSConfig *changeset.MCMSConfig } -func (c SetRMNHomeCandidateConfig) Validate(state CCIPOnChainState) error { +func (c SetRMNHomeCandidateConfig) Validate(state changeset.CCIPOnChainState) error { err := deployment.IsValidChainSelector(c.HomeChainSelector) if err != nil { return err @@ -291,10 +293,10 @@ func isRMNDynamicConfigEqual(a, b rmn_home.RMNHomeDynamicConfig) bool { type PromoteRMNHomeCandidateConfig struct { HomeChainSelector uint64 DigestToPromote [32]byte - MCMSConfig *MCMSConfig + MCMSConfig *changeset.MCMSConfig } -func (c PromoteRMNHomeCandidateConfig) Validate(state CCIPOnChainState) error { +func (c PromoteRMNHomeCandidateConfig) Validate(state changeset.CCIPOnChainState) error { err := deployment.IsValidChainSelector(c.HomeChainSelector) if err != nil { return err @@ -329,7 +331,7 @@ func (c PromoteRMNHomeCandidateConfig) Validate(state CCIPOnChainState) error { // DynamicConfig contains the list of source chains with their chain selectors, f value and the bitmap of the nodes that are oberver for each source chain // The bitmap is a 256 bit array where each bit represents a node. If the bit matching the index of the node in the static config is set it means that the node is an observer func SetRMNHomeCandidateConfigChangeset(e deployment.Environment, config SetRMNHomeCandidateConfig) (deployment.ChangesetOutput, error) { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } @@ -366,13 +368,13 @@ func SetRMNHomeCandidateConfigChangeset(e deployment.Environment, config SetRMNH } operation, err := proposalutils.BatchOperationForChain(homeChain.Selector, rmnHome.Address().Hex(), - setCandidateTx.Data(), big.NewInt(0), string(RMN), []string{}) + setCandidateTx.Data(), big.NewInt(0), string(changeset.RMN), []string{}) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to create batch operation for chain %s: %w", homeChain.String(), err) } - timelocks := BuildTimelockAddressPerChain(e, state) - proposerMcms := BuildProposerMcmAddressesPerChain(e, state) + timelocks := changeset.BuildTimelockAddressPerChain(e, state) + proposerMcms := changeset.BuildProposerMcmAddressesPerChain(e, state) inspectors, err := proposalutils.McmsInspectors(e) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to get mcms inspector for chain %s: %w", homeChain.String(), err) @@ -395,7 +397,7 @@ func SetRMNHomeCandidateConfigChangeset(e deployment.Environment, config SetRMNH } func PromoteRMNHomeCandidateConfigChangeset(e deployment.Environment, config PromoteRMNHomeCandidateConfig) (deployment.ChangesetOutput, error) { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } @@ -443,13 +445,13 @@ func PromoteRMNHomeCandidateConfigChangeset(e deployment.Environment, config Pro } operation, err := proposalutils.BatchOperationForChain(homeChain.Selector, rmnHome.Address().Hex(), - promoteCandidateTx.Data(), big.NewInt(0), string(RMN), []string{}) + promoteCandidateTx.Data(), big.NewInt(0), string(changeset.RMN), []string{}) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to create batch operation for chain %s: %w", homeChain.String(), err) } - timelocks := BuildTimelockAddressPerChain(e, state) - proposerMcms := BuildProposerMcmAddressesPerChain(e, state) + timelocks := changeset.BuildTimelockAddressPerChain(e, state) + proposerMcms := changeset.BuildProposerMcmAddressesPerChain(e, state) inspectors := map[uint64]mcmssdk.Inspector{} inspectors[config.HomeChainSelector], err = proposalutils.McmsInspectorForChain(e, config.HomeChainSelector) @@ -475,7 +477,7 @@ func PromoteRMNHomeCandidateConfigChangeset(e deployment.Environment, config Pro }, nil } -func BuildRMNRemotePerChain(e deployment.Environment, state CCIPOnChainState) map[uint64]*rmn_remote.RMNRemote { +func BuildRMNRemotePerChain(e deployment.Environment, state changeset.CCIPOnChainState) map[uint64]*rmn_remote.RMNRemote { timelocksPerChain := make(map[uint64]*rmn_remote.RMNRemote) for _, chain := range e.Chains { timelocksPerChain[chain.Selector] = state.Chains[chain.Selector].RMNRemote @@ -491,7 +493,7 @@ type RMNRemoteConfig struct { type SetRMNRemoteConfig struct { HomeChainSelector uint64 RMNRemoteConfigs map[uint64]RMNRemoteConfig - MCMSConfig *MCMSConfig + MCMSConfig *changeset.MCMSConfig } func (c SetRMNRemoteConfig) Validate() error { @@ -524,7 +526,7 @@ type SetRMNHomeDynamicConfigConfig struct { HomeChainSelector uint64 RMNDynamicConfig rmn_home.RMNHomeDynamicConfig ActiveDigest [32]byte - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } func (c SetRMNHomeDynamicConfigConfig) Validate(e deployment.Environment) error { @@ -533,7 +535,7 @@ func (c SetRMNHomeDynamicConfigConfig) Validate(e deployment.Environment) error return err } - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return fmt.Errorf("failed to load onchain state: %w", err) } @@ -565,12 +567,12 @@ func SetRMNHomeDynamicConfigChangeset(e deployment.Environment, cfg SetRMNHomeDy return deployment.ChangesetOutput{}, err } - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } - deployerGroup := NewDeployerGroup(e, state, cfg.MCMS).WithDeploymentContext("set RMNHome dynamic config") + deployerGroup := changeset.NewDeployerGroup(e, state, cfg.MCMS).WithDeploymentContext("set RMNHome dynamic config") chain, exists := e.Chains[cfg.HomeChainSelector] if !exists { @@ -599,7 +601,7 @@ func SetRMNHomeDynamicConfigChangeset(e deployment.Environment, cfg SetRMNHomeDy type RevokeCandidateConfig struct { HomeChainSelector uint64 CandidateDigest [32]byte - MCMS *MCMSConfig + MCMS *changeset.MCMSConfig } func (c RevokeCandidateConfig) Validate(e deployment.Environment) error { @@ -608,7 +610,7 @@ func (c RevokeCandidateConfig) Validate(e deployment.Environment) error { return err } - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return fmt.Errorf("failed to load onchain state: %w", err) } @@ -636,12 +638,12 @@ func RevokeRMNHomeCandidateConfigChangeset(e deployment.Environment, cfg RevokeC return deployment.ChangesetOutput{}, err } - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } - deployerGroup := NewDeployerGroup(e, state, cfg.MCMS).WithDeploymentContext("revoke candidate config") + deployerGroup := changeset.NewDeployerGroup(e, state, cfg.MCMS).WithDeploymentContext("revoke candidate config") chain, exists := e.Chains[cfg.HomeChainSelector] if !exists { @@ -667,7 +669,7 @@ func RevokeRMNHomeCandidateConfigChangeset(e deployment.Environment, cfg RevokeC } func SetRMNRemoteConfigChangeset(e deployment.Environment, config SetRMNRemoteConfig) (deployment.ChangesetOutput, error) { - state, err := LoadOnchainState(e) + state, err := changeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } @@ -735,7 +737,7 @@ func SetRMNRemoteConfigChangeset(e deployment.Environment, config SetRMNRemoteCo } operation, err := proposalutils.BatchOperationForChain(e.Chains[chain].Selector, remote.Address().Hex(), - tx.Data(), big.NewInt(0), string(RMN), []string{}) + tx.Data(), big.NewInt(0), string(changeset.RMN), []string{}) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to create batch operation for chain %s: %w", homeChain.String(), err) } @@ -747,8 +749,8 @@ func SetRMNRemoteConfigChangeset(e deployment.Environment, config SetRMNRemoteCo return deployment.ChangesetOutput{}, nil } - timelocks := BuildTimelockAddressPerChain(e, state) - proposerMcms := BuildProposerMcmAddressesPerChain(e, state) + timelocks := changeset.BuildTimelockAddressPerChain(e, state) + proposerMcms := changeset.BuildProposerMcmAddressesPerChain(e, state) inspectors, err := proposalutils.McmsInspectors(e) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to get mcms inspector for chain %s: %w", homeChain.String(), err) diff --git a/deployment/ccip/changeset/view.go b/deployment/ccip/changeset/view.go index 1fd8fdbe38f..9d33368c721 100644 --- a/deployment/ccip/changeset/view.go +++ b/deployment/ccip/changeset/view.go @@ -4,6 +4,7 @@ import ( "encoding/json" "github.com/smartcontractkit/chainlink/deployment" + ccipview "github.com/smartcontractkit/chainlink/deployment/ccip/view" "github.com/smartcontractkit/chainlink/deployment/common/view" ) diff --git a/deployment/environment/crib/ccip_deployer.go b/deployment/environment/crib/ccip_deployer.go index da8da727013..1d1ef80167d 100644 --- a/deployment/environment/crib/ccip_deployer.go +++ b/deployment/environment/crib/ccip_deployer.go @@ -4,14 +4,21 @@ import ( "context" "errors" "fmt" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/token_pool" - "golang.org/x/sync/errgroup" "math/big" "sync" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5_1" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" + + "golang.org/x/sync/errgroup" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/token_pool" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" "github.com/smartcontractkit/chainlink-ccip/chainconfig" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" "github.com/ethereum/go-ethereum/common" @@ -20,7 +27,6 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" @@ -65,8 +71,8 @@ func DeployHomeChainContracts(ctx context.Context, lggr logger.Logger, envConfig cfg, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployHomeChainChangeset), - changeset.DeployHomeChainConfig{ + deployment.CreateLegacyChangeSet(v1_6.DeployHomeChainChangeset), + v1_6.DeployHomeChainConfig{ HomeChainSel: homeChainSel, RMNStaticConfig: testhelpers.NewTestRMNStaticConfig(), RMNDynamicConfig: testhelpers.NewTestRMNDynamicConfig(), @@ -259,19 +265,19 @@ func FundCCIPTransmitters(ctx context.Context, lggr logger.Logger, envConfig dev func setupChains(lggr logger.Logger, e *deployment.Environment, homeChainSel uint64) (deployment.Environment, error) { chainSelectors := e.AllChainSelectors() - chainConfigs := make(map[uint64]changeset.ChainConfig) + chainConfigs := make(map[uint64]v1_6.ChainConfig) nodeInfo, err := deployment.NodeInfo(e.NodeIDs, e.Offchain) if err != nil { return *e, fmt.Errorf("failed to get node info from env: %w", err) } prereqCfgs := make([]changeset.DeployPrerequisiteConfigPerChain, 0) - contractParams := make(map[uint64]changeset.ChainContractParams) + contractParams := make(map[uint64]v1_6.ChainContractParams) for _, chain := range chainSelectors { prereqCfgs = append(prereqCfgs, changeset.DeployPrerequisiteConfigPerChain{ ChainSelector: chain, }) - chainConfigs[chain] = changeset.ChainConfig{ + chainConfigs[chain] = v1_6.ChainConfig{ Readers: nodeInfo.NonBootstraps().PeerIDs(), // Number of nodes is 3f+1 //nolint:gosec // this should always be less than max uint8 @@ -282,15 +288,15 @@ func setupChains(lggr logger.Logger, e *deployment.Environment, homeChainSel uin OptimisticConfirmations: 1, }, } - contractParams[chain] = changeset.ChainContractParams{ - FeeQuoterParams: changeset.DefaultFeeQuoterParams(), - OffRampParams: changeset.DefaultOffRampParams(), + contractParams[chain] = v1_6.ChainContractParams{ + FeeQuoterParams: v1_6.DefaultFeeQuoterParams(), + OffRampParams: v1_6.DefaultOffRampParams(), } } env, err := commonchangeset.Apply(nil, *e, nil, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateChainConfigChangeset), - changeset.UpdateChainConfigConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateChainConfigChangeset), + v1_6.UpdateChainConfigConfig{ HomeChainSelector: homeChainSel, RemoteChainAdds: chainConfigs, }, @@ -306,20 +312,20 @@ func setupChains(lggr logger.Logger, e *deployment.Environment, homeChainSel uin }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployChainContractsChangeset), - changeset.DeployChainContractsConfig{ + deployment.CreateLegacyChangeSet(v1_6.DeployChainContractsChangeset), + v1_6.DeployChainContractsConfig{ HomeChainSelector: homeChainSel, ContractParamsPerChain: contractParams, }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.SetRMNRemoteOnRMNProxyChangeset), - changeset.SetRMNRemoteOnRMNProxyConfig{ + deployment.CreateLegacyChangeSet(v1_6.SetRMNRemoteOnRMNProxyChangeset), + v1_6.SetRMNRemoteOnRMNProxyConfig{ ChainSelectors: chainSelectors, }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.CCIPCapabilityJobspecChangeset), + deployment.CreateLegacyChangeSet(v1_6.CCIPCapabilityJobspecChangeset), nil, // ChangeSet does not use a config. ), ) @@ -336,10 +342,10 @@ func setupLinkPools(e *deployment.Environment) (deployment.Environment, error) { return *e, fmt.Errorf("failed to load onchain state: %w", err) } chainSelectors := e.AllChainSelectors() - poolInput := make(map[uint64]changeset.DeployTokenPoolInput) + poolInput := make(map[uint64]v1_5_1.DeployTokenPoolInput) pools := make(map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo) for _, chain := range chainSelectors { - poolInput[chain] = changeset.DeployTokenPoolInput{ + poolInput[chain] = v1_5_1.DeployTokenPoolInput{ Type: changeset.BurnMintTokenPool, LocalTokenDecimals: 18, AllowList: []common.Address{}, @@ -355,26 +361,26 @@ func setupLinkPools(e *deployment.Environment) (deployment.Environment, error) { } env, err := commonchangeset.Apply(nil, *e, nil, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployTokenPoolContractsChangeset), - changeset.DeployTokenPoolContractsConfig{ + deployment.CreateLegacyChangeSet(v1_5_1.DeployTokenPoolContractsChangeset), + v1_5_1.DeployTokenPoolContractsConfig{ TokenSymbol: changeset.LinkSymbol, NewPools: poolInput, }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ProposeAdminRoleChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.ProposeAdminRoleChangeset), changeset.TokenAdminRegistryChangesetConfig{ Pools: pools, }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.AcceptAdminRoleChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.AcceptAdminRoleChangeset), changeset.TokenAdminRegistryChangesetConfig{ Pools: pools, }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.SetPoolChangeset), + deployment.CreateLegacyChangeSet(v1_5_1.SetPoolChangeset), changeset.TokenAdminRegistryChangesetConfig{ Pools: pools, }, @@ -404,19 +410,19 @@ func setupLinkPools(e *deployment.Environment) (deployment.Environment, error) { func setupLanes(e *deployment.Environment, state changeset.CCIPOnChainState) (deployment.Environment, error) { eg := errgroup.Group{} - poolUpdates := make(map[uint64]changeset.TokenPoolConfig) - rateLimitPerChain := make(changeset.RateLimiterPerChain) + poolUpdates := make(map[uint64]v1_5_1.TokenPoolConfig) + rateLimitPerChain := make(v1_5_1.RateLimiterPerChain) mu := sync.Mutex{} for src := range e.Chains { src := src eg.Go(func() error { - onRampUpdatesByChain := make(map[uint64]map[uint64]changeset.OnRampDestinationUpdate) - pricesByChain := make(map[uint64]changeset.FeeQuoterPriceUpdatePerSource) + onRampUpdatesByChain := make(map[uint64]map[uint64]v1_6.OnRampDestinationUpdate) + pricesByChain := make(map[uint64]v1_6.FeeQuoterPriceUpdatePerSource) feeQuoterDestsUpdatesByChain := make(map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig) - updateOffRampSources := make(map[uint64]map[uint64]changeset.OffRampSourceUpdate) - updateRouterChanges := make(map[uint64]changeset.RouterUpdates) - onRampUpdatesByChain[src] = make(map[uint64]changeset.OnRampDestinationUpdate) - pricesByChain[src] = changeset.FeeQuoterPriceUpdatePerSource{ + updateOffRampSources := make(map[uint64]map[uint64]v1_6.OffRampSourceUpdate) + updateRouterChanges := make(map[uint64]v1_6.RouterUpdates) + onRampUpdatesByChain[src] = make(map[uint64]v1_6.OnRampDestinationUpdate) + pricesByChain[src] = v1_6.FeeQuoterPriceUpdatePerSource{ TokenPrices: map[common.Address]*big.Int{ state.Chains[src].LinkToken.Address(): testhelpers.DefaultLinkPrice, state.Chains[src].Weth9.Address(): testhelpers.DefaultWethPrice, @@ -424,22 +430,22 @@ func setupLanes(e *deployment.Environment, state changeset.CCIPOnChainState) (de GasPrices: make(map[uint64]*big.Int), } feeQuoterDestsUpdatesByChain[src] = make(map[uint64]fee_quoter.FeeQuoterDestChainConfig) - updateOffRampSources[src] = make(map[uint64]changeset.OffRampSourceUpdate) - updateRouterChanges[src] = changeset.RouterUpdates{ + updateOffRampSources[src] = make(map[uint64]v1_6.OffRampSourceUpdate) + updateRouterChanges[src] = v1_6.RouterUpdates{ OffRampUpdates: make(map[uint64]bool), OnRampUpdates: make(map[uint64]bool), } for dst := range e.Chains { if src != dst { - onRampUpdatesByChain[src][dst] = changeset.OnRampDestinationUpdate{ + onRampUpdatesByChain[src][dst] = v1_6.OnRampDestinationUpdate{ IsEnabled: true, AllowListEnabled: false, } pricesByChain[src].GasPrices[dst] = testhelpers.DefaultGasPrice - feeQuoterDestsUpdatesByChain[src][dst] = changeset.DefaultFeeQuoterDestChainConfig(true) + feeQuoterDestsUpdatesByChain[src][dst] = v1_6.DefaultFeeQuoterDestChainConfig(true) - updateOffRampSources[src][dst] = changeset.OffRampSourceUpdate{ + updateOffRampSources[src][dst] = v1_6.OffRampSourceUpdate{ IsEnabled: true, IsRMNVerificationDisabled: true, } @@ -447,7 +453,7 @@ func setupLanes(e *deployment.Environment, state changeset.CCIPOnChainState) (de updateRouterChanges[src].OffRampUpdates[dst] = true updateRouterChanges[src].OnRampUpdates[dst] = true mu.Lock() - rateLimitPerChain[dst] = changeset.RateLimiterConfig{ + rateLimitPerChain[dst] = v1_5_1.RateLimiterConfig{ Inbound: token_pool.RateLimiterConfig{ IsEnabled: false, Capacity: big.NewInt(0), @@ -462,9 +468,8 @@ func setupLanes(e *deployment.Environment, state changeset.CCIPOnChainState) (de mu.Unlock() } } - mu.Lock() - poolUpdates[src] = changeset.TokenPoolConfig{ + poolUpdates[src] = v1_5_1.TokenPoolConfig{ Type: changeset.BurnMintTokenPool, Version: deployment.Version1_5_1, ChainUpdates: rateLimitPerChain, @@ -473,32 +478,32 @@ func setupLanes(e *deployment.Environment, state changeset.CCIPOnChainState) (de _, err := commonchangeset.Apply(nil, *e, nil, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateOnRampsDestsChangeset), - changeset.UpdateOnRampDestsConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateOnRampsDestsChangeset), + v1_6.UpdateOnRampDestsConfig{ UpdatesByChain: onRampUpdatesByChain, }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterPricesChangeset), - changeset.UpdateFeeQuoterPricesConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateFeeQuoterPricesChangeset), + v1_6.UpdateFeeQuoterPricesConfig{ PricesByChain: pricesByChain, }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterDestsChangeset), - changeset.UpdateFeeQuoterDestsConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateFeeQuoterDestsChangeset), + v1_6.UpdateFeeQuoterDestsConfig{ UpdatesByChain: feeQuoterDestsUpdatesByChain, }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateOffRampSourcesChangeset), - changeset.UpdateOffRampSourcesConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateOffRampSourcesChangeset), + v1_6.UpdateOffRampSourcesConfig{ UpdatesByChain: updateOffRampSources, }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateRouterRampsChangeset), - changeset.UpdateRouterRampsConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateRouterRampsChangeset), + v1_6.UpdateRouterRampsConfig{ UpdatesByChain: updateRouterChanges, }, ), @@ -513,8 +518,8 @@ func setupLanes(e *deployment.Environment, state changeset.CCIPOnChainState) (de } _, err = commonchangeset.Apply(nil, *e, nil, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.ConfigureTokenPoolContractsChangeset), - changeset.ConfigureTokenPoolContractsConfig{ + deployment.CreateLegacyChangeSet(v1_5_1.ConfigureTokenPoolContractsChangeset), + v1_5_1.ConfigureTokenPoolContractsConfig{ TokenSymbol: changeset.LinkSymbol, PoolUpdates: poolUpdates, }, @@ -525,10 +530,10 @@ func setupLanes(e *deployment.Environment, state changeset.CCIPOnChainState) (de func mustOCR(e *deployment.Environment, homeChainSel uint64, feedChainSel uint64, newDons bool) (deployment.Environment, error) { chainSelectors := e.AllChainSelectors() - var ocrConfigPerSelector = make(map[uint64]changeset.CCIPOCRParams) + var ocrConfigPerSelector = make(map[uint64]v1_6.CCIPOCRParams) for selector := range e.Chains { - ocrConfigPerSelector[selector] = changeset.DeriveCCIPOCRParams(changeset.WithDefaultCommitOffChainConfig(feedChainSel, nil), - changeset.WithDefaultExecuteOffChainConfig(nil), + ocrConfigPerSelector[selector] = v1_6.DeriveCCIPOCRParams(v1_6.WithDefaultCommitOffChainConfig(feedChainSel, nil), + v1_6.WithDefaultExecuteOffChainConfig(nil), ) } @@ -536,13 +541,13 @@ func mustOCR(e *deployment.Environment, homeChainSel uint64, feedChainSel uint64 if newDons { commitChangeset = commonchangeset.Configure( // Add the DONs and candidate commit OCR instances for the chain - deployment.CreateLegacyChangeSet(changeset.AddDonAndSetCandidateChangeset), - changeset.AddDonAndSetCandidateChangesetConfig{ - SetCandidateConfigBase: changeset.SetCandidateConfigBase{ + deployment.CreateLegacyChangeSet(v1_6.AddDonAndSetCandidateChangeset), + v1_6.AddDonAndSetCandidateChangesetConfig{ + SetCandidateConfigBase: v1_6.SetCandidateConfigBase{ HomeChainSelector: homeChainSel, FeedChainSelector: feedChainSel, }, - PluginInfo: changeset.SetCandidatePluginInfo{ + PluginInfo: v1_6.SetCandidatePluginInfo{ OCRConfigPerRemoteChainSelector: ocrConfigPerSelector, PluginType: types.PluginTypeCCIPCommit, }, @@ -551,13 +556,13 @@ func mustOCR(e *deployment.Environment, homeChainSel uint64, feedChainSel uint64 } else { commitChangeset = commonchangeset.Configure( // Update commit OCR instances for existing chains - deployment.CreateLegacyChangeSet(changeset.SetCandidateChangeset), - changeset.SetCandidateChangesetConfig{ - SetCandidateConfigBase: changeset.SetCandidateConfigBase{ + deployment.CreateLegacyChangeSet(v1_6.SetCandidateChangeset), + v1_6.SetCandidateChangesetConfig{ + SetCandidateConfigBase: v1_6.SetCandidateConfigBase{ HomeChainSelector: homeChainSel, FeedChainSelector: feedChainSel, }, - PluginInfo: []changeset.SetCandidatePluginInfo{ + PluginInfo: []v1_6.SetCandidatePluginInfo{ { OCRConfigPerRemoteChainSelector: ocrConfigPerSelector, PluginType: types.PluginTypeCCIPCommit, @@ -571,13 +576,13 @@ func mustOCR(e *deployment.Environment, homeChainSel uint64, feedChainSel uint64 commitChangeset, commonchangeset.Configure( // Add the exec OCR instances for the new chains - deployment.CreateLegacyChangeSet(changeset.SetCandidateChangeset), - changeset.SetCandidateChangesetConfig{ - SetCandidateConfigBase: changeset.SetCandidateConfigBase{ + deployment.CreateLegacyChangeSet(v1_6.SetCandidateChangeset), + v1_6.SetCandidateChangesetConfig{ + SetCandidateConfigBase: v1_6.SetCandidateConfigBase{ HomeChainSelector: homeChainSel, FeedChainSelector: feedChainSel, }, - PluginInfo: []changeset.SetCandidatePluginInfo{ + PluginInfo: []v1_6.SetCandidatePluginInfo{ { OCRConfigPerRemoteChainSelector: ocrConfigPerSelector, PluginType: types.PluginTypeCCIPExec, @@ -587,10 +592,10 @@ func mustOCR(e *deployment.Environment, homeChainSel uint64, feedChainSel uint64 ), commonchangeset.Configure( // Promote everything - deployment.CreateLegacyChangeSet(changeset.PromoteCandidateChangeset), - changeset.PromoteCandidateChangesetConfig{ + deployment.CreateLegacyChangeSet(v1_6.PromoteCandidateChangeset), + v1_6.PromoteCandidateChangesetConfig{ HomeChainSelector: homeChainSel, - PluginInfo: []changeset.PromoteCandidatePluginInfo{ + PluginInfo: []v1_6.PromoteCandidatePluginInfo{ { RemoteChainSelectors: chainSelectors, PluginType: types.PluginTypeCCIPCommit, @@ -604,8 +609,8 @@ func mustOCR(e *deployment.Environment, homeChainSel uint64, feedChainSel uint64 ), commonchangeset.Configure( // Enable the OCR config on the remote chains - deployment.CreateLegacyChangeSet(changeset.SetOCR3OffRampChangeset), - changeset.SetOCR3OffRampConfig{ + deployment.CreateLegacyChangeSet(v1_6.SetOCR3OffRampChangeset), + v1_6.SetOCR3OffRampConfig{ HomeChainSel: homeChainSel, RemoteChainSels: chainSelectors, CCIPHomeConfigType: globals.ConfigTypeActive, diff --git a/integration-tests/load/ccip/ccip_test.go b/integration-tests/load/ccip/ccip_test.go index f23409334f4..a486742550e 100644 --- a/integration-tests/load/ccip/ccip_test.go +++ b/integration-tests/load/ccip/ccip_test.go @@ -13,12 +13,13 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink/deployment" + ccipchangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-testing-framework/wasp" - ccipchangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/environment/crib" tc "github.com/smartcontractkit/chainlink/integration-tests/testconfig" ) diff --git a/integration-tests/load/ccip/destination_gun.go b/integration-tests/load/ccip/destination_gun.go index bbf86ef8fe5..df5224b88ec 100644 --- a/integration-tests/load/ccip/destination_gun.go +++ b/integration-tests/load/ccip/destination_gun.go @@ -8,6 +8,7 @@ import ( "math/big" "math/rand" + ccipchangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" "github.com/ethereum/go-ethereum/accounts/abi/bind" @@ -18,7 +19,6 @@ import ( "github.com/smartcontractkit/chainlink-testing-framework/wasp" "github.com/smartcontractkit/chainlink/deployment" - ccipchangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/integration-tests/testconfig/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/utils" diff --git a/integration-tests/smoke/ccip/ccip_add_chain_test.go b/integration-tests/smoke/ccip/ccip_add_chain_test.go index fda84a94551..22c5acea9fa 100644 --- a/integration-tests/smoke/ccip/ccip_add_chain_test.go +++ b/integration-tests/smoke/ccip/ccip_add_chain_test.go @@ -10,7 +10,10 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" + "github.com/smartcontractkit/chainlink/deployment" + state2 "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" ccipcs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" @@ -37,7 +40,7 @@ func Test_AddChain(t *testing.T) { testhelpers.WithPrerequisiteDeploymentOnly(nil), testhelpers.WithNumOfUsersPerChain(usersPerChain), testhelpers.WithNoJobsAndContracts(), - testhelpers.WithOCRConfigOverride(func(params *ccipcs.CCIPOCRParams) { + testhelpers.WithOCRConfigOverride(func(params *v1_6.CCIPOCRParams) { // Only 1 boost (=OCR round) is enough to cover the fee params.ExecuteOffChainConfig.RelativeBoostPerWaitHour = 1 }), @@ -55,7 +58,7 @@ func Test_AddChain(t *testing.T) { ///////////////////////////////////// e = setupChain(t, e, tEnv, toDeploy, false) - state, err := ccipcs.LoadOnchainState(e.Env) + state, err := state2.LoadOnchainState(e.Env) require.NoError(t, err) tEnv.UpdateDeployedEnvironment(e) // check RMNRemote is up and RMNProxy is correctly wired. @@ -175,7 +178,7 @@ func Test_AddChain(t *testing.T) { // transferred to MCMS. e = setupChain(t, e, tEnv, []uint64{remainingChain}, true) - state, err = ccipcs.LoadOnchainState(e.Env) + state, err = state2.LoadOnchainState(e.Env) require.NoError(t, err) tEnv.UpdateDeployedEnvironment(e) @@ -199,7 +202,7 @@ func Test_AddChain(t *testing.T) { true, // mcmsEnabled ) - state, err = ccipcs.LoadOnchainState(e.Env) + state, err = state2.LoadOnchainState(e.Env) require.NoError(t, err) assertChainWiringOutbound( @@ -317,7 +320,7 @@ func Test_AddChain(t *testing.T) { true, // mcmsEnabled ) - state, err = ccipcs.LoadOnchainState(e.Env) + state, err = state2.LoadOnchainState(e.Env) require.NoError(t, err) assertChainWiringOutbound( @@ -435,15 +438,15 @@ func setupInboundWiring( var err error e.Env, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(ccipcs.UpdateOffRampSourcesChangeset), - ccipcs.UpdateOffRampSourcesConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateOffRampSourcesChangeset), + v1_6.UpdateOffRampSourcesConfig{ UpdatesByChain: offRampSourceUpdates(t, newChains, sources, testRouterEnabled), MCMS: mcmsConfig, }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(ccipcs.UpdateRouterRampsChangeset), - ccipcs.UpdateRouterRampsConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateRouterRampsChangeset), + v1_6.UpdateRouterRampsConfig{ TestRouter: testRouterEnabled, UpdatesByChain: routerOffRampUpdates(t, newChains, sources), MCMS: mcmsConfig, @@ -476,29 +479,29 @@ func setupOutboundWiring( var err error e.Env, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(ccipcs.UpdateOnRampsDestsChangeset), - ccipcs.UpdateOnRampDestsConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateOnRampsDestsChangeset), + v1_6.UpdateOnRampDestsConfig{ UpdatesByChain: onRampDestUpdates(t, newChains, sources, testRouterEnabled), MCMS: mcmsConfig, }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(ccipcs.UpdateFeeQuoterPricesChangeset), - ccipcs.UpdateFeeQuoterPricesConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateFeeQuoterPricesChangeset), + v1_6.UpdateFeeQuoterPricesConfig{ PricesByChain: feeQuoterPricesByChain(t, newChains, sources), MCMS: mcmsConfig, }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(ccipcs.UpdateFeeQuoterDestsChangeset), - ccipcs.UpdateFeeQuoterDestsConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateFeeQuoterDestsChangeset), + v1_6.UpdateFeeQuoterDestsConfig{ UpdatesByChain: feeQuoterDestUpdates(t, newChains, sources), MCMS: mcmsConfig, }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(ccipcs.UpdateRouterRampsChangeset), - ccipcs.UpdateRouterRampsConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateRouterRampsChangeset), + v1_6.UpdateRouterRampsConfig{ TestRouter: testRouterEnabled, UpdatesByChain: routerOnRampUpdates(t, newChains, sources), MCMS: mcmsConfig, @@ -520,8 +523,8 @@ func setupChain(t *testing.T, e testhelpers.DeployedEnv, tEnv testhelpers.TestEn var err error e.Env, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(ccipcs.SetRMNRemoteOnRMNProxyChangeset), - ccipcs.SetRMNRemoteOnRMNProxyConfig{ + deployment.CreateLegacyChangeSet(v1_6.SetRMNRemoteOnRMNProxyChangeset), + v1_6.SetRMNRemoteOnRMNProxyConfig{ ChainSelectors: chains, }, ), @@ -536,7 +539,7 @@ func setupChain(t *testing.T, e testhelpers.DeployedEnv, tEnv testhelpers.TestEn // It doesn't check that the existingChains have the newChain enabled as a dest. func assertChainWiringInbound( t *testing.T, - state ccipcs.CCIPOnChainState, + state state2.CCIPOnChainState, newChain uint64, existingChains []uint64, testRouterEnabled bool, @@ -582,7 +585,7 @@ func assertChainWiringInbound( // It doesn't check that the newChain can process the requests. func assertChainWiringOutbound( t *testing.T, - state ccipcs.CCIPOnChainState, + state state2.CCIPOnChainState, newChain uint64, existingChains []uint64, testRouterEnabled bool, @@ -619,13 +622,13 @@ func assertChainWiringOutbound( } // routerOffRampUpdates adds the provided sources to the router of the provided dest chain. -func routerOffRampUpdates(t *testing.T, dests []uint64, sources []uint64) (updates map[uint64]ccipcs.RouterUpdates) { - updates = make(map[uint64]ccipcs.RouterUpdates) +func routerOffRampUpdates(t *testing.T, dests []uint64, sources []uint64) (updates map[uint64]v1_6.RouterUpdates) { + updates = make(map[uint64]v1_6.RouterUpdates) for _, source := range sources { for _, dest := range dests { require.NotEqual(t, source, dest) if _, ok := updates[dest]; !ok { - updates[dest] = ccipcs.RouterUpdates{ + updates[dest] = v1_6.RouterUpdates{ OffRampUpdates: map[uint64]bool{ source: true, }, @@ -640,13 +643,13 @@ func routerOffRampUpdates(t *testing.T, dests []uint64, sources []uint64) (updat // routerOnRampUpdates sets each dest selector in the given dest chains slice on the router // to point to the local onramp on each source chain. -func routerOnRampUpdates(t *testing.T, dests []uint64, sources []uint64) (updates map[uint64]ccipcs.RouterUpdates) { - updates = make(map[uint64]ccipcs.RouterUpdates) +func routerOnRampUpdates(t *testing.T, dests []uint64, sources []uint64) (updates map[uint64]v1_6.RouterUpdates) { + updates = make(map[uint64]v1_6.RouterUpdates) for _, source := range sources { for _, dest := range dests { require.NotEqual(t, source, dest) if _, ok := updates[source]; !ok { - updates[source] = ccipcs.RouterUpdates{ + updates[source] = v1_6.RouterUpdates{ OnRampUpdates: map[uint64]bool{ dest: true, }, @@ -668,17 +671,17 @@ func feeQuoterDestUpdates(t *testing.T, dests []uint64, sources []uint64) (updat if _, ok := updates[source]; !ok { updates[source] = make(map[uint64]fee_quoter.FeeQuoterDestChainConfig) } - updates[source][dest] = ccipcs.DefaultFeeQuoterDestChainConfig(true) + updates[source][dest] = v1_6.DefaultFeeQuoterDestChainConfig(true) } } return } // feeQuoterPricesByChain sets the gas price for the provided dests on the fee quoters in the provided sources. -func feeQuoterPricesByChain(t *testing.T, dests []uint64, sources []uint64) (prices map[uint64]ccipcs.FeeQuoterPriceUpdatePerSource) { - prices = make(map[uint64]ccipcs.FeeQuoterPriceUpdatePerSource) +func feeQuoterPricesByChain(t *testing.T, dests []uint64, sources []uint64) (prices map[uint64]v1_6.FeeQuoterPriceUpdatePerSource) { + prices = make(map[uint64]v1_6.FeeQuoterPriceUpdatePerSource) for _, source := range sources { - prices[source] = ccipcs.FeeQuoterPriceUpdatePerSource{ + prices[source] = v1_6.FeeQuoterPriceUpdatePerSource{ GasPrices: make(map[uint64]*big.Int), } for _, dest := range dests { @@ -690,20 +693,20 @@ func feeQuoterPricesByChain(t *testing.T, dests []uint64, sources []uint64) (pri } // onRampDestUpdates adds the provided dests as destination chains to the onRamps on the provided sources. -func onRampDestUpdates(t *testing.T, dests []uint64, sources []uint64, testRouterEnabled bool) (updates map[uint64]map[uint64]ccipcs.OnRampDestinationUpdate) { - updates = make(map[uint64]map[uint64]ccipcs.OnRampDestinationUpdate) +func onRampDestUpdates(t *testing.T, dests []uint64, sources []uint64, testRouterEnabled bool) (updates map[uint64]map[uint64]v1_6.OnRampDestinationUpdate) { + updates = make(map[uint64]map[uint64]v1_6.OnRampDestinationUpdate) for _, source := range sources { for _, dest := range dests { require.NotEqual(t, source, dest) if _, ok := updates[source]; !ok { - updates[source] = map[uint64]ccipcs.OnRampDestinationUpdate{ + updates[source] = map[uint64]v1_6.OnRampDestinationUpdate{ dest: { IsEnabled: true, TestRouter: testRouterEnabled, }, } } else { - updates[source][dest] = ccipcs.OnRampDestinationUpdate{ + updates[source][dest] = v1_6.OnRampDestinationUpdate{ IsEnabled: true, TestRouter: testRouterEnabled, } @@ -714,15 +717,15 @@ func onRampDestUpdates(t *testing.T, dests []uint64, sources []uint64, testRoute } // offRampSourceUpdates adds the provided sources to the offRamp on the provided dest chains. -func offRampSourceUpdates(t *testing.T, dests []uint64, sources []uint64, testRouterEnabled bool) (updates map[uint64]map[uint64]ccipcs.OffRampSourceUpdate) { - updates = make(map[uint64]map[uint64]ccipcs.OffRampSourceUpdate) +func offRampSourceUpdates(t *testing.T, dests []uint64, sources []uint64, testRouterEnabled bool) (updates map[uint64]map[uint64]v1_6.OffRampSourceUpdate) { + updates = make(map[uint64]map[uint64]v1_6.OffRampSourceUpdate) for _, source := range sources { for _, dest := range dests { require.NotEqual(t, source, dest) if _, ok := updates[dest]; !ok { - updates[dest] = make(map[uint64]ccipcs.OffRampSourceUpdate) + updates[dest] = make(map[uint64]v1_6.OffRampSourceUpdate) } - updates[dest][source] = ccipcs.OffRampSourceUpdate{ + updates[dest][source] = v1_6.OffRampSourceUpdate{ IsEnabled: true, TestRouter: testRouterEnabled, IsRMNVerificationDisabled: true, @@ -732,7 +735,7 @@ func offRampSourceUpdates(t *testing.T, dests []uint64, sources []uint64, testRo return } -func assertRMNRemoteAndProxyState(t *testing.T, chains []uint64, state ccipcs.CCIPOnChainState) { +func assertRMNRemoteAndProxyState(t *testing.T, chains []uint64, state state2.CCIPOnChainState) { for _, chain := range chains { require.NotEqual(t, common.Address{}, state.Chains[chain].RMNRemote.Address()) _, err := state.Chains[chain].RMNRemote.GetCursedSubjects(&bind.CallOpts{ @@ -756,7 +759,7 @@ func transferToMCMSAndRenounceTimelockDeployer( t *testing.T, e testhelpers.DeployedEnv, chains []uint64, - state ccipcs.CCIPOnChainState, + state state2.CCIPOnChainState, onlyChainContracts bool, ) { apps := make([]commonchangeset.ConfiguredChangeSet, 0, len(chains)+1) diff --git a/integration-tests/smoke/ccip/ccip_batching_test.go b/integration-tests/smoke/ccip/ccip_batching_test.go index 32ee6947d13..6b87a104a78 100644 --- a/integration-tests/smoke/ccip/ccip_batching_test.go +++ b/integration-tests/smoke/ccip/ccip_batching_test.go @@ -15,11 +15,11 @@ import ( "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-common/pkg/merklemulti" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" diff --git a/integration-tests/smoke/ccip/ccip_cs_rmn_curse_uncurse_test.go b/integration-tests/smoke/ccip/ccip_cs_rmn_curse_uncurse_test.go index 5cc5540cd64..c5457d2bee6 100644 --- a/integration-tests/smoke/ccip/ccip_cs_rmn_curse_uncurse_test.go +++ b/integration-tests/smoke/ccip/ccip_cs_rmn_curse_uncurse_test.go @@ -9,6 +9,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" ) @@ -22,7 +23,7 @@ type curseAssertion struct { type CurseTestCase struct { name string - curseActionsBuilder func(mapIDToSelectorFunc) []changeset.CurseAction + curseActionsBuilder func(mapIDToSelectorFunc) []v1_6.CurseAction curseAssertions []curseAssertion } @@ -31,8 +32,8 @@ type mapIDToSelectorFunc func(uint64) uint64 var testCases = []CurseTestCase{ { name: "lane", - curseActionsBuilder: func(mapIDToSelector mapIDToSelectorFunc) []changeset.CurseAction { - return []changeset.CurseAction{changeset.CurseLaneBidirectionally(mapIDToSelector(0), mapIDToSelector(1))} + curseActionsBuilder: func(mapIDToSelector mapIDToSelectorFunc) []v1_6.CurseAction { + return []v1_6.CurseAction{v1_6.CurseLaneBidirectionally(mapIDToSelector(0), mapIDToSelector(1))} }, curseAssertions: []curseAssertion{ {chainID: 0, subject: 1, cursed: true}, @@ -45,10 +46,10 @@ var testCases = []CurseTestCase{ }, { name: "lane duplicate", - curseActionsBuilder: func(mapIDToSelector mapIDToSelectorFunc) []changeset.CurseAction { - return []changeset.CurseAction{ - changeset.CurseLaneBidirectionally(mapIDToSelector(0), mapIDToSelector(1)), - changeset.CurseLaneBidirectionally(mapIDToSelector(0), mapIDToSelector(1))} + curseActionsBuilder: func(mapIDToSelector mapIDToSelectorFunc) []v1_6.CurseAction { + return []v1_6.CurseAction{ + v1_6.CurseLaneBidirectionally(mapIDToSelector(0), mapIDToSelector(1)), + v1_6.CurseLaneBidirectionally(mapIDToSelector(0), mapIDToSelector(1))} }, curseAssertions: []curseAssertion{ {chainID: 0, subject: 1, cursed: true}, @@ -61,8 +62,8 @@ var testCases = []CurseTestCase{ }, { name: "chain", - curseActionsBuilder: func(mapIDToSelector mapIDToSelectorFunc) []changeset.CurseAction { - return []changeset.CurseAction{changeset.CurseChain(mapIDToSelector(0))} + curseActionsBuilder: func(mapIDToSelector mapIDToSelectorFunc) []v1_6.CurseAction { + return []v1_6.CurseAction{v1_6.CurseChain(mapIDToSelector(0))} }, curseAssertions: []curseAssertion{ {chainID: 0, globalCurse: true, cursed: true}, @@ -74,8 +75,8 @@ var testCases = []CurseTestCase{ }, { name: "chain duplicate", - curseActionsBuilder: func(mapIDToSelector mapIDToSelectorFunc) []changeset.CurseAction { - return []changeset.CurseAction{changeset.CurseChain(mapIDToSelector(0)), changeset.CurseChain(mapIDToSelector(0))} + curseActionsBuilder: func(mapIDToSelector mapIDToSelectorFunc) []v1_6.CurseAction { + return []v1_6.CurseAction{v1_6.CurseChain(mapIDToSelector(0)), v1_6.CurseChain(mapIDToSelector(0))} }, curseAssertions: []curseAssertion{ {chainID: 0, globalCurse: true, cursed: true}, @@ -87,8 +88,8 @@ var testCases = []CurseTestCase{ }, { name: "chain and lanes", - curseActionsBuilder: func(mapIDToSelector mapIDToSelectorFunc) []changeset.CurseAction { - return []changeset.CurseAction{changeset.CurseChain(mapIDToSelector(0)), changeset.CurseLaneBidirectionally(mapIDToSelector(1), mapIDToSelector(2))} + curseActionsBuilder: func(mapIDToSelector mapIDToSelectorFunc) []v1_6.CurseAction { + return []v1_6.CurseAction{v1_6.CurseChain(mapIDToSelector(0)), v1_6.CurseLaneBidirectionally(mapIDToSelector(1), mapIDToSelector(2))} }, curseAssertions: []curseAssertion{ {chainID: 0, globalCurse: true, cursed: true}, @@ -155,17 +156,17 @@ func runRmnUncurseTest(t *testing.T, tc CurseTestCase) { verifyNoActiveCurseOnAllChains(t, &e) - config := changeset.RMNCurseConfig{ + config := v1_6.RMNCurseConfig{ CurseActions: tc.curseActionsBuilder(mapIDToSelector), Reason: "test curse", } - _, err := changeset.RMNCurseChangeset(e.Env, config) + _, err := v1_6.RMNCurseChangeset(e.Env, config) require.NoError(t, err) verifyTestCaseAssertions(t, &e, tc, mapIDToSelector) - _, err = changeset.RMNUncurseChangeset(e.Env, config) + _, err = v1_6.RMNUncurseChangeset(e.Env, config) require.NoError(t, err) verifyNoActiveCurseOnAllChains(t, &e) @@ -173,7 +174,7 @@ func runRmnUncurseTest(t *testing.T, tc CurseTestCase) { func transferRMNContractToMCMS(t *testing.T, e *testhelpers.DeployedEnv, state changeset.CCIPOnChainState, timelocksPerChain map[uint64]*proposalutils.TimelockExecutionContracts) { contractsByChain := make(map[uint64][]common.Address) - rmnRemotePerChain := changeset.BuildRMNRemotePerChain(e.Env, state) + rmnRemotePerChain := v1_6.BuildRMNRemotePerChain(e.Env, state) rmnRemoteAddressesByChain := make(map[uint64]common.Address) for chain, remote := range rmnRemotePerChain { if remote == nil { @@ -207,7 +208,7 @@ func runRmnUncurseMCMSTest(t *testing.T, tc CurseTestCase) { return e.Env.AllChainSelectors()[id] } - config := changeset.RMNCurseConfig{ + config := v1_6.RMNCurseConfig{ CurseActions: tc.curseActionsBuilder(mapIDToSelector), Reason: "test curse", MCMS: &changeset.MCMSConfig{MinDelay: 0}, @@ -224,7 +225,7 @@ func runRmnUncurseMCMSTest(t *testing.T, tc CurseTestCase) { _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.RMNCurseChangeset), + deployment.CreateLegacyChangeSet(v1_6.RMNCurseChangeset), config, ), ) @@ -234,7 +235,7 @@ func runRmnUncurseMCMSTest(t *testing.T, tc CurseTestCase) { _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.RMNUncurseChangeset), + deployment.CreateLegacyChangeSet(v1_6.RMNUncurseChangeset), config, ), ) @@ -250,7 +251,7 @@ func runRmnCurseConfigValidateTest(t *testing.T, tc CurseTestCase) { return e.Env.AllChainSelectors()[id] } - config := changeset.RMNCurseConfig{ + config := v1_6.RMNCurseConfig{ CurseActions: tc.curseActionsBuilder(mapIDToSelector), Reason: "test curse", } @@ -268,12 +269,12 @@ func runRmnCurseTest(t *testing.T, tc CurseTestCase) { verifyNoActiveCurseOnAllChains(t, &e) - config := changeset.RMNCurseConfig{ + config := v1_6.RMNCurseConfig{ CurseActions: tc.curseActionsBuilder(mapIDToSelector), Reason: "test curse", } - _, err := changeset.RMNCurseChangeset(e.Env, config) + _, err := v1_6.RMNCurseChangeset(e.Env, config) require.NoError(t, err) verifyTestCaseAssertions(t, &e, tc, mapIDToSelector) @@ -288,15 +289,15 @@ func runRmnCurseIdempotentTest(t *testing.T, tc CurseTestCase) { verifyNoActiveCurseOnAllChains(t, &e) - config := changeset.RMNCurseConfig{ + config := v1_6.RMNCurseConfig{ CurseActions: tc.curseActionsBuilder(mapIDToSelector), Reason: "test curse", } - _, err := changeset.RMNCurseChangeset(e.Env, config) + _, err := v1_6.RMNCurseChangeset(e.Env, config) require.NoError(t, err) - _, err = changeset.RMNCurseChangeset(e.Env, config) + _, err = v1_6.RMNCurseChangeset(e.Env, config) require.NoError(t, err) verifyTestCaseAssertions(t, &e, tc, mapIDToSelector) @@ -311,20 +312,20 @@ func runRmnUncurseIdempotentTest(t *testing.T, tc CurseTestCase) { verifyNoActiveCurseOnAllChains(t, &e) - config := changeset.RMNCurseConfig{ + config := v1_6.RMNCurseConfig{ CurseActions: tc.curseActionsBuilder(mapIDToSelector), Reason: "test curse", } - _, err := changeset.RMNCurseChangeset(e.Env, config) + _, err := v1_6.RMNCurseChangeset(e.Env, config) require.NoError(t, err) verifyTestCaseAssertions(t, &e, tc, mapIDToSelector) - _, err = changeset.RMNUncurseChangeset(e.Env, config) + _, err = v1_6.RMNUncurseChangeset(e.Env, config) require.NoError(t, err) - _, err = changeset.RMNUncurseChangeset(e.Env, config) + _, err = v1_6.RMNUncurseChangeset(e.Env, config) require.NoError(t, err) verifyNoActiveCurseOnAllChains(t, &e) @@ -337,7 +338,7 @@ func runRmnCurseMCMSTest(t *testing.T, tc CurseTestCase) { return e.Env.AllChainSelectors()[id] } - config := changeset.RMNCurseConfig{ + config := v1_6.RMNCurseConfig{ CurseActions: tc.curseActionsBuilder(mapIDToSelector), Reason: "test curse", MCMS: &changeset.MCMSConfig{MinDelay: 0}, @@ -354,7 +355,7 @@ func runRmnCurseMCMSTest(t *testing.T, tc CurseTestCase) { _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.RMNCurseChangeset), + deployment.CreateLegacyChangeSet(v1_6.RMNCurseChangeset), config, ), ) @@ -368,9 +369,9 @@ func verifyTestCaseAssertions(t *testing.T, e *testhelpers.DeployedEnv, tc Curse require.NoError(t, err) for _, assertion := range tc.curseAssertions { - cursedSubject := changeset.SelectorToSubject(mapIDToSelector(assertion.subject)) + cursedSubject := v1_6.SelectorToSubject(mapIDToSelector(assertion.subject)) if assertion.globalCurse { - cursedSubject = changeset.GlobalCurseSubject() + cursedSubject = v1_6.GlobalCurseSubject() } isCursed, err := state.Chains[mapIDToSelector(assertion.chainID)].RMNRemote.IsCursed(nil, cursedSubject) diff --git a/integration-tests/smoke/ccip/ccip_cs_update_rmn_config_test.go b/integration-tests/smoke/ccip/ccip_cs_update_rmn_config_test.go index aa2e5477d8c..40997ccc1ee 100644 --- a/integration-tests/smoke/ccip/ccip_cs_update_rmn_config_test.go +++ b/integration-tests/smoke/ccip/ccip_cs_update_rmn_config_test.go @@ -10,6 +10,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" @@ -18,19 +19,19 @@ import ( ) var ( - rmnStaging1 = changeset.RMNNopConfig{ + rmnStaging1 = v1_6.RMNNopConfig{ NodeIndex: 0, PeerId: deployment.MustPeerIDFromString("p2p_12D3KooWRXxZq3pd4a3ZGkKj7Nt1SQQrnB8CuvbPnnV9KVeMeWqg"), OffchainPublicKey: [32]byte(common.FromHex("0xb34944857a42444d1b285d7940d6e06682309e0781e43a69676ee9f85c73c2d1")), EVMOnChainPublicKey: common.HexToAddress("0x5af8ee32316a6427f169a45fdc1b3a91a85ac459e3c1cb91c69e1c51f0c1fc21"), } - rmnStaging2 = changeset.RMNNopConfig{ + rmnStaging2 = v1_6.RMNNopConfig{ NodeIndex: 1, PeerId: deployment.MustPeerIDFromString("p2p_12D3KooWEmdxYQFsRbD9aFczF32zA3CcUwuSiWCk2CrmACo4v9RL"), OffchainPublicKey: [32]byte(common.FromHex("0x68d9f3f274e3985528a923a9bace3d39c55dd778b187b4120b384cc48c892859")), EVMOnChainPublicKey: common.HexToAddress("0x858589216956f482a0f68b282a7050af4cd48ed2"), } - rmnStaging3 = changeset.RMNNopConfig{ + rmnStaging3 = v1_6.RMNNopConfig{ NodeIndex: 2, PeerId: deployment.MustPeerIDFromString("p2p_12D3KooWJS42cNXKJvj6DeZnxEX7aGxhEuap6uNFrz554AbUDw6Q"), OffchainPublicKey: [32]byte(common.FromHex("0x5af8ee32316a6427f169a45fdc1b3a91a85ac459e3c1cb91c69e1c51f0c1fc21")), @@ -41,7 +42,7 @@ var ( type updateRMNConfigTestCase struct { useMCMS bool name string - nops []changeset.RMNNopConfig + nops []v1_6.RMNNopConfig } func TestUpdateRMNConfig(t *testing.T) { @@ -50,12 +51,12 @@ func TestUpdateRMNConfig(t *testing.T) { { useMCMS: true, name: "with MCMS", - nops: []changeset.RMNNopConfig{rmnStaging1, rmnStaging2, rmnStaging3}, + nops: []v1_6.RMNNopConfig{rmnStaging1, rmnStaging2, rmnStaging3}, }, { useMCMS: false, name: "without MCMS", - nops: []changeset.RMNNopConfig{rmnStaging1, rmnStaging2, rmnStaging3}, + nops: []v1_6.RMNNopConfig{rmnStaging1, rmnStaging2, rmnStaging3}, }, } @@ -73,13 +74,13 @@ func TestSetDynamicConfig(t *testing.T) { require.NoError(t, err) rmnHome := state.Chains[e.HomeChainSel].RMNHome - nops := []changeset.RMNNopConfig{rmnStaging1, rmnStaging2, rmnStaging3} + nops := []v1_6.RMNNopConfig{rmnStaging1, rmnStaging2, rmnStaging3} nodes := make([]rmn_home.RMNHomeNode, 0, len(nops)) for _, nop := range nops { nodes = append(nodes, nop.ToRMNHomeNode()) } - setRMNHomeCandidateConfig := changeset.SetRMNHomeCandidateConfig{ + setRMNHomeCandidateConfig := v1_6.SetRMNHomeCandidateConfig{ HomeChainSelector: e.HomeChainSel, RMNStaticConfig: rmn_home.RMNHomeStaticConfig{ Nodes: nodes, @@ -91,24 +92,24 @@ func TestSetDynamicConfig(t *testing.T) { }, } - _, err = changeset.SetRMNHomeCandidateConfigChangeset(e.Env, setRMNHomeCandidateConfig) + _, err = v1_6.SetRMNHomeCandidateConfigChangeset(e.Env, setRMNHomeCandidateConfig) require.NoError(t, err) candidate, err := rmnHome.GetCandidateDigest(nil) require.NoError(t, err) - promoteCandidateConfig := changeset.PromoteRMNHomeCandidateConfig{ + promoteCandidateConfig := v1_6.PromoteRMNHomeCandidateConfig{ HomeChainSelector: e.HomeChainSel, DigestToPromote: candidate, } - _, err = changeset.PromoteRMNHomeCandidateConfigChangeset(e.Env, promoteCandidateConfig) + _, err = v1_6.PromoteRMNHomeCandidateConfigChangeset(e.Env, promoteCandidateConfig) require.NoError(t, err) active, err := rmnHome.GetActiveDigest(nil) require.NoError(t, err) - setDynamicConfig := changeset.SetRMNHomeDynamicConfigConfig{ + setDynamicConfig := v1_6.SetRMNHomeDynamicConfigConfig{ HomeChainSelector: e.HomeChainSel, RMNDynamicConfig: rmn_home.RMNHomeDynamicConfig{ SourceChains: []rmn_home.RMNHomeSourceChain{ @@ -122,7 +123,7 @@ func TestSetDynamicConfig(t *testing.T) { ActiveDigest: active, } - _, err = changeset.SetRMNHomeDynamicConfigChangeset(e.Env, setDynamicConfig) + _, err = v1_6.SetRMNHomeDynamicConfigChangeset(e.Env, setDynamicConfig) require.NoError(t, err) dynamicConfig, err := rmnHome.GetConfig(nil, active) @@ -138,13 +139,13 @@ func TestRevokeConfig(t *testing.T) { require.NoError(t, err) rmnHome := state.Chains[e.HomeChainSel].RMNHome - nops := []changeset.RMNNopConfig{rmnStaging1, rmnStaging2, rmnStaging3} + nops := []v1_6.RMNNopConfig{rmnStaging1, rmnStaging2, rmnStaging3} nodes := make([]rmn_home.RMNHomeNode, 0, len(nops)) for _, nop := range nops { nodes = append(nodes, nop.ToRMNHomeNode()) } - setRMNHomeCandidateConfig := changeset.SetRMNHomeCandidateConfig{ + setRMNHomeCandidateConfig := v1_6.SetRMNHomeCandidateConfig{ HomeChainSelector: e.HomeChainSel, RMNStaticConfig: rmn_home.RMNHomeStaticConfig{ Nodes: nodes, @@ -156,18 +157,18 @@ func TestRevokeConfig(t *testing.T) { }, } - _, err = changeset.SetRMNHomeCandidateConfigChangeset(e.Env, setRMNHomeCandidateConfig) + _, err = v1_6.SetRMNHomeCandidateConfigChangeset(e.Env, setRMNHomeCandidateConfig) require.NoError(t, err) candidate, err := rmnHome.GetCandidateDigest(nil) require.NoError(t, err) - revokeCandidateConfig := changeset.RevokeCandidateConfig{ + revokeCandidateConfig := v1_6.RevokeCandidateConfig{ HomeChainSelector: e.HomeChainSel, CandidateDigest: candidate, } - _, err = changeset.RevokeRMNHomeCandidateConfigChangeset(e.Env, revokeCandidateConfig) + _, err = v1_6.RevokeRMNHomeCandidateConfigChangeset(e.Env, revokeCandidateConfig) require.NoError(t, err) newCandidate, err := rmnHome.GetCandidateDigest(nil) @@ -224,7 +225,7 @@ func updateRMNConfig(t *testing.T, tc updateRMNConfigTestCase) { nodes = append(nodes, nop.ToRMNHomeNode()) } - setRMNHomeCandidateConfig := changeset.SetRMNHomeCandidateConfig{ + setRMNHomeCandidateConfig := v1_6.SetRMNHomeCandidateConfig{ HomeChainSelector: e.HomeChainSel, RMNStaticConfig: rmn_home.RMNHomeStaticConfig{ Nodes: nodes, @@ -239,7 +240,7 @@ func updateRMNConfig(t *testing.T, tc updateRMNConfigTestCase) { _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.SetRMNHomeCandidateConfigChangeset), + deployment.CreateLegacyChangeSet(v1_6.SetRMNHomeCandidateConfigChangeset), setRMNHomeCandidateConfig, ), ) @@ -257,7 +258,7 @@ func updateRMNConfig(t *testing.T, tc updateRMNConfigTestCase) { require.NotEqual(t, previousCandidateDigest, currentCandidateDigest) require.Equal(t, previousActiveDigest, currentActiveDigest) - promoteConfig := changeset.PromoteRMNHomeCandidateConfig{ + promoteConfig := v1_6.PromoteRMNHomeCandidateConfig{ HomeChainSelector: e.HomeChainSel, DigestToPromote: currentCandidateDigest, MCMSConfig: mcmsConfig, @@ -265,7 +266,7 @@ func updateRMNConfig(t *testing.T, tc updateRMNConfigTestCase) { _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.PromoteRMNHomeCandidateConfigChangeset), + deployment.CreateLegacyChangeSet(v1_6.PromoteRMNHomeCandidateConfigChangeset), promoteConfig, ), ) @@ -281,9 +282,9 @@ func updateRMNConfig(t *testing.T, tc updateRMNConfigTestCase) { signers = append(signers, nop.ToRMNRemoteSigner()) } - remoteConfigs := make(map[uint64]changeset.RMNRemoteConfig, len(e.Env.Chains)) + remoteConfigs := make(map[uint64]v1_6.RMNRemoteConfig, len(e.Env.Chains)) for _, chain := range e.Env.Chains { - remoteConfig := changeset.RMNRemoteConfig{ + remoteConfig := v1_6.RMNRemoteConfig{ Signers: signers, F: 0, } @@ -291,7 +292,7 @@ func updateRMNConfig(t *testing.T, tc updateRMNConfigTestCase) { remoteConfigs[chain.Selector] = remoteConfig } - setRemoteConfig := changeset.SetRMNRemoteConfig{ + setRemoteConfig := v1_6.SetRMNRemoteConfig{ HomeChainSelector: e.HomeChainSel, RMNRemoteConfigs: remoteConfigs, MCMSConfig: mcmsConfig, @@ -299,13 +300,13 @@ func updateRMNConfig(t *testing.T, tc updateRMNConfigTestCase) { _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.SetRMNRemoteConfigChangeset), + deployment.CreateLegacyChangeSet(v1_6.SetRMNRemoteConfigChangeset), setRemoteConfig, ), ) require.NoError(t, err) - rmnRemotePerChain := changeset.BuildRMNRemotePerChain(e.Env, state) + rmnRemotePerChain := v1_6.BuildRMNRemotePerChain(e.Env, state) for _, rmnRemote := range rmnRemotePerChain { remoteConfigSetEvents, err := rmnRemote.FilterConfigSet(nil, nil) require.NoError(t, err) @@ -319,7 +320,7 @@ func updateRMNConfig(t *testing.T, tc updateRMNConfigTestCase) { } func buildRMNRemoteAddressPerChain(e deployment.Environment, state changeset.CCIPOnChainState) map[uint64]common.Address { - rmnRemotePerChain := changeset.BuildRMNRemotePerChain(e, state) + rmnRemotePerChain := v1_6.BuildRMNRemotePerChain(e, state) rmnRemoteAddressPerChain := make(map[uint64]common.Address) for chain, remote := range rmnRemotePerChain { if remote == nil { @@ -371,15 +372,15 @@ func TestSetRMNRemoteOnRMNProxy(t *testing.T) { contractsByChain[chain] = []common.Address{rmnProxy.Address()} } timelockContractsPerChain := make(map[uint64]*proposalutils.TimelockExecutionContracts) - allContractParams := make(map[uint64]changeset.ChainContractParams) + allContractParams := make(map[uint64]v1_6.ChainContractParams) for _, chain := range allChains { timelockContractsPerChain[chain] = &proposalutils.TimelockExecutionContracts{ Timelock: state.Chains[chain].Timelock, CallProxy: state.Chains[chain].CallProxy, } - allContractParams[chain] = changeset.ChainContractParams{ - FeeQuoterParams: changeset.DefaultFeeQuoterParams(), - OffRampParams: changeset.DefaultOffRampParams(), + allContractParams[chain] = v1_6.ChainContractParams{ + FeeQuoterParams: v1_6.DefaultFeeQuoterParams(), + OffRampParams: v1_6.DefaultOffRampParams(), } } envNodes, err := deployment.NodeInfo(e.Env.NodeIDs, e.Env.Offchain) @@ -394,8 +395,8 @@ func TestSetRMNRemoteOnRMNProxy(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployHomeChainChangeset), - changeset.DeployHomeChainConfig{ + deployment.CreateLegacyChangeSet(v1_6.DeployHomeChainChangeset), + v1_6.DeployHomeChainConfig{ HomeChainSel: e.HomeChainSel, RMNDynamicConfig: testhelpers.NewTestRMNDynamicConfig(), RMNStaticConfig: testhelpers.NewTestRMNStaticConfig(), @@ -406,15 +407,15 @@ func TestSetRMNRemoteOnRMNProxy(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployChainContractsChangeset), - changeset.DeployChainContractsConfig{ + deployment.CreateLegacyChangeSet(v1_6.DeployChainContractsChangeset), + v1_6.DeployChainContractsConfig{ HomeChainSelector: e.HomeChainSel, ContractParamsPerChain: allContractParams, }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.SetRMNRemoteOnRMNProxyChangeset), - changeset.SetRMNRemoteOnRMNProxyConfig{ + deployment.CreateLegacyChangeSet(v1_6.SetRMNRemoteOnRMNProxyChangeset), + v1_6.SetRMNRemoteOnRMNProxyConfig{ ChainSelectors: allChains, MCMSConfig: &changeset.MCMSConfig{ MinDelay: 0, diff --git a/integration-tests/smoke/ccip/ccip_disable_lane_test.go b/integration-tests/smoke/ccip/ccip_disable_lane_test.go index 91c1f9f6a7f..e6381100d3a 100644 --- a/integration-tests/smoke/ccip/ccip_disable_lane_test.go +++ b/integration-tests/smoke/ccip/ccip_disable_lane_test.go @@ -15,6 +15,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" @@ -132,7 +133,7 @@ func TestDisableLane(t *testing.T) { state.Chains[pair.SourceChainSelector].LinkToken.Address(): linkPrice, state.Chains[pair.SourceChainSelector].Weth9.Address(): wethPrice, }, - changeset.DefaultFeeQuoterDestChainConfig(true)) + v1_6.DefaultFeeQuoterDestChainConfig(true)) } // send a message in all the lane including re-enabled lanes for _, pair := range pairs { diff --git a/integration-tests/smoke/ccip/ccip_fee_boosting_test.go b/integration-tests/smoke/ccip/ccip_fee_boosting_test.go index 8114cd3f803..e8e300b466f 100644 --- a/integration-tests/smoke/ccip/ccip_fee_boosting_test.go +++ b/integration-tests/smoke/ccip/ccip_fee_boosting_test.go @@ -8,7 +8,9 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/config" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" @@ -24,7 +26,6 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" ) @@ -38,7 +39,7 @@ func Test_CCIPFeeBoosting(t *testing.T) { t.Skip("Skipping test as Fee Boosting is disabled") e, _, _ := testsetups.NewIntegrationEnvironment( t, - testhelpers.WithOCRConfigOverride(func(params *changeset.CCIPOCRParams) { + testhelpers.WithOCRConfigOverride(func(params *v1_6.CCIPOCRParams) { params.ExecuteOffChainConfig.RelativeBoostPerWaitHour = 1 // Disable token price updates params.CommitOffChainConfig.TokenPriceBatchWriteFrequency = *config.MustNewDuration(1_000_000 * time.Hour) @@ -81,7 +82,7 @@ func Test_CCIPFeeBoosting(t *testing.T) { ) t.Log("Adjusted gas price on dest chain:", adjustedGasPriceDest) - feeQuoterCfg := changeset.DefaultFeeQuoterDestChainConfig(true) + feeQuoterCfg := v1_6.DefaultFeeQuoterDestChainConfig(true) // the default adds 10% to the gas price, we want to increase it // to make sure the fee boosting will be finished in proper time for testing feeQuoterCfg.GasMultiplierWeiPerEth = 120e16 @@ -99,9 +100,9 @@ func Test_CCIPFeeBoosting(t *testing.T) { // Update token prices in destination chain FeeQuoter e.Env, err = commoncs.Apply(t, e.Env, e.TimelockContracts(t), commoncs.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterPricesChangeset), - changeset.UpdateFeeQuoterPricesConfig{ - PricesByChain: map[uint64]changeset.FeeQuoterPriceUpdatePerSource{ + deployment.CreateLegacyChangeSet(v1_6.UpdateFeeQuoterPricesChangeset), + v1_6.UpdateFeeQuoterPricesConfig{ + PricesByChain: map[uint64]v1_6.FeeQuoterPriceUpdatePerSource{ destChain: { TokenPrices: map[common.Address]*big.Int{ state.Chains[destChain].LinkToken.Address(): linkPrice, @@ -140,9 +141,9 @@ func Test_CCIPFeeBoosting(t *testing.T) { e.Env, err = commoncs.Apply(t, e.Env, e.TimelockContracts(t), commoncs.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterPricesChangeset), - changeset.UpdateFeeQuoterPricesConfig{ - PricesByChain: map[uint64]changeset.FeeQuoterPriceUpdatePerSource{ + deployment.CreateLegacyChangeSet(v1_6.UpdateFeeQuoterPricesChangeset), + v1_6.UpdateFeeQuoterPricesConfig{ + PricesByChain: map[uint64]v1_6.FeeQuoterPriceUpdatePerSource{ sourceChain: { GasPrices: map[uint64]*big.Int{ destChain: originalGasPriceDestUSD, diff --git a/integration-tests/smoke/ccip/ccip_gas_price_updates_test.go b/integration-tests/smoke/ccip/ccip_gas_price_updates_test.go index 37668260c51..96e99ec4929 100644 --- a/integration-tests/smoke/ccip/ccip_gas_price_updates_test.go +++ b/integration-tests/smoke/ccip/ccip_gas_price_updates_test.go @@ -16,6 +16,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" ) @@ -28,7 +29,7 @@ func Test_CCIPGasPriceUpdates(t *testing.T) { var gasPriceExpiry = 5 * time.Second e, _, _ := testsetups.NewIntegrationEnvironment(t, - testhelpers.WithOCRConfigOverride(func(params *changeset.CCIPOCRParams) { + testhelpers.WithOCRConfigOverride(func(params *v1_6.CCIPOCRParams) { params.CommitOffChainConfig.RemoteGasPriceBatchWriteFrequency = *config.MustNewDuration(gasPriceExpiry) }), ) diff --git a/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go b/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go index 5e6279f5748..ec689da2a13 100644 --- a/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go +++ b/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go @@ -15,10 +15,12 @@ import ( "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" v1_5testhelpers "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers/v1_5" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5" @@ -189,8 +191,8 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { e.Env, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), commonchangeset.Configure( // as we have already transferred ownership for RMNProxy to MCMS, it needs to be done via MCMS proposal - deployment.CreateLegacyChangeSet(changeset.SetRMNRemoteOnRMNProxyChangeset), - changeset.SetRMNRemoteOnRMNProxyConfig{ + deployment.CreateLegacyChangeSet(v1_6.SetRMNRemoteOnRMNProxyChangeset), + v1_6.SetRMNRemoteOnRMNProxyConfig{ ChainSelectors: e.Env.AllChainSelectors(), MCMSConfig: &changeset.MCMSConfig{ MinDelay: 0, @@ -198,12 +200,12 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateNonceManagersChangeset), - changeset.UpdateNonceManagerConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateNonceManagersChangeset), + v1_6.UpdateNonceManagerConfig{ // we only have lanes between src1 --> dest - UpdatesByChain: map[uint64]changeset.NonceManagerUpdate{ + UpdatesByChain: map[uint64]v1_6.NonceManagerUpdate{ src1: { - PreviousRampsArgs: []changeset.PreviousRampCfg{ + PreviousRampsArgs: []v1_6.PreviousRampCfg{ { RemoteChainSelector: dest, AllowEmptyOffRamp: true, @@ -211,7 +213,7 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { }, }, src2: { - PreviousRampsArgs: []changeset.PreviousRampCfg{ + PreviousRampsArgs: []v1_6.PreviousRampCfg{ { RemoteChainSelector: dest, AllowEmptyOffRamp: true, @@ -219,7 +221,7 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { }, }, dest: { - PreviousRampsArgs: []changeset.PreviousRampCfg{ + PreviousRampsArgs: []v1_6.PreviousRampCfg{ { RemoteChainSelector: src1, AllowEmptyOnRamp: true, @@ -287,9 +289,9 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { // now that the 1.6 lane is working, we can enable the real router e.Env, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateOnRampsDestsChangeset), - changeset.UpdateOnRampDestsConfig{ - UpdatesByChain: map[uint64]map[uint64]changeset.OnRampDestinationUpdate{ + deployment.CreateLegacyChangeSet(v1_6.UpdateOnRampsDestsChangeset), + v1_6.UpdateOnRampDestsConfig{ + UpdatesByChain: map[uint64]map[uint64]v1_6.OnRampDestinationUpdate{ src1: { dest: { IsEnabled: true, @@ -301,9 +303,9 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateOffRampSourcesChangeset), - changeset.UpdateOffRampSourcesConfig{ - UpdatesByChain: map[uint64]map[uint64]changeset.OffRampSourceUpdate{ + deployment.CreateLegacyChangeSet(v1_6.UpdateOffRampSourcesChangeset), + v1_6.UpdateOffRampSourcesConfig{ + UpdatesByChain: map[uint64]map[uint64]v1_6.OffRampSourceUpdate{ dest: { src1: { IsEnabled: true, @@ -316,13 +318,13 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { ), commonchangeset.Configure( // this needs to be MCMS proposal as the router contract is owned by MCMS - deployment.CreateLegacyChangeSet(changeset.UpdateRouterRampsChangeset), - changeset.UpdateRouterRampsConfig{ + deployment.CreateLegacyChangeSet(v1_6.UpdateRouterRampsChangeset), + v1_6.UpdateRouterRampsConfig{ TestRouter: false, MCMS: &changeset.MCMSConfig{ MinDelay: 0, }, - UpdatesByChain: map[uint64]changeset.RouterUpdates{ + UpdatesByChain: map[uint64]v1_6.RouterUpdates{ // onRamp update on source chain src1: { OnRampUpdates: map[uint64]bool{ diff --git a/integration-tests/smoke/ccip/ccip_reader_test.go b/integration-tests/smoke/ccip/ccip_reader_test.go index 7d07fa92ade..a45d47f58ba 100644 --- a/integration-tests/smoke/ccip/ccip_reader_test.go +++ b/integration-tests/smoke/ccip/ccip_reader_test.go @@ -19,8 +19,14 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/zap/zapcore" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipsolana" + + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/environment/memory" + "github.com/smartcontractkit/chainlink/integration-tests/utils/pgtest" ccipcommon "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common" readermocks "github.com/smartcontractkit/chainlink-ccip/mocks/pkg/contractreader" @@ -29,11 +35,6 @@ import ( ccipreaderpkg "github.com/smartcontractkit/chainlink-ccip/pkg/reader" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-ccip/plugintypes" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" - "github.com/smartcontractkit/chainlink/deployment/environment/memory" - "github.com/smartcontractkit/chainlink/integration-tests/utils/pgtest" - "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" @@ -946,7 +947,7 @@ func Test_GetMedianDataAvailabilityGasConfig(t *testing.T) { boundContracts := map[cciptypes.ChainSelector][]types.BoundContract{} for i, selector := range env.Env.AllChainSelectorsExcluding([]uint64{destChain}) { feeQuoter := state.Chains[selector].FeeQuoter - destChainCfg := changeset.DefaultFeeQuoterDestChainConfig(true) + destChainCfg := v1_6.DefaultFeeQuoterDestChainConfig(true) //nolint:gosec // disable G115 destChainCfg.DestDataAvailabilityOverheadGas = uint32(100 + i) //nolint:gosec // disable G115 diff --git a/integration-tests/smoke/ccip/ccip_rmn_test.go b/integration-tests/smoke/ccip/ccip_rmn_test.go index 9197b75454b..351864e4d7c 100644 --- a/integration-tests/smoke/ccip/ccip_rmn_test.go +++ b/integration-tests/smoke/ccip/ccip_rmn_test.go @@ -25,6 +25,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" "github.com/smartcontractkit/chainlink/deployment/environment/devenv" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" @@ -323,7 +324,7 @@ func runRmnTestCase(t *testing.T, tc rmnTestCase) { candidateDigest, err := homeChainState.RMNHome.GetCandidateDigest(&bind.CallOpts{Context: ctx}) require.NoError(t, err) - _, err = changeset.SetRMNHomeCandidateConfigChangeset(envWithRMN.Env, changeset.SetRMNHomeCandidateConfig{ + _, err = v1_6.SetRMNHomeCandidateConfigChangeset(envWithRMN.Env, v1_6.SetRMNHomeCandidateConfig{ HomeChainSelector: envWithRMN.HomeChainSel, RMNStaticConfig: staticConfig, RMNDynamicConfig: dynamicConfig, @@ -337,7 +338,7 @@ func runRmnTestCase(t *testing.T, tc rmnTestCase) { t.Logf("RMNHome candidateDigest after setting new candidate: %x", candidateDigest[:]) t.Logf("Promoting RMNHome candidate with candidateDigest: %x", candidateDigest[:]) - _, err = changeset.PromoteRMNHomeCandidateConfigChangeset(envWithRMN.Env, changeset.PromoteRMNHomeCandidateConfig{ + _, err = v1_6.PromoteRMNHomeCandidateConfigChangeset(envWithRMN.Env, v1_6.PromoteRMNHomeCandidateConfig{ HomeChainSelector: envWithRMN.HomeChainSel, DigestToPromote: candidateDigest, }) @@ -350,19 +351,19 @@ func runRmnTestCase(t *testing.T, tc rmnTestCase) { "active digest should be the same as the previously candidate digest after promotion, previous candidate: %x, active: %x", candidateDigest[:], activeDigest[:]) - rmnRemoteConfig := make(map[uint64]changeset.RMNRemoteConfig) + rmnRemoteConfig := make(map[uint64]v1_6.RMNRemoteConfig) for _, remoteCfg := range tc.remoteChainsConfig { selector := tc.pf.chainSelectors[remoteCfg.chainIdx] if remoteCfg.f < 0 { t.Fatalf("remoteCfg.f is negative: %d", remoteCfg.f) } - rmnRemoteConfig[selector] = changeset.RMNRemoteConfig{ + rmnRemoteConfig[selector] = v1_6.RMNRemoteConfig{ F: uint64(remoteCfg.f), Signers: tc.alterSigners(t, tc.pf.rmnRemoteSigners), } } - _, err = changeset.SetRMNRemoteConfigChangeset(envWithRMN.Env, changeset.SetRMNRemoteConfig{ + _, err = v1_6.SetRMNRemoteConfigChangeset(envWithRMN.Env, v1_6.SetRMNRemoteConfig{ HomeChainSelector: envWithRMN.HomeChainSel, RMNRemoteConfigs: rmnRemoteConfig, }) @@ -738,15 +739,15 @@ func (tc rmnTestCase) callContractsToCurseChains(ctx context.Context, t *testing } for _, subjectDescription := range cursedSubjects { - curseActions := make([]changeset.CurseAction, 0) + curseActions := make([]v1_6.CurseAction, 0) if subjectDescription == globalCurse { - curseActions = append(curseActions, changeset.CurseGloballyOnlyOnChain(remoteSel)) + curseActions = append(curseActions, v1_6.CurseGloballyOnlyOnChain(remoteSel)) } else { - curseActions = append(curseActions, changeset.CurseLaneOnlyOnSource(remoteSel, tc.pf.chainSelectors[subjectDescription])) + curseActions = append(curseActions, v1_6.CurseLaneOnlyOnSource(remoteSel, tc.pf.chainSelectors[subjectDescription])) } - _, err := changeset.RMNCurseChangeset(envWithRMN.Env, changeset.RMNCurseConfig{ + _, err := v1_6.RMNCurseChangeset(envWithRMN.Env, v1_6.RMNCurseConfig{ CurseActions: curseActions, Reason: "test curse", }) @@ -770,15 +771,15 @@ func (tc rmnTestCase) callContractsToCurseAndRevokeCurse(ctx context.Context, eg cursedSubjects := tc.revokedCursedSubjectsPerChain[remoteCfg.chainIdx] for subjectDescription, revokeAfter := range cursedSubjects { - curseActions := make([]changeset.CurseAction, 0) + curseActions := make([]v1_6.CurseAction, 0) if subjectDescription == globalCurse { - curseActions = append(curseActions, changeset.CurseGloballyOnlyOnChain(remoteSel)) + curseActions = append(curseActions, v1_6.CurseGloballyOnlyOnChain(remoteSel)) } else { - curseActions = append(curseActions, changeset.CurseLaneOnlyOnSource(remoteSel, tc.pf.chainSelectors[subjectDescription])) + curseActions = append(curseActions, v1_6.CurseLaneOnlyOnSource(remoteSel, tc.pf.chainSelectors[subjectDescription])) } - _, err := changeset.RMNCurseChangeset(envWithRMN.Env, changeset.RMNCurseConfig{ + _, err := v1_6.RMNCurseChangeset(envWithRMN.Env, v1_6.RMNCurseConfig{ CurseActions: curseActions, Reason: "test curse", }) @@ -788,7 +789,7 @@ func (tc rmnTestCase) callContractsToCurseAndRevokeCurse(ctx context.Context, eg <-time.NewTimer(revokeAfter).C t.Logf("revoking curse on subject %d (%d)", subjectDescription, subjectDescription) - _, err := changeset.RMNUncurseChangeset(envWithRMN.Env, changeset.RMNCurseConfig{ + _, err := v1_6.RMNUncurseChangeset(envWithRMN.Env, v1_6.RMNCurseConfig{ CurseActions: curseActions, Reason: "test uncurse", }) diff --git a/integration-tests/smoke/ccip/ccip_token_price_updates_test.go b/integration-tests/smoke/ccip/ccip_token_price_updates_test.go index 9e852e97923..12ada106764 100644 --- a/integration-tests/smoke/ccip/ccip_token_price_updates_test.go +++ b/integration-tests/smoke/ccip/ccip_token_price_updates_test.go @@ -20,6 +20,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" ) @@ -30,7 +31,7 @@ func Test_CCIPTokenPriceUpdates(t *testing.T) { var tokenPriceExpiry = 5 * time.Second e, _, _ := testsetups.NewIntegrationEnvironment(t, - testhelpers.WithOCRConfigOverride(func(params *changeset.CCIPOCRParams) { + testhelpers.WithOCRConfigOverride(func(params *v1_6.CCIPOCRParams) { params.CommitOffChainConfig.TokenPriceBatchWriteFrequency = *config.MustNewDuration(tokenPriceExpiry) })) state, err := changeset.LoadOnchainState(e.Env) diff --git a/integration-tests/testsetups/ccip/test_helpers.go b/integration-tests/testsetups/ccip/test_helpers.go index a094cce761f..221ebd8c638 100644 --- a/integration-tests/testsetups/ccip/test_helpers.go +++ b/integration-tests/testsetups/ccip/test_helpers.go @@ -33,6 +33,7 @@ import ( "github.com/smartcontractkit/chainlink-testing-framework/seth" evmcfg "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" From 2c850f2355dfdb6bda028da758851cb185e84efa Mon Sep 17 00:00:00 2001 From: tt-cll <141346969+tt-cll@users.noreply.github.com> Date: Fri, 21 Feb 2025 13:16:35 -0500 Subject: [PATCH 26/58] bubble mcms errors (#16522) --- deployment/common/changeset/test_helpers.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/deployment/common/changeset/test_helpers.go b/deployment/common/changeset/test_helpers.go index 5e3dc928849..298fc786fe2 100644 --- a/deployment/common/changeset/test_helpers.go +++ b/deployment/common/changeset/test_helpers.go @@ -161,8 +161,14 @@ func ApplyChangesetsV2(t *testing.T, e deployment.Environment, changesetApplicat } p := proposalutils.SignMCMSTimelockProposal(t, e, &prop) - proposalutils.ExecuteMCMSProposalV2(t, e, p) - proposalutils.ExecuteMCMSTimelockProposalV2(t, e, &prop) + err = proposalutils.ExecuteMCMSProposalV2(t, e, p) + if err != nil { + return deployment.Environment{}, err + } + err = proposalutils.ExecuteMCMSTimelockProposalV2(t, e, &prop) + if err != nil { + return deployment.Environment{}, err + } } } if out.MCMSProposals != nil { From 5e8f1f6d75495f157fe22fb64fe58e2adf98ade0 Mon Sep 17 00:00:00 2001 From: Chris Amora <27789416+ChrisAmora@users.noreply.github.com> Date: Fri, 21 Feb 2025 15:17:59 -0300 Subject: [PATCH 27/58] feat: add llo stream to data streams deployment module (#16459) * feat: add llo stream to data streams deployment module * feat: add don * feat: update tests * feat: add pointer lib to deployment module * feat: change pointer util * fix: goimport --- deployment/data-streams/jobs/don.go | 42 +++ deployment/data-streams/jobs/don_test.go | 122 ++++++++ deployment/data-streams/jobs/llo.go | 1 - deployment/data-streams/jobs/stream.go | 65 +++++ deployment/data-streams/jobs/stream_test.go | 267 ++++++++++++++++++ deployment/data-streams/jobs/template.go | 38 +++ .../templates/osrc_mercury_v1_median.go.tmpl | 13 + .../templates/osrc_mercury_v1_quote.go.tmpl | 27 ++ .../data-streams/utils/pointer/pointer.go | 5 + 9 files changed, 579 insertions(+), 1 deletion(-) create mode 100644 deployment/data-streams/jobs/don.go create mode 100644 deployment/data-streams/jobs/don_test.go delete mode 100644 deployment/data-streams/jobs/llo.go create mode 100644 deployment/data-streams/jobs/stream_test.go create mode 100644 deployment/data-streams/jobs/template.go create mode 100644 deployment/data-streams/jobs/templates/osrc_mercury_v1_median.go.tmpl create mode 100644 deployment/data-streams/jobs/templates/osrc_mercury_v1_quote.go.tmpl create mode 100644 deployment/data-streams/utils/pointer/pointer.go diff --git a/deployment/data-streams/jobs/don.go b/deployment/data-streams/jobs/don.go new file mode 100644 index 00000000000..579accb1789 --- /dev/null +++ b/deployment/data-streams/jobs/don.go @@ -0,0 +1,42 @@ +package jobs + +import ( + "time" + + "github.com/pelletier/go-toml/v2" +) + +type DonJobSpec struct { + Base + + ContractID string `toml:"contractID"` + TransmitterID string `toml:"transmitterID,omitempty"` + ForwardingAllowed *bool `toml:"forwardingAllowed,omitempty"` + P2PV2Bootstrappers []string `toml:"p2pv2Bootstrappers,omitempty"` + OCRKeyBundleID *string `toml:"ocrKeyBundleID,omitempty"` + MaxTaskDuration time.Duration `toml:"maxTaskDuration,omitempty"` + ContractConfigTrackerPollInterval time.Duration `toml:"contractConfigTrackerPollInterval,omitempty"` + Relay RelayType `toml:"relay,omitempty"` + PluginType string `toml:"pluginType,omitempty"` + RelayConfig RelayConfigDon `toml:"relayConfig"` + PluginConfig PluginConfigDon `toml:"pluginConfig"` +} + +// RelayConfig is the configuration for the relay. This could change depending on the relay type. +type RelayConfigDon struct { + ChainID string `toml:"chainID"` + FromBlock uint64 `toml:"fromBlock,omitempty"` + LLOConfigMode string `toml:"lloConfigMode,omitempty"` + LLODonID int64 `toml:"lloDonID,omitempty"` +} + +type PluginConfigDon struct { + ChannelDefinitionsContractAddress string `toml:"channelDefinitionsContractAddress"` + ChannelDefinitionsContractFromBlock uint64 `toml:"channelDefinitionsContractFromBlock"` + DonID int64 `toml:"donID"` + Servers map[string]string `toml:"servers,inline"` +} + +func (s *DonJobSpec) MarshalTOML() ([]byte, error) { + return toml.Marshal(s) +} diff --git a/deployment/data-streams/jobs/don_test.go b/deployment/data-streams/jobs/don_test.go new file mode 100644 index 00000000000..90407cb48cb --- /dev/null +++ b/deployment/data-streams/jobs/don_test.go @@ -0,0 +1,122 @@ +package jobs + +import ( + "testing" + "time" + + "github.com/google/uuid" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink/deployment/data-streams/utils/pointer" +) + +const donSpecTOML1 = `name = 'Test-DON' +type = 'don' +schemaVersion = 1 +externalJobID = '00000000-0000-0000-0000-000000000000' +contractID = 'contract-123' +transmitterID = 'tx-123' +forwardingAllowed = true +p2pv2Bootstrappers = ['bootstrap1', 'bootstrap2'] +ocrKeyBundleID = 'ocr-bundle-123' +maxTaskDuration = 10000000000 +contractConfigTrackerPollInterval = 60000000000 +relay = 'testrelay' +pluginType = 'testplugin' + +[relayConfig] +chainID = 'chain' +fromBlock = 100 +lloConfigMode = 'mode' +lloDonID = 200 + +[pluginConfig] +channelDefinitionsContractAddress = '0xabc' +channelDefinitionsContractFromBlock = 50 +donID = 300 +servers = {server1 = 'http://localhost'} +` + +const donSpecTOML2 = `name = 'Empty-DON-Test' +type = 'don' +schemaVersion = 1 +externalJobID = '00000000-0000-0000-0000-000000000000' +contractID = 'contract-empty' + +[relayConfig] +chainID = '' + +[pluginConfig] +channelDefinitionsContractAddress = '' +channelDefinitionsContractFromBlock = 0 +donID = 0 +servers = {} +` + +func TestDonJobSpec_MarshalTOML(t *testing.T) { + testCases := []struct { + name string + spec DonJobSpec + want string + }{ + { + name: "with fields populated", + spec: DonJobSpec{ + Base: Base{ + Name: "Test-DON", + Type: "don", + SchemaVersion: 1, + ExternalJobID: uuid.MustParse("00000000-0000-0000-0000-000000000000"), + }, + ContractID: "contract-123", + TransmitterID: "tx-123", + ForwardingAllowed: pointer.To(true), + P2PV2Bootstrappers: []string{"bootstrap1", "bootstrap2"}, + OCRKeyBundleID: pointer.To("ocr-bundle-123"), + MaxTaskDuration: 10 * time.Second, + ContractConfigTrackerPollInterval: 1 * time.Minute, + Relay: "testrelay", + PluginType: "testplugin", + RelayConfig: RelayConfigDon{ + ChainID: "chain", + FromBlock: 100, + LLOConfigMode: "mode", + LLODonID: 200, + }, + PluginConfig: PluginConfigDon{ + ChannelDefinitionsContractAddress: "0xabc", + ChannelDefinitionsContractFromBlock: 50, + DonID: 300, + Servers: map[string]string{"server1": "http://localhost"}, + }, + }, + want: donSpecTOML1, + }, + { + name: "empty minimal fields", + spec: DonJobSpec{ + Base: Base{ + Name: "Empty-DON-Test", + Type: "don", + SchemaVersion: 1, + ExternalJobID: uuid.MustParse("00000000-0000-0000-0000-000000000000"), + }, + ContractID: "contract-empty", + RelayConfig: RelayConfigDon{}, + PluginConfig: PluginConfigDon{ + Servers: map[string]string{}, + }, + }, + want: donSpecTOML2, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + tomlBytes, err := tc.spec.MarshalTOML() + require.NoError(t, err) + got := string(tomlBytes) + require.Equal(t, tc.want, got) + }) + } +} diff --git a/deployment/data-streams/jobs/llo.go b/deployment/data-streams/jobs/llo.go deleted file mode 100644 index 415ac457275..00000000000 --- a/deployment/data-streams/jobs/llo.go +++ /dev/null @@ -1 +0,0 @@ -package jobs diff --git a/deployment/data-streams/jobs/stream.go b/deployment/data-streams/jobs/stream.go index 415ac457275..dc04fabacb6 100644 --- a/deployment/data-streams/jobs/stream.go +++ b/deployment/data-streams/jobs/stream.go @@ -1 +1,66 @@ package jobs + +import ( + "github.com/pelletier/go-toml/v2" +) + +type Datasource struct { + BridgeName string + ReqData string +} + +type ReportFieldLLO struct { + ResultPath string +} + +type Pipeline interface { + Render() (string, error) +} + +type BaseObservationSource struct { + Datasources []Datasource + AllowedFaults int + Benchmark ReportFieldLLO +} + +type QuoteObservationSource struct { + BaseObservationSource + Bid ReportFieldLLO + Ask ReportFieldLLO +} + +type MedianObservationSource struct { + BaseObservationSource +} + +func renderObservationTemplate(fname string, obs any) (string, error) { + return renderTemplate(fname, obs) +} + +func (src QuoteObservationSource) Render() (string, error) { + return renderObservationTemplate("osrc_mercury_v1_quote.go.tmpl", src) +} + +func (src MedianObservationSource) Render() (string, error) { + return renderObservationTemplate("osrc_mercury_v1_median.go.tmpl", src) +} + +type StreamJobSpec struct { + Base + + StreamID string `toml:"streamID"` + ObservationSource string `toml:"observationSource,multiline,omitempty"` +} + +func (s *StreamJobSpec) SetObservationSource(obs Pipeline) error { + rendered, err := obs.Render() + if err != nil { + return err + } + s.ObservationSource = rendered + return nil +} + +func (s *StreamJobSpec) MarshalTOML() ([]byte, error) { + return toml.Marshal(s) +} diff --git a/deployment/data-streams/jobs/stream_test.go b/deployment/data-streams/jobs/stream_test.go new file mode 100644 index 00000000000..c5622bc40ff --- /dev/null +++ b/deployment/data-streams/jobs/stream_test.go @@ -0,0 +1,267 @@ +package jobs + +import ( + "errors" + "testing" + + "github.com/google/uuid" + "github.com/stretchr/testify/require" +) + +const medianSpecTOMLMultiple = `name = 'BTC/USD-Test' +type = 'stream' +schemaVersion = 1 +externalJobID = '00000000-0000-0000-0000-000000000000' +streamID = '1000' +observationSource = """ +// data source 1 +ds1_payload [type=bridge name=\"bridge-bridge1\" timeout=\"50s\" requestData={\"data\":{\"endpoint\":\"test1\"}}]; + +ds1_benchmark [type=jsonparse path=\"data,median\"]; +// data source 2 +ds2_payload [type=bridge name=\"bridge-bridge2\" timeout=\"50s\" requestData={\"data\":{\"endpoint\":\"test2\"}}]; + +ds2_benchmark [type=jsonparse path=\"data,median\"]; +ds1_payload -> ds1_benchmark -> benchmark_price; +ds2_payload -> ds2_benchmark -> benchmark_price; +benchmark_price [type=median allowedFaults=2 index=0]; +""" +` + +const medianSpecTOMLEmpty = `name = 'Empty-Median-Test' +type = 'stream' +schemaVersion = 1 +externalJobID = '00000000-0000-0000-0000-000000000000' +streamID = '2000' +observationSource = """ +benchmark_price [type=median allowedFaults=1 index=0]; +""" +` + +const quoteSpecTOMLMultiple = `name = 'BTC/USD-Quote' +type = 'stream' +schemaVersion = 1 +externalJobID = '00000000-0000-0000-0000-000000000000' +streamID = '3000' +observationSource = """ +// data source 1 +ds1_payload [type=bridge name=\"bridge-bridge1\" timeout=\"50s\" requestData={\"data\":{\"endpoint\":\"quote1\"}}]; + +ds1_benchmark [type=jsonparse path=\"data,benchmark\"]; +ds1_bid [type=jsonparse path=\"data,bid\"]; +ds1_ask [type=jsonparse path=\"data,ask\"]; +// data source 2 +ds2_payload [type=bridge name=\"bridge-bridge2\" timeout=\"50s\" requestData={\"data\":{\"endpoint\":\"quote2\"}}]; + +ds2_benchmark [type=jsonparse path=\"data,benchmark\"]; +ds2_bid [type=jsonparse path=\"data,bid\"]; +ds2_ask [type=jsonparse path=\"data,ask\"]; +ds1_payload -> ds1_benchmark -> benchmark_price; +ds2_payload -> ds2_benchmark -> benchmark_price; +benchmark_price [type=median allowedFaults=3 index=0]; + +ds1_payload -> ds1_bid -> bid_price; +ds2_payload -> ds2_bid -> bid_price; +bid_price [type=median allowedFaults=3 index=1]; + +ds1_payload -> ds1_ask -> ask_price; +ds2_payload -> ds2_ask -> ask_price; +ask_price [type=median allowedFaults=3 index=2]; +""" +` + +const quoteSpecTOMLEmpty = `name = 'Empty-Quote-Test' +type = 'stream' +schemaVersion = 1 +externalJobID = '00000000-0000-0000-0000-000000000000' +streamID = '4000' +observationSource = """ +benchmark_price [type=median allowedFaults=1 index=0]; + +bid_price [type=median allowedFaults=1 index=1]; + +ask_price [type=median allowedFaults=1 index=2]; +""" +` + +func TestStreamJobSpec_Median_MarshalTOML(t *testing.T) { + testCases := []struct { + name string + spec StreamJobSpec + obs MedianObservationSource + want string + }{ + { + name: "multiple datasources with valid paths", + spec: StreamJobSpec{ + Base: Base{ + Name: "BTC/USD-Test", + Type: "stream", + SchemaVersion: 1, + ExternalJobID: uuid.MustParse("00000000-0000-0000-0000-000000000000"), + }, + StreamID: "1000", + }, + obs: MedianObservationSource{ + BaseObservationSource: BaseObservationSource{ + Datasources: []Datasource{ + { + BridgeName: "bridge1", + ReqData: `{"data":{"endpoint":"test1"}}`, + }, + { + BridgeName: "bridge2", + ReqData: `{"data":{"endpoint":"test2"}}`, + }, + }, + AllowedFaults: 2, + Benchmark: ReportFieldLLO{ + ResultPath: "data,median", + }, + }, + }, + want: medianSpecTOMLMultiple, + }, + { + name: "empty datasource list", + spec: StreamJobSpec{ + Base: Base{ + Name: "Empty-Median-Test", + Type: "stream", + SchemaVersion: 1, + ExternalJobID: uuid.MustParse("00000000-0000-0000-0000-000000000000"), + }, + StreamID: "2000", + }, + obs: MedianObservationSource{ + BaseObservationSource: BaseObservationSource{ + Datasources: []Datasource{}, + AllowedFaults: 1, + Benchmark: ReportFieldLLO{ + ResultPath: "data,empty", + }, + }, + }, + want: medianSpecTOMLEmpty, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + err := tc.spec.SetObservationSource(tc.obs) + require.NoError(t, err) + tomlBytes, err := tc.spec.MarshalTOML() + require.NoError(t, err) + got := string(tomlBytes) + require.Equal(t, tc.want, got) + }) + } +} + +func TestStreamJobSpec_Quote_MarshalTOML(t *testing.T) { + testCases := []struct { + name string + spec StreamJobSpec + obs QuoteObservationSource + want string + }{ + { + name: "multiple datasources with valid paths", + spec: StreamJobSpec{ + Base: Base{ + Name: "BTC/USD-Quote", + Type: "stream", + SchemaVersion: 1, + ExternalJobID: uuid.MustParse("00000000-0000-0000-0000-000000000000"), + }, + StreamID: "3000", + }, + obs: QuoteObservationSource{ + BaseObservationSource: BaseObservationSource{ + Datasources: []Datasource{ + { + BridgeName: "bridge1", + ReqData: `{"data":{"endpoint":"quote1"}}`, + }, + { + BridgeName: "bridge2", + ReqData: `{"data":{"endpoint":"quote2"}}`, + }, + }, + AllowedFaults: 3, + Benchmark: ReportFieldLLO{ + ResultPath: "data,benchmark", + }, + }, + Bid: ReportFieldLLO{ + ResultPath: "data,bid", + }, + Ask: ReportFieldLLO{ + ResultPath: "data,ask", + }, + }, + want: quoteSpecTOMLMultiple, + }, + { + name: "empty datasource list", + spec: StreamJobSpec{ + Base: Base{ + Name: "Empty-Quote-Test", + Type: "stream", + SchemaVersion: 1, + ExternalJobID: uuid.MustParse("00000000-0000-0000-0000-000000000000"), + }, + StreamID: "4000", + }, + obs: QuoteObservationSource{ + BaseObservationSource: BaseObservationSource{ + Datasources: []Datasource{}, + AllowedFaults: 1, + Benchmark: ReportFieldLLO{ + ResultPath: "data,empty", + }, + }, + Bid: ReportFieldLLO{ + ResultPath: "data,emptyBid", + }, + Ask: ReportFieldLLO{ + ResultPath: "data,emptyAsk", + }, + }, + want: quoteSpecTOMLEmpty, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + err := tc.spec.SetObservationSource(tc.obs) + require.NoError(t, err) + + tomlBytes, err := tc.spec.MarshalTOML() + require.NoError(t, err) + got := string(tomlBytes) + require.Equal(t, tc.want, got) + }) + } +} + +type errorPipeline struct{} + +func (e errorPipeline) Render() (string, error) { + return "", errors.New("forced error") +} + +func TestStreamJobSpec_SetObservationSource_Error(t *testing.T) { + spec := StreamJobSpec{ + Base: Base{ + Name: "Error-Test", + Type: "stream", + SchemaVersion: 1, + ExternalJobID: uuid.MustParse("00000000-0000-0000-0000-000000000000"), + }, + StreamID: "5000", + } + err := spec.SetObservationSource(errorPipeline{}) + require.Error(t, err) + require.Contains(t, err.Error(), "forced error") +} diff --git a/deployment/data-streams/jobs/template.go b/deployment/data-streams/jobs/template.go new file mode 100644 index 00000000000..2c81cf487c6 --- /dev/null +++ b/deployment/data-streams/jobs/template.go @@ -0,0 +1,38 @@ +package jobs + +import ( + "embed" + "math/big" + "strings" + "text/template" +) + +//go:embed templates/*.tmpl +var templatesFS embed.FS + +func newTemplate() (*template.Template, error) { + funcMap := template.FuncMap{ + "inc": func(i int) int { + return i + 1 + }, + "dec": func(i int) int { + return i - 1 + }, + "times": func(i int64) string { + t := big.NewInt(10) + t.Exp(t, big.NewInt(i), nil) + return t.String() + }, + } + return template.New("ds").Funcs(funcMap).ParseFS(templatesFS, "templates/*.tmpl") +} + +func renderTemplate(fname string, data any) (string, error) { + tmpl, err := newTemplate() + if err != nil { + return "", err + } + b := new(strings.Builder) + err = tmpl.ExecuteTemplate(b, fname, data) + return b.String(), err +} diff --git a/deployment/data-streams/jobs/templates/osrc_mercury_v1_median.go.tmpl b/deployment/data-streams/jobs/templates/osrc_mercury_v1_median.go.tmpl new file mode 100644 index 00000000000..86dac4aafe5 --- /dev/null +++ b/deployment/data-streams/jobs/templates/osrc_mercury_v1_median.go.tmpl @@ -0,0 +1,13 @@ +{{range $i, $a := .Datasources}} +{{- $srcNum:=inc $i -}} +// data source {{$srcNum}} +ds{{$srcNum}}_payload [type=bridge name="bridge-{{$a.BridgeName}}" timeout="50s" requestData={{$a.ReqData}}]; + +ds{{$srcNum}}_benchmark [type=jsonparse path="{{$.Benchmark.ResultPath}}"]; +{{end -}} + +{{range $i, $a := .Datasources}} +{{- $srcNum:=inc $i -}} +ds{{$srcNum}}_payload -> ds{{$srcNum}}_benchmark -> benchmark_price; +{{end -}} +benchmark_price [type=median allowedFaults={{.AllowedFaults}} index=0]; diff --git a/deployment/data-streams/jobs/templates/osrc_mercury_v1_quote.go.tmpl b/deployment/data-streams/jobs/templates/osrc_mercury_v1_quote.go.tmpl new file mode 100644 index 00000000000..41fedff54fc --- /dev/null +++ b/deployment/data-streams/jobs/templates/osrc_mercury_v1_quote.go.tmpl @@ -0,0 +1,27 @@ +{{range $i, $a := .Datasources}} +{{- $srcNum:=inc $i -}} +// data source {{$srcNum}} +ds{{$srcNum}}_payload [type=bridge name="bridge-{{$a.BridgeName}}" timeout="50s" requestData={{$a.ReqData}}]; + +ds{{$srcNum}}_benchmark [type=jsonparse path="{{$.Benchmark.ResultPath}}"]; +ds{{$srcNum}}_bid [type=jsonparse path="{{$.Bid.ResultPath}}"]; +ds{{$srcNum}}_ask [type=jsonparse path="{{$.Ask.ResultPath}}"]; +{{end -}} + +{{range $i, $a := .Datasources}} +{{- $srcNum:=inc $i -}} +ds{{$srcNum}}_payload -> ds{{$srcNum}}_benchmark -> benchmark_price; +{{end -}} +benchmark_price [type=median allowedFaults={{.AllowedFaults}} index=0]; + +{{range $i, $a := .Datasources}} +{{- $srcNum:=inc $i -}} +ds{{$srcNum}}_payload -> ds{{$srcNum}}_bid -> bid_price; +{{end -}} +bid_price [type=median allowedFaults={{.AllowedFaults}} index=1]; + +{{range $i, $a := .Datasources}} +{{- $srcNum:=inc $i -}} +ds{{$srcNum}}_payload -> ds{{$srcNum}}_ask -> ask_price; +{{end -}} +ask_price [type=median allowedFaults={{.AllowedFaults}} index=2]; diff --git a/deployment/data-streams/utils/pointer/pointer.go b/deployment/data-streams/utils/pointer/pointer.go new file mode 100644 index 00000000000..48772a45fce --- /dev/null +++ b/deployment/data-streams/utils/pointer/pointer.go @@ -0,0 +1,5 @@ +package pointer + +func To[T any](v T) *T { + return &v +} From 91ce4c9226d13ca487bce219119493eb62e34155 Mon Sep 17 00:00:00 2001 From: chainchad <96362174+chainchad@users.noreply.github.com> Date: Fri, 21 Feb 2025 14:31:18 -0500 Subject: [PATCH 28/58] Install foundry in prepublish test job for solidity and add other misc contracts CI fixes (#16416) * Install foundry in prepublish test job for solidity * WIP: Temporarily run: pnpm copy:ccip-files * Install additional dev deps * Revert "WIP: Temporarily run: pnpm copy:ccip-files" This reverts commit 098d0731c2f8828a1ee5c111d8d8472025b5c96f. * CI fixes for CCIP Contracts (#16434) * Install additional dev deps * Copy over lockfile * Simplify script command for copying ccip release files (cherry picked from commit 5b5f2a1cd1cc453a98d6b7ed259fe62f42e8a12f) * Run pnpm install --- .github/workflows/solidity.yml | 2 + contracts/pnpm-lock.yaml | 2480 +++++++++----------------------- 2 files changed, 642 insertions(+), 1840 deletions(-) diff --git a/.github/workflows/solidity.yml b/.github/workflows/solidity.yml index def06b0be29..fd30746ffb2 100644 --- a/.github/workflows/solidity.yml +++ b/.github/workflows/solidity.yml @@ -102,6 +102,8 @@ jobs: persist-credentials: false - name: Setup NodeJS uses: ./.github/actions/setup-nodejs + - name: Install Foundry + uses: ./.github/actions/install-solidity-foundry - name: Run Prepublish test working-directory: contracts run: pnpm prepublishOnly diff --git a/contracts/pnpm-lock.yaml b/contracts/pnpm-lock.yaml index 232a8900409..c228104e94f 100644 --- a/contracts/pnpm-lock.yaml +++ b/contracts/pnpm-lock.yaml @@ -59,22 +59,22 @@ importers: version: 5.7.2 '@nomicfoundation/hardhat-chai-matchers': specifier: ^1.0.6 - version: 1.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3)))(chai@4.5.0)(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3)) + version: 1.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3)))(chai@4.5.0)(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.8 - version: 3.0.8(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3)) + version: 3.0.8(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.12 - version: 1.0.12(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3)) + version: 1.0.12(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3)) '@nomicfoundation/hardhat-verify': specifier: ^2.0.12 - version: 2.0.12(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3)) + version: 2.0.12(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3)) '@typechain/ethers-v5': specifier: ^7.2.0 version: 7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2(typescript@5.7.3))(typescript@5.7.3) '@typechain/hardhat': specifier: ^7.0.0 - version: 7.0.0(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2(typescript@5.7.3))(typescript@5.7.3))(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3))(typechain@8.3.2(typescript@5.7.3)) + version: 7.0.0(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2(typescript@5.7.3))(typescript@5.7.3))(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3))(typechain@8.3.2(typescript@5.7.3)) '@types/cbor': specifier: ~5.0.1 version: 5.0.1 @@ -92,7 +92,7 @@ importers: version: 10.0.10 '@types/node': specifier: ^20.17.17 - version: 20.17.17 + version: 20.17.19 '@typescript-eslint/eslint-plugin': specifier: ^7.18.0 version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) @@ -110,7 +110,7 @@ importers: version: 4.5.0 debug: specifier: ^4.4.0 - version: 4.4.0 + version: 4.4.0(supports-color@8.1.1) deep-equal-in-any-order: specifier: ^2.0.6 version: 2.0.6 @@ -122,16 +122,16 @@ importers: version: 9.1.0(eslint@8.57.1) eslint-plugin-prettier: specifier: ^5.2.3 - version: 5.2.3(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.5.0) + version: 5.2.3(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.5.1) ethers: specifier: ~5.7.2 version: 5.7.2 hardhat: specifier: ~2.20.1 - version: 2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3) + version: 2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3) hardhat-abi-exporter: specifier: ^2.10.1 - version: 2.10.1(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3)) + version: 2.10.1(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3)) hardhat-ignore-warnings: specifier: ^0.2.12 version: 0.2.12 @@ -140,22 +140,22 @@ importers: version: 2.30.1 prettier: specifier: ^3.5.0 - version: 3.5.0 + version: 3.5.1 prettier-plugin-solidity: specifier: ^1.4.2 - version: 1.4.2(prettier@3.5.0) + version: 1.4.2(prettier@3.5.1) solhint: specifier: ^5.0.5 - version: 5.0.5 + version: 5.0.5(typescript@5.7.3) solhint-plugin-chainlink-solidity: specifier: git+https://github.com/smartcontractkit/chainlink-solhint-rules.git#v1.2.1 version: '@chainlink/solhint-plugin-chainlink-solidity@https://codeload.github.com/smartcontractkit/chainlink-solhint-rules/tar.gz/1b4c0c2663fcd983589d4f33a2e73908624ed43c' solhint-plugin-prettier: specifier: ^0.1.0 - version: 0.1.0(prettier-plugin-solidity@1.4.2(prettier@3.5.0))(prettier@3.5.0) + version: 0.1.0(prettier-plugin-solidity@1.4.2(prettier@3.5.1))(prettier@3.5.1) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.17.17)(typescript@5.7.3) + version: 10.9.2(@types/node@20.17.19)(typescript@5.7.3) typechain: specifier: ^8.2.1 version: 8.3.2(typescript@5.7.3) @@ -165,32 +165,27 @@ importers: packages: - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - '@arbitrum/nitro-contracts@1.1.1': resolution: {integrity: sha512-4Tyk3XVHz+bm8UujUC78LYSw3xAxyYvBCxfEX4z3qE4/ww7Qck/rmce5gbHMzQjArEAzAP2YSfYIFuIFuRXtfg==} '@arbitrum/token-bridge-contracts@1.1.2': resolution: {integrity: sha512-k7AZXiB2HFecJ1KfaDBqgOKe3Loo1ttGLC7hUOVB+0YrihIR6cYpJRuqKSKK4YCy+FF21AUDtaG3x57OFM667Q==} - '@babel/code-frame@7.18.6': - resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.19.1': - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.18.6': - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} '@babel/runtime@7.24.0': resolution: {integrity: sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==} engines: {node: '>=6.9.0'} + '@bytecodealliance/preview2-shim@0.17.0': + resolution: {integrity: sha512-JorcEwe4ud0x5BS/Ar2aQWOQoFzjq/7jcnxYXCvSMh0oRm0dQXzOA+hqLDBnOMks1LLBA7dmiLLsEBl09Yd6iQ==} + '@chainlink/solhint-plugin-chainlink-solidity@https://codeload.github.com/smartcontractkit/chainlink-solhint-rules/tar.gz/1b4c0c2663fcd983589d4f33a2e73908624ed43c': resolution: {tarball: https://codeload.github.com/smartcontractkit/chainlink-solhint-rules/tar.gz/1b4c0c2663fcd983589d4f33a2e73908624ed43c} version: 1.2.0 @@ -257,14 +252,14 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/eslintrc@2.1.4': @@ -394,12 +389,12 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead - '@jridgewell/resolve-uri@3.1.1': - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -414,11 +409,15 @@ packages: resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} engines: {node: '>=12.0.0'} - '@noble/hashes@1.1.2': - resolution: {integrity: sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==} + '@noble/hashes@1.2.0': + resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} + + '@noble/hashes@1.7.1': + resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + engines: {node: ^14.21.3 || >=16} - '@noble/secp256k1@1.6.3': - resolution: {integrity: sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==} + '@noble/secp256k1@1.7.1': + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -518,68 +517,39 @@ packages: peerDependencies: hardhat: ^2.0.4 - '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.0': - resolution: {integrity: sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.0': - resolution: {integrity: sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.0': - resolution: {integrity: sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] + '@nomicfoundation/slang@0.18.3': + resolution: {integrity: sha512-YqAWgckqbHM0/CZxi9Nlf4hjk9wUNLC9ngWCWBiqMxPIZmzsVKYuChdlrfeBPQyvQQBoOhbx+7C1005kLVQDZQ==} - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.0': - resolution: {integrity: sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.0': - resolution: {integrity: sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + resolution: {integrity: sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.0': - resolution: {integrity: sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + resolution: {integrity: sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.0': - resolution: {integrity: sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + resolution: {integrity: sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.0': - resolution: {integrity: sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + resolution: {integrity: sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.0': - resolution: {integrity: sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + resolution: {integrity: sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.0': - resolution: {integrity: sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + resolution: {integrity: sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer@0.1.0': - resolution: {integrity: sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg==} + '@nomicfoundation/solidity-analyzer@0.1.2': + resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} engines: {node: '>= 12'} '@nomiclabs/hardhat-ethers@2.2.3': @@ -615,8 +585,8 @@ packages: '@openzeppelin/contracts@4.9.3': resolution: {integrity: sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==} - '@openzeppelin/upgrades-core@1.34.4': - resolution: {integrity: sha512-iGN3StqYHYVqqSKs8hWY+Gz6VkiEqOkQccBhHl7lHLGBJF91QUZ8wNMZ59SA5Usg1Fstu/HurvZTCEshPJAZ8w==} + '@openzeppelin/upgrades-core@1.42.1': + resolution: {integrity: sha512-8qnz2XfQrco8R8u9NjV+KiSLrVn7DnWFd+3BuhTUjhVy0bzCSu2SMKCVpZLtXbxf4f2dpz8jYPQYRa6s23PhLA==} hasBin: true '@pkgr/core@0.1.1': @@ -631,8 +601,8 @@ packages: resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} engines: {node: '>=12.22.0'} - '@pnpm/npm-conf@2.2.2': - resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} + '@pnpm/npm-conf@2.3.1': + resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} engines: {node: '>=12'} '@prettier/sync@0.3.0': @@ -643,14 +613,17 @@ packages: '@scroll-tech/contracts@0.1.0': resolution: {integrity: sha512-aBbDOc3WB/WveZdpJYcrfvMYMz7ZTEiW8M9XMJLba8p9FAR5KGYB/cV+8+EUsq3MKt7C1BfR+WnXoTVdvwIY6w==} - '@scure/base@1.1.1': - resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==} + '@scure/base@1.1.9': + resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} + + '@scure/base@1.2.4': + resolution: {integrity: sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==} - '@scure/bip32@1.1.0': - resolution: {integrity: sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==} + '@scure/bip32@1.1.5': + resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} - '@scure/bip39@1.1.0': - resolution: {integrity: sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==} + '@scure/bip39@1.1.1': + resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} '@sentry/core@5.30.0': resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} @@ -680,9 +653,9 @@ packages: resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} engines: {node: '>=6'} - '@sindresorhus/is@4.6.0': - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} '@solidity-parser/parser@0.19.0': resolution: {integrity: sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA==} @@ -691,14 +664,17 @@ packages: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} - '@truffle/abi-utils@0.3.2': - resolution: {integrity: sha512-32queMD64YKL/tmQgSV4Xs073dIaZ9tp7NP1icjwvFSA3Q9yeu7ApYbSbYMsx9H9zWkkVOsfcoJ2kJEieOCzsA==} + '@truffle/abi-utils@0.3.10': + resolution: {integrity: sha512-Q3TXsF0NIct3KFLL2giF/alfSoKf5axyw+4wQdDRlihFrG1nbTBzWq+Q0ya6oHffZDida0NSpnJIf5IhFMV+JQ==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - '@truffle/contract-schema@3.4.10': - resolution: {integrity: sha512-BhRNRoRvlj2th6E5RNS0BnS0ZxQe01JJz8I7MjkGqdeXSvrn6qDCAnbmvhNgUv0l5h8w5+gBOQhAJhILf1shdQ==} + '@truffle/contract-schema@3.4.16': + resolution: {integrity: sha512-g0WNYR/J327DqtJPI70ubS19K1Fth/1wxt2jFqLsPmz5cGZVjCwuhiie+LfBde4/Mc9QR8G+L3wtmT5cyoBxAg==} + engines: {node: ^16.20 || ^18.16 || >=20} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - '@tsconfig/node10@1.0.9': - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} '@tsconfig/node12@1.0.11': resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} @@ -706,8 +682,8 @@ packages: '@tsconfig/node14@1.0.3': resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - '@tsconfig/node16@1.0.3': - resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} '@typechain/ethers-v5@7.2.0': resolution: {integrity: sha512-jfcmlTvaaJjng63QsT49MT6R1HFhtO/TBMWbyzPFSzMmVIqb2tL6prnKBs4ZJrSvmgIXWy+ttSjpaxCTq8D/Tw==} @@ -732,11 +708,8 @@ packages: '@types/bn.js@4.11.6': resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} - '@types/bn.js@5.1.1': - resolution: {integrity: sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==} - - '@types/cacheable-request@6.0.2': - resolution: {integrity: sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==} + '@types/bn.js@5.1.6': + resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} '@types/cbor@5.0.1': resolution: {integrity: sha512-zVqJy2KzusZPLOgyGJDnOIbu3DxIGGqxYbEwtEEe4Z+la8jwIhOyb+GMrlHafs5tvKruwf8f8qOYP6zTvse/pw==} @@ -753,11 +726,8 @@ packages: '@types/deep-equal-in-any-order@1.0.4': resolution: {integrity: sha512-nkgl+KTkRWeybgMSBCrWrc1YHFrLADVxZ6Kllj40p9U499NGsCrFUjzgHgQY+Upsa/VWOc3YlsFEvhg+drUmkA==} - '@types/http-cache-semantics@4.0.1': - resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} - - '@types/keyv@3.1.4': - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} '@types/lru-cache@5.1.1': resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} @@ -765,29 +735,26 @@ packages: '@types/mocha@10.0.10': resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} - '@types/ms@0.7.31': - resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} '@types/node@12.19.16': resolution: {integrity: sha512-7xHmXm/QJ7cbK2laF+YYD7gb5MggHIIQwqyjin3bpEGiSuvScMQ5JZZXPvRipi1MwckTQbJZROMns/JxdnIL1Q==} - '@types/node@20.17.17': - resolution: {integrity: sha512-/WndGO4kIfMicEQLTi/mDANUu/iVUhT7KboZPdEqqHQ4aTS+3qT3U5gIqWDFV+XouorjfgGqvKILJeHhuQgFYg==} + '@types/node@20.17.19': + resolution: {integrity: sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A==} - '@types/pbkdf2@3.1.0': - resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==} + '@types/pbkdf2@3.1.2': + resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} - '@types/prettier@2.7.1': - resolution: {integrity: sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==} + '@types/prettier@2.7.3': + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} '@types/readable-stream@2.3.15': resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} - '@types/responselike@1.0.0': - resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} - - '@types/secp256k1@4.0.3': - resolution: {integrity: sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==} + '@types/secp256k1@4.0.6': + resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} '@typescript-eslint/eslint-plugin@7.18.0': resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} @@ -847,8 +814,8 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} '@yarnpkg/lockfile@1.1.0': resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} @@ -862,17 +829,12 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - - acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true @@ -894,16 +856,12 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.11.0: - resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -928,12 +886,12 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - antlr4@4.13.1-patch-1: - resolution: {integrity: sha512-OjFLWWLzDMV9rdFhpvroCWR4ooktNg9/nvVYSA5z28wuVpU36QUNuioR1XLnQtcjVlf8npjyz593PxnU/f/Cow==} + antlr4@4.13.2: + resolution: {integrity: sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg==} engines: {node: '>=16'} - anymatch@3.1.2: - resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} arg@4.1.3: @@ -953,29 +911,10 @@ packages: resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} engines: {node: '>=8'} - array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.2: - resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} @@ -990,19 +929,11 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@1.0.0: - resolution: {integrity: sha512-9Y0g0Q8rmSt+H33DfKv7FOc3v+iRI+o1lbzt8jGcIosYW37IIW/2XVYq5NPdmaD5NQ59Nk26Kl/vZbwW9Fr8vg==} - - base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + base-x@3.0.10: + resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} bech32@1.1.4: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} @@ -1020,11 +951,11 @@ packages: resolution: {integrity: sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==} engines: {node: '>=14.0.0'} - bignumber.js@9.1.0: - resolution: {integrity: sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==} + bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} blakejs@1.2.1: @@ -1033,8 +964,8 @@ packages: bn.js@4.11.6: resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} - bn.js@4.12.0: - resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + bn.js@4.12.1: + resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} bn.js@5.2.1: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} @@ -1049,10 +980,6 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -1078,28 +1005,21 @@ packages: buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - bufio@1.0.7: - resolution: {integrity: sha512-bd1dDQhiC+bEbEfg56IdBv7faWa6OipMs/AFFFvtFnB3wAYjlwQpQRZ0pm6ZkgtfL0pILRXhKxOiQj6UzoMR7A==} + bufio@1.2.3: + resolution: {integrity: sha512-5Tt66bRzYUSlVZatc0E92uDenreJ+DpTBmSAUwL4VSxJn3e6cUyYwx+PoqML0GRZatgA/VX8ybhxItF8InZgqA==} engines: {node: '>=8.0.0'} bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - cacheable-lookup@6.1.0: - resolution: {integrity: sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==} - engines: {node: '>=10.6.0'} - - cacheable-request@7.0.2: - resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==} - engines: {node: '>=8'} - - call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -1112,6 +1032,10 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} + cbor@10.0.3: + resolution: {integrity: sha512-72Jnj81xMsqepqdcSdf2+fflz/UDsThOHy5hj2MW5F5xzHL8Oa0KQ6I6V9CwVUPxg5pf+W9xp6W2KilaRXWWtw==} + engines: {node: '>=18'} + cbor@5.2.0: resolution: {integrity: sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==} engines: {node: '>=6.0.0'} @@ -1120,14 +1044,10 @@ packages: resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} engines: {node: '>=12.19'} - cbor@9.0.2: - resolution: {integrity: sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==} - engines: {node: '>=16'} - - chai-as-promised@7.1.1: - resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} + chai-as-promised@7.1.2: + resolution: {integrity: sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==} peerDependencies: - chai: '>= 2.1.2 < 5' + chai: '>= 2.1.2 < 6' chai@4.5.0: resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} @@ -1150,8 +1070,8 @@ packages: check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} ci-info@2.0.0: @@ -1161,8 +1081,9 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - cipher-base@1.0.4: - resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + cipher-base@1.0.6: + resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} + engines: {node: '>= 0.10'} clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} @@ -1175,9 +1096,6 @@ packages: cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - clone-response@1.0.2: - resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==} - code-error-fragment@0.0.230: resolution: {integrity: sha512-cadkfKp6932H8UkhzE/gcUqhRMNf8jHzkAN7+5Myabswaghu4xABTgPHDCjW+dBAJxj/SpkTYokpzDqY4pCzQw==} engines: {node: '>= 4'} @@ -1217,7 +1135,7 @@ packages: resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -1229,12 +1147,17 @@ packages: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} - core-js@3.30.1: - resolution: {integrity: sha512-ZNS5nbiSwDTq4hFosEDqm65izl2CWmLz0hARJMyNQBgkUZMIF51cQiMvIQKA6hvuaeWxQDP3hEedM1JZIgTldQ==} + core-js@3.40.0: + resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} - cosmiconfig@8.2.0: - resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true create-hash@1.2.0: resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} @@ -1245,42 +1168,17 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + cross-spawn@6.0.6: + resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} engines: {node: '>=4.8'} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -1298,8 +1196,8 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} deep-equal-in-any-order@2.0.6: @@ -1316,18 +1214,6 @@ packages: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} - define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} - engines: {node: '>= 0.4'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - delete-empty@3.0.0: resolution: {integrity: sha512-ZUyiwo76W+DYnKsL3Kim6M/UOavPdBJgDYWOmuQhYaZvJH0AXAHbUNyEDtRbBra8wqqr686+63/0azfEk1ebUQ==} engines: {node: '>=10'} @@ -1345,8 +1231,8 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} dir-glob@3.0.1: @@ -1363,16 +1249,12 @@ packages: elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - - enquirer@2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} - engines: {node: '>=8.6'} - enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -1388,43 +1270,8 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.22.3: - resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} - engines: {node: '>= 0.4'} - - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.0.2: - resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - - escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-string-regexp@1.0.5: @@ -1466,6 +1313,7 @@ packages: eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true espree@9.6.1: @@ -1477,8 +1325,8 @@ packages: engines: {node: '>=4'} hasBin: true - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -1493,17 +1341,18 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - ethereum-bloom-filters@1.0.10: - resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} + ethereum-bloom-filters@1.2.0: + resolution: {integrity: sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==} ethereum-cryptography@0.1.3: resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} - ethereum-cryptography@1.1.2: - resolution: {integrity: sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==} + ethereum-cryptography@1.2.0: + resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} ethereumjs-abi@0.6.8: resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + deprecated: This library has been deprecated and usage is discouraged. ethereumjs-util@6.2.1: resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} @@ -1540,8 +1389,8 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-diff@1.2.0: - resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} @@ -1553,6 +1402,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fastq@1.6.0: resolution: {integrity: sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==} @@ -1560,10 +1412,6 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1595,11 +1443,11 @@ packages: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -1607,11 +1455,9 @@ packages: debug: optional: true - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - form-data-encoder@1.7.1: - resolution: {integrity: sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==} + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} fp-ts@1.19.3: resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} @@ -1634,21 +1480,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -1656,29 +1492,10 @@ packages: get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - get-stream@5.1.0: - resolution: {integrity: sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==} - engines: {node: '>=8'} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} - - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1689,12 +1506,15 @@ packages: glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Glob versions prior to v9 are no longer supported glob@7.2.0: resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + deprecated: Glob versions prior to v9 are no longer supported glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} @@ -1705,19 +1525,12 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - got@12.1.0: - resolution: {integrity: sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==} + got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} engines: {node: '>=14.16'} graceful-fs@4.2.10: @@ -1750,9 +1563,6 @@ packages: typescript: optional: true - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -1761,32 +1571,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - hash-base@3.1.0: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} engines: {node: '>=4'} @@ -1794,14 +1578,6 @@ packages: hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -1812,15 +1588,15 @@ packages: hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - http-cache-semantics@4.0.3: - resolution: {integrity: sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==} + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} - http2-wrapper@2.1.11: - resolution: {integrity: sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==} + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} https-proxy-agent@5.0.1: @@ -1838,11 +1614,11 @@ packages: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} - immutable@4.1.0: - resolution: {integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==} + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} imurmurhash@0.1.4: @@ -1855,6 +1631,7 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -1862,54 +1639,20 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - internal-slot@1.0.6: - resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} - engines: {node: '>= 0.4'} - - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - io-ts@1.10.4: resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} - is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} - - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - is-ci@2.0.0: resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} hasBin: true - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - - is-date-object@1.0.2: - resolution: {integrity: sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==} - engines: {node: '>= 0.4'} - is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -1928,24 +1671,12 @@ packages: engines: {node: '>=0.10.0'} is-hex-prefixed@1.0.0: - resolution: {integrity: sha1-fY035q135dEnFIkTxXPggtd39VQ=} + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} engines: {node: '>=6.5.0', npm: '>=3'} is-lower-case@1.1.3: resolution: {integrity: sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==} - is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -1958,37 +1689,10 @@ packages: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} - is-symbol@1.0.3: - resolution: {integrity: sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -1996,9 +1700,6 @@ packages: is-upper-case@1.1.2: resolution: {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -2007,9 +1708,6 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -2062,8 +1760,8 @@ packages: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} - keccak@3.0.2: - resolution: {integrity: sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==} + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} engines: {node: '>=10.0.0'} keyv@4.5.4: @@ -2110,6 +1808,7 @@ packages: lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. lodash.mapvalues@4.6.0: resolution: {integrity: sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==} @@ -2139,17 +1838,12 @@ packages: lower-case@1.1.4: resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} - lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lru_map@0.3.3: resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} @@ -2168,22 +1862,18 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -2193,16 +1883,12 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} - engines: {node: '>=10'} - minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - minimatch@9.0.4: - resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: @@ -2216,8 +1902,8 @@ packages: mnemonist@0.38.5: resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} - mocha@10.2.0: - resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==} + mocha@10.8.2: + resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} engines: {node: '>= 14.0.0'} hasBin: true @@ -2228,17 +1914,9 @@ packages: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.3: - resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -2254,6 +1932,9 @@ packages: node-addon-api@2.0.2: resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + node-fetch@2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} @@ -2263,8 +1944,8 @@ packages: encoding: optional: true - node-gyp-build@4.5.0: - resolution: {integrity: sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==} + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true node-interval-tree@2.1.2: @@ -2283,31 +1964,16 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} + normalize-url@8.0.1: + resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + engines: {node: '>=14.16'} number-to-bn@1.7.0: resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} engines: {node: '>=6.5.0', npm: '>=3'} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - obliterator@2.0.4: - resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + obliterator@2.0.5: + resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -2316,8 +1982,8 @@ packages: resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} engines: {node: '>=8'} - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} ordinal@1.0.3: @@ -2460,10 +2126,6 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -2483,8 +2145,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.5.0: - resolution: {integrity: sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==} + prettier@3.5.1: + resolution: {integrity: sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==} engines: {node: '>=14'} hasBin: true @@ -2494,15 +2156,12 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - - punycode@2.1.1: - resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - pure-rand@5.0.3: - resolution: {integrity: sha512-9N8x1h8dptBQpHyC7aZMS+iNOAm97WMGY0AFrguU1cpfW3I5jINkWe5BIY5md0ofy+1TCIELsVcm/GJXZSaPbw==} + pure-rand@5.0.5: + resolution: {integrity: sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==} quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} @@ -2511,8 +2170,8 @@ packages: randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} rc@1.2.8: @@ -2523,8 +2182,8 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} - readable-stream@3.6.0: - resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} readdirp@3.6.0: @@ -2538,16 +2197,8 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} - engines: {node: '>= 0.4'} - - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - - registry-auth-token@5.0.2: - resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} + registry-auth-token@5.1.0: + resolution: {integrity: sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==} engines: {node: '>=14'} registry-url@6.0.1: @@ -2576,8 +2227,9 @@ packages: resolve@1.17.0: resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} - responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} @@ -2589,6 +2241,7 @@ packages: rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@3.0.2: @@ -2612,43 +2265,28 @@ packages: rustbn-wasm@0.2.0: resolution: {integrity: sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg==} - safe-array-concat@1.0.1: - resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} - engines: {node: '>=0.4'} - - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} - - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} scrypt-js@3.0.1: resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - secp256k1@4.0.3: - resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} - engines: {node: '>=10.0.0'} + secp256k1@4.0.4: + resolution: {integrity: sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==} + engines: {node: '>=18.0.0'} - semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true - semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true semver@7.7.1: @@ -2659,20 +2297,8 @@ packages: sentence-case@2.1.1: resolution: {integrity: sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==} - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} - engines: {node: '>= 0.4'} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} - engines: {node: '>= 0.4'} + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -2703,9 +2329,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -2743,8 +2366,8 @@ packages: resolution: {integrity: sha512-WrnG6T+/UduuzSWsSOAbfq1ywLUDwNea3Gd5hg6PS+pLUm8lz2ECNr0beX609clBxmDeZ3676AiA9nPDljmbJQ==} hasBin: true - solidity-ast@0.4.56: - resolution: {integrity: sha512-HgmsA/Gfklm/M8GFbCX/J1qkVH0spXHgALCNZ8fA8x5X+MFdn/8CP2gr5OVyXjXw6RZTPC/Sxl2RUDQOXyNMeA==} + solidity-ast@0.4.59: + resolution: {integrity: sha512-I+CX0wrYUN9jDfYtcgWSe+OAowaXy8/1YQy7NS4ni5IBDmIYBq7ZzaP/7QqouLjzZapmQtvGLqCaYgoUWqBo5g==} solidity-comments-darwin-arm64@0.0.2: resolution: {integrity: sha512-HidWkVLSh7v+Vu0CA7oI21GWP/ZY7ro8g8OmIxE8oTqyMwgMbE8F1yc58Sj682Hj199HCZsjmtn1BE4PCbLiGA==} @@ -2826,8 +2449,8 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - stacktrace-parser@0.1.10: - resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} engines: {node: '>=6'} statuses@2.0.1: @@ -2841,27 +2464,6 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} - engines: {node: '>= 0.4'} - - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - - string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -2874,7 +2476,7 @@ packages: engines: {node: '>=4'} strip-hex-prefix@1.0.0: - resolution: {integrity: sha1-DF8VX+8RUTczd96du1iNoFUA428=} + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} engines: {node: '>=6.5.0', npm: '>=3'} strip-json-comments@2.0.1: @@ -2900,16 +2502,16 @@ packages: swap-case@1.1.2: resolution: {integrity: sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==} - synckit@0.9.1: - resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} + synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} engines: {node: ^14.18.0 || >=16.0.0} table-layout@1.0.2: resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} engines: {node: '>=8.0.0'} - table@6.8.1: - resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} term-size@2.2.1: @@ -2937,8 +2539,8 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -2969,8 +2571,8 @@ packages: tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tsort@0.0.1: resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} @@ -2985,10 +2587,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - type-detect@4.1.0: resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} @@ -3011,37 +2609,6 @@ packages: peerDependencies: typescript: '>=4.3.0' - typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} - engines: {node: '>= 0.4'} - - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - typescript@5.7.3: resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} @@ -3055,22 +2622,19 @@ packages: resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} engines: {node: '>=8'} - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + undici@5.28.5: + resolution: {integrity: sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==} engines: {node: '>=14.0'} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} unpipe@1.0.0: @@ -3099,8 +2663,8 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - web3-utils@1.7.4: - resolution: {integrity: sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA==} + web3-utils@1.10.0: + resolution: {integrity: sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==} engines: {node: '>=8.0.0'} webidl-conversions@3.0.1: @@ -3109,17 +2673,6 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -3133,12 +2686,16 @@ packages: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} engines: {node: '>=8'} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wordwrapjs@4.0.1: resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} engines: {node: '>=8.0.0'} - workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -3159,8 +2716,8 @@ packages: utf-8-validate: optional: true - ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} peerDependencies: bufferutil: ^4.0.1 @@ -3179,8 +2736,8 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} yargs-unparser@2.0.0: @@ -3201,8 +2758,6 @@ packages: snapshots: - '@aashutoshrathi/word-wrap@1.2.6': {} - '@arbitrum/nitro-contracts@1.1.1': dependencies: '@offchainlabs/upgrade-executor': 1.1.0-beta.0 @@ -3217,26 +2772,25 @@ snapshots: '@openzeppelin/contracts': 4.8.3 '@openzeppelin/contracts-upgradeable': 4.8.3 optionalDependencies: - '@openzeppelin/upgrades-core': 1.34.4 + '@openzeppelin/upgrades-core': 1.42.1 transitivePeerDependencies: - supports-color - '@babel/code-frame@7.18.6': - dependencies: - '@babel/highlight': 7.18.6 - - '@babel/helper-validator-identifier@7.19.1': {} - - '@babel/highlight@7.18.6': + '@babel/code-frame@7.26.2': dependencies: - '@babel/helper-validator-identifier': 7.19.1 - chalk: 2.4.2 + '@babel/helper-validator-identifier': 7.25.9 js-tokens: 4.0.0 + picocolors: 1.1.0 + + '@babel/helper-validator-identifier@7.25.9': {} '@babel/runtime@7.24.0': dependencies: regenerator-runtime: 0.14.1 + '@bytecodealliance/preview2-shim@0.17.0': + optional: true + '@chainlink/solhint-plugin-chainlink-solidity@https://codeload.github.com/smartcontractkit/chainlink-solhint-rules/tar.gz/1b4c0c2663fcd983589d4f33a2e73908624ed43c': {} '@changesets/apply-release-plan@7.0.8': @@ -3392,21 +2946,21 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': {} + '@eslint-community/regexpp@4.12.1': {} '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 @@ -3441,7 +2995,7 @@ snapshots: '@ethersproject/rlp': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 - bufio: 1.0.7 + bufio: 1.2.3 chai: 4.5.0 transitivePeerDependencies: - bufferutil @@ -3715,7 +3269,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -3724,14 +3278,14 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} - '@jridgewell/resolve-uri@3.1.1': {} + '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.9': dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 '@manypkg/find-root@1.1.0': dependencies: @@ -3757,9 +3311,11 @@ snapshots: tweetnacl: 1.0.3 tweetnacl-util: 0.15.1 - '@noble/hashes@1.1.2': {} + '@noble/hashes@1.2.0': {} - '@noble/secp256k1@1.6.3': {} + '@noble/hashes@1.7.1': {} + + '@noble/secp256k1@1.7.1': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -3793,9 +3349,9 @@ snapshots: '@nomicfoundation/ethereumjs-trie': 6.0.4 '@nomicfoundation/ethereumjs-tx': 5.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) ethereum-cryptography: 0.1.3 - lru-cache: 10.2.2 + lru-cache: 10.4.3 transitivePeerDependencies: - c-kzg - supports-color @@ -3823,7 +3379,7 @@ snapshots: '@nomicfoundation/ethereumjs-tx': 5.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4 '@types/debug': 4.1.12 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) ethereum-cryptography: 0.1.3 rustbn-wasm: 0.2.0 transitivePeerDependencies: @@ -3839,10 +3395,10 @@ snapshots: '@nomicfoundation/ethereumjs-rlp': 5.0.4 '@nomicfoundation/ethereumjs-trie': 6.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) ethereum-cryptography: 0.1.3 js-sdsl: 4.4.2 - lru-cache: 10.2.2 + lru-cache: 10.4.3 optionalDependencies: '@nomicfoundation/ethereumjs-verkle': 0.0.2 transitivePeerDependencies: @@ -3855,8 +3411,8 @@ snapshots: '@nomicfoundation/ethereumjs-util': 9.0.4 '@types/readable-stream': 2.3.15 ethereum-cryptography: 0.1.3 - lru-cache: 10.2.2 - readable-stream: 3.6.0 + lru-cache: 10.4.3 + readable-stream: 3.6.2 transitivePeerDependencies: - c-kzg @@ -3876,7 +3432,7 @@ snapshots: dependencies: '@nomicfoundation/ethereumjs-rlp': 5.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4 - lru-cache: 10.2.2 + lru-cache: 10.4.3 rust-verkle-wasm: 0.0.1 transitivePeerDependencies: - c-kzg @@ -3892,101 +3448,94 @@ snapshots: '@nomicfoundation/ethereumjs-trie': 6.0.4 '@nomicfoundation/ethereumjs-tx': 5.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) ethereum-cryptography: 0.1.3 transitivePeerDependencies: - '@nomicfoundation/ethereumjs-verkle' - c-kzg - supports-color - '@nomicfoundation/hardhat-chai-matchers@1.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3)))(chai@4.5.0)(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3))': + '@nomicfoundation/hardhat-chai-matchers@1.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3)))(chai@4.5.0)(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3))': dependencies: '@ethersproject/abi': 5.7.0 - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 - chai-as-promised: 7.1.1(chai@4.5.0) - deep-eql: 4.1.3 + chai-as-promised: 7.1.2(chai@4.5.0) + deep-eql: 4.1.4 ethers: 5.7.2 - hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3) + hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3))': dependencies: - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) ethers: 5.7.2 - hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3) + hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3))': + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3) + hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3) - '@nomicfoundation/hardhat-verify@2.0.12(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3))': + '@nomicfoundation/hardhat-verify@2.0.12(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3))': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/address': 5.7.0 cbor: 8.1.0 - debug: 4.4.0 - hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3) + debug: 4.4.0(supports-color@8.1.1) + hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3) lodash.clonedeep: 4.5.0 picocolors: 1.1.0 - semver: 6.3.0 - table: 6.8.1 - undici: 5.28.4 + semver: 6.3.1 + table: 6.9.0 + undici: 5.28.5 transitivePeerDependencies: - supports-color - '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.0': - optional: true - - '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.0': - optional: true - - '@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.0': + '@nomicfoundation/slang@0.18.3': + dependencies: + '@bytecodealliance/preview2-shim': 0.17.0 optional: true - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.0': + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.0': + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.0': + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.0': + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.0': + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.0': + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.0': + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer@0.1.0': + '@nomicfoundation/solidity-analyzer@0.1.2': optionalDependencies: - '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.0 - '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.0 - '@nomicfoundation/solidity-analyzer-freebsd-x64': 0.1.0 - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.0 - '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.0 - '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.0 - '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.0 - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc': 0.1.0 - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc': 0.1.0 - '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.0 - - '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3))': + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 + + '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3))': dependencies: ethers: 5.7.2 - hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3) + hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3) '@offchainlabs/upgrade-executor@1.1.0-beta.0': dependencies: @@ -4009,16 +3558,18 @@ snapshots: '@openzeppelin/contracts@4.9.3': {} - '@openzeppelin/upgrades-core@1.34.4': + '@openzeppelin/upgrades-core@1.42.1': dependencies: - cbor: 9.0.2 + '@nomicfoundation/slang': 0.18.3 + cbor: 10.0.3 chalk: 4.1.2 compare-versions: 6.1.1 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) ethereumjs-util: 7.1.5 + minimatch: 9.0.5 minimist: 1.2.8 proper-lockfile: 4.1.2 - solidity-ast: 0.4.56 + solidity-ast: 0.4.59 transitivePeerDependencies: - supports-color optional: true @@ -4031,30 +3582,32 @@ snapshots: dependencies: graceful-fs: 4.2.10 - '@pnpm/npm-conf@2.2.2': + '@pnpm/npm-conf@2.3.1': dependencies: '@pnpm/config.env-replace': 1.1.0 '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@prettier/sync@0.3.0(prettier@3.5.0)': + '@prettier/sync@0.3.0(prettier@3.5.1)': dependencies: - prettier: 3.5.0 + prettier: 3.5.1 '@scroll-tech/contracts@0.1.0': {} - '@scure/base@1.1.1': {} + '@scure/base@1.1.9': {} + + '@scure/base@1.2.4': {} - '@scure/bip32@1.1.0': + '@scure/bip32@1.1.5': dependencies: - '@noble/hashes': 1.1.2 - '@noble/secp256k1': 1.6.3 - '@scure/base': 1.1.1 + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.1.9 - '@scure/bip39@1.1.0': + '@scure/bip39@1.1.1': dependencies: - '@noble/hashes': 1.1.2 - '@scure/base': 1.1.1 + '@noble/hashes': 1.2.0 + '@scure/base': 1.1.9 '@sentry/core@5.30.0': dependencies: @@ -4105,7 +3658,7 @@ snapshots: '@sentry/types': 5.30.0 tslib: 1.14.1 - '@sindresorhus/is@4.6.0': {} + '@sindresorhus/is@5.6.0': {} '@solidity-parser/parser@0.19.0': {} @@ -4113,26 +3666,26 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@truffle/abi-utils@0.3.2': + '@truffle/abi-utils@0.3.10': dependencies: change-case: 3.0.2 fast-check: 3.1.1 - web3-utils: 1.7.4 + web3-utils: 1.10.0 - '@truffle/contract-schema@3.4.10': + '@truffle/contract-schema@3.4.16': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@tsconfig/node10@1.0.9': {} + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} '@tsconfig/node14@1.0.3': {} - '@tsconfig/node16@1.0.3': {} + '@tsconfig/node16@1.0.4': {} '@typechain/ethers-v5@7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2(typescript@5.7.3))(typescript@5.7.3)': dependencies: @@ -4145,34 +3698,27 @@ snapshots: typechain: 8.3.2(typescript@5.7.3) typescript: 5.7.3 - '@typechain/hardhat@7.0.0(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2(typescript@5.7.3))(typescript@5.7.3))(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3))(typechain@8.3.2(typescript@5.7.3))': + '@typechain/hardhat@7.0.0(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2(typescript@5.7.3))(typescript@5.7.3))(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3))(typechain@8.3.2(typescript@5.7.3))': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/providers': 5.7.2 '@typechain/ethers-v5': 7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2(typescript@5.7.3))(typescript@5.7.3) ethers: 5.7.2 fs-extra: 9.1.0 - hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3) + hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3) typechain: 8.3.2(typescript@5.7.3) '@types/bn.js@4.11.6': dependencies: - '@types/node': 20.17.17 - - '@types/bn.js@5.1.1': - dependencies: - '@types/node': 20.17.17 + '@types/node': 20.17.19 - '@types/cacheable-request@6.0.2': + '@types/bn.js@5.1.6': dependencies: - '@types/http-cache-semantics': 4.0.1 - '@types/keyv': 3.1.4 - '@types/node': 20.17.17 - '@types/responselike': 1.0.0 + '@types/node': 20.17.19 '@types/cbor@5.0.1': dependencies: - '@types/node': 20.17.17 + '@types/node': 20.17.19 '@types/chai-as-promised@7.1.8': dependencies: @@ -4182,50 +3728,42 @@ snapshots: '@types/debug@4.1.12': dependencies: - '@types/ms': 0.7.31 + '@types/ms': 2.1.0 '@types/deep-equal-in-any-order@1.0.4': {} - '@types/http-cache-semantics@4.0.1': {} - - '@types/keyv@3.1.4': - dependencies: - '@types/node': 20.17.17 + '@types/http-cache-semantics@4.0.4': {} '@types/lru-cache@5.1.1': {} '@types/mocha@10.0.10': {} - '@types/ms@0.7.31': {} + '@types/ms@2.1.0': {} '@types/node@12.19.16': {} - '@types/node@20.17.17': + '@types/node@20.17.19': dependencies: undici-types: 6.19.8 - '@types/pbkdf2@3.1.0': + '@types/pbkdf2@3.1.2': dependencies: - '@types/node': 20.17.17 + '@types/node': 20.17.19 - '@types/prettier@2.7.1': {} + '@types/prettier@2.7.3': {} '@types/readable-stream@2.3.15': dependencies: - '@types/node': 20.17.17 + '@types/node': 20.17.19 safe-buffer: 5.1.2 - '@types/responselike@1.0.0': - dependencies: - '@types/node': 20.17.17 - - '@types/secp256k1@4.0.3': + '@types/secp256k1@4.0.6': dependencies: - '@types/node': 20.17.17 + '@types/node': 20.17.19 '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)': dependencies: - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/regexpp': 4.12.1 '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.3) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) @@ -4235,7 +3773,7 @@ snapshots: graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.7.3) + ts-api-utils: 1.4.3(typescript@5.7.3) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: @@ -4247,7 +3785,7 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) eslint: 8.57.1 optionalDependencies: typescript: 5.7.3 @@ -4263,9 +3801,9 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) eslint: 8.57.1 - ts-api-utils: 1.3.0(typescript@5.7.3) + ts-api-utils: 1.4.3(typescript@5.7.3) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: @@ -4277,12 +3815,12 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.4 + minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 1.3.0(typescript@5.7.3) + ts-api-utils: 1.4.3(typescript@5.7.3) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: @@ -4290,7 +3828,7 @@ snapshots: '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) @@ -4304,14 +3842,14 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@ungap/structured-clone@1.2.0': {} + '@ungap/structured-clone@1.3.0': {} '@yarnpkg/lockfile@1.1.0': {} abi-to-sol@0.6.6: dependencies: - '@truffle/abi-utils': 0.3.2 - '@truffle/contract-schema': 3.4.10 + '@truffle/abi-utils': 0.3.10 + '@truffle/contract-schema': 3.4.16 ajv: 6.12.6 better-ajv-errors: 0.8.2(ajv@6.12.6) neodoc: 2.0.2 @@ -4323,15 +3861,15 @@ snapshots: transitivePeerDependencies: - supports-color - acorn-jsx@5.3.2(acorn@8.11.3): + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: - acorn: 8.11.3 + acorn: 8.14.0 - acorn-walk@8.2.0: {} - - acorn@8.10.0: {} + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.0 - acorn@8.11.3: {} + acorn@8.14.0: {} adm-zip@0.4.16: {} @@ -4339,7 +3877,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -4355,19 +3893,17 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.11.0: + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - uri-js: 4.4.1 ansi-align@3.0.1: dependencies: string-width: 4.2.3 - ansi-colors@4.1.1: {} - ansi-colors@4.1.3: {} ansi-escapes@4.3.2: @@ -4386,9 +3922,9 @@ snapshots: dependencies: color-convert: 2.0.1 - antlr4@4.13.1-patch-1: {} + antlr4@4.13.2: {} - anymatch@3.1.2: + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 @@ -4405,53 +3941,8 @@ snapshots: array-back@4.0.2: {} - array-buffer-byte-length@1.0.0: - dependencies: - call-bind: 1.0.5 - is-array-buffer: 3.0.2 - optional: true - - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - optional: true - array-union@2.1.0: {} - array.prototype.findlast@1.2.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - optional: true - - arraybuffer.prototype.slice@1.0.2: - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 - is-array-buffer: 3.0.2 - is-shared-array-buffer: 1.0.2 - optional: true - - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - optional: true - assertion-error@1.1.0: {} ast-parents@0.0.1: {} @@ -4460,17 +3951,9 @@ snapshots: at-least-node@1.0.0: {} - available-typed-arrays@1.0.5: - optional: true + balanced-match@1.0.2: {} - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - optional: true - - balanced-match@1.0.0: {} - - base-x@3.0.9: + base-x@3.0.10: dependencies: safe-buffer: 5.2.1 @@ -4478,11 +3961,11 @@ snapshots: better-ajv-errors@0.8.2(ajv@6.12.6): dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.26.2 '@babel/runtime': 7.24.0 ajv: 6.12.6 chalk: 2.4.2 - core-js: 3.30.1 + core-js: 3.40.0 json-to-ast: 2.1.0 jsonpointer: 5.0.1 leven: 3.1.0 @@ -4493,15 +3976,15 @@ snapshots: bigint-crypto-utils@3.3.0: {} - bignumber.js@9.1.0: {} + bignumber.js@9.1.2: {} - binary-extensions@2.2.0: {} + binary-extensions@2.3.0: {} blakejs@1.2.1: {} bn.js@4.11.6: {} - bn.js@4.12.0: {} + bn.js@4.12.1: {} bn.js@5.2.1: {} @@ -4518,16 +4001,12 @@ snapshots: brace-expansion@1.1.11: dependencies: - balanced-match: 1.0.0 + balanced-match: 1.0.2 concat-map: 0.0.1 brace-expansion@2.0.1: dependencies: - balanced-match: 1.0.0 - - braces@3.0.2: - dependencies: - fill-range: 7.0.1 + balanced-match: 1.0.2 braces@3.0.3: dependencies: @@ -4540,7 +4019,7 @@ snapshots: browserify-aes@1.2.0: dependencies: buffer-xor: 1.0.3 - cipher-base: 1.0.4 + cipher-base: 1.0.6 create-hash: 1.2.0 evp_bytestokey: 1.0.3 inherits: 2.0.4 @@ -4548,7 +4027,7 @@ snapshots: bs58@4.0.1: dependencies: - base-x: 3.0.9 + base-x: 3.0.10 bs58check@2.1.2: dependencies: @@ -4560,37 +4039,21 @@ snapshots: buffer-xor@1.0.3: {} - bufio@1.0.7: {} + bufio@1.2.3: {} bytes@3.1.2: {} - cacheable-lookup@6.1.0: {} + cacheable-lookup@7.0.0: {} - cacheable-request@7.0.2: + cacheable-request@10.2.14: dependencies: - clone-response: 1.0.2 - get-stream: 5.1.0 - http-cache-semantics: 4.0.3 + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.1.1 keyv: 4.5.4 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - - call-bind@1.0.5: - dependencies: - function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.1.1 - optional: true - - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - optional: true + mimic-response: 4.0.0 + normalize-url: 8.0.1 + responselike: 3.0.0 callsites@3.1.0: {} @@ -4601,21 +4064,21 @@ snapshots: camelcase@6.3.0: {} + cbor@10.0.3: + dependencies: + nofilter: 3.1.0 + optional: true + cbor@5.2.0: dependencies: - bignumber.js: 9.1.0 + bignumber.js: 9.1.2 nofilter: 1.0.4 cbor@8.1.0: dependencies: nofilter: 3.1.0 - cbor@9.0.2: - dependencies: - nofilter: 3.1.0 - optional: true - - chai-as-promised@7.1.1(chai@4.5.0): + chai-as-promised@7.1.2(chai@4.5.0): dependencies: chai: 4.5.0 check-error: 1.0.3 @@ -4624,7 +4087,7 @@ snapshots: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 - deep-eql: 4.1.3 + deep-eql: 4.1.4 get-func-name: 2.0.2 loupe: 2.3.7 pathval: 1.1.1 @@ -4668,23 +4131,23 @@ snapshots: dependencies: get-func-name: 2.0.2 - chokidar@3.5.3: + chokidar@3.6.0: dependencies: - anymatch: 3.1.2 - braces: 3.0.2 + anymatch: 3.1.3 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 ci-info@2.0.0: {} ci-info@3.9.0: {} - cipher-base@1.0.4: + cipher-base@1.0.6: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 @@ -4699,10 +4162,6 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - clone-response@1.0.2: - dependencies: - mimic-response: 1.0.1 - code-error-fragment@0.0.230: {} color-convert@1.9.3: @@ -4754,18 +4213,20 @@ snapshots: cookie@0.4.2: {} - core-js@3.30.1: {} + core-js@3.40.0: {} - cosmiconfig@8.2.0: + cosmiconfig@8.3.6(typescript@5.7.3): dependencies: - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 + optionalDependencies: + typescript: 5.7.3 create-hash@1.2.0: dependencies: - cipher-base: 1.0.4 + cipher-base: 1.0.6 inherits: 2.0.4 md5.js: 1.3.5 ripemd160: 2.0.2 @@ -4773,7 +4234,7 @@ snapshots: create-hmac@1.1.7: dependencies: - cipher-base: 1.0.4 + cipher-base: 1.0.6 create-hash: 1.2.0 inherits: 2.0.4 ripemd160: 2.0.2 @@ -4782,68 +4243,37 @@ snapshots: create-require@1.1.1: {} - cross-spawn@6.0.5: + cross-spawn@6.0.6: dependencies: nice-try: 1.0.5 path-key: 2.0.1 - semver: 5.7.1 + semver: 5.7.2 shebang-command: 1.2.0 which: 1.3.1 - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - optional: true - - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - optional: true - - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - optional: true - dataloader@1.4.0: {} - debug@4.3.4(supports-color@8.1.1): + debug@4.4.0(supports-color@8.1.1): dependencies: - ms: 2.1.2 + ms: 2.1.3 optionalDependencies: supports-color: 8.1.1 - debug@4.4.0: - dependencies: - ms: 2.1.3 - decamelize@4.0.0: {} decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - deep-eql@4.1.3: + deep-eql@4.1.4: dependencies: - type-detect: 4.0.8 + type-detect: 4.1.0 deep-equal-in-any-order@2.0.6: dependencies: @@ -4856,27 +4286,6 @@ snapshots: defer-to-connect@2.0.1: {} - define-data-property@1.1.1: - dependencies: - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.0 - optional: true - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - optional: true - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.1 - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - optional: true - delete-empty@3.0.0: dependencies: ansi-colors: 4.1.3 @@ -4890,7 +4299,7 @@ snapshots: diff@4.0.2: {} - diff@5.0.0: {} + diff@5.2.0: {} dir-glob@3.0.1: dependencies: @@ -4906,7 +4315,7 @@ snapshots: elliptic@6.5.4: dependencies: - bn.js: 4.12.0 + bn.js: 4.12.1 brorand: 1.1.0 hash.js: 1.1.7 hmac-drbg: 1.0.1 @@ -4914,15 +4323,17 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - emoji-regex@8.0.0: {} - - end-of-stream@1.4.4: + elliptic@6.6.1: dependencies: - once: 1.4.0 + bn.js: 4.12.1 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 - enquirer@2.3.6: - dependencies: - ansi-colors: 4.1.3 + emoji-regex@8.0.0: {} enquirer@2.4.1: dependencies: @@ -4937,139 +4348,7 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.22.3: - dependencies: - array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.2 - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - es-set-tostringtag: 2.0.2 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.2 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 - has-property-descriptors: 1.0.0 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - internal-slot: 1.0.6 - is-array-buffer: 3.0.2 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.12 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.1 - safe-array-concat: 1.0.1 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.0 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.0 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.13 - optional: true - - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.3 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - optional: true - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - optional: true - - es-errors@1.3.0: - optional: true - - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - optional: true - - es-set-tostringtag@2.0.2: - dependencies: - get-intrinsic: 1.2.2 - has-tostringtag: 1.0.0 - hasown: 2.0.0 - optional: true - - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - optional: true - - es-shim-unscopables@1.0.2: - dependencies: - hasown: 2.0.0 - optional: true - - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.2 - is-symbol: 1.0.3 - optional: true - - escalade@3.1.1: {} + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} @@ -5079,12 +4358,12 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-prettier@5.2.3(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.5.0): + eslint-plugin-prettier@5.2.3(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.5.1): dependencies: eslint: 8.57.1 - prettier: 3.5.0 + prettier: 3.5.1 prettier-linter-helpers: 1.0.0 - synckit: 0.9.1 + synckit: 0.9.2 optionalDependencies: eslint-config-prettier: 9.1.0(eslint@8.57.1) @@ -5097,24 +4376,24 @@ snapshots: eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 + '@ungap/structured-clone': 1.3.0 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.4.0 + cross-spawn: 7.0.6 + debug: 4.4.0(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 @@ -5132,7 +4411,7 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: @@ -5140,13 +4419,13 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} - esquery@1.5.0: + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -5158,53 +4437,53 @@ snapshots: esutils@2.0.3: {} - ethereum-bloom-filters@1.0.10: + ethereum-bloom-filters@1.2.0: dependencies: - js-sha3: 0.8.0 + '@noble/hashes': 1.7.1 ethereum-cryptography@0.1.3: dependencies: - '@types/pbkdf2': 3.1.0 - '@types/secp256k1': 4.0.3 + '@types/pbkdf2': 3.1.2 + '@types/secp256k1': 4.0.6 blakejs: 1.2.1 browserify-aes: 1.2.0 bs58check: 2.1.2 create-hash: 1.2.0 create-hmac: 1.1.7 hash.js: 1.1.7 - keccak: 3.0.2 + keccak: 3.0.4 pbkdf2: 3.1.2 randombytes: 2.1.0 safe-buffer: 5.2.1 scrypt-js: 3.0.1 - secp256k1: 4.0.3 + secp256k1: 4.0.4 setimmediate: 1.0.5 - ethereum-cryptography@1.1.2: + ethereum-cryptography@1.2.0: dependencies: - '@noble/hashes': 1.1.2 - '@noble/secp256k1': 1.6.3 - '@scure/bip32': 1.1.0 - '@scure/bip39': 1.1.0 + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/bip32': 1.1.5 + '@scure/bip39': 1.1.1 ethereumjs-abi@0.6.8: dependencies: - bn.js: 4.12.0 + bn.js: 4.12.1 ethereumjs-util: 6.2.1 ethereumjs-util@6.2.1: dependencies: '@types/bn.js': 4.11.6 - bn.js: 4.12.0 + bn.js: 4.12.1 create-hash: 1.2.0 - elliptic: 6.5.4 + elliptic: 6.6.1 ethereum-cryptography: 0.1.3 ethjs-util: 0.1.6 rlp: 2.2.7 ethereumjs-util@7.1.5: dependencies: - '@types/bn.js': 5.1.1 + '@types/bn.js': 5.1.6 bn.js: 5.2.1 create-hash: 1.2.0 ethereum-cryptography: 0.1.3 @@ -5271,11 +4550,11 @@ snapshots: fast-check@3.1.1: dependencies: - pure-rand: 5.0.3 + pure-rand: 5.0.5 fast-deep-equal@3.1.3: {} - fast-diff@1.2.0: {} + fast-diff@1.3.0: {} fast-glob@3.3.1: dependencies: @@ -5283,12 +4562,14 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} + fast-uri@3.0.6: {} + fastq@1.6.0: dependencies: reusify: 1.0.4 @@ -5297,10 +4578,6 @@ snapshots: dependencies: flat-cache: 3.2.0 - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -5325,28 +4602,23 @@ snapshots: find-yarn-workspace-root@2.0.0: dependencies: - micromatch: 4.0.5 + micromatch: 4.0.8 flat-cache@3.2.0: dependencies: - flatted: 3.3.1 + flatted: 3.3.2 keyv: 4.5.4 rimraf: 3.0.2 flat@5.0.2: {} - flatted@3.3.1: {} + flatted@3.3.2: {} - follow-redirects@1.15.6(debug@4.4.0): + follow-redirects@1.15.9(debug@4.4.0): optionalDependencies: - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - optional: true - - form-data-encoder@1.7.1: {} + form-data-encoder@2.1.4: {} fp-ts@1.19.3: {} @@ -5375,67 +4647,19 @@ snapshots: at-least-node: 1.0.0 graceful-fs: 4.2.10 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 fs.realpath@1.0.0: {} - fsevents@2.3.2: - optional: true - - function-bind@1.1.2: - optional: true - - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - functions-have-names: 1.2.3 - optional: true - - functions-have-names@1.2.3: + fsevents@2.3.3: optional: true get-caller-file@2.0.5: {} get-func-name@2.0.2: {} - get-intrinsic@1.2.2: - dependencies: - function-bind: 1.1.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - optional: true - - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - optional: true - - get-stream@5.1.0: - dependencies: - pump: 3.0.0 - get-stream@6.0.1: {} - get-symbol-description@1.0.0: - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - optional: true - - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - optional: true - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -5483,11 +4707,6 @@ snapshots: dependencies: type-fest: 0.20.2 - globalthis@1.0.3: - dependencies: - define-properties: 1.2.1 - optional: true - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -5497,26 +4716,19 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - gopd@1.0.1: + got@12.6.1: dependencies: - get-intrinsic: 1.2.2 - optional: true - - got@12.1.0: - dependencies: - '@sindresorhus/is': 4.6.0 + '@sindresorhus/is': 5.6.0 '@szmarczak/http-timer': 5.0.1 - '@types/cacheable-request': 6.0.2 - '@types/responselike': 1.0.0 - cacheable-lookup: 6.1.0 - cacheable-request: 7.0.2 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 decompress-response: 6.0.0 - form-data-encoder: 1.7.1 + form-data-encoder: 2.1.4 get-stream: 6.0.1 - http2-wrapper: 2.1.11 + http2-wrapper: 2.2.1 lowercase-keys: 3.0.0 p-cancelable: 3.0.0 - responselike: 2.0.1 + responselike: 3.0.0 graceful-fs@4.2.10: {} @@ -5524,11 +4736,11 @@ snapshots: graphemer@1.4.0: {} - hardhat-abi-exporter@2.10.1(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3)): + hardhat-abi-exporter@2.10.1(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3)): dependencies: '@ethersproject/abi': 5.7.0 delete-empty: 3.0.0 - hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3) + hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3) hardhat-ignore-warnings@0.2.12: dependencies: @@ -5536,7 +4748,7 @@ snapshots: node-interval-tree: 2.1.2 solidity-comments: 0.0.2 - hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3): + hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3))(typescript@5.7.3): dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 @@ -5551,45 +4763,45 @@ snapshots: '@nomicfoundation/ethereumjs-util': 9.0.4 '@nomicfoundation/ethereumjs-verkle': 0.0.2 '@nomicfoundation/ethereumjs-vm': 7.0.4(@nomicfoundation/ethereumjs-verkle@0.0.2) - '@nomicfoundation/solidity-analyzer': 0.1.0 + '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.1 + '@types/bn.js': 5.1.6 '@types/lru-cache': 5.1.1 adm-zip: 0.4.16 aggregate-error: 3.1.0 ansi-escapes: 4.3.2 boxen: 5.1.2 chalk: 2.4.2 - chokidar: 3.5.3 + chokidar: 3.6.0 ci-info: 2.0.0 - debug: 4.4.0 - enquirer: 2.3.6 + debug: 4.4.0(supports-color@8.1.1) + enquirer: 2.4.1 env-paths: 2.2.1 - ethereum-cryptography: 1.1.2 + ethereum-cryptography: 1.2.0 ethereumjs-abi: 0.6.8 find-up: 2.1.0 fp-ts: 1.19.3 fs-extra: 7.0.1 glob: 7.2.0 - immutable: 4.1.0 + immutable: 4.3.7 io-ts: 1.10.4 - keccak: 3.0.2 + keccak: 3.0.4 lodash: 4.17.21 mnemonist: 0.38.5 - mocha: 10.2.0 + mocha: 10.8.2 p-map: 4.0.0 - raw-body: 2.5.1 + raw-body: 2.5.2 resolve: 1.17.0 - semver: 6.3.0 + semver: 6.3.1 solc: 0.7.3(debug@4.4.0) source-map-support: 0.5.21 - stacktrace-parser: 0.1.10 + stacktrace-parser: 0.1.11 tsort: 0.0.1 - undici: 5.28.4 + undici: 5.28.5 uuid: 8.3.2 - ws: 7.5.9 + ws: 7.5.10 optionalDependencies: - ts-node: 10.9.2(@types/node@20.17.17)(typescript@5.7.3) + ts-node: 10.9.2(@types/node@20.17.19)(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - bufferutil @@ -5597,46 +4809,14 @@ snapshots: - supports-color - utf-8-validate - has-bigints@1.0.2: - optional: true - has-flag@3.0.0: {} has-flag@4.0.0: {} - has-property-descriptors@1.0.0: - dependencies: - get-intrinsic: 1.2.2 - optional: true - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - optional: true - - has-proto@1.0.1: - optional: true - - has-proto@1.0.3: - optional: true - - has-symbols@1.0.3: - optional: true - - has-tostringtag@1.0.0: - dependencies: - has-symbols: 1.0.3 - optional: true - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.0.3 - optional: true - hash-base@3.1.0: dependencies: inherits: 2.0.4 - readable-stream: 3.6.0 + readable-stream: 3.6.2 safe-buffer: 5.2.1 hash.js@1.1.7: @@ -5644,16 +4824,6 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 - hasown@2.0.0: - dependencies: - function-bind: 1.1.2 - optional: true - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - optional: true - he@1.2.0: {} header-case@1.0.1: @@ -5667,7 +4837,7 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - http-cache-semantics@4.0.3: {} + http-cache-semantics@4.1.1: {} http-errors@2.0.0: dependencies: @@ -5677,7 +4847,7 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 - http2-wrapper@2.1.11: + http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 @@ -5685,7 +4855,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -5697,9 +4867,9 @@ snapshots: ignore@5.3.1: {} - immutable@4.1.0: {} + immutable@4.3.7: {} - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -5717,69 +4887,20 @@ snapshots: ini@1.3.8: {} - internal-slot@1.0.6: - dependencies: - get-intrinsic: 1.2.2 - hasown: 2.0.0 - side-channel: 1.0.4 - optional: true - - internal-slot@1.0.7: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.4 - optional: true - io-ts@1.10.4: dependencies: fp-ts: 1.19.3 - is-array-buffer@3.0.2: - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 - optional: true - - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - optional: true - is-arrayish@0.2.1: {} - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - optional: true - is-binary-path@2.1.0: dependencies: - binary-extensions: 2.2.0 - - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - optional: true - - is-callable@1.2.7: - optional: true + binary-extensions: 2.3.0 is-ci@2.0.0: dependencies: ci-info: 2.0.0 - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - optional: true - - is-date-object@1.0.2: - optional: true - is-docker@2.2.1: {} is-extglob@2.1.1: {} @@ -5796,83 +4917,28 @@ snapshots: dependencies: lower-case: 1.1.4 - is-negative-zero@2.0.2: - optional: true - - is-negative-zero@2.0.3: - optional: true - - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.0 - optional: true - is-number@7.0.0: {} is-path-inside@3.0.3: {} is-plain-obj@2.1.0: {} - is-regex@1.1.4: - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - optional: true - - is-shared-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.5 - optional: true - - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.7 - optional: true - - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.0 - optional: true - is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 - is-symbol@1.0.3: - dependencies: - has-symbols: 1.0.3 - optional: true - - is-typed-array@1.1.12: - dependencies: - which-typed-array: 1.1.13 - optional: true - - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - optional: true - is-unicode-supported@0.1.0: {} is-upper-case@1.1.2: dependencies: upper-case: 1.1.3 - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.5 - optional: true - is-windows@1.0.2: {} is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - isarray@2.0.5: - optional: true - isexe@2.0.0: {} js-sdsl@4.4.2: {} @@ -5915,17 +4981,17 @@ snapshots: jsonfile@6.1.0: dependencies: - universalify: 2.0.0 + universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.10 jsonpointer@5.0.1: {} - keccak@3.0.2: + keccak@3.0.4: dependencies: node-addon-api: 2.0.2 - node-gyp-build: 4.5.0 - readable-stream: 3.6.0 + node-gyp-build: 4.8.4 + readable-stream: 3.6.2 keyv@4.5.4: dependencies: @@ -5996,11 +5062,9 @@ snapshots: lower-case@1.1.4: {} - lowercase-keys@2.0.0: {} - lowercase-keys@3.0.0: {} - lru-cache@10.2.2: {} + lru-cache@10.4.3: {} lru_map@0.3.3: {} @@ -6016,20 +5080,15 @@ snapshots: merge2@1.4.1: {} - micromatch@4.0.5: - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 - mimic-response@1.0.1: {} - mimic-response@3.1.0: {} + mimic-response@4.0.0: {} + minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} @@ -6038,15 +5097,11 @@ snapshots: dependencies: brace-expansion: 1.1.11 - minimatch@5.0.1: - dependencies: - brace-expansion: 2.0.1 - minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.4: + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -6056,42 +5111,37 @@ snapshots: mnemonist@0.38.5: dependencies: - obliterator: 2.0.4 + obliterator: 2.0.5 - mocha@10.2.0: + mocha@10.8.2: dependencies: - ansi-colors: 4.1.1 + ansi-colors: 4.1.3 browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.4(supports-color@8.1.1) - diff: 5.0.0 + chokidar: 3.6.0 + debug: 4.4.0(supports-color@8.1.1) + diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 - glob: 7.2.0 + glob: 8.1.0 he: 1.2.0 js-yaml: 4.1.0 log-symbols: 4.1.0 - minimatch: 5.0.1 + minimatch: 5.1.6 ms: 2.1.3 - nanoid: 3.3.3 - serialize-javascript: 6.0.0 + serialize-javascript: 6.0.2 strip-json-comments: 3.1.1 supports-color: 8.1.1 - workerpool: 6.2.1 + workerpool: 6.5.1 yargs: 16.2.0 - yargs-parser: 20.2.4 + yargs-parser: 20.2.9 yargs-unparser: 2.0.0 moment@2.30.1: {} mri@1.2.0: {} - ms@2.1.2: {} - ms@2.1.3: {} - nanoid@3.3.3: {} - natural-compare@1.4.0: {} neodoc@2.0.2: @@ -6106,11 +5156,13 @@ snapshots: node-addon-api@2.0.2: {} + node-addon-api@5.1.0: {} + node-fetch@2.6.7: dependencies: whatwg-url: 5.0.0 - node-gyp-build@4.5.0: {} + node-gyp-build@4.8.4: {} node-interval-tree@2.1.2: dependencies: @@ -6122,36 +5174,14 @@ snapshots: normalize-path@3.0.0: {} - normalize-url@6.1.0: {} + normalize-url@8.0.1: {} number-to-bn@1.7.0: dependencies: bn.js: 4.11.6 strip-hex-prefix: 1.0.0 - object-inspect@1.13.1: - optional: true - - object-keys@1.1.1: - optional: true - - object.assign@4.1.4: - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - optional: true - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - optional: true - - obliterator@2.0.4: {} + obliterator@2.0.5: {} once@1.4.0: dependencies: @@ -6162,14 +5192,14 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - optionator@0.9.3: + optionator@0.9.4: dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 ordinal@1.0.3: {} @@ -6219,8 +5249,8 @@ snapshots: package-json@8.1.1: dependencies: - got: 12.1.0 - registry-auth-token: 5.0.2 + got: 12.6.1 + registry-auth-token: 5.1.0 registry-url: 6.0.1 semver: 7.7.1 @@ -6236,7 +5266,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.26.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -6250,7 +5280,7 @@ snapshots: dependencies: '@yarnpkg/lockfile': 1.1.0 chalk: 4.1.2 - cross-spawn: 6.0.5 + cross-spawn: 6.0.6 find-yarn-workspace-root: 2.0.0 fs-extra: 9.1.0 is-ci: 2.0.0 @@ -6258,7 +5288,7 @@ snapshots: minimist: 1.2.8 open: 7.4.2 rimraf: 2.7.1 - semver: 5.7.1 + semver: 5.7.2 slash: 2.0.0 tmp: 0.0.33 yaml: 1.10.2 @@ -6301,14 +5331,11 @@ snapshots: pluralize@8.0.0: {} - possible-typed-array-names@1.0.0: - optional: true - prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: dependencies: - fast-diff: 1.2.0 + fast-diff: 1.3.0 prettier-plugin-solidity@1.4.2(prettier@2.8.8): dependencies: @@ -6317,15 +5344,15 @@ snapshots: semver: 7.7.1 optional: true - prettier-plugin-solidity@1.4.2(prettier@3.5.0): + prettier-plugin-solidity@1.4.2(prettier@3.5.1): dependencies: '@solidity-parser/parser': 0.19.0 - prettier: 3.5.0 + prettier: 3.5.1 semver: 7.7.1 prettier@2.8.8: {} - prettier@3.5.0: {} + prettier@3.5.1: {} proper-lockfile@4.1.2: dependencies: @@ -6336,14 +5363,9 @@ snapshots: proto-list@1.2.4: {} - pump@3.0.0: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 + punycode@2.3.1: {} - punycode@2.1.1: {} - - pure-rand@5.0.3: {} + pure-rand@5.0.5: {} quick-lru@5.1.1: {} @@ -6351,7 +5373,7 @@ snapshots: dependencies: safe-buffer: 5.2.1 - raw-body@2.5.1: + raw-body@2.5.2: dependencies: bytes: 3.1.2 http-errors: 2.0.0 @@ -6372,7 +5394,7 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 - readable-stream@3.6.0: + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 @@ -6386,24 +5408,9 @@ snapshots: regenerator-runtime@0.14.1: {} - regexp.prototype.flags@1.5.1: - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - set-function-name: 2.0.1 - optional: true - - regexp.prototype.flags@1.5.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.1 - optional: true - - registry-auth-token@5.0.2: + registry-auth-token@5.1.0: dependencies: - '@pnpm/npm-conf': 2.2.2 + '@pnpm/npm-conf': 2.3.1 registry-url@6.0.1: dependencies: @@ -6423,9 +5430,9 @@ snapshots: dependencies: path-parse: 1.0.7 - responselike@2.0.1: + responselike@3.0.0: dependencies: - lowercase-keys: 2.0.0 + lowercase-keys: 3.0.0 retry@0.12.0: optional: true @@ -6455,55 +5462,25 @@ snapshots: rustbn-wasm@0.2.0: dependencies: - '@scure/base': 1.1.1 - - safe-array-concat@1.0.1: - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - has-symbols: 1.0.3 - isarray: 2.0.5 - optional: true - - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - optional: true + '@scure/base': 1.2.4 safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} - safe-regex-test@1.0.0: - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-regex: 1.1.4 - optional: true - - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - optional: true - safer-buffer@2.1.2: {} scrypt-js@3.0.1: {} - secp256k1@4.0.3: + secp256k1@4.0.4: dependencies: - elliptic: 6.5.4 - node-addon-api: 2.0.2 - node-gyp-build: 4.5.0 + elliptic: 6.6.1 + node-addon-api: 5.1.0 + node-gyp-build: 4.8.4 - semver@5.7.1: {} + semver@5.7.2: {} - semver@6.3.0: {} + semver@6.3.1: {} semver@7.7.1: {} @@ -6512,35 +5489,10 @@ snapshots: no-case: 2.3.2 upper-case-first: 1.1.2 - serialize-javascript@6.0.0: + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - set-function-length@1.1.1: - dependencies: - define-data-property: 1.1.1 - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.0 - optional: true - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - optional: true - - set-function-name@2.0.1: - dependencies: - define-data-property: 1.1.1 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.0 - optional: true - setimmediate@1.0.5: {} setprototypeof@1.2.0: {} @@ -6564,13 +5516,6 @@ snapshots: shebang-regex@3.0.0: {} - side-channel@1.0.4: - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - object-inspect: 1.13.1 - optional: true - signal-exit@3.0.7: optional: true @@ -6594,33 +5539,33 @@ snapshots: dependencies: command-exists: 1.2.9 commander: 3.0.2 - follow-redirects: 1.15.6(debug@4.4.0) + follow-redirects: 1.15.9(debug@4.4.0) fs-extra: 0.30.0 js-sha3: 0.8.0 memorystream: 0.3.1 require-from-string: 2.0.2 - semver: 5.7.1 + semver: 5.7.2 tmp: 0.0.33 transitivePeerDependencies: - debug - solhint-plugin-prettier@0.1.0(prettier-plugin-solidity@1.4.2(prettier@3.5.0))(prettier@3.5.0): + solhint-plugin-prettier@0.1.0(prettier-plugin-solidity@1.4.2(prettier@3.5.1))(prettier@3.5.1): dependencies: - '@prettier/sync': 0.3.0(prettier@3.5.0) - prettier: 3.5.0 + '@prettier/sync': 0.3.0(prettier@3.5.1) + prettier: 3.5.1 prettier-linter-helpers: 1.0.0 - prettier-plugin-solidity: 1.4.2(prettier@3.5.0) + prettier-plugin-solidity: 1.4.2(prettier@3.5.1) - solhint@5.0.5: + solhint@5.0.5(typescript@5.7.3): dependencies: '@solidity-parser/parser': 0.19.0 ajv: 6.12.6 - antlr4: 4.13.1-patch-1 + antlr4: 4.13.2 ast-parents: 0.0.1 chalk: 4.1.2 commander: 10.0.1 - cosmiconfig: 8.2.0 - fast-diff: 1.2.0 + cosmiconfig: 8.3.6(typescript@5.7.3) + fast-diff: 1.3.0 glob: 8.1.0 ignore: 5.3.1 js-yaml: 4.1.0 @@ -6629,14 +5574,14 @@ snapshots: pluralize: 8.0.0 semver: 7.7.1 strip-ansi: 6.0.1 - table: 6.8.1 + table: 6.9.0 text-table: 0.2.0 optionalDependencies: prettier: 2.8.8 + transitivePeerDependencies: + - typescript - solidity-ast@0.4.56: - dependencies: - array.prototype.findlast: 1.2.5 + solidity-ast@0.4.59: optional: true solidity-comments-darwin-arm64@0.0.2: @@ -6700,7 +5645,7 @@ snapshots: sprintf-js@1.0.3: {} - stacktrace-parser@0.1.10: + stacktrace-parser@0.1.11: dependencies: type-fest: 0.7.1 @@ -6714,49 +5659,6 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string.prototype.trim@1.2.8: - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - optional: true - - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - optional: true - - string.prototype.trimend@1.0.7: - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - optional: true - - string.prototype.trimend@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - optional: true - - string.prototype.trimstart@1.0.7: - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.3 - optional: true - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - optional: true - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -6792,10 +5694,10 @@ snapshots: lower-case: 1.1.4 upper-case: 1.1.3 - synckit@0.9.1: + synckit@0.9.2: dependencies: '@pkgr/core': 0.1.1 - tslib: 2.6.2 + tslib: 2.8.1 table-layout@1.0.2: dependencies: @@ -6804,9 +5706,9 @@ snapshots: typical: 5.2.0 wordwrapjs: 4.0.1 - table@6.8.1: + table@6.9.0: dependencies: - ajv: 8.11.0 + ajv: 8.17.1 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 @@ -6833,7 +5735,7 @@ snapshots: tr46@0.0.3: {} - ts-api-utils@1.3.0(typescript@5.7.3): + ts-api-utils@1.4.3(typescript@5.7.3): dependencies: typescript: 5.7.3 @@ -6848,16 +5750,16 @@ snapshots: dependencies: typescript: 5.7.3 - ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3): + ts-node@10.9.2(@types/node@20.17.19)(typescript@5.7.3): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 + '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 - '@types/node': 20.17.17 - acorn: 8.10.0 - acorn-walk: 8.2.0 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.17.19 + acorn: 8.14.0 + acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 @@ -6868,7 +5770,7 @@ snapshots: tslib@1.14.1: {} - tslib@2.6.2: {} + tslib@2.8.1: {} tsort@0.0.1: {} @@ -6880,8 +5782,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} - type-detect@4.1.0: {} type-fest@0.20.2: {} @@ -6892,8 +5792,8 @@ snapshots: typechain@8.3.2(typescript@5.7.3): dependencies: - '@types/prettier': 2.7.1 - debug: 4.4.0 + '@types/prettier': 2.7.3 + debug: 4.4.0(supports-color@8.1.1) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -6906,96 +5806,21 @@ snapshots: transitivePeerDependencies: - supports-color - typed-array-buffer@1.0.0: - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 - optional: true - - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - optional: true - - typed-array-byte-length@1.0.0: - dependencies: - call-bind: 1.0.5 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - optional: true - - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - optional: true - - typed-array-byte-offset@1.0.0: - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - optional: true - - typed-array-byte-offset@1.0.2: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - optional: true - - typed-array-length@1.0.4: - dependencies: - call-bind: 1.0.5 - for-each: 0.3.3 - is-typed-array: 1.1.12 - optional: true - - typed-array-length@1.0.6: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - optional: true - typescript@5.7.3: {} typical@4.0.0: {} typical@5.2.0: {} - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.5 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - optional: true - undici-types@6.19.8: {} - undici@5.28.4: + undici@5.28.5: dependencies: '@fastify/busboy': 2.1.1 universalify@0.1.2: {} - universalify@2.0.0: {} + universalify@2.0.1: {} unpipe@1.0.0: {} @@ -7007,7 +5832,7 @@ snapshots: uri-js@4.4.1: dependencies: - punycode: 2.1.1 + punycode: 2.3.1 utf8@3.0.0: {} @@ -7017,10 +5842,10 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - web3-utils@1.7.4: + web3-utils@1.10.0: dependencies: bn.js: 5.2.1 - ethereum-bloom-filters: 1.0.10 + ethereum-bloom-filters: 1.2.0 ethereumjs-util: 7.1.5 ethjs-unit: 0.1.6 number-to-bn: 1.7.0 @@ -7034,33 +5859,6 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.3 - optional: true - - which-typed-array@1.1.13: - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - optional: true - - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - optional: true - which@1.3.1: dependencies: isexe: 2.0.0 @@ -7073,12 +5871,14 @@ snapshots: dependencies: string-width: 4.2.3 + word-wrap@1.2.5: {} + wordwrapjs@4.0.1: dependencies: reduce-flatten: 2.0.0 typical: 5.2.0 - workerpool@6.2.1: {} + workerpool@6.5.1: {} wrap-ansi@7.0.0: dependencies: @@ -7090,13 +5890,13 @@ snapshots: ws@7.4.6: {} - ws@7.5.9: {} + ws@7.5.10: {} y18n@5.0.8: {} yaml@1.10.2: {} - yargs-parser@20.2.4: {} + yargs-parser@20.2.9: {} yargs-unparser@2.0.0: dependencies: @@ -7108,12 +5908,12 @@ snapshots: yargs@16.2.0: dependencies: cliui: 7.0.4 - escalade: 3.1.1 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 - yargs-parser: 20.2.4 + yargs-parser: 20.2.9 yn@3.1.1: {} From fa5d1b2b75a23c617ce307fbb08bff460ac22bb3 Mon Sep 17 00:00:00 2001 From: tt-cll <141346969+tt-cll@users.noreply.github.com> Date: Fri, 21 Feb 2025 15:44:38 -0500 Subject: [PATCH 29/58] solana upgrade changeset (#16427) * try upgrade in CI * update sha * make gomodtidy * try setting signer * fix params * set keypair to authority * deploy same artifact * revert gomod * return ixns * upgrade in place * fix build * lint * bump gomod * validate upgrades * lint * comments * gomod * fix merge * lint * lint * cr comments * lint * lint * lint * move upgrades to mcms * bump delay * wip * wip * mcms fix * log in CI * preload first * wip * wip * check bytes * lint * revert buffer * use program data size * add padding * lint * bubble mcms error * Revert "bubble mcms error" This reverts commit 334689d41b9f0f35bdd9e4a44b5d5f52e2049142. --- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 +- .../changeset/solana/cs_add_remote_chain.go | 7 +- .../ccip/changeset/solana/cs_billing.go | 14 +- .../ccip/changeset/solana/cs_build_solana.go | 39 +- .../ccip/changeset/solana/cs_deploy_chain.go | 726 +++++++++++++++--- .../changeset/solana/cs_deploy_chain_test.go | 199 ++++- ...ransfer_ccip_to_mcms_with_timelock_test.go | 8 +- deployment/ccip/changeset/solana/utils.go | 35 + deployment/ccip/changeset/solana_state.go | 77 +- .../changeset/testhelpers/test_environment.go | 8 +- .../changeset/testhelpers/test_helpers.go | 1 - .../internal/solana/access_controller.go | 2 +- .../common/changeset/internal/solana/mcm.go | 2 +- .../changeset/internal/solana/timelock.go | 2 +- deployment/common/changeset/test_helpers.go | 5 +- deployment/go.mod | 2 +- deployment/go.sum | 4 +- deployment/solana_chain.go | 35 +- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 +- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 +- 23 files changed, 995 insertions(+), 189 deletions(-) create mode 100644 deployment/ccip/changeset/solana/utils.go diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 1f2e0a7dd94..a82a435148a 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -350,7 +350,7 @@ require ( github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a // indirect - github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 // indirect + github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.3 // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect github.com/smartcontractkit/mcms v0.10.0 // indirect github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index f2f5275541e..6a06a01b3e7 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1112,8 +1112,8 @@ github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32 github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a h1:C+XavZQ0rBOpOrh45LUhdOsvtI8OQ0XZKI5pi+GP6h4= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a/go.mod h1:aFm1QC/n99mVeBDtv0SE0co56+IECY6Y1fR3OfNYy3c= -github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 h1:E7k5Sym9WnMOc4X40lLnQb6BMosxi8DfUBU9pBJjHOQ= -github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.3 h1:CeZqFz/si4YBnYE1118mtc4FBLs2Za1qohYAeLZTI+o= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.3/go.mod h1:9b5ugzYeKkwbxZ9yMOoxUaPiONDLC/QLCncarDFnhwk= github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 h1:W3doYLVoZN8VwJb/kAZsbDjW+6cgZPgNTcQHJUH9JrA= github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22/go.mod h1:70JLBXQncNHyW63ik4PvPQGjQGZ1xK67MKrDanVAk2w= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs= diff --git a/deployment/ccip/changeset/solana/cs_add_remote_chain.go b/deployment/ccip/changeset/solana/cs_add_remote_chain.go index 30c100f2f8b..6d84816ad22 100644 --- a/deployment/ccip/changeset/solana/cs_add_remote_chain.go +++ b/deployment/ccip/changeset/solana/cs_add_remote_chain.go @@ -220,10 +220,15 @@ func doAddRemoteChainToSolana( } } + addressLookupTable, err := cs.FetchOfframpLookupTable(e.GetContext(), chain, offRampID) + if err != nil { + return fmt.Errorf("failed to get offramp reference addresses: %w", err) + } + if err := solCommonUtil.ExtendLookupTable( e.GetContext(), chain.Client, - s.SolChains[chainSel].OfframpAddressLookupTable, + addressLookupTable, *chain.DeployerKey, lookUpTableEntries, ); err != nil { diff --git a/deployment/ccip/changeset/solana/cs_billing.go b/deployment/ccip/changeset/solana/cs_billing.go index c57e04b4bca..2c68bea9a02 100644 --- a/deployment/ccip/changeset/solana/cs_billing.go +++ b/deployment/ccip/changeset/solana/cs_billing.go @@ -97,10 +97,15 @@ func AddBillingToken(e deployment.Environment, cfg BillingTokenConfig) (deployme return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) } + addressLookupTable, err := cs.FetchOfframpLookupTable(e.GetContext(), chain, chainState.OffRamp) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get offramp reference addresses: %w", err) + } + if err := solCommonUtil.ExtendLookupTable( e.GetContext(), chain.Client, - chainState.OfframpAddressLookupTable, + addressLookupTable, *chain.DeployerKey, []solana.PublicKey{tokenBillingPDA}, ); err != nil { @@ -170,10 +175,15 @@ func AddBillingTokenForRemoteChain(e deployment.Environment, cfg BillingTokenFor return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) } + addressLookupTable, err := cs.FetchOfframpLookupTable(e.GetContext(), chain, chainState.OffRamp) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get offramp reference addresses: %w", err) + } + if err := solCommonUtil.ExtendLookupTable( e.GetContext(), chain.Client, - chainState.OfframpAddressLookupTable, + addressLookupTable, *chain.DeployerKey, []solana.PublicKey{remoteBillingPDA}, ); err != nil { diff --git a/deployment/ccip/changeset/solana/cs_build_solana.go b/deployment/ccip/changeset/solana/cs_build_solana.go index 82755f407a2..4430d511ae5 100644 --- a/deployment/ccip/changeset/solana/cs_build_solana.go +++ b/deployment/ccip/changeset/solana/cs_build_solana.go @@ -38,19 +38,32 @@ func runCommand(command string, args []string, workDir string) (string, error) { // Clone and checkout the specific revision of the repo func cloneRepo(e deployment.Environment, revision string) error { - // Remove the clone directory if it already exists - if _, err := os.Stat(cloneDir); !os.IsNotExist(err) { - os.RemoveAll(cloneDir) - } + // Check if the repository already exists + if _, err := os.Stat(filepath.Join(cloneDir, ".git")); err == nil { + e.Logger.Debugw("Repository already exists, discarding local changes and updating", "dir", cloneDir) - e.Logger.Debugw("Cloning repository", "url", repoURL, "revision", revision) - _, err := runCommand("git", []string{"clone", repoURL, cloneDir}, ".") - if err != nil { - return fmt.Errorf("failed to clone repository: %w", err) + // Discard any local changes + _, err := runCommand("git", []string{"reset", "--hard"}, cloneDir) + if err != nil { + return fmt.Errorf("failed to discard local changes: %w", err) + } + + // Fetch the latest changes from the remote + _, err = runCommand("git", []string{"fetch", "origin"}, cloneDir) + if err != nil { + return fmt.Errorf("failed to fetch origin: %w", err) + } + } else { + // Repository does not exist, clone it + e.Logger.Debugw("Cloning repository", "url", repoURL, "revision", revision) + _, err := runCommand("git", []string{"clone", repoURL, cloneDir}, ".") + if err != nil { + return fmt.Errorf("failed to clone repository: %w", err) + } } e.Logger.Debugw("Checking out revision", "revision", revision) - _, err = runCommand("git", []string{"checkout", revision}, cloneDir) + _, err := runCommand("git", []string{"checkout", revision}, cloneDir) if err != nil { return fmt.Errorf("failed to checkout revision %s: %w", revision, err) } @@ -93,7 +106,6 @@ type BuildSolanaConfig struct { ChainSelector uint64 GitCommitSha string DestinationDir string - IsUpgrade bool CleanDestinationDir bool CreateDestinationDir bool } @@ -116,11 +128,8 @@ func BuildSolanaChangeset(e deployment.Environment, config BuildSolanaConfig) (d return deployment.ChangesetOutput{}, fmt.Errorf("error cloning repo: %w", err) } - // Upgrades don't need to generate keys, we upgrade the program in place - if !config.IsUpgrade { - if err := replaceKeys(e); err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("error replacing keys: %w", err) - } + if err := replaceKeys(e); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error replacing keys: %w", err) } // Build the project with Anchor diff --git a/deployment/ccip/changeset/solana/cs_deploy_chain.go b/deployment/ccip/changeset/solana/cs_deploy_chain.go index c93d98ca248..78aa985ec5f 100644 --- a/deployment/ccip/changeset/solana/cs_deploy_chain.go +++ b/deployment/ccip/changeset/solana/cs_deploy_chain.go @@ -1,18 +1,28 @@ package solana import ( + "encoding/binary" + "errors" "fmt" + "math" + "math/big" + "github.com/Masterminds/semver/v3" "github.com/gagliardetto/solana-go" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" chainsel "github.com/smartcontractkit/chain-selectors" + "github.com/smartcontractkit/mcms" + "github.com/smartcontractkit/mcms/sdk" + mcmsSolana "github.com/smartcontractkit/mcms/sdk/solana" + mcmsTypes "github.com/smartcontractkit/mcms/types" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - state2 "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" + "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" solBinary "github.com/gagliardetto/binary" + "github.com/gagliardetto/solana-go/rpc" solRpc "github.com/gagliardetto/solana-go/rpc" solOffRamp "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" @@ -22,14 +32,54 @@ import ( solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" ) -var _ deployment.ChangeSet[v1_6.DeployChainContractsConfig] = DeployChainContractsChangesetSolana +const ( + RouterProgramName = "ccip_router" + OffRampProgramName = "ccip_offramp" + FeeQuoterProgramName = "fee_quoter" + TokenPoolProgramName = "test_token_pool" +) + +var _ deployment.ChangeSet[DeployChainContractsConfigSolana] = DeployChainContractsChangesetSolana + +type DeployChainContractsConfigSolana struct { + DeployChainContractsConfig v1_6.DeployChainContractsConfig + UpgradeConfig UpgradeConfigSolana + NewUpgradeAuthority *solana.PublicKey // if set, sets router and fee quoter upgrade authority +} -func DeployChainContractsChangesetSolana(e deployment.Environment, c v1_6.DeployChainContractsConfig) (deployment.ChangesetOutput, error) { +type UpgradeConfigSolana struct { + NewFeeQuoterVersion *semver.Version + NewRouterVersion *semver.Version + // Offramp is redeployed with the existing deployer key while the other programs are upgraded in place + NewOffRampVersion *semver.Version + // SpillAddress and UpgradeAuthority must be set + SpillAddress solana.PublicKey + UpgradeAuthority solana.PublicKey + MCMS *cs.MCMSConfig +} + +func (cfg UpgradeConfigSolana) Validate(e deployment.Environment, chainSelector uint64) error { + if cfg.NewFeeQuoterVersion == nil && cfg.NewRouterVersion == nil && cfg.NewOffRampVersion == nil { + return nil + } + if cfg.NewFeeQuoterVersion != nil || cfg.NewRouterVersion != nil { + if cfg.SpillAddress.IsZero() { + return errors.New("spill address must be set for fee quoter and router upgrades") + } + if cfg.UpgradeAuthority.IsZero() { + return errors.New("upgrade authority must be set for fee quoter and router upgrades") + } + } + return ValidateMCMSConfig(e, chainSelector, cfg.MCMS) +} + +func DeployChainContractsChangesetSolana(e deployment.Environment, config DeployChainContractsConfigSolana) (deployment.ChangesetOutput, error) { + c := config.DeployChainContractsConfig if err := c.Validate(); err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("invalid DeployChainContractsConfig: %w", err) } newAddresses := deployment.NewMemoryAddressBook() - existingState, err := state2.LoadOnchainState(e) + existingState, err := cs.LoadOnchainState(e) if err != nil { e.Logger.Errorw("Failed to load existing onchain state", "err", err) return deployment.ChangesetOutput{}, err @@ -40,6 +90,10 @@ func DeployChainContractsChangesetSolana(e deployment.Environment, c v1_6.Deploy return deployment.ChangesetOutput{}, err } + timelocks := map[uint64]string{} + proposers := map[uint64]string{} + inspectors := map[uint64]sdk.Inspector{} + var batches []mcmsTypes.BatchOperation for chainSel := range c.ContractParamsPerChain { if _, exists := existingState.SupportedChains()[chainSel]; !exists { return deployment.ChangesetOutput{}, fmt.Errorf("chain %d not supported", chainSel) @@ -53,15 +107,52 @@ func DeployChainContractsChangesetSolana(e deployment.Environment, c v1_6.Deploy if existingState.SolChains[chainSel].LinkToken.IsZero() { return deployment.ChangesetOutput{}, fmt.Errorf("fee tokens not found for chain %d", chainSel) } - err = deployChainContractsSolana(e, chain, newAddresses) + if err := config.UpgradeConfig.Validate(e, chainSel); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("invalid UpgradeConfig: %w", err) + } + addresses, _ := e.ExistingAddresses.AddressesForChain(chainSel) + mcmState, _ := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + + timelocks[chainSel] = mcmsSolana.ContractAddress( + mcmState.TimelockProgram, + mcmsSolana.PDASeed(mcmState.TimelockSeed), + ) + proposers[chainSel] = mcmsSolana.ContractAddress(mcmState.McmProgram, mcmsSolana.PDASeed(mcmState.ProposerMcmSeed)) + inspectors[chainSel] = mcmsSolana.NewInspector(chain.Client) + + mcmsTxs, err := deployChainContractsSolana(e, chain, newAddresses, config) if err != nil { e.Logger.Errorw("Failed to deploy CCIP contracts", "err", err, "newAddresses", newAddresses) return deployment.ChangesetOutput{}, err } + // create proposals for ixns + if len(mcmsTxs) > 0 { + batches = append(batches, mcmsTypes.BatchOperation{ + ChainSelector: mcmsTypes.ChainSelector(chainSel), + Transactions: mcmsTxs, + }) + } + } + + if config.UpgradeConfig.MCMS != nil { + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), + timelocks, + proposers, + inspectors, + batches, + "proposal to upgrade CCIP contracts", + config.UpgradeConfig.MCMS.MinDelay) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to build proposal: %w", err) + } + return deployment.ChangesetOutput{ + MCMSTimelockProposals: []mcms.TimelockProposal{*proposal}, + AddressBook: newAddresses, + }, nil } return deployment.ChangesetOutput{ - Proposals: []timelock.MCMSWithTimelockProposal{}, AddressBook: newAddresses, }, nil } @@ -88,6 +179,20 @@ func solProgramData(e deployment.Environment, chain deployment.SolChain, program return programData, nil } +func solProgramSize(e *deployment.Environment, chain deployment.SolChain, programID solana.PublicKey) (int, error) { + accountInfo, err := chain.Client.GetAccountInfoWithOpts(e.GetContext(), programID, &rpc.GetAccountInfoOpts{ + Commitment: deployment.SolDefaultCommitment, + }) + if err != nil { + return 0, fmt.Errorf("failed to get account info: %w", err) + } + if accountInfo == nil { + return 0, fmt.Errorf("program account not found: %w", err) + } + programBytes := len(accountInfo.Value.Data.GetBinary()) + return programBytes, nil +} + func initializeRouter( e deployment.Environment, chain deployment.SolChain, @@ -95,6 +200,7 @@ func initializeRouter( linkTokenAddress solana.PublicKey, feeQuoterAddress solana.PublicKey, ) error { + e.Logger.Debugw("Initializing router", "chain", chain.String(), "ccipRouterProgram", ccipRouterProgram.String()) programData, err := solProgramData(e, chain, ccipRouterProgram) if err != nil { return fmt.Errorf("failed to get solana router program data: %w", err) @@ -121,7 +227,7 @@ func initializeRouter( return fmt.Errorf("failed to build instruction: %w", err) } if err := chain.Confirm([]solana.Instruction{instruction}); err != nil { - return fmt.Errorf("failed to confirm instructions: %w", err) + return fmt.Errorf("failed to confirm initializeRouter: %w", err) } e.Logger.Infow("Initialized router", "chain", chain.String()) return nil @@ -135,6 +241,7 @@ func initializeFeeQuoter( feeQuoterAddress solana.PublicKey, offRampAddress solana.PublicKey, ) error { + e.Logger.Debugw("Initializing fee quoter", "chain", chain.String(), "feeQuoterAddress", feeQuoterAddress.String()) programData, err := solProgramData(e, chain, feeQuoterAddress) if err != nil { return fmt.Errorf("failed to get solana router program data: %w", err) @@ -167,13 +274,13 @@ func initializeFeeQuoter( return fmt.Errorf("failed to build instruction: %w", err) } if err := chain.Confirm([]solana.Instruction{instruction, priceUpdaterix}); err != nil { - return fmt.Errorf("failed to confirm instructions: %w", err) + return fmt.Errorf("failed to confirm initializeFeeQuoter: %w", err) } e.Logger.Infow("Initialized fee quoter", "chain", chain.String()) return nil } -func intializeOffRamp( +func initializeOffRamp( e deployment.Environment, chain deployment.SolChain, ccipRouterProgram solana.PublicKey, @@ -181,6 +288,7 @@ func intializeOffRamp( offRampAddress solana.PublicKey, addressLookupTable solana.PublicKey, ) error { + e.Logger.Debugw("Initializing offRamp", "chain", chain.String(), "offRampAddress", offRampAddress.String()) programData, err := solProgramData(e, chain, offRampAddress) if err != nil { return fmt.Errorf("failed to get solana router program data: %w", err) @@ -223,7 +331,7 @@ func intializeOffRamp( return fmt.Errorf("failed to build instruction: %w", err) } if err := chain.Confirm([]solana.Instruction{initIx, initConfigIx}); err != nil { - return fmt.Errorf("failed to confirm instructions: %w", err) + return fmt.Errorf("failed to confirm initializeOffRamp: %w", err) } e.Logger.Infow("Initialized offRamp", "chain", chain.String()) return nil @@ -233,64 +341,119 @@ func deployChainContractsSolana( e deployment.Environment, chain deployment.SolChain, ab deployment.AddressBook, -) error { - state, err := changeset.LoadOnchainStateSolana(e) + config DeployChainContractsConfigSolana, +) ([]mcmsTypes.Transaction, error) { + // we may need to gather instructions and submit them as part of MCMS + ixns := make([]mcmsTypes.Transaction, 0) + state, err := cs.LoadOnchainStateSolana(e) if err != nil { e.Logger.Errorw("Failed to load existing onchain state", "err", err) - return err + return ixns, err } chainState, chainExists := state.SolChains[chain.Selector] if !chainExists { - return fmt.Errorf("chain %s not found in existing state, deploy the link token first", chain.String()) + return ixns, fmt.Errorf("chain %s not found in existing state, deploy the link token first", chain.String()) } if chainState.LinkToken.IsZero() { - return fmt.Errorf("failed to get link token address for chain %s", chain.String()) + return ixns, fmt.Errorf("failed to get link token address for chain %s", chain.String()) } - // initialize this last with every address we need - var addressLookupTable solana.PublicKey - if chainState.OfframpAddressLookupTable.IsZero() { - addressLookupTable, err = solCommonUtil.SetupLookupTable( - e.GetContext(), - chain.Client, - *chain.DeployerKey, - []solana.PublicKey{ - // system - solana.SystemProgramID, - solana.ComputeBudget, - solana.SysVarInstructionsPubkey, - // token - solana.Token2022ProgramID, - solana.TokenProgramID, - solana.SPLAssociatedTokenAccountProgramID, - }) - + // FEE QUOTER DEPLOY + var feeQuoterAddress solana.PublicKey + //nolint:gocritic // this is a false positive, we need to check if the address is zero + if chainState.FeeQuoter.IsZero() { + feeQuoterAddress, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, FeeQuoterProgramName, deployment.Version1_0_0, false) if err != nil { - return fmt.Errorf("failed to create lookup table: %w", err) + return ixns, fmt.Errorf("failed to deploy program: %w", err) } - err = ab.Save(chain.Selector, addressLookupTable.String(), deployment.NewTypeAndVersion(changeset.OfframpAddressLookupTable, deployment.Version1_0_0)) + } else if config.UpgradeConfig.NewFeeQuoterVersion != nil { + // fee quoter updated in place + bufferProgram, err := DeployAndMaybeSaveToAddressBook(e, chain, ab, FeeQuoterProgramName, *config.UpgradeConfig.NewFeeQuoterVersion, true) if err != nil { - return fmt.Errorf("failed to save address: %w", err) + return ixns, fmt.Errorf("failed to deploy program: %w", err) } - } - - // FEE QUOTER DEPLOY - var feeQuoterAddress solana.PublicKey - if chainState.FeeQuoter.IsZero() { - // deploy fee quoter - programID, err := chain.DeployProgram(e.Logger, "fee_quoter") + if err := setUpgradeAuthority(&e, &chain, bufferProgram, chain.DeployerKey, config.UpgradeConfig.UpgradeAuthority.ToPointer(), true); err != nil { + return ixns, fmt.Errorf("failed to set upgrade authority: %w", err) + } + extendIxn, err := generateExtendIxn( + &e, + chain, + chainState.FeeQuoter, + bufferProgram, + config.UpgradeConfig.SpillAddress, + ) if err != nil { - return fmt.Errorf("failed to deploy program: %w", err) + return ixns, fmt.Errorf("failed to generate extend instruction: %w", err) } - - tv := deployment.NewTypeAndVersion(state2.FeeQuoter, deployment.Version1_0_0) - e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", programID, "chain", chain.String()) - - feeQuoterAddress = solana.MustPublicKeyFromBase58(programID) - err = ab.Save(chain.Selector, programID, tv) + upgradeIxn, err := generateUpgradeIxn( + &e, + chainState.FeeQuoter, + bufferProgram, + config.UpgradeConfig.SpillAddress, + config.UpgradeConfig.UpgradeAuthority, + ) if err != nil { - return fmt.Errorf("failed to save address: %w", err) + return ixns, fmt.Errorf("failed to generate upgrade instruction: %w", err) } + closeIxn, err := generateCloseBufferIxn( + &e, + bufferProgram, + config.UpgradeConfig.SpillAddress, + config.UpgradeConfig.UpgradeAuthority, + ) + if err != nil { + return ixns, fmt.Errorf("failed to generate close buffer instruction: %w", err) + } + feeQuoterAddress = chainState.FeeQuoter + upgradeData, err := upgradeIxn.Data() + if err != nil { + return ixns, fmt.Errorf("failed to extract upgrade data: %w", err) + } + upgradeTx, err := mcmsSolana.NewTransaction( + solana.BPFLoaderUpgradeableProgramID.String(), + upgradeData, + big.NewInt(0), // e.g. value + upgradeIxn.Accounts(), // pass along needed accounts + string(cs.FeeQuoter), // some string identifying the target + []string{}, // any relevant metadata + ) + if err != nil { + return ixns, fmt.Errorf("failed to create upgrade transaction: %w", err) + } + closeData, err := closeIxn.Data() + if err != nil { + return ixns, fmt.Errorf("failed to extract close data: %w", err) + } + closeTx, err := mcmsSolana.NewTransaction( + solana.BPFLoaderUpgradeableProgramID.String(), + closeData, + big.NewInt(0), // e.g. value + closeIxn.Accounts(), // pass along needed accounts + string(cs.FeeQuoter), // some string identifying the target + []string{}, // any relevant metadata + ) + if err != nil { + return ixns, fmt.Errorf("failed to create close transaction: %w", err) + } + if extendIxn != nil { + extendData, err := extendIxn.Data() + if err != nil { + return ixns, fmt.Errorf("failed to extract extend data: %w", err) + } + extendTx, err := mcmsSolana.NewTransaction( + solana.BPFLoaderUpgradeableProgramID.String(), + extendData, + big.NewInt(0), // e.g. value + extendIxn.Accounts(), // pass along needed accounts + string(cs.FeeQuoter), // some string identifying the target + []string{}, // any relevant metadata + ) + if err != nil { + return ixns, fmt.Errorf("failed to create extend transaction: %w", err) + } + ixns = append(ixns, extendTx) + } + ixns = append(ixns, upgradeTx, closeTx) } else { e.Logger.Infow("Using existing fee quoter", "addr", chainState.FeeQuoter.String()) feeQuoterAddress = chainState.FeeQuoter @@ -299,21 +462,101 @@ func deployChainContractsSolana( // ROUTER DEPLOY var ccipRouterProgram solana.PublicKey + //nolint:gocritic // this is a false positive, we need to check if the address is zero if chainState.Router.IsZero() { // deploy router - programID, err := chain.DeployProgram(e.Logger, "ccip_router") + ccipRouterProgram, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, RouterProgramName, deployment.Version1_0_0, false) if err != nil { - return fmt.Errorf("failed to deploy program: %w", err) + return ixns, fmt.Errorf("failed to deploy program: %w", err) } - - tv := deployment.NewTypeAndVersion(state2.Router, deployment.Version1_0_0) - e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", programID, "chain", chain.String()) - - ccipRouterProgram = solana.MustPublicKeyFromBase58(programID) - err = ab.Save(chain.Selector, programID, tv) + } else if config.UpgradeConfig.NewRouterVersion != nil { + // router updated in place + bufferProgram, err := DeployAndMaybeSaveToAddressBook(e, chain, ab, RouterProgramName, *config.UpgradeConfig.NewRouterVersion, true) + if err != nil { + return ixns, fmt.Errorf("failed to deploy program: %w", err) + } + if err := setUpgradeAuthority(&e, &chain, bufferProgram, chain.DeployerKey, config.UpgradeConfig.UpgradeAuthority.ToPointer(), true); err != nil { + return ixns, fmt.Errorf("failed to set upgrade authority: %w", err) + } + upgradeIxn, err := generateUpgradeIxn( + &e, + chainState.Router, + bufferProgram, + config.UpgradeConfig.SpillAddress, + config.UpgradeConfig.UpgradeAuthority, + ) if err != nil { - return fmt.Errorf("failed to save address: %w", err) + return ixns, fmt.Errorf("failed to generate upgrade instruction: %w", err) } + extendIxn, err := generateExtendIxn( + &e, + chain, + chainState.Router, + bufferProgram, + config.UpgradeConfig.SpillAddress, + ) + if err != nil { + return ixns, fmt.Errorf("failed to generate extend instruction: %w", err) + } + closeIxn, err := generateCloseBufferIxn( + &e, + bufferProgram, + config.UpgradeConfig.SpillAddress, + config.UpgradeConfig.UpgradeAuthority, + ) + if err != nil { + return ixns, fmt.Errorf("failed to generate close buffer instruction: %w", err) + } + ccipRouterProgram = chainState.Router + upgradeData, err := upgradeIxn.Data() + if err != nil { + return ixns, fmt.Errorf("failed to extract upgrade data: %w", err) + } + upgradeTx, err := mcmsSolana.NewTransaction( + solana.BPFLoaderUpgradeableProgramID.String(), + upgradeData, + big.NewInt(0), // e.g. value + upgradeIxn.Accounts(), // pass along needed accounts + string(cs.Router), // some string identifying the target + []string{}, // any relevant metadata + ) + if err != nil { + return ixns, fmt.Errorf("failed to create upgrade transaction: %w", err) + } + closeData, err := closeIxn.Data() + if err != nil { + return ixns, fmt.Errorf("failed to extract close data: %w", err) + } + closeTx, err := mcmsSolana.NewTransaction( + solana.BPFLoaderUpgradeableProgramID.String(), + closeData, + big.NewInt(0), // e.g. value + closeIxn.Accounts(), // pass along needed accounts + string(cs.Router), // some string identifying the target + []string{}, // any relevant metadata + ) + if err != nil { + return ixns, fmt.Errorf("failed to create close transaction: %w", err) + } + if extendIxn != nil { + extendData, err := extendIxn.Data() + if err != nil { + return ixns, fmt.Errorf("failed to extract extend data: %w", err) + } + extendTx, err := mcmsSolana.NewTransaction( + solana.BPFLoaderUpgradeableProgramID.String(), + extendData, + big.NewInt(0), // e.g. value + extendIxn.Accounts(), // pass along needed accounts + string(cs.Router), // some string identifying the target + []string{}, // any relevant metadata + ) + if err != nil { + return ixns, fmt.Errorf("failed to create extend transaction: %w", err) + } + ixns = append(ixns, extendTx) + } + ixns = append(ixns, upgradeTx, closeTx) } else { e.Logger.Infow("Using existing router", "addr", chainState.Router.String()) ccipRouterProgram = chainState.Router @@ -322,19 +565,63 @@ func deployChainContractsSolana( // OFFRAMP DEPLOY var offRampAddress solana.PublicKey + // gather lookup table keys from other deploys + lookupTableKeys := make([]solana.PublicKey, 0) + needFQinLookupTable := false + needRouterinLookupTable := false + needTokenPoolinLookupTable := false + //nolint:gocritic // this is a false positive, we need to check if the address is zero if chainState.OffRamp.IsZero() { // deploy offramp - programID, err := chain.DeployProgram(e.Logger, "ccip_offramp") + offRampAddress, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, OffRampProgramName, deployment.Version1_0_0, false) if err != nil { - return fmt.Errorf("failed to deploy program: %w", err) + return ixns, fmt.Errorf("failed to deploy program: %w", err) } - tv := deployment.NewTypeAndVersion(state2.OffRamp, deployment.Version1_0_0) - e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", programID, "chain", chain.String()) - offRampAddress = solana.MustPublicKeyFromBase58(programID) - err = ab.Save(chain.Selector, programID, tv) + } else if config.UpgradeConfig.NewOffRampVersion != nil { + tv := deployment.NewTypeAndVersion(cs.OffRamp, *config.UpgradeConfig.NewOffRampVersion) + existingAddresses, err := e.ExistingAddresses.AddressesForChain(chain.Selector) + if err != nil { + return ixns, fmt.Errorf("failed to get existing addresses: %w", err) + } + offRampAddress = cs.FindSolanaAddress(tv, existingAddresses) + if offRampAddress.IsZero() { + // deploy offramp, not upgraded in place so upgrade is false + offRampAddress, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, OffRampProgramName, *config.UpgradeConfig.NewOffRampVersion, false) + if err != nil { + return ixns, fmt.Errorf("failed to deploy program: %w", err) + } + } + + offRampBillingSignerPDA, _, _ := solState.FindOfframpBillingSignerPDA(offRampAddress) + fqAllowedPriceUpdaterOfframpPDA, _, _ := solState.FindFqAllowedPriceUpdaterPDA(offRampBillingSignerPDA, feeQuoterAddress) + feeQuoterConfigPDA, _, _ := solState.FindFqConfigPDA(feeQuoterAddress) + + priceUpdaterix, err := solFeeQuoter.NewAddPriceUpdaterInstruction( + offRampBillingSignerPDA, + fqAllowedPriceUpdaterOfframpPDA, + feeQuoterConfigPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + ).ValidateAndBuild() + if err != nil { + return ixns, fmt.Errorf("failed to build instruction: %w", err) + } + priceUpdaterData, err := priceUpdaterix.Data() if err != nil { - return fmt.Errorf("failed to save address: %w", err) + return ixns, fmt.Errorf("failed to extract price updater data: %w", err) } + priceUpdaterTx, err := mcmsSolana.NewTransaction( + feeQuoterAddress.String(), + priceUpdaterData, + big.NewInt(0), // e.g. value + priceUpdaterix.Accounts(), // pass along needed accounts + string(cs.OffRamp), // some string identifying the target + []string{}, // any relevant metadata + ) + if err != nil { + return ixns, fmt.Errorf("failed to create price updater transaction: %w", err) + } + ixns = append(ixns, priceUpdaterTx) } else { e.Logger.Infow("Using existing offramp", "addr", chainState.OffRamp.String()) offRampAddress = chainState.OffRamp @@ -347,7 +634,7 @@ func deployChainContractsSolana( err = chain.GetAccountDataBorshInto(e.GetContext(), feeQuoterConfigPDA, &fqConfig) if err != nil { if err2 := initializeFeeQuoter(e, chain, ccipRouterProgram, chainState.LinkToken, feeQuoterAddress, offRampAddress); err2 != nil { - return err2 + return ixns, err2 } } else { e.Logger.Infow("Fee quoter already initialized, skipping initialization", "chain", chain.String()) @@ -360,7 +647,7 @@ func deployChainContractsSolana( err = chain.GetAccountDataBorshInto(e.GetContext(), routerConfigPDA, &routerConfigAccount) if err != nil { if err2 := initializeRouter(e, chain, ccipRouterProgram, chainState.LinkToken, feeQuoterAddress); err2 != nil { - return err2 + return ixns, err2 } } else { e.Logger.Infow("Router already initialized, skipping initialization", "chain", chain.String()) @@ -371,9 +658,40 @@ func deployChainContractsSolana( offRampConfigPDA, _, _ := solState.FindOfframpConfigPDA(offRampAddress) err = chain.GetAccountDataBorshInto(e.GetContext(), offRampConfigPDA, &offRampConfigAccount) if err != nil { - if err2 := intializeOffRamp(e, chain, ccipRouterProgram, feeQuoterAddress, offRampAddress, addressLookupTable); err2 != nil { - return err2 + table, err2 := solCommonUtil.SetupLookupTable( + e.GetContext(), + chain.Client, + *chain.DeployerKey, + []solana.PublicKey{ + // system + solana.SystemProgramID, + solana.ComputeBudget, + solana.SysVarInstructionsPubkey, + // token + solana.Token2022ProgramID, + solana.TokenProgramID, + solana.SPLAssociatedTokenAccountProgramID, + }) + if err2 != nil { + return ixns, fmt.Errorf("failed to create address lookup table: %w", err) + } + if err2 := initializeOffRamp(e, chain, ccipRouterProgram, feeQuoterAddress, offRampAddress, table); err2 != nil { + return ixns, err2 } + // Initializing a new offramp means we need a new lookup table and need to fully populate it + needFQinLookupTable = true + needRouterinLookupTable = true + needTokenPoolinLookupTable = true + offRampConfigPDA, _, _ := solState.FindOfframpConfigPDA(offRampAddress) + offRampReferenceAddressesPDA, _, _ := solState.FindOfframpReferenceAddressesPDA(offRampAddress) + offRampBillingSignerPDA, _, _ := solState.FindOfframpBillingSignerPDA(offRampAddress) + lookupTableKeys = append(lookupTableKeys, []solana.PublicKey{ + // offramp + offRampAddress, + offRampConfigPDA, + offRampReferenceAddressesPDA, + offRampBillingSignerPDA, + }...) } else { e.Logger.Infow("Offramp already initialized, skipping initialization", "chain", chain.String()) } @@ -383,62 +701,258 @@ func deployChainContractsSolana( if chainState.TokenPool.IsZero() { // TODO: there should be two token pools deployed one of each type (lock/burn) // separate token pools are not ready yet - programID, err := chain.DeployProgram(e.Logger, "test_token_pool") - if err != nil { - return fmt.Errorf("failed to deploy program: %w", err) - } - tv := deployment.NewTypeAndVersion(changeset.TokenPool, deployment.Version1_0_0) - e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", programID, "chain", chain.String()) - tokenPoolProgram = solana.MustPublicKeyFromBase58(programID) - err = ab.Save(chain.Selector, programID, tv) + tokenPoolProgram, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, TokenPoolProgramName, deployment.Version1_0_0, false) if err != nil { - return fmt.Errorf("failed to save address: %w", err) + return ixns, fmt.Errorf("failed to deploy program: %w", err) } + needTokenPoolinLookupTable = true } else { e.Logger.Infow("Using existing token pool", "addr", chainState.TokenPool.String()) tokenPoolProgram = chainState.TokenPool } - externalExecutionConfigPDA, _, _ := solState.FindExternalExecutionConfigPDA(ccipRouterProgram) - externalTokenPoolsSignerPDA, _, _ := solState.FindExternalTokenPoolsSignerPDA(ccipRouterProgram) - feeBillingSignerPDA, _, _ := solState.FindFeeBillingSignerPDA(ccipRouterProgram) - linkFqBillingConfigPDA, _, _ := solState.FindFqBillingTokenConfigPDA(chainState.LinkToken, feeQuoterAddress) - offRampReferenceAddressesPDA, _, _ := solState.FindOfframpReferenceAddressesPDA(offRampAddress) - offRampBillingSignerPDA, _, _ := solState.FindOfframpBillingSignerPDA(offRampAddress) + if needFQinLookupTable { + linkFqBillingConfigPDA, _, _ := solState.FindFqBillingTokenConfigPDA(chainState.LinkToken, feeQuoterAddress) + feeQuoterConfigPDA, _, _ := solState.FindFqConfigPDA(feeQuoterAddress) + lookupTableKeys = append(lookupTableKeys, []solana.PublicKey{ + // fee quoter + feeQuoterConfigPDA, + feeQuoterAddress, + linkFqBillingConfigPDA, + }...) + } - if err := solCommonUtil.ExtendLookupTable(e.GetContext(), chain.Client, addressLookupTable, *chain.DeployerKey, - []solana.PublicKey{ - // token pools - tokenPoolProgram, - // offramp - offRampAddress, - offRampConfigPDA, - offRampReferenceAddressesPDA, - offRampBillingSignerPDA, + if needRouterinLookupTable { + externalExecutionConfigPDA, _, _ := solState.FindExternalExecutionConfigPDA(ccipRouterProgram) + externalTokenPoolsSignerPDA, _, _ := solState.FindExternalTokenPoolsSignerPDA(ccipRouterProgram) + routerConfigPDA, _, _ := solState.FindConfigPDA(ccipRouterProgram) + feeBillingSignerPDA, _, _ := solState.FindFeeBillingSignerPDA(ccipRouterProgram) + lookupTableKeys = append(lookupTableKeys, []solana.PublicKey{ // router ccipRouterProgram, routerConfigPDA, externalExecutionConfigPDA, externalTokenPoolsSignerPDA, - // fee quoter feeBillingSignerPDA, - feeQuoterConfigPDA, - feeQuoterAddress, - linkFqBillingConfigPDA, - }); err != nil { - return fmt.Errorf("failed to extend lookup table: %w", err) + }...) + } + + if needTokenPoolinLookupTable { + lookupTableKeys = append(lookupTableKeys, []solana.PublicKey{ + // token pools + tokenPoolProgram, + }...) + } + + if len(lookupTableKeys) > 0 { + addressLookupTable, err := cs.FetchOfframpLookupTable(e.GetContext(), chain, offRampAddress) + if err != nil { + return ixns, fmt.Errorf("failed to get offramp reference addresses: %w", err) + } + e.Logger.Debugw("Populating lookup table", "lookupTable", addressLookupTable.String(), "keys", lookupTableKeys) + if err := solCommonUtil.ExtendLookupTable(e.GetContext(), chain.Client, addressLookupTable, *chain.DeployerKey, lookupTableKeys); err != nil { + return ixns, fmt.Errorf("failed to extend lookup table: %w", err) + } } + // set upgrade authority + if config.NewUpgradeAuthority != nil { + e.Logger.Infow("Setting upgrade authority", "newUpgradeAuthority", config.NewUpgradeAuthority.String()) + for _, programID := range []solana.PublicKey{ccipRouterProgram, feeQuoterAddress} { + if err := setUpgradeAuthority(&e, &chain, programID, chain.DeployerKey, config.NewUpgradeAuthority, false); err != nil { + return ixns, fmt.Errorf("failed to set upgrade authority: %w", err) + } + } + } + + return ixns, nil +} + +// DeployAndMaybeSaveToAddressBook deploys a program to the Solana chain and saves it to the address book +// if it is not an upgrade. It returns the program ID of the deployed program. +func DeployAndMaybeSaveToAddressBook( + e deployment.Environment, + chain deployment.SolChain, + ab deployment.AddressBook, + programName string, + version semver.Version, + isUpgrade bool) (solana.PublicKey, error) { + programID, err := chain.DeployProgram(e.Logger, programName, isUpgrade) + if err != nil { + return solana.PublicKey{}, fmt.Errorf("failed to deploy program: %w", err) + } + address := solana.MustPublicKeyFromBase58(programID) + + programNameToType := map[string]deployment.ContractType{ + RouterProgramName: cs.Router, + OffRampProgramName: cs.OffRamp, + FeeQuoterProgramName: cs.FeeQuoter, + TokenPoolProgramName: cs.TokenPool, + } + programType, ok := programNameToType[programName] + if !ok { + return solana.PublicKey{}, fmt.Errorf("unknown program name: %s", programName) + } + e.Logger.Infow("Deployed program", "Program", programType, "addr", programID, "chain", chain.String(), "isUpgrade", isUpgrade) + + if !isUpgrade { + tv := deployment.NewTypeAndVersion(programType, version) + err = ab.Save(chain.Selector, programID, tv) + if err != nil { + return solana.PublicKey{}, fmt.Errorf("failed to save address: %w", err) + } + } + return address, nil +} + +// setUpgradeAuthority creates a transaction to set the upgrade authority for a program +func setUpgradeAuthority( + e *deployment.Environment, + chain *deployment.SolChain, + programID solana.PublicKey, + currentUpgradeAuthority *solana.PrivateKey, + newUpgradeAuthority *solana.PublicKey, + isBuffer bool, +) error { + // Buffers use the program account as the program data account + programDataSlice := solana.NewAccountMeta(programID, true, false) + if !isBuffer { + // Actual program accounts use the program data account + programDataAddress, _, _ := solana.FindProgramAddress([][]byte{programID.Bytes()}, solana.BPFLoaderUpgradeableProgramID) + programDataSlice = solana.NewAccountMeta(programDataAddress, true, false) + } + + keys := solana.AccountMetaSlice{ + programDataSlice, // Program account (writable) + solana.NewAccountMeta(currentUpgradeAuthority.PublicKey(), false, true), // Current upgrade authority (signer) + solana.NewAccountMeta(*newUpgradeAuthority, false, false), // New upgrade authority + } + + instruction := solana.NewInstruction( + solana.BPFLoaderUpgradeableProgramID, + keys, + // https://github.com/solana-playground/solana-playground/blob/2998d4cf381aa319d26477c5d4e6d15059670a75/vscode/src/commands/deploy/bpf-upgradeable/bpf-upgradeable.ts#L72 + []byte{4, 0, 0, 0}, // 4-byte SetAuthority instruction identifier + ) + + if err := chain.Confirm([]solana.Instruction{instruction}, solCommonUtil.AddSigners(*currentUpgradeAuthority)); err != nil { + return fmt.Errorf("failed to confirm setUpgradeAuthority: %w", err) + } + e.Logger.Infow("Set upgrade authority", "programID", programID.String(), "newUpgradeAuthority", newUpgradeAuthority.String()) + return nil } +func generateUpgradeIxn( + e *deployment.Environment, + programID solana.PublicKey, + bufferAddress solana.PublicKey, + spillAddress solana.PublicKey, + upgradeAuthority solana.PublicKey, +) (solana.Instruction, error) { + // Derive the program data address + programDataAccount, _, _ := solana.FindProgramAddress([][]byte{programID.Bytes()}, solana.BPFLoaderUpgradeableProgramID) + + // Accounts involved in the transaction + keys := solana.AccountMetaSlice{ + solana.NewAccountMeta(programDataAccount, true, false), // Program account (writable) + solana.NewAccountMeta(programID, true, false), + solana.NewAccountMeta(bufferAddress, true, false), // Buffer account (writable) + solana.NewAccountMeta(spillAddress, true, false), // Spill account (writable) + solana.NewAccountMeta(solana.SysVarRentPubkey, false, false), // System program + solana.NewAccountMeta(solana.SysVarClockPubkey, false, false), // System program + solana.NewAccountMeta(upgradeAuthority, false, false), // Current upgrade authority (signer) + } + + instruction := solana.NewInstruction( + solana.BPFLoaderUpgradeableProgramID, + keys, + // https://github.com/solana-playground/solana-playground/blob/2998d4cf381aa319d26477c5d4e6d15059670a75/vscode/src/commands/deploy/bpf-upgradeable/bpf-upgradeable.ts#L66 + []byte{3, 0, 0, 0}, // 4-byte Upgrade instruction identifier + ) + + return instruction, nil +} + +func generateExtendIxn( + e *deployment.Environment, + chain deployment.SolChain, + programID solana.PublicKey, + bufferAddress solana.PublicKey, + payer solana.PublicKey, +) (*solana.GenericInstruction, error) { + // Derive the program data address + programDataAccount, _, _ := solana.FindProgramAddress([][]byte{programID.Bytes()}, solana.BPFLoaderUpgradeableProgramID) + + programDataSize, err := solProgramSize(e, chain, programDataAccount) + if err != nil { + return nil, fmt.Errorf("failed to get program size: %w", err) + } + e.Logger.Debugw("Program data size", "programDataSize", programDataSize) + + bufferSize, err := solProgramSize(e, chain, bufferAddress) + if err != nil { + return nil, fmt.Errorf("failed to get buffer size: %w", err) + } + e.Logger.Debugw("Buffer account size", "bufferSize", bufferSize) + if bufferSize <= programDataSize { + e.Logger.Debugf("Buffer account size %d is less than program account size %d", bufferSize, programDataSize) + return nil, nil + } + extraBytes := bufferSize - programDataSize + if extraBytes > math.MaxUint32 { + return nil, fmt.Errorf("extra bytes %d exceeds maximum value %d", extraBytes, math.MaxUint32) + } + //https://github.com/solana-labs/solana/blob/7700cb3128c1f19820de67b81aa45d18f73d2ac0/sdk/program/src/loader_upgradeable_instruction.rs#L146 + data := binary.LittleEndian.AppendUint32([]byte{}, 6) // 4-byte Extend instruction identifier + //nolint:gosec // G115 we check for overflow above + data = binary.LittleEndian.AppendUint32(data, uint32(extraBytes+1024)) // add some padding + + keys := solana.AccountMetaSlice{ + solana.NewAccountMeta(programDataAccount, true, false), // Program data account (writable) + solana.NewAccountMeta(programID, true, false), // Program account (writable) + solana.NewAccountMeta(solana.SystemProgramID, false, false), // System program + solana.NewAccountMeta(payer, true, false), // Payer for rent + } + + ixn := solana.NewInstruction( + solana.BPFLoaderUpgradeableProgramID, + keys, + data, + ) + + return ixn, nil +} + +func generateCloseBufferIxn( + e *deployment.Environment, + bufferAddress solana.PublicKey, + recipient solana.PublicKey, + upgradeAuthority solana.PublicKey, +) (solana.Instruction, error) { + keys := solana.AccountMetaSlice{ + solana.NewAccountMeta(bufferAddress, true, false), + solana.NewAccountMeta(recipient, true, false), + solana.NewAccountMeta(upgradeAuthority, false, false), + } + + instruction := solana.NewInstruction( + solana.BPFLoaderUpgradeableProgramID, + keys, + // https://github.com/solana-playground/solana-playground/blob/2998d4cf381aa319d26477c5d4e6d15059670a75/vscode/src/commands/deploy/bpf-upgradeable/bpf-upgradeable.ts#L78 + []byte{5, 0, 0, 0}, // 4-byte Close instruction identifier + ) + + return instruction, nil +} + type SetFeeAggregatorConfig struct { ChainSelector uint64 FeeAggregator string } func (cfg SetFeeAggregatorConfig) Validate(e deployment.Environment) error { - state, err := state2.LoadOnchainState(e) + state, err := cs.LoadOnchainState(e) if err != nil { return fmt.Errorf("failed to load onchain state: %w", err) } @@ -469,7 +983,7 @@ func SetFeeAggregator(e deployment.Environment, cfg SetFeeAggregatorConfig) (dep return deployment.ChangesetOutput{}, err } - state, _ := state2.LoadOnchainState(e) + state, _ := cs.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] chain := e.SolChains[cfg.ChainSelector] @@ -491,7 +1005,7 @@ func SetFeeAggregator(e deployment.Environment, cfg SetFeeAggregatorConfig) (dep return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) } newAddresses := deployment.NewMemoryAddressBook() - err = newAddresses.Save(cfg.ChainSelector, cfg.FeeAggregator, deployment.NewTypeAndVersion(changeset.FeeAggregator, deployment.Version1_0_0)) + err = newAddresses.Save(cfg.ChainSelector, cfg.FeeAggregator, deployment.NewTypeAndVersion(cs.FeeAggregator, deployment.Version1_0_0)) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to save address: %w", err) } diff --git a/deployment/ccip/changeset/solana/cs_deploy_chain_test.go b/deployment/ccip/changeset/solana/cs_deploy_chain_test.go index f9068a64653..a516bc2914f 100644 --- a/deployment/ccip/changeset/solana/cs_deploy_chain_test.go +++ b/deployment/ccip/changeset/solana/cs_deploy_chain_test.go @@ -1,15 +1,21 @@ package solana_test import ( + "math/big" + "os" "testing" + "time" - "github.com/gagliardetto/solana-go" "github.com/stretchr/testify/require" "go.uber.org/zap/zapcore" + "github.com/gagliardetto/solana-go" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" cs_solana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" + solanachangesets "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" @@ -17,6 +23,7 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/logger" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" + commonState "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" ) @@ -52,8 +59,11 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { feeAggregatorPrivKey, _ := solana.NewRandomPrivateKey() feeAggregatorPubKey := feeAggregatorPrivKey.PublicKey() + ci := os.Getenv("CI") == "true" + if ci { + testhelpers.SavePreloadedSolAddresses(t, e, solChainSelectors[0]) + } - testhelpers.SavePreloadedSolAddresses(t, e, solChainSelectors[0]) e, err = commonchangeset.Apply(t, e, nil, commonchangeset.Configure( deployment.CreateLegacyChangeSet(v1_6.DeployHomeChainChangeset), @@ -94,8 +104,46 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(cs_solana.DeployChainContractsChangesetSolana), - v1_6.DeployChainContractsConfig{ + deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelockV2), + map[uint64]commontypes.MCMSWithTimelockConfigV2{ + solChainSelectors[0]: { + Canceller: proposalutils.SingleGroupMCMSV2(t), + Proposer: proposalutils.SingleGroupMCMSV2(t), + Bypasser: proposalutils.SingleGroupMCMSV2(t), + TimelockMinDelay: big.NewInt(0), + }, + }, + ), + ) + addresses, err := e.ExistingAddresses.AddressesForChain(solChainSelectors[0]) + require.NoError(t, err) + mcmState, err := commonState.MaybeLoadMCMSWithTimelockChainStateSolana(e.SolChains[solChainSelectors[0]], addresses) + require.NoError(t, err) + + // Fund signer PDAs for timelock and mcm + // If we don't fund, execute() calls will fail with "no funds" errors. + timelockSignerPDA := commonState.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + mcmSignerPDA := commonState.GetMCMSignerPDA(mcmState.McmProgram, mcmState.ProposerMcmSeed) + memory.FundSolanaAccounts(e.GetContext(), t, []solana.PublicKey{timelockSignerPDA, mcmSignerPDA}, + 100, e.SolChains[solChainSelectors[0]].Client) + t.Logf("funded timelock signer PDA: %s", timelockSignerPDA.String()) + t.Logf("funded mcm signer PDA: %s", mcmSignerPDA.String()) + upgradeAuthority := timelockSignerPDA + + // we can't upgrade in place locally so we have to change where we build + buildCs := commonchangeset.Configure( + deployment.CreateLegacyChangeSet(cs_solana.BuildSolanaChangeset), + cs_solana.BuildSolanaConfig{ + ChainSelector: solChainSelectors[0], + GitCommitSha: "0863d8fed5fbada9f352f33c405e1753cbb7d72c", + DestinationDir: e.SolChains[solChainSelectors[0]].ProgramsPath, + CleanDestinationDir: true, + }, + ) + deployCs := commonchangeset.Configure( + deployment.CreateLegacyChangeSet(cs_solana.DeployChainContractsChangesetSolana), + cs_solana.DeployChainContractsConfigSolana{ + DeployChainContractsConfig: v1_6.DeployChainContractsConfig{ HomeChainSelector: homeChainSel, ContractParamsPerChain: map[uint64]v1_6.ChainContractParams{ solChainSelectors[0]: { @@ -104,15 +152,144 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { }, }, }, - ), - commonchangeset.Configure( - deployment.CreateLegacyChangeSet(cs_solana.SetFeeAggregator), - cs_solana.SetFeeAggregatorConfig{ - ChainSelector: solChainSelectors[0], - FeeAggregator: feeAggregatorPubKey.String(), + }, + ) + // set the fee aggregator address + feeAggregatorCs := commonchangeset.Configure( + deployment.CreateLegacyChangeSet(cs_solana.SetFeeAggregator), + cs_solana.SetFeeAggregatorConfig{ + ChainSelector: solChainSelectors[0], + FeeAggregator: feeAggregatorPubKey.String(), + }, + ) + transferOwnershipCs := commonchangeset.Configure( + deployment.CreateLegacyChangeSet(solanachangesets.TransferCCIPToMCMSWithTimelockSolana), + solanachangesets.TransferCCIPToMCMSWithTimelockSolanaConfig{ + MinDelay: 1 * time.Second, + ContractsByChain: map[uint64]solanachangesets.CCIPContractsToTransfer{ + solChainSelectors[0]: { + Router: true, + FeeQuoter: true, + OffRamp: true, + }, }, - ), + }, + ) + // make sure idempotency works and setting the upgrade authority + upgradeAuthorityCs := commonchangeset.Configure( + deployment.CreateLegacyChangeSet(cs_solana.DeployChainContractsChangesetSolana), + cs_solana.DeployChainContractsConfigSolana{ + DeployChainContractsConfig: v1_6.DeployChainContractsConfig{ + HomeChainSelector: homeChainSel, + ContractParamsPerChain: map[uint64]v1_6.ChainContractParams{ + solChainSelectors[0]: { + FeeQuoterParams: v1_6.DefaultFeeQuoterParams(), + OffRampParams: v1_6.DefaultOffRampParams(), + }, + }, + }, + NewUpgradeAuthority: &upgradeAuthority, + }, + ) + upgradeCs := commonchangeset.Configure( + deployment.CreateLegacyChangeSet(cs_solana.DeployChainContractsChangesetSolana), + cs_solana.DeployChainContractsConfigSolana{ + DeployChainContractsConfig: v1_6.DeployChainContractsConfig{ + HomeChainSelector: homeChainSel, + ContractParamsPerChain: map[uint64]v1_6.ChainContractParams{ + solChainSelectors[0]: { + FeeQuoterParams: v1_6.DefaultFeeQuoterParams(), + OffRampParams: v1_6.DefaultOffRampParams(), + }, + }, + }, + UpgradeConfig: cs_solana.UpgradeConfigSolana{ + NewFeeQuoterVersion: &deployment.Version1_1_0, + NewRouterVersion: &deployment.Version1_1_0, + UpgradeAuthority: upgradeAuthority, + SpillAddress: upgradeAuthority, + MCMS: &cs.MCMSConfig{ + MinDelay: 1 * time.Second, + }, + }, + }, ) + // because we cannot upgrade in place locally, we can't redeploy offramp + offRampCs := commonchangeset.Configure( + deployment.CreateLegacyChangeSet(cs_solana.DeployChainContractsChangesetSolana), + cs_solana.DeployChainContractsConfigSolana{ + DeployChainContractsConfig: v1_6.DeployChainContractsConfig{ + HomeChainSelector: homeChainSel, + ContractParamsPerChain: map[uint64]v1_6.ChainContractParams{ + solChainSelectors[0]: { + FeeQuoterParams: v1_6.DefaultFeeQuoterParams(), + OffRampParams: v1_6.DefaultOffRampParams(), + }, + }, + }, + UpgradeConfig: cs_solana.UpgradeConfigSolana{ + NewOffRampVersion: &deployment.Version1_1_0, + }, + }, + ) + if ci { + e, err = commonchangeset.ApplyChangesetsV2(t, e, []commonchangeset.ConfiguredChangeSet{ + deployCs, + feeAggregatorCs, + upgradeAuthorityCs, + transferOwnershipCs, + }) + require.NoError(t, err) + state, err := changeset.LoadOnchainStateSolana(e) + require.NoError(t, err) + oldOffRampAddress := state.SolChains[solChainSelectors[0]].OffRamp + // add a second offramp address + e, err = commonchangeset.ApplyChangesetsV2(t, e, []commonchangeset.ConfiguredChangeSet{ + buildCs, + upgradeCs, + offRampCs, + }) + require.NoError(t, err) + // verify the offramp address is different + state, err = changeset.LoadOnchainStateSolana(e) + require.NoError(t, err) + newOffRampAddress := state.SolChains[solChainSelectors[0]].OffRamp + require.NotEqual(t, oldOffRampAddress, newOffRampAddress) + } else { + e, err = commonchangeset.ApplyChangesetsV2(t, e, []commonchangeset.ConfiguredChangeSet{ + buildCs, + deployCs, + feeAggregatorCs, + upgradeAuthorityCs, + upgradeCs, + }) + } + require.NoError(t, err) + // Verify router and fee quoter upgraded in place + // and offramp had 2nd address added + addresses, err = e.ExistingAddresses.AddressesForChain(solChainSelectors[0]) + require.NoError(t, err) + numRouters := 0 + numFeeQuoters := 0 + numOffRamps := 0 + for _, address := range addresses { + if address.Type == changeset.Router { + numRouters++ + } + if address.Type == changeset.FeeQuoter { + numFeeQuoters++ + } + if address.Type == changeset.OffRamp { + numOffRamps++ + } + } + require.Equal(t, 1, numRouters) + require.Equal(t, 1, numFeeQuoters) + if ci { + require.Equal(t, 2, numOffRamps) + } else { + require.Equal(t, 1, numOffRamps) + } require.NoError(t, err) // solana verification testhelpers.ValidateSolanaState(t, e, solChainSelectors) diff --git a/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock_test.go b/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock_test.go index 3b17643bbad..7afa768b196 100644 --- a/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock_test.go +++ b/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock_test.go @@ -246,9 +246,11 @@ func prepareEnvironmentForOwnershipTransfer(t *testing.T) (deployment.Environmen ), commonchangeset.Configure( deployment.CreateLegacyChangeSet(solanachangesets.DeployChainContractsChangesetSolana), - v1_6.DeployChainContractsConfig{ - HomeChainSelector: homeChainSel, - ContractParamsPerChain: contractParams, + solanachangesets.DeployChainContractsConfigSolana{ + DeployChainContractsConfig: v1_6.DeployChainContractsConfig{ + HomeChainSelector: homeChainSel, + ContractParamsPerChain: contractParams, + }, }, ), commonchangeset.Configure( diff --git a/deployment/ccip/changeset/solana/utils.go b/deployment/ccip/changeset/solana/utils.go new file mode 100644 index 00000000000..ac571187a2d --- /dev/null +++ b/deployment/ccip/changeset/solana/utils.go @@ -0,0 +1,35 @@ +package solana + +import ( + "fmt" + + mcmsSolana "github.com/smartcontractkit/mcms/sdk/solana" + + "github.com/smartcontractkit/chainlink/deployment" + cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/common/types" +) + +func ValidateMCMSConfig(e deployment.Environment, chainSelector uint64, mcms *cs.MCMSConfig) error { + if mcms != nil { + // If there is no timelock and mcms proposer on the chain, the transfer will fail. + timelockID, err := deployment.SearchAddressBook(e.ExistingAddresses, chainSelector, types.RBACTimelock) + if err != nil { + return fmt.Errorf("timelock not present on the chain %w", err) + } + proposerID, err := deployment.SearchAddressBook(e.ExistingAddresses, chainSelector, types.ProposerManyChainMultisig) + if err != nil { + return fmt.Errorf("mcms proposer not present on the chain %w", err) + } + // Make sure addresses are correctly parsed. Format is: "programID.PDASeed" + _, _, err = mcmsSolana.ParseContractAddress(timelockID) + if err != nil { + return fmt.Errorf("failed to parse timelock address: %w", err) + } + _, _, err = mcmsSolana.ParseContractAddress(proposerID) + if err != nil { + return fmt.Errorf("failed to parse proposer address: %w", err) + } + } + return nil +} diff --git a/deployment/ccip/changeset/solana_state.go b/deployment/ccip/changeset/solana_state.go index a3c1ee6ab3a..eb585d219e6 100644 --- a/deployment/ccip/changeset/solana_state.go +++ b/deployment/ccip/changeset/solana_state.go @@ -1,25 +1,29 @@ package changeset import ( + "context" "errors" + "fmt" "strconv" + "github.com/Masterminds/semver/v3" "github.com/gagliardetto/solana-go" "github.com/rs/zerolog/log" solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" + solOffRamp "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" + "github.com/smartcontractkit/chainlink/deployment" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" ) var ( - OfframpAddressLookupTable deployment.ContractType = "OfframpAddressLookupTable" - TokenPool deployment.ContractType = "TokenPool" - Receiver deployment.ContractType = "Receiver" - SPL2022Tokens deployment.ContractType = "SPL2022Tokens" - WSOL deployment.ContractType = "WSOL" - FeeAggregator deployment.ContractType = "FeeAggregator" + TokenPool deployment.ContractType = "TokenPool" + Receiver deployment.ContractType = "Receiver" + SPL2022Tokens deployment.ContractType = "SPL2022Tokens" + WSOL deployment.ContractType = "WSOL" + FeeAggregator deployment.ContractType = "FeeAggregator" // for PDAs from AddRemoteChainToSolana RemoteSource deployment.ContractType = "RemoteSource" RemoteDest deployment.ContractType = "RemoteDest" @@ -31,17 +35,15 @@ var ( // SolCCIPChainState holds public keys for all the currently deployed CCIP programs // on a chain. If a key has zero value, it means the program does not exist on the chain. type SolCCIPChainState struct { - LinkToken solana.PublicKey - Router solana.PublicKey - OfframpAddressLookupTable solana.PublicKey - Receiver solana.PublicKey // for tests only - SPL2022Tokens []solana.PublicKey - TokenPool solana.PublicKey - WSOL solana.PublicKey - FeeQuoter solana.PublicKey - OffRamp solana.PublicKey - FeeAggregator solana.PublicKey - + LinkToken solana.PublicKey + Router solana.PublicKey + Receiver solana.PublicKey // for tests only + SPL2022Tokens []solana.PublicKey + TokenPool solana.PublicKey + WSOL solana.PublicKey + FeeQuoter solana.PublicKey + OffRamp solana.PublicKey + FeeAggregator solana.PublicKey // PDAs to avoid redundant lookups RouterConfigPDA solana.PublicKey SourceChainStatePDAs map[uint64]solana.PublicKey // deprecated @@ -52,6 +54,16 @@ type SolCCIPChainState struct { OffRampStatePDA solana.PublicKey } +func FetchOfframpLookupTable(ctx context.Context, chain deployment.SolChain, offRampAddress solana.PublicKey) (solana.PublicKey, error) { + var referenceAddressesAccount solOffRamp.ReferenceAddresses + offRampReferenceAddressesPDA, _, _ := solState.FindOfframpReferenceAddressesPDA(offRampAddress) + err := chain.GetAccountDataBorshInto(ctx, offRampReferenceAddressesPDA, &referenceAddressesAccount) + if err != nil { + return solana.PublicKey{}, fmt.Errorf("failed to get offramp reference addresses: %w", err) + } + return referenceAddressesAccount.OfframpLookupTable, nil +} + func LoadOnchainStateSolana(e deployment.Environment) (CCIPOnChainState, error) { state := CCIPOnChainState{ SolChains: make(map[uint64]SolCCIPChainState), @@ -82,6 +94,9 @@ func LoadChainStateSolana(chain deployment.SolChain, addresses map[string]deploy SPL2022Tokens: make([]solana.PublicKey, 0), TokenPoolLookupTable: make(map[solana.PublicKey]solana.PublicKey), } + // Most programs upgraded in place, but some are not so we always want to + // load the latest version + versions := make(map[deployment.ContractType]semver.Version) for address, tvStr := range addresses { switch tvStr.Type { case commontypes.LinkToken: @@ -95,9 +110,6 @@ func LoadChainStateSolana(chain deployment.SolChain, addresses map[string]deploy return state, err } state.RouterConfigPDA = routerConfigPDA - case OfframpAddressLookupTable: - pub := solana.MustPublicKeyFromBase58(address) - state.OfframpAddressLookupTable = pub case Receiver: pub := solana.MustPublicKeyFromBase58(address) state.Receiver = pub @@ -143,6 +155,15 @@ func LoadChainStateSolana(chain deployment.SolChain, addresses map[string]deploy } state.FeeQuoterConfigPDA = feeQuoterConfigPDA case OffRamp: + offRampVersion, ok := versions[OffRamp] + // if we have an offramp version, we need to make sure it's a newer version + if ok { + // if the version is not newer, skip this address + if offRampVersion.GreaterThan(&tvStr.Version) { + log.Debug().Str("address", address).Str("type", string(tvStr.Type)).Msg("Skipping offramp address, already loaded newer version") + continue + } + } pub := solana.MustPublicKeyFromBase58(address) state.OffRamp = pub offRampConfigPDA, _, err := solState.FindOfframpConfigPDA(state.OffRamp) @@ -162,11 +183,27 @@ func LoadChainStateSolana(chain deployment.SolChain, addresses map[string]deploy log.Warn().Str("address", address).Str("type", string(tvStr.Type)).Msg("Unknown address type") continue } + existingVersion, ok := versions[tvStr.Type] + // This shouldn't happen, so we want to log it + if ok { + log.Warn().Str("existingVersion", existingVersion.String()).Str("type", string(tvStr.Type)).Msg("Duplicate address type found") + } + versions[tvStr.Type] = tvStr.Version } state.WSOL = solana.SolMint return state, nil } +func FindSolanaAddress(tv deployment.TypeAndVersion, addresses map[string]deployment.TypeAndVersion) solana.PublicKey { + for address, tvStr := range addresses { + if tv.String() == tvStr.String() { + pub := solana.MustPublicKeyFromBase58(address) + return pub + } + } + return solana.PublicKey{} +} + func (c SolCCIPChainState) OnRampBytes() ([]byte, error) { if !c.Router.IsZero() { return c.Router.Bytes(), nil diff --git a/deployment/ccip/changeset/testhelpers/test_environment.go b/deployment/ccip/changeset/testhelpers/test_environment.go index 5779cbecf5a..520bacde3e6 100644 --- a/deployment/ccip/changeset/testhelpers/test_environment.go +++ b/deployment/ccip/changeset/testhelpers/test_environment.go @@ -577,9 +577,11 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn ), commonchangeset.Configure( deployment.CreateLegacyChangeSet(solana.DeployChainContractsChangesetSolana), - v1_6.DeployChainContractsConfig{ - HomeChainSelector: e.HomeChainSel, - ContractParamsPerChain: solContractParams, + solana.DeployChainContractsConfigSolana{ + DeployChainContractsConfig: v1_6.DeployChainContractsConfig{ + HomeChainSelector: e.HomeChainSel, + ContractParamsPerChain: solContractParams, + }, }, ), }...) diff --git a/deployment/ccip/changeset/testhelpers/test_helpers.go b/deployment/ccip/changeset/testhelpers/test_helpers.go index 608789485a0..f6e2b4fb53a 100644 --- a/deployment/ccip/changeset/testhelpers/test_helpers.go +++ b/deployment/ccip/changeset/testhelpers/test_helpers.go @@ -1567,7 +1567,6 @@ func ValidateSolanaState(t *testing.T, e deployment.Environment, solChainSelecto require.False(t, chainState.OffRamp.IsZero(), "OffRamp address is zero for chain %d", sel) require.False(t, chainState.FeeQuoter.IsZero(), "FeeQuoter address is zero for chain %d", sel) require.False(t, chainState.LinkToken.IsZero(), "Link token address is zero for chain %d", sel) - require.False(t, chainState.OfframpAddressLookupTable.IsZero(), "Offramp address lookup table is zero for chain %d", sel) // Get router config var routerConfigAccount solRouter.Config diff --git a/deployment/common/changeset/internal/solana/access_controller.go b/deployment/common/changeset/internal/solana/access_controller.go index 390da5bba51..52ddaa5d99b 100644 --- a/deployment/common/changeset/internal/solana/access_controller.go +++ b/deployment/common/changeset/internal/solana/access_controller.go @@ -31,7 +31,7 @@ func deployAccessControllerProgram( } if programID.IsZero() { - deployedProgramID, err := chain.DeployProgram(e.Logger, "access_controller") + deployedProgramID, err := chain.DeployProgram(e.Logger, "access_controller", false) if err != nil { return fmt.Errorf("failed to deploy access controller program: %w", err) } diff --git a/deployment/common/changeset/internal/solana/mcm.go b/deployment/common/changeset/internal/solana/mcm.go index 7c9bf58bf24..a3193a71446 100644 --- a/deployment/common/changeset/internal/solana/mcm.go +++ b/deployment/common/changeset/internal/solana/mcm.go @@ -31,7 +31,7 @@ func deployMCMProgram( } if programID.IsZero() { - deployedProgramID, err := chain.DeployProgram(log, "mcm") + deployedProgramID, err := chain.DeployProgram(log, "mcm", false) if err != nil { return fmt.Errorf("failed to deploy mcm program: %w", err) } diff --git a/deployment/common/changeset/internal/solana/timelock.go b/deployment/common/changeset/internal/solana/timelock.go index 3eaded54ebb..58d35923470 100644 --- a/deployment/common/changeset/internal/solana/timelock.go +++ b/deployment/common/changeset/internal/solana/timelock.go @@ -29,7 +29,7 @@ func deployTimelockProgram( } if programID.IsZero() { - deployedProgramID, err := chain.DeployProgram(log, "timelock") + deployedProgramID, err := chain.DeployProgram(log, "timelock", false) if err != nil { return fmt.Errorf("failed to deploy timelock program: %w", err) } diff --git a/deployment/common/changeset/test_helpers.go b/deployment/common/changeset/test_helpers.go index 298fc786fe2..4b21803b069 100644 --- a/deployment/common/changeset/test_helpers.go +++ b/deployment/common/changeset/test_helpers.go @@ -179,7 +179,10 @@ func ApplyChangesetsV2(t *testing.T, e deployment.Environment, changesetApplicat } p := proposalutils.SignMCMSProposal(t, e, &prop) - proposalutils.ExecuteMCMSProposalV2(t, e, p) + err = proposalutils.ExecuteMCMSProposalV2(t, e, p) + if err != nil { + return deployment.Environment{}, err + } } } currentEnv = deployment.Environment{ diff --git a/deployment/go.mod b/deployment/go.mod index 0d72033e49c..1e0f662ff55 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -37,7 +37,7 @@ require ( github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a - github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 + github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.3 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 github.com/smartcontractkit/mcms v0.10.0 diff --git a/deployment/go.sum b/deployment/go.sum index e8571db66f3..5524af3ebc2 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1160,8 +1160,8 @@ github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32 github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a h1:C+XavZQ0rBOpOrh45LUhdOsvtI8OQ0XZKI5pi+GP6h4= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a/go.mod h1:aFm1QC/n99mVeBDtv0SE0co56+IECY6Y1fR3OfNYy3c= -github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 h1:E7k5Sym9WnMOc4X40lLnQb6BMosxi8DfUBU9pBJjHOQ= -github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.3 h1:CeZqFz/si4YBnYE1118mtc4FBLs2Za1qohYAeLZTI+o= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.3/go.mod h1:9b5ugzYeKkwbxZ9yMOoxUaPiONDLC/QLCncarDFnhwk= github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 h1:W3doYLVoZN8VwJb/kAZsbDjW+6cgZPgNTcQHJUH9JrA= github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22/go.mod h1:70JLBXQncNHyW63ik4PvPQGjQGZ1xK67MKrDanVAk2w= github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 h1:Yf+n3T/fnUWcYyfe7bsygV4sWAkNo0QhN58APJFIKIc= diff --git a/deployment/solana_chain.go b/deployment/solana_chain.go index 07e034617be..bdf9f42b4c4 100644 --- a/deployment/solana_chain.go +++ b/deployment/solana_chain.go @@ -25,14 +25,19 @@ import ( ) var ( - SolDefaultCommitment = rpc.CommitmentConfirmed SolDefaultGasLimit = solBinary.Uint128{Lo: 3000, Hi: 0, Endianness: nil} SolDefaultMaxFeeJuelsPerMsg = solBinary.Uint128{Lo: 300000000, Hi: 0, Endianness: nil} - SPL2022Tokens = "SPL2022Tokens" - SPLTokens = "SPLTokens" EnableExecutionAfter = int64(globals.PermissionLessExecutionThreshold.Seconds()) ) +const ( + ProgramIDPrefix = "Program Id: " + BufferIDPrefix = "Buffer: " + SolDefaultCommitment = rpc.CommitmentConfirmed + SPL2022Tokens = "SPL2022Tokens" + SPLTokens = "SPLTokens" +) + // SolChain represents a Solana chain. type SolChain struct { // Selectors used as canonical chain identifier. @@ -71,24 +76,33 @@ func (c SolChain) Name() string { return chainInfo.ChainName } -func (c SolChain) DeployProgram(logger logger.Logger, programName string) (string, error) { +func (c SolChain) DeployProgram(logger logger.Logger, programName string, isUpgrade bool) (string, error) { programFile := filepath.Join(c.ProgramsPath, programName+".so") if _, err := os.Stat(programFile); err != nil { return "", fmt.Errorf("program file not found: %w", err) } programKeyPair := filepath.Join(c.ProgramsPath, programName+"-keypair.json") + cliCommand := "deploy" + prefix := ProgramIDPrefix + if isUpgrade { + cliCommand = "write-buffer" + prefix = BufferIDPrefix + } + // Base command with required args baseArgs := []string{ - "program", "deploy", + "program", cliCommand, programFile, // .so file - "--keypair", c.KeypairPath, // program keypair + "--keypair", c.KeypairPath, // deployer keypair "--url", c.URL, // rpc url } var cmd *exec.Cmd - if _, err := os.Stat(programKeyPair); err == nil { - // Keypair exists, include program-id + // We need to specify the program ID on the initial deploy but not on upgrades + // Upgrades happen in place so we don't need to supply the keypair + // It will write the .so file to a buffer and then deploy it to the existing keypair + if !isUpgrade { logger.Infow("Deploying program with existing keypair", "programFile", programFile, "programKeyPair", programKeyPair) @@ -115,7 +129,7 @@ func (c SolChain) DeployProgram(logger logger.Logger, programName string) (strin // TODO: obviously need to do this better time.Sleep(5 * time.Second) - return parseProgramID(output) + return parseProgramID(output, prefix) } func (c SolChain) GetAccountDataBorshInto(ctx context.Context, pubkey solana.PublicKey, accountState interface{}) error { @@ -127,10 +141,9 @@ func (c SolChain) GetAccountDataBorshInto(ctx context.Context, pubkey solana.Pub } // parseProgramID parses the program ID from the deploy output. -func parseProgramID(output string) (string, error) { +func parseProgramID(output string, prefix string) (string, error) { // Look for the program ID in the CLI output // Example output: "Program Id: " - const prefix = "Program Id: " startIdx := strings.Index(output, prefix) if startIdx == -1 { return "", errors.New("failed to find program ID in output") diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 899a705d0e7..c0b4f401ba1 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -437,7 +437,7 @@ require ( github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a // indirect - github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0 // indirect + github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.3 // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect github.com/smartcontractkit/mcms v0.10.0 // indirect github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index f45367d862b..7ef48b47531 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1410,8 +1410,8 @@ github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32 github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a h1:C+XavZQ0rBOpOrh45LUhdOsvtI8OQ0XZKI5pi+GP6h4= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a/go.mod h1:aFm1QC/n99mVeBDtv0SE0co56+IECY6Y1fR3OfNYy3c= -github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0 h1:ywpcisqGbSqW2t+BwiBNLFlIuEHBFeJfXRmaB/2/wYI= -github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.3 h1:CeZqFz/si4YBnYE1118mtc4FBLs2Za1qohYAeLZTI+o= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.3/go.mod h1:9b5ugzYeKkwbxZ9yMOoxUaPiONDLC/QLCncarDFnhwk= 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.51.0 h1:z7t2OhfE32KK4r5Nt3U0hOnbRwOwIbJs8i7kqKvjAA0= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 052043bfe7f..61f8b6e7465 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -428,7 +428,7 @@ require ( github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a // indirect - github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0 // indirect + github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.3 // indirect github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 // indirect github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 67c6aae0077..a482b75366b 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1395,8 +1395,8 @@ github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32 github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a h1:C+XavZQ0rBOpOrh45LUhdOsvtI8OQ0XZKI5pi+GP6h4= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a/go.mod h1:aFm1QC/n99mVeBDtv0SE0co56+IECY6Y1fR3OfNYy3c= -github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0 h1:ywpcisqGbSqW2t+BwiBNLFlIuEHBFeJfXRmaB/2/wYI= -github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.3 h1:CeZqFz/si4YBnYE1118mtc4FBLs2Za1qohYAeLZTI+o= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.3/go.mod h1:9b5ugzYeKkwbxZ9yMOoxUaPiONDLC/QLCncarDFnhwk= 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.51.0 h1:z7t2OhfE32KK4r5Nt3U0hOnbRwOwIbJs8i7kqKvjAA0= From 4675d7fdcd3f75bd0168b7c16a0af72aa00d49ba Mon Sep 17 00:00:00 2001 From: Anindita Ghosh <88458927+AnieeG@users.noreply.github.com> Date: Fri, 21 Feb 2025 12:46:07 -0800 Subject: [PATCH 30/58] Fix add and remove don (#16523) * remove don fix * fixes * fix lint --- .../changeset/internal/deploy_home_chain.go | 2 + .../ccip/changeset/v1_6/cs_ccip_home.go | 12 +-- .../ccip/changeset/v1_6/cs_home_chain_test.go | 77 +++++++++++++++++++ 3 files changed, 85 insertions(+), 6 deletions(-) diff --git a/deployment/ccip/changeset/internal/deploy_home_chain.go b/deployment/ccip/changeset/internal/deploy_home_chain.go index e7266e65543..ed693c9c693 100644 --- a/deployment/ccip/changeset/internal/deploy_home_chain.go +++ b/deployment/ccip/changeset/internal/deploy_home_chain.go @@ -77,6 +77,8 @@ func getNodeOperatorIDMap(capReg *capabilities_registry.CapabilitiesRegistry, ma return nopIdByName, nil } +// LatestCCIPDON returns the latest CCIP DON from the capabilities registry +// Keeping this function for reference func LatestCCIPDON(registry *capabilities_registry.CapabilitiesRegistry) (*capabilities_registry.CapabilitiesRegistryDONInfo, error) { dons, err := registry.GetDONs(nil) if err != nil { diff --git a/deployment/ccip/changeset/v1_6/cs_ccip_home.go b/deployment/ccip/changeset/v1_6/cs_ccip_home.go index bec314b4518..3ed6017f243 100644 --- a/deployment/ccip/changeset/v1_6/cs_ccip_home.go +++ b/deployment/ccip/changeset/v1_6/cs_ccip_home.go @@ -649,18 +649,18 @@ func AddDonAndSetCandidateChangeset( return deployment.ChangesetOutput{}, err } - latestDon, err := internal.LatestCCIPDON(state.Chains[cfg.HomeChainSelector].CapabilityRegistry) - if err != nil { - return deployment.ChangesetOutput{}, err - } - pluginOCR3Config, ok := newDONArgs[cfg.PluginInfo.PluginType] if !ok { return deployment.ChangesetOutput{}, fmt.Errorf("missing plugin %s in ocr3Configs", cfg.PluginInfo.PluginType.String()) } - expectedDonID := latestDon.Id + 1 + expectedDonID, err := state.Chains[cfg.HomeChainSelector].CapabilityRegistry.GetNextDONId(&bind.CallOpts{ + Context: e.GetContext(), + }) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("get next don id: %w", err) + } addDonOp, err := newDonWithCandidateOp( txOpts, e.Chains[cfg.HomeChainSelector], diff --git a/deployment/ccip/changeset/v1_6/cs_home_chain_test.go b/deployment/ccip/changeset/v1_6/cs_home_chain_test.go index 77cfd8c8d2d..cbcccb52d86 100644 --- a/deployment/ccip/changeset/v1_6/cs_home_chain_test.go +++ b/deployment/ccip/changeset/v1_6/cs_home_chain_test.go @@ -7,6 +7,8 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/zap/zapcore" + "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" @@ -15,6 +17,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/common/view/v1_0" "github.com/smartcontractkit/chainlink/deployment/environment/memory" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" "github.com/smartcontractkit/chainlink/v2/core/logger" ) @@ -196,3 +199,77 @@ func TestRemoveDons(t *testing.T) { require.NoError(t, err) require.Len(t, donsAfter, len(donsBefore)-1) } + +func TestAddDonAfterRemoveDons(t *testing.T) { + e, _ := testhelpers.NewMemoryEnvironment(t) + s, err := changeset.LoadOnchainState(e.Env) + require.NoError(t, err) + allChains := e.Env.AllChainSelectors() + homeChain := s.Chains[e.HomeChainSel] + ocrConfigs := make(map[uint64]v1_6.CCIPOCRParams) + ocrParams := v1_6.DeriveCCIPOCRParams( + v1_6.WithDefaultCommitOffChainConfig(e.FeedChainSel, nil), + v1_6.WithDefaultExecuteOffChainConfig(nil), + ) + // Remove a don + donsBefore, err := homeChain.CapabilityRegistry.GetDONs(nil) + require.NoError(t, err) + e.Env, err = commoncs.Apply(t, e.Env, nil, + commoncs.Configure( + deployment.CreateLegacyChangeSet(v1_6.RemoveDONs), + v1_6.RemoveDONsConfig{ + HomeChainSel: e.HomeChainSel, + DonIDs: []uint32{donsBefore[len(donsBefore)-1].Id}, + }, + ), + ) + require.NoError(t, err) + donsAfter, err := homeChain.CapabilityRegistry.GetDONs(nil) + require.NoError(t, err) + require.Len(t, donsAfter, len(donsBefore)-1) + + encoded, err := utils.ABIEncode(`[{"type": "string"}, {"type": "string"}]`, "ccip", "v1.0.0") + require.NoError(t, err) + capabilityID := utils.Keccak256Fixed(encoded) + ccipHome := s.Chains[e.HomeChainSel].CCIPHome + donRemovedForChain := uint64(0) + for _, chain := range allChains { + chainFound := false + for _, don := range donsAfter { + if len(don.CapabilityConfigurations) == 1 && + don.CapabilityConfigurations[0].CapabilityId == capabilityID { + configs, err := ccipHome.GetAllConfigs(nil, don.Id, uint8(types.PluginTypeCCIPCommit)) + require.NoError(t, err) + if configs.ActiveConfig.ConfigDigest == [32]byte{} && configs.CandidateConfig.ConfigDigest == [32]byte{} { + configs, err = ccipHome.GetAllConfigs(nil, don.Id, uint8(types.PluginTypeCCIPExec)) + require.NoError(t, err) + } + if configs.ActiveConfig.Config.ChainSelector == chain || configs.CandidateConfig.Config.ChainSelector == chain { + chainFound = true + } + } + } + if !chainFound { + donRemovedForChain = chain + break + } + } + ocrConfigs[donRemovedForChain] = ocrParams + // try to add the another don + e.Env, err = commoncs.Apply(t, e.Env, nil, + commoncs.Configure( + deployment.CreateLegacyChangeSet(v1_6.AddDonAndSetCandidateChangeset), + v1_6.AddDonAndSetCandidateChangesetConfig{ + SetCandidateConfigBase: v1_6.SetCandidateConfigBase{ + HomeChainSelector: e.HomeChainSel, + FeedChainSelector: e.FeedChainSel, + }, + PluginInfo: v1_6.SetCandidatePluginInfo{ + OCRConfigPerRemoteChainSelector: ocrConfigs, + PluginType: types.PluginTypeCCIPCommit, + }, + }, + ), + ) + require.NoError(t, err) +} From e0069e207d22a3eb87377924afd62bcff4f9fda7 Mon Sep 17 00:00:00 2001 From: Erik Burton Date: Fri, 21 Feb 2025 15:11:40 -0800 Subject: [PATCH 31/58] chore: downgrade flakeguard runners (#16525) --- .github/workflows/flakeguard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/flakeguard.yml b/.github/workflows/flakeguard.yml index b1d8f559f8b..b9ac18e63c1 100644 --- a/.github/workflows/flakeguard.yml +++ b/.github/workflows/flakeguard.yml @@ -74,7 +74,7 @@ env: RUN_CUSTOM_TEST_PACKAGES: ${{ fromJSON(inputs.extraArgs)['run_custom_test_packages'] || '' }} # Comma-separated custom test packages to run. SHUFFLE_SEED: ${{ fromJSON(inputs.extraArgs)['shuffle_seed'] || '999' }} # The seed to use when -shuffle flag is enabled. Requires RUN_WITH_SHUFFLE to be true. ALL_TESTS_RUNNER: ${{ fromJSON(inputs.extraArgs)['all_tests_runner'] || 'ubuntu22.04-32cores-128GB' }} # The runner to use for running all tests. - DEFAULT_RUNNER: ${{ fromJSON(inputs.extraArgs)['default_tests_runner'] || 'ubuntu-latest-8cores-32GB' }} # The runner to use for running custom tests (e.g. in PRs). + DEFAULT_RUNNER: ${{ fromJSON(inputs.extraArgs)['default_tests_runner'] || 'ubuntu-latest' }} # The runner to use for running custom tests (e.g. in PRs). UPLOAD_ALL_TEST_RESULTS: ${{ fromJSON(inputs.extraArgs)['upload_all_test_results'] || 'false' }} # Whether to upload all test results as artifacts. OMIT_TEST_OUTPUTS_ON_SUCCESS: ${{ fromJSON(inputs.extraArgs)['omit_test_outputs_on_success'] || 'true' }} From 855c2a75300ebc7fb5688cee443d649913090afa Mon Sep 17 00:00:00 2001 From: Austin <107539019+0xAustinWang@users.noreply.github.com> Date: Mon, 24 Feb 2025 16:29:45 +0800 Subject: [PATCH 32/58] make load trigger fire and forget (#16508) * parallelize operations in the deployer group * enable replacing ocr only * update metrics manager * metric changes wip * allow load test to fire and forget * cleanup unused channels, better channel closing * revert temp change * Add test label value * update ocr values, respond to comments * goimports --- deployment/ccip/changeset/globals/config.go | 4 +- deployment/common/types/types.go | 4 +- integration-tests/load/ccip/ccip_test.go | 78 +++++----- .../load/ccip/destination_gun.go | 84 ++--------- integration-tests/load/ccip/helpers.go | 138 +++++++++++++++--- integration-tests/load/ccip/metrics.go | 57 +++++--- integration-tests/testconfig/ccip/ccip.toml | 4 +- integration-tests/testconfig/ccip/load.go | 1 + 8 files changed, 220 insertions(+), 150 deletions(-) diff --git a/deployment/ccip/changeset/globals/config.go b/deployment/ccip/changeset/globals/config.go index cc74a3059d4..c93fdc2a97b 100644 --- a/deployment/ccip/changeset/globals/config.go +++ b/deployment/ccip/changeset/globals/config.go @@ -18,14 +18,14 @@ const ( InflightCacheExpiry = 10 * time.Minute RootSnoozeTime = 30 * time.Minute BatchingStrategyID = 0 - DeltaProgress = 30 * time.Second + DeltaProgress = 10 * time.Second DeltaResend = 10 * time.Second DeltaInitial = 20 * time.Second DeltaRound = 2 * time.Second DeltaGrace = 2 * time.Second DeltaCertifiedCommitRequest = 10 * time.Second DeltaStage = 10 * time.Second - Rmax = 3 + Rmax = 50 MaxDurationQuery = 500 * time.Millisecond MaxDurationObservation = 5 * time.Second MaxDurationShouldAcceptAttestedReport = 10 * time.Second diff --git a/deployment/common/types/types.go b/deployment/common/types/types.go index c82559276e7..cdda003b3f0 100644 --- a/deployment/common/types/types.go +++ b/deployment/common/types/types.go @@ -102,8 +102,8 @@ func (params OCRParameters) Validate() error { if params.DeltaCertifiedCommitRequest <= 0 { return errors.New("deltaCertifiedCommitRequest must be positive") } - if params.DeltaStage <= 0 { - return errors.New("deltaStage must be positive") + if params.DeltaStage < 0 { + return errors.New("deltaStage must be positive or 0 for disabled") } if params.Rmax <= 0 { return errors.New("rmax must be positive") diff --git a/integration-tests/load/ccip/ccip_test.go b/integration-tests/load/ccip/ccip_test.go index a486742550e..0dbf1490324 100644 --- a/integration-tests/load/ccip/ccip_test.go +++ b/integration-tests/load/ccip/ccip_test.go @@ -15,7 +15,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment" ccipchangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-testing-framework/wasp" @@ -37,13 +36,13 @@ var ( const simChainTestKey = "ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" // step 1: setup -// Parse the test config, initialize CRIB with configurations defined +// Parse the test config // step 2: subscribe -// Create event subscribers on the offramp +// Create event subscribers in src and dest // step 3: load // Use wasp to initiate load // step 4: teardown -// Stop the chains, cleanup the environment +// wait for ccip to finish, push remaining data func TestCCIPLoad_RPS(t *testing.T) { // comment out when executing the test // t.Skip("Skipping test as this test should not be auto triggered") @@ -75,25 +74,43 @@ func TestCCIPLoad_RPS(t *testing.T) { state, err := ccipchangeset.LoadOnchainState(*env) require.NoError(t, err) - errChan := make(chan error) - defer close(errChan) finalSeqNrCommitChannels := make(map[uint64]chan finalSeqNrReport) finalSeqNrExecChannels := make(map[uint64]chan finalSeqNrReport) + loadFinished := make(chan struct{}) - mm := NewMetricsManager(t, env.Logger) + mm := NewMetricsManager(t, env.Logger, userOverrides) go mm.Start(ctx) - defer mm.Stop() // gunMap holds a destinationGun for every enabled destination chain gunMap := make(map[uint64]*DestinationGun) p := wasp.NewProfile() - // Only create a destination gun if we have decided to send traffic to this chain - for ind := range *userOverrides.NumDestinationChains { - cs := env.AllChainSelectors()[ind] + + // potential source chains need a subscription + for _, cs := range env.AllChainSelectors() { latesthdr, err := env.Chains[cs].Client.HeaderByNumber(ctx, nil) require.NoError(t, err) block := latesthdr.Number.Uint64() startBlocks[cs] = &block + other := env.AllChainSelectorsExcluding([]uint64{cs}) + wg.Add(1) + go subscribeTransmitEvents( + ctx, + lggr, + state.Chains[cs].OnRamp, + other, + startBlocks[cs], + cs, + loadFinished, + env.Chains[cs].Client, + &wg, + mm.InputChan, + finalSeqNrCommitChannels, + finalSeqNrExecChannels) + } + + // confirmed dest chains need a subscription + for ind := range *userOverrides.NumDestinationChains { + cs := env.AllChainSelectors()[ind] messageKeys := make(map[uint64]*bind.TransactOpts) other := env.AllChainSelectorsExcluding([]uint64{cs}) @@ -134,7 +151,6 @@ func TestCCIPLoad_RPS(t *testing.T) { t.Fatal(err) } - otherChains := env.AllChainSelectorsExcluding([]uint64{cs}) finalSeqNrCommitChannels[cs] = make(chan finalSeqNrReport) finalSeqNrExecChannels[cs] = make(chan finalSeqNrReport) @@ -143,24 +159,22 @@ func TestCCIPLoad_RPS(t *testing.T) { ctx, lggr, state.Chains[cs].OffRamp, - otherChains, - &block, + other, + startBlocks[cs], cs, env.Chains[cs].Client, finalSeqNrCommitChannels[cs], - errChan, &wg, mm.InputChan) go subscribeExecutionEvents( ctx, lggr, state.Chains[cs].OffRamp, - otherChains, - &block, + other, + startBlocks[cs], cs, env.Chains[cs].Client, finalSeqNrExecChannels[cs], - errChan, &wg, mm.InputChan) } @@ -191,28 +205,11 @@ func TestCCIPLoad_RPS(t *testing.T) { _, err = p.Run(true) require.NoError(t, err) - - for _, gun := range gunMap { - for csPair, seqNums := range gun.seqNums { - lggr.Debugw("pushing finalized sequence numbers for ", - "chainSelector", gun.chainSelector, - "sourceChainSelector", csPair.SourceChainSelector, - "seqNums", seqNums) - finalSeqNrCommitChannels[csPair.DestChainSelector] <- finalSeqNrReport{ - sourceChainSelector: csPair.SourceChainSelector, - expectedSeqNrRange: ccipocr3.SeqNumRange{ - ccipocr3.SeqNum(seqNums.Start.Load()), ccipocr3.SeqNum(seqNums.End.Load()), - }, - } - - finalSeqNrExecChannels[csPair.DestChainSelector] <- finalSeqNrReport{ - sourceChainSelector: csPair.SourceChainSelector, - expectedSeqNrRange: ccipocr3.SeqNumRange{ - ccipocr3.SeqNum(seqNums.Start.Load()), ccipocr3.SeqNum(seqNums.End.Load()), - }, - } - } - } + // wait some duration so that transmits can happen + go func() { + time.Sleep(tickerDuration) + close(loadFinished) + }() // after load is finished, wait for a "timeout duration" before considering that messages are timed out timeout := userOverrides.GetTimeoutDuration() @@ -220,7 +217,6 @@ func TestCCIPLoad_RPS(t *testing.T) { testTimer := time.NewTimer(timeout) go func() { <-testTimer.C - mm.Stop() cancel() }() } diff --git a/integration-tests/load/ccip/destination_gun.go b/integration-tests/load/ccip/destination_gun.go index df5224b88ec..095e6b68d38 100644 --- a/integration-tests/load/ccip/destination_gun.go +++ b/integration-tests/load/ccip/destination_gun.go @@ -4,12 +4,11 @@ import ( "context" "errors" "fmt" - "math" "math/big" "math/rand" + "time" ccipchangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -35,7 +34,6 @@ type DestinationGun struct { l logger.Logger env deployment.Environment state *ccipchangeset.CCIPOnChainState - seqNums map[testhelpers.SourceDestPair]SeqNumRange roundNum *atomic.Int32 chainSelector uint64 receiver common.Address @@ -56,21 +54,10 @@ func NewDestinationGun( chainOffset int, metricPipe chan messageData, ) (*DestinationGun, error) { - seqNums := make(map[testhelpers.SourceDestPair]SeqNumRange) - for _, cs := range env.AllChainSelectorsExcluding([]uint64{chainSelector}) { - seqNums[testhelpers.SourceDestPair{ - SourceChainSelector: cs, - DestChainSelector: chainSelector, - }] = SeqNumRange{ - Start: atomic.NewUint64(math.MaxUint64), - End: atomic.NewUint64(0), - } - } dg := DestinationGun{ l: l, env: env, state: state, - seqNums: seqNums, roundNum: &atomic.Int32{}, chainSelector: chainSelector, receiver: receiver, @@ -121,11 +108,6 @@ func (m *DestinationGun) Call(_ *wasp.Generator) *wasp.Response { acc := m.messageKeys[src] - csPair := testhelpers.SourceDestPair{ - SourceChainSelector: src, - DestChainSelector: m.chainSelector, - } - r := state.Chains[src].Router msg, err := m.GetMessage(src) @@ -162,61 +144,27 @@ func (m *DestinationGun) Call(_ *wasp.Generator) *wasp.Response { "sourceChain", src, "destchain", m.chainSelector, "err", deployment.MaybeDataErr(err)) - return &wasp.Response{Error: err.Error(), Group: waspGroup, Failed: true} - } - blockNum, err := m.env.Chains[src].Confirm(tx) - if err != nil { - m.l.Errorw("could not confirm tx on source", "tx", tx, "err", deployment.MaybeDataErr(err)) - return &wasp.Response{Error: err.Error(), Group: waspGroup, Failed: true} - } + // in the event of an error, still push a metric + // sequence numbers start at 1 so using 0 as a sentinel value + data := messageData{ + eventType: transmitted, + srcDstSeqNum: srcDstSeqNum{ + src: src, + dst: m.chainSelector, + seqNum: 0, + }, + timestamp: uint64(time.Now().Unix()), + } + m.metricPipe <- data - // todo: wasp should not manage confirming the message - // instead, we should manage the sequence number atomically (at a higher level) - it, err := state.Chains[src].OnRamp.FilterCCIPMessageSent(&bind.FilterOpts{ - Start: blockNum, - End: &blockNum, - Context: context.Background(), - }, []uint64{m.chainSelector}, []uint64{}) - if err != nil { - m.l.Errorw("could not find sent message event on src chain", "src", src, "dst", m.chainSelector, "err", err) return &wasp.Response{Error: err.Error(), Group: waspGroup, Failed: true} } - if !it.Next() { - m.l.Errorw("Could not find event") - return &wasp.Response{Error: "Could not iterate", Group: waspGroup, Failed: true} - } - - m.l.Infow("Transmitted message with", - "sourceChain", src, - "destChain", m.chainSelector, - "sequence number", it.Event.SequenceNumber) - // push metric to metric manager for eventual distribution to loki - blockNum = it.Event.Raw.BlockNumber - header, err := m.env.Chains[src].Client.HeaderByNumber(m.env.GetContext(), new(big.Int).SetUint64(blockNum)) + _, err = m.env.Chains[src].Confirm(tx) if err != nil { - return &wasp.Response{Error: "Could not get timestamp of block number", Group: waspGroup, Failed: true} - } - m.metricPipe <- messageData{ - eventType: transmitted, - srcDstSeqNum: srcDstSeqNum{ - src: src, - dst: m.chainSelector, - seqNum: it.Event.SequenceNumber, - }, - timestamp: header.Time, - round: int(requestedRound), - } - - // always store the lowest seen number as the start seq num - if it.Event.SequenceNumber < m.seqNums[csPair].Start.Load() { - m.seqNums[csPair].Start.Store(it.Event.SequenceNumber) - } - - // always store the greatest sequence number we have seen as the maximum - if it.Event.SequenceNumber > m.seqNums[csPair].End.Load() { - m.seqNums[csPair].End.Store(it.Event.SequenceNumber) + m.l.Errorw("could not confirm tx on source", "tx", tx, "err", deployment.MaybeDataErr(err)) + return &wasp.Response{Error: err.Error(), Group: waspGroup, Failed: true} } return &wasp.Response{Failed: false, Group: waspGroup} diff --git a/integration-tests/load/ccip/helpers.go b/integration-tests/load/ccip/helpers.go index 0a217f9e87b..07ab5543fb9 100644 --- a/integration-tests/load/ccip/helpers.go +++ b/integration-tests/load/ccip/helpers.go @@ -2,13 +2,17 @@ package ccip import ( "context" - "errors" "fmt" "math" "slices" "sync" "time" + "go.uber.org/atomic" + + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" + "github.com/ethereum/go-ethereum/event" "golang.org/x/sync/errgroup" @@ -43,18 +47,122 @@ var ( fundingAmount = new(big.Int).Mul(deployment.UBigInt(100), deployment.UBigInt(1e18)) // 100 eth ) -// todo: Have a different struct for commit/exec? -type LokiMetric struct { - SequenceNumber uint64 `json:"sequence_number"` - CommitDuration uint64 `json:"commit_duration"` - ExecDuration uint64 `json:"exec_duration"` -} - type finalSeqNrReport struct { sourceChainSelector uint64 expectedSeqNrRange ccipocr3.SeqNumRange } +func subscribeTransmitEvents( + ctx context.Context, + lggr logger.Logger, + onRamp onramp.OnRampInterface, + otherChains []uint64, + startBlock *uint64, + srcChainSel uint64, + loadFinished chan struct{}, + client deployment.OnchainClient, + wg *sync.WaitGroup, + metricPipe chan messageData, + finalSeqNrCommitChannels map[uint64]chan finalSeqNrReport, + finalSeqNrExecChannels map[uint64]chan finalSeqNrReport, +) { + defer wg.Done() + lggr.Infow("starting transmit event subscriber for ", + "srcChain", srcChainSel, + "startblock", startBlock, + ) + + seqNums := make(map[testhelpers.SourceDestPair]SeqNumRange) + for _, cs := range otherChains { + seqNums[testhelpers.SourceDestPair{ + SourceChainSelector: srcChainSel, + DestChainSelector: cs, + }] = SeqNumRange{ + // we use the maxuint as a sentinel value here to ensure we always get the lowest possible seqnum + Start: atomic.NewUint64(math.MaxUint64), + End: atomic.NewUint64(0), + } + } + + sink := make(chan *onramp.OnRampCCIPMessageSent) + subscription := event.Resubscribe(SubscriptionTimeout, func(_ context.Context) (event.Subscription, error) { + return onRamp.WatchCCIPMessageSent(&bind.WatchOpts{ + Context: ctx, + Start: startBlock, + }, sink, nil, nil) + }) + defer subscription.Unsubscribe() + + for { + select { + case <-subscription.Err(): + return + case event := <-sink: + lggr.Debugw("received transmit event for", + "srcChain", srcChainSel, + "destChain", event.DestChainSelector, + "sequenceNumber", event.SequenceNumber) + + blockNum := event.Raw.BlockNumber + header, err := client.HeaderByNumber(ctx, new(big.Int).SetUint64(blockNum)) + if err != nil { + lggr.Errorw("error getting header by number") + } + data := messageData{ + eventType: transmitted, + srcDstSeqNum: srcDstSeqNum{ + src: srcChainSel, + dst: event.DestChainSelector, + seqNum: event.SequenceNumber, + }, + timestamp: header.Time, + } + metricPipe <- data + + csPair := testhelpers.SourceDestPair{ + SourceChainSelector: srcChainSel, + DestChainSelector: event.DestChainSelector, + } + // always store the lowest seen number as the start seq num + if event.SequenceNumber < seqNums[csPair].Start.Load() { + seqNums[csPair].Start.Store(event.SequenceNumber) + } + + // always store the greatest sequence number we have seen as the maximum + if event.SequenceNumber > seqNums[csPair].End.Load() { + seqNums[csPair].End.Store(event.SequenceNumber) + } + case <-ctx.Done(): + lggr.Errorw("received context cancel signal for transmit watcher", + "srcChain", srcChainSel) + return + case <-loadFinished: + lggr.Debugw("load finished, closing transmit watchers", "srcChainSel", srcChainSel) + for csPair, seqNums := range seqNums { + lggr.Infow("pushing finalized sequence numbers for ", + "srcChainSelector", srcChainSel, + "destChainSelector", csPair.DestChainSelector, + "seqNums", seqNums) + finalSeqNrCommitChannels[csPair.DestChainSelector] <- finalSeqNrReport{ + sourceChainSelector: csPair.SourceChainSelector, + expectedSeqNrRange: ccipocr3.SeqNumRange{ + ccipocr3.SeqNum(seqNums.Start.Load()), ccipocr3.SeqNum(seqNums.End.Load()), + }, + } + + finalSeqNrExecChannels[csPair.DestChainSelector] <- finalSeqNrReport{ + sourceChainSelector: csPair.SourceChainSelector, + expectedSeqNrRange: ccipocr3.SeqNumRange{ + ccipocr3.SeqNum(seqNums.Start.Load()), ccipocr3.SeqNum(seqNums.End.Load()), + }, + } + } + return + } + + } +} + func subscribeCommitEvents( ctx context.Context, lggr logger.Logger, @@ -64,11 +172,11 @@ func subscribeCommitEvents( chainSelector uint64, client deployment.OnchainClient, finalSeqNrs chan finalSeqNrReport, - errChan chan error, wg *sync.WaitGroup, metricPipe chan messageData, ) { defer wg.Done() + defer close(finalSeqNrs) lggr.Infow("starting commit event subscriber for ", "destChain", chainSelector, @@ -96,8 +204,7 @@ func subscribeCommitEvents( for { select { - case subErr := <-subscription.Err(): - errChan <- subErr + case <-subscription.Err(): return case report := <-sink: if len(report.BlessedMerkleRoots)+len(report.UnblessedMerkleRoots) > 0 { @@ -113,7 +220,7 @@ func subscribeCommitEvents( blockNum := report.Raw.BlockNumber header, err := client.HeaderByNumber(ctx, new(big.Int).SetUint64(blockNum)) if err != nil { - errChan <- err + lggr.Errorw("error getting header by number") } data := messageData{ eventType: committed, @@ -134,7 +241,6 @@ func subscribeCommitEvents( "destChain", chainSelector, "sourceChains", srcChains, "expectedSeqNumbers", expectedRange) - errChan <- errors.New("timed out waiting for commit report") return case finalSeqNrUpdate, ok := <-finalSeqNrs: @@ -193,11 +299,11 @@ func subscribeExecutionEvents( chainSelector uint64, client deployment.OnchainClient, finalSeqNrs chan finalSeqNrReport, - errChan chan error, wg *sync.WaitGroup, metricPipe chan messageData, ) { defer wg.Done() + defer close(finalSeqNrs) lggr.Infow("starting execution event subscriber for ", "destChain", chainSelector, @@ -227,7 +333,6 @@ func subscribeExecutionEvents( case subErr := <-subscription.Err(): lggr.Errorw("error in execution subscription", "err", subErr) - errChan <- subErr return case event := <-sink: lggr.Debugw("received execution event for", @@ -239,7 +344,7 @@ func subscribeExecutionEvents( blockNum := event.Raw.BlockNumber header, err := client.HeaderByNumber(ctx, new(big.Int).SetUint64(blockNum)) if err != nil { - errChan <- err + lggr.Errorw("error getting header by number") } data := messageData{ eventType: executed, @@ -260,7 +365,6 @@ func subscribeExecutionEvents( "expectedSeqNumbers", expectedRange, "seenMessages", seenMessages, "completedSrcChains", completedSrcChains) - errChan <- errors.New("timed out waiting for execution event") return case finalSeqNrUpdate := <-finalSeqNrs: diff --git a/integration-tests/load/ccip/metrics.go b/integration-tests/load/ccip/metrics.go index 8c64747a10e..d18248e5def 100644 --- a/integration-tests/load/ccip/metrics.go +++ b/integration-tests/load/ccip/metrics.go @@ -2,11 +2,12 @@ package ccip import ( "context" - "strconv" chainselectors "github.com/smartcontractkit/chain-selectors" "github.com/stretchr/testify/require" + "github.com/smartcontractkit/chainlink/integration-tests/testconfig/ccip" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-testing-framework/wasp" @@ -19,6 +20,13 @@ const ( ErrLokiPush = "failed to push metrics to Loki" ) +type LokiMetric struct { + TransmitTime uint64 `json:"transmit_time"` + SequenceNumber uint64 `json:"sequence_number"` + CommitDuration uint64 `json:"commit_duration"` + ExecDuration uint64 `json:"exec_duration"` +} + // MetricsManager is used for maintaining state of different sequence numbers // Once we've received all expected timestamps, it pushes the metrics to Loki type MetricManager struct { @@ -26,11 +34,11 @@ type MetricManager struct { loki *wasp.LokiClient InputChan chan messageData state map[srcDstSeqNum]metricState + testLabel string } type metricState struct { timestamps [3]uint64 - round int } type srcDstSeqNum struct { @@ -43,27 +51,28 @@ type messageData struct { eventType int srcDstSeqNum timestamp uint64 - round int } -func NewMetricsManager(t *testing.T, l logger.Logger) *MetricManager { +func NewMetricsManager(t *testing.T, l logger.Logger, overrides *ccip.LoadConfig) *MetricManager { // initialize loki using endpoint from user defined env vars loki, err := wasp.NewLokiClient(wasp.NewEnvLokiConfig()) require.NoError(t, err) + testLabel := "default" + if overrides.TestLabel != nil { + testLabel = *overrides.TestLabel + } return &MetricManager{ lggr: l, loki: loki, InputChan: make(chan messageData), state: make(map[srcDstSeqNum]metricState), + testLabel: testLabel, } } -func (mm *MetricManager) Stop() { - close(mm.InputChan) -} - func (mm *MetricManager) Start(ctx context.Context) { + defer close(mm.InputChan) for { select { case <-ctx.Done(): @@ -79,19 +88,18 @@ func (mm *MetricManager) Start(ctx context.Context) { execDuration = timestamps[executed] - timestamps[committed] } - lokiLabels, err := setLokiLabels(srcDstSeqNum.src, srcDstSeqNum.dst, metricState.round) + lokiLabels, err := setLokiLabels(srcDstSeqNum.src, srcDstSeqNum.dst, mm.testLabel) if err != nil { mm.lggr.Error("error setting loki labels", "error", err) // don't return here, we still want to push metrics to loki } SendMetricsToLoki(mm.lggr, mm.loki, lokiLabels, &LokiMetric{ + TransmitTime: timestamps[transmitted], ExecDuration: execDuration, CommitDuration: commitDuration, SequenceNumber: srcDstSeqNum.seqNum, }) } - close(mm.InputChan) - mm.loki.Stop() return case data := <-mm.InputChan: if _, ok := mm.state[data.srcDstSeqNum]; !ok { @@ -100,22 +108,35 @@ func (mm *MetricManager) Start(ctx context.Context) { } } + if data.seqNum == 0 { + // seqNum of 0 indicates an error. Push nil values to loki + lokiLabels, err := setLokiLabels(data.src, data.dst, mm.testLabel) + if err != nil { + mm.lggr.Error("error setting loki labels", "error", err) + } + SendMetricsToLoki(mm.lggr, mm.loki, lokiLabels, &LokiMetric{ + TransmitTime: data.timestamp, + ExecDuration: 0, + CommitDuration: 0, + SequenceNumber: 0, + }) + continue + } state := mm.state[data.srcDstSeqNum] state.timestamps[data.eventType] = data.timestamp - if data.eventType == transmitted && data.round != -1 { - state.round = data.round - } + mm.state[data.srcDstSeqNum] = state if data.eventType == executed { - mm.lggr.Infow("new state for received seqNum is ", "dst", data.dst, "seqNum", data.seqNum, "round", state.round, "timestamps", state.timestamps) + mm.lggr.Infow("new state for received seqNum is ", "dst", data.dst, "seqNum", data.seqNum, "timestamps", state.timestamps) } // we have all data needed to push to Loki if state.timestamps[transmitted] != 0 && state.timestamps[committed] != 0 && state.timestamps[executed] != 0 { - lokiLabels, err := setLokiLabels(data.src, data.dst, mm.state[data.srcDstSeqNum].round) + lokiLabels, err := setLokiLabels(data.src, data.dst, mm.testLabel) if err != nil { mm.lggr.Error("error setting loki labels", "error", err) } SendMetricsToLoki(mm.lggr, mm.loki, lokiLabels, &LokiMetric{ + TransmitTime: state.timestamps[transmitted], ExecDuration: state.timestamps[executed] - state.timestamps[committed], CommitDuration: state.timestamps[committed] - state.timestamps[transmitted], SequenceNumber: data.seqNum, @@ -133,7 +154,7 @@ func SendMetricsToLoki(l logger.Logger, lc *wasp.LokiClient, updatedLabels map[s } } -func setLokiLabels(src, dst uint64, round int) (map[string]string, error) { +func setLokiLabels(src, dst uint64, testLabel string) (map[string]string, error) { srcChainID, err := chainselectors.GetChainIDFromSelector(src) if err != nil { return nil, err @@ -145,7 +166,7 @@ func setLokiLabels(src, dst uint64, round int) (map[string]string, error) { return map[string]string{ "sourceEvmChainId": srcChainID, "destEvmChainId": dstChainID, - "roundNum": strconv.Itoa(round), "testType": LokiLoadLabel, + "testLabel": testLabel, }, nil } diff --git a/integration-tests/testconfig/ccip/ccip.toml b/integration-tests/testconfig/ccip/ccip.toml index 9d98f796900..32e21beaff1 100644 --- a/integration-tests/testconfig/ccip/ccip.toml +++ b/integration-tests/testconfig/ccip/ccip.toml @@ -246,9 +246,9 @@ ephemeral_addresses_number = 0 MessageTypeWeights = [100,0,0] # each destination chain will receive 1 incoming request per RequestFrequency for the duration of LoadDuration RequestFrequency = "5s" -LoadDuration = "10m" +LoadDuration = "5h" # destination chain selectors to send messages to NumDestinationChains = 8 # Directory where we receive environment configuration from crib CribEnvDirectory = "../../../../crib/deployments/ccip-v2/.tmp" -TimeoutDuration = "20m" \ No newline at end of file +TimeoutDuration = "30m" \ No newline at end of file diff --git a/integration-tests/testconfig/ccip/load.go b/integration-tests/testconfig/ccip/load.go index ddea267e8f0..5378ecf1412 100644 --- a/integration-tests/testconfig/ccip/load.go +++ b/integration-tests/testconfig/ccip/load.go @@ -16,6 +16,7 @@ type LoadConfig struct { CribEnvDirectory *string NumDestinationChains *int TimeoutDuration *string + TestLabel *string } func (l *LoadConfig) Validate(t *testing.T, e *deployment.Environment) { From 25bc303c517e951143369cd359edc7e57bac9e80 Mon Sep 17 00:00:00 2001 From: Bartek Tofel Date: Mon, 24 Feb 2025 12:33:00 +0100 Subject: [PATCH 33/58] reusable workflow without log spamming (#16499) * try new reusable workflow * remove on-purpose failure * use e2e reusable workflow commit from main .github branch * do not use GAP with Docker tests --- .github/workflows/integration-tests.yml | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 443df08f380..442117e1270 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -183,7 +183,7 @@ jobs: contents: read needs: [build-chainlink, changes] if: github.event_name == 'pull_request' && ( needs.changes.outputs.keystone_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true') - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@18ee2276811ff4ad56a2284590c9917bec33b748 with: workflow_name: Run Core Workflow Engine Tests For PR chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.sha }} @@ -211,8 +211,6 @@ jobs: AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN: ${{ secrets.AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN }} AWS_API_GW_HOST_GRAFANA: ${{ secrets.AWS_API_GW_HOST_GRAFANA }} SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }} - MAIN_DNS_ZONE_PUBLIC_SDLC: ${{ secrets.MAIN_DNS_ZONE_PUBLIC_SDLC }} - AWS_K8S_CLUSTER_NAME_SDLC: ${{ secrets.AWS_K8S_CLUSTER_NAME_SDLC }} OPTIONAL_GATI_AWS_ROLE_ARN: ${{ secrets.AWS_OIDC_GLOBAL_READ_ONLY_TOKEN_ISSUER_ROLE_ARN }} OPTIONAL_GATI_LAMBDA_URL: ${{ secrets.AWS_INFRA_RELENG_TOKEN_ISSUER_LAMBDA_URL }} @@ -226,7 +224,7 @@ jobs: contents: read needs: [build-chainlink, changes] if: github.event_name == 'pull_request' && ( needs.changes.outputs.core_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true') - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@18ee2276811ff4ad56a2284590c9917bec33b748 with: workflow_name: Run Core E2E Tests For PR chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.sha }} @@ -254,8 +252,6 @@ jobs: AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN: ${{ secrets.AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN }} AWS_API_GW_HOST_GRAFANA: ${{ secrets.AWS_API_GW_HOST_GRAFANA }} SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }} - MAIN_DNS_ZONE_PUBLIC_SDLC: ${{ secrets.MAIN_DNS_ZONE_PUBLIC_SDLC }} - AWS_K8S_CLUSTER_NAME_SDLC: ${{ secrets.AWS_K8S_CLUSTER_NAME_SDLC }} run-core-e2e-tests-for-merge-queue: name: Run Core E2E Tests For Merge Queue @@ -267,7 +263,7 @@ jobs: contents: read needs: [build-chainlink, changes] if: github.event_name == 'merge_group' && ( needs.changes.outputs.core_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true') - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@18ee2276811ff4ad56a2284590c9917bec33b748 with: workflow_name: Run Core E2E Tests For Merge Queue chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.sha }} @@ -299,8 +295,6 @@ jobs: AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN: ${{ secrets.AWS_OIDC_IAM_ROLE_VALIDATION_PROD_ARN }} AWS_API_GW_HOST_GRAFANA: ${{ secrets.AWS_API_GW_HOST_GRAFANA }} SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }} - MAIN_DNS_ZONE_PUBLIC_SDLC: ${{ secrets.MAIN_DNS_ZONE_PUBLIC_SDLC }} - AWS_K8S_CLUSTER_NAME_SDLC: ${{ secrets.AWS_K8S_CLUSTER_NAME_SDLC }} run-ccip-e2e-tests-for-pr: name: Run CCIP E2E Tests For PR @@ -312,7 +306,7 @@ jobs: contents: read needs: [build-chainlink, changes] if: github.event_name == 'pull_request' && (needs.changes.outputs.ccip_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true') - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@18ee2276811ff4ad56a2284590c9917bec33b748 with: workflow_name: Run CCIP E2E Tests For PR chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.sha }} @@ -354,7 +348,7 @@ jobs: contents: read needs: [build-chainlink, changes] if: github.event_name == 'merge_group' && (needs.changes.outputs.ccip_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true') - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@18ee2276811ff4ad56a2284590c9917bec33b748 with: workflow_name: Run CCIP E2E Tests For Merge Queue chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.sha }} From 5cecc774482026adfb3afa3ed842892bf5078f13 Mon Sep 17 00:00:00 2001 From: Giorgio Gambino <151543+giogam@users.noreply.github.com> Date: Mon, 24 Feb 2025 13:40:15 +0000 Subject: [PATCH 34/58] chore(data-streams): adds don related label to node registration changeset (#16534) --- .../data-streams/changeset/jd_register_nodes.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/deployment/data-streams/changeset/jd_register_nodes.go b/deployment/data-streams/changeset/jd_register_nodes.go index 42be94446cc..a1ec40d9308 100644 --- a/deployment/data-streams/changeset/jd_register_nodes.go +++ b/deployment/data-streams/changeset/jd_register_nodes.go @@ -66,14 +66,20 @@ func validateNodeSlice(nodes []NodeCfg, nodeType string, donIndex int) error { return nil } -func registerNodesForDON(e deployment.Environment, nodes []NodeCfg, baseLabels []*ptypes.Label, nodeType NodeType) { +func registerNodesForDON(e deployment.Environment, donName string, donID int, nodes []NodeCfg, baseLabels []*ptypes.Label, nodeType NodeType) { ntStr := nodeType.String() for _, node := range nodes { labels := append([]*ptypes.Label(nil), baseLabels...) + labels = append(labels, &ptypes.Label{ Key: "nodeType", Value: &ntStr, }) + + labels = append(labels, &ptypes.Label{ + Key: fmt.Sprintf("don-%d-%s", donID, donName), + }) + nodeID, err := e.Offchain.RegisterNode(e.GetContext(), &nodev1.RegisterNodeRequest{ Name: node.Name, PublicKey: node.CSAKey, @@ -100,8 +106,8 @@ func RegisterNodesWithJD(e deployment.Environment, cfg RegisterNodesInput) (depl } for _, don := range cfg.DONsList { - registerNodesForDON(e, don.Nodes, baseLabels, NodeTypeOracle) - registerNodesForDON(e, don.BootstrapNodes, baseLabels, NodeTypeBootstrap) + registerNodesForDON(e, don.Name, don.ID, don.Nodes, baseLabels, NodeTypeOracle) + registerNodesForDON(e, don.Name, don.ID, don.BootstrapNodes, baseLabels, NodeTypeBootstrap) } return deployment.ChangesetOutput{}, nil From 3c01f57fde66d80dfc69a3868aed293140c3aeed Mon Sep 17 00:00:00 2001 From: dimitris Date: Mon, 24 Feb 2025 15:48:51 +0200 Subject: [PATCH 35/58] Upgrade cl-ccip (#16533) * chain fee async cfg * upgrade cl-ccip * upgrade cl-ccip * upgrade cl-ccip * upgrade cl-ccip * upgrade cl-ccip * upgrade cl-ccip * update cl-ccip --- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 ++-- deployment/ccip/changeset/v1_6/cs_ccip_home.go | 2 ++ deployment/go.mod | 2 +- deployment/go.sum | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 ++-- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 ++-- system-tests/lib/go.mod | 2 +- system-tests/lib/go.sum | 4 ++-- system-tests/tests/go.mod | 2 +- system-tests/tests/go.sum | 4 ++-- 15 files changed, 23 insertions(+), 21 deletions(-) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index a82a435148a..680f47423a4 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -340,7 +340,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 6a06a01b3e7..721b690ba76 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1086,8 +1086,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 h1:voKtyPNWsT4o/IilRbkEMsvYEWhYMpkl94mi3fDQz60= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1:Z5QRY8DtXnxnPwbo+mR1mxwaL+OClza3ATUqcQ1Ynz8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/deployment/ccip/changeset/v1_6/cs_ccip_home.go b/deployment/ccip/changeset/v1_6/cs_ccip_home.go index 3ed6017f243..699e66f51bb 100644 --- a/deployment/ccip/changeset/v1_6/cs_ccip_home.go +++ b/deployment/ccip/changeset/v1_6/cs_ccip_home.go @@ -222,6 +222,8 @@ func WithDefaultCommitOffChainConfig(feedChainSel uint64, tokenInfo map[ccipocr3 MerkleRootAsyncObserverDisabled: false, MerkleRootAsyncObserverSyncFreq: 4 * time.Second, MerkleRootAsyncObserverSyncTimeout: 12 * time.Second, + ChainFeeAsyncObserverSyncFreq: 10 * time.Second, + ChainFeeAsyncObserverSyncTimeout: 12 * time.Second, } } else { if params.CommitOffChainConfig.TokenInfo == nil { diff --git a/deployment/go.mod b/deployment/go.mod index 1e0f662ff55..aba9cc0aaec 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -30,7 +30,7 @@ require ( github.com/sethvargo/go-retry v0.2.4 github.com/smartcontractkit/ccip-owner-contracts v0.1.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb diff --git a/deployment/go.sum b/deployment/go.sum index 5524af3ebc2..c37601139cf 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1134,8 +1134,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 h1:voKtyPNWsT4o/IilRbkEMsvYEWhYMpkl94mi3fDQz60= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1:Z5QRY8DtXnxnPwbo+mR1mxwaL+OClza3ATUqcQ1Ynz8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/go.mod b/go.mod index 70e2667a0dc..bdd5ee85fff 100644 --- a/go.mod +++ b/go.mod @@ -76,7 +76,7 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 diff --git a/go.sum b/go.sum index d99750cf925..bde89e1c8a3 100644 --- a/go.sum +++ b/go.sum @@ -1018,8 +1018,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 h1:voKtyPNWsT4o/IilRbkEMsvYEWhYMpkl94mi3fDQz60= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1:Z5QRY8DtXnxnPwbo+mR1mxwaL+OClza3ATUqcQ1Ynz8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index c0b4f401ba1..d6c4f6b6b93 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -46,7 +46,7 @@ require ( github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 7ef48b47531..f59223f1a01 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1384,8 +1384,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 h1:voKtyPNWsT4o/IilRbkEMsvYEWhYMpkl94mi3fDQz60= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1:Z5QRY8DtXnxnPwbo+mR1mxwaL+OClza3ATUqcQ1Ynz8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 61f8b6e7465..ca9802216f3 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -28,7 +28,7 @@ require ( github.com/rs/zerolog v1.33.0 github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index a482b75366b..fa62425009d 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1369,8 +1369,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 h1:voKtyPNWsT4o/IilRbkEMsvYEWhYMpkl94mi3fDQz60= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1:Z5QRY8DtXnxnPwbo+mR1mxwaL+OClza3ATUqcQ1Ynz8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/system-tests/lib/go.mod b/system-tests/lib/go.mod index bb0dfe89443..b1453a2d2e2 100644 --- a/system-tests/lib/go.mod +++ b/system-tests/lib/go.mod @@ -338,7 +338,7 @@ require ( github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect diff --git a/system-tests/lib/go.sum b/system-tests/lib/go.sum index 4bcb3866c1c..f9f9026508d 100644 --- a/system-tests/lib/go.sum +++ b/system-tests/lib/go.sum @@ -1122,8 +1122,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 h1:voKtyPNWsT4o/IilRbkEMsvYEWhYMpkl94mi3fDQz60= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1:Z5QRY8DtXnxnPwbo+mR1mxwaL+OClza3ATUqcQ1Ynz8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/system-tests/tests/go.mod b/system-tests/tests/go.mod index 395b0882f5d..42dd042a2df 100644 --- a/system-tests/tests/go.mod +++ b/system-tests/tests/go.mod @@ -341,7 +341,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect diff --git a/system-tests/tests/go.sum b/system-tests/tests/go.sum index d2bd8b1075e..720962bbaa1 100644 --- a/system-tests/tests/go.sum +++ b/system-tests/tests/go.sum @@ -1122,8 +1122,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4 h1:voKtyPNWsT4o/IilRbkEMsvYEWhYMpkl94mi3fDQz60= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250221121938-dd0db587bff4/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1:Z5QRY8DtXnxnPwbo+mR1mxwaL+OClza3ATUqcQ1Ynz8= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= From aefb2b75f0e7b6f099176f57e4a19e3ce15fe7cc Mon Sep 17 00:00:00 2001 From: Yashvardhan Nevatia Date: Mon, 24 Feb 2025 13:54:15 +0000 Subject: [PATCH 36/58] TokenPool split and other QOL (#16472) * modularising billing to be reused in cs_deploy * adding offramp instruction * adding remote billing for token transfers * loading bytes * Adding tp types to state * deploy and preload tps * bug fix * adding spltokens array and func to map tokenaddress to program * token pool split in changesets * deprecating old token pool, just commenting first * lint * adding wsol to spltokens * removing consts * using same type * changes * removing token program name from billinh * removing old consts * changing type and using index 1 * renaming and adding config * cascading changes * removing redundant const * cascading changes and adding billing through config * adding validate * renaming packages * linting * include spltokens in validation * abstract deployToken in test * fix logging * dont add link and wsol to token array * use token symbol as input * lint and bug * bug * lint * fix --- .../changeset/solana/cs_add_remote_chain.go | 67 ++-- .../ccip/changeset/solana/cs_billing.go | 86 ++--- .../changeset/solana/cs_chain_contracts.go | 26 +- .../solana/cs_chain_contracts_test.go | 259 +++++++-------- .../ccip/changeset/solana/cs_deploy_chain.go | 195 +++++++---- .../changeset/solana/cs_deploy_chain_test.go | 127 ++++---- .../ccip/changeset/solana/cs_set_ocr3.go | 3 +- .../ccip/changeset/solana/cs_solana_token.go | 25 +- .../changeset/solana/cs_solana_token_test.go | 6 +- .../solana/cs_token_admin_registry.go | 14 +- .../ccip/changeset/solana/cs_token_pool.go | 302 +++++++++++++----- ...ransfer_ccip_to_mcms_with_timelock_test.go | 31 +- deployment/ccip/changeset/solana_state.go | 77 +++-- deployment/ccip/changeset/state.go | 34 +- .../changeset/testhelpers/test_environment.go | 58 +++- .../changeset/testhelpers/test_helpers.go | 66 ++-- .../ccip/changeset/v1_6/cs_ccip_home.go | 4 +- .../ccip/changeset/v1_6/cs_chain_contracts.go | 9 +- deployment/environment/memory/chain.go | 20 +- deployment/solana_chain.go | 11 - 20 files changed, 855 insertions(+), 565 deletions(-) diff --git a/deployment/ccip/changeset/solana/cs_add_remote_chain.go b/deployment/ccip/changeset/solana/cs_add_remote_chain.go index 6d84816ad22..fcf8ffe1465 100644 --- a/deployment/ccip/changeset/solana/cs_add_remote_chain.go +++ b/deployment/ccip/changeset/solana/cs_add_remote_chain.go @@ -15,10 +15,8 @@ import ( solCommonUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" - chainsel "github.com/smartcontractkit/chain-selectors" - "github.com/smartcontractkit/chainlink/deployment" - cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + ccipChangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" commonState "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" ) @@ -30,7 +28,7 @@ type AddRemoteChainToSolanaConfig struct { UpdatesByChain map[uint64]RemoteChainConfigSolana // Disallow mixing MCMS/non-MCMS per chain for simplicity. // (can still be achieved by calling this function multiple times) - MCMS *cs.MCMSConfig + MCMS *ccipChangeset.MCMSConfig } type RemoteChainConfigSolana struct { @@ -42,7 +40,7 @@ type RemoteChainConfigSolana struct { } func (cfg AddRemoteChainToSolanaConfig) Validate(e deployment.Environment) error { - state, err := cs.LoadOnchainState(e) + state, err := ccipChangeset.LoadOnchainState(e) if err != nil { return fmt.Errorf("failed to load onchain state: %w", err) } @@ -84,7 +82,7 @@ func (cfg AddRemoteChainToSolanaConfig) Validate(e deployment.Environment) error if remote == routerConfigAccount.SvmChainSelector { return fmt.Errorf("cannot add remote chain %d with same chain selector as current chain %d", remote, cfg.ChainSelector) } - if err := state.ValidateRamp(remote, cs.OnRamp); err != nil { + if err := state.ValidateRamp(remote, ccipChangeset.OnRamp); err != nil { return err } routerDestChainPDA, err := solState.FindDestChainStatePDA(remote, chainState.Router) @@ -106,7 +104,7 @@ func AddRemoteChainToSolana(e deployment.Environment, cfg AddRemoteChainToSolana return deployment.ChangesetOutput{}, err } - s, err := cs.LoadOnchainState(e) + s, err := ccipChangeset.LoadOnchainState(e) if err != nil { return deployment.ChangesetOutput{}, err } @@ -121,7 +119,7 @@ func AddRemoteChainToSolana(e deployment.Environment, cfg AddRemoteChainToSolana func doAddRemoteChainToSolana( e deployment.Environment, - s cs.CCIPOnChainState, + s ccipChangeset.CCIPOnChainState, chainSel uint64, updates map[uint64]RemoteChainConfigSolana, ab deployment.AddressBook) error { @@ -134,33 +132,39 @@ func doAddRemoteChainToSolana( for remoteChainSel, update := range updates { var onRampBytes [64]byte // already verified, skipping errcheck - remoteChainFamily, _ := chainsel.GetSelectorFamily(remoteChainSel) - var addressBytes []byte - switch remoteChainFamily { - case chainsel.FamilySolana: - addressBytes, _ = s.SolChains[remoteChainSel].OnRampBytes() - case chainsel.FamilyEVM: - addressBytes, _ = s.Chains[remoteChainSel].OnRampBytes() - } + addressBytes, _ := s.GetOnRampAddressBytes(remoteChainSel) addressBytes = common.LeftPadBytes(addressBytes, 64) copy(onRampBytes[:], addressBytes) // verified while loading state - fqDestChainPDA, _, _ := solState.FindFqDestChainPDA(remoteChainSel, feeQuoterID) - routerDestChainPDA, _ := solState.FindDestChainStatePDA(remoteChainSel, ccipRouterID) - offRampSourceChainPDA, _, _ := solState.FindOfframpSourceChainPDA(remoteChainSel, s.SolChains[chainSel].OffRamp) + fqRemoteChainPDA, _, _ := solState.FindFqDestChainPDA(remoteChainSel, feeQuoterID) + routerRemoteStatePDA, _ := solState.FindDestChainStatePDA(remoteChainSel, ccipRouterID) + offRampRemoteStatePDA, _, _ := solState.FindOfframpSourceChainPDA(remoteChainSel, offRampID) + allowedOffRampRemotePDA, _ := solState.FindAllowedOfframpPDA(remoteChainSel, offRampID, ccipRouterID) lookUpTableEntries = append(lookUpTableEntries, - fqDestChainPDA, - routerDestChainPDA, - offRampSourceChainPDA, + fqRemoteChainPDA, + routerRemoteStatePDA, + offRampRemoteStatePDA, ) solRouter.SetProgramID(ccipRouterID) routerIx, err := solRouter.NewAddChainSelectorInstruction( remoteChainSel, update.RouterDestinationConfig, - routerDestChainPDA, + routerRemoteStatePDA, + s.SolChains[chainSel].RouterConfigPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + ).ValidateAndBuild() + if err != nil { + return fmt.Errorf("failed to generate instructions: %w", err) + } + + routerOfframpIx, err := solRouter.NewAddOfframpInstruction( + remoteChainSel, + offRampID, + allowedOffRampRemotePDA, s.SolChains[chainSel].RouterConfigPDA, chain.DeployerKey.PublicKey(), solana.SystemProgramID, @@ -174,7 +178,7 @@ func doAddRemoteChainToSolana( remoteChainSel, update.FeeQuoterDestinationConfig, s.SolChains[chainSel].FeeQuoterConfigPDA, - fqDestChainPDA, + fqRemoteChainPDA, chain.DeployerKey.PublicKey(), solana.SystemProgramID, ).ValidateAndBuild() @@ -190,37 +194,38 @@ func doAddRemoteChainToSolana( offRampIx, err := solOffRamp.NewAddSourceChainInstruction( remoteChainSel, validSourceChainConfig, - offRampSourceChainPDA, + offRampRemoteStatePDA, s.SolChains[chainSel].OffRampConfigPDA, chain.DeployerKey.PublicKey(), solana.SystemProgramID, ).ValidateAndBuild() + if err != nil { return fmt.Errorf("failed to generate instructions: %w", err) } - err = chain.Confirm([]solana.Instruction{routerIx, feeQuoterIx, offRampIx}) + err = chain.Confirm([]solana.Instruction{routerIx, routerOfframpIx, feeQuoterIx, offRampIx}) if err != nil { return fmt.Errorf("failed to confirm instructions: %w", err) } - tv := deployment.NewTypeAndVersion(cs.RemoteDest, deployment.Version1_0_0) + tv := deployment.NewTypeAndVersion(ccipChangeset.RemoteDest, deployment.Version1_0_0) remoteChainSelStr := strconv.FormatUint(remoteChainSel, 10) tv.AddLabel(remoteChainSelStr) - err = ab.Save(chainSel, routerDestChainPDA.String(), tv) + err = ab.Save(chainSel, routerRemoteStatePDA.String(), tv) if err != nil { return fmt.Errorf("failed to save dest chain state to address book: %w", err) } - tv = deployment.NewTypeAndVersion(cs.RemoteSource, deployment.Version1_0_0) + tv = deployment.NewTypeAndVersion(ccipChangeset.RemoteSource, deployment.Version1_0_0) tv.AddLabel(remoteChainSelStr) - err = ab.Save(chainSel, offRampSourceChainPDA.String(), tv) + err = ab.Save(chainSel, allowedOffRampRemotePDA.String(), tv) if err != nil { return fmt.Errorf("failed to save source chain state to address book: %w", err) } } - addressLookupTable, err := cs.FetchOfframpLookupTable(e.GetContext(), chain, offRampID) + addressLookupTable, err := ccipChangeset.FetchOfframpLookupTable(e.GetContext(), chain, offRampID) if err != nil { return fmt.Errorf("failed to get offramp reference addresses: %w", err) } diff --git a/deployment/ccip/changeset/solana/cs_billing.go b/deployment/ccip/changeset/solana/cs_billing.go index 2c68bea9a02..5eeffde3e2f 100644 --- a/deployment/ccip/changeset/solana/cs_billing.go +++ b/deployment/ccip/changeset/solana/cs_billing.go @@ -14,18 +14,17 @@ import ( ata "github.com/gagliardetto/solana-go/programs/associated-token-account" "github.com/smartcontractkit/chainlink/deployment" - cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + ccipChangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" ) -var _ deployment.ChangeSet[BillingTokenConfig] = AddBillingToken +var _ deployment.ChangeSet[BillingTokenConfig] = AddBillingTokenChangeset var _ deployment.ChangeSet[BillingTokenForRemoteChainConfig] = AddBillingTokenForRemoteChain // ADD BILLING TOKEN type BillingTokenConfig struct { - ChainSelector uint64 - TokenPubKey string - TokenProgramName string - Config solFeeQuoter.BillingTokenConfig + ChainSelector uint64 + TokenPubKey string + Config solFeeQuoter.BillingTokenConfig } func (cfg BillingTokenConfig) Validate(e deployment.Environment) error { @@ -33,16 +32,16 @@ func (cfg BillingTokenConfig) Validate(e deployment.Environment) error { if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { return err } - if _, err := GetTokenProgramID(cfg.TokenProgramName); err != nil { - return err - } chain := e.SolChains[cfg.ChainSelector] - state, _ := cs.LoadOnchainState(e) + state, _ := ccipChangeset.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] if err := validateFeeQuoterConfig(chain, chainState); err != nil { return err } + if _, err := chainState.TokenToTokenProgram(tokenPubKey); err != nil { + return err + } // check if already setup billingConfigPDA, _, err := solState.FindFqBillingTokenConfigPDA(tokenPubKey, chainState.FeeQuoter) if err != nil { @@ -55,32 +54,23 @@ func (cfg BillingTokenConfig) Validate(e deployment.Environment) error { return nil } -func AddBillingToken(e deployment.Environment, cfg BillingTokenConfig) (deployment.ChangesetOutput, error) { - if err := cfg.Validate(e); err != nil { - return deployment.ChangesetOutput{}, err - } - chain, ok := e.SolChains[cfg.ChainSelector] - if !ok { - return deployment.ChangesetOutput{}, fmt.Errorf("chain selector %d not found in environment", cfg.ChainSelector) - } - state, _ := cs.LoadOnchainState(e) - chainState := state.SolChains[cfg.ChainSelector] - tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) - // verified - tokenprogramID, _ := GetTokenProgramID(cfg.TokenProgramName) +func AddBillingToken( + e deployment.Environment, + chain deployment.SolChain, + chainState ccipChangeset.SolCCIPChainState, + billingConfig solFeeQuoter.BillingTokenConfig, +) error { + tokenPubKey := solana.MustPublicKeyFromBase58(billingConfig.Mint.String()) tokenBillingPDA, _, _ := solState.FindFqBillingTokenConfigPDA(tokenPubKey, chainState.FeeQuoter) - - // addressing errcheck in the next PR billingSignerPDA, _, _ := solState.FindFeeBillingSignerPDA(chainState.Router) - token2022Receiver, _, _ := solTokenUtil.FindAssociatedTokenAddress(tokenprogramID, tokenPubKey, billingSignerPDA) - - e.Logger.Infow("chainState.FeeQuoterConfigPDA", "feeQuoterConfigPDA", chainState.FeeQuoterConfigPDA.String()) - solFeeQuoter.SetProgramID(chainState.FeeQuoter) + tokenProgramID, _ := chainState.TokenToTokenProgram(tokenPubKey) + token2022Receiver, _, _ := solTokenUtil.FindAssociatedTokenAddress(tokenProgramID, tokenPubKey, billingSignerPDA) + feeQuoterConfigPDA, _, _ := solState.FindFqConfigPDA(chainState.FeeQuoter) ixConfig, cerr := solFeeQuoter.NewAddBillingTokenConfigInstruction( - cfg.Config, - chainState.FeeQuoterConfigPDA, + billingConfig, + feeQuoterConfigPDA, tokenBillingPDA, - tokenprogramID, + tokenProgramID, tokenPubKey, token2022Receiver, chain.DeployerKey.PublicKey(), // ccip admin @@ -89,15 +79,33 @@ func AddBillingToken(e deployment.Environment, cfg BillingTokenConfig) (deployme solana.SystemProgramID, ).ValidateAndBuild() if cerr != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", cerr) + return fmt.Errorf("failed to generate instructions: %w", cerr) } - instructions := []solana.Instruction{ixConfig} if err := chain.Confirm(instructions); err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) + return fmt.Errorf("failed to confirm instructions: %w", err) } + return nil +} + +func AddBillingTokenChangeset(e deployment.Environment, cfg BillingTokenConfig) (deployment.ChangesetOutput, error) { + if err := cfg.Validate(e); err != nil { + return deployment.ChangesetOutput{}, err + } + chain := e.SolChains[cfg.ChainSelector] + state, _ := ccipChangeset.LoadOnchainState(e) + chainState := state.SolChains[cfg.ChainSelector] + + solFeeQuoter.SetProgramID(chainState.FeeQuoter) + + if err := AddBillingToken(e, chain, chainState, cfg.Config); err != nil { + return deployment.ChangesetOutput{}, err + } + + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + tokenBillingPDA, _, _ := solState.FindFqBillingTokenConfigPDA(tokenPubKey, chainState.FeeQuoter) - addressLookupTable, err := cs.FetchOfframpLookupTable(e.GetContext(), chain, chainState.OffRamp) + addressLookupTable, err := ccipChangeset.FetchOfframpLookupTable(e.GetContext(), chain, chainState.OffRamp) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to get offramp reference addresses: %w", err) } @@ -129,7 +137,7 @@ func (cfg BillingTokenForRemoteChainConfig) Validate(e deployment.Environment) e if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { return err } - state, _ := cs.LoadOnchainState(e) + state, _ := ccipChangeset.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] chain := e.SolChains[cfg.ChainSelector] if err := validateFeeQuoterConfig(chain, chainState); err != nil { @@ -153,7 +161,7 @@ func AddBillingTokenForRemoteChain(e deployment.Environment, cfg BillingTokenFor } chain := e.SolChains[cfg.ChainSelector] - state, _ := cs.LoadOnchainState(e) + state, _ := ccipChangeset.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) remoteBillingPDA, _, _ := solState.FindFqPerChainPerTokenConfigPDA(cfg.RemoteChainSelector, tokenPubKey, chainState.FeeQuoter) @@ -175,7 +183,7 @@ func AddBillingTokenForRemoteChain(e deployment.Environment, cfg BillingTokenFor return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) } - addressLookupTable, err := cs.FetchOfframpLookupTable(e.GetContext(), chain, chainState.OffRamp) + addressLookupTable, err := ccipChangeset.FetchOfframpLookupTable(e.GetContext(), chain, chainState.OffRamp) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to get offramp reference addresses: %w", err) } diff --git a/deployment/ccip/changeset/solana/cs_chain_contracts.go b/deployment/ccip/changeset/solana/cs_chain_contracts.go index a7978504c06..db29b12642e 100644 --- a/deployment/ccip/changeset/solana/cs_chain_contracts.go +++ b/deployment/ccip/changeset/solana/cs_chain_contracts.go @@ -12,13 +12,13 @@ import ( solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + ccipChangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" ) var _ deployment.ChangeSet[v1_6.SetOCR3OffRampConfig] = SetOCR3ConfigSolana var _ deployment.ChangeSet[AddRemoteChainToSolanaConfig] = AddRemoteChainToSolana -var _ deployment.ChangeSet[BillingTokenConfig] = AddBillingToken +var _ deployment.ChangeSet[BillingTokenConfig] = AddBillingTokenChangeset var _ deployment.ChangeSet[BillingTokenForRemoteChainConfig] = AddBillingTokenForRemoteChain var _ deployment.ChangeSet[RegisterTokenAdminRegistryConfig] = RegisterTokenAdminRegistry var _ deployment.ChangeSet[TransferAdminRoleTokenAdminRegistryConfig] = TransferAdminRoleTokenAdminRegistry @@ -27,15 +27,15 @@ var _ deployment.ChangeSet[SetFeeAggregatorConfig] = SetFeeAggregator // HELPER FUNCTIONS // GetTokenProgramID returns the program ID for the given token program name -func GetTokenProgramID(programName string) (solana.PublicKey, error) { - tokenPrograms := map[string]solana.PublicKey{ - deployment.SPLTokens: solana.TokenProgramID, // not used yet - deployment.SPL2022Tokens: solana.Token2022ProgramID, +func GetTokenProgramID(programName deployment.ContractType) (solana.PublicKey, error) { + tokenPrograms := map[deployment.ContractType]solana.PublicKey{ + ccipChangeset.SPLTokens: solana.TokenProgramID, + ccipChangeset.SPL2022Tokens: solana.Token2022ProgramID, } programID, ok := tokenPrograms[programName] if !ok { - return solana.PublicKey{}, fmt.Errorf("invalid token program: %s. Must be one of: %s, %s", programName, deployment.SPLTokens, deployment.SPL2022Tokens) + return solana.PublicKey{}, fmt.Errorf("invalid token program: %s. Must be one of: %s, %s", programName, ccipChangeset.SPLTokens, ccipChangeset.SPL2022Tokens) } return programID, nil } @@ -45,7 +45,7 @@ func commonValidation(e deployment.Environment, selector uint64, tokenPubKey sol if !ok { return fmt.Errorf("chain selector %d not found in environment", selector) } - state, err := changeset.LoadOnchainState(e) + state, err := ccipChangeset.LoadOnchainState(e) if err != nil { return fmt.Errorf("failed to load onchain state: %w", err) } @@ -57,7 +57,9 @@ func commonValidation(e deployment.Environment, selector uint64, tokenPubKey sol return nil } exists := false - for _, token := range chainState.SPL2022Tokens { + allTokens := chainState.SPL2022Tokens + allTokens = append(allTokens, chainState.SPLTokens...) + for _, token := range allTokens { if token.Equals(tokenPubKey) { exists = true break @@ -69,7 +71,7 @@ func commonValidation(e deployment.Environment, selector uint64, tokenPubKey sol return nil } -func validateRouterConfig(chain deployment.SolChain, chainState changeset.SolCCIPChainState) error { +func validateRouterConfig(chain deployment.SolChain, chainState ccipChangeset.SolCCIPChainState) error { if chainState.Router.IsZero() { return fmt.Errorf("router not found in existing state, deploy the router first for chain %d", chain.Selector) } @@ -82,7 +84,7 @@ func validateRouterConfig(chain deployment.SolChain, chainState changeset.SolCCI return nil } -func validateFeeQuoterConfig(chain deployment.SolChain, chainState changeset.SolCCIPChainState) error { +func validateFeeQuoterConfig(chain deployment.SolChain, chainState ccipChangeset.SolCCIPChainState) error { if chainState.FeeQuoter.IsZero() { return fmt.Errorf("fee quoter not found in existing state, deploy the fee quoter first for chain %d", chain.Selector) } @@ -95,7 +97,7 @@ func validateFeeQuoterConfig(chain deployment.SolChain, chainState changeset.Sol return nil } -func validateOffRampConfig(chain deployment.SolChain, chainState changeset.SolCCIPChainState) error { +func validateOffRampConfig(chain deployment.SolChain, chainState ccipChangeset.SolCCIPChainState) error { if chainState.OffRamp.IsZero() { return fmt.Errorf("offramp not found in existing state, deploy the offramp first for chain %d", chain.Selector) } diff --git a/deployment/ccip/changeset/solana/cs_chain_contracts_test.go b/deployment/ccip/changeset/solana/cs_chain_contracts_test.go index a9ce0721c7a..5132bbec813 100644 --- a/deployment/ccip/changeset/solana/cs_chain_contracts_test.go +++ b/deployment/ccip/changeset/solana/cs_chain_contracts_test.go @@ -7,6 +7,7 @@ import ( "github.com/gagliardetto/solana-go" "github.com/stretchr/testify/require" + solBaseTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/base_token_pool" solRouter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" solFeeQuoter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" solTestTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/test_token_pool" @@ -17,7 +18,7 @@ import ( "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" ccipChangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - changeset_solana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" + ccipChangesetSolana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" @@ -25,6 +26,25 @@ import ( commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" ) +func deployToken(t *testing.T, tenv deployment.Environment, solChain uint64) (deployment.Environment, solana.PublicKey, error) { + e, err := commonchangeset.Apply(t, tenv, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipChangesetSolana.DeploySolanaToken), + ccipChangesetSolana.DeploySolanaTokenConfig{ + ChainSelector: solChain, + TokenProgramName: ccipChangeset.SPL2022Tokens, + TokenDecimals: 9, + TokenSymbol: "TEST_TOKEN", + }, + ), + ) + require.NoError(t, err) + state, err := ccipChangeset.LoadOnchainStateSolana(e) + require.NoError(t, err) + tokenAddress := state.SolChains[solChain].SPL2022Tokens[0] + return e, tokenAddress, err +} + func TestAddRemoteChain(t *testing.T) { t.Parallel() ctx := testcontext.Get(t) @@ -54,10 +74,10 @@ func TestAddRemoteChain(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset_solana.AddRemoteChainToSolana), - changeset_solana.AddRemoteChainToSolanaConfig{ + deployment.CreateLegacyChangeSet(ccipChangesetSolana.AddRemoteChainToSolana), + ccipChangesetSolana.AddRemoteChainToSolanaConfig{ ChainSelector: solChain, - UpdatesByChain: map[uint64]changeset_solana.RemoteChainConfigSolana{ + UpdatesByChain: map[uint64]ccipChangesetSolana.RemoteChainConfigSolana{ evmChain: { EnabledAsSource: true, RouterDestinationConfig: solRouter.DestChainConfig{}, @@ -108,87 +128,87 @@ func TestAddTokenPool(t *testing.T) { evmChain := tenv.Env.AllChainSelectors()[0] solChain := tenv.Env.AllChainSelectorsSolana()[0] - - e, err := commonchangeset.Apply(t, tenv.Env, nil, - commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset_solana.DeploySolanaToken), - changeset_solana.DeploySolanaTokenConfig{ - ChainSelector: solChain, - TokenProgramName: deployment.SPL2022Tokens, - TokenDecimals: 9, - }, - ), - ) + e, newTokenAddress, err := deployToken(t, tenv.Env, solChain) require.NoError(t, err) - state, err := ccipChangeset.LoadOnchainStateSolana(e) require.NoError(t, err) - newTokenAddress := state.SolChains[solChain].SPL2022Tokens[0] - - remoteConfig := solTestTokenPool.RemoteConfig{ + remoteConfig := solBaseTokenPool.RemoteConfig{ PoolAddresses: []solTestTokenPool.RemoteAddress{{Address: []byte{1, 2, 3}}}, TokenAddress: solTestTokenPool.RemoteAddress{Address: []byte{4, 5, 6}}, Decimals: 9, } - inboundConfig := solTestTokenPool.RateLimitConfig{ + inboundConfig := solBaseTokenPool.RateLimitConfig{ Enabled: true, Capacity: uint64(1000), Rate: 1, } - outboundConfig := solTestTokenPool.RateLimitConfig{ + outboundConfig := solBaseTokenPool.RateLimitConfig{ Enabled: false, Capacity: 0, Rate: 0, } - tokenMap := map[string]solana.PublicKey{ - deployment.SPL2022Tokens: newTokenAddress, - deployment.SPLTokens: state.SolChains[solChain].WSOL, + tokenMap := map[deployment.ContractType]solana.PublicKey{ + ccipChangeset.SPL2022Tokens: newTokenAddress, + ccipChangeset.SPLTokens: state.SolChains[solChain].WSOL, } - for tokenProgramName, tokenAddress := range tokenMap { - e, err = commonchangeset.Apply(t, e, nil, - commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset_solana.AddTokenPool), - changeset_solana.TokenPoolConfig{ - ChainSelector: solChain, - TokenPubKey: tokenAddress.String(), - TokenProgramName: tokenProgramName, - PoolType: solTestTokenPool.LockAndRelease_PoolType, - // this works for testing, but if we really want some other authority we need to pass in a private key for signing purposes - Authority: e.SolChains[solChain].DeployerKey.PublicKey().String(), - }, - ), - commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset_solana.SetupTokenPoolForRemoteChain), - changeset_solana.RemoteChainTokenPoolConfig{ - SolChainSelector: solChain, - RemoteChainSelector: evmChain, - SolTokenPubKey: tokenAddress.String(), - RemoteConfig: remoteConfig, - InboundRateLimit: inboundConfig, - OutboundRateLimit: outboundConfig, - }, - ), - ) - require.NoError(t, err) - - // test AddTokenPool results - poolConfigPDA, err := solTokenUtil.TokenPoolConfigAddress(tokenAddress, state.SolChains[solChain].TokenPool) - require.NoError(t, err) - var configAccount solTestTokenPool.State - err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, poolConfigPDA, &configAccount) - require.NoError(t, err) - require.Equal(t, solTestTokenPool.LockAndRelease_PoolType, configAccount.PoolType) - require.Equal(t, tokenAddress, configAccount.Config.Mint) - - // test SetupTokenPoolForRemoteChain results - remoteChainConfigPDA, _, _ := solTokenUtil.TokenPoolChainConfigPDA(evmChain, tokenAddress, state.SolChains[solChain].TokenPool) - var remoteChainConfigAccount solTestTokenPool.ChainConfig - err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, remoteChainConfigPDA, &remoteChainConfigAccount) - require.NoError(t, err) - require.Equal(t, uint8(9), remoteChainConfigAccount.Base.Remote.Decimals) + type poolTestType struct { + poolType solTestTokenPool.PoolType + poolAddress solana.PublicKey + } + testCases := []poolTestType{ + { + poolType: solTestTokenPool.BurnAndMint_PoolType, + poolAddress: state.SolChains[solChain].BurnMintTokenPool, + }, + { + poolType: solTestTokenPool.LockAndRelease_PoolType, + poolAddress: state.SolChains[solChain].LockReleaseTokenPool, + }, } + for _, testCase := range testCases { + for _, tokenAddress := range tokenMap { + e, err = commonchangeset.Apply(t, e, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipChangesetSolana.AddTokenPool), + ccipChangesetSolana.TokenPoolConfig{ + ChainSelector: solChain, + TokenPubKey: tokenAddress.String(), + PoolType: testCase.poolType, + // this works for testing, but if we really want some other authority we need to pass in a private key for signing purposes + Authority: tenv.Env.SolChains[solChain].DeployerKey.PublicKey().String(), + }, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipChangesetSolana.SetupTokenPoolForRemoteChain), + ccipChangesetSolana.RemoteChainTokenPoolConfig{ + SolChainSelector: solChain, + RemoteChainSelector: evmChain, + SolTokenPubKey: tokenAddress.String(), + RemoteConfig: remoteConfig, + InboundRateLimit: inboundConfig, + OutboundRateLimit: outboundConfig, + PoolType: testCase.poolType, + }, + ), + ) + require.NoError(t, err) + // test AddTokenPool results + configAccount := solTestTokenPool.State{} + poolConfigPDA, _ := solTokenUtil.TokenPoolConfigAddress(tokenAddress, testCase.poolAddress) + err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, poolConfigPDA, &configAccount) + require.NoError(t, err) + require.Equal(t, tokenAddress, configAccount.Config.Mint) + // test SetupTokenPoolForRemoteChain results + remoteChainConfigPDA, _, _ := solTokenUtil.TokenPoolChainConfigPDA(evmChain, tokenAddress, testCase.poolAddress) + var remoteChainConfigAccount solTestTokenPool.ChainConfig + err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, remoteChainConfigPDA, &remoteChainConfigAccount) + require.NoError(t, err) + require.Equal(t, uint8(9), remoteChainConfigAccount.Base.Remote.Decimals) + } + } + } func TestBilling(t *testing.T) { @@ -199,21 +219,10 @@ func TestBilling(t *testing.T) { evmChain := tenv.Env.AllChainSelectors()[0] solChain := tenv.Env.AllChainSelectorsSolana()[0] - e, err := commonchangeset.Apply(t, tenv.Env, nil, - commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset_solana.DeploySolanaToken), - changeset_solana.DeploySolanaTokenConfig{ - ChainSelector: solChain, - TokenProgramName: deployment.SPL2022Tokens, - TokenDecimals: 9, - }, - ), - ) + e, tokenAddress, err := deployToken(t, tenv.Env, solChain) require.NoError(t, err) - state, err := ccipChangeset.LoadOnchainStateSolana(e) require.NoError(t, err) - tokenAddress := state.SolChains[solChain].SPL2022Tokens[0] validTimestamp := int64(100) value := [28]uint8{} bigNum, ok := new(big.Int).SetString("19816680000000000000", 10) @@ -221,11 +230,10 @@ func TestBilling(t *testing.T) { bigNum.FillBytes(value[:]) e, err = commonchangeset.Apply(t, e, nil, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset_solana.AddBillingToken), - changeset_solana.BillingTokenConfig{ - ChainSelector: solChain, - TokenPubKey: tokenAddress.String(), - TokenProgramName: deployment.SPL2022Tokens, + deployment.CreateLegacyChangeSet(ccipChangesetSolana.AddBillingTokenChangeset), + ccipChangesetSolana.BillingTokenConfig{ + ChainSelector: solChain, + TokenPubKey: tokenAddress.String(), Config: solFeeQuoter.BillingTokenConfig{ Enabled: true, Mint: tokenAddress, @@ -238,8 +246,8 @@ func TestBilling(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset_solana.AddBillingTokenForRemoteChain), - changeset_solana.BillingTokenForRemoteChainConfig{ + deployment.CreateLegacyChangeSet(ccipChangesetSolana.AddBillingTokenForRemoteChain), + ccipChangesetSolana.BillingTokenForRemoteChainConfig{ ChainSelector: solChain, RemoteChainSelector: evmChain, TokenPubKey: tokenAddress.String(), @@ -275,48 +283,34 @@ func TestTokenAdminRegistry(t *testing.T) { t.Parallel() ctx := testcontext.Get(t) tenv, _ := testhelpers.NewMemoryEnvironment(t, testhelpers.WithSolChains(1)) - solChain := tenv.Env.AllChainSelectorsSolana()[0] - - e, err := commonchangeset.Apply(t, tenv.Env, nil, - commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset_solana.DeploySolanaToken), - changeset_solana.DeploySolanaTokenConfig{ - ChainSelector: solChain, - TokenProgramName: deployment.SPL2022Tokens, - TokenDecimals: 9, - }, - ), - ) + e, tokenAddress, err := deployToken(t, tenv.Env, solChain) require.NoError(t, err) - state, err := ccipChangeset.LoadOnchainStateSolana(e) require.NoError(t, err) - tokenAddress := state.SolChains[solChain].SPL2022Tokens[0] - tokenAdminRegistryAdminPrivKey, _ := solana.NewRandomPrivateKey() - - // We have to do run the ViaOwnerInstruction testcase for linkToken as we already register a PDA for tokenAddress in the previous testcase linkTokenAddress := state.SolChains[solChain].LinkToken + tokenAdminRegistryAdminPrivKey, _ := solana.NewRandomPrivateKey() + e, err = commonchangeset.Apply(t, e, nil, commonchangeset.Configure( // register token admin registry for tokenAddress via admin instruction - deployment.CreateLegacyChangeSet(changeset_solana.RegisterTokenAdminRegistry), - changeset_solana.RegisterTokenAdminRegistryConfig{ + deployment.CreateLegacyChangeSet(ccipChangesetSolana.RegisterTokenAdminRegistry), + ccipChangesetSolana.RegisterTokenAdminRegistryConfig{ ChainSelector: solChain, TokenPubKey: tokenAddress.String(), TokenAdminRegistryAdmin: tokenAdminRegistryAdminPrivKey.PublicKey().String(), - RegisterType: changeset_solana.ViaGetCcipAdminInstruction, + RegisterType: ccipChangesetSolana.ViaGetCcipAdminInstruction, }, ), commonchangeset.Configure( // register token admin registry for linkToken via owner instruction - deployment.CreateLegacyChangeSet(changeset_solana.RegisterTokenAdminRegistry), - changeset_solana.RegisterTokenAdminRegistryConfig{ + deployment.CreateLegacyChangeSet(ccipChangesetSolana.RegisterTokenAdminRegistry), + ccipChangesetSolana.RegisterTokenAdminRegistryConfig{ ChainSelector: solChain, TokenPubKey: linkTokenAddress.String(), TokenAdminRegistryAdmin: tokenAdminRegistryAdminPrivKey.PublicKey().String(), - RegisterType: changeset_solana.ViaOwnerInstruction, + RegisterType: ccipChangesetSolana.ViaOwnerInstruction, }, ), ) @@ -339,8 +333,8 @@ func TestTokenAdminRegistry(t *testing.T) { e, err = commonchangeset.Apply(t, e, nil, commonchangeset.Configure( // accept admin role for tokenAddress - deployment.CreateLegacyChangeSet(changeset_solana.AcceptAdminRoleTokenAdminRegistry), - changeset_solana.AcceptAdminRoleTokenAdminRegistryConfig{ + deployment.CreateLegacyChangeSet(ccipChangesetSolana.AcceptAdminRoleTokenAdminRegistry), + ccipChangesetSolana.AcceptAdminRoleTokenAdminRegistryConfig{ ChainSelector: solChain, TokenPubKey: tokenAddress.String(), NewRegistryAdminPrivateKey: tokenAdminRegistryAdminPrivKey.String(), @@ -358,8 +352,8 @@ func TestTokenAdminRegistry(t *testing.T) { e, err = commonchangeset.Apply(t, e, nil, commonchangeset.Configure( // transfer admin role for tokenAddress - deployment.CreateLegacyChangeSet(changeset_solana.TransferAdminRoleTokenAdminRegistry), - changeset_solana.TransferAdminRoleTokenAdminRegistryConfig{ + deployment.CreateLegacyChangeSet(ccipChangesetSolana.TransferAdminRoleTokenAdminRegistry), + ccipChangesetSolana.TransferAdminRoleTokenAdminRegistryConfig{ ChainSelector: solChain, TokenPubKey: tokenAddress.String(), NewRegistryAdminPublicKey: newTokenAdminRegistryAdminPrivKey.PublicKey().String(), @@ -377,40 +371,22 @@ func TestPoolLookupTable(t *testing.T) { t.Parallel() ctx := testcontext.Get(t) tenv, _ := testhelpers.NewMemoryEnvironment(t, testhelpers.WithSolChains(1)) - solChain := tenv.Env.AllChainSelectorsSolana()[0] - e, err := commonchangeset.Apply(t, tenv.Env, nil, - commonchangeset.Configure( - // deploy token - deployment.CreateLegacyChangeSet(changeset_solana.DeploySolanaToken), - changeset_solana.DeploySolanaTokenConfig{ - ChainSelector: solChain, - TokenProgramName: deployment.SPL2022Tokens, - TokenDecimals: 9, - }, - ), - ) - require.NoError(t, err) - - state, err := ccipChangeset.LoadOnchainStateSolana(e) + e, tokenAddress, err := deployToken(t, tenv.Env, solChain) require.NoError(t, err) - tokenAddress := state.SolChains[solChain].SPL2022Tokens[0] - e, err = commonchangeset.Apply(t, e, nil, commonchangeset.Configure( // add token pool lookup table - deployment.CreateLegacyChangeSet(changeset_solana.AddTokenPoolLookupTable), - changeset_solana.TokenPoolLookupTableConfig{ + deployment.CreateLegacyChangeSet(ccipChangesetSolana.AddTokenPoolLookupTable), + ccipChangesetSolana.TokenPoolLookupTableConfig{ ChainSelector: solChain, TokenPubKey: tokenAddress.String(), - TokenProgram: deployment.SPL2022Tokens, }, ), ) require.NoError(t, err) - - state, err = ccipChangeset.LoadOnchainStateSolana(e) + state, err := ccipChangeset.LoadOnchainStateSolana(e) require.NoError(t, err) lookupTablePubKey := state.SolChains[solChain].TokenPoolLookupTable[tokenAddress] @@ -424,18 +400,18 @@ func TestPoolLookupTable(t *testing.T) { e, err = commonchangeset.Apply(t, e, nil, commonchangeset.Configure( // register token admin registry for linkToken via owner instruction - deployment.CreateLegacyChangeSet(changeset_solana.RegisterTokenAdminRegistry), - changeset_solana.RegisterTokenAdminRegistryConfig{ + deployment.CreateLegacyChangeSet(ccipChangesetSolana.RegisterTokenAdminRegistry), + ccipChangesetSolana.RegisterTokenAdminRegistryConfig{ ChainSelector: solChain, TokenPubKey: tokenAddress.String(), TokenAdminRegistryAdmin: tokenAdminRegistryAdminPrivKey.PublicKey().String(), - RegisterType: changeset_solana.ViaGetCcipAdminInstruction, + RegisterType: ccipChangesetSolana.ViaGetCcipAdminInstruction, }, ), commonchangeset.Configure( // accept admin role for tokenAddress - deployment.CreateLegacyChangeSet(changeset_solana.AcceptAdminRoleTokenAdminRegistry), - changeset_solana.AcceptAdminRoleTokenAdminRegistryConfig{ + deployment.CreateLegacyChangeSet(ccipChangesetSolana.AcceptAdminRoleTokenAdminRegistry), + ccipChangesetSolana.AcceptAdminRoleTokenAdminRegistryConfig{ ChainSelector: solChain, TokenPubKey: tokenAddress.String(), NewRegistryAdminPrivateKey: tokenAdminRegistryAdminPrivKey.String(), @@ -443,11 +419,10 @@ func TestPoolLookupTable(t *testing.T) { ), commonchangeset.Configure( // set pool -> this updates tokenAdminRegistryPDA, hence above changeset is required - deployment.CreateLegacyChangeSet(changeset_solana.SetPool), - changeset_solana.SetPoolConfig{ + deployment.CreateLegacyChangeSet(ccipChangesetSolana.SetPool), + ccipChangesetSolana.SetPoolConfig{ ChainSelector: solChain, TokenPubKey: tokenAddress.String(), - PoolLookupTable: lookupTablePubKey.String(), TokenAdminRegistryAdminPrivateKey: tokenAdminRegistryAdminPrivKey.String(), WritableIndexes: []uint8{3, 4, 7}, }, diff --git a/deployment/ccip/changeset/solana/cs_deploy_chain.go b/deployment/ccip/changeset/solana/cs_deploy_chain.go index 78aa985ec5f..95cbb45ca0a 100644 --- a/deployment/ccip/changeset/solana/cs_deploy_chain.go +++ b/deployment/ccip/changeset/solana/cs_deploy_chain.go @@ -16,7 +16,7 @@ import ( mcmsTypes "github.com/smartcontractkit/mcms/types" "github.com/smartcontractkit/chainlink/deployment" - cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + ccipChangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" @@ -36,18 +36,33 @@ const ( RouterProgramName = "ccip_router" OffRampProgramName = "ccip_offramp" FeeQuoterProgramName = "fee_quoter" - TokenPoolProgramName = "test_token_pool" + BurnMintTokenPool = "example_burnmint_token_pool" + LockReleaseTokenPool = "example_lockrelease_token_pool" ) -var _ deployment.ChangeSet[DeployChainContractsConfigSolana] = DeployChainContractsChangesetSolana +var _ deployment.ChangeSet[DeployChainContractsConfig] = DeployChainContractsChangeset -type DeployChainContractsConfigSolana struct { - DeployChainContractsConfig v1_6.DeployChainContractsConfig - UpgradeConfig UpgradeConfigSolana - NewUpgradeAuthority *solana.PublicKey // if set, sets router and fee quoter upgrade authority +type DeployChainContractsConfig struct { + HomeChainSelector uint64 + ContractParamsPerChain map[uint64]ChainContractParams + UpgradeConfig UpgradeConfig + NewUpgradeAuthority *solana.PublicKey // if set, sets router and fee quoter upgrade authority } -type UpgradeConfigSolana struct { +type ChainContractParams struct { + FeeQuoterParams FeeQuoterParams + OffRampParams OffRampParams +} + +type FeeQuoterParams struct { + DefaultMaxFeeJuelsPerMsg solBinary.Uint128 + BillingConfig []solFeeQuoter.BillingTokenConfig +} + +type OffRampParams struct { + EnableExecutionAfter int64 +} +type UpgradeConfig struct { NewFeeQuoterVersion *semver.Version NewRouterVersion *semver.Version // Offramp is redeployed with the existing deployer key while the other programs are upgraded in place @@ -55,10 +70,10 @@ type UpgradeConfigSolana struct { // SpillAddress and UpgradeAuthority must be set SpillAddress solana.PublicKey UpgradeAuthority solana.PublicKey - MCMS *cs.MCMSConfig + MCMS *ccipChangeset.MCMSConfig } -func (cfg UpgradeConfigSolana) Validate(e deployment.Environment, chainSelector uint64) error { +func (cfg UpgradeConfig) Validate(e deployment.Environment, chainSelector uint64) error { if cfg.NewFeeQuoterVersion == nil && cfg.NewRouterVersion == nil && cfg.NewOffRampVersion == nil { return nil } @@ -73,13 +88,25 @@ func (cfg UpgradeConfigSolana) Validate(e deployment.Environment, chainSelector return ValidateMCMSConfig(e, chainSelector, cfg.MCMS) } -func DeployChainContractsChangesetSolana(e deployment.Environment, config DeployChainContractsConfigSolana) (deployment.ChangesetOutput, error) { - c := config.DeployChainContractsConfig +func (c DeployChainContractsConfig) Validate() error { + if err := deployment.IsValidChainSelector(c.HomeChainSelector); err != nil { + return fmt.Errorf("invalid home chain selector: %d - %w", c.HomeChainSelector, err) + } + for cs := range c.ContractParamsPerChain { + if err := deployment.IsValidChainSelector(cs); err != nil { + return fmt.Errorf("invalid chain selector: %d - %w", cs, err) + } + } + return nil +} + +func DeployChainContractsChangeset(e deployment.Environment, c DeployChainContractsConfig) (deployment.ChangesetOutput, error) { + // c := config.DeployChainContractsConfig if err := c.Validate(); err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("invalid DeployChainContractsConfig: %w", err) } newAddresses := deployment.NewMemoryAddressBook() - existingState, err := cs.LoadOnchainState(e) + existingState, err := ccipChangeset.LoadOnchainState(e) if err != nil { e.Logger.Errorw("Failed to load existing onchain state", "err", err) return deployment.ChangesetOutput{}, err @@ -107,7 +134,7 @@ func DeployChainContractsChangesetSolana(e deployment.Environment, config Deploy if existingState.SolChains[chainSel].LinkToken.IsZero() { return deployment.ChangesetOutput{}, fmt.Errorf("fee tokens not found for chain %d", chainSel) } - if err := config.UpgradeConfig.Validate(e, chainSel); err != nil { + if err := c.UpgradeConfig.Validate(e, chainSel); err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("invalid UpgradeConfig: %w", err) } addresses, _ := e.ExistingAddresses.AddressesForChain(chainSel) @@ -120,7 +147,7 @@ func DeployChainContractsChangesetSolana(e deployment.Environment, config Deploy proposers[chainSel] = mcmsSolana.ContractAddress(mcmState.McmProgram, mcmsSolana.PDASeed(mcmState.ProposerMcmSeed)) inspectors[chainSel] = mcmsSolana.NewInspector(chain.Client) - mcmsTxs, err := deployChainContractsSolana(e, chain, newAddresses, config) + mcmsTxs, err := deployChainContractsSolana(e, chain, newAddresses, c) if err != nil { e.Logger.Errorw("Failed to deploy CCIP contracts", "err", err, "newAddresses", newAddresses) return deployment.ChangesetOutput{}, err @@ -134,7 +161,7 @@ func DeployChainContractsChangesetSolana(e deployment.Environment, config Deploy } } - if config.UpgradeConfig.MCMS != nil { + if c.UpgradeConfig.MCMS != nil { proposal, err := proposalutils.BuildProposalFromBatchesV2( e.GetContext(), timelocks, @@ -142,7 +169,7 @@ func DeployChainContractsChangesetSolana(e deployment.Environment, config Deploy inspectors, batches, "proposal to upgrade CCIP contracts", - config.UpgradeConfig.MCMS.MinDelay) + c.UpgradeConfig.MCMS.MinDelay) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to build proposal: %w", err) } @@ -240,6 +267,7 @@ func initializeFeeQuoter( linkTokenAddress solana.PublicKey, feeQuoterAddress solana.PublicKey, offRampAddress solana.PublicKey, + params FeeQuoterParams, ) error { e.Logger.Debugw("Initializing fee quoter", "chain", chain.String(), "feeQuoterAddress", feeQuoterAddress.String()) programData, err := solProgramData(e, chain, feeQuoterAddress) @@ -250,7 +278,7 @@ func initializeFeeQuoter( instruction, err := solFeeQuoter.NewInitializeInstruction( linkTokenAddress, - deployment.SolDefaultMaxFeeJuelsPerMsg, + params.DefaultMaxFeeJuelsPerMsg, ccipRouterProgram, feeQuoterConfigPDA, chain.DeployerKey.PublicKey(), @@ -258,6 +286,9 @@ func initializeFeeQuoter( feeQuoterAddress, programData.Address, ).ValidateAndBuild() + if err != nil { + return fmt.Errorf("failed to build instruction: %w", err) + } offRampBillingSignerPDA, _, _ := solState.FindOfframpBillingSignerPDA(offRampAddress) fqAllowedPriceUpdaterOfframpPDA, _, _ := solState.FindFqAllowedPriceUpdaterPDA(offRampBillingSignerPDA, feeQuoterAddress) @@ -287,6 +318,7 @@ func initializeOffRamp( feeQuoterAddress solana.PublicKey, offRampAddress solana.PublicKey, addressLookupTable solana.PublicKey, + params OffRampParams, ) error { e.Logger.Debugw("Initializing offRamp", "chain", chain.String(), "offRampAddress", offRampAddress.String()) programData, err := solProgramData(e, chain, offRampAddress) @@ -319,7 +351,7 @@ func initializeOffRamp( initConfigIx, err := solOffRamp.NewInitializeConfigInstruction( chain.Selector, - deployment.EnableExecutionAfter, + params.EnableExecutionAfter, offRampConfigPDA, chain.DeployerKey.PublicKey(), solana.SystemProgramID, @@ -341,11 +373,11 @@ func deployChainContractsSolana( e deployment.Environment, chain deployment.SolChain, ab deployment.AddressBook, - config DeployChainContractsConfigSolana, + config DeployChainContractsConfig, ) ([]mcmsTypes.Transaction, error) { // we may need to gather instructions and submit them as part of MCMS ixns := make([]mcmsTypes.Transaction, 0) - state, err := cs.LoadOnchainStateSolana(e) + state, err := ccipChangeset.LoadOnchainStateSolana(e) if err != nil { e.Logger.Errorw("Failed to load existing onchain state", "err", err) return ixns, err @@ -358,6 +390,8 @@ func deployChainContractsSolana( return ixns, fmt.Errorf("failed to get link token address for chain %s", chain.String()) } + params := config.ContractParamsPerChain[chain.Selector] + // FEE QUOTER DEPLOY var feeQuoterAddress solana.PublicKey //nolint:gocritic // this is a false positive, we need to check if the address is zero @@ -412,10 +446,10 @@ func deployChainContractsSolana( upgradeTx, err := mcmsSolana.NewTransaction( solana.BPFLoaderUpgradeableProgramID.String(), upgradeData, - big.NewInt(0), // e.g. value - upgradeIxn.Accounts(), // pass along needed accounts - string(cs.FeeQuoter), // some string identifying the target - []string{}, // any relevant metadata + big.NewInt(0), // e.g. value + upgradeIxn.Accounts(), // pass along needed accounts + string(ccipChangeset.FeeQuoter), // some string identifying the target + []string{}, // any relevant metadata ) if err != nil { return ixns, fmt.Errorf("failed to create upgrade transaction: %w", err) @@ -427,10 +461,10 @@ func deployChainContractsSolana( closeTx, err := mcmsSolana.NewTransaction( solana.BPFLoaderUpgradeableProgramID.String(), closeData, - big.NewInt(0), // e.g. value - closeIxn.Accounts(), // pass along needed accounts - string(cs.FeeQuoter), // some string identifying the target - []string{}, // any relevant metadata + big.NewInt(0), // e.g. value + closeIxn.Accounts(), // pass along needed accounts + string(ccipChangeset.FeeQuoter), // some string identifying the target + []string{}, // any relevant metadata ) if err != nil { return ixns, fmt.Errorf("failed to create close transaction: %w", err) @@ -443,10 +477,10 @@ func deployChainContractsSolana( extendTx, err := mcmsSolana.NewTransaction( solana.BPFLoaderUpgradeableProgramID.String(), extendData, - big.NewInt(0), // e.g. value - extendIxn.Accounts(), // pass along needed accounts - string(cs.FeeQuoter), // some string identifying the target - []string{}, // any relevant metadata + big.NewInt(0), // e.g. value + extendIxn.Accounts(), // pass along needed accounts + string(ccipChangeset.FeeQuoter), // some string identifying the target + []string{}, // any relevant metadata ) if err != nil { return ixns, fmt.Errorf("failed to create extend transaction: %w", err) @@ -515,10 +549,10 @@ func deployChainContractsSolana( upgradeTx, err := mcmsSolana.NewTransaction( solana.BPFLoaderUpgradeableProgramID.String(), upgradeData, - big.NewInt(0), // e.g. value - upgradeIxn.Accounts(), // pass along needed accounts - string(cs.Router), // some string identifying the target - []string{}, // any relevant metadata + big.NewInt(0), // e.g. value + upgradeIxn.Accounts(), // pass along needed accounts + string(ccipChangeset.Router), // some string identifying the target + []string{}, // any relevant metadata ) if err != nil { return ixns, fmt.Errorf("failed to create upgrade transaction: %w", err) @@ -530,10 +564,10 @@ func deployChainContractsSolana( closeTx, err := mcmsSolana.NewTransaction( solana.BPFLoaderUpgradeableProgramID.String(), closeData, - big.NewInt(0), // e.g. value - closeIxn.Accounts(), // pass along needed accounts - string(cs.Router), // some string identifying the target - []string{}, // any relevant metadata + big.NewInt(0), // e.g. value + closeIxn.Accounts(), // pass along needed accounts + string(ccipChangeset.Router), // some string identifying the target + []string{}, // any relevant metadata ) if err != nil { return ixns, fmt.Errorf("failed to create close transaction: %w", err) @@ -546,10 +580,10 @@ func deployChainContractsSolana( extendTx, err := mcmsSolana.NewTransaction( solana.BPFLoaderUpgradeableProgramID.String(), extendData, - big.NewInt(0), // e.g. value - extendIxn.Accounts(), // pass along needed accounts - string(cs.Router), // some string identifying the target - []string{}, // any relevant metadata + big.NewInt(0), // e.g. value + extendIxn.Accounts(), // pass along needed accounts + string(ccipChangeset.Router), // some string identifying the target + []string{}, // any relevant metadata ) if err != nil { return ixns, fmt.Errorf("failed to create extend transaction: %w", err) @@ -578,12 +612,12 @@ func deployChainContractsSolana( return ixns, fmt.Errorf("failed to deploy program: %w", err) } } else if config.UpgradeConfig.NewOffRampVersion != nil { - tv := deployment.NewTypeAndVersion(cs.OffRamp, *config.UpgradeConfig.NewOffRampVersion) + tv := deployment.NewTypeAndVersion(ccipChangeset.OffRamp, *config.UpgradeConfig.NewOffRampVersion) existingAddresses, err := e.ExistingAddresses.AddressesForChain(chain.Selector) if err != nil { return ixns, fmt.Errorf("failed to get existing addresses: %w", err) } - offRampAddress = cs.FindSolanaAddress(tv, existingAddresses) + offRampAddress = ccipChangeset.FindSolanaAddress(tv, existingAddresses) if offRampAddress.IsZero() { // deploy offramp, not upgraded in place so upgrade is false offRampAddress, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, OffRampProgramName, *config.UpgradeConfig.NewOffRampVersion, false) @@ -613,10 +647,10 @@ func deployChainContractsSolana( priceUpdaterTx, err := mcmsSolana.NewTransaction( feeQuoterAddress.String(), priceUpdaterData, - big.NewInt(0), // e.g. value - priceUpdaterix.Accounts(), // pass along needed accounts - string(cs.OffRamp), // some string identifying the target - []string{}, // any relevant metadata + big.NewInt(0), // e.g. value + priceUpdaterix.Accounts(), // pass along needed accounts + string(ccipChangeset.OffRamp), // some string identifying the target + []string{}, // any relevant metadata ) if err != nil { return ixns, fmt.Errorf("failed to create price updater transaction: %w", err) @@ -633,7 +667,7 @@ func deployChainContractsSolana( feeQuoterConfigPDA, _, _ := solState.FindFqConfigPDA(feeQuoterAddress) err = chain.GetAccountDataBorshInto(e.GetContext(), feeQuoterConfigPDA, &fqConfig) if err != nil { - if err2 := initializeFeeQuoter(e, chain, ccipRouterProgram, chainState.LinkToken, feeQuoterAddress, offRampAddress); err2 != nil { + if err2 := initializeFeeQuoter(e, chain, ccipRouterProgram, chainState.LinkToken, feeQuoterAddress, offRampAddress, params.FeeQuoterParams); err2 != nil { return ixns, err2 } } else { @@ -675,7 +709,7 @@ func deployChainContractsSolana( if err2 != nil { return ixns, fmt.Errorf("failed to create address lookup table: %w", err) } - if err2 := initializeOffRamp(e, chain, ccipRouterProgram, feeQuoterAddress, offRampAddress, table); err2 != nil { + if err2 := initializeOffRamp(e, chain, ccipRouterProgram, feeQuoterAddress, offRampAddress, table, params.OffRampParams); err2 != nil { return ixns, err2 } // Initializing a new offramp means we need a new lookup table and need to fully populate it @@ -696,29 +730,48 @@ func deployChainContractsSolana( e.Logger.Infow("Offramp already initialized, skipping initialization", "chain", chain.String()) } - // TOKEN POOL DEPLOY - var tokenPoolProgram solana.PublicKey - if chainState.TokenPool.IsZero() { - // TODO: there should be two token pools deployed one of each type (lock/burn) - // separate token pools are not ready yet - tokenPoolProgram, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, TokenPoolProgramName, deployment.Version1_0_0, false) + var burnMintTokenPool solana.PublicKey + if chainState.BurnMintTokenPool.IsZero() { + burnMintTokenPool, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, BurnMintTokenPool, deployment.Version1_0_0, false) + if err != nil { + return ixns, fmt.Errorf("failed to deploy program: %w", err) + } + needTokenPoolinLookupTable = true + } else { + e.Logger.Infow("Using existing burn mint token pool", "addr", chainState.BurnMintTokenPool.String()) + burnMintTokenPool = chainState.BurnMintTokenPool + } + + var lockReleaseTokenPool solana.PublicKey + if chainState.LockReleaseTokenPool.IsZero() { + lockReleaseTokenPool, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, LockReleaseTokenPool, deployment.Version1_0_0, false) if err != nil { return ixns, fmt.Errorf("failed to deploy program: %w", err) } needTokenPoolinLookupTable = true } else { - e.Logger.Infow("Using existing token pool", "addr", chainState.TokenPool.String()) - tokenPoolProgram = chainState.TokenPool + e.Logger.Infow("Using existing lock release token pool", "addr", chainState.LockReleaseTokenPool.String()) + lockReleaseTokenPool = chainState.LockReleaseTokenPool + } + + for _, billingConfig := range params.FeeQuoterParams.BillingConfig { + if err := AddBillingToken( + e, chain, chainState, billingConfig, + ); err != nil { + return ixns, err + } } if needFQinLookupTable { linkFqBillingConfigPDA, _, _ := solState.FindFqBillingTokenConfigPDA(chainState.LinkToken, feeQuoterAddress) + wsolFqBillingConfigPDA, _, _ := solState.FindFqBillingTokenConfigPDA(chainState.WSOL, feeQuoterAddress) feeQuoterConfigPDA, _, _ := solState.FindFqConfigPDA(feeQuoterAddress) lookupTableKeys = append(lookupTableKeys, []solana.PublicKey{ // fee quoter feeQuoterConfigPDA, feeQuoterAddress, linkFqBillingConfigPDA, + wsolFqBillingConfigPDA, }...) } @@ -740,12 +793,13 @@ func deployChainContractsSolana( if needTokenPoolinLookupTable { lookupTableKeys = append(lookupTableKeys, []solana.PublicKey{ // token pools - tokenPoolProgram, + burnMintTokenPool, + lockReleaseTokenPool, }...) } if len(lookupTableKeys) > 0 { - addressLookupTable, err := cs.FetchOfframpLookupTable(e.GetContext(), chain, offRampAddress) + addressLookupTable, err := ccipChangeset.FetchOfframpLookupTable(e.GetContext(), chain, offRampAddress) if err != nil { return ixns, fmt.Errorf("failed to get offramp reference addresses: %w", err) } @@ -784,10 +838,11 @@ func DeployAndMaybeSaveToAddressBook( address := solana.MustPublicKeyFromBase58(programID) programNameToType := map[string]deployment.ContractType{ - RouterProgramName: cs.Router, - OffRampProgramName: cs.OffRamp, - FeeQuoterProgramName: cs.FeeQuoter, - TokenPoolProgramName: cs.TokenPool, + RouterProgramName: ccipChangeset.Router, + OffRampProgramName: ccipChangeset.OffRamp, + FeeQuoterProgramName: ccipChangeset.FeeQuoter, + BurnMintTokenPool: ccipChangeset.BurnMintTokenPool, + LockReleaseTokenPool: ccipChangeset.LockReleaseTokenPool, } programType, ok := programNameToType[programName] if !ok { @@ -952,7 +1007,7 @@ type SetFeeAggregatorConfig struct { } func (cfg SetFeeAggregatorConfig) Validate(e deployment.Environment) error { - state, err := cs.LoadOnchainState(e) + state, err := ccipChangeset.LoadOnchainState(e) if err != nil { return fmt.Errorf("failed to load onchain state: %w", err) } @@ -983,7 +1038,7 @@ func SetFeeAggregator(e deployment.Environment, cfg SetFeeAggregatorConfig) (dep return deployment.ChangesetOutput{}, err } - state, _ := cs.LoadOnchainState(e) + state, _ := ccipChangeset.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] chain := e.SolChains[cfg.ChainSelector] @@ -1005,7 +1060,7 @@ func SetFeeAggregator(e deployment.Environment, cfg SetFeeAggregatorConfig) (dep return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) } newAddresses := deployment.NewMemoryAddressBook() - err = newAddresses.Save(cfg.ChainSelector, cfg.FeeAggregator, deployment.NewTypeAndVersion(cs.FeeAggregator, deployment.Version1_0_0)) + err = newAddresses.Save(cfg.ChainSelector, cfg.FeeAggregator, deployment.NewTypeAndVersion(ccipChangeset.FeeAggregator, deployment.Version1_0_0)) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to save address: %w", err) } diff --git a/deployment/ccip/changeset/solana/cs_deploy_chain_test.go b/deployment/ccip/changeset/solana/cs_deploy_chain_test.go index a516bc2914f..4800df91f50 100644 --- a/deployment/ccip/changeset/solana/cs_deploy_chain_test.go +++ b/deployment/ccip/changeset/solana/cs_deploy_chain_test.go @@ -6,24 +6,24 @@ import ( "testing" "time" + "github.com/gagliardetto/solana-go" "github.com/stretchr/testify/require" "go.uber.org/zap/zapcore" - "github.com/gagliardetto/solana-go" + solBinary "github.com/gagliardetto/binary" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - cs_solana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" - solanachangesets "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" + ccipChangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + ccipChangesetSolana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" + commonState "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/environment/memory" "github.com/smartcontractkit/chainlink/v2/core/logger" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" - commonState "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" ) @@ -32,7 +32,7 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { lggr := logger.TestLogger(t) e := memory.NewMemoryEnvironment(t, lggr, zapcore.InfoLevel, memory.MemoryEnvironmentConfig{ Bootstraps: 1, - Chains: 2, + Chains: 1, SolChains: 1, Nodes: 4, }) @@ -50,9 +50,9 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { OffRampParams: v1_6.DefaultOffRampParams(), } } - prereqCfg := make([]changeset.DeployPrerequisiteConfigPerChain, 0) + prereqCfg := make([]ccipChangeset.DeployPrerequisiteConfigPerChain, 0) for _, chain := range e.AllChainSelectors() { - prereqCfg = append(prereqCfg, changeset.DeployPrerequisiteConfigPerChain{ + prereqCfg = append(prereqCfg, ccipChangeset.DeployPrerequisiteConfigPerChain{ ChainSelector: chain, }) } @@ -85,14 +85,13 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { deployment.CreateLegacyChangeSet(commonchangeset.DeployLinkToken), e.AllChainSelectorsSolana(), ), - commonchangeset.Configure( deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelockV2), cfg, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployPrerequisitesChangeset), - changeset.DeployPrerequisiteConfig{ + deployment.CreateLegacyChangeSet(ccipChangeset.DeployPrerequisitesChangeset), + ccipChangeset.DeployPrerequisiteConfig{ Configs: prereqCfg, }, ), @@ -115,6 +114,7 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { }, ), ) + require.NoError(t, err) addresses, err := e.ExistingAddresses.AddressesForChain(solChainSelectors[0]) require.NoError(t, err) mcmState, err := commonState.MaybeLoadMCMSWithTimelockChainStateSolana(e.SolChains[solChainSelectors[0]], addresses) @@ -132,8 +132,8 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { // we can't upgrade in place locally so we have to change where we build buildCs := commonchangeset.Configure( - deployment.CreateLegacyChangeSet(cs_solana.BuildSolanaChangeset), - cs_solana.BuildSolanaConfig{ + deployment.CreateLegacyChangeSet(ccipChangesetSolana.BuildSolanaChangeset), + ccipChangesetSolana.BuildSolanaConfig{ ChainSelector: solChainSelectors[0], GitCommitSha: "0863d8fed5fbada9f352f33c405e1753cbb7d72c", DestinationDir: e.SolChains[solChainSelectors[0]].ProgramsPath, @@ -141,14 +141,16 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { }, ) deployCs := commonchangeset.Configure( - deployment.CreateLegacyChangeSet(cs_solana.DeployChainContractsChangesetSolana), - cs_solana.DeployChainContractsConfigSolana{ - DeployChainContractsConfig: v1_6.DeployChainContractsConfig{ - HomeChainSelector: homeChainSel, - ContractParamsPerChain: map[uint64]v1_6.ChainContractParams{ - solChainSelectors[0]: { - FeeQuoterParams: v1_6.DefaultFeeQuoterParams(), - OffRampParams: v1_6.DefaultOffRampParams(), + deployment.CreateLegacyChangeSet(ccipChangesetSolana.DeployChainContractsChangeset), + ccipChangesetSolana.DeployChainContractsConfig{ + HomeChainSelector: homeChainSel, + ContractParamsPerChain: map[uint64]ccipChangesetSolana.ChainContractParams{ + solChainSelectors[0]: { + FeeQuoterParams: ccipChangesetSolana.FeeQuoterParams{ + DefaultMaxFeeJuelsPerMsg: solBinary.Uint128{Lo: 300000000, Hi: 0, Endianness: nil}, + }, + OffRampParams: ccipChangesetSolana.OffRampParams{ + EnableExecutionAfter: int64(globals.PermissionLessExecutionThreshold.Seconds()), }, }, }, @@ -156,17 +158,17 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { ) // set the fee aggregator address feeAggregatorCs := commonchangeset.Configure( - deployment.CreateLegacyChangeSet(cs_solana.SetFeeAggregator), - cs_solana.SetFeeAggregatorConfig{ + deployment.CreateLegacyChangeSet(ccipChangesetSolana.SetFeeAggregator), + ccipChangesetSolana.SetFeeAggregatorConfig{ ChainSelector: solChainSelectors[0], FeeAggregator: feeAggregatorPubKey.String(), }, ) transferOwnershipCs := commonchangeset.Configure( - deployment.CreateLegacyChangeSet(solanachangesets.TransferCCIPToMCMSWithTimelockSolana), - solanachangesets.TransferCCIPToMCMSWithTimelockSolanaConfig{ + deployment.CreateLegacyChangeSet(ccipChangesetSolana.TransferCCIPToMCMSWithTimelockSolana), + ccipChangesetSolana.TransferCCIPToMCMSWithTimelockSolanaConfig{ MinDelay: 1 * time.Second, - ContractsByChain: map[uint64]solanachangesets.CCIPContractsToTransfer{ + ContractsByChain: map[uint64]ccipChangesetSolana.CCIPContractsToTransfer{ solChainSelectors[0]: { Router: true, FeeQuoter: true, @@ -177,14 +179,16 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { ) // make sure idempotency works and setting the upgrade authority upgradeAuthorityCs := commonchangeset.Configure( - deployment.CreateLegacyChangeSet(cs_solana.DeployChainContractsChangesetSolana), - cs_solana.DeployChainContractsConfigSolana{ - DeployChainContractsConfig: v1_6.DeployChainContractsConfig{ - HomeChainSelector: homeChainSel, - ContractParamsPerChain: map[uint64]v1_6.ChainContractParams{ - solChainSelectors[0]: { - FeeQuoterParams: v1_6.DefaultFeeQuoterParams(), - OffRampParams: v1_6.DefaultOffRampParams(), + deployment.CreateLegacyChangeSet(ccipChangesetSolana.DeployChainContractsChangeset), + ccipChangesetSolana.DeployChainContractsConfig{ + HomeChainSelector: homeChainSel, + ContractParamsPerChain: map[uint64]ccipChangesetSolana.ChainContractParams{ + solChainSelectors[0]: { + FeeQuoterParams: ccipChangesetSolana.FeeQuoterParams{ + DefaultMaxFeeJuelsPerMsg: solBinary.Uint128{Lo: 300000000, Hi: 0, Endianness: nil}, + }, + OffRampParams: ccipChangesetSolana.OffRampParams{ + EnableExecutionAfter: int64(globals.PermissionLessExecutionThreshold.Seconds()), }, }, }, @@ -192,23 +196,25 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { }, ) upgradeCs := commonchangeset.Configure( - deployment.CreateLegacyChangeSet(cs_solana.DeployChainContractsChangesetSolana), - cs_solana.DeployChainContractsConfigSolana{ - DeployChainContractsConfig: v1_6.DeployChainContractsConfig{ - HomeChainSelector: homeChainSel, - ContractParamsPerChain: map[uint64]v1_6.ChainContractParams{ - solChainSelectors[0]: { - FeeQuoterParams: v1_6.DefaultFeeQuoterParams(), - OffRampParams: v1_6.DefaultOffRampParams(), + deployment.CreateLegacyChangeSet(ccipChangesetSolana.DeployChainContractsChangeset), + ccipChangesetSolana.DeployChainContractsConfig{ + HomeChainSelector: homeChainSel, + ContractParamsPerChain: map[uint64]ccipChangesetSolana.ChainContractParams{ + solChainSelectors[0]: { + FeeQuoterParams: ccipChangesetSolana.FeeQuoterParams{ + DefaultMaxFeeJuelsPerMsg: solBinary.Uint128{Lo: 300000000, Hi: 0, Endianness: nil}, + }, + OffRampParams: ccipChangesetSolana.OffRampParams{ + EnableExecutionAfter: int64(globals.PermissionLessExecutionThreshold.Seconds()), }, }, }, - UpgradeConfig: cs_solana.UpgradeConfigSolana{ + UpgradeConfig: ccipChangesetSolana.UpgradeConfig{ NewFeeQuoterVersion: &deployment.Version1_1_0, NewRouterVersion: &deployment.Version1_1_0, UpgradeAuthority: upgradeAuthority, SpillAddress: upgradeAuthority, - MCMS: &cs.MCMSConfig{ + MCMS: &ccipChangeset.MCMSConfig{ MinDelay: 1 * time.Second, }, }, @@ -216,18 +222,20 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { ) // because we cannot upgrade in place locally, we can't redeploy offramp offRampCs := commonchangeset.Configure( - deployment.CreateLegacyChangeSet(cs_solana.DeployChainContractsChangesetSolana), - cs_solana.DeployChainContractsConfigSolana{ - DeployChainContractsConfig: v1_6.DeployChainContractsConfig{ - HomeChainSelector: homeChainSel, - ContractParamsPerChain: map[uint64]v1_6.ChainContractParams{ - solChainSelectors[0]: { - FeeQuoterParams: v1_6.DefaultFeeQuoterParams(), - OffRampParams: v1_6.DefaultOffRampParams(), + deployment.CreateLegacyChangeSet(ccipChangesetSolana.DeployChainContractsChangeset), + ccipChangesetSolana.DeployChainContractsConfig{ + HomeChainSelector: homeChainSel, + ContractParamsPerChain: map[uint64]ccipChangesetSolana.ChainContractParams{ + solChainSelectors[0]: { + FeeQuoterParams: ccipChangesetSolana.FeeQuoterParams{ + DefaultMaxFeeJuelsPerMsg: solBinary.Uint128{Lo: 300000000, Hi: 0, Endianness: nil}, + }, + OffRampParams: ccipChangesetSolana.OffRampParams{ + EnableExecutionAfter: int64(globals.PermissionLessExecutionThreshold.Seconds()), }, }, }, - UpgradeConfig: cs_solana.UpgradeConfigSolana{ + UpgradeConfig: ccipChangesetSolana.UpgradeConfig{ NewOffRampVersion: &deployment.Version1_1_0, }, }, @@ -240,7 +248,7 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { transferOwnershipCs, }) require.NoError(t, err) - state, err := changeset.LoadOnchainStateSolana(e) + state, err := ccipChangeset.LoadOnchainStateSolana(e) require.NoError(t, err) oldOffRampAddress := state.SolChains[solChainSelectors[0]].OffRamp // add a second offramp address @@ -251,7 +259,7 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { }) require.NoError(t, err) // verify the offramp address is different - state, err = changeset.LoadOnchainStateSolana(e) + state, err = ccipChangeset.LoadOnchainStateSolana(e) require.NoError(t, err) newOffRampAddress := state.SolChains[solChainSelectors[0]].OffRamp require.NotEqual(t, oldOffRampAddress, newOffRampAddress) @@ -273,13 +281,13 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { numFeeQuoters := 0 numOffRamps := 0 for _, address := range addresses { - if address.Type == changeset.Router { + if address.Type == ccipChangeset.Router { numRouters++ } - if address.Type == changeset.FeeQuoter { + if address.Type == ccipChangeset.FeeQuoter { numFeeQuoters++ } - if address.Type == changeset.OffRamp { + if address.Type == ccipChangeset.OffRamp { numOffRamps++ } } @@ -293,5 +301,4 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { require.NoError(t, err) // solana verification testhelpers.ValidateSolanaState(t, e, solChainSelectors) - } diff --git a/deployment/ccip/changeset/solana/cs_set_ocr3.go b/deployment/ccip/changeset/solana/cs_set_ocr3.go index 2c71cb28fc8..4eab1aca7bc 100644 --- a/deployment/ccip/changeset/solana/cs_set_ocr3.go +++ b/deployment/ccip/changeset/solana/cs_set_ocr3.go @@ -10,6 +10,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + ccipChangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" ) @@ -106,7 +107,7 @@ func SetOCR3ConfigSolana(e deployment.Environment, cfg v1_6.SetOCR3OffRampConfig func isOCR3ConfigSetOnOffRampSolana( e deployment.Environment, chain deployment.SolChain, - chainState changeset.SolCCIPChainState, + chainState ccipChangeset.SolCCIPChainState, args []internal.MultiOCR3BaseOCRConfigArgsSolana, ) (bool, error) { var configAccount solOffRamp.Config diff --git a/deployment/ccip/changeset/solana/cs_solana_token.go b/deployment/ccip/changeset/solana/cs_solana_token.go index fb16c125944..9932887acc2 100644 --- a/deployment/ccip/changeset/solana/cs_solana_token.go +++ b/deployment/ccip/changeset/solana/cs_solana_token.go @@ -8,6 +8,7 @@ import ( "github.com/gagliardetto/solana-go/rpc" "github.com/smartcontractkit/chainlink/deployment" + ccipChangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" solCommomUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" solTokenUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/tokens" @@ -21,8 +22,9 @@ var _ deployment.ChangeSet[CreateSolanaTokenATAConfig] = CreateSolanaTokenATA // might need to take authority private key if it needs to sign that type DeploySolanaTokenConfig struct { ChainSelector uint64 - TokenProgramName string + TokenProgramName deployment.ContractType TokenDecimals uint8 + TokenSymbol string } func NewTokenInstruction(chain deployment.SolChain, cfg DeploySolanaTokenConfig) ([]solana.Instruction, solana.PrivateKey, error) { @@ -62,15 +64,16 @@ func DeploySolanaToken(e deployment.Environment, cfg DeploySolanaTokenConfig) (d } err = chain.Confirm(instructions, solCommomUtil.AddSigners(mintPrivKey)) if err != nil { - e.Logger.Errorw("Failed to confirm instructions for link token deployment", "chain", chain.String(), "err", err) + e.Logger.Errorw("Failed to confirm instructions for token deployment", "chain", chain.String(), "err", err) return deployment.ChangesetOutput{}, err } newAddresses := deployment.NewMemoryAddressBook() tv := deployment.NewTypeAndVersion(deployment.ContractType(cfg.TokenProgramName), deployment.Version1_0_0) + tv.AddLabel(cfg.TokenSymbol) err = newAddresses.Save(cfg.ChainSelector, mint.String(), tv) if err != nil { - e.Logger.Errorw("Failed to save link token", "chain", chain.String(), "err", err) + e.Logger.Errorw("Failed to save token", "chain", chain.String(), "err", err) return deployment.ChangesetOutput{}, err } @@ -83,17 +86,19 @@ func DeploySolanaToken(e deployment.Environment, cfg DeploySolanaTokenConfig) (d type MintSolanaTokenConfig struct { ChainSelector uint64 - TokenProgram string TokenPubkey string AmountToAddress map[string]uint64 // address -> amount } func (cfg MintSolanaTokenConfig) Validate(e deployment.Environment) error { chain := e.SolChains[cfg.ChainSelector] - // get addresses tokenAddress := solana.MustPublicKeyFromBase58(cfg.TokenPubkey) - // get token program id - tokenprogramID, err := GetTokenProgramID(cfg.TokenProgram) + state, err := ccipChangeset.LoadOnchainState(e) + if err != nil { + return err + } + chainState := state.SolChains[cfg.ChainSelector] + tokenprogramID, err := chainState.TokenToTokenProgram(tokenAddress) if err != nil { return err } @@ -121,10 +126,12 @@ func MintSolanaToken(e deployment.Environment, cfg MintSolanaTokenConfig) (deplo } // get chain chain := e.SolChains[cfg.ChainSelector] + state, _ := ccipChangeset.LoadOnchainState(e) + chainState := state.SolChains[cfg.ChainSelector] // get addresses tokenAddress := solana.MustPublicKeyFromBase58(cfg.TokenPubkey) // get token program id - tokenprogramID, _ := GetTokenProgramID(cfg.TokenProgram) + tokenprogramID, _ := chainState.TokenToTokenProgram(tokenAddress) // get mint instructions instructions := []solana.Instruction{} @@ -153,7 +160,7 @@ func MintSolanaToken(e deployment.Environment, cfg MintSolanaTokenConfig) (deplo type CreateSolanaTokenATAConfig struct { ChainSelector uint64 TokenPubkey solana.PublicKey - TokenProgram string + TokenProgram deployment.ContractType ATAList []string // addresses to create ATAs for } diff --git a/deployment/ccip/changeset/solana/cs_solana_token_test.go b/deployment/ccip/changeset/solana/cs_solana_token_test.go index d50eee74360..4534bbfa5a2 100644 --- a/deployment/ccip/changeset/solana/cs_solana_token_test.go +++ b/deployment/ccip/changeset/solana/cs_solana_token_test.go @@ -33,8 +33,9 @@ func TestSolanaTokenOps(t *testing.T) { deployment.CreateLegacyChangeSet(changeset_solana.DeploySolanaToken), changeset_solana.DeploySolanaTokenConfig{ ChainSelector: solChain1, - TokenProgramName: deployment.SPL2022Tokens, + TokenProgramName: ccipChangeset.SPL2022Tokens, TokenDecimals: 9, + TokenSymbol: "TEST_TOKEN", }, ), ) @@ -55,7 +56,7 @@ func TestSolanaTokenOps(t *testing.T) { changeset_solana.CreateSolanaTokenATAConfig{ ChainSelector: solChain1, TokenPubkey: tokenAddress, - TokenProgram: deployment.SPL2022Tokens, + TokenProgram: ccipChangeset.SPL2022Tokens, ATAList: []string{deployerKey.String(), testUserPubKey.String()}, }, ), @@ -65,7 +66,6 @@ func TestSolanaTokenOps(t *testing.T) { changeset_solana.MintSolanaTokenConfig{ ChainSelector: solChain1, TokenPubkey: tokenAddress.String(), - TokenProgram: deployment.SPL2022Tokens, AmountToAddress: map[string]uint64{ deployerKey.String(): uint64(1000), testUserPubKey.String(): uint64(1000), diff --git a/deployment/ccip/changeset/solana/cs_token_admin_registry.go b/deployment/ccip/changeset/solana/cs_token_admin_registry.go index 8b4ee857852..550a7581325 100644 --- a/deployment/ccip/changeset/solana/cs_token_admin_registry.go +++ b/deployment/ccip/changeset/solana/cs_token_admin_registry.go @@ -12,7 +12,7 @@ import ( solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" "github.com/smartcontractkit/chainlink/deployment" - cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + ccipChangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" ) type RegisterTokenAdminRegistryType int @@ -42,7 +42,7 @@ func (cfg RegisterTokenAdminRegistryConfig) Validate(e deployment.Environment) e if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { return err } - state, _ := cs.LoadOnchainState(e) + state, _ := ccipChangeset.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] chain := e.SolChains[cfg.ChainSelector] if err := validateRouterConfig(chain, chainState); err != nil { @@ -64,7 +64,7 @@ func RegisterTokenAdminRegistry(e deployment.Environment, cfg RegisterTokenAdmin return deployment.ChangesetOutput{}, err } chain := e.SolChains[cfg.ChainSelector] - state, _ := cs.LoadOnchainState(e) + state, _ := ccipChangeset.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) @@ -136,7 +136,7 @@ func (cfg TransferAdminRoleTokenAdminRegistryConfig) Validate(e deployment.Envir ) } - state, _ := cs.LoadOnchainState(e) + state, _ := ccipChangeset.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] chain := e.SolChains[cfg.ChainSelector] if err := validateRouterConfig(chain, chainState); err != nil { @@ -158,7 +158,7 @@ func TransferAdminRoleTokenAdminRegistry(e deployment.Environment, cfg TransferA return deployment.ChangesetOutput{}, err } chain := e.SolChains[cfg.ChainSelector] - state, _ := cs.LoadOnchainState(e) + state, _ := ccipChangeset.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) @@ -198,7 +198,7 @@ func (cfg AcceptAdminRoleTokenAdminRegistryConfig) Validate(e deployment.Environ if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { return err } - state, _ := cs.LoadOnchainState(e) + state, _ := ccipChangeset.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] chain := e.SolChains[cfg.ChainSelector] if err := validateRouterConfig(chain, chainState); err != nil { @@ -230,7 +230,7 @@ func AcceptAdminRoleTokenAdminRegistry(e deployment.Environment, cfg AcceptAdmin return deployment.ChangesetOutput{}, err } chain := e.SolChains[cfg.ChainSelector] - state, _ := cs.LoadOnchainState(e) + state, _ := ccipChangeset.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) newRegistryAdminPrivateKey := solana.MustPrivateKeyFromBase58(cfg.NewRegistryAdminPrivateKey) diff --git a/deployment/ccip/changeset/solana/cs_token_pool.go b/deployment/ccip/changeset/solana/cs_token_pool.go index cdf61704cf9..7d85ecfa4fb 100644 --- a/deployment/ccip/changeset/solana/cs_token_pool.go +++ b/deployment/ccip/changeset/solana/cs_token_pool.go @@ -6,26 +6,43 @@ import ( "github.com/gagliardetto/solana-go" + solBaseTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/base_token_pool" solRouter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" + solBurnMintTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/example_burnmint_token_pool" + solLockReleaseTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/example_lockrelease_token_pool" solTestTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/test_token_pool" solCommonUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" solTokenUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/tokens" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - state2 "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + ccipChangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" ) var _ deployment.ChangeSet[TokenPoolConfig] = AddTokenPool var _ deployment.ChangeSet[RemoteChainTokenPoolConfig] = SetupTokenPoolForRemoteChain +func validatePoolDeployment(s ccipChangeset.SolCCIPChainState, poolType solTestTokenPool.PoolType, selector uint64) error { + switch poolType { + case solTestTokenPool.BurnAndMint_PoolType: + if s.BurnMintTokenPool.IsZero() { + return fmt.Errorf("token pool of type BurnAndMint not found in existing state, deploy the token pool first for chain %d", selector) + } + case solTestTokenPool.LockAndRelease_PoolType: + if s.LockReleaseTokenPool.IsZero() { + return fmt.Errorf("token pool of type LockAndRelease not found in existing state, deploy the token pool first for chain %d", selector) + } + default: + return fmt.Errorf("invalid pool type: %s", poolType) + } + return nil +} + type TokenPoolConfig struct { - ChainSelector uint64 - PoolType solTestTokenPool.PoolType - Authority string - TokenPubKey string - TokenProgramName string + ChainSelector uint64 + PoolType solTestTokenPool.PoolType + Authority string + TokenPubKey string } func (cfg TokenPoolConfig) Validate(e deployment.Environment) error { @@ -33,24 +50,38 @@ func (cfg TokenPoolConfig) Validate(e deployment.Environment) error { if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { return err } - state, _ := state2.LoadOnchainState(e) + state, _ := ccipChangeset.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] - if chainState.TokenPool.IsZero() { - return fmt.Errorf("token pool not found in existing state, deploy the token pool first for chain %d", cfg.ChainSelector) + + if _, err := chainState.TokenToTokenProgram(tokenPubKey); err != nil { + return fmt.Errorf("failed to get token program for token address %s: %w", tokenPubKey.String(), err) } - if _, err := GetTokenProgramID(cfg.TokenProgramName); err != nil { + + if err := validatePoolDeployment(chainState, cfg.PoolType, cfg.ChainSelector); err != nil { return err } - tokenPool := chainState.TokenPool + var tokenPool solana.PublicKey + var poolConfigAccount interface{} + + switch cfg.PoolType { + case solTestTokenPool.BurnAndMint_PoolType: + tokenPool = chainState.BurnMintTokenPool + poolConfigAccount = solBurnMintTokenPool.State{} + case solTestTokenPool.LockAndRelease_PoolType: + tokenPool = chainState.LockReleaseTokenPool + poolConfigAccount = solLockReleaseTokenPool.State{} + default: + return fmt.Errorf("invalid pool type: %s", cfg.PoolType) + } + poolConfigPDA, err := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, tokenPool) if err != nil { return fmt.Errorf("failed to get token pool config address (mint: %s, pool: %s): %w", tokenPubKey.String(), tokenPool.String(), err) } chain := e.SolChains[cfg.ChainSelector] - var poolConfigAccount solTestTokenPool.State if err := chain.GetAccountDataBorshInto(context.Background(), poolConfigPDA, &poolConfigAccount); err == nil { - return fmt.Errorf("token pool config already exists for (mint: %s, pool: %s)", tokenPubKey.String(), tokenPool.String()) + return fmt.Errorf("token pool config already exists for (mint: %s, pool: %s, type: %s)", tokenPubKey.String(), tokenPool.String(), cfg.PoolType) } return nil } @@ -60,15 +91,24 @@ func AddTokenPool(e deployment.Environment, cfg TokenPoolConfig) (deployment.Cha return deployment.ChangesetOutput{}, err } chain := e.SolChains[cfg.ChainSelector] - state, _ := state2.LoadOnchainState(e) + state, _ := ccipChangeset.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] authorityPubKey := solana.MustPublicKeyFromBase58(cfg.Authority) tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + tokenPool := solana.PublicKey{} + + if cfg.PoolType == solTestTokenPool.BurnAndMint_PoolType { + tokenPool = chainState.BurnMintTokenPool + solBurnMintTokenPool.SetProgramID(tokenPool) + } else if cfg.PoolType == solTestTokenPool.LockAndRelease_PoolType { + tokenPool = chainState.LockReleaseTokenPool + solLockReleaseTokenPool.SetProgramID(tokenPool) + } // verified - tokenprogramID, _ := GetTokenProgramID(cfg.TokenProgramName) - poolConfigPDA, _ := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, chainState.TokenPool) - poolSigner, _ := solTokenUtil.TokenPoolSignerAddress(tokenPubKey, chainState.TokenPool) + tokenprogramID, _ := chainState.TokenToTokenProgram(tokenPubKey) + poolConfigPDA, _ := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, tokenPool) + poolSigner, _ := solTokenUtil.TokenPoolSignerAddress(tokenPubKey, tokenPool) // ata for token pool createI, tokenPoolATA, err := solTokenUtil.CreateAssociatedTokenAccount( @@ -78,24 +118,38 @@ func AddTokenPool(e deployment.Environment, cfg TokenPoolConfig) (deployment.Cha chain.DeployerKey.PublicKey(), ) if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to create associated token account for tokenpool (mint: %s, pool: %s): %w", tokenPubKey.String(), chainState.TokenPool.String(), err) + return deployment.ChangesetOutput{}, fmt.Errorf("failed to create associated token account for tokenpool (mint: %s, pool: %s): %w", tokenPubKey.String(), tokenPool.String(), err) } + instructions := []solana.Instruction{createI} - solTestTokenPool.SetProgramID(chainState.TokenPool) - // initialize token pool for token - poolInitI, err := solTestTokenPool.NewInitializeInstruction( - cfg.PoolType, - chainState.Router, - poolConfigPDA, - tokenPubKey, - authorityPubKey, // this is assumed to be chain.DeployerKey for now (owner of token pool) - solana.SystemProgramID, - ).ValidateAndBuild() + var poolInitI solana.Instruction + switch cfg.PoolType { + case solTestTokenPool.BurnAndMint_PoolType: + // initialize token pool for token + poolInitI, err = solBurnMintTokenPool.NewInitializeInstruction( + chainState.Router, + poolConfigPDA, + tokenPubKey, + authorityPubKey, // this is assumed to be chain.DeployerKey for now (owner of token pool) + solana.SystemProgramID, + ).ValidateAndBuild() + case solTestTokenPool.LockAndRelease_PoolType: + // initialize token pool for token + poolInitI, err = solLockReleaseTokenPool.NewInitializeInstruction( + chainState.Router, + poolConfigPDA, + tokenPubKey, + authorityPubKey, // this is assumed to be chain.DeployerKey for now (owner of token pool) + solana.SystemProgramID, + ).ValidateAndBuild() + default: + return deployment.ChangesetOutput{}, fmt.Errorf("invalid pool type: %s", cfg.PoolType) + } if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) } - instructions := []solana.Instruction{createI, poolInitI} + instructions = append(instructions, poolInitI) if cfg.PoolType == solTestTokenPool.BurnAndMint_PoolType && tokenPubKey != solana.SolMint { // make pool mint_authority for token @@ -126,10 +180,11 @@ type RemoteChainTokenPoolConfig struct { SolChainSelector uint64 RemoteChainSelector uint64 SolTokenPubKey string + PoolType solTestTokenPool.PoolType // this is actually derivable from on chain given token symbol - RemoteConfig solTestTokenPool.RemoteConfig - InboundRateLimit solTestTokenPool.RateLimitConfig - OutboundRateLimit solTestTokenPool.RateLimitConfig + RemoteConfig solBaseTokenPool.RemoteConfig + InboundRateLimit solBaseTokenPool.RateLimitConfig + OutboundRateLimit solBaseTokenPool.RateLimitConfig } func (cfg RemoteChainTokenPoolConfig) Validate(e deployment.Environment) error { @@ -137,23 +192,38 @@ func (cfg RemoteChainTokenPoolConfig) Validate(e deployment.Environment) error { if err := commonValidation(e, cfg.SolChainSelector, tokenPubKey); err != nil { return err } - state, _ := state2.LoadOnchainState(e) + state, _ := ccipChangeset.LoadOnchainState(e) chainState := state.SolChains[cfg.SolChainSelector] - if chainState.TokenPool.IsZero() { - return fmt.Errorf("token pool not found in existing state, deploy token pool for chain %d", cfg.SolChainSelector) + chain := e.SolChains[cfg.SolChainSelector] + + if err := validatePoolDeployment(chainState, cfg.PoolType, cfg.SolChainSelector); err != nil { + return err } - chain := e.SolChains[cfg.SolChainSelector] - tokenPool := chainState.TokenPool + var tokenPool solana.PublicKey + var poolConfigAccount interface{} + var remoteChainConfigAccount interface{} + + switch cfg.PoolType { + case solTestTokenPool.BurnAndMint_PoolType: + tokenPool = chainState.BurnMintTokenPool + poolConfigAccount = solBurnMintTokenPool.State{} + remoteChainConfigAccount = solBurnMintTokenPool.ChainConfig{} + case solTestTokenPool.LockAndRelease_PoolType: + tokenPool = chainState.LockReleaseTokenPool + poolConfigAccount = solLockReleaseTokenPool.State{} + remoteChainConfigAccount = solLockReleaseTokenPool.ChainConfig{} + default: + return fmt.Errorf("invalid pool type: %s", cfg.PoolType) + } // check if pool config exists (cannot do remote setup without it) poolConfigPDA, err := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, tokenPool) if err != nil { return fmt.Errorf("failed to get token pool config address (mint: %s, pool: %s): %w", tokenPubKey.String(), tokenPool.String(), err) } - var poolConfigAccount solTestTokenPool.State if err := chain.GetAccountDataBorshInto(context.Background(), poolConfigPDA, &poolConfigAccount); err != nil { - return fmt.Errorf("token pool config not found (mint: %s, pool: %s): %w", tokenPubKey.String(), chainState.TokenPool.String(), err) + return fmt.Errorf("token pool config not found (mint: %s, pool: %s, type: %s): %w", tokenPubKey.String(), tokenPool.String(), cfg.PoolType, err) } // check if this remote chain is already configured for this token @@ -161,9 +231,8 @@ func (cfg RemoteChainTokenPoolConfig) Validate(e deployment.Environment) error { if err != nil { return fmt.Errorf("failed to get token pool remote chain config pda (remoteSelector: %d, mint: %s, pool: %s): %w", cfg.RemoteChainSelector, tokenPubKey.String(), tokenPool.String(), err) } - var remoteChainConfigAccount solTestTokenPool.ChainConfig if err := chain.GetAccountDataBorshInto(context.Background(), remoteChainConfigPDA, &remoteChainConfigAccount); err == nil { - return fmt.Errorf("remote chain config already exists for (remoteSelector: %d, mint: %s, pool: %s)", cfg.RemoteChainSelector, tokenPubKey.String(), tokenPool.String()) + return fmt.Errorf("remote chain config already exists for (remoteSelector: %d, mint: %s, pool: %s, type: %s)", cfg.RemoteChainSelector, tokenPubKey.String(), tokenPool.String(), cfg.PoolType) } return nil } @@ -172,16 +241,44 @@ func SetupTokenPoolForRemoteChain(e deployment.Environment, cfg RemoteChainToken if err := cfg.Validate(e); err != nil { return deployment.ChangesetOutput{}, err } - tokenPubKey := solana.MustPublicKeyFromBase58(cfg.SolTokenPubKey) + chain := e.SolChains[cfg.SolChainSelector] - state, _ := state2.LoadOnchainState(e) + state, _ := ccipChangeset.LoadOnchainState(e) chainState := state.SolChains[cfg.SolChainSelector] - // verified - poolConfigPDA, _ := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, chainState.TokenPool) - remoteChainConfigPDA, _, _ := solTokenUtil.TokenPoolChainConfigPDA(cfg.RemoteChainSelector, tokenPubKey, chainState.TokenPool) + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.SolTokenPubKey) - solTestTokenPool.SetProgramID(chainState.TokenPool) - ixConfigure, err := solTestTokenPool.NewInitChainRemoteConfigInstruction( + var instructions []solana.Instruction + var err error + switch cfg.PoolType { + case solTestTokenPool.BurnAndMint_PoolType: + instructions, err = getInstructionsForBurnMint(chain, chainState, cfg) + case solTestTokenPool.LockAndRelease_PoolType: + instructions, err = getInstructionsForLockRelease(chain, chainState, cfg) + default: + return deployment.ChangesetOutput{}, fmt.Errorf("invalid pool type: %s", cfg.PoolType) + } + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) + } + + err = chain.Confirm(instructions) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) + } + e.Logger.Infow("Configured token pool for remote chain", "remote_chain_selector", cfg.RemoteChainSelector, "token_pubkey", tokenPubKey.String()) + return deployment.ChangesetOutput{}, nil +} + +func getInstructionsForBurnMint( + chain deployment.SolChain, + chainState ccipChangeset.SolCCIPChainState, + cfg RemoteChainTokenPoolConfig, +) ([]solana.Instruction, error) { + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.SolTokenPubKey) + poolConfigPDA, _ := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, chainState.BurnMintTokenPool) + remoteChainConfigPDA, _, _ := solTokenUtil.TokenPoolChainConfigPDA(cfg.RemoteChainSelector, tokenPubKey, chainState.BurnMintTokenPool) + solBurnMintTokenPool.SetProgramID(chainState.BurnMintTokenPool) + ixConfigure, err := solBurnMintTokenPool.NewInitChainRemoteConfigInstruction( cfg.RemoteChainSelector, tokenPubKey, cfg.RemoteConfig, @@ -191,9 +288,9 @@ func SetupTokenPoolForRemoteChain(e deployment.Environment, cfg RemoteChainToken solana.SystemProgramID, ).ValidateAndBuild() if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) + return nil, fmt.Errorf("failed to generate instructions: %w", err) } - ixRates, err := solTestTokenPool.NewSetChainRateLimitInstruction( + ixRates, err := solBurnMintTokenPool.NewSetChainRateLimitInstruction( cfg.RemoteChainSelector, tokenPubKey, cfg.InboundRateLimit, @@ -204,10 +301,9 @@ func SetupTokenPoolForRemoteChain(e deployment.Environment, cfg RemoteChainToken solana.SystemProgramID, ).ValidateAndBuild() if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) + return nil, fmt.Errorf("failed to generate instructions: %w", err) } - - ixAppend, err := solTestTokenPool.NewAppendRemotePoolAddressesInstruction( + ixAppend, err := solBurnMintTokenPool.NewAppendRemotePoolAddressesInstruction( cfg.RemoteChainSelector, tokenPubKey, cfg.RemoteConfig.PoolAddresses, // i dont know why this is a list (is it for different types of pool of the same token?) @@ -217,23 +313,65 @@ func SetupTokenPoolForRemoteChain(e deployment.Environment, cfg RemoteChainToken solana.SystemProgramID, ).ValidateAndBuild() if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) + return nil, fmt.Errorf("failed to generate instructions: %w", err) } + return []solana.Instruction{ixConfigure, ixRates, ixAppend}, nil +} - instructions := []solana.Instruction{ixConfigure, ixRates, ixAppend} - err = chain.Confirm(instructions) +func getInstructionsForLockRelease( + chain deployment.SolChain, + chainState ccipChangeset.SolCCIPChainState, + cfg RemoteChainTokenPoolConfig, +) ([]solana.Instruction, error) { + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.SolTokenPubKey) + poolConfigPDA, _ := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, chainState.LockReleaseTokenPool) + remoteChainConfigPDA, _, _ := solTokenUtil.TokenPoolChainConfigPDA(cfg.RemoteChainSelector, tokenPubKey, chainState.LockReleaseTokenPool) + solLockReleaseTokenPool.SetProgramID(chainState.LockReleaseTokenPool) + ixConfigure, err := solLockReleaseTokenPool.NewInitChainRemoteConfigInstruction( + cfg.RemoteChainSelector, + tokenPubKey, + cfg.RemoteConfig, + poolConfigPDA, + remoteChainConfigPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + ).ValidateAndBuild() if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) + return nil, fmt.Errorf("failed to generate instructions: %w", err) } - e.Logger.Infow("Configured token pool for remote chain", "remote_chain_selector", cfg.RemoteChainSelector, "token_pubkey", tokenPubKey.String()) - return deployment.ChangesetOutput{}, nil + ixRates, err := solLockReleaseTokenPool.NewSetChainRateLimitInstruction( + cfg.RemoteChainSelector, + tokenPubKey, + cfg.InboundRateLimit, + cfg.OutboundRateLimit, + poolConfigPDA, + remoteChainConfigPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + ).ValidateAndBuild() + if err != nil { + return nil, fmt.Errorf("failed to generate instructions: %w", err) + } + ixAppend, err := solLockReleaseTokenPool.NewAppendRemotePoolAddressesInstruction( + cfg.RemoteChainSelector, + tokenPubKey, + cfg.RemoteConfig.PoolAddresses, // i dont know why this is a list (is it for different types of pool of the same token?) + poolConfigPDA, + remoteChainConfigPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + ).ValidateAndBuild() + if err != nil { + return nil, fmt.Errorf("failed to generate instructions: %w", err) + } + return []solana.Instruction{ixConfigure, ixRates, ixAppend}, nil } // ADD TOKEN POOL LOOKUP TABLE type TokenPoolLookupTableConfig struct { ChainSelector uint64 TokenPubKey string - TokenProgram string // this can go as a address book tag + PoolType solTestTokenPool.PoolType } func (cfg TokenPoolLookupTableConfig) Validate(e deployment.Environment) error { @@ -241,13 +379,13 @@ func (cfg TokenPoolLookupTableConfig) Validate(e deployment.Environment) error { if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { return err } - state, _ := state2.LoadOnchainState(e) + state, _ := ccipChangeset.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] - if chainState.TokenPool.IsZero() { - return fmt.Errorf("token pool not found in existing state, deploy the token pool first for chain %d", cfg.ChainSelector) + _, err := chainState.TokenToTokenProgram(tokenPubKey) + if err != nil { + return fmt.Errorf("failed to get token program for token address %s: %w", tokenPubKey.String(), err) } - - return nil + return validatePoolDeployment(chainState, cfg.PoolType, cfg.ChainSelector) } func AddTokenPoolLookupTable(e deployment.Environment, cfg TokenPoolLookupTableConfig) (deployment.ChangesetOutput, error) { @@ -257,15 +395,20 @@ func AddTokenPoolLookupTable(e deployment.Environment, cfg TokenPoolLookupTableC chain := e.SolChains[cfg.ChainSelector] ctx := e.GetContext() client := chain.Client - state, _ := state2.LoadOnchainState(e) + state, _ := ccipChangeset.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] authorityPrivKey := chain.DeployerKey // assuming the authority is the deployer key tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) - + tokenPool := solana.PublicKey{} + if cfg.PoolType == solTestTokenPool.BurnAndMint_PoolType { + tokenPool = chainState.BurnMintTokenPool + } else if cfg.PoolType == solTestTokenPool.LockAndRelease_PoolType { + tokenPool = chainState.LockReleaseTokenPool + } tokenAdminRegistryPDA, _, _ := solState.FindTokenAdminRegistryPDA(tokenPubKey, chainState.Router) - tokenPoolChainConfigPDA, _ := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, chainState.TokenPool) - tokenPoolSigner, _ := solTokenUtil.TokenPoolSignerAddress(tokenPubKey, chainState.TokenPool) - tokenProgram, _ := GetTokenProgramID(cfg.TokenProgram) + tokenPoolChainConfigPDA, _ := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, tokenPool) + tokenPoolSigner, _ := solTokenUtil.TokenPoolSignerAddress(tokenPubKey, tokenPool) + tokenProgram, _ := chainState.TokenToTokenProgram(tokenPubKey) poolTokenAccount, _, _ := solTokenUtil.FindAssociatedTokenAddress(tokenProgram, tokenPubKey, tokenPoolSigner) feeTokenConfigPDA, _, _ := solState.FindFqBillingTokenConfigPDA(tokenPubKey, chainState.FeeQuoter) @@ -279,7 +422,7 @@ func AddTokenPoolLookupTable(e deployment.Environment, cfg TokenPoolLookupTableC list := solana.PublicKeySlice{ table, // 0 tokenAdminRegistryPDA, // 1 - chainState.TokenPool, // 2 + tokenPool, // 2 tokenPoolChainConfigPDA, // 3 - writable poolTokenAccount, // 4 - writable tokenPoolSigner, // 5 @@ -294,7 +437,7 @@ func AddTokenPoolLookupTable(e deployment.Environment, cfg TokenPoolLookupTableC return deployment.ChangesetOutput{}, fmt.Errorf("failed to await slot change while extending lookup table: %w", err) } newAddressBook := deployment.NewMemoryAddressBook() - tv := deployment.NewTypeAndVersion(changeset.TokenPoolLookupTable, deployment.Version1_0_0) + tv := deployment.NewTypeAndVersion(ccipChangeset.TokenPoolLookupTable, deployment.Version1_0_0) tv.Labels.Add(tokenPubKey.String()) if err := newAddressBook.Save(cfg.ChainSelector, table.String(), tv); err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to save tokenpool address lookup table: %w", err) @@ -309,7 +452,6 @@ type SetPoolConfig struct { ChainSelector uint64 TokenPubKey string TokenAdminRegistryAdminPrivateKey string - PoolLookupTable string WritableIndexes []uint8 } @@ -318,12 +460,9 @@ func (cfg SetPoolConfig) Validate(e deployment.Environment) error { if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { return err } - state, _ := state2.LoadOnchainState(e) + state, _ := ccipChangeset.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] chain := e.SolChains[cfg.ChainSelector] - if chainState.TokenPool.IsZero() { - return fmt.Errorf("token pool not found in existing state, deploy the token pool first for chain %d", cfg.ChainSelector) - } if err := validateRouterConfig(chain, chainState); err != nil { return err } @@ -335,6 +474,9 @@ func (cfg SetPoolConfig) Validate(e deployment.Environment) error { if err := chain.GetAccountDataBorshInto(context.Background(), tokenAdminRegistryPDA, &tokenAdminRegistryAccount); err != nil { return fmt.Errorf("token admin registry not found for (mint: %s, router: %s), cannot set pool", tokenPubKey.String(), chainState.Router.String()) } + if _, ok := chainState.TokenPoolLookupTable[tokenPubKey]; !ok { + return fmt.Errorf("token pool lookup table not found for (mint: %s)", tokenPubKey.String()) + } return nil } @@ -345,13 +487,13 @@ func SetPool(e deployment.Environment, cfg SetPoolConfig) (deployment.ChangesetO } chain := e.SolChains[cfg.ChainSelector] - state, _ := state2.LoadOnchainState(e) + state, _ := ccipChangeset.LoadOnchainState(e) chainState := state.SolChains[cfg.ChainSelector] tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) routerConfigPDA, _, _ := solState.FindConfigPDA(chainState.Router) tokenAdminRegistryPDA, _, _ := solState.FindTokenAdminRegistryPDA(tokenPubKey, chainState.Router) tokenAdminRegistryAdminPrivKey := solana.MustPrivateKeyFromBase58(cfg.TokenAdminRegistryAdminPrivateKey) - lookupTablePubKey := solana.MustPublicKeyFromBase58(cfg.PoolLookupTable) + lookupTablePubKey := chainState.TokenPoolLookupTable[tokenPubKey] base := solRouter.NewSetPoolInstruction( cfg.WritableIndexes, diff --git a/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock_test.go b/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock_test.go index 7afa768b196..94f34753ba6 100644 --- a/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock_test.go +++ b/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock_test.go @@ -22,11 +22,14 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" "github.com/smartcontractkit/chainlink/v2/core/logger" + solBinary "github.com/gagliardetto/binary" + "github.com/smartcontractkit/chainlink/deployment" solanachangesets "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" commonState "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" @@ -245,11 +248,18 @@ func prepareEnvironmentForOwnershipTransfer(t *testing.T) (deployment.Environmen }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(solanachangesets.DeployChainContractsChangesetSolana), - solanachangesets.DeployChainContractsConfigSolana{ - DeployChainContractsConfig: v1_6.DeployChainContractsConfig{ - HomeChainSelector: homeChainSel, - ContractParamsPerChain: contractParams, + deployment.CreateLegacyChangeSet(solanachangesets.DeployChainContractsChangeset), + solanachangesets.DeployChainContractsConfig{ + HomeChainSelector: homeChainSel, + ContractParamsPerChain: map[uint64]solanachangesets.ChainContractParams{ + solChain1: { + FeeQuoterParams: solanachangesets.FeeQuoterParams{ + DefaultMaxFeeJuelsPerMsg: solBinary.Uint128{Lo: 300000000, Hi: 0, Endianness: nil}, + }, + OffRampParams: solanachangesets.OffRampParams{ + EnableExecutionAfter: int64(globals.PermissionLessExecutionThreshold.Seconds()), + }, + }, }, }, ), @@ -257,7 +267,7 @@ func prepareEnvironmentForOwnershipTransfer(t *testing.T) (deployment.Environmen deployment.CreateLegacyChangeSet(solanachangesets.DeploySolanaToken), solanachangesets.DeploySolanaTokenConfig{ ChainSelector: solChain1, - TokenProgramName: deployment.SPL2022Tokens, + TokenProgramName: changeset.SPL2022Tokens, TokenDecimals: 9, }, ), @@ -285,11 +295,10 @@ func prepareEnvironmentForOwnershipTransfer(t *testing.T) (deployment.Environmen commonchangeset.Configure( deployment.CreateLegacyChangeSet(solanachangesets.AddTokenPool), solanachangesets.TokenPoolConfig{ - ChainSelector: solChain1, - TokenPubKey: tokenAddress.String(), - TokenProgramName: deployment.SPL2022Tokens, - PoolType: test_token_pool.LockAndRelease_PoolType, - Authority: e.SolChains[solChain1].DeployerKey.PublicKey().String(), + ChainSelector: solChain1, + TokenPubKey: tokenAddress.String(), + PoolType: test_token_pool.LockAndRelease_PoolType, + Authority: e.SolChains[solChain1].DeployerKey.PublicKey().String(), }, ), }) diff --git a/deployment/ccip/changeset/solana_state.go b/deployment/ccip/changeset/solana_state.go index eb585d219e6..e48f5165677 100644 --- a/deployment/ccip/changeset/solana_state.go +++ b/deployment/ccip/changeset/solana_state.go @@ -18,12 +18,14 @@ import ( commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" ) -var ( - TokenPool deployment.ContractType = "TokenPool" - Receiver deployment.ContractType = "Receiver" - SPL2022Tokens deployment.ContractType = "SPL2022Tokens" - WSOL deployment.ContractType = "WSOL" - FeeAggregator deployment.ContractType = "FeeAggregator" +const ( + OfframpAddressLookupTable deployment.ContractType = "OfframpAddressLookupTable" + TokenPool deployment.ContractType = "TokenPool" + Receiver deployment.ContractType = "Receiver" + SPL2022Tokens deployment.ContractType = "SPL2022Tokens" + SPLTokens deployment.ContractType = "SPLTokens" + WSOL deployment.ContractType = "WSOL" + FeeAggregator deployment.ContractType = "FeeAggregator" // for PDAs from AddRemoteChainToSolana RemoteSource deployment.ContractType = "RemoteSource" RemoteDest deployment.ContractType = "RemoteDest" @@ -35,15 +37,20 @@ var ( // SolCCIPChainState holds public keys for all the currently deployed CCIP programs // on a chain. If a key has zero value, it means the program does not exist on the chain. type SolCCIPChainState struct { - LinkToken solana.PublicKey - Router solana.PublicKey - Receiver solana.PublicKey // for tests only - SPL2022Tokens []solana.PublicKey - TokenPool solana.PublicKey - WSOL solana.PublicKey - FeeQuoter solana.PublicKey - OffRamp solana.PublicKey - FeeAggregator solana.PublicKey + LinkToken solana.PublicKey + Router solana.PublicKey + OfframpAddressLookupTable solana.PublicKey + Receiver solana.PublicKey // for tests only + SPL2022Tokens []solana.PublicKey + SPLTokens []solana.PublicKey + // TokenPool solana.PublicKey + BurnMintTokenPool solana.PublicKey + LockReleaseTokenPool solana.PublicKey + WSOL solana.PublicKey + FeeQuoter solana.PublicKey + OffRamp solana.PublicKey + FeeAggregator solana.PublicKey + // PDAs to avoid redundant lookups RouterConfigPDA solana.PublicKey SourceChainStatePDAs map[uint64]solana.PublicKey // deprecated @@ -92,6 +99,8 @@ func LoadChainStateSolana(chain deployment.SolChain, addresses map[string]deploy SourceChainStatePDAs: make(map[uint64]solana.PublicKey), DestChainStatePDAs: make(map[uint64]solana.PublicKey), SPL2022Tokens: make([]solana.PublicKey, 0), + SPLTokens: make([]solana.PublicKey, 0), + WSOL: solana.SolMint, TokenPoolLookupTable: make(map[solana.PublicKey]solana.PublicKey), } // Most programs upgraded in place, but some are not so we always want to @@ -116,9 +125,9 @@ func LoadChainStateSolana(chain deployment.SolChain, addresses map[string]deploy case SPL2022Tokens: pub := solana.MustPublicKeyFromBase58(address) state.SPL2022Tokens = append(state.SPL2022Tokens, pub) - case TokenPool: + case SPLTokens: pub := solana.MustPublicKeyFromBase58(address) - state.TokenPool = pub + state.SPLTokens = append(state.SPLTokens, pub) case RemoteSource: pub := solana.MustPublicKeyFromBase58(address) // Labels should only have one entry @@ -179,6 +188,12 @@ func LoadChainStateSolana(chain deployment.SolChain, addresses map[string]deploy case FeeAggregator: pub := solana.MustPublicKeyFromBase58(address) state.FeeAggregator = pub + case BurnMintTokenPool: + pub := solana.MustPublicKeyFromBase58(address) + state.BurnMintTokenPool = pub + case LockReleaseTokenPool: + pub := solana.MustPublicKeyFromBase58(address) + state.LockReleaseTokenPool = pub default: log.Warn().Str("address", address).Str("type", string(tvStr.Type)).Msg("Unknown address type") continue @@ -190,10 +205,29 @@ func LoadChainStateSolana(chain deployment.SolChain, addresses map[string]deploy } versions[tvStr.Type] = tvStr.Version } - state.WSOL = solana.SolMint return state, nil } +func (s SolCCIPChainState) TokenToTokenProgram(tokenAddress solana.PublicKey) (solana.PublicKey, error) { + if tokenAddress.Equals(s.LinkToken) { + return solana.Token2022ProgramID, nil + } + if tokenAddress.Equals(s.WSOL) { + return solana.TokenProgramID, nil + } + for _, spl2022Token := range s.SPL2022Tokens { + if spl2022Token.Equals(tokenAddress) { + return solana.Token2022ProgramID, nil + } + } + for _, splToken := range s.SPLTokens { + if splToken.Equals(tokenAddress) { + return solana.TokenProgramID, nil + } + } + return solana.PublicKey{}, fmt.Errorf("token program not found for token address %s", tokenAddress.String()) +} + func FindSolanaAddress(tv deployment.TypeAndVersion, addresses map[string]deployment.TypeAndVersion) solana.PublicKey { for address, tvStr := range addresses { if tv.String() == tvStr.String() { @@ -203,10 +237,3 @@ func FindSolanaAddress(tv deployment.TypeAndVersion, addresses map[string]deploy } return solana.PublicKey{} } - -func (c SolCCIPChainState) OnRampBytes() ([]byte, error) { - if !c.Router.IsZero() { - return c.Router.Bytes(), nil - } - return nil, errors.New("no onramp found in the state") -} diff --git a/deployment/ccip/changeset/state.go b/deployment/ccip/changeset/state.go index d813fb97d74..865521b7432 100644 --- a/deployment/ccip/changeset/state.go +++ b/deployment/ccip/changeset/state.go @@ -230,13 +230,6 @@ func (c CCIPChainState) LinkTokenAddress() (common.Address, error) { return common.Address{}, errors.New("no link token found in the state") } -func (c CCIPChainState) OnRampBytes() ([]byte, error) { - if c.OnRamp != nil { - return c.OnRamp.Address().Bytes(), nil - } - return nil, errors.New("no onramp found in the state") -} - func (c CCIPChainState) GenerateView() (view.ChainView, error) { chainView := view.NewChain() if c.Router != nil { @@ -574,7 +567,7 @@ func (s CCIPOnChainState) View(chains []uint64) (map[string]view.ChainView, erro return m, nil } -func (s CCIPOnChainState) GetOffRampAddress(chainSelector uint64) ([]byte, error) { +func (s CCIPOnChainState) GetOffRampAddressBytes(chainSelector uint64) ([]byte, error) { family, err := chain_selectors.GetSelectorFamily(chainSelector) if err != nil { return nil, err @@ -593,6 +586,31 @@ func (s CCIPOnChainState) GetOffRampAddress(chainSelector uint64) ([]byte, error return offRampAddress, nil } +func (s CCIPOnChainState) GetOnRampAddressBytes(chainSelector uint64) ([]byte, error) { + family, err := chain_selectors.GetSelectorFamily(chainSelector) + if err != nil { + return nil, err + } + + var onRampAddressBytes []byte + switch family { + case chain_selectors.FamilyEVM: + if s.Chains[chainSelector].OnRamp == nil { + return nil, fmt.Errorf("no onramp found in the state for chain %d", chainSelector) + } + onRampAddressBytes = s.Chains[chainSelector].OnRamp.Address().Bytes() + case chain_selectors.FamilySolana: + if s.SolChains[chainSelector].Router.IsZero() { + return nil, fmt.Errorf("no router found in the state for chain %d", chainSelector) + } + onRampAddressBytes = s.SolChains[chainSelector].Router.Bytes() + default: + return nil, fmt.Errorf("unsupported chain family %s", family) + } + + return onRampAddressBytes, nil +} + func (s CCIPOnChainState) ValidateRamp(chainSelector uint64, rampType deployment.ContractType) error { family, err := chain_selectors.GetSelectorFamily(chainSelector) if err != nil { diff --git a/deployment/ccip/changeset/testhelpers/test_environment.go b/deployment/ccip/changeset/testhelpers/test_environment.go index 520bacde3e6..cd8f009060c 100644 --- a/deployment/ccip/changeset/testhelpers/test_environment.go +++ b/deployment/ccip/changeset/testhelpers/test_environment.go @@ -21,14 +21,16 @@ import ( commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" + solBinary "github.com/gagliardetto/binary" + "github.com/smartcontractkit/chainlink-ccip/chainconfig" + solFeeQuoter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-ccip/pluginconfig" "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" - changeset_solana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" + ccipChangeSetSolana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" @@ -526,7 +528,7 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn // no proposals to be made, timelock can be passed as nil here var apps []commonchangeset.ConfiguredChangeSet evmContractParams := make(map[uint64]v1_6.ChainContractParams) - solContractParams := make(map[uint64]v1_6.ChainContractParams) + solContractParams := make(map[uint64]ccipChangeSetSolana.ChainContractParams) evmChains := []uint64{} for _, chain := range allChains { if _, ok := e.Env.Chains[chain]; ok { @@ -548,10 +550,40 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn } } + value := [28]uint8{} + bigNum, ok := new(big.Int).SetString("19816680000000000000", 10) + require.True(t, ok) + bigNum.FillBytes(value[:]) + state, err := changeset.LoadOnchainState(e.Env) + require.NoError(t, err) for _, chain := range solChains { - solContractParams[chain] = v1_6.ChainContractParams{ - FeeQuoterParams: v1_6.DefaultFeeQuoterParams(), - OffRampParams: v1_6.DefaultOffRampParams(), + solContractParams[chain] = ccipChangeSetSolana.ChainContractParams{ + FeeQuoterParams: ccipChangeSetSolana.FeeQuoterParams{ + DefaultMaxFeeJuelsPerMsg: solBinary.Uint128{Lo: 300000000, Hi: 0, Endianness: nil}, + BillingConfig: []solFeeQuoter.BillingTokenConfig{ + { + Enabled: true, + Mint: state.SolChains[chain].LinkToken, + UsdPerToken: solFeeQuoter.TimestampedPackedU224{ + Value: value, + Timestamp: int64(100), + }, + PremiumMultiplierWeiPerEth: 100, + }, + { + Enabled: true, + Mint: state.SolChains[chain].WSOL, + UsdPerToken: solFeeQuoter.TimestampedPackedU224{ + Value: value, + Timestamp: int64(100), + }, + PremiumMultiplierWeiPerEth: 100, + }, + }, + }, + OffRampParams: ccipChangeSetSolana.OffRampParams{ + EnableExecutionAfter: int64(globals.PermissionLessExecutionThreshold.Seconds()), + }, } } @@ -576,19 +608,17 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(solana.DeployChainContractsChangesetSolana), - solana.DeployChainContractsConfigSolana{ - DeployChainContractsConfig: v1_6.DeployChainContractsConfig{ - HomeChainSelector: e.HomeChainSel, - ContractParamsPerChain: solContractParams, - }, + deployment.CreateLegacyChangeSet(ccipChangeSetSolana.DeployChainContractsChangeset), + ccipChangeSetSolana.DeployChainContractsConfig{ + HomeChainSelector: e.HomeChainSel, + ContractParamsPerChain: solContractParams, }, ), }...) e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, nil, apps) require.NoError(t, err) - state, err := changeset.LoadOnchainState(e.Env) + state, err = changeset.LoadOnchainState(e.Env) require.NoError(t, err) // Assert link present if tc.IsStaticLink { @@ -772,7 +802,7 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn ), commonchangeset.Configure( // Enable the OCR config on the remote chains. - deployment.CreateLegacyChangeSet(changeset_solana.SetOCR3ConfigSolana), + deployment.CreateLegacyChangeSet(ccipChangeSetSolana.SetOCR3ConfigSolana), v1_6.SetOCR3OffRampConfig{ HomeChainSel: e.HomeChainSel, RemoteChainSels: solChains, diff --git a/deployment/ccip/changeset/testhelpers/test_helpers.go b/deployment/ccip/changeset/testhelpers/test_helpers.go index f6e2b4fb53a..33683f0c217 100644 --- a/deployment/ccip/changeset/testhelpers/test_helpers.go +++ b/deployment/ccip/changeset/testhelpers/test_helpers.go @@ -20,7 +20,7 @@ import ( "github.com/pkg/errors" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - changeset_solana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" + ccipChangeSetSolana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" @@ -455,10 +455,10 @@ func addLaneSolanaChangesets(t *testing.T, solChainSelector, remoteChainSelector } solanaChangesets := []commoncs.ConfiguredChangeSet{ commoncs.Configure( - deployment.CreateLegacyChangeSet(changeset_solana.AddRemoteChainToSolana), - changeset_solana.AddRemoteChainToSolanaConfig{ + deployment.CreateLegacyChangeSet(ccipChangeSetSolana.AddRemoteChainToSolana), + ccipChangeSetSolana.AddRemoteChainToSolanaConfig{ ChainSelector: solChainSelector, - UpdatesByChain: map[uint64]changeset_solana.RemoteChainConfigSolana{ + UpdatesByChain: map[uint64]ccipChangeSetSolana.RemoteChainConfigSolana{ remoteChainSelector: { EnabledAsSource: true, RouterDestinationConfig: solRouter.DestChainConfig{}, @@ -864,10 +864,10 @@ func DeployTransferableTokenSolana( e, err = commoncs.Apply(t, e, nil, commoncs.Configure( // this makes the deployer the mint authority by default - deployment.CreateLegacyChangeSet(changeset_solana.DeploySolanaToken), - changeset_solana.DeploySolanaTokenConfig{ + deployment.CreateLegacyChangeSet(ccipChangeSetSolana.DeploySolanaToken), + ccipChangeSetSolana.DeploySolanaTokenConfig{ ChainSelector: solChainSel, - TokenProgramName: deployment.SPL2022Tokens, + TokenProgramName: changeset.SPL2022Tokens, TokenDecimals: 9, }, ), @@ -881,21 +881,20 @@ func DeployTransferableTokenSolana( e, err = commoncs.Apply(t, e, nil, commoncs.Configure( // create the ata for the deployerKey - deployment.CreateLegacyChangeSet(changeset_solana.CreateSolanaTokenATA), - changeset_solana.CreateSolanaTokenATAConfig{ + deployment.CreateLegacyChangeSet(ccipChangeSetSolana.CreateSolanaTokenATA), + ccipChangeSetSolana.CreateSolanaTokenATAConfig{ ChainSelector: solChainSel, TokenPubkey: solTokenAddress, - TokenProgram: deployment.SPL2022Tokens, + TokenProgram: changeset.SPL2022Tokens, ATAList: []string{solDeployerKey.String()}, }, ), commoncs.Configure( // mint the token to the deployerKey - deployment.CreateLegacyChangeSet(changeset_solana.MintSolanaToken), - changeset_solana.MintSolanaTokenConfig{ + deployment.CreateLegacyChangeSet(ccipChangeSetSolana.MintSolanaToken), + ccipChangeSetSolana.MintSolanaTokenConfig{ ChainSelector: solChainSel, TokenPubkey: solTokenAddress.String(), - TokenProgram: deployment.SPL2022Tokens, AmountToAddress: map[string]uint64{ solDeployerKey.String(): uint64(1000), }, @@ -903,20 +902,19 @@ func DeployTransferableTokenSolana( ), commoncs.Configure( // deploy token pool and set the burn/mint authority to the tokenPool - deployment.CreateLegacyChangeSet(changeset_solana.AddTokenPool), - changeset_solana.TokenPoolConfig{ - ChainSelector: solChainSel, - TokenPubKey: solTokenAddress.String(), - TokenProgramName: deployment.SPL2022Tokens, - PoolType: solTestTokenPool.BurnAndMint_PoolType, - Authority: solDeployerKey.String(), + deployment.CreateLegacyChangeSet(ccipChangeSetSolana.AddTokenPool), + ccipChangeSetSolana.TokenPoolConfig{ + ChainSelector: solChainSel, + TokenPubKey: solTokenAddress.String(), + PoolType: solTestTokenPool.BurnAndMint_PoolType, + Authority: solDeployerKey.String(), }, ), ) require.NoError(t, err) // configure evm - poolConfigPDA, err := solTokenUtil.TokenPoolConfigAddress(solTokenAddress, state.SolChains[solChainSel].TokenPool) + poolConfigPDA, err := solTokenUtil.TokenPoolConfigAddress(solTokenAddress, state.SolChains[solChainSel].BurnMintTokenPool) require.NoError(t, err) err = setTokenPoolCounterPart(e.Chains[evmChainSel], evmPool, evmDeployer, solChainSel, solTokenAddress.Bytes(), poolConfigPDA.Bytes()) require.NoError(t, err) @@ -927,8 +925,8 @@ func DeployTransferableTokenSolana( // configure solana e, err = commoncs.Apply(t, e, nil, commoncs.Configure( - deployment.CreateLegacyChangeSet(changeset_solana.SetupTokenPoolForRemoteChain), - changeset_solana.RemoteChainTokenPoolConfig{ + deployment.CreateLegacyChangeSet(ccipChangeSetSolana.SetupTokenPoolForRemoteChain), + ccipChangeSetSolana.RemoteChainTokenPoolConfig{ SolChainSelector: solChainSel, RemoteChainSelector: evmChainSel, SolTokenPubKey: solTokenAddress.String(), @@ -956,6 +954,22 @@ func DeployTransferableTokenSolana( }, }, ), + commoncs.Configure( + deployment.CreateLegacyChangeSet(ccipChangeSetSolana.AddBillingTokenForRemoteChain), + ccipChangeSetSolana.BillingTokenForRemoteChainConfig{ + ChainSelector: solChainSel, + RemoteChainSelector: evmChainSel, + TokenPubKey: solTokenAddress.String(), + Config: solFeeQuoter.TokenTransferFeeConfig{ + MinFeeUsdcents: 800, + MaxFeeUsdcents: 1600, + DeciBps: 0, + DestGasOverhead: 100, + DestBytesOverhead: 100, + IsEnabled: true, + }, + }, + ), ) require.NoError(t, err) @@ -1542,6 +1556,12 @@ func SavePreloadedSolAddresses(t *testing.T, e deployment.Environment, solChainS tv = deployment.NewTypeAndVersion(changeset.OffRamp, deployment.Version1_0_0) err = e.ExistingAddresses.Save(solChainSelector, solTestConfig.CcipOfframpProgram.String(), tv) require.NoError(t, err) + tv = deployment.NewTypeAndVersion(changeset.BurnMintTokenPool, deployment.Version1_0_0) + err = e.ExistingAddresses.Save(solChainSelector, "TokenPooL11111111111111111111111111BurnMint", tv) + require.NoError(t, err) + tv = deployment.NewTypeAndVersion(changeset.LockReleaseTokenPool, deployment.Version1_0_0) + err = e.ExistingAddresses.Save(solChainSelector, "TokenPooL11111111111111111111111LockReLease", tv) + require.NoError(t, err) tv = deployment.NewTypeAndVersion(commontypes.ManyChainMultisigProgram, deployment.Version1_0_0) err = e.ExistingAddresses.Save(solChainSelector, memory.SolanaProgramIDs["mcm"], tv) require.NoError(t, err) diff --git a/deployment/ccip/changeset/v1_6/cs_ccip_home.go b/deployment/ccip/changeset/v1_6/cs_ccip_home.go index 699e66f51bb..c93865e9b0d 100644 --- a/deployment/ccip/changeset/v1_6/cs_ccip_home.go +++ b/deployment/ccip/changeset/v1_6/cs_ccip_home.go @@ -632,7 +632,7 @@ func AddDonAndSetCandidateChangeset( } var donMcmsTxs []mcmstypes.Transaction for chainSelector, params := range cfg.PluginInfo.OCRConfigPerRemoteChainSelector { - offRampAddress, err := state.GetOffRampAddress(chainSelector) + offRampAddress, err := state.GetOffRampAddressBytes(chainSelector) if err != nil { return deployment.ChangesetOutput{}, err } @@ -827,7 +827,7 @@ func SetCandidateChangeset( for _, plugin := range cfg.PluginInfo { pluginInfos = append(pluginInfos, plugin.String()) for chainSelector, params := range plugin.OCRConfigPerRemoteChainSelector { - offRampAddress, err := state.GetOffRampAddress(chainSelector) + offRampAddress, err := state.GetOffRampAddressBytes(chainSelector) if err != nil { return deployment.ChangesetOutput{}, err } diff --git a/deployment/ccip/changeset/v1_6/cs_chain_contracts.go b/deployment/ccip/changeset/v1_6/cs_chain_contracts.go index bd45ea24e94..fdb66bf6087 100644 --- a/deployment/ccip/changeset/v1_6/cs_chain_contracts.go +++ b/deployment/ccip/changeset/v1_6/cs_chain_contracts.go @@ -1154,15 +1154,8 @@ func UpdateOffRampSourcesChangeset(e deployment.Environment, cfg UpdateOffRampSo } else { router = state.Chains[chainSel].Router.Address() } - sourceChainFamily, _ := chain_selectors.GetSelectorFamily(source) - - onRampBytes := []byte{} // can ignore err as validation checks for nil addresses - if sourceChainFamily == chain_selectors.FamilyEVM { - onRampBytes, _ = state.Chains[source].OnRampBytes() - } else if sourceChainFamily == chain_selectors.FamilySolana { - onRampBytes, _ = state.SolChains[source].OnRampBytes() - } + onRampBytes, _ := state.GetOnRampAddressBytes(source) args = append(args, offramp.OffRampSourceChainConfigArgs{ SourceChainSelector: source, diff --git a/deployment/environment/memory/chain.go b/deployment/environment/memory/chain.go index b6fd091ec12..2c91c86ab8a 100644 --- a/deployment/environment/memory/chain.go +++ b/deployment/environment/memory/chain.go @@ -226,15 +226,17 @@ func evmChain(t *testing.T, numUsers int) EVMChain { } var SolanaProgramIDs = map[string]string{ - "ccip_router": solTestConfig.CcipRouterProgram.String(), - "test_token_pool": solTestConfig.CcipTokenPoolProgram.String(), - "fee_quoter": solTestConfig.FeeQuoterProgram.String(), - "test_ccip_receiver": solTestConfig.CcipLogicReceiver.String(), - "ccip_offramp": solTestConfig.CcipOfframpProgram.String(), - "mcm": solTestConfig.McmProgram.String(), - "timelock": solTestConfig.TimelockProgram.String(), - "access_controller": solTestConfig.AccessControllerProgram.String(), - "external_program_cpi_stub": solTestConfig.ExternalCpiStubProgram.String(), + "ccip_router": solTestConfig.CcipRouterProgram.String(), + "test_token_pool": solTestConfig.CcipTokenPoolProgram.String(), + "example_burnmint_token_pool": "TokenPooL11111111111111111111111111BurnMint", + "example_lockrelease_token_pool": "TokenPooL11111111111111111111111LockReLease", + "fee_quoter": solTestConfig.FeeQuoterProgram.String(), + "test_ccip_receiver": solTestConfig.CcipLogicReceiver.String(), + "ccip_offramp": solTestConfig.CcipOfframpProgram.String(), + "mcm": solTestConfig.McmProgram.String(), + "timelock": solTestConfig.TimelockProgram.String(), + "access_controller": solTestConfig.AccessControllerProgram.String(), + "external_program_cpi_stub": solTestConfig.ExternalCpiStubProgram.String(), } var once = &sync.Once{} diff --git a/deployment/solana_chain.go b/deployment/solana_chain.go index bdf9f42b4c4..c38bcb403de 100644 --- a/deployment/solana_chain.go +++ b/deployment/solana_chain.go @@ -15,27 +15,16 @@ import ( solRpc "github.com/gagliardetto/solana-go/rpc" "github.com/pkg/errors" - solBinary "github.com/gagliardetto/binary" "github.com/gagliardetto/solana-go/rpc" solCommonUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" "github.com/smartcontractkit/chainlink-common/pkg/logger" - - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" -) - -var ( - SolDefaultGasLimit = solBinary.Uint128{Lo: 3000, Hi: 0, Endianness: nil} - SolDefaultMaxFeeJuelsPerMsg = solBinary.Uint128{Lo: 300000000, Hi: 0, Endianness: nil} - EnableExecutionAfter = int64(globals.PermissionLessExecutionThreshold.Seconds()) ) const ( ProgramIDPrefix = "Program Id: " BufferIDPrefix = "Buffer: " SolDefaultCommitment = rpc.CommitmentConfirmed - SPL2022Tokens = "SPL2022Tokens" - SPLTokens = "SPLTokens" ) // SolChain represents a Solana chain. From 29f27b8520ac4dab5bfc93ada7be8ebf751c0d49 Mon Sep 17 00:00:00 2001 From: Austin <107539019+0xAustinWang@users.noreply.github.com> Date: Mon, 24 Feb 2025 22:49:56 +0800 Subject: [PATCH 37/58] add fee limit to load test (#16537) * set add fee limit to load test * add comment --- integration-tests/load/ccip/destination_gun.go | 5 +++-- integration-tests/testconfig/ccip/ccip.toml | 9 +++++---- integration-tests/testconfig/ccip/load.go | 1 + 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/integration-tests/load/ccip/destination_gun.go b/integration-tests/load/ccip/destination_gun.go index 095e6b68d38..e38cdf7ff59 100644 --- a/integration-tests/load/ccip/destination_gun.go +++ b/integration-tests/load/ccip/destination_gun.go @@ -92,7 +92,6 @@ func (m *DestinationGun) Validate() error { func (m *DestinationGun) Call(_ *wasp.Generator) *wasp.Response { m.roundNum.Add(1) - requestedRound := m.roundNum.Load() waspGroup := fmt.Sprintf("%d-%s", m.chainSelector, "messageOnly") @@ -129,10 +128,12 @@ func (m *DestinationGun) Call(_ *wasp.Generator) *wasp.Response { acc.Value = fee defer func() { acc.Value = nil }() } + // todo: remove once CCIP-5143 is implemented + acc.GasLimit = *m.testConfig.GasLimit + m.l.Debugw("sending message ", "srcChain", src, "dstChain", m.chainSelector, - "round", requestedRound, "fee", fee, "msg", msg) tx, err := r.CcipSend( diff --git a/integration-tests/testconfig/ccip/ccip.toml b/integration-tests/testconfig/ccip/ccip.toml index 32e21beaff1..d1241a6ea1a 100644 --- a/integration-tests/testconfig/ccip/ccip.toml +++ b/integration-tests/testconfig/ccip/ccip.toml @@ -243,12 +243,13 @@ ephemeral_addresses_number = 0 [Load.CCIP.Load] # MessageTypeWeights corresponds with [data only, token only, message with token] -MessageTypeWeights = [100,0,0] +MessageTypeWeights = [10,45,45] # each destination chain will receive 1 incoming request per RequestFrequency for the duration of LoadDuration RequestFrequency = "5s" -LoadDuration = "5h" +LoadDuration = "1h" # destination chain selectors to send messages to -NumDestinationChains = 8 +NumDestinationChains = 6 # Directory where we receive environment configuration from crib CribEnvDirectory = "../../../../crib/deployments/ccip-v2/.tmp" -TimeoutDuration = "30m" \ No newline at end of file +TimeoutDuration = "30m" +GasLimit = 700_000 \ No newline at end of file diff --git a/integration-tests/testconfig/ccip/load.go b/integration-tests/testconfig/ccip/load.go index 5378ecf1412..08653fcbf6c 100644 --- a/integration-tests/testconfig/ccip/load.go +++ b/integration-tests/testconfig/ccip/load.go @@ -17,6 +17,7 @@ type LoadConfig struct { NumDestinationChains *int TimeoutDuration *string TestLabel *string + GasLimit *uint64 } func (l *LoadConfig) Validate(t *testing.T, e *deployment.Environment) { From 8196f5b7c8b6103ab48a505f75d996d74514fb51 Mon Sep 17 00:00:00 2001 From: Yashvardhan Nevatia Date: Mon, 24 Feb 2025 17:05:22 +0000 Subject: [PATCH 38/58] add remote chain (#16540) * add remote chain * add remote chain * wip * wip * wip * lint --------- Co-authored-by: Terry Tata --- .../changeset/solana/cs_add_remote_chain.go | 173 +++++++-- .../ccip/changeset/solana/cs_build_solana.go | 55 ++- .../solana/cs_chain_contracts_test.go | 68 ++++ .../ccip/changeset/solana/cs_deploy_chain.go | 367 +++++++----------- .../changeset/solana/cs_deploy_chain_test.go | 284 ++++++-------- .../solana/ownership_transfer_helpers.go | 17 +- ...ransfer_ccip_to_mcms_with_timelock_test.go | 40 +- deployment/ccip/changeset/solana/utils.go | 27 ++ deployment/ccip/changeset/solana_state.go | 60 +++ .../changeset/testhelpers/test_helpers.go | 59 +++ .../ccip/changeset/v1_6/cs_chain_contracts.go | 17 +- .../changeset/deploy_mcms_with_timelock.go | 17 +- 12 files changed, 685 insertions(+), 499 deletions(-) diff --git a/deployment/ccip/changeset/solana/cs_add_remote_chain.go b/deployment/ccip/changeset/solana/cs_add_remote_chain.go index fcf8ffe1465..e12d69badc0 100644 --- a/deployment/ccip/changeset/solana/cs_add_remote_chain.go +++ b/deployment/ccip/changeset/solana/cs_add_remote_chain.go @@ -2,13 +2,18 @@ package solana import ( "context" - // "errors" + "fmt" "strconv" "github.com/ethereum/go-ethereum/common" "github.com/gagliardetto/solana-go" + "github.com/smartcontractkit/mcms" + "github.com/smartcontractkit/mcms/sdk" + mcmsSolana "github.com/smartcontractkit/mcms/sdk/solana" + mcmsTypes "github.com/smartcontractkit/mcms/types" + solOffRamp "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" solRouter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" solFeeQuoter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" @@ -17,8 +22,9 @@ import ( "github.com/smartcontractkit/chainlink/deployment" ccipChangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" - commonState "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + + "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" ) // ADD REMOTE CHAIN @@ -29,6 +35,11 @@ type AddRemoteChainToSolanaConfig struct { // Disallow mixing MCMS/non-MCMS per chain for simplicity. // (can still be achieved by calling this function multiple times) MCMS *ccipChangeset.MCMSConfig + // Public key of program authorities. Depending on when this changeset is called, some may be under + // the control of the deployer, and some may be under the control of the timelock. (e.g. during new offramp deploy) + RouterAuthority solana.PublicKey + FeeQuoterAuthority solana.PublicKey + OffRampAuthority solana.PublicKey } type RemoteChainConfigSolana struct { @@ -55,19 +66,23 @@ func (cfg AddRemoteChainToSolanaConfig) Validate(e deployment.Environment) error if err := validateOffRampConfig(chain, chainState); err != nil { return err } + if err := ValidateMCMSConfig(e, cfg.ChainSelector, cfg.MCMS); err != nil { + return err + } + routerUsingMCMS := cfg.MCMS != nil && !cfg.RouterAuthority.IsZero() + feeQuoterUsingMCMS := cfg.MCMS != nil && !cfg.FeeQuoterAuthority.IsZero() + offRampUsingMCMS := cfg.MCMS != nil && !cfg.OffRampAuthority.IsZero() chain, ok := e.SolChains[cfg.ChainSelector] if !ok { return fmt.Errorf("chain %d not found in environment", cfg.ChainSelector) } - addresses, err := e.ExistingAddresses.AddressesForChain(cfg.ChainSelector) - if err != nil { - return err + if err := ccipChangeset.ValidateOwnershipSolana(&e, chain, routerUsingMCMS, e.SolChains[cfg.ChainSelector].DeployerKey.PublicKey(), chainState.Router, ccipChangeset.Router); err != nil { + return fmt.Errorf("failed to validate ownership: %w", err) } - mcmState, err := commonState.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) - if err != nil { - return fmt.Errorf("error loading MCMS state for chain %d: %w", cfg.ChainSelector, err) + if err := ccipChangeset.ValidateOwnershipSolana(&e, chain, feeQuoterUsingMCMS, e.SolChains[cfg.ChainSelector].DeployerKey.PublicKey(), chainState.FeeQuoter, ccipChangeset.FeeQuoter); err != nil { + return fmt.Errorf("failed to validate ownership: %w", err) } - if err := commoncs.ValidateOwnershipSolana(e.GetContext(), cfg.MCMS != nil, e.SolChains[cfg.ChainSelector].DeployerKey.PublicKey(), mcmState.TimelockProgram, mcmState.TimelockSeed, chainState.Router); err != nil { + if err := ccipChangeset.ValidateOwnershipSolana(&e, chain, offRampUsingMCMS, e.SolChains[cfg.ChainSelector].DeployerKey.PublicKey(), chainState.OffRamp, ccipChangeset.OffRamp); err != nil { return fmt.Errorf("failed to validate ownership: %w", err) } var routerConfigAccount solRouter.Config @@ -110,23 +125,66 @@ func AddRemoteChainToSolana(e deployment.Environment, cfg AddRemoteChainToSolana } ab := deployment.NewMemoryAddressBook() - err = doAddRemoteChainToSolana(e, s, cfg.ChainSelector, cfg.UpdatesByChain, ab) + txns, err := doAddRemoteChainToSolana(e, s, cfg, ab) if err != nil { return deployment.ChangesetOutput{AddressBook: ab}, err } + + // create proposals for ixns + if len(txns) > 0 { + timelocks := map[uint64]string{} + proposers := map[uint64]string{} + inspectors := map[uint64]sdk.Inspector{} + batches := make([]mcmsTypes.BatchOperation, 0) + chain := e.SolChains[cfg.ChainSelector] + addresses, _ := e.ExistingAddresses.AddressesForChain(cfg.ChainSelector) + mcmState, _ := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + + timelocks[cfg.ChainSelector] = mcmsSolana.ContractAddress( + mcmState.TimelockProgram, + mcmsSolana.PDASeed(mcmState.TimelockSeed), + ) + proposers[cfg.ChainSelector] = mcmsSolana.ContractAddress(mcmState.McmProgram, mcmsSolana.PDASeed(mcmState.ProposerMcmSeed)) + inspectors[cfg.ChainSelector] = mcmsSolana.NewInspector(chain.Client) + batches = append(batches, mcmsTypes.BatchOperation{ + ChainSelector: mcmsTypes.ChainSelector(cfg.ChainSelector), + Transactions: txns, + }) + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), + timelocks, + proposers, + inspectors, + batches, + "proposal to add remote chains to Solana", + cfg.MCMS.MinDelay) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to build proposal: %w", err) + } + return deployment.ChangesetOutput{ + MCMSTimelockProposals: []mcms.TimelockProposal{*proposal}, + AddressBook: ab, + }, nil + } return deployment.ChangesetOutput{AddressBook: ab}, nil } func doAddRemoteChainToSolana( e deployment.Environment, s ccipChangeset.CCIPOnChainState, - chainSel uint64, - updates map[uint64]RemoteChainConfigSolana, - ab deployment.AddressBook) error { + cfg AddRemoteChainToSolanaConfig, + ab deployment.AddressBook) ([]mcmsTypes.Transaction, error) { + txns := make([]mcmsTypes.Transaction, 0) + ixns := make([]solana.Instruction, 0) + chainSel := cfg.ChainSelector + updates := cfg.UpdatesByChain chain := e.SolChains[chainSel] ccipRouterID := s.SolChains[chainSel].Router feeQuoterID := s.SolChains[chainSel].FeeQuoter offRampID := s.SolChains[chainSel].OffRamp + routerUsingMCMS := cfg.MCMS != nil && !cfg.RouterAuthority.IsZero() + feeQuoterUsingMCMS := cfg.MCMS != nil && !cfg.FeeQuoterAuthority.IsZero() + offRampUsingMCMS := cfg.MCMS != nil && !cfg.OffRampAuthority.IsZero() lookUpTableEntries := make([]solana.PublicKey, 0) for remoteChainSel, update := range updates { @@ -149,16 +207,31 @@ func doAddRemoteChainToSolana( ) solRouter.SetProgramID(ccipRouterID) + var authority solana.PublicKey + if routerUsingMCMS { + authority = cfg.RouterAuthority + } else { + authority = chain.DeployerKey.PublicKey() + } routerIx, err := solRouter.NewAddChainSelectorInstruction( remoteChainSel, update.RouterDestinationConfig, routerRemoteStatePDA, s.SolChains[chainSel].RouterConfigPDA, - chain.DeployerKey.PublicKey(), + authority, solana.SystemProgramID, ).ValidateAndBuild() if err != nil { - return fmt.Errorf("failed to generate instructions: %w", err) + return txns, fmt.Errorf("failed to generate instructions: %w", err) + } + if routerUsingMCMS { + tx, err := BuildMCMSTxn(routerIx, ccipRouterID.String(), ccipChangeset.Router) + if err != nil { + return txns, fmt.Errorf("failed to create transaction: %w", err) + } + txns = append(txns, *tx) + } else { + ixns = append(ixns, routerIx) } routerOfframpIx, err := solRouter.NewAddOfframpInstruction( @@ -166,24 +239,47 @@ func doAddRemoteChainToSolana( offRampID, allowedOffRampRemotePDA, s.SolChains[chainSel].RouterConfigPDA, - chain.DeployerKey.PublicKey(), + authority, solana.SystemProgramID, ).ValidateAndBuild() if err != nil { - return fmt.Errorf("failed to generate instructions: %w", err) + return txns, fmt.Errorf("failed to generate instructions: %w", err) + } + if routerUsingMCMS { + tx, err := BuildMCMSTxn(routerOfframpIx, ccipRouterID.String(), ccipChangeset.Router) + if err != nil { + return txns, fmt.Errorf("failed to create transaction: %w", err) + } + txns = append(txns, *tx) + } else { + ixns = append(ixns, routerOfframpIx) } solFeeQuoter.SetProgramID(feeQuoterID) + if feeQuoterUsingMCMS { + authority = cfg.RouterAuthority + } else { + authority = chain.DeployerKey.PublicKey() + } feeQuoterIx, err := solFeeQuoter.NewAddDestChainInstruction( remoteChainSel, update.FeeQuoterDestinationConfig, s.SolChains[chainSel].FeeQuoterConfigPDA, fqRemoteChainPDA, - chain.DeployerKey.PublicKey(), + authority, solana.SystemProgramID, ).ValidateAndBuild() if err != nil { - return fmt.Errorf("failed to generate instructions: %w", err) + return txns, fmt.Errorf("failed to generate instructions: %w", err) + } + if feeQuoterUsingMCMS { + tx, err := BuildMCMSTxn(feeQuoterIx, feeQuoterID.String(), ccipChangeset.FeeQuoter) + if err != nil { + return txns, fmt.Errorf("failed to create transaction: %w", err) + } + txns = append(txns, *tx) + } else { + ixns = append(ixns, feeQuoterIx) } solOffRamp.SetProgramID(offRampID) @@ -191,22 +287,37 @@ func doAddRemoteChainToSolana( OnRamp: [2][64]byte{onRampBytes, [64]byte{}}, IsEnabled: update.EnabledAsSource, } + if offRampUsingMCMS { + authority = cfg.RouterAuthority + } else { + authority = chain.DeployerKey.PublicKey() + } offRampIx, err := solOffRamp.NewAddSourceChainInstruction( remoteChainSel, validSourceChainConfig, offRampRemoteStatePDA, s.SolChains[chainSel].OffRampConfigPDA, - chain.DeployerKey.PublicKey(), + authority, solana.SystemProgramID, ).ValidateAndBuild() if err != nil { - return fmt.Errorf("failed to generate instructions: %w", err) + return txns, fmt.Errorf("failed to generate instructions: %w", err) } - - err = chain.Confirm([]solana.Instruction{routerIx, routerOfframpIx, feeQuoterIx, offRampIx}) - if err != nil { - return fmt.Errorf("failed to confirm instructions: %w", err) + if offRampUsingMCMS { + tx, err := BuildMCMSTxn(offRampIx, offRampID.String(), ccipChangeset.OffRamp) + if err != nil { + return txns, fmt.Errorf("failed to create transaction: %w", err) + } + txns = append(txns, *tx) + } else { + ixns = append(ixns, offRampIx) + } + if len(ixns) > 0 { + err = chain.Confirm(ixns) + if err != nil { + return txns, fmt.Errorf("failed to confirm instructions: %w", err) + } } tv := deployment.NewTypeAndVersion(ccipChangeset.RemoteDest, deployment.Version1_0_0) @@ -214,20 +325,20 @@ func doAddRemoteChainToSolana( tv.AddLabel(remoteChainSelStr) err = ab.Save(chainSel, routerRemoteStatePDA.String(), tv) if err != nil { - return fmt.Errorf("failed to save dest chain state to address book: %w", err) + return txns, fmt.Errorf("failed to save dest chain state to address book: %w", err) } tv = deployment.NewTypeAndVersion(ccipChangeset.RemoteSource, deployment.Version1_0_0) tv.AddLabel(remoteChainSelStr) err = ab.Save(chainSel, allowedOffRampRemotePDA.String(), tv) if err != nil { - return fmt.Errorf("failed to save source chain state to address book: %w", err) + return txns, fmt.Errorf("failed to save source chain state to address book: %w", err) } } addressLookupTable, err := ccipChangeset.FetchOfframpLookupTable(e.GetContext(), chain, offRampID) if err != nil { - return fmt.Errorf("failed to get offramp reference addresses: %w", err) + return txns, fmt.Errorf("failed to get offramp reference addresses: %w", err) } if err := solCommonUtil.ExtendLookupTable( @@ -237,8 +348,8 @@ func doAddRemoteChainToSolana( *chain.DeployerKey, lookUpTableEntries, ); err != nil { - return fmt.Errorf("failed to extend lookup table: %w", err) + return txns, fmt.Errorf("failed to extend lookup table: %w", err) } - return nil + return txns, nil } diff --git a/deployment/ccip/changeset/solana/cs_build_solana.go b/deployment/ccip/changeset/solana/cs_build_solana.go index 4430d511ae5..c8d2c6bdabc 100644 --- a/deployment/ccip/changeset/solana/cs_build_solana.go +++ b/deployment/ccip/changeset/solana/cs_build_solana.go @@ -6,10 +6,12 @@ import ( "os" "os/exec" "path/filepath" + "regexp" chainsel "github.com/smartcontractkit/chain-selectors" "github.com/smartcontractkit/chainlink/deployment" + cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" ) var _ deployment.ChangeSet[BuildSolanaConfig] = BuildSolanaChangeset @@ -22,6 +24,13 @@ const ( deployDir = "chains/solana/contracts/target/deploy" ) +// Map program names to their Rust file paths (relative to the Anchor project root) +// Needed for upgrades in place +var programToFileMap = map[deployment.ContractType]string{ + cs.Router: "programs/ccip-router/src/lib.rs", + cs.FeeQuoter: "programs/fee-quoter/src/lib.rs", +} + // Run a command in a specific directory func runCommand(command string, args []string, workDir string) (string, error) { cmd := exec.Command(command, args...) @@ -37,8 +46,14 @@ func runCommand(command string, args []string, workDir string) (string, error) { } // Clone and checkout the specific revision of the repo -func cloneRepo(e deployment.Environment, revision string) error { +func cloneRepo(e deployment.Environment, revision string, forceClean bool) error { // Check if the repository already exists + if forceClean { + e.Logger.Debugw("Cleaning repository", "dir", cloneDir) + if err := os.RemoveAll(cloneDir); err != nil { + return fmt.Errorf("failed to clean repository: %w", err) + } + } if _, err := os.Stat(filepath.Join(cloneDir, ".git")); err == nil { e.Logger.Debugw("Repository already exists, discarding local changes and updating", "dir", cloneDir) @@ -83,6 +98,32 @@ func replaceKeys(e deployment.Environment) error { return nil } +func replaceKeysForUpgrade(e deployment.Environment, keys map[deployment.ContractType]string) error { + e.Logger.Debug("Replacing keys in Rust files...") + for program, key := range keys { + programStr := string(program) + filePath, exists := programToFileMap[program] + if !exists { + return fmt.Errorf("no file path found for program %s", programStr) + } + + fullPath := filepath.Join(cloneDir, anchorDir, filePath) + content, err := os.ReadFile(fullPath) + if err != nil { + return fmt.Errorf("failed to read file %s: %w", fullPath, err) + } + + // Replace declare_id!("..."); with the new key + updatedContent := regexp.MustCompile(`declare_id!\(".*?"\);`).ReplaceAllString(string(content), fmt.Sprintf(`declare_id!("%s");`, key)) + err = os.WriteFile(fullPath, []byte(updatedContent), 0600) + if err != nil { + return fmt.Errorf("failed to write updated keys to file %s: %w", fullPath, err) + } + e.Logger.Debugw("Updated key for program %s in file %s\n", programStr, filePath) + } + return nil +} + func copyFile(srcFile string, destDir string) error { output, err := runCommand("cp", []string{srcFile, destDir}, ".") if err != nil { @@ -108,6 +149,9 @@ type BuildSolanaConfig struct { DestinationDir string CleanDestinationDir bool CreateDestinationDir bool + // Forces re-clone of git directory. Useful for forcing regeneration of keys + CleanGitDir bool + UpgradeKeys map[deployment.ContractType]string } func BuildSolanaChangeset(e deployment.Environment, config BuildSolanaConfig) (deployment.ChangesetOutput, error) { @@ -124,14 +168,21 @@ func BuildSolanaChangeset(e deployment.Environment, config BuildSolanaConfig) (d } // Clone the repository - if err := cloneRepo(e, config.GitCommitSha); err != nil { + if err := cloneRepo(e, config.GitCommitSha, config.CleanGitDir); err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("error cloning repo: %w", err) } + // Replace keys in Rust files using anchor keys sync if err := replaceKeys(e); err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("error replacing keys: %w", err) } + // Replace keys in Rust files for upgrade by replacing the declare_id!() macro explicitly + // We need to do this so the keys will match the existing deployed program + if err := replaceKeysForUpgrade(e, config.UpgradeKeys); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error replacing keys for upgrade: %w", err) + } + // Build the project with Anchor if err := buildProject(e); err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("error building project: %w", err) diff --git a/deployment/ccip/changeset/solana/cs_chain_contracts_test.go b/deployment/ccip/changeset/solana/cs_chain_contracts_test.go index 5132bbec813..b35f0aab139 100644 --- a/deployment/ccip/changeset/solana/cs_chain_contracts_test.go +++ b/deployment/ccip/changeset/solana/cs_chain_contracts_test.go @@ -3,6 +3,7 @@ package solana_test import ( "math/big" "testing" + "time" "github.com/gagliardetto/solana-go" "github.com/stretchr/testify/require" @@ -53,6 +54,7 @@ func TestAddRemoteChain(t *testing.T) { tenv, _ := testhelpers.NewMemoryEnvironment(t, testhelpers.WithSolChains(1)) evmChain := tenv.Env.AllChainSelectors()[0] + evmChain2 := tenv.Env.AllChainSelectors()[1] solChain := tenv.Env.AllChainSelectorsSolana()[0] _, err := ccipChangeset.LoadOnchainStateSolana(tenv.Env) @@ -114,6 +116,72 @@ func TestAddRemoteChain(t *testing.T) { require.NoError(t, err, "failed to get account info") require.Equal(t, solFeeQuoter.TimestampedPackedU224{}, destChainFqAccount.State.UsdPerUnitGas) require.True(t, destChainFqAccount.Config.IsEnabled) + + timelockSignerPDA, _ := testhelpers.TransferOwnershipSolana(t, &tenv.Env, solChain, true, true, true, true) + + tenv.Env, err = commonchangeset.ApplyChangesetsV2(t, tenv.Env, + []commonchangeset.ConfiguredChangeSet{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(v1_6.UpdateOnRampsDestsChangeset), + v1_6.UpdateOnRampDestsConfig{ + UpdatesByChain: map[uint64]map[uint64]v1_6.OnRampDestinationUpdate{ + evmChain2: { + solChain: { + IsEnabled: true, + TestRouter: false, + AllowListEnabled: false, + }, + }, + }, + }, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipChangesetSolana.AddRemoteChainToSolana), + ccipChangesetSolana.AddRemoteChainToSolanaConfig{ + ChainSelector: solChain, + UpdatesByChain: map[uint64]ccipChangesetSolana.RemoteChainConfigSolana{ + evmChain2: { + EnabledAsSource: true, + RouterDestinationConfig: solRouter.DestChainConfig{}, + FeeQuoterDestinationConfig: solFeeQuoter.DestChainConfig{ + IsEnabled: true, + DefaultTxGasLimit: 200000, + MaxPerMsgGasLimit: 3000000, + MaxDataBytes: 30000, + MaxNumberOfTokensPerMsg: 5, + DefaultTokenDestGasOverhead: 5000, + // bytes4(keccak256("CCIP ChainFamilySelector EVM")) + // TODO: do a similar test for other chain families + // https://smartcontract-it.atlassian.net/browse/INTAUTO-438 + ChainFamilySelector: [4]uint8{40, 18, 213, 44}, + }, + }, + }, + MCMS: &ccipChangeset.MCMSConfig{ + MinDelay: 1 * time.Second, + }, + RouterAuthority: timelockSignerPDA, + FeeQuoterAuthority: timelockSignerPDA, + OffRampAuthority: timelockSignerPDA, + }, + ), + }, + ) + + require.NoError(t, err) + + state, err = ccipChangeset.LoadOnchainStateSolana(tenv.Env) + require.NoError(t, err) + + evmDestChainStatePDA = state.SolChains[solChain].DestChainStatePDAs[evmChain2] + err = tenv.Env.SolChains[solChain].GetAccountDataBorshInto(ctx, evmDestChainStatePDA, &destChainStateAccount) + require.NoError(t, err) + + fqEvmDestChainPDA, _, _ = solState.FindFqDestChainPDA(evmChain2, state.SolChains[solChain].FeeQuoter) + err = tenv.Env.SolChains[solChain].GetAccountDataBorshInto(ctx, fqEvmDestChainPDA, &destChainFqAccount) + require.NoError(t, err, "failed to get account info") + require.Equal(t, solFeeQuoter.TimestampedPackedU224{}, destChainFqAccount.State.UsdPerUnitGas) + require.True(t, destChainFqAccount.Config.IsEnabled) } func TestDeployCCIPContracts(t *testing.T) { diff --git a/deployment/ccip/changeset/solana/cs_deploy_chain.go b/deployment/ccip/changeset/solana/cs_deploy_chain.go index 95cbb45ca0a..ffe4cb10c89 100644 --- a/deployment/ccip/changeset/solana/cs_deploy_chain.go +++ b/deployment/ccip/changeset/solana/cs_deploy_chain.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "math" - "math/big" "github.com/Masterminds/semver/v3" "github.com/gagliardetto/solana-go" @@ -42,6 +41,16 @@ const ( var _ deployment.ChangeSet[DeployChainContractsConfig] = DeployChainContractsChangeset +func getTypeToProgramDeployName() map[deployment.ContractType]string { + return map[deployment.ContractType]string{ + ccipChangeset.Router: RouterProgramName, + ccipChangeset.OffRamp: OffRampProgramName, + ccipChangeset.FeeQuoter: FeeQuoterProgramName, + ccipChangeset.BurnMintTokenPool: BurnMintTokenPool, + ccipChangeset.LockReleaseTokenPool: LockReleaseTokenPool, + } +} + type DeployChainContractsConfig struct { HomeChainSelector uint64 ContractParamsPerChain map[uint64]ChainContractParams @@ -70,20 +79,22 @@ type UpgradeConfig struct { // SpillAddress and UpgradeAuthority must be set SpillAddress solana.PublicKey UpgradeAuthority solana.PublicKey - MCMS *ccipChangeset.MCMSConfig + // MCMS config must be set for upgrades and offramp redploys (to configure the fee quoter after redeploy) + MCMS *ccipChangeset.MCMSConfig } func (cfg UpgradeConfig) Validate(e deployment.Environment, chainSelector uint64) error { if cfg.NewFeeQuoterVersion == nil && cfg.NewRouterVersion == nil && cfg.NewOffRampVersion == nil { return nil } - if cfg.NewFeeQuoterVersion != nil || cfg.NewRouterVersion != nil { - if cfg.SpillAddress.IsZero() { - return errors.New("spill address must be set for fee quoter and router upgrades") - } - if cfg.UpgradeAuthority.IsZero() { - return errors.New("upgrade authority must be set for fee quoter and router upgrades") - } + if cfg.MCMS == nil { + return errors.New("MCMS config must be set for upgrades") + } + if cfg.SpillAddress.IsZero() { + return errors.New("spill address must be set for fee quoter and router upgrades") + } + if cfg.UpgradeAuthority.IsZero() { + return errors.New("upgrade authority must be set for fee quoter and router upgrades") } return ValidateMCMSConfig(e, chainSelector, cfg.MCMS) } @@ -152,7 +163,7 @@ func DeployChainContractsChangeset(e deployment.Environment, c DeployChainContra e.Logger.Errorw("Failed to deploy CCIP contracts", "err", err, "newAddresses", newAddresses) return deployment.ChangesetOutput{}, err } - // create proposals for ixns + // create proposals for txns if len(mcmsTxs) > 0 { batches = append(batches, mcmsTypes.BatchOperation{ ChainSelector: mcmsTypes.ChainSelector(chainSel), @@ -161,7 +172,7 @@ func DeployChainContractsChangeset(e deployment.Environment, c DeployChainContra } } - if c.UpgradeConfig.MCMS != nil { + if len(batches) > 0 { proposal, err := proposalutils.BuildProposalFromBatchesV2( e.GetContext(), timelocks, @@ -376,18 +387,18 @@ func deployChainContractsSolana( config DeployChainContractsConfig, ) ([]mcmsTypes.Transaction, error) { // we may need to gather instructions and submit them as part of MCMS - ixns := make([]mcmsTypes.Transaction, 0) + txns := make([]mcmsTypes.Transaction, 0) state, err := ccipChangeset.LoadOnchainStateSolana(e) if err != nil { e.Logger.Errorw("Failed to load existing onchain state", "err", err) - return ixns, err + return txns, err } chainState, chainExists := state.SolChains[chain.Selector] if !chainExists { - return ixns, fmt.Errorf("chain %s not found in existing state, deploy the link token first", chain.String()) + return txns, fmt.Errorf("chain %s not found in existing state, deploy the link token first", chain.String()) } if chainState.LinkToken.IsZero() { - return ixns, fmt.Errorf("failed to get link token address for chain %s", chain.String()) + return txns, fmt.Errorf("failed to get link token address for chain %s", chain.String()) } params := config.ContractParamsPerChain[chain.Selector] @@ -396,98 +407,18 @@ func deployChainContractsSolana( var feeQuoterAddress solana.PublicKey //nolint:gocritic // this is a false positive, we need to check if the address is zero if chainState.FeeQuoter.IsZero() { - feeQuoterAddress, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, FeeQuoterProgramName, deployment.Version1_0_0, false) + feeQuoterAddress, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, ccipChangeset.FeeQuoter, deployment.Version1_0_0, false) if err != nil { - return ixns, fmt.Errorf("failed to deploy program: %w", err) + return txns, fmt.Errorf("failed to deploy program: %w", err) } } else if config.UpgradeConfig.NewFeeQuoterVersion != nil { // fee quoter updated in place - bufferProgram, err := DeployAndMaybeSaveToAddressBook(e, chain, ab, FeeQuoterProgramName, *config.UpgradeConfig.NewFeeQuoterVersion, true) - if err != nil { - return ixns, fmt.Errorf("failed to deploy program: %w", err) - } - if err := setUpgradeAuthority(&e, &chain, bufferProgram, chain.DeployerKey, config.UpgradeConfig.UpgradeAuthority.ToPointer(), true); err != nil { - return ixns, fmt.Errorf("failed to set upgrade authority: %w", err) - } - extendIxn, err := generateExtendIxn( - &e, - chain, - chainState.FeeQuoter, - bufferProgram, - config.UpgradeConfig.SpillAddress, - ) - if err != nil { - return ixns, fmt.Errorf("failed to generate extend instruction: %w", err) - } - upgradeIxn, err := generateUpgradeIxn( - &e, - chainState.FeeQuoter, - bufferProgram, - config.UpgradeConfig.SpillAddress, - config.UpgradeConfig.UpgradeAuthority, - ) - if err != nil { - return ixns, fmt.Errorf("failed to generate upgrade instruction: %w", err) - } - closeIxn, err := generateCloseBufferIxn( - &e, - bufferProgram, - config.UpgradeConfig.SpillAddress, - config.UpgradeConfig.UpgradeAuthority, - ) - if err != nil { - return ixns, fmt.Errorf("failed to generate close buffer instruction: %w", err) - } feeQuoterAddress = chainState.FeeQuoter - upgradeData, err := upgradeIxn.Data() - if err != nil { - return ixns, fmt.Errorf("failed to extract upgrade data: %w", err) - } - upgradeTx, err := mcmsSolana.NewTransaction( - solana.BPFLoaderUpgradeableProgramID.String(), - upgradeData, - big.NewInt(0), // e.g. value - upgradeIxn.Accounts(), // pass along needed accounts - string(ccipChangeset.FeeQuoter), // some string identifying the target - []string{}, // any relevant metadata - ) + newTxns, err := generateUpgradeTxns(e, chain, ab, config, config.UpgradeConfig.NewFeeQuoterVersion, chainState.FeeQuoter, ccipChangeset.FeeQuoter) if err != nil { - return ixns, fmt.Errorf("failed to create upgrade transaction: %w", err) + return txns, fmt.Errorf("failed to generate upgrade txns: %w", err) } - closeData, err := closeIxn.Data() - if err != nil { - return ixns, fmt.Errorf("failed to extract close data: %w", err) - } - closeTx, err := mcmsSolana.NewTransaction( - solana.BPFLoaderUpgradeableProgramID.String(), - closeData, - big.NewInt(0), // e.g. value - closeIxn.Accounts(), // pass along needed accounts - string(ccipChangeset.FeeQuoter), // some string identifying the target - []string{}, // any relevant metadata - ) - if err != nil { - return ixns, fmt.Errorf("failed to create close transaction: %w", err) - } - if extendIxn != nil { - extendData, err := extendIxn.Data() - if err != nil { - return ixns, fmt.Errorf("failed to extract extend data: %w", err) - } - extendTx, err := mcmsSolana.NewTransaction( - solana.BPFLoaderUpgradeableProgramID.String(), - extendData, - big.NewInt(0), // e.g. value - extendIxn.Accounts(), // pass along needed accounts - string(ccipChangeset.FeeQuoter), // some string identifying the target - []string{}, // any relevant metadata - ) - if err != nil { - return ixns, fmt.Errorf("failed to create extend transaction: %w", err) - } - ixns = append(ixns, extendTx) - } - ixns = append(ixns, upgradeTx, closeTx) + txns = append(txns, newTxns...) } else { e.Logger.Infow("Using existing fee quoter", "addr", chainState.FeeQuoter.String()) feeQuoterAddress = chainState.FeeQuoter @@ -499,98 +430,18 @@ func deployChainContractsSolana( //nolint:gocritic // this is a false positive, we need to check if the address is zero if chainState.Router.IsZero() { // deploy router - ccipRouterProgram, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, RouterProgramName, deployment.Version1_0_0, false) + ccipRouterProgram, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, ccipChangeset.Router, deployment.Version1_0_0, false) if err != nil { - return ixns, fmt.Errorf("failed to deploy program: %w", err) + return txns, fmt.Errorf("failed to deploy program: %w", err) } } else if config.UpgradeConfig.NewRouterVersion != nil { // router updated in place - bufferProgram, err := DeployAndMaybeSaveToAddressBook(e, chain, ab, RouterProgramName, *config.UpgradeConfig.NewRouterVersion, true) - if err != nil { - return ixns, fmt.Errorf("failed to deploy program: %w", err) - } - if err := setUpgradeAuthority(&e, &chain, bufferProgram, chain.DeployerKey, config.UpgradeConfig.UpgradeAuthority.ToPointer(), true); err != nil { - return ixns, fmt.Errorf("failed to set upgrade authority: %w", err) - } - upgradeIxn, err := generateUpgradeIxn( - &e, - chainState.Router, - bufferProgram, - config.UpgradeConfig.SpillAddress, - config.UpgradeConfig.UpgradeAuthority, - ) - if err != nil { - return ixns, fmt.Errorf("failed to generate upgrade instruction: %w", err) - } - extendIxn, err := generateExtendIxn( - &e, - chain, - chainState.Router, - bufferProgram, - config.UpgradeConfig.SpillAddress, - ) - if err != nil { - return ixns, fmt.Errorf("failed to generate extend instruction: %w", err) - } - closeIxn, err := generateCloseBufferIxn( - &e, - bufferProgram, - config.UpgradeConfig.SpillAddress, - config.UpgradeConfig.UpgradeAuthority, - ) - if err != nil { - return ixns, fmt.Errorf("failed to generate close buffer instruction: %w", err) - } ccipRouterProgram = chainState.Router - upgradeData, err := upgradeIxn.Data() - if err != nil { - return ixns, fmt.Errorf("failed to extract upgrade data: %w", err) - } - upgradeTx, err := mcmsSolana.NewTransaction( - solana.BPFLoaderUpgradeableProgramID.String(), - upgradeData, - big.NewInt(0), // e.g. value - upgradeIxn.Accounts(), // pass along needed accounts - string(ccipChangeset.Router), // some string identifying the target - []string{}, // any relevant metadata - ) - if err != nil { - return ixns, fmt.Errorf("failed to create upgrade transaction: %w", err) - } - closeData, err := closeIxn.Data() + newTxns, err := generateUpgradeTxns(e, chain, ab, config, config.UpgradeConfig.NewRouterVersion, chainState.Router, ccipChangeset.Router) if err != nil { - return ixns, fmt.Errorf("failed to extract close data: %w", err) + return txns, fmt.Errorf("failed to generate upgrade txns: %w", err) } - closeTx, err := mcmsSolana.NewTransaction( - solana.BPFLoaderUpgradeableProgramID.String(), - closeData, - big.NewInt(0), // e.g. value - closeIxn.Accounts(), // pass along needed accounts - string(ccipChangeset.Router), // some string identifying the target - []string{}, // any relevant metadata - ) - if err != nil { - return ixns, fmt.Errorf("failed to create close transaction: %w", err) - } - if extendIxn != nil { - extendData, err := extendIxn.Data() - if err != nil { - return ixns, fmt.Errorf("failed to extract extend data: %w", err) - } - extendTx, err := mcmsSolana.NewTransaction( - solana.BPFLoaderUpgradeableProgramID.String(), - extendData, - big.NewInt(0), // e.g. value - extendIxn.Accounts(), // pass along needed accounts - string(ccipChangeset.Router), // some string identifying the target - []string{}, // any relevant metadata - ) - if err != nil { - return ixns, fmt.Errorf("failed to create extend transaction: %w", err) - } - ixns = append(ixns, extendTx) - } - ixns = append(ixns, upgradeTx, closeTx) + txns = append(txns, newTxns...) } else { e.Logger.Infow("Using existing router", "addr", chainState.Router.String()) ccipRouterProgram = chainState.Router @@ -607,22 +458,22 @@ func deployChainContractsSolana( //nolint:gocritic // this is a false positive, we need to check if the address is zero if chainState.OffRamp.IsZero() { // deploy offramp - offRampAddress, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, OffRampProgramName, deployment.Version1_0_0, false) + offRampAddress, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, ccipChangeset.OffRamp, deployment.Version1_0_0, false) if err != nil { - return ixns, fmt.Errorf("failed to deploy program: %w", err) + return txns, fmt.Errorf("failed to deploy program: %w", err) } } else if config.UpgradeConfig.NewOffRampVersion != nil { tv := deployment.NewTypeAndVersion(ccipChangeset.OffRamp, *config.UpgradeConfig.NewOffRampVersion) existingAddresses, err := e.ExistingAddresses.AddressesForChain(chain.Selector) if err != nil { - return ixns, fmt.Errorf("failed to get existing addresses: %w", err) + return txns, fmt.Errorf("failed to get existing addresses: %w", err) } offRampAddress = ccipChangeset.FindSolanaAddress(tv, existingAddresses) if offRampAddress.IsZero() { // deploy offramp, not upgraded in place so upgrade is false - offRampAddress, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, OffRampProgramName, *config.UpgradeConfig.NewOffRampVersion, false) + offRampAddress, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, ccipChangeset.OffRamp, *config.UpgradeConfig.NewOffRampVersion, false) if err != nil { - return ixns, fmt.Errorf("failed to deploy program: %w", err) + return txns, fmt.Errorf("failed to deploy program: %w", err) } } @@ -634,28 +485,17 @@ func deployChainContractsSolana( offRampBillingSignerPDA, fqAllowedPriceUpdaterOfframpPDA, feeQuoterConfigPDA, - chain.DeployerKey.PublicKey(), + config.UpgradeConfig.UpgradeAuthority, solana.SystemProgramID, ).ValidateAndBuild() if err != nil { - return ixns, fmt.Errorf("failed to build instruction: %w", err) + return txns, fmt.Errorf("failed to build instruction: %w", err) } - priceUpdaterData, err := priceUpdaterix.Data() - if err != nil { - return ixns, fmt.Errorf("failed to extract price updater data: %w", err) - } - priceUpdaterTx, err := mcmsSolana.NewTransaction( - feeQuoterAddress.String(), - priceUpdaterData, - big.NewInt(0), // e.g. value - priceUpdaterix.Accounts(), // pass along needed accounts - string(ccipChangeset.OffRamp), // some string identifying the target - []string{}, // any relevant metadata - ) + priceUpdaterTx, err := BuildMCMSTxn(priceUpdaterix, feeQuoterAddress.String(), ccipChangeset.FeeQuoter) if err != nil { - return ixns, fmt.Errorf("failed to create price updater transaction: %w", err) + return txns, fmt.Errorf("failed to create price updater transaction: %w", err) } - ixns = append(ixns, priceUpdaterTx) + txns = append(txns, *priceUpdaterTx) } else { e.Logger.Infow("Using existing offramp", "addr", chainState.OffRamp.String()) offRampAddress = chainState.OffRamp @@ -668,7 +508,7 @@ func deployChainContractsSolana( err = chain.GetAccountDataBorshInto(e.GetContext(), feeQuoterConfigPDA, &fqConfig) if err != nil { if err2 := initializeFeeQuoter(e, chain, ccipRouterProgram, chainState.LinkToken, feeQuoterAddress, offRampAddress, params.FeeQuoterParams); err2 != nil { - return ixns, err2 + return txns, err2 } } else { e.Logger.Infow("Fee quoter already initialized, skipping initialization", "chain", chain.String()) @@ -681,7 +521,7 @@ func deployChainContractsSolana( err = chain.GetAccountDataBorshInto(e.GetContext(), routerConfigPDA, &routerConfigAccount) if err != nil { if err2 := initializeRouter(e, chain, ccipRouterProgram, chainState.LinkToken, feeQuoterAddress); err2 != nil { - return ixns, err2 + return txns, err2 } } else { e.Logger.Infow("Router already initialized, skipping initialization", "chain", chain.String()) @@ -707,10 +547,10 @@ func deployChainContractsSolana( solana.SPLAssociatedTokenAccountProgramID, }) if err2 != nil { - return ixns, fmt.Errorf("failed to create address lookup table: %w", err) + return txns, fmt.Errorf("failed to create address lookup table: %w", err) } if err2 := initializeOffRamp(e, chain, ccipRouterProgram, feeQuoterAddress, offRampAddress, table, params.OffRampParams); err2 != nil { - return ixns, err2 + return txns, err2 } // Initializing a new offramp means we need a new lookup table and need to fully populate it needFQinLookupTable = true @@ -732,9 +572,9 @@ func deployChainContractsSolana( var burnMintTokenPool solana.PublicKey if chainState.BurnMintTokenPool.IsZero() { - burnMintTokenPool, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, BurnMintTokenPool, deployment.Version1_0_0, false) + burnMintTokenPool, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, ccipChangeset.BurnMintTokenPool, deployment.Version1_0_0, false) if err != nil { - return ixns, fmt.Errorf("failed to deploy program: %w", err) + return txns, fmt.Errorf("failed to deploy program: %w", err) } needTokenPoolinLookupTable = true } else { @@ -744,9 +584,9 @@ func deployChainContractsSolana( var lockReleaseTokenPool solana.PublicKey if chainState.LockReleaseTokenPool.IsZero() { - lockReleaseTokenPool, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, LockReleaseTokenPool, deployment.Version1_0_0, false) + lockReleaseTokenPool, err = DeployAndMaybeSaveToAddressBook(e, chain, ab, ccipChangeset.LockReleaseTokenPool, deployment.Version1_0_0, false) if err != nil { - return ixns, fmt.Errorf("failed to deploy program: %w", err) + return txns, fmt.Errorf("failed to deploy program: %w", err) } needTokenPoolinLookupTable = true } else { @@ -758,7 +598,7 @@ func deployChainContractsSolana( if err := AddBillingToken( e, chain, chainState, billingConfig, ); err != nil { - return ixns, err + return txns, err } } @@ -801,11 +641,11 @@ func deployChainContractsSolana( if len(lookupTableKeys) > 0 { addressLookupTable, err := ccipChangeset.FetchOfframpLookupTable(e.GetContext(), chain, offRampAddress) if err != nil { - return ixns, fmt.Errorf("failed to get offramp reference addresses: %w", err) + return txns, fmt.Errorf("failed to get offramp reference addresses: %w", err) } e.Logger.Debugw("Populating lookup table", "lookupTable", addressLookupTable.String(), "keys", lookupTableKeys) if err := solCommonUtil.ExtendLookupTable(e.GetContext(), chain.Client, addressLookupTable, *chain.DeployerKey, lookupTableKeys); err != nil { - return ixns, fmt.Errorf("failed to extend lookup table: %w", err) + return txns, fmt.Errorf("failed to extend lookup table: %w", err) } } @@ -814,12 +654,77 @@ func deployChainContractsSolana( e.Logger.Infow("Setting upgrade authority", "newUpgradeAuthority", config.NewUpgradeAuthority.String()) for _, programID := range []solana.PublicKey{ccipRouterProgram, feeQuoterAddress} { if err := setUpgradeAuthority(&e, &chain, programID, chain.DeployerKey, config.NewUpgradeAuthority, false); err != nil { - return ixns, fmt.Errorf("failed to set upgrade authority: %w", err) + return txns, fmt.Errorf("failed to set upgrade authority: %w", err) } } } - return ixns, nil + return txns, nil +} + +func generateUpgradeTxns( + e deployment.Environment, + chain deployment.SolChain, + ab deployment.AddressBook, + config DeployChainContractsConfig, + newVersion *semver.Version, + programID solana.PublicKey, + contractType deployment.ContractType, +) ([]mcmsTypes.Transaction, error) { + txns := make([]mcmsTypes.Transaction, 0) + bufferProgram, err := DeployAndMaybeSaveToAddressBook(e, chain, ab, contractType, *newVersion, true) + if err != nil { + return txns, fmt.Errorf("failed to deploy program: %w", err) + } + if err := setUpgradeAuthority(&e, &chain, bufferProgram, chain.DeployerKey, config.UpgradeConfig.UpgradeAuthority.ToPointer(), true); err != nil { + return txns, fmt.Errorf("failed to set upgrade authority: %w", err) + } + extendIxn, err := generateExtendIxn( + &e, + chain, + programID, + bufferProgram, + config.UpgradeConfig.SpillAddress, + ) + if err != nil { + return txns, fmt.Errorf("failed to generate extend instruction: %w", err) + } + upgradeIxn, err := generateUpgradeIxn( + &e, + programID, + bufferProgram, + config.UpgradeConfig.SpillAddress, + config.UpgradeConfig.UpgradeAuthority, + ) + if err != nil { + return txns, fmt.Errorf("failed to generate upgrade instruction: %w", err) + } + closeIxn, err := generateCloseBufferIxn( + &e, + bufferProgram, + config.UpgradeConfig.SpillAddress, + config.UpgradeConfig.UpgradeAuthority, + ) + if err != nil { + return txns, fmt.Errorf("failed to generate close buffer instruction: %w", err) + } + upgradeTx, err := BuildMCMSTxn(upgradeIxn, solana.BPFLoaderUpgradeableProgramID.String(), contractType) + if err != nil { + return txns, fmt.Errorf("failed to create upgrade transaction: %w", err) + } + closeTx, err := BuildMCMSTxn(closeIxn, solana.BPFLoaderUpgradeableProgramID.String(), contractType) + if err != nil { + return txns, fmt.Errorf("failed to create close transaction: %w", err) + } + if extendIxn != nil { + extendTx, err := BuildMCMSTxn(extendIxn, solana.BPFLoaderUpgradeableProgramID.String(), contractType) + if err != nil { + return txns, fmt.Errorf("failed to create extend transaction: %w", err) + } + txns = append(txns, *extendTx) + } + txns = append(txns, *upgradeTx, *closeTx) + return txns, nil } // DeployAndMaybeSaveToAddressBook deploys a program to the Solana chain and saves it to the address book @@ -828,30 +733,20 @@ func DeployAndMaybeSaveToAddressBook( e deployment.Environment, chain deployment.SolChain, ab deployment.AddressBook, - programName string, + contractType deployment.ContractType, version semver.Version, isUpgrade bool) (solana.PublicKey, error) { + programName := getTypeToProgramDeployName()[contractType] programID, err := chain.DeployProgram(e.Logger, programName, isUpgrade) if err != nil { return solana.PublicKey{}, fmt.Errorf("failed to deploy program: %w", err) } address := solana.MustPublicKeyFromBase58(programID) - programNameToType := map[string]deployment.ContractType{ - RouterProgramName: ccipChangeset.Router, - OffRampProgramName: ccipChangeset.OffRamp, - FeeQuoterProgramName: ccipChangeset.FeeQuoter, - BurnMintTokenPool: ccipChangeset.BurnMintTokenPool, - LockReleaseTokenPool: ccipChangeset.LockReleaseTokenPool, - } - programType, ok := programNameToType[programName] - if !ok { - return solana.PublicKey{}, fmt.Errorf("unknown program name: %s", programName) - } - e.Logger.Infow("Deployed program", "Program", programType, "addr", programID, "chain", chain.String(), "isUpgrade", isUpgrade) + e.Logger.Infow("Deployed program", "Program", contractType, "addr", programID, "chain", chain.String(), "isUpgrade", isUpgrade) if !isUpgrade { - tv := deployment.NewTypeAndVersion(programType, version) + tv := deployment.NewTypeAndVersion(contractType, version) err = ab.Save(chain.Selector, programID, tv) if err != nil { return solana.PublicKey{}, fmt.Errorf("failed to save address: %w", err) @@ -916,7 +811,7 @@ func generateUpgradeIxn( solana.NewAccountMeta(spillAddress, true, false), // Spill account (writable) solana.NewAccountMeta(solana.SysVarRentPubkey, false, false), // System program solana.NewAccountMeta(solana.SysVarClockPubkey, false, false), // System program - solana.NewAccountMeta(upgradeAuthority, false, false), // Current upgrade authority (signer) + solana.NewAccountMeta(upgradeAuthority, false, true), // Current upgrade authority (signer) } instruction := solana.NewInstruction( @@ -967,7 +862,7 @@ func generateExtendIxn( solana.NewAccountMeta(programDataAccount, true, false), // Program data account (writable) solana.NewAccountMeta(programID, true, false), // Program account (writable) solana.NewAccountMeta(solana.SystemProgramID, false, false), // System program - solana.NewAccountMeta(payer, true, false), // Payer for rent + solana.NewAccountMeta(payer, true, true), // Payer for rent } ixn := solana.NewInstruction( @@ -988,7 +883,7 @@ func generateCloseBufferIxn( keys := solana.AccountMetaSlice{ solana.NewAccountMeta(bufferAddress, true, false), solana.NewAccountMeta(recipient, true, false), - solana.NewAccountMeta(upgradeAuthority, false, false), + solana.NewAccountMeta(upgradeAuthority, false, true), } instruction := solana.NewInstruction( diff --git a/deployment/ccip/changeset/solana/cs_deploy_chain_test.go b/deployment/ccip/changeset/solana/cs_deploy_chain_test.go index 4800df91f50..55803335097 100644 --- a/deployment/ccip/changeset/solana/cs_deploy_chain_test.go +++ b/deployment/ccip/changeset/solana/cs_deploy_chain_test.go @@ -1,7 +1,6 @@ package solana_test import ( - "math/big" "os" "testing" "time" @@ -13,11 +12,12 @@ import ( solBinary "github.com/gagliardetto/binary" "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" ccipChangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" ccipChangesetSolana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" - commonState "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/environment/memory" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -60,11 +60,26 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { feeAggregatorPrivKey, _ := solana.NewRandomPrivateKey() feeAggregatorPubKey := feeAggregatorPrivKey.PublicKey() ci := os.Getenv("CI") == "true" + // we can't upgrade in place locally if we preload addresses so we have to change where we build + // we also don't want to incur two builds in CI, so only do it locally if ci { testhelpers.SavePreloadedSolAddresses(t, e, solChainSelectors[0]) + } else { + e, err = commonchangeset.ApplyChangesetsV2(t, e, []commonchangeset.ConfiguredChangeSet{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipChangesetSolana.BuildSolanaChangeset), + ccipChangesetSolana.BuildSolanaConfig{ + ChainSelector: solChainSelectors[0], + GitCommitSha: "3da552ac9d30b821310718b8b67e6a298335a485", + DestinationDir: e.SolChains[solChainSelectors[0]].ProgramsPath, + CleanDestinationDir: true, + }, + ), + }) + require.NoError(t, err) } - e, err = commonchangeset.Apply(t, e, nil, + e, err = commonchangeset.ApplyChangesetsV2(t, e, []commonchangeset.ConfiguredChangeSet{ commonchangeset.Configure( deployment.CreateLegacyChangeSet(v1_6.DeployHomeChainChangeset), v1_6.DeployHomeChainConfig{ @@ -103,179 +118,136 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelockV2), - map[uint64]commontypes.MCMSWithTimelockConfigV2{ - solChainSelectors[0]: { - Canceller: proposalutils.SingleGroupMCMSV2(t), - Proposer: proposalutils.SingleGroupMCMSV2(t), - Bypasser: proposalutils.SingleGroupMCMSV2(t), - TimelockMinDelay: big.NewInt(0), + deployment.CreateLegacyChangeSet(ccipChangesetSolana.DeployChainContractsChangeset), + ccipChangesetSolana.DeployChainContractsConfig{ + HomeChainSelector: homeChainSel, + ContractParamsPerChain: map[uint64]ccipChangesetSolana.ChainContractParams{ + solChainSelectors[0]: { + FeeQuoterParams: ccipChangesetSolana.FeeQuoterParams{ + DefaultMaxFeeJuelsPerMsg: solBinary.Uint128{Lo: 300000000, Hi: 0, Endianness: nil}, + }, + OffRampParams: ccipChangesetSolana.OffRampParams{ + EnableExecutionAfter: int64(globals.PermissionLessExecutionThreshold.Seconds()), + }, + }, }, }, ), - ) - require.NoError(t, err) - addresses, err := e.ExistingAddresses.AddressesForChain(solChainSelectors[0]) - require.NoError(t, err) - mcmState, err := commonState.MaybeLoadMCMSWithTimelockChainStateSolana(e.SolChains[solChainSelectors[0]], addresses) + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipChangesetSolana.SetFeeAggregator), + ccipChangesetSolana.SetFeeAggregatorConfig{ + ChainSelector: solChainSelectors[0], + FeeAggregator: feeAggregatorPubKey.String(), + }, + ), + }) require.NoError(t, err) - - // Fund signer PDAs for timelock and mcm - // If we don't fund, execute() calls will fail with "no funds" errors. - timelockSignerPDA := commonState.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) - mcmSignerPDA := commonState.GetMCMSignerPDA(mcmState.McmProgram, mcmState.ProposerMcmSeed) - memory.FundSolanaAccounts(e.GetContext(), t, []solana.PublicKey{timelockSignerPDA, mcmSignerPDA}, - 100, e.SolChains[solChainSelectors[0]].Client) - t.Logf("funded timelock signer PDA: %s", timelockSignerPDA.String()) - t.Logf("funded mcm signer PDA: %s", mcmSignerPDA.String()) + testhelpers.ValidateSolanaState(t, e, solChainSelectors) + timelockSignerPDA, _ := testhelpers.TransferOwnershipSolana(t, &e, solChainSelectors[0], true, true, true, true) upgradeAuthority := timelockSignerPDA + state, err := changeset.LoadOnchainStateSolana(e) + require.NoError(t, err) - // we can't upgrade in place locally so we have to change where we build - buildCs := commonchangeset.Configure( - deployment.CreateLegacyChangeSet(ccipChangesetSolana.BuildSolanaChangeset), - ccipChangesetSolana.BuildSolanaConfig{ - ChainSelector: solChainSelectors[0], - GitCommitSha: "0863d8fed5fbada9f352f33c405e1753cbb7d72c", - DestinationDir: e.SolChains[solChainSelectors[0]].ProgramsPath, - CleanDestinationDir: true, - }, - ) - deployCs := commonchangeset.Configure( - deployment.CreateLegacyChangeSet(ccipChangesetSolana.DeployChainContractsChangeset), - ccipChangesetSolana.DeployChainContractsConfig{ - HomeChainSelector: homeChainSel, - ContractParamsPerChain: map[uint64]ccipChangesetSolana.ChainContractParams{ - solChainSelectors[0]: { - FeeQuoterParams: ccipChangesetSolana.FeeQuoterParams{ - DefaultMaxFeeJuelsPerMsg: solBinary.Uint128{Lo: 300000000, Hi: 0, Endianness: nil}, - }, - OffRampParams: ccipChangesetSolana.OffRampParams{ - EnableExecutionAfter: int64(globals.PermissionLessExecutionThreshold.Seconds()), + e, err = commonchangeset.ApplyChangesetsV2(t, e, []commonchangeset.ConfiguredChangeSet{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipChangesetSolana.DeployChainContractsChangeset), + ccipChangesetSolana.DeployChainContractsConfig{ + HomeChainSelector: homeChainSel, + ContractParamsPerChain: map[uint64]ccipChangesetSolana.ChainContractParams{ + solChainSelectors[0]: { + FeeQuoterParams: ccipChangesetSolana.FeeQuoterParams{ + DefaultMaxFeeJuelsPerMsg: solBinary.Uint128{Lo: 300000000, Hi: 0, Endianness: nil}, + }, + OffRampParams: ccipChangesetSolana.OffRampParams{ + EnableExecutionAfter: int64(globals.PermissionLessExecutionThreshold.Seconds()), + }, }, }, + NewUpgradeAuthority: &upgradeAuthority, }, - }, - ) - // set the fee aggregator address - feeAggregatorCs := commonchangeset.Configure( - deployment.CreateLegacyChangeSet(ccipChangesetSolana.SetFeeAggregator), - ccipChangesetSolana.SetFeeAggregatorConfig{ - ChainSelector: solChainSelectors[0], - FeeAggregator: feeAggregatorPubKey.String(), - }, - ) - transferOwnershipCs := commonchangeset.Configure( - deployment.CreateLegacyChangeSet(ccipChangesetSolana.TransferCCIPToMCMSWithTimelockSolana), - ccipChangesetSolana.TransferCCIPToMCMSWithTimelockSolanaConfig{ - MinDelay: 1 * time.Second, - ContractsByChain: map[uint64]ccipChangesetSolana.CCIPContractsToTransfer{ - solChainSelectors[0]: { - Router: true, - FeeQuoter: true, - OffRamp: true, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipChangesetSolana.BuildSolanaChangeset), + ccipChangesetSolana.BuildSolanaConfig{ + ChainSelector: solChainSelectors[0], + GitCommitSha: "0863d8fed5fbada9f352f33c405e1753cbb7d72c", + DestinationDir: e.SolChains[solChainSelectors[0]].ProgramsPath, + CleanDestinationDir: true, + CleanGitDir: true, + UpgradeKeys: map[deployment.ContractType]string{ + cs.Router: state.SolChains[solChainSelectors[0]].Router.String(), + cs.FeeQuoter: state.SolChains[solChainSelectors[0]].FeeQuoter.String(), }, }, - }, - ) - // make sure idempotency works and setting the upgrade authority - upgradeAuthorityCs := commonchangeset.Configure( - deployment.CreateLegacyChangeSet(ccipChangesetSolana.DeployChainContractsChangeset), - ccipChangesetSolana.DeployChainContractsConfig{ - HomeChainSelector: homeChainSel, - ContractParamsPerChain: map[uint64]ccipChangesetSolana.ChainContractParams{ - solChainSelectors[0]: { - FeeQuoterParams: ccipChangesetSolana.FeeQuoterParams{ - DefaultMaxFeeJuelsPerMsg: solBinary.Uint128{Lo: 300000000, Hi: 0, Endianness: nil}, - }, - OffRampParams: ccipChangesetSolana.OffRampParams{ - EnableExecutionAfter: int64(globals.PermissionLessExecutionThreshold.Seconds()), + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipChangesetSolana.DeployChainContractsChangeset), + ccipChangesetSolana.DeployChainContractsConfig{ + HomeChainSelector: homeChainSel, + ContractParamsPerChain: map[uint64]ccipChangesetSolana.ChainContractParams{ + solChainSelectors[0]: { + FeeQuoterParams: ccipChangesetSolana.FeeQuoterParams{ + DefaultMaxFeeJuelsPerMsg: solBinary.Uint128{Lo: 300000000, Hi: 0, Endianness: nil}, + }, + OffRampParams: ccipChangesetSolana.OffRampParams{ + EnableExecutionAfter: int64(globals.PermissionLessExecutionThreshold.Seconds()), + }, }, }, - }, - NewUpgradeAuthority: &upgradeAuthority, - }, - ) - upgradeCs := commonchangeset.Configure( - deployment.CreateLegacyChangeSet(ccipChangesetSolana.DeployChainContractsChangeset), - ccipChangesetSolana.DeployChainContractsConfig{ - HomeChainSelector: homeChainSel, - ContractParamsPerChain: map[uint64]ccipChangesetSolana.ChainContractParams{ - solChainSelectors[0]: { - FeeQuoterParams: ccipChangesetSolana.FeeQuoterParams{ - DefaultMaxFeeJuelsPerMsg: solBinary.Uint128{Lo: 300000000, Hi: 0, Endianness: nil}, - }, - OffRampParams: ccipChangesetSolana.OffRampParams{ - EnableExecutionAfter: int64(globals.PermissionLessExecutionThreshold.Seconds()), + UpgradeConfig: ccipChangesetSolana.UpgradeConfig{ + NewFeeQuoterVersion: &deployment.Version1_1_0, + NewRouterVersion: &deployment.Version1_1_0, + UpgradeAuthority: upgradeAuthority, + SpillAddress: upgradeAuthority, + MCMS: &ccipChangeset.MCMSConfig{ + MinDelay: 1 * time.Second, }, }, }, - UpgradeConfig: ccipChangesetSolana.UpgradeConfig{ - NewFeeQuoterVersion: &deployment.Version1_1_0, - NewRouterVersion: &deployment.Version1_1_0, - UpgradeAuthority: upgradeAuthority, - SpillAddress: upgradeAuthority, - MCMS: &ccipChangeset.MCMSConfig{ - MinDelay: 1 * time.Second, - }, - }, - }, - ) - // because we cannot upgrade in place locally, we can't redeploy offramp - offRampCs := commonchangeset.Configure( - deployment.CreateLegacyChangeSet(ccipChangesetSolana.DeployChainContractsChangeset), - ccipChangesetSolana.DeployChainContractsConfig{ - HomeChainSelector: homeChainSel, - ContractParamsPerChain: map[uint64]ccipChangesetSolana.ChainContractParams{ - solChainSelectors[0]: { - FeeQuoterParams: ccipChangesetSolana.FeeQuoterParams{ - DefaultMaxFeeJuelsPerMsg: solBinary.Uint128{Lo: 300000000, Hi: 0, Endianness: nil}, + ), + }) + require.NoError(t, err) + testhelpers.ValidateSolanaState(t, e, solChainSelectors) + state, err = changeset.LoadOnchainStateSolana(e) + require.NoError(t, err) + oldOffRampAddress := state.SolChains[solChainSelectors[0]].OffRamp + // add a second offramp address + e, err = commonchangeset.ApplyChangesetsV2(t, e, []commonchangeset.ConfiguredChangeSet{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipChangesetSolana.DeployChainContractsChangeset), + ccipChangesetSolana.DeployChainContractsConfig{ + HomeChainSelector: homeChainSel, + ContractParamsPerChain: map[uint64]ccipChangesetSolana.ChainContractParams{ + solChainSelectors[0]: { + FeeQuoterParams: ccipChangesetSolana.FeeQuoterParams{ + DefaultMaxFeeJuelsPerMsg: solBinary.Uint128{Lo: 300000000, Hi: 0, Endianness: nil}, + }, + OffRampParams: ccipChangesetSolana.OffRampParams{ + EnableExecutionAfter: int64(globals.PermissionLessExecutionThreshold.Seconds()), + }, }, - OffRampParams: ccipChangesetSolana.OffRampParams{ - EnableExecutionAfter: int64(globals.PermissionLessExecutionThreshold.Seconds()), + }, + UpgradeConfig: ccipChangesetSolana.UpgradeConfig{ + NewOffRampVersion: &deployment.Version1_1_0, + UpgradeAuthority: upgradeAuthority, + SpillAddress: upgradeAuthority, + MCMS: &ccipChangeset.MCMSConfig{ + MinDelay: 1 * time.Second, }, }, }, - UpgradeConfig: ccipChangesetSolana.UpgradeConfig{ - NewOffRampVersion: &deployment.Version1_1_0, - }, - }, - ) - if ci { - e, err = commonchangeset.ApplyChangesetsV2(t, e, []commonchangeset.ConfiguredChangeSet{ - deployCs, - feeAggregatorCs, - upgradeAuthorityCs, - transferOwnershipCs, - }) - require.NoError(t, err) - state, err := ccipChangeset.LoadOnchainStateSolana(e) - require.NoError(t, err) - oldOffRampAddress := state.SolChains[solChainSelectors[0]].OffRamp - // add a second offramp address - e, err = commonchangeset.ApplyChangesetsV2(t, e, []commonchangeset.ConfiguredChangeSet{ - buildCs, - upgradeCs, - offRampCs, - }) - require.NoError(t, err) - // verify the offramp address is different - state, err = ccipChangeset.LoadOnchainStateSolana(e) - require.NoError(t, err) - newOffRampAddress := state.SolChains[solChainSelectors[0]].OffRamp - require.NotEqual(t, oldOffRampAddress, newOffRampAddress) - } else { - e, err = commonchangeset.ApplyChangesetsV2(t, e, []commonchangeset.ConfiguredChangeSet{ - buildCs, - deployCs, - feeAggregatorCs, - upgradeAuthorityCs, - upgradeCs, - }) - } + ), + }) + require.NoError(t, err) + // verify the offramp address is different + state, err = changeset.LoadOnchainStateSolana(e) require.NoError(t, err) + newOffRampAddress := state.SolChains[solChainSelectors[0]].OffRamp + require.NotEqual(t, oldOffRampAddress, newOffRampAddress) + // Verify router and fee quoter upgraded in place // and offramp had 2nd address added - addresses, err = e.ExistingAddresses.AddressesForChain(solChainSelectors[0]) + addresses, err := e.ExistingAddresses.AddressesForChain(solChainSelectors[0]) require.NoError(t, err) numRouters := 0 numFeeQuoters := 0 @@ -293,11 +265,7 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { } require.Equal(t, 1, numRouters) require.Equal(t, 1, numFeeQuoters) - if ci { - require.Equal(t, 2, numOffRamps) - } else { - require.Equal(t, 1, numOffRamps) - } + require.Equal(t, 2, numOffRamps) require.NoError(t, err) // solana verification testhelpers.ValidateSolanaState(t, e, solChainSelectors) diff --git a/deployment/ccip/changeset/solana/ownership_transfer_helpers.go b/deployment/ccip/changeset/solana/ownership_transfer_helpers.go index 094c3d3bc75..406846f5ee3 100644 --- a/deployment/ccip/changeset/solana/ownership_transfer_helpers.go +++ b/deployment/ccip/changeset/solana/ownership_transfer_helpers.go @@ -2,10 +2,8 @@ package solana import ( "fmt" - "math/big" "github.com/gagliardetto/solana-go" - mcmsSolana "github.com/smartcontractkit/mcms/sdk/solana" mcmsTypes "github.com/smartcontractkit/mcms/types" "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" @@ -60,25 +58,14 @@ func transferAndWrapAcceptOwnership( if err != nil { return mcmsTypes.Transaction{}, fmt.Errorf("%s: failed to create accept ownership instruction: %w", label, err) } - acceptData, err := ixAccept.Data() - if err != nil { - return mcmsTypes.Transaction{}, fmt.Errorf("%s: failed to extract accept data: %w", label, err) - } // 4. Wrap in MCMS transaction - mcmsTx, err := mcmsSolana.NewTransaction( - programID.String(), - acceptData, - big.NewInt(0), // e.g. value - ixAccept.Accounts(), // pass along needed accounts - string(label), // some string identifying the target - []string{}, // any relevant metadata - ) + mcmsTx, err := BuildMCMSTxn(ixAccept, programID.String(), label) if err != nil { return mcmsTypes.Transaction{}, fmt.Errorf("%s: failed to create MCMS transaction: %w", label, err) } - return mcmsTx, nil + return *mcmsTx, nil } // transferOwnershipRouter transfers ownership of the router to the timelock. diff --git a/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock_test.go b/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock_test.go index 94f34753ba6..986a06d90f8 100644 --- a/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock_test.go +++ b/deployment/ccip/changeset/solana/transfer_ccip_to_mcms_with_timelock_test.go @@ -30,7 +30,6 @@ import ( commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" - commonState "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/deployment/environment/memory" @@ -310,37 +309,7 @@ func TestTransferCCIPToMCMSWithTimelockSolana(t *testing.T) { e, state := prepareEnvironmentForOwnershipTransfer(t) solChain1 := e.AllChainSelectorsSolana()[0] solChain := e.SolChains[solChain1] - // tokenAddress := state.SolChains[solChain1].SPL2022Tokens[0] - addresses, err := e.ExistingAddresses.AddressesForChain(solChain1) - require.NoError(t, err) - mcmState, err := commonState.MaybeLoadMCMSWithTimelockChainStateSolana(e.SolChains[solChain1], addresses) - require.NoError(t, err) - - // Fund signer PDAs for timelock and mcm - // If we don't fund, execute() calls will fail with "no funds" errors. - timelockSignerPDA := commonState.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) - mcmSignerPDA := commonState.GetMCMSignerPDA(mcmState.McmProgram, mcmState.ProposerMcmSeed) - memory.FundSolanaAccounts(e.GetContext(), t, []solana.PublicKey{timelockSignerPDA, mcmSignerPDA}, - 100, solChain.Client) - t.Logf("funded timelock signer PDA: %s", timelockSignerPDA.String()) - t.Logf("funded mcm signer PDA: %s", mcmSignerPDA.String()) - // Apply transfer ownership changeset - e, err = commonchangeset.ApplyChangesetsV2(t, e, []commonchangeset.ConfiguredChangeSet{ - commonchangeset.Configure( - deployment.CreateLegacyChangeSet(solanachangesets.TransferCCIPToMCMSWithTimelockSolana), - solanachangesets.TransferCCIPToMCMSWithTimelockSolanaConfig{ - MinDelay: 1 * time.Second, - ContractsByChain: map[uint64]solanachangesets.CCIPContractsToTransfer{ - solChain1: { - Router: true, - FeeQuoter: true, - OffRamp: true, - }, - }, - }, - ), - }) - require.NoError(t, err) + timelockSignerPDA, _ := testhelpers.TransferOwnershipSolana(t, &e, solChain1, false, true, true, true) // 5. Now verify on-chain that each contract’s “config account” authority is the Timelock PDA. // Typically, each contract has its own config account: RouterConfigPDA, FeeQuoterConfigPDA, @@ -352,7 +321,8 @@ func TestTransferCCIPToMCMSWithTimelockSolana(t *testing.T) { routerConfigPDA := state.SolChains[solChain1].RouterConfigPDA t.Logf("Checking Router Config PDA ownership data configPDA: %s", routerConfigPDA.String()) programData := ccip_router.Config{} - err = solChain.GetAccountDataBorshInto(ctx, routerConfigPDA, &programData) + err := solChain.GetAccountDataBorshInto(ctx, routerConfigPDA, &programData) + require.NoError(t, err) return timelockSignerPDA.String() == programData.Owner.String() }, 30*time.Second, 5*time.Second, "Router config PDA owner was not changed to timelock signer PDA") @@ -361,7 +331,7 @@ func TestTransferCCIPToMCMSWithTimelockSolana(t *testing.T) { feeQuoterConfigPDA := state.SolChains[solChain1].FeeQuoterConfigPDA t.Logf("Checking Fee Quoter PDA ownership data configPDA: %s", feeQuoterConfigPDA.String()) programData := fee_quoter.Config{} - err = solChain.GetAccountDataBorshInto(ctx, feeQuoterConfigPDA, &programData) + err := solChain.GetAccountDataBorshInto(ctx, feeQuoterConfigPDA, &programData) require.NoError(t, err) return timelockSignerPDA.String() == programData.Owner.String() }, 30*time.Second, 5*time.Second, "Fee Quoter config PDA owner was not changed to timelock signer PDA") @@ -371,7 +341,7 @@ func TestTransferCCIPToMCMSWithTimelockSolana(t *testing.T) { offRampConfigPDA := state.SolChains[solChain1].OffRampConfigPDA programData := ccip_offramp.Config{} t.Logf("Checking Off Ramp PDA ownership data configPDA: %s", offRampConfigPDA.String()) - err = solChain.GetAccountDataBorshInto(ctx, offRampConfigPDA, &programData) + err := solChain.GetAccountDataBorshInto(ctx, offRampConfigPDA, &programData) require.NoError(t, err) return timelockSignerPDA.String() == programData.Owner.String() }, 30*time.Second, 5*time.Second, "OffRamp config PDA owner was not changed to timelock signer PDA") diff --git a/deployment/ccip/changeset/solana/utils.go b/deployment/ccip/changeset/solana/utils.go index ac571187a2d..47107b7d11c 100644 --- a/deployment/ccip/changeset/solana/utils.go +++ b/deployment/ccip/changeset/solana/utils.go @@ -2,8 +2,11 @@ package solana import ( "fmt" + "math/big" + "github.com/gagliardetto/solana-go" mcmsSolana "github.com/smartcontractkit/mcms/sdk/solana" + mcmsTypes "github.com/smartcontractkit/mcms/types" "github.com/smartcontractkit/chainlink/deployment" cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" @@ -33,3 +36,27 @@ func ValidateMCMSConfig(e deployment.Environment, chainSelector uint64, mcms *cs } return nil } + +func BuildMCMSTxn(ixn solana.Instruction, programID string, contractType deployment.ContractType) (*mcmsTypes.Transaction, error) { + data, err := ixn.Data() + if err != nil { + return nil, fmt.Errorf("failed to extract data: %w", err) + } + for _, account := range ixn.Accounts() { + if account.IsSigner { + account.IsSigner = false + } + } + tx, err := mcmsSolana.NewTransaction( + programID, + data, + big.NewInt(0), // e.g. value + ixn.Accounts(), // pass along needed accounts + string(contractType), // some string identifying the target + []string{}, // any relevant metadata + ) + if err != nil { + return nil, fmt.Errorf("failed to create transaction: %w", err) + } + return &tx, nil +} diff --git a/deployment/ccip/changeset/solana_state.go b/deployment/ccip/changeset/solana_state.go index e48f5165677..a5ed3a93671 100644 --- a/deployment/ccip/changeset/solana_state.go +++ b/deployment/ccip/changeset/solana_state.go @@ -12,9 +12,14 @@ import ( solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" + "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" solOffRamp "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" + "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" + "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" "github.com/smartcontractkit/chainlink/deployment" + commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" + "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" ) @@ -237,3 +242,58 @@ func FindSolanaAddress(tv deployment.TypeAndVersion, addresses map[string]deploy } return solana.PublicKey{} } + +func ValidateOwnershipSolana( + e *deployment.Environment, + chain deployment.SolChain, + mcms bool, + deployerKey solana.PublicKey, + programID solana.PublicKey, + contractType deployment.ContractType, +) error { + addresses, err := e.ExistingAddresses.AddressesForChain(chain.Selector) + if err != nil { + return fmt.Errorf("failed to get existing addresses: %w", err) + } + mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + if err != nil { + return fmt.Errorf("failed to load MCMS with timelock chain state: %w", err) + } + timelockSignerPDA := state.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + config, _, err := solState.FindConfigPDA(programID) + if err != nil { + return fmt.Errorf("failed to find config PDA: %w", err) + } + switch contractType { + case Router: + programData := ccip_router.Config{} + err = chain.GetAccountDataBorshInto(e.GetContext(), config, &programData) + if err != nil { + return fmt.Errorf("failed to get account data: %w", err) + } + if err := commoncs.ValidateOwnershipSolanaCommon(mcms, deployerKey, timelockSignerPDA, programData.Owner); err != nil { + return fmt.Errorf("failed to validate ownership for router: %w", err) + } + case OffRamp: + programData := ccip_offramp.Config{} + err = chain.GetAccountDataBorshInto(e.GetContext(), config, &programData) + if err != nil { + return fmt.Errorf("failed to get account data: %w", err) + } + if err := commoncs.ValidateOwnershipSolanaCommon(mcms, deployerKey, timelockSignerPDA, programData.Owner); err != nil { + return fmt.Errorf("failed to validate ownership for offramp: %w", err) + } + case FeeQuoter: + programData := fee_quoter.Config{} + err = chain.GetAccountDataBorshInto(e.GetContext(), config, &programData) + if err != nil { + return fmt.Errorf("failed to get account data: %w", err) + } + if err := commoncs.ValidateOwnershipSolanaCommon(mcms, deployerKey, timelockSignerPDA, programData.Owner); err != nil { + return fmt.Errorf("failed to validate ownership for feequoter: %w", err) + } + default: + return fmt.Errorf("unsupported contract type: %s", contractType) + } + return nil +} diff --git a/deployment/ccip/changeset/testhelpers/test_helpers.go b/deployment/ccip/changeset/testhelpers/test_helpers.go index 33683f0c217..45e3a2a8b88 100644 --- a/deployment/ccip/changeset/testhelpers/test_helpers.go +++ b/deployment/ccip/changeset/testhelpers/test_helpers.go @@ -23,6 +23,8 @@ import ( ccipChangeSetSolana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" + "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" @@ -1630,6 +1632,63 @@ func FindReceiverTargetAccount(receiverID solana.PublicKey) solana.PublicKey { return receiverTargetAccount } +func TransferOwnershipSolana( + t *testing.T, + e *deployment.Environment, + solChain uint64, + needTimelockDeployed bool, + transferRouter, transferFeeQuoter, transferOffRamp bool) (solana.PublicKey, solana.PublicKey) { + var err error + if needTimelockDeployed { + *e, err = commoncs.ApplyChangesetsV2(t, *e, []commoncs.ConfiguredChangeSet{ + commoncs.Configure( + deployment.CreateLegacyChangeSet(commoncs.DeployMCMSWithTimelockV2), + map[uint64]commontypes.MCMSWithTimelockConfigV2{ + solChain: { + Canceller: proposalutils.SingleGroupMCMSV2(t), + Proposer: proposalutils.SingleGroupMCMSV2(t), + Bypasser: proposalutils.SingleGroupMCMSV2(t), + TimelockMinDelay: big.NewInt(0), + }, + }, + ), + }) + require.NoError(t, err) + } + + addresses, err := e.ExistingAddresses.AddressesForChain(solChain) + require.NoError(t, err) + mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(e.SolChains[solChain], addresses) + require.NoError(t, err) + + // Fund signer PDAs for timelock and mcm + // If we don't fund, execute() calls will fail with "no funds" errors. + timelockSignerPDA := state.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + mcmSignerPDA := state.GetMCMSignerPDA(mcmState.McmProgram, mcmState.ProposerMcmSeed) + memory.FundSolanaAccounts(e.GetContext(), t, []solana.PublicKey{timelockSignerPDA, mcmSignerPDA}, + 100, e.SolChains[solChain].Client) + t.Logf("funded timelock signer PDA: %s", timelockSignerPDA.String()) + t.Logf("funded mcm signer PDA: %s", mcmSignerPDA.String()) + // Apply transfer ownership changeset + *e, err = commoncs.ApplyChangesetsV2(t, *e, []commoncs.ConfiguredChangeSet{ + commoncs.Configure( + deployment.CreateLegacyChangeSet(ccipChangeSetSolana.TransferCCIPToMCMSWithTimelockSolana), + ccipChangeSetSolana.TransferCCIPToMCMSWithTimelockSolanaConfig{ + MinDelay: 1 * time.Second, + ContractsByChain: map[uint64]ccipChangeSetSolana.CCIPContractsToTransfer{ + solChain: { + Router: transferRouter, + FeeQuoter: transferFeeQuoter, + OffRamp: transferOffRamp, + }, + }, + }, + ), + }) + require.NoError(t, err) + return timelockSignerPDA, mcmSignerPDA +} + func GenTestTransferOwnershipConfig( e DeployedEnv, chains []uint64, diff --git a/deployment/ccip/changeset/v1_6/cs_chain_contracts.go b/deployment/ccip/changeset/v1_6/cs_chain_contracts.go index fdb66bf6087..0d0f6c5f959 100644 --- a/deployment/ccip/changeset/v1_6/cs_chain_contracts.go +++ b/deployment/ccip/changeset/v1_6/cs_chain_contracts.go @@ -20,7 +20,6 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - commonState "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" "github.com/smartcontractkit/chainlink/deployment" @@ -1422,24 +1421,12 @@ func (c SetOCR3OffRampConfig) validateRemoteChain(e *deployment.Environment, sta } switch family { case chain_selectors.FamilySolana: - chain, ok := e.SolChains[chainSelector] - if !ok { - return fmt.Errorf("chain %d not found in environment", chainSelector) - } chainState, ok := state.SolChains[chainSelector] if !ok { return fmt.Errorf("remote chain %d not found in onchain state", chainSelector) } - addresses, err := e.ExistingAddresses.AddressesForChain(chainSelector) - if err != nil { - return err - } - mcmState, err := commonState.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) - if err != nil { - return fmt.Errorf("error loading MCMS state for chain %d: %w", chainSelector, err) - } - if err := commoncs.ValidateOwnershipSolana(e.GetContext(), c.MCMS != nil, e.SolChains[chainSelector].DeployerKey.PublicKey(), mcmState.TimelockProgram, mcmState.TimelockSeed, chainState.Router); err != nil { - return err + if chainState.OffRamp.IsZero() { + return fmt.Errorf("missing OffRamp for chain %d", chainSelector) } case chain_selectors.FamilyEVM: chainState, ok := state.Chains[chainSelector] diff --git a/deployment/common/changeset/deploy_mcms_with_timelock.go b/deployment/common/changeset/deploy_mcms_with_timelock.go index cfe77a23c08..4ec3a140b82 100644 --- a/deployment/common/changeset/deploy_mcms_with_timelock.go +++ b/deployment/common/changeset/deploy_mcms_with_timelock.go @@ -13,7 +13,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment/common/changeset/internal" evminternal "github.com/smartcontractkit/chainlink/deployment/common/changeset/internal/evm" solanainternal "github.com/smartcontractkit/chainlink/deployment/common/changeset/internal/solana" - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" "github.com/smartcontractkit/chainlink/deployment/common/types" ) @@ -82,11 +81,15 @@ func ValidateOwnership(ctx context.Context, mcms bool, deployerKey, timelock com return nil } -// TODO: SOLANA_CCIP -func ValidateOwnershipSolana( - ctx context.Context, mcms bool, deployerKey, timelock solana.PublicKey, timelockSeed state.PDASeed, - ccipRouter solana.PublicKey, -) error { - // TODO: implement +func ValidateOwnershipSolanaCommon(mcms bool, deployerKey solana.PublicKey, timelockSignerPDA solana.PublicKey, programOwner solana.PublicKey) error { + if !mcms { + if deployerKey.String() != programOwner.String() { + return fmt.Errorf("deployer key %s does not match owner %s", deployerKey.String(), programOwner.String()) + } + } else { + if timelockSignerPDA.String() != programOwner.String() { + return fmt.Errorf("timelock signer PDA %s does not match owner %s", timelockSignerPDA.String(), programOwner.String()) + } + } return nil } From 93a406f617ec8bae08613c309460188debc028b0 Mon Sep 17 00:00:00 2001 From: Vyzaldy Sanchez Date: Mon, 24 Feb 2025 13:16:55 -0400 Subject: [PATCH 39/58] Sends extra config + chainlink-common bump (#16247) * Sends extra config + chainlink-common bump * Fixes CI * Bumps chainlink-common * Fixes CI * Fixes CI * Fixes CI * gomods tidy * Renames import * Renames Accept/Transmit fields into ShouldAccept/ShouldTransmit * bumps `chainlink-common` * bumps deps * bumps deps * bumps deps * bumps deps * bumps deps * bumps deps * bumps deps * Fixes test * gomods tidy * Fixes test * Generates OCR3 config view (#16395) * Generates OCR3 config view * WIP - parses the OCR3 config event into readable values * CRE-226: mv ContractSet; cleanup used compatibility * implement continue-on-error view * Loads readable `OracleConfig` into view * Fixes lint * Fixes view implementation * Adds test validating the `OracleConfig` view generation * Tests cleanup * Lint cleanup --------- Co-authored-by: krehermann <16602512+krehermann@users.noreply.github.com> * Fixes merge + gomods tidy * gomods tidy * Fixes test * Renames view field * Renames view field * Hex encodes view signers field values * Fixes merge conflicts issues * gomods tidy * Fixes merge conflicts issues * Fixes lint * Prevents break on 0 `RequestTimeout` * Prevents break on 0 `RequestTimeout` * gomods tidy * git merge conflicts * fixes lint * gomods tidy * gomods tidy * gomods tidy * Fixes merge conflicts issues * Fixes merge conflicts issues * bumps chainlink-common + fixes(?) * gomods tidy * gomods tidy * remove unused file * fixes conflicts * Updates comment * gomods tidy * gomods tidy * Renames property correctly * Sets lower `MaxBatchSize` on examples/tests * Sets lower `MaxBatchSize` on examples/tests * Fixes test --------- Co-authored-by: krehermann <16602512+krehermann@users.noreply.github.com> --- core/scripts/go.mod | 6 +- core/scripts/go.sum | 4 +- core/scripts/keystone/ocr_config.json | 6 +- .../src/generate_local_ocr3_config.go | 6 +- .../keystone/src/testdata/SampleConfig.json | 8 +- .../nodeclient/chainlink_models_test.go | 1 + deployment/go.mod | 4 +- deployment/go.sum | 4 +- .../keystone/changeset/accept_ownership.go | 4 +- .../changeset/append_node_capabilities.go | 2 +- deployment/keystone/changeset/compatiblity.go | 17 -- .../keystone/changeset/deploy_forwarder.go | 2 +- deployment/keystone/changeset/deploy_ocr3.go | 2 +- .../keystone/changeset/internal/deploy.go | 4 +- .../keystone/changeset/internal/ocr3config.go | 88 +++++++- .../changeset/internal/ocr3config_test.go | 12 +- .../keystone/changeset/internal/state.go | 55 +---- .../keystone/changeset/internal/state_test.go | 1 + deployment/keystone/changeset/state.go | 213 ++++++++++++++++++ .../keystone/changeset/test/env_setup.go | 30 +-- deployment/keystone/changeset/types.go | 13 ++ deployment/keystone/changeset/update_don.go | 2 +- .../changeset/update_node_capabilities.go | 2 +- deployment/keystone/changeset/update_nodes.go | 2 +- deployment/keystone/changeset/view.go | 37 ++- .../keystone/changeset/view_contracts.go | 164 ++++++++++++++ deployment/keystone/changeset/view_test.go | 145 ++++++++++-- deployment/keystone/view/view.go | 32 --- integration-tests/go.mod | 6 +- integration-tests/go.sum | 4 +- integration-tests/load/go.mod | 8 +- integration-tests/load/go.sum | 4 +- system-tests/lib/cre/contracts/contracts.go | 7 +- system-tests/lib/go.mod | 6 +- system-tests/lib/go.sum | 4 +- system-tests/tests/go.mod | 6 +- system-tests/tests/go.sum | 4 +- 37 files changed, 696 insertions(+), 219 deletions(-) create mode 100644 deployment/keystone/changeset/state.go create mode 100644 deployment/keystone/changeset/types.go create mode 100644 deployment/keystone/changeset/view_contracts.go delete mode 100644 deployment/keystone/view/view.go diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 680f47423a4..7fb73eed291 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -12,8 +12,8 @@ replace github.com/smartcontractkit/chainlink/deployment => ../../deployment // Using a separate `require` here to avoid surrounding line changes // creating potential merge conflicts. require ( - github.com/smartcontractkit/chainlink/deployment v0.0.0-20250128231431-9279badae2f0 - github.com/smartcontractkit/chainlink/v2 v2.19.0-ccip1.5.16-alpha.0.0.20250129223716-34cbaaab2d04 + github.com/smartcontractkit/chainlink/deployment v0.0.0-20250221182743-098d1b0a763a + github.com/smartcontractkit/chainlink/v2 v2.0.0-20250221182743-098d1b0a763a ) require ( @@ -34,7 +34,7 @@ require ( github.com/prometheus/client_golang v1.20.5 github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea + github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 721b690ba76..fbe0b40ff8c 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1090,8 +1090,8 @@ github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0/go.mod h1:YQuXIqQpmpAqstWV0LHaDTJ5nsSWuip5ivEM+Fisb+4= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= diff --git a/core/scripts/keystone/ocr_config.json b/core/scripts/keystone/ocr_config.json index 31fe8988056..96691e48620 100644 --- a/core/scripts/keystone/ocr_config.json +++ b/core/scripts/keystone/ocr_config.json @@ -3,7 +3,7 @@ "MaxQueryLengthBytes": 1000000, "MaxObservationLengthBytes": 1000000, "MaxReportLengthBytes": 1000000, - "MaxRequestBatchSize": 1000, + "MaxBatchSize": 20, "UniqueReports": true, "DeltaProgressMillis": 5000, @@ -19,8 +19,8 @@ "MaxDurationQueryMillis": 1000, "MaxDurationObservationMillis": 1000, "MaxDurationReportMillis": 1000, - "MaxDurationAcceptMillis": 1000, - "MaxDurationTransmitMillis": 1000, + "MaxDurationShouldAcceptMillis": 1000, + "MaxDurationShouldTransmitMillis": 1000, "MaxFaultyOracles": 1 } diff --git a/core/scripts/keystone/src/generate_local_ocr3_config.go b/core/scripts/keystone/src/generate_local_ocr3_config.go index 68b1cade0c5..5dff8019179 100644 --- a/core/scripts/keystone/src/generate_local_ocr3_config.go +++ b/core/scripts/keystone/src/generate_local_ocr3_config.go @@ -76,7 +76,7 @@ func (g *generateLocalOCR3Config) Run(args []string) { "MaxQueryLengthBytes": 1000000, "MaxObservationLengthBytes": 1000000, "MaxReportLengthBytes": 1000000, - "MaxRequestBatchSize": 1000, + "MaxBatchSize": 20, "UniqueReports": true, "DeltaProgressMillis": 5000, "DeltaResendMillis": 5000, @@ -90,8 +90,8 @@ func (g *generateLocalOCR3Config) Run(args []string) { "MaxDurationQueryMillis": 1000, "MaxDurationObservationMillis": 1000, "MaxDurationReportMillis": 1000, - "MaxDurationAcceptMillis": 1000, - "MaxDurationTransmitMillis": 1000, + "MaxDurationShouldAcceptMillis": 1000, + "MaxDurationShouldTransmitMillis": 1000, "MaxFaultyOracles": 1}`) var cfg changeset.OracleConfig err = json.Unmarshal(config, &cfg) diff --git a/core/scripts/keystone/src/testdata/SampleConfig.json b/core/scripts/keystone/src/testdata/SampleConfig.json index 5d7893cb432..d39dc759af7 100644 --- a/core/scripts/keystone/src/testdata/SampleConfig.json +++ b/core/scripts/keystone/src/testdata/SampleConfig.json @@ -3,8 +3,9 @@ "MaxQueryLengthBytes": 1000000, "MaxObservationLengthBytes": 1000000, "MaxReportLengthBytes": 1000000, - "MaxRequestBatchSize": 1000, + "MaxBatchSize": 20, "UniqueReports": true, + "RequestTimeout": "30s", "DeltaProgressMillis": 5000, "DeltaResendMillis": 5000, "DeltaInitialMillis": 5000, @@ -19,8 +20,9 @@ "MaxDurationQueryMillis": 1000, "MaxDurationObservationMillis": 1000, "MaxDurationReportMillis": 1000, - "MaxDurationAcceptMillis": 1000, - "MaxDurationTransmitMillis": 1000, + "MaxDurationShouldAcceptMillis": 1000, + "MaxDurationShouldTransmitMillis": 1000, + "MaxFaultyOracles": 1 } } \ No newline at end of file diff --git a/deployment/environment/nodeclient/chainlink_models_test.go b/deployment/environment/nodeclient/chainlink_models_test.go index ae1e35eb33f..4f4c06dcbf2 100644 --- a/deployment/environment/nodeclient/chainlink_models_test.go +++ b/deployment/environment/nodeclient/chainlink_models_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-common/pkg/codec" + "github.com/smartcontractkit/chainlink/v2/core/services/job" evmtypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types" ) diff --git a/deployment/go.mod b/deployment/go.mod index aba9cc0aaec..f1a0f6fb3f3 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -7,7 +7,7 @@ replace github.com/smartcontractkit/chainlink/v2 => ../ // Using a separate inline `require` here to avoid surrounding line changes // creating potential merge conflicts. -require github.com/smartcontractkit/chainlink/v2 v2.0.0-20250128231431-9279badae2f0 +require github.com/smartcontractkit/chainlink/v2 v2.0.0-20250221182743-098d1b0a763a require ( github.com/Khan/genqlient v0.7.0 @@ -32,7 +32,7 @@ require ( github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 - github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea + github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 diff --git a/deployment/go.sum b/deployment/go.sum index c37601139cf..df1bf1dc209 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1138,8 +1138,8 @@ github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0/go.mod h1:YQuXIqQpmpAqstWV0LHaDTJ5nsSWuip5ivEM+Fisb+4= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= diff --git a/deployment/keystone/changeset/accept_ownership.go b/deployment/keystone/changeset/accept_ownership.go index dd709523bc2..684df720164 100644 --- a/deployment/keystone/changeset/accept_ownership.go +++ b/deployment/keystone/changeset/accept_ownership.go @@ -5,8 +5,6 @@ import ( "github.com/ethereum/go-ethereum/common" - kslib "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal" - "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/common/changeset" ) @@ -25,7 +23,7 @@ func AcceptAllOwnershipsProposal(e deployment.Environment, req *AcceptAllOwnersh chain := e.Chains[chainSelector] addrBook := e.ExistingAddresses - r, err := kslib.GetContractSets(e.Logger, &kslib.GetContractSetsRequest{ + r, err := GetContractSets(e.Logger, &GetContractSetsRequest{ Chains: map[uint64]deployment.Chain{ req.ChainSelector: chain, }, diff --git a/deployment/keystone/changeset/append_node_capabilities.go b/deployment/keystone/changeset/append_node_capabilities.go index fcd20b856ad..c2c3739a566 100644 --- a/deployment/keystone/changeset/append_node_capabilities.go +++ b/deployment/keystone/changeset/append_node_capabilities.go @@ -70,7 +70,7 @@ func (req *AppendNodeCapabilitiesRequest) convert(e deployment.Environment) (*in return nil, nil, fmt.Errorf("failed to validate UpdateNodeCapabilitiesRequest: %w", err) } registryChain := e.Chains[req.RegistryChainSel] // exists because of the validation above - resp, err := internal.GetContractSets(e.Logger, &internal.GetContractSetsRequest{ + resp, err := GetContractSets(e.Logger, &GetContractSetsRequest{ Chains: map[uint64]deployment.Chain{req.RegistryChainSel: registryChain}, AddressBook: e.ExistingAddresses, }) diff --git a/deployment/keystone/changeset/compatiblity.go b/deployment/keystone/changeset/compatiblity.go index b7a6e1b7c95..96e665f2525 100644 --- a/deployment/keystone/changeset/compatiblity.go +++ b/deployment/keystone/changeset/compatiblity.go @@ -19,21 +19,6 @@ type TopLevelConfigSource = internal.TopLevelConfigSource // GenerateOCR3Config generates an OCR3 config var GenerateOCR3Config = internal.GenerateOCR3Config -// FeedConsumer is a feed consumer contract type -var FeedConsumer = internal.FeedConsumer - -// KeystoneForwarder is a keystone forwarder contract type -var KeystoneForwarder = internal.KeystoneForwarder - -// GetContractSetsRequest is a request to get contract sets -type GetContractSetsRequest = internal.GetContractSetsRequest - -// GetContractSetsResponse is a response to get contract sets -type GetContractSetsResponse = internal.GetContractSetsResponse - -// GetContractSets gets contract sets -var GetContractSets = internal.GetContractSets - // RegisterNOPSRequest is a request to register NOPS type RegisterNOPSRequest = internal.RegisterNOPSRequest @@ -87,5 +72,3 @@ type DONCapabilityWithConfig = internal.DONCapabilityWithConfig type DeployRequest = internal.DeployRequest type DeployResponse = internal.DeployResponse - -type ContractSet = internal.ContractSet diff --git a/deployment/keystone/changeset/deploy_forwarder.go b/deployment/keystone/changeset/deploy_forwarder.go index 8a9cdf4d681..feccc14b6ce 100644 --- a/deployment/keystone/changeset/deploy_forwarder.go +++ b/deployment/keystone/changeset/deploy_forwarder.go @@ -87,7 +87,7 @@ func ConfigureForwardContracts(env deployment.Environment, req ConfigureForwardC return deployment.ChangesetOutput{}, fmt.Errorf("failed to configure forward contracts: %w", err) } - cresp, err := internal.GetContractSets(env.Logger, &internal.GetContractSetsRequest{ + cresp, err := GetContractSets(env.Logger, &GetContractSetsRequest{ Chains: env.Chains, AddressBook: env.ExistingAddresses, }) diff --git a/deployment/keystone/changeset/deploy_ocr3.go b/deployment/keystone/changeset/deploy_ocr3.go index c9da8b81237..070c7ef59ce 100644 --- a/deployment/keystone/changeset/deploy_ocr3.go +++ b/deployment/keystone/changeset/deploy_ocr3.go @@ -84,7 +84,7 @@ func ConfigureOCR3Contract(env deployment.Environment, cfg ConfigureOCR3Config) if resp.Ops == nil { return out, errors.New("expected MCMS operation to be non-nil") } - r, err := kslib.GetContractSets(env.Logger, &kslib.GetContractSetsRequest{ + r, err := GetContractSets(env.Logger, &GetContractSetsRequest{ Chains: env.Chains, AddressBook: env.ExistingAddresses, }) diff --git a/deployment/keystone/changeset/internal/deploy.go b/deployment/keystone/changeset/internal/deploy.go index bed5fd5e23c..e67ea047d7d 100644 --- a/deployment/keystone/changeset/internal/deploy.go +++ b/deployment/keystone/changeset/internal/deploy.go @@ -317,7 +317,7 @@ func ConfigureOCR3Contract(env *deployment.Environment, chainSel uint64, dons [] return fmt.Errorf("failed to get contract set for chain %d", chainSel) } - contract, err := contracts.GetOCR3Contract(nil) + contract, err := contracts.getOCR3Contract(nil) if err != nil { env.Logger.Errorf("failed to get OCR3 contract: %s", err) return fmt.Errorf("failed to get OCR3 contract: %w", err) @@ -375,7 +375,7 @@ func ConfigureOCR3ContractFromJD(env *deployment.Environment, cfg ConfigureOCR3C return nil, fmt.Errorf("failed to get contract set for chain %d", cfg.ChainSel) } - contract, err := contracts.GetOCR3Contract(cfg.Address) + contract, err := contracts.getOCR3Contract(cfg.Address) if err != nil { env.Logger.Errorf("%sfailed to get OCR3 contract at %s : %s", prefix, cfg.Address, err) return nil, fmt.Errorf("failed to get OCR3 contract: %w", err) diff --git a/deployment/keystone/changeset/internal/ocr3config.go b/deployment/keystone/changeset/internal/ocr3config.go index e8038134f02..39f1c3817b2 100644 --- a/deployment/keystone/changeset/internal/ocr3config.go +++ b/deployment/keystone/changeset/internal/ocr3config.go @@ -13,11 +13,15 @@ import ( "time" "github.com/ethereum/go-ethereum/common" - mcmstypes "github.com/smartcontractkit/mcms/types" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/durationpb" "github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper" "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3confighelper" "github.com/smartcontractkit/libocr/offchainreporting2plus/types" + mcmstypes "github.com/smartcontractkit/mcms/types" + + capocr3types "github.com/smartcontractkit/chainlink-common/pkg/capabilities/consensus/ocr3/types" "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" @@ -35,8 +39,12 @@ type OracleConfig struct { MaxQueryLengthBytes uint32 MaxObservationLengthBytes uint32 MaxReportLengthBytes uint32 - MaxRequestBatchSize uint32 + MaxOutcomeLengthBytes uint32 + MaxReportCount uint32 + MaxBatchSize uint32 + OutcomePruningThreshold uint64 UniqueReports bool + RequestTimeout time.Duration DeltaProgressMillis uint32 DeltaResendMillis uint32 @@ -48,14 +56,50 @@ type OracleConfig struct { MaxRoundsPerEpoch uint64 TransmissionSchedule []int - MaxDurationQueryMillis uint32 - MaxDurationObservationMillis uint32 - MaxDurationAcceptMillis uint32 - MaxDurationTransmitMillis uint32 + MaxDurationQueryMillis uint32 + MaxDurationObservationMillis uint32 + MaxDurationShouldAcceptMillis uint32 + MaxDurationShouldTransmitMillis uint32 MaxFaultyOracles int } +func (oc *OracleConfig) UnmarshalJSON(data []byte) error { + type aliasT OracleConfig + temp := &struct { + RequestTimeout string `json:"RequestTimeout"` + *aliasT + }{ + aliasT: (*aliasT)(oc), + } + if err := json.Unmarshal(data, temp); err != nil { + return fmt.Errorf("failed to unmarshal OracleConfig: %w", err) + } + + if temp.RequestTimeout == "" { + oc.RequestTimeout = 0 + } else { + requestTimeout, err := time.ParseDuration(temp.RequestTimeout) + if err != nil { + return fmt.Errorf("failed to parse RequestTimeout: %w", err) + } + oc.RequestTimeout = requestTimeout + } + + return nil +} + +func (oc OracleConfig) MarshalJSON() ([]byte, error) { + type aliasT OracleConfig + return json.Marshal(&struct { + RequestTimeout string `json:"RequestTimeout"` + *aliasT + }{ + RequestTimeout: oc.RequestTimeout.String(), + aliasT: (*aliasT)(&oc), + }) +} + type NodeKeys struct { EthAddress string `json:"EthAddress"` AptosAccount string `json:"AptosAccount"` @@ -202,7 +246,7 @@ func GenerateOCR3Config(cfg OracleConfig, nca []NodeKeys, secrets deployment.OCR return OCR2OracleConfig{}, fmt.Errorf("wrong num elements copied from ocr2 offchain public key. expected %d but got %d", ed25519.PublicKeySize, nCopied) } - offchainPubKeysBytes = append(offchainPubKeysBytes, types.OffchainPublicKey(pkBytesFixed)) + offchainPubKeysBytes = append(offchainPubKeysBytes, pkBytesFixed) } configPubKeysBytes := []types.ConfigEncryptionPublicKey{} @@ -218,7 +262,7 @@ func GenerateOCR3Config(cfg OracleConfig, nca []NodeKeys, secrets deployment.OCR return OCR2OracleConfig{}, fmt.Errorf("wrong num elements copied from ocr2 config public key. expected %d but got %d", ed25519.PublicKeySize, n) } - configPubKeysBytes = append(configPubKeysBytes, types.ConfigEncryptionPublicKey(pkBytesFixed)) + configPubKeysBytes = append(configPubKeysBytes, pkBytesFixed) } identities := []confighelper.OracleIdentityExtra{} @@ -234,6 +278,26 @@ func GenerateOCR3Config(cfg OracleConfig, nca []NodeKeys, secrets deployment.OCR }) } + // let's keep reqTimeout as nil if it's 0, so we can use the default value within `chainlink-common`. + // See: https://github.com/smartcontractkit/chainlink-common/blob/main/pkg/capabilities/consensus/ocr3/factory.go#L73 + var reqTimeout *durationpb.Duration + if cfg.RequestTimeout > 0 { + reqTimeout = durationpb.New(cfg.RequestTimeout) + } + cfgBytes, err := proto.Marshal(&capocr3types.ReportingPluginConfig{ + MaxQueryLengthBytes: cfg.MaxQueryLengthBytes, + MaxObservationLengthBytes: cfg.MaxObservationLengthBytes, + MaxReportLengthBytes: cfg.MaxReportLengthBytes, + MaxOutcomeLengthBytes: cfg.MaxOutcomeLengthBytes, + MaxReportCount: cfg.MaxReportCount, + MaxBatchSize: cfg.MaxBatchSize, + OutcomePruningThreshold: cfg.OutcomePruningThreshold, + RequestTimeout: reqTimeout, + }) + if err != nil { + return OCR2OracleConfig{}, fmt.Errorf("failed to marshal ReportingPluginConfig: %w", err) + } + signers, transmitters, f, onchainConfig, offchainConfigVersion, offchainConfig, err := ocr3confighelper.ContractSetConfigArgsDeterministic( secrets.EphemeralSk, secrets.SharedSecret, @@ -247,12 +311,12 @@ func GenerateOCR3Config(cfg OracleConfig, nca []NodeKeys, secrets deployment.OCR cfg.MaxRoundsPerEpoch, cfg.TransmissionSchedule, identities, - nil, // reportingPluginConfig - nil, // maxDurationInitialization + cfgBytes, // reportingPluginConfig + nil, // maxDurationInitialization time.Duration(cfg.MaxDurationQueryMillis)*time.Millisecond, time.Duration(cfg.MaxDurationObservationMillis)*time.Millisecond, - time.Duration(cfg.MaxDurationAcceptMillis)*time.Millisecond, - time.Duration(cfg.MaxDurationTransmitMillis)*time.Millisecond, + time.Duration(cfg.MaxDurationShouldAcceptMillis)*time.Millisecond, + time.Duration(cfg.MaxDurationShouldTransmitMillis)*time.Millisecond, cfg.MaxFaultyOracles, nil, // empty onChain config ) diff --git a/deployment/keystone/changeset/internal/ocr3config_test.go b/deployment/keystone/changeset/internal/ocr3config_test.go index 6703f4d9b04..1c7f8e5b7ef 100644 --- a/deployment/keystone/changeset/internal/ocr3config_test.go +++ b/deployment/keystone/changeset/internal/ocr3config_test.go @@ -49,7 +49,7 @@ var wantOCR3Config = `{ "F": 3, "OnchainConfig": "0x", "OffchainConfigVersion": 30, - "OffchainConfig": "0xc80180e497d012d00180e497d012d80180a8d6b907e00180cab5ee01e80180d88ee16ff0010afa01010a82022003dacd15fc96c965c648e3623180de002b71a97cf6eeca9affb91f461dcd6ce1820220255096a3b7ade10e29c648e0b407fc486180464f713446b1da04f013df6179c8820220dba3c61e5f8bec594be481bcaf67ecea0d1c2950edb15b158ce3dbc77877def3820220b4c4993d6c15fee63800db901a8b35fa419057610962caab1c1d7bed557091278202202a4c7dec127fdd8145e48c5edb9467225098bd8c8ad1dade868325b787affbde820220283471ed66d61fbe11f64eff65d738b59a0301c9a4f846280db26c64c9fdd3f8820220aa3419628ea3536783742d17d8adf05681aa6a6bd2b206fbde78c7e5aa38586d82022001496edce35663071d74472e02119432ba059b3904d205e4358014410e4f2be3820220ad08c2a5878cada53521f4e2bb449f191ccca7899246721a0deeea19f7b83f70820220c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f8a02008a02008a02008a02008a02008a02008a02008a02008a02008a020098028094ebdc03a0028094ebdc03a8028094ebdc03b0028094ebdc03ba02f8010a20da47a8cc1c10796dd43f98ed113c648625e2e504c16ac5da9c65669e2377241b1220f5beca3bb11406079dc174183105c474c862a73c257ce8b3d9f5ca065e6264691a10805015e4203740495a23e93c1bd06ba81a10ca58ff36ffb0545dc3f800ddd6f8d0481a1076f664639ca8b5209e488895faa5460f1a104a1e89a7f2d8c89158f18856bf289c2a1a10c2f4330787831f419713ad4990e347d31a10fd403ec0797c001a2794b51d6178916d1a10e14fff88fdd3d1554ed861104ddc56a81a10b0284b9817fec2c3066c6f2651d17fc41a10b090233a67d502f78191c9e19a2a032b1a10e483414860bb612af50ee15ce8cd8ef5c00280e497d012c8028094ebdc03" + "OffchainConfig": "0xc80180e497d012d00180e497d012d80180a8d6b907e00180cab5ee01e80180d88ee16ff0010afa01010a82022003dacd15fc96c965c648e3623180de002b71a97cf6eeca9affb91f461dcd6ce1820220255096a3b7ade10e29c648e0b407fc486180464f713446b1da04f013df6179c8820220dba3c61e5f8bec594be481bcaf67ecea0d1c2950edb15b158ce3dbc77877def3820220b4c4993d6c15fee63800db901a8b35fa419057610962caab1c1d7bed557091278202202a4c7dec127fdd8145e48c5edb9467225098bd8c8ad1dade868325b787affbde820220283471ed66d61fbe11f64eff65d738b59a0301c9a4f846280db26c64c9fdd3f8820220aa3419628ea3536783742d17d8adf05681aa6a6bd2b206fbde78c7e5aa38586d82022001496edce35663071d74472e02119432ba059b3904d205e4358014410e4f2be3820220ad08c2a5878cada53521f4e2bb449f191ccca7899246721a0deeea19f7b83f70820220c805572b813a072067eab2087ddbee8aa719090e12890b15c01094f0d3f74a5f8a02008a02008a02008a02008a02008a02008a02008a02008a02008a020092021b08c0843d10c0843d18c0843d20c0843d2814301438901c4202081e98028094ebdc03a0028094ebdc03a8028094ebdc03b0028094ebdc03ba02f8010a20da47a8cc1c10796dd43f98ed113c648625e2e504c16ac5da9c65669e2377241b1220f5beca3bb11406079dc174183105c474c862a73c257ce8b3d9f5ca065e6264691a10805015e4203740495a23e93c1bd06ba81a10ca58ff36ffb0545dc3f800ddd6f8d0481a1076f664639ca8b5209e488895faa5460f1a104a1e89a7f2d8c89158f18856bf289c2a1a10c2f4330787831f419713ad4990e347d31a10fd403ec0797c001a2794b51d6178916d1a10e14fff88fdd3d1554ed861104ddc56a81a10b0284b9817fec2c3066c6f2651d17fc41a10b090233a67d502f78191c9e19a2a032b1a10e483414860bb612af50ee15ce8cd8ef5c00280e497d012c8028094ebdc03" }` var ocr3Cfg = ` @@ -57,8 +57,12 @@ var ocr3Cfg = ` "MaxQueryLengthBytes": 1000000, "MaxObservationLengthBytes": 1000000, "MaxReportLengthBytes": 1000000, - "MaxRequestBatchSize": 1000, + "MaxOutcomeLengthBytes": 1000000, + "MaxReportCount": 20, + "MaxBatchSize": 20, + "OutcomePruningThreshold": 3600, "UniqueReports": true, + "RequestTimeout": "30s", "DeltaProgressMillis": 5000, "DeltaResendMillis": 5000, "DeltaInitialMillis": 5000, @@ -73,8 +77,8 @@ var ocr3Cfg = ` "MaxDurationQueryMillis": 1000, "MaxDurationObservationMillis": 1000, "MaxDurationReportMillis": 1000, - "MaxDurationAcceptMillis": 1000, - "MaxDurationTransmitMillis": 1000, + "MaxDurationShouldAcceptMillis": 1000, + "MaxDurationShouldTransmitMillis": 1000, "MaxFaultyOracles": 3 }` diff --git a/deployment/keystone/changeset/internal/state.go b/deployment/keystone/changeset/internal/state.go index 1a4a1ea34aa..2c68688b67b 100644 --- a/deployment/keystone/changeset/internal/state.go +++ b/deployment/keystone/changeset/internal/state.go @@ -10,8 +10,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" - common_v1_0 "github.com/smartcontractkit/chainlink/deployment/common/view/v1_0" - "github.com/smartcontractkit/chainlink/deployment/keystone/view" + capabilities_registry "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" forwarder "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder_1_0_0" ocr3_capability "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability_1_0_0" @@ -32,7 +31,10 @@ type GetContractSetsResponse struct { ContractSets map[uint64]ContractSet } -// TODO move this out of internal +// ContractSet is a set of contracts for a single chain +// It is a mirror of changeset.ContractSet, and acts an an adapter to the internal package +// +// TODO: remove after CRE-227 type ContractSet struct { commonchangeset.MCMSWithTimelockState OCR3 map[common.Address]*ocr3_capability.OCR3Capability @@ -41,52 +43,7 @@ type ContractSet struct { WorkflowRegistry *workflow_registry.WorkflowRegistry } -func (cs ContractSet) TransferableContracts() []common.Address { - var out []common.Address - if cs.OCR3 != nil { - for _, ocr := range cs.OCR3 { - out = append(out, ocr.Address()) - } - } - if cs.Forwarder != nil { - out = append(out, cs.Forwarder.Address()) - } - if cs.CapabilitiesRegistry != nil { - out = append(out, cs.CapabilitiesRegistry.Address()) - } - if cs.WorkflowRegistry != nil { - out = append(out, cs.WorkflowRegistry.Address()) - } - return out -} - -func (cs ContractSet) View() (view.KeystoneChainView, error) { - out := view.NewKeystoneChainView() - if cs.CapabilitiesRegistry != nil { - capRegView, err := common_v1_0.GenerateCapabilityRegistryView(cs.CapabilitiesRegistry) - if err != nil { - return view.KeystoneChainView{}, err - } - out.CapabilityRegistry[cs.CapabilitiesRegistry.Address().String()] = capRegView - } - - // Process the workflow registry and print if WorkflowRegistryError errors. - if cs.WorkflowRegistry != nil { - wrView, wrErrs := common_v1_0.GenerateWorkflowRegistryView(cs.WorkflowRegistry) - for _, err := range wrErrs { - var wre *common_v1_0.WorkflowRegistryError - if !errors.As(err, &wre) { - return view.KeystoneChainView{}, err - } - fmt.Println("WorkflowRegistry error:", err) - } - out.WorkflowRegistry[cs.WorkflowRegistry.Address().String()] = wrView - } - - return out, nil -} - -func (cs ContractSet) GetOCR3Contract(addr *common.Address) (*ocr3_capability.OCR3Capability, error) { +func (cs ContractSet) getOCR3Contract(addr *common.Address) (*ocr3_capability.OCR3Capability, error) { return getOCR3Contract(cs.OCR3, addr) } diff --git a/deployment/keystone/changeset/internal/state_test.go b/deployment/keystone/changeset/internal/state_test.go index bfed62266ca..057cad4c10c 100644 --- a/deployment/keystone/changeset/internal/state_test.go +++ b/deployment/keystone/changeset/internal/state_test.go @@ -8,6 +8,7 @@ import ( chainsel "github.com/smartcontractkit/chain-selectors" "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/deployment" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" diff --git a/deployment/keystone/changeset/state.go b/deployment/keystone/changeset/state.go new file mode 100644 index 00000000000..be7f63b7410 --- /dev/null +++ b/deployment/keystone/changeset/state.go @@ -0,0 +1,213 @@ +package changeset + +import ( + "errors" + "fmt" + + "github.com/ethereum/go-ethereum/common" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + + "github.com/smartcontractkit/chainlink/deployment" + commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" + common_v1_0 "github.com/smartcontractkit/chainlink/deployment/common/view/v1_0" + "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal" + + capabilities_registry "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" + forwarder "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/forwarder_1_0_0" + ocr3_capability "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability_1_0_0" + workflow_registry "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/workflow/generated/workflow_registry_wrapper" +) + +type GetContractSetsRequest struct { + Chains map[uint64]deployment.Chain + AddressBook deployment.AddressBook +} + +type GetContractSetsResponse struct { + ContractSets map[uint64]ContractSet +} + +type ContractSet struct { + commonchangeset.MCMSWithTimelockState + OCR3 map[common.Address]*ocr3_capability.OCR3Capability + Forwarder *forwarder.KeystoneForwarder + CapabilitiesRegistry *capabilities_registry.CapabilitiesRegistry + WorkflowRegistry *workflow_registry.WorkflowRegistry +} + +func (cs ContractSet) Convert() internal.ContractSet { + return internal.ContractSet{ + MCMSWithTimelockState: commonchangeset.MCMSWithTimelockState{ + MCMSWithTimelockContracts: cs.MCMSWithTimelockContracts, + }, + Forwarder: cs.Forwarder, + WorkflowRegistry: cs.WorkflowRegistry, + OCR3: cs.OCR3, + CapabilitiesRegistry: cs.CapabilitiesRegistry, + } +} + +func (cs ContractSet) TransferableContracts() []common.Address { + var out []common.Address + if cs.OCR3 != nil { + for _, ocr := range cs.OCR3 { + out = append(out, ocr.Address()) + } + } + if cs.Forwarder != nil { + out = append(out, cs.Forwarder.Address()) + } + if cs.CapabilitiesRegistry != nil { + out = append(out, cs.CapabilitiesRegistry.Address()) + } + if cs.WorkflowRegistry != nil { + out = append(out, cs.WorkflowRegistry.Address()) + } + return out +} + +// View is a view of the keystone chain +// It is best effort and logs errors +func (cs ContractSet) View(lggr logger.Logger) (KeystoneChainView, error) { + out := NewKeystoneChainView() + var allErrs error + if cs.CapabilitiesRegistry != nil { + capRegView, err := common_v1_0.GenerateCapabilityRegistryView(cs.CapabilitiesRegistry) + if err != nil { + allErrs = errors.Join(allErrs, err) + lggr.Warn("failed to generate capability registry view: %w", err) + } + out.CapabilityRegistry[cs.CapabilitiesRegistry.Address().String()] = capRegView + } + + if cs.OCR3 != nil { + for addr, ocr3Cap := range cs.OCR3 { + oc := *ocr3Cap + addrCopy := addr + ocrView, err := GenerateOCR3ConfigView(oc) + if err != nil { + allErrs = errors.Join(allErrs, err) + // don't block view on single OCR3 not being configured + if errors.Is(err, ErrOCR3NotConfigured) { + lggr.Warnf("ocr3 not configured for address %s", addr) + } else { + lggr.Errorf("failed to generate OCR3 config view: %v", err) + } + } + out.OCRContracts[addrCopy.String()] = ocrView + } + } + + // Process the workflow registry and print if WorkflowRegistryError errors. + if cs.WorkflowRegistry != nil { + wrView, wrErrs := common_v1_0.GenerateWorkflowRegistryView(cs.WorkflowRegistry) + for _, err := range wrErrs { + allErrs = errors.Join(allErrs, err) + lggr.Errorf("WorkflowRegistry error: %v", err) + } + out.WorkflowRegistry[cs.WorkflowRegistry.Address().String()] = wrView + } + + return out, allErrs +} + +func (cs ContractSet) GetOCR3Contract(addr *common.Address) (*ocr3_capability.OCR3Capability, error) { + return getOCR3Contract(cs.OCR3, addr) +} + +func GetContractSets(lggr logger.Logger, req *GetContractSetsRequest) (*GetContractSetsResponse, error) { + resp := &GetContractSetsResponse{ + ContractSets: make(map[uint64]ContractSet), + } + for id, chain := range req.Chains { + addrs, err := req.AddressBook.AddressesForChain(id) + if err != nil { + return nil, fmt.Errorf("failed to get addresses for chain %d: %w", id, err) + } + cs, err := loadContractSet(lggr, chain, addrs) + if err != nil { + return nil, fmt.Errorf("failed to load contract set for chain %d: %w", id, err) + } + resp.ContractSets[id] = *cs + } + return resp, nil +} + +func loadContractSet(lggr logger.Logger, chain deployment.Chain, addresses map[string]deployment.TypeAndVersion) (*ContractSet, error) { + var out ContractSet + mcmsWithTimelock, err := commonchangeset.MaybeLoadMCMSWithTimelockChainState(chain, addresses) + if err != nil { + return nil, fmt.Errorf("failed to load mcms contract: %w", err) + } + out.MCMSWithTimelockState = *mcmsWithTimelock + + for addr, tv := range addresses { + // todo handle versions + switch tv.Type { + case CapabilitiesRegistry: + c, err := capabilities_registry.NewCapabilitiesRegistry(common.HexToAddress(addr), chain.Client) + if err != nil { + return nil, fmt.Errorf("failed to create capability registry contract from address %s: %w", addr, err) + } + out.CapabilitiesRegistry = c + case KeystoneForwarder: + c, err := forwarder.NewKeystoneForwarder(common.HexToAddress(addr), chain.Client) + if err != nil { + return nil, fmt.Errorf("failed to create forwarder contract from address %s: %w", addr, err) + } + out.Forwarder = c + case OCR3Capability: + c, err := ocr3_capability.NewOCR3Capability(common.HexToAddress(addr), chain.Client) + if err != nil { + return nil, fmt.Errorf("failed to create OCR3Capability contract from address %s: %w", addr, err) + } + if out.OCR3 == nil { + out.OCR3 = make(map[common.Address]*ocr3_capability.OCR3Capability) + } + out.OCR3[common.HexToAddress(addr)] = c + case WorkflowRegistry: + c, err := workflow_registry.NewWorkflowRegistry(common.HexToAddress(addr), chain.Client) + if err != nil { + return nil, fmt.Errorf("failed to create OCR3Capability contract from address %s: %w", addr, err) + } + out.WorkflowRegistry = c + default: + lggr.Warnw("unknown contract type", "type", tv.Type) + // ignore unknown contract types + } + } + return &out, nil +} + +// getOCR3Contract returns the OCR3 contract from the contract set. By default, it returns the only +// contract in the set if there is no address specified. If an address is specified, it returns the +// contract with that address. If the address is specified but not found in the contract set, it returns +// an error. +func getOCR3Contract(contracts map[common.Address]*ocr3_capability.OCR3Capability, addr *common.Address) (*ocr3_capability.OCR3Capability, error) { + // Fail if the OCR3 contract address is unspecified and there are multiple OCR3 contracts + if addr == nil && len(contracts) > 1 { + return nil, errors.New("OCR contract address is unspecified") + } + + // Use the first OCR3 contract if the address is unspecified + if addr == nil && len(contracts) == 1 { + // use the first OCR3 contract + for _, c := range contracts { + return c, nil + } + } + + // Select the OCR3 contract by address + if contract, ok := contracts[*addr]; ok { + return contract, nil + } + + addrSet := make([]string, 0, len(contracts)) + for a := range contracts { + addrSet = append(addrSet, a.String()) + } + + // Fail if the OCR3 contract address is specified but not found in the contract set + return nil, fmt.Errorf("OCR3 contract address %s not found in contract set %v", *addr, addrSet) +} diff --git a/deployment/keystone/changeset/test/env_setup.go b/deployment/keystone/changeset/test/env_setup.go index 2bce7fd3db7..036762dade6 100644 --- a/deployment/keystone/changeset/test/env_setup.go +++ b/deployment/keystone/changeset/test/env_setup.go @@ -21,7 +21,7 @@ import ( commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/deployment/environment/memory" envtest "github.com/smartcontractkit/chainlink/deployment/environment/test" - kschangeset "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" + changeset "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal" "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/workflowregistry" @@ -51,7 +51,7 @@ func (c DonConfig) Validate() error { } type testEnvIface interface { - ContractSets() map[uint64]internal.ContractSet + ContractSets() map[uint64]changeset.ContractSet CapabilitiesRegistry() *kcr.CapabilitiesRegistry CapabilityInfos() []kcr.CapabilitiesRegistryCapabilityInfo Nops() []kcr.CapabilitiesRegistryNodeOperatorAdded @@ -102,8 +102,8 @@ type EnvWrapper struct { dons testDons } -func (te EnvWrapper) ContractSets() map[uint64]internal.ContractSet { - r, err := internal.GetContractSets(te.Env.Logger, &internal.GetContractSetsRequest{ +func (te EnvWrapper) ContractSets() map[uint64]changeset.ContractSet { + r, err := changeset.GetContractSets(te.Env.Logger, &changeset.GetContractSetsRequest{ Chains: te.Env.Chains, AddressBook: te.Env.ExistingAddresses, }) @@ -112,7 +112,7 @@ func (te EnvWrapper) ContractSets() map[uint64]internal.ContractSet { } func (te EnvWrapper) CapabilitiesRegistry() *kcr.CapabilitiesRegistry { - r, err := internal.GetContractSets(te.Env.Logger, &internal.GetContractSetsRequest{ + r, err := changeset.GetContractSets(te.Env.Logger, &changeset.GetContractSetsRequest{ Chains: te.Env.Chains, AddressBook: te.Env.ExistingAddresses, }) @@ -161,16 +161,16 @@ func initEnv(t *testing.T, nChains int) (registryChainSel uint64, env deployment } env, err := commonchangeset.Apply(t, env, nil, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(kschangeset.DeployCapabilityRegistry), + deployment.CreateLegacyChangeSet(changeset.DeployCapabilityRegistry), registryChainSel, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(kschangeset.DeployOCR3), + deployment.CreateLegacyChangeSet(changeset.DeployOCR3), registryChainSel, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(kschangeset.DeployForwarder), - kschangeset.DeployForwarderRequest{}, + deployment.CreateLegacyChangeSet(changeset.DeployForwarder), + changeset.DeployForwarderRequest{}, ), commonchangeset.Configure( deployment.CreateLegacyChangeSet(workflowregistry.Deploy), @@ -263,7 +263,7 @@ func setupTestEnv(t *testing.T, c EnvWrapperConfig) EnvWrapper { } var allDons = []internal.DonCapabilities{wfDonCapabilities, cwDonCapabilities, assetDonCapabilities} - csOut, err := kschangeset.ConfigureInitialContractsChangeset(env, kschangeset.InitialContractsCfg{ + csOut, err := changeset.ConfigureInitialContractsChangeset(env, changeset.InitialContractsCfg{ RegistryChainSel: registryChainSel, Dons: allDons, OCR3Config: &ocr3Config, @@ -271,12 +271,12 @@ func setupTestEnv(t *testing.T, c EnvWrapperConfig) EnvWrapper { require.NoError(t, err) require.Nil(t, csOut.AddressBook, "no new addresses should be created in configure initial contracts") - req := &internal.GetContractSetsRequest{ + req := &changeset.GetContractSetsRequest{ Chains: env.Chains, AddressBook: env.ExistingAddresses, } - contractSetsResp, err := internal.GetContractSets(lggr, req) + contractSetsResp, err := changeset.GetContractSets(lggr, req) require.NoError(t, err) require.Len(t, contractSetsResp.ContractSets, len(env.Chains)) // check the registry @@ -311,7 +311,7 @@ func setupTestEnv(t *testing.T, c EnvWrapperConfig) EnvWrapper { ) require.NoError(t, err) // extract the MCMS address - r, err := internal.GetContractSets(lggr, &internal.GetContractSetsRequest{ + r, err := changeset.GetContractSets(lggr, &changeset.GetContractSetsRequest{ Chains: env.Chains, AddressBook: env.ExistingAddresses, }) @@ -327,8 +327,8 @@ func setupTestEnv(t *testing.T, c EnvWrapperConfig) EnvWrapper { sel: {Timelock: mcms.Timelock, CallProxy: mcms.CallProxy}, }, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(kschangeset.AcceptAllOwnershipsProposal), - &kschangeset.AcceptAllOwnershipRequest{ + deployment.CreateLegacyChangeSet(changeset.AcceptAllOwnershipsProposal), + &changeset.AcceptAllOwnershipRequest{ ChainSelector: sel, MinDelay: 0, }, diff --git a/deployment/keystone/changeset/types.go b/deployment/keystone/changeset/types.go new file mode 100644 index 00000000000..ae5718c4e3f --- /dev/null +++ b/deployment/keystone/changeset/types.go @@ -0,0 +1,13 @@ +package changeset + +import "github.com/smartcontractkit/chainlink/deployment" + +var ( + CapabilitiesRegistry deployment.ContractType = "CapabilitiesRegistry" // https://github.com/smartcontractkit/chainlink/blob/50c1b3dbf31bd145b312739b08967600a5c67f30/contracts/src/v0.8/keystone/CapabilitiesRegistry.sol#L392 + WorkflowRegistry deployment.ContractType = "WorkflowRegistry" // https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/workflow/WorkflowRegistry.sol + KeystoneForwarder deployment.ContractType = "KeystoneForwarder" // https://github.com/smartcontractkit/chainlink/blob/50c1b3dbf31bd145b312739b08967600a5c67f30/contracts/src/v0.8/keystone/KeystoneForwarder.sol#L90 + OCR3Capability deployment.ContractType = "OCR3Capability" // https://github.com/smartcontractkit/chainlink/blob/50c1b3dbf31bd145b312739b08967600a5c67f30/contracts/src/v0.8/keystone/OCR3Capability.sol#L12 + FeedConsumer deployment.ContractType = "FeedConsumer" // no type and a version in contract https://github.com/smartcontractkit/chainlink/blob/89183a8a5d22b1aeca0ade3b76d16aa84067aa57/contracts/src/v0.8/keystone/KeystoneFeedsConsumer.sol#L1 + RBACTimelock deployment.ContractType = "RBACTimelock" // no type and a version in contract https://github.com/smartcontractkit/ccip-owner-contracts/blob/main/src/RBACTimelock.sol + ProposerManyChainMultiSig deployment.ContractType = "ProposerManyChainMultiSig" // no type and a version in contract https://github.com/smartcontractkit/ccip-owner-contracts/blob/main/src/ManyChainMultiSig.sol +) diff --git a/deployment/keystone/changeset/update_don.go b/deployment/keystone/changeset/update_don.go index 7d02db0eda0..aa942a60542 100644 --- a/deployment/keystone/changeset/update_don.go +++ b/deployment/keystone/changeset/update_don.go @@ -98,7 +98,7 @@ func appendRequest(r *UpdateDonRequest) *AppendNodeCapabilitiesRequest { } func updateDonRequest(env deployment.Environment, r *UpdateDonRequest) (*internal.UpdateDonRequest, error) { - resp, err := internal.GetContractSets(env.Logger, &internal.GetContractSetsRequest{ + resp, err := GetContractSets(env.Logger, &GetContractSetsRequest{ Chains: env.Chains, AddressBook: env.ExistingAddresses, }) diff --git a/deployment/keystone/changeset/update_node_capabilities.go b/deployment/keystone/changeset/update_node_capabilities.go index 38cd8b6dfb5..6a9a22a78a9 100644 --- a/deployment/keystone/changeset/update_node_capabilities.go +++ b/deployment/keystone/changeset/update_node_capabilities.go @@ -85,7 +85,7 @@ func (req *MutateNodeCapabilitiesRequest) updateNodeCapabilitiesImplRequest(e de return nil, nil, fmt.Errorf("failed to validate UpdateNodeCapabilitiesRequest: %w", err) } registryChain := e.Chains[req.RegistryChainSel] // exists because of the validation above - resp, err := internal.GetContractSets(e.Logger, &internal.GetContractSetsRequest{ + resp, err := GetContractSets(e.Logger, &GetContractSetsRequest{ Chains: map[uint64]deployment.Chain{req.RegistryChainSel: registryChain}, AddressBook: e.ExistingAddresses, }) diff --git a/deployment/keystone/changeset/update_nodes.go b/deployment/keystone/changeset/update_nodes.go index a09a2b86ced..70857ef41c7 100644 --- a/deployment/keystone/changeset/update_nodes.go +++ b/deployment/keystone/changeset/update_nodes.go @@ -63,7 +63,7 @@ func UpdateNodes(env deployment.Environment, req *UpdateNodesRequest) (deploymen if !ok { return deployment.ChangesetOutput{}, fmt.Errorf("registry chain selector %d does not exist in environment", req.RegistryChainSel) } - cresp, err := internal.GetContractSets(env.Logger, &internal.GetContractSetsRequest{ + cresp, err := GetContractSets(env.Logger, &GetContractSetsRequest{ Chains: env.Chains, AddressBook: env.ExistingAddresses, }) diff --git a/deployment/keystone/changeset/view.go b/deployment/keystone/changeset/view.go index f6f495fd30b..0a5667781ed 100644 --- a/deployment/keystone/changeset/view.go +++ b/deployment/keystone/changeset/view.go @@ -2,48 +2,61 @@ package changeset import ( "encoding/json" + "errors" "fmt" chainsel "github.com/smartcontractkit/chain-selectors" "github.com/smartcontractkit/chainlink/deployment" commonview "github.com/smartcontractkit/chainlink/deployment/common/view" - "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal" - "github.com/smartcontractkit/chainlink/deployment/keystone/view" ) var _ deployment.ViewState = ViewKeystone func ViewKeystone(e deployment.Environment) (json.Marshaler, error) { - state, err := internal.GetContractSets(e.Logger, &internal.GetContractSetsRequest{ + lggr := e.Logger + state, err := GetContractSets(e.Logger, &GetContractSetsRequest{ Chains: e.Chains, AddressBook: e.ExistingAddresses, }) + // this error is unrecoverable if err != nil { - return nil, err + return nil, fmt.Errorf("failed to get contract sets: %w", err) } - chainViews := make(map[string]view.KeystoneChainView) + var viewErrs error + chainViews := make(map[string]KeystoneChainView) for chainSel, contracts := range state.ContractSets { chainid, err := chainsel.ChainIdFromSelector(chainSel) if err != nil { - return nil, fmt.Errorf("failed to resolve chain id for selector %d: %w", chainSel, err) + err2 := fmt.Errorf("failed to resolve chain id for selector %d: %w", chainSel, err) + lggr.Error(err2) + viewErrs = errors.Join(viewErrs, err2) + continue } chainName, err := chainsel.NameFromChainId(chainid) if err != nil { - return nil, fmt.Errorf("failed to get name for chainid %d selector %d:%w", chainid, chainSel, err) + err2 := fmt.Errorf("failed to resolve chain name for chain id %d: %w", chainid, err) + lggr.Error(err2) + viewErrs = errors.Join(viewErrs, err2) + continue } - v, err := contracts.View() + v, err := contracts.View(e.Logger) if err != nil { - return nil, fmt.Errorf("failed to view contract set: %w", err) + err2 := fmt.Errorf("failed to view chain %s: %w", chainName, err) + lggr.Error(err2) + viewErrs = errors.Join(viewErrs, err2) + // don't continue; add the partial view } chainViews[chainName] = v } nopsView, err := commonview.GenerateNopsView(e.NodeIDs, e.Offchain) if err != nil { - return nil, fmt.Errorf("failed to view nops: %w", err) + err2 := fmt.Errorf("failed to view nops: %w", err) + lggr.Error(err2) + viewErrs = errors.Join(viewErrs, err2) } - return &view.KeystoneView{ + return &KeystoneView{ Chains: chainViews, Nops: nopsView, - }, nil + }, viewErrs } diff --git a/deployment/keystone/changeset/view_contracts.go b/deployment/keystone/changeset/view_contracts.go new file mode 100644 index 00000000000..a5868f4d74e --- /dev/null +++ b/deployment/keystone/changeset/view_contracts.go @@ -0,0 +1,164 @@ +package changeset + +import ( + "encoding/hex" + "encoding/json" + "errors" + "math" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "google.golang.org/protobuf/proto" + + "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3confighelper" + ocr2types "github.com/smartcontractkit/libocr/offchainreporting2plus/types" + + capocr3types "github.com/smartcontractkit/chainlink-common/pkg/capabilities/consensus/ocr3/types" + + ocr3_capability "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/ocr3_capability_1_0_0" + + "github.com/smartcontractkit/chainlink/deployment/common/view" + common_v1_0 "github.com/smartcontractkit/chainlink/deployment/common/view/v1_0" +) + +type KeystoneChainView struct { + CapabilityRegistry map[string]common_v1_0.CapabilityRegistryView `json:"capabilityRegistry,omitempty"` + // OCRContracts is a map of OCR3 contract addresses to their configuration view + OCRContracts map[string]OCR3ConfigView `json:"ocrContracts,omitempty"` + WorkflowRegistry map[string]common_v1_0.WorkflowRegistryView `json:"workflowRegistry,omitempty"` +} + +type OCR3ConfigView struct { + Signers []string `json:"signers"` + Transmitters []ocr2types.Account `json:"transmitters"` + F uint8 `json:"f"` + OnchainConfig []byte `json:"onchainConfig"` + OffchainConfigVersion uint64 `json:"offchainConfigVersion"` + OffchainConfig OracleConfig `json:"offchainConfig"` +} + +var ErrOCR3NotConfigured = errors.New("OCR3 not configured") + +func GenerateOCR3ConfigView(ocr3Cap ocr3_capability.OCR3Capability) (OCR3ConfigView, error) { + details, err := ocr3Cap.LatestConfigDetails(nil) + if err != nil { + return OCR3ConfigView{}, err + } + + blockNumber := uint64(details.BlockNumber) + configIterator, err := ocr3Cap.FilterConfigSet(&bind.FilterOpts{ + Start: blockNumber, + End: &blockNumber, + Context: nil, + }) + if err != nil { + return OCR3ConfigView{}, err + } + var config *ocr3_capability.OCR3CapabilityConfigSet + for configIterator.Next() { + // We wait for the iterator to receive an event + if configIterator.Event == nil { + return OCR3ConfigView{}, ErrOCR3NotConfigured + } + + config = configIterator.Event + } + if config == nil { + return OCR3ConfigView{}, ErrOCR3NotConfigured + } + + var signers []ocr2types.OnchainPublicKey + var readableSigners []string + for _, s := range config.Signers { + signers = append(signers, s) + readableSigners = append(readableSigners, hex.EncodeToString(s)) + } + var transmitters []ocr2types.Account + for _, t := range config.Transmitters { + transmitters = append(transmitters, ocr2types.Account(t.String())) + } + // `PublicConfigFromContractConfig` returns the `ocr2types.PublicConfig` that contains all the `OracleConfig` fields we need, including the + // report plugin config. + publicConfig, err := ocr3confighelper.PublicConfigFromContractConfig(true, ocr2types.ContractConfig{ + ConfigDigest: config.ConfigDigest, + ConfigCount: config.ConfigCount, + Signers: signers, + Transmitters: transmitters, + F: config.F, + OnchainConfig: nil, // empty onChain config, currently we always use a nil onchain config when calling SetConfig + OffchainConfigVersion: config.OffchainConfigVersion, + OffchainConfig: config.OffchainConfig, + }) + if err != nil { + return OCR3ConfigView{}, err + } + var cfg capocr3types.ReportingPluginConfig + if err = proto.Unmarshal(publicConfig.ReportingPluginConfig, &cfg); err != nil { + return OCR3ConfigView{}, err + } + oracleConfig := OracleConfig{ + MaxQueryLengthBytes: cfg.MaxQueryLengthBytes, + MaxObservationLengthBytes: cfg.MaxObservationLengthBytes, + MaxReportLengthBytes: cfg.MaxReportLengthBytes, + MaxOutcomeLengthBytes: cfg.MaxOutcomeLengthBytes, + MaxReportCount: cfg.MaxReportCount, + MaxBatchSize: cfg.MaxBatchSize, + OutcomePruningThreshold: cfg.OutcomePruningThreshold, + RequestTimeout: cfg.RequestTimeout.AsDuration(), + UniqueReports: true, // This is hardcoded to true in the OCR3 contract + + DeltaProgressMillis: millisecondsToUint32(publicConfig.DeltaProgress), + DeltaResendMillis: millisecondsToUint32(publicConfig.DeltaResend), + DeltaInitialMillis: millisecondsToUint32(publicConfig.DeltaInitial), + DeltaRoundMillis: millisecondsToUint32(publicConfig.DeltaRound), + DeltaGraceMillis: millisecondsToUint32(publicConfig.DeltaGrace), + DeltaCertifiedCommitRequestMillis: millisecondsToUint32(publicConfig.DeltaCertifiedCommitRequest), + DeltaStageMillis: millisecondsToUint32(publicConfig.DeltaStage), + MaxRoundsPerEpoch: publicConfig.RMax, + TransmissionSchedule: publicConfig.S, + + MaxDurationQueryMillis: millisecondsToUint32(publicConfig.MaxDurationQuery), + MaxDurationObservationMillis: millisecondsToUint32(publicConfig.MaxDurationObservation), + MaxDurationShouldAcceptMillis: millisecondsToUint32(publicConfig.MaxDurationShouldAcceptAttestedReport), + MaxDurationShouldTransmitMillis: millisecondsToUint32(publicConfig.MaxDurationShouldTransmitAcceptedReport), + + MaxFaultyOracles: publicConfig.F, + } + + return OCR3ConfigView{ + Signers: readableSigners, + Transmitters: transmitters, + F: config.F, + OnchainConfig: nil, // empty onChain config + OffchainConfigVersion: config.OffchainConfigVersion, + OffchainConfig: oracleConfig, + }, nil +} + +func millisecondsToUint32(dur time.Duration) uint32 { + ms := dur.Milliseconds() + if ms > int64(math.MaxUint32) { + return math.MaxUint32 + } + //nolint:gosec // disable G115 as it is practically impossible to overflow here + return uint32(ms) +} + +func NewKeystoneChainView() KeystoneChainView { + return KeystoneChainView{ + CapabilityRegistry: make(map[string]common_v1_0.CapabilityRegistryView), + OCRContracts: make(map[string]OCR3ConfigView), + WorkflowRegistry: make(map[string]common_v1_0.WorkflowRegistryView), + } +} + +type KeystoneView struct { + Chains map[string]KeystoneChainView `json:"chains,omitempty"` + Nops map[string]view.NopView `json:"nops,omitempty"` +} + +func (v KeystoneView) MarshalJSON() ([]byte, error) { + // Alias to avoid recursive calls + type Alias KeystoneView + return json.MarshalIndent(&struct{ Alias }{Alias: Alias(v)}, "", " ") +} diff --git a/deployment/keystone/changeset/view_test.go b/deployment/keystone/changeset/view_test.go index 5b32699fd89..aa21ba4619b 100644 --- a/deployment/keystone/changeset/view_test.go +++ b/deployment/keystone/changeset/view_test.go @@ -1,40 +1,135 @@ -package changeset +package changeset_test import ( + "bytes" + "encoding/json" "testing" + "time" + "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" - "go.uber.org/zap/zapcore" - "github.com/smartcontractkit/chainlink-common/pkg/logger" + chain_selectors "github.com/smartcontractkit/chain-selectors" - "github.com/smartcontractkit/chainlink/deployment/environment/memory" + "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" + "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal" + "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/test" ) +var oracleConfig = changeset.OracleConfig{ + DeltaProgressMillis: 30000, + DeltaResendMillis: 5000, + DeltaInitialMillis: 5000, + DeltaRoundMillis: 2000, + DeltaGraceMillis: 500, + DeltaCertifiedCommitRequestMillis: 1000, + DeltaStageMillis: 30000, + MaxRoundsPerEpoch: 10, + TransmissionSchedule: []int{}, + MaxDurationQueryMillis: 1000, + MaxDurationObservationMillis: 1000, + MaxDurationShouldAcceptMillis: 1000, + MaxDurationShouldTransmitMillis: 1000, + MaxFaultyOracles: 1, + MaxQueryLengthBytes: 1000000, + MaxObservationLengthBytes: 1000000, + MaxReportLengthBytes: 1000000, + MaxOutcomeLengthBytes: 1000000, + MaxReportCount: 20, + MaxBatchSize: 20, + OutcomePruningThreshold: 3600, + UniqueReports: true, + RequestTimeout: 30 * time.Second, +} + func TestKeystoneView(t *testing.T) { t.Parallel() - env := memory.NewMemoryEnvironment(t, logger.Test(t), zapcore.DebugLevel, memory.MemoryEnvironmentConfig{ - Nodes: 1, - Chains: 2, + env := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{N: 4, Name: "wfDon"}, + AssetDonConfig: test.DonConfig{N: 4, Name: "assetDon"}, + WriterDonConfig: test.DonConfig{N: 4, Name: "writerDon"}, + NumChains: 1, }) - registryChain := env.AllChainSelectors()[0] - resp, err := DeployCapabilityRegistry(env, registryChain) - require.NoError(t, err) - require.NotNil(t, resp) - require.NoError(t, env.ExistingAddresses.Merge(resp.AddressBook)) - resp, err = DeployOCR3(env, registryChain) - require.NoError(t, err) - require.NotNil(t, resp) - require.NoError(t, env.ExistingAddresses.Merge(resp.AddressBook)) - resp, err = DeployForwarder(env, DeployForwarderRequest{}) - require.NoError(t, err) - require.NotNil(t, resp) - require.NoError(t, env.ExistingAddresses.Merge(resp.AddressBook)) + registryChain := env.Env.AllChainSelectors()[0] + oracleConfig.TransmissionSchedule = []int{len(env.Env.NodeIDs)} - a, err := ViewKeystone(env) + addrs, err := env.Env.ExistingAddresses.AddressesForChain(registryChain) require.NoError(t, err) - b, err := a.MarshalJSON() - require.NoError(t, err) - require.NotEmpty(t, b) - t.Log(string(b)) + + var newOCR3Addr string + for addr, tv := range addrs { + if tv.Type == internal.OCR3Capability { + newOCR3Addr = addr + break + } + } + + t.Run("successfully generates a view of the keystone state", func(t *testing.T) { + oracleConfigCopy := oracleConfig + + w := &bytes.Buffer{} + na := common.HexToAddress(newOCR3Addr) + cfg := changeset.ConfigureOCR3Config{ + ChainSel: env.RegistrySelector, + NodeIDs: env.Env.NodeIDs, + Address: &na, + OCR3Config: &oracleConfigCopy, + WriteGeneratedConfig: w, + } + _, err = changeset.ConfigureOCR3Contract(env.Env, cfg) + require.NoError(t, err) + + a, err := changeset.ViewKeystone(env.Env) + require.NoError(t, err) + b, err := a.MarshalJSON() + require.NoError(t, err) + require.NotEmpty(t, b) + + var outView changeset.KeystoneView + require.NoError(t, json.Unmarshal(b, &outView)) + + chainID, err := chain_selectors.ChainIdFromSelector(registryChain) + require.NoError(t, err) + chainName, err := chain_selectors.NameFromChainId(chainID) + require.NoError(t, err) + + viewChain, ok := outView.Chains[chainName] + require.True(t, ok) + viewOCR3Config, ok := viewChain.OCRContracts[newOCR3Addr] + require.True(t, ok) + require.Equal(t, oracleConfig, viewOCR3Config.OffchainConfig) + }) + + t.Run("fails to generate a view of the keystone state with OCR3 not configured", func(t *testing.T) { + // Deploy a new OCR3 contract + resp, err := changeset.DeployOCR3(env.Env, registryChain) + require.NoError(t, err) + require.NotNil(t, resp) + require.NoError(t, env.Env.ExistingAddresses.Merge(resp.AddressBook)) + + _, err = changeset.ViewKeystone(env.Env) + require.ErrorContains(t, err, "failed to view chain") + require.ErrorContains(t, err, "OCR3 not configured") + }) + + t.Run("fails to generate a view of the keystone state with a bad OracleConfig", func(t *testing.T) { + oracleConfigCopy := oracleConfig + oracleConfigCopy.DeltaRoundMillis = 0 + oracleConfigCopy.DeltaProgressMillis = 0 + + w := &bytes.Buffer{} + na := common.HexToAddress(newOCR3Addr) + cfg := changeset.ConfigureOCR3Config{ + ChainSel: env.RegistrySelector, + NodeIDs: env.Env.NodeIDs, + Address: &na, + OCR3Config: &oracleConfigCopy, + WriteGeneratedConfig: w, + } + _, err = changeset.ConfigureOCR3Contract(env.Env, cfg) + require.NoError(t, err) + _, err = changeset.ViewKeystone(env.Env) + require.ErrorContains(t, err, "failed to view chain") + require.ErrorContains(t, err, "DeltaRound (0s) must be less than DeltaProgress (0s)") + }) } diff --git a/deployment/keystone/view/view.go b/deployment/keystone/view/view.go deleted file mode 100644 index c74b4628d1e..00000000000 --- a/deployment/keystone/view/view.go +++ /dev/null @@ -1,32 +0,0 @@ -package view - -import ( - "encoding/json" - - "github.com/smartcontractkit/chainlink/deployment/common/view" - common_v1_0 "github.com/smartcontractkit/chainlink/deployment/common/view/v1_0" -) - -type KeystoneChainView struct { - CapabilityRegistry map[string]common_v1_0.CapabilityRegistryView `json:"capabilityRegistry,omitempty"` - WorkflowRegistry map[string]common_v1_0.WorkflowRegistryView `json:"workflowRegistry,omitempty"` - // TODO forwarders etc -} - -func NewKeystoneChainView() KeystoneChainView { - return KeystoneChainView{ - CapabilityRegistry: make(map[string]common_v1_0.CapabilityRegistryView), - WorkflowRegistry: make(map[string]common_v1_0.WorkflowRegistryView), - } -} - -type KeystoneView struct { - Chains map[string]KeystoneChainView `json:"chains,omitempty"` - Nops map[string]view.NopView `json:"nops,omitempty"` -} - -func (v KeystoneView) MarshalJSON() ([]byte, error) { - // Alias to avoid recursive calls - type Alias KeystoneView - return json.MarshalIndent(&struct{ Alias }{Alias: Alias(v)}, "", " ") -} diff --git a/integration-tests/go.mod b/integration-tests/go.mod index d6c4f6b6b93..47986b51869 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -12,8 +12,8 @@ replace github.com/smartcontractkit/chainlink/deployment => ../deployment // Using a separate `require` here to avoid surrounding line changes // creating potential merge conflicts. require ( - github.com/smartcontractkit/chainlink/deployment v0.0.0-20250128231431-9279badae2f0 - github.com/smartcontractkit/chainlink/v2 v2.0.0-20250128231431-9279badae2f0 + github.com/smartcontractkit/chainlink/deployment v0.0.0-20250221182743-098d1b0a763a + github.com/smartcontractkit/chainlink/v2 v2.0.0-20250221182743-098d1b0a763a ) require ( @@ -47,7 +47,7 @@ require ( github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb - github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea + github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index f59223f1a01..a8bf643a088 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1388,8 +1388,8 @@ github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0/go.mod h1:YQuXIqQpmpAqstWV0LHaDTJ5nsSWuip5ivEM+Fisb+4= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index ca9802216f3..e699c548a0a 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -14,9 +14,9 @@ replace github.com/smartcontractkit/chainlink/integration-tests => ../ // Using a separate `require` here to avoid surrounding line changes // creating potential merge conflicts. require ( - github.com/smartcontractkit/chainlink/deployment v0.0.0-20250128231431-9279badae2f0 - github.com/smartcontractkit/chainlink/integration-tests v0.0.0-20250128231431-9279badae2f0 - github.com/smartcontractkit/chainlink/v2 v2.0.0-20250128231431-9279badae2f0 + github.com/smartcontractkit/chainlink/deployment v0.0.0-20250221182743-098d1b0a763a + github.com/smartcontractkit/chainlink/integration-tests v0.0.0-20250221184958-34c2d51a64bc + github.com/smartcontractkit/chainlink/v2 v2.0.0-20250221182743-098d1b0a763a ) require ( @@ -29,7 +29,7 @@ require ( github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb - github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea + github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index fa62425009d..04569532d2f 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1373,8 +1373,8 @@ github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0/go.mod h1:YQuXIqQpmpAqstWV0LHaDTJ5nsSWuip5ivEM+Fisb+4= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= diff --git a/system-tests/lib/cre/contracts/contracts.go b/system-tests/lib/cre/contracts/contracts.go index 84c63d02fe7..c86eaf79034 100644 --- a/system-tests/lib/cre/contracts/contracts.go +++ b/system-tests/lib/cre/contracts/contracts.go @@ -11,6 +11,7 @@ import ( "github.com/rs/zerolog" capabilitiespb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb" + "github.com/smartcontractkit/chainlink/deployment" keystone_changeset "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" @@ -140,13 +141,13 @@ func ConfigureKeystone(input types.ConfigureKeystoneInput) error { TransmissionSchedule: transmissionSchedule, MaxDurationQueryMillis: 1000, MaxDurationObservationMillis: 1000, - MaxDurationAcceptMillis: 1000, - MaxDurationTransmitMillis: 1000, + MaxDurationShouldAcceptMillis: 1000, + MaxDurationShouldTransmitMillis: 1000, MaxFaultyOracles: 1, MaxQueryLengthBytes: 1000000, MaxObservationLengthBytes: 1000000, MaxReportLengthBytes: 1000000, - MaxRequestBatchSize: 1000, + MaxBatchSize: 1000, UniqueReports: true, } diff --git a/system-tests/lib/go.mod b/system-tests/lib/go.mod index b1453a2d2e2..8868a5e7f6e 100644 --- a/system-tests/lib/go.mod +++ b/system-tests/lib/go.mod @@ -3,8 +3,8 @@ module github.com/smartcontractkit/chainlink/system-tests/lib go 1.23.3 require ( - github.com/smartcontractkit/chainlink/deployment v0.0.0-20250206093113-4e72c05bdba6 - github.com/smartcontractkit/chainlink/v2 v2.19.0-ccip1.5.16-alpha.0.0.20250206093113-4e72c05bdba6 + github.com/smartcontractkit/chainlink/deployment v0.0.0-20250221182743-098d1b0a763a + github.com/smartcontractkit/chainlink/v2 v2.0.0-20250221182743-098d1b0a763a ) // Make sure we're working with the latest chainlink libs @@ -17,7 +17,7 @@ require ( github.com/google/uuid v1.6.0 github.com/pkg/errors v0.9.1 github.com/rs/zerolog v1.33.0 - github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea + github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.4 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.23 diff --git a/system-tests/lib/go.sum b/system-tests/lib/go.sum index f9f9026508d..a52fa0c717d 100644 --- a/system-tests/lib/go.sum +++ b/system-tests/lib/go.sum @@ -1126,8 +1126,8 @@ github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0/go.mod h1:YQuXIqQpmpAqstWV0LHaDTJ5nsSWuip5ivEM+Fisb+4= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= diff --git a/system-tests/tests/go.mod b/system-tests/tests/go.mod index 42dd042a2df..c46809f5f61 100644 --- a/system-tests/tests/go.mod +++ b/system-tests/tests/go.mod @@ -5,8 +5,8 @@ go 1.23.3 // Using a separate `require` here to avoid surrounding line changes // creating potential merge conflicts. require ( - github.com/smartcontractkit/chainlink/deployment v0.0.0-20250206093113-4e72c05bdba6 - github.com/smartcontractkit/chainlink/v2 v2.19.0-ccip1.5.16-alpha.0.0.20250206093113-4e72c05bdba6 + github.com/smartcontractkit/chainlink/deployment v0.0.0-20250221182743-098d1b0a763a + github.com/smartcontractkit/chainlink/v2 v2.0.0-20250221182743-098d1b0a763a ) // Make sure we're working with the latest chainlink libs @@ -343,7 +343,7 @@ require ( github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect - github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea // indirect + github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect diff --git a/system-tests/tests/go.sum b/system-tests/tests/go.sum index 720962bbaa1..57a42423877 100644 --- a/system-tests/tests/go.sum +++ b/system-tests/tests/go.sum @@ -1126,8 +1126,8 @@ github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0/go.mod h1:YQuXIqQpmpAqstWV0LHaDTJ5nsSWuip5ivEM+Fisb+4= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= From ff8c4ec12374194d5d3baa725d2d47c7894d1137 Mon Sep 17 00:00:00 2001 From: Suryansh <39276431+0xsuryansh@users.noreply.github.com> Date: Mon, 24 Feb 2025 22:53:29 +0530 Subject: [PATCH 40/58] CCIP-4234 CCIP Chain Reader E2E Tests DiscoverContract & GetContractAddress (#16515) * feat: E2E test CCIP chain reader GetContractAddress * feat: E2E test Discover contract, interplay with Sync * remove printing contract address * minor style fix * fix: pass address param codec in DiscoverContract test * fix lint * fix comment * remove unecessary comment * update DiscoverContract test to assert with require.Eventually * replace with tests.WaitTimeout(t) --- .../smoke/ccip/ccip_reader_test.go | 254 +++++++++++++++++- 1 file changed, 252 insertions(+), 2 deletions(-) diff --git a/integration-tests/smoke/ccip/ccip_reader_test.go b/integration-tests/smoke/ccip/ccip_reader_test.go index a45d47f58ba..2023ca184fb 100644 --- a/integration-tests/smoke/ccip/ccip_reader_test.go +++ b/integration-tests/smoke/ccip/ccip_reader_test.go @@ -1,6 +1,7 @@ package ccip import ( + "bytes" "context" "fmt" "math/big" @@ -731,7 +732,6 @@ func TestCCIPReader_NextSeqNum(t *testing.T) { func TestCCIPReader_GetExpectedNextSequenceNumber(t *testing.T) { t.Parallel() ctx := tests.Context(t) - //env := NewMemoryEnvironmentContractsOnly(t, logger.TestLogger(t), 2, 4, nil) env, _ := testhelpers.NewMemoryEnvironment(t) state, err := changeset.LoadOnchainState(env.Env) require.NoError(t, err) @@ -839,6 +839,257 @@ func TestCCIPReader_Nonces(t *testing.T) { } } +func TestCCIPReader_GetContractAddress(t *testing.T) { + t.Parallel() + ctx := tests.Context(t) + sb, auth := setupSimulatedBackendAndAuth(t) + + s := testSetup(ctx, t, testSetupParams{ + ReaderChain: chainS1, + DestChain: chainD, + OnChainSeqNums: nil, + Cfg: evmconfig.DestReaderConfig, + BindTester: true, + ContractNameToBind: consts.ContractNameOffRamp, + SimulatedBackend: sb, + Auth: auth, + UseHeavyDB: false, + }) + + t.Run("success - single bound address", func(t *testing.T) { + myContractName := consts.ContractNameOffRamp + myAddress := s.contractAddr + + err := s.extendedCR.Bind(ctx, []types.BoundContract{ + { + Address: myAddress.String(), + Name: myContractName, + }, + }) + require.NoError(t, err) + + gotBytes, err := s.reader.GetContractAddress(myContractName, chainS1) + require.NoError(t, err) + + require.Equal(t, myAddress.Bytes(), gotBytes, "expected the bound contract address to match") + }) + + t.Run("error - no bindings found", func(t *testing.T) { + _, err := s.reader.GetContractAddress("UnboundContract", chainS1) + require.Error(t, err) + require.Contains(t, err.Error(), "expected one binding for the UnboundContract contract, got 0") + }) + + t.Run("success - multiple bindings, return override binding", func(t *testing.T) { + myContractName := consts.ContractNameOffRamp + addr1 := s.contractAddr + addr2, _, _, err := ccip_reader_tester.DeployCCIPReaderTester(auth, sb.Client()) + require.NoError(t, err) + sb.Commit() + + err = s.extendedCR.Bind(ctx, []types.BoundContract{ + { + Address: addr1.String(), + Name: myContractName, + }, + { + Address: addr2.String(), + Name: myContractName, + }, + }) + require.NoError(t, err) + + gotBytes, err := s.reader.GetContractAddress(myContractName, chainS1) + require.NoError(t, err) + + require.Equal(t, addr2.Bytes(), gotBytes, "expected the bound contract override address to match") + }) + + t.Run("error - chain not supported", func(t *testing.T) { + // Suppose chainS2 is not set up in this test environment (no contract reader). + // The call should fail with "contract reader not found for chain". + _, err := s.reader.GetContractAddress("TestContract", chainS2) + require.Error(t, err) + require.Contains(t, err.Error(), "contract reader not found for chain 2") + }) +} + +func TestCCIPReader_DiscoverContracts(t *testing.T) { + t.Parallel() + ctx := tests.Context(t) + sb, auth := setupSimulatedBackendAndAuth(t) + + //--------------------------------Setup--------------------------------// + onRampS1StaticConfig := onramp.OnRampStaticConfig{ + ChainSelector: uint64(chainS1), + RmnRemote: utils.RandomAddress(), + NonceManager: utils.RandomAddress(), + TokenAdminRegistry: utils.RandomAddress(), + } + + onRampS1DynamicConfig := onramp.OnRampDynamicConfig{ + FeeQuoter: utils.RandomAddress(), + ReentrancyGuardEntered: false, + MessageInterceptor: utils.ZeroAddress, + FeeAggregator: utils.RandomAddress(), + AllowlistAdmin: utils.RandomAddress(), + } + + destinationChainConfigArgs := []onramp.OnRampDestChainConfigArgs{ + { + DestChainSelector: uint64(chainD), + Router: utils.RandomAddress(), + AllowlistEnabled: false, + }, + } + onRampS1Addr, _, _, err := onramp.DeployOnRamp(auth, sb.Client(), onRampS1StaticConfig, onRampS1DynamicConfig, destinationChainConfigArgs) + require.NoError(t, err) + sb.Commit() + + offRampDStaticConfig := offramp.OffRampStaticConfig{ + ChainSelector: uint64(chainD), + GasForCallExactCheck: 0, + RmnRemote: utils.RandomAddress(), + TokenAdminRegistry: utils.RandomAddress(), + NonceManager: utils.RandomAddress(), + } + + offRampDDynamicConfig := offramp.OffRampDynamicConfig{ + FeeQuoter: utils.RandomAddress(), + PermissionLessExecutionThresholdSeconds: 1, + MessageInterceptor: utils.ZeroAddress, + } + + offRampDSourceChainConfigArgs := []offramp.OffRampSourceChainConfigArgs{ + { + Router: destinationChainConfigArgs[0].Router, + SourceChainSelector: onRampS1StaticConfig.ChainSelector, + IsEnabled: true, + IsRMNVerificationDisabled: true, + OnRamp: common.LeftPadBytes(onRampS1Addr.Bytes(), 32), + }, + } + offRampDestAddr, _, _, err := offramp.DeployOffRamp(auth, sb.Client(), offRampDStaticConfig, offRampDDynamicConfig, offRampDSourceChainConfigArgs) + require.NoError(t, err) + sb.Commit() + + clS1 := client.NewSimulatedBackendClient(t, sb, big.NewInt(0).SetUint64(uint64(chainS1))) + headTrackerS1 := headstest.NewSimulatedHeadTracker(clS1, true, 1) + ormS1 := logpoller.NewORM(big.NewInt(0).SetUint64(uint64(chainS1)), pgtest.NewSqlxDB(t), logger.TestLogger(t)) + lpOpts := logpoller.Opts{ + PollPeriod: time.Millisecond, + FinalityDepth: 0, + BackfillBatchSize: 10, + RPCBatchSize: 10, + KeepFinalizedBlocksDepth: 100000, + } + lpS1 := logpoller.NewLogPoller( + ormS1, + clS1, + logger.TestLogger(t), + headTrackerS1, + lpOpts, + ) + require.NoError(t, lpS1.Start(ctx)) + + clD := client.NewSimulatedBackendClient(t, sb, big.NewInt(0).SetUint64(uint64(chainD))) + headTrackerD := headstest.NewSimulatedHeadTracker(clD, true, 1) + ormD := logpoller.NewORM(big.NewInt(0).SetUint64(uint64(chainD)), pgtest.NewSqlxDB(t), logger.TestLogger(t)) + lpD := logpoller.NewLogPoller( + ormD, + clD, + logger.TestLogger(t), + headTrackerD, + lpOpts, + ) + require.NoError(t, lpD.Start(ctx)) + + crS1, err := evm.NewChainReaderService(ctx, logger.TestLogger(t), lpS1, headTrackerS1, clS1, evmconfig.SourceReaderConfig) + require.NoError(t, err) + extendedCrS1 := contractreader.NewExtendedContractReader(crS1) + + crD, err := evm.NewChainReaderService(ctx, logger.TestLogger(t), lpD, headTrackerD, clD, evmconfig.DestReaderConfig) + require.NoError(t, err) + extendedCrD := contractreader.NewExtendedContractReader(crD) + err = extendedCrD.Bind(ctx, []types.BoundContract{ + { + Address: offRampDestAddr.String(), + Name: consts.ContractNameOffRamp, + }, + }) + require.NoError(t, err) + + err = crS1.Start(ctx) + require.NoError(t, err) + err = crD.Start(ctx) + require.NoError(t, err) + + contractReaders := map[cciptypes.ChainSelector]contractreader.Extended{} + contractReaders[chainS1] = extendedCrS1 + contractReaders[chainD] = extendedCrD + + contractWriters := make(map[cciptypes.ChainSelector]types.ContractWriter) + + addrCodec := ccipcommon.NewAddressCodec(ccipcommon.NewAddressCodecParams(ccipevm.AddressCodec{}, ccipsolana.AddressCodec{})) + reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders(ctx, logger.TestLogger(t), contractReaders, contractWriters, chainD, offRampDestAddr.Bytes(), addrCodec) + + t.Cleanup(func() { + assert.NoError(t, crS1.Close()) + assert.NoError(t, lpS1.Close()) + assert.NoError(t, crD.Close()) + assert.NoError(t, lpD.Close()) + }) + //--------------------------------Setup done--------------------------------// + + // Call the ccip chain reader with DiscoverContracts for test + contractAddresses, err := reader.DiscoverContracts(ctx, []cciptypes.ChainSelector{chainS1, chainD}) + require.NoError(t, err) + + require.Equal(t, contractAddresses[consts.ContractNameOnRamp][chainS1], cciptypes.UnknownAddress(common.LeftPadBytes(onRampS1Addr.Bytes(), 32))) + require.Equal(t, contractAddresses[consts.ContractNameRouter][chainD], cciptypes.UnknownAddress(destinationChainConfigArgs[0].Router.Bytes())) + require.Equal(t, contractAddresses[consts.ContractNameRMNRemote][chainD], cciptypes.UnknownAddress(offRampDStaticConfig.RmnRemote.Bytes())) + require.Equal(t, contractAddresses[consts.ContractNameNonceManager][chainD], cciptypes.UnknownAddress(offRampDStaticConfig.NonceManager.Bytes())) + require.Equal(t, contractAddresses[consts.ContractNameFeeQuoter][chainD], cciptypes.UnknownAddress(offRampDDynamicConfig.FeeQuoter.Bytes())) + + // Now Sync the CCIP Reader's S1 chain contract reader with OnRamp binding + onRampContractMapping := make(ccipreaderpkg.ContractAddresses) + onRampContractMapping[consts.ContractNameOnRamp] = make(map[cciptypes.ChainSelector]cciptypes.UnknownAddress) + onRampContractMapping[consts.ContractNameOnRamp][chainS1] = onRampS1Addr.Bytes() + + err = reader.Sync(ctx, onRampContractMapping) + require.NoError(t, err) + + // Since config poller has default refresh interval of 30s, we need to wait for the contract to be discovered + require.Eventually(t, func() bool { + contractAddresses, err = reader.DiscoverContracts(ctx, []cciptypes.ChainSelector{chainS1, chainD}) + if err != nil { + return false + } + + // Check if router and FeeQuoter addresses on source chain are now discovered + routerS1, routerExists := contractAddresses[consts.ContractNameRouter][chainS1] + feeQuoterS1, feeQuoterExists := contractAddresses[consts.ContractNameFeeQuoter][chainS1] + + return routerExists && feeQuoterExists && + bytes.Equal(routerS1, destinationChainConfigArgs[0].Router.Bytes()) && + bytes.Equal(feeQuoterS1, onRampS1DynamicConfig.FeeQuoter.Bytes()) + }, tests.WaitTimeout(t), 100*time.Millisecond, "Router and FeeQuoter addresses were not discovered on source chain in time") + + // Final assertions again for completeness: + contractAddresses, err = reader.DiscoverContracts(ctx, []cciptypes.ChainSelector{chainS1, chainD}) + require.NoError(t, err) + + require.Equal(t, contractAddresses[consts.ContractNameOnRamp][chainS1], cciptypes.UnknownAddress(common.LeftPadBytes(onRampS1Addr.Bytes(), 32))) + require.Equal(t, contractAddresses[consts.ContractNameRouter][chainD], cciptypes.UnknownAddress(destinationChainConfigArgs[0].Router.Bytes())) + require.Equal(t, contractAddresses[consts.ContractNameRMNRemote][chainD], cciptypes.UnknownAddress(offRampDStaticConfig.RmnRemote.Bytes())) + require.Equal(t, contractAddresses[consts.ContractNameNonceManager][chainD], cciptypes.UnknownAddress(offRampDStaticConfig.NonceManager.Bytes())) + require.Equal(t, contractAddresses[consts.ContractNameFeeQuoter][chainD], cciptypes.UnknownAddress(offRampDDynamicConfig.FeeQuoter.Bytes())) + + // Final assert to confirm source chain addresses discovered + require.Equal(t, contractAddresses[consts.ContractNameRouter][chainS1], cciptypes.UnknownAddress(destinationChainConfigArgs[0].Router.Bytes())) + require.Equal(t, contractAddresses[consts.ContractNameFeeQuoter][chainS1], cciptypes.UnknownAddress(onRampS1DynamicConfig.FeeQuoter.Bytes())) +} + func Test_GetChainFeePriceUpdates(t *testing.T) { t.Parallel() ctx := tests.Context(t) @@ -876,7 +1127,6 @@ func Test_GetChainFeePriceUpdates(t *testing.T) { ctx, t, chain1, - //evmconfig.DestReaderConfig, map[cciptypes.ChainSelector][]types.BoundContract{ cciptypes.ChainSelector(chain1): { { From 456f822c74484bcaeef3e7e0c02491c4a7a4e3ba Mon Sep 17 00:00:00 2001 From: Pablo Estrada <139084212+ecPablo@users.noreply.github.com> Date: Mon, 24 Feb 2025 11:53:03 -0600 Subject: [PATCH 41/58] feat: add example changeset to transfer from timelock signer account (#16476) * feat: add changeset to transfer from timelock signer account * fix: linting errors * fix: code cleanup * fix: use NewTransactionFromInstruction * fix: cleanup accounts signer set --- .../changeset/example/solana_transfer_mcm.go | 136 ++++++++++ .../example/solana_transfer_mcm_test.go | 242 ++++++++++++++++++ deployment/common/changeset/solana/helpers.go | 23 +- 3 files changed, 394 insertions(+), 7 deletions(-) create mode 100644 deployment/common/changeset/example/solana_transfer_mcm.go create mode 100644 deployment/common/changeset/example/solana_transfer_mcm_test.go diff --git a/deployment/common/changeset/example/solana_transfer_mcm.go b/deployment/common/changeset/example/solana_transfer_mcm.go new file mode 100644 index 00000000000..6fdc197fe73 --- /dev/null +++ b/deployment/common/changeset/example/solana_transfer_mcm.go @@ -0,0 +1,136 @@ +package example + +import ( + "errors" + "fmt" + "time" + + "github.com/gagliardetto/solana-go" + "github.com/gagliardetto/solana-go/rpc" + "github.com/smartcontractkit/mcms" + mcmssolanasdk "github.com/smartcontractkit/mcms/sdk/solana" + "github.com/smartcontractkit/mcms/types" + + "github.com/smartcontractkit/chainlink/deployment" + solanachangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset/solana" + "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" +) + +var _ deployment.ChangeSetV2[TransferFromTimelockConfig] = TransferFromTimelock{} + +type TransferData struct { + To solana.PublicKey + Amount uint64 +} +type TransferFromTimelockConfig struct { + TimelockDelay time.Duration + AmountsPerChain map[uint64]TransferData +} + +// TransferFromTimelock is a changeset that transfer funds from the timelock signer PDA +// to the address provided in the config. It will return an mcms proposal to sign containing +// the funds transfer transaction. +type TransferFromTimelock struct{} + +// VerifyPreconditions checks if the deployer has enough SOL to fund the MCMS signers on each chain. +func (f TransferFromTimelock) VerifyPreconditions(e deployment.Environment, config TransferFromTimelockConfig) error { + // the number of accounts to fund per chain (bypasser, canceller, proposer, timelock) + for chainSelector, amountCfg := range config.AmountsPerChain { + solChain, ok := e.SolChains[chainSelector] + if !ok { + return fmt.Errorf("solana chain not found for selector %d", chainSelector) + } + if amountCfg.To.IsZero() { + return errors.New("destination address is empty") + } + addresses, err := e.ExistingAddresses.AddressesForChain(chainSelector) + if err != nil { + return fmt.Errorf("failed to get existing addresses: %w", err) + } + mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(solChain, addresses) + if err != nil { + return fmt.Errorf("failed to load MCMS state: %w", err) + } + // Check if seeds are empty + if mcmState.TimelockSeed == [32]byte{} { + return errors.New("timelock seeds are empty, please deploy MCMS contracts first") + } + // Check if program IDs exists + if mcmState.TimelockProgram.IsZero() { + return errors.New("timelock program IDs are empty, please deploy timelock program first") + } + result, err := solChain.Client.GetBalance(e.GetContext(), solChain.DeployerKey.PublicKey(), rpc.CommitmentConfirmed) + if err != nil { + return fmt.Errorf("failed to get deployer balance: %w", err) + } + if result.Value < amountCfg.Amount { + return fmt.Errorf("deployer balance is insufficient, required: %d, actual: %d", amountCfg.Amount, result.Value) + } + } + return nil +} + +// Apply funds the MCMS signers on each chain. +func (f TransferFromTimelock) Apply(e deployment.Environment, config TransferFromTimelockConfig) (deployment.ChangesetOutput, error) { + timelocks := map[uint64]string{} + proposers := map[uint64]string{} + var batches []types.BatchOperation + inspectors, err := proposalutils.McmsInspectors(e) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get MCMS inspectors: %w", err) + } + for chainSelector, cfgAmounts := range config.AmountsPerChain { + solChain := e.SolChains[chainSelector] + addreses, err := e.ExistingAddresses.AddressesForChain(chainSelector) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get existing addresses: %w", err) + } + mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(solChain, addreses) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to load MCMS state: %w", err) + } + timelockSignerPDA := state.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + timelockID := mcmssolanasdk.ContractAddress(mcmState.TimelockProgram, mcmssolanasdk.PDASeed(mcmState.TimelockSeed)) + proposerID := mcmssolanasdk.ContractAddress(mcmState.McmProgram, mcmssolanasdk.PDASeed(mcmState.ProposerMcmSeed)) + timelocks[chainSelector] = timelockID + proposers[chainSelector] = proposerID + ixs, err := solanachangeset.FundFromAddressIxs( + solChain, + timelockSignerPDA, + []solana.PublicKey{cfgAmounts.To}, + cfgAmounts.Amount) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to fund timelock signer on chain %d: %w", chainSelector, err) + } + + var transactions []types.Transaction + + for _, ix := range ixs { + solanaTx, err := mcmssolanasdk.NewTransactionFromInstruction(ix, "SystemProgram", []string{}) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to create transaction: %w", err) + } + transactions = append(transactions, solanaTx) + } + batches = append(batches, types.BatchOperation{ + ChainSelector: types.ChainSelector(chainSelector), + Transactions: transactions, + }) + } + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), + timelocks, + proposers, + inspectors, + batches, + "transfer funds from timelock singer", + config.TimelockDelay, + ) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to build proposal: %w", err) + } + return deployment.ChangesetOutput{ + MCMSTimelockProposals: []mcms.TimelockProposal{*proposal}, + }, nil +} diff --git a/deployment/common/changeset/example/solana_transfer_mcm_test.go b/deployment/common/changeset/example/solana_transfer_mcm_test.go new file mode 100644 index 00000000000..28a0cbc4a58 --- /dev/null +++ b/deployment/common/changeset/example/solana_transfer_mcm_test.go @@ -0,0 +1,242 @@ +package example_test + +import ( + "fmt" + "testing" + "time" + + "github.com/gagliardetto/solana-go" + "github.com/gagliardetto/solana-go/rpc" + chainselectors "github.com/smartcontractkit/chain-selectors" + mcmsSolana "github.com/smartcontractkit/mcms/sdk/solana" + "github.com/stretchr/testify/require" + "go.uber.org/zap/zapcore" + + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment/common/changeset" + "github.com/smartcontractkit/chainlink/deployment/common/changeset/example" + "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" + "github.com/smartcontractkit/chainlink/deployment/common/types" + "github.com/smartcontractkit/chainlink/deployment/environment/memory" + "github.com/smartcontractkit/chainlink/v2/core/logger" +) + +// setupFundingTestEnv deploys all required contracts for the funding test +func setupFundingTestEnv(t *testing.T) deployment.Environment { + lggr := logger.TestLogger(t) + cfg := memory.MemoryEnvironmentConfig{ + SolChains: 1, + } + env := memory.NewMemoryEnvironment(t, lggr, zapcore.DebugLevel, cfg) + chainSelector := env.AllChainSelectorsSolana()[0] + + config := proposalutils.SingleGroupTimelockConfigV2(t) + testhelpers.SavePreloadedSolAddresses(t, env, chainSelector) + // Initialize the address book with a dummy address to avoid deploy precondition errors. + err := env.ExistingAddresses.Save(chainSelector, "dummyAddress", deployment.TypeAndVersion{Type: "dummy", Version: deployment.Version1_0_0}) + require.NoError(t, err) + + // Deploy MCMS and Timelock + env, err = changeset.Apply(t, env, nil, + changeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployMCMSWithTimelockV2), + map[uint64]types.MCMSWithTimelockConfigV2{ + chainSelector: config, + }, + ), + ) + require.NoError(t, err) + + return env +} + +func TestTransferFromTimelockConfig_VerifyPreconditions(t *testing.T) { + lggr := logger.TestLogger(t) + validEnv := memory.NewMemoryEnvironment(t, lggr, zapcore.InfoLevel, memory.MemoryEnvironmentConfig{SolChains: 1}) + validEnv.SolChains[chainselectors.SOLANA_DEVNET.Selector] = deployment.SolChain{} + validSolChainSelector := validEnv.AllChainSelectorsSolana()[0] + receiverKey := solana.NewWallet().PublicKey() + cs := example.TransferFromTimelock{} + timelockID := mcmsSolana.ContractAddress( + solana.NewWallet().PublicKey(), + [32]byte{'t', 'e', 's', 't'}, + ) + err := validEnv.ExistingAddresses.Save(validSolChainSelector, timelockID, deployment.TypeAndVersion{ + Type: types.RBACTimelock, + Version: deployment.Version1_0_0, + }) + require.NoError(t, err) + + // Create an environment that simulates a chain where the MCMS contracts have not been deployed, + // e.g. missing the required addresses so that the state loader returns empty seeds. + noTimelockEnv := memory.NewMemoryEnvironment(t, lggr, zapcore.InfoLevel, memory.MemoryEnvironmentConfig{ + SolChains: 1, + }) + noTimelockEnv.SolChains[chainselectors.SOLANA_DEVNET.Selector] = deployment.SolChain{} + err = noTimelockEnv.ExistingAddresses.Save(chainselectors.SOLANA_DEVNET.Selector, "dummy", deployment.TypeAndVersion{ + Type: "Sometype", + Version: deployment.Version1_0_0, + }) + require.NoError(t, err) + + // Create an environment with a Solana chain that has an invalid (zero) underlying chain. + invalidSolChainEnv := memory.NewMemoryEnvironment(t, lggr, zapcore.InfoLevel, memory.MemoryEnvironmentConfig{ + SolChains: 0, + }) + invalidSolChainEnv.SolChains[validSolChainSelector] = deployment.SolChain{} + + tests := []struct { + name string + env deployment.Environment + config example.TransferFromTimelockConfig + expectedError string + }{ + { + name: "All preconditions satisfied", + env: validEnv, + config: example.TransferFromTimelockConfig{ + AmountsPerChain: map[uint64]example.TransferData{validSolChainSelector: { + Amount: 100, + To: receiverKey, + }}, + }, + expectedError: "", + }, + { + name: "No Solana chains found in environment", + env: memory.NewMemoryEnvironment(t, lggr, zapcore.InfoLevel, memory.MemoryEnvironmentConfig{ + Bootstraps: 1, + Chains: 1, + SolChains: 0, + Nodes: 1, + }), + config: example.TransferFromTimelockConfig{ + AmountsPerChain: map[uint64]example.TransferData{validSolChainSelector: { + Amount: 100, + To: receiverKey, + }}, + }, + expectedError: fmt.Sprintf("solana chain not found for selector %d", validSolChainSelector), + }, + { + name: "Chain selector not found in environment", + env: validEnv, + config: example.TransferFromTimelockConfig{AmountsPerChain: map[uint64]example.TransferData{99999: { + Amount: 100, + To: receiverKey, + }}}, + expectedError: "solana chain not found for selector 99999", + }, + { + name: "timelock contracts not deployed (empty seeds)", + env: noTimelockEnv, + config: example.TransferFromTimelockConfig{ + AmountsPerChain: map[uint64]example.TransferData{chainselectors.SOLANA_DEVNET.Selector: { + Amount: 100, + To: receiverKey, + }}, + }, + expectedError: "timelock seeds are empty, please deploy MCMS contracts first", + }, + { + name: "Insufficient deployer balance", + env: validEnv, + config: example.TransferFromTimelockConfig{ + AmountsPerChain: map[uint64]example.TransferData{ + validSolChainSelector: { + Amount: 999999999999999999, + To: receiverKey, + }, + }, + }, + expectedError: "deployer balance is insufficient", + }, + { + name: "Insufficient deployer balance", + env: validEnv, + config: example.TransferFromTimelockConfig{ + AmountsPerChain: map[uint64]example.TransferData{ + validSolChainSelector: { + Amount: 999999999999999999, + To: receiverKey, + }, + }, + }, + expectedError: "deployer balance is insufficient", + }, + { + name: "Invalid Solana chain in environment", + env: invalidSolChainEnv, + config: example.TransferFromTimelockConfig{ + AmountsPerChain: map[uint64]example.TransferData{validSolChainSelector: { + Amount: 100, + To: receiverKey, + }}, + }, + expectedError: "failed to get existing addresses: chain selector 12463857294658392847: chain not found", + }, + { + name: "empty from field", + env: invalidSolChainEnv, + config: example.TransferFromTimelockConfig{ + AmountsPerChain: map[uint64]example.TransferData{validSolChainSelector: { + Amount: 100, + To: solana.PublicKey{}, + }}, + }, + expectedError: "destination address is empty", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := cs.VerifyPreconditions(tt.env, tt.config) + if tt.expectedError == "" { + require.NoError(t, err) + } else { + require.Error(t, err) + require.Contains(t, err.Error(), tt.expectedError) + } + }) + } +} + +func TestTransferFromTimelockConfig_Apply(t *testing.T) { + env := setupFundingTestEnv(t) + cfgAmounts := example.TransferData{ + Amount: 100 * solana.LAMPORTS_PER_SOL, + To: solana.NewWallet().PublicKey(), + } + amountsPerChain := make(map[uint64]example.TransferData) + for chainSelector := range env.SolChains { + amountsPerChain[chainSelector] = cfgAmounts + } + config := example.TransferFromTimelockConfig{ + TimelockDelay: 1 * time.Second, + AmountsPerChain: amountsPerChain, + } + addresses, err := env.ExistingAddresses.AddressesForChain(env.AllChainSelectorsSolana()[0]) + require.NoError(t, err) + mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(env.SolChains[env.AllChainSelectorsSolana()[0]], addresses) + require.NoError(t, err) + timelockSigner := state.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + mcmSigner := state.GetMCMSignerPDA(mcmState.McmProgram, mcmState.ProposerMcmSeed) + chainSelector := env.AllChainSelectorsSolana()[0] + solChain := env.SolChains[chainSelector] + memory.FundSolanaAccounts(env.GetContext(), t, []solana.PublicKey{timelockSigner, mcmSigner, solChain.DeployerKey.PublicKey()}, 150, solChain.Client) + + changesetInstance := example.TransferFromTimelock{} + + env, err = changeset.ApplyChangesetsV2(t, env, []changeset.ConfiguredChangeSet{ + changeset.Configure(changesetInstance, config), + }) + require.NoError(t, err) + + balance, err := solChain.Client.GetBalance(env.GetContext(), cfgAmounts.To, rpc.CommitmentConfirmed) + require.NoError(t, err) + t.Logf("Account: %s, Balance: %d", cfgAmounts.To, balance.Value) + + require.Equal(t, cfgAmounts.Amount, balance.Value) +} diff --git a/deployment/common/changeset/solana/helpers.go b/deployment/common/changeset/solana/helpers.go index e6dc93c6590..e23ac65ac20 100644 --- a/deployment/common/changeset/solana/helpers.go +++ b/deployment/common/changeset/solana/helpers.go @@ -9,25 +9,34 @@ import ( "github.com/smartcontractkit/chainlink/deployment" ) -// FundFromDeployerKey transfers SOL from the deployer to each provided account and waits for confirmations. -func FundFromDeployerKey(solChain deployment.SolChain, accounts []solana.PublicKey, amount uint64) error { +// FundFromAddressIxs transfers SOL from the given address to each provided account and waits for confirmations. +func FundFromAddressIxs(solChain deployment.SolChain, from solana.PublicKey, accounts []solana.PublicKey, amount uint64) ([]solana.Instruction, error) { var ixs []solana.Instruction for _, account := range accounts { // Create a transfer instruction using the provided builder. ix, err := system.NewTransferInstruction( amount, - solChain.DeployerKey.PublicKey(), // funding account (sender) - account, // recipient account + from, // funding account (sender) + account, // recipient account ).ValidateAndBuild() if err != nil { - return fmt.Errorf("failed to create transfer instruction: %w", err) + return nil, fmt.Errorf("failed to create transfer instruction: %w", err) } ixs = append(ixs, ix) } - err := solChain.Confirm(ixs) + return ixs, nil +} + +// FundFromDeployerKey transfers SOL from the deployer to each provided account and waits for confirmations. +func FundFromDeployerKey(solChain deployment.SolChain, accounts []solana.PublicKey, amount uint64) error { + ixs, err := FundFromAddressIxs(solChain, solChain.DeployerKey.PublicKey(), accounts, amount) + if err != nil { + return fmt.Errorf("failed to create transfer instructions: %w", err) + } + err = solChain.Confirm(ixs) if err != nil { - return fmt.Errorf("failed to create transaction: %w", err) + return fmt.Errorf("failed to confirm transaction: %w", err) } return nil } From c44201af990aacc9aca7a2d2f64afe9bbdb7580f Mon Sep 17 00:00:00 2001 From: pavel-raykov <165708424+pavel-raykov@users.noreply.github.com> Date: Mon, 24 Feb 2025 20:10:49 +0100 Subject: [PATCH 42/58] Move Mailboxes.md to docs. (#16546) * Minor * Minor --- .changeset/pink-bears-tickle.md | 5 +++++ core/utils/Mailboxes.md => docs/core/DATA_FLOW.md | 6 ++++++ 2 files changed, 11 insertions(+) create mode 100644 .changeset/pink-bears-tickle.md rename core/utils/Mailboxes.md => docs/core/DATA_FLOW.md (98%) diff --git a/.changeset/pink-bears-tickle.md b/.changeset/pink-bears-tickle.md new file mode 100644 index 00000000000..49d9f9fa1bb --- /dev/null +++ b/.changeset/pink-bears-tickle.md @@ -0,0 +1,5 @@ +--- +"chainlink": minor +--- + +#updated Moved Mailboxes.md to docs. diff --git a/core/utils/Mailboxes.md b/docs/core/DATA_FLOW.md similarity index 98% rename from core/utils/Mailboxes.md rename to docs/core/DATA_FLOW.md index a6c6615a92b..a2a1a4df1da 100644 --- a/core/utils/Mailboxes.md +++ b/docs/core/DATA_FLOW.md @@ -1,6 +1,9 @@ # Mailboxes ```mermaid +--- +title: Description of pkg/utils/mailbox/mailbox.go from the chainlink-common repository. +--- flowchart subgraph Legend style Legend fill:none @@ -21,6 +24,9 @@ flowchart ``` ```mermaid +--- +title: Description of the general data flow. +--- flowchart TB subgraph core/chains/evm subgraph gas From 182b3916e84c0860f3692ed4ac39b2ad8c9d246b Mon Sep 17 00:00:00 2001 From: Makram Date: Mon, 24 Feb 2025 22:22:36 +0200 Subject: [PATCH 43/58] integration-tests/smoke/ccip: rm feeboosting test & cfgs (#16538) * integration-tests/smoke/ccip: rm feeboosting test * deployment/ccip: remove references to boosting * bump cl-ccip to main --- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 +- deployment/ccip/changeset/globals/config.go | 1 - .../ccip/changeset/v1_6/cs_ccip_home.go | 1 - deployment/go.mod | 2 +- deployment/go.sum | 4 +- go.mod | 2 +- go.sum | 4 +- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 +- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 +- .../smoke/ccip/ccip_add_chain_test.go | 4 - .../smoke/ccip/ccip_fee_boosting_test.go | 287 ------------------ system-tests/lib/go.mod | 2 +- system-tests/lib/go.sum | 4 +- system-tests/tests/go.mod | 2 +- system-tests/tests/go.sum | 4 +- 18 files changed, 21 insertions(+), 314 deletions(-) delete mode 100644 integration-tests/smoke/ccip/ccip_fee_boosting_test.go diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 7fb73eed291..1db0b021428 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -340,7 +340,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index fbe0b40ff8c..b4e4f8abb1a 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1086,8 +1086,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1:Z5QRY8DtXnxnPwbo+mR1mxwaL+OClza3ATUqcQ1Ynz8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 h1:XUz6jj+pPIvRbmlalXyFf6O0hGicU8thQtjFvw7dPLo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= diff --git a/deployment/ccip/changeset/globals/config.go b/deployment/ccip/changeset/globals/config.go index c93fdc2a97b..a0ca800f1d7 100644 --- a/deployment/ccip/changeset/globals/config.go +++ b/deployment/ccip/changeset/globals/config.go @@ -14,7 +14,6 @@ const ( RemoteGasPriceBatchWriteFrequency = 30 * time.Minute TokenPriceBatchWriteFrequency = 30 * time.Minute BatchGasLimit = 6_500_000 - RelativeBoostPerWaitHour = 0.5 InflightCacheExpiry = 10 * time.Minute RootSnoozeTime = 30 * time.Minute BatchingStrategyID = 0 diff --git a/deployment/ccip/changeset/v1_6/cs_ccip_home.go b/deployment/ccip/changeset/v1_6/cs_ccip_home.go index c93865e9b0d..01ce9f4224b 100644 --- a/deployment/ccip/changeset/v1_6/cs_ccip_home.go +++ b/deployment/ccip/changeset/v1_6/cs_ccip_home.go @@ -242,7 +242,6 @@ func WithDefaultExecuteOffChainConfig(tokenDataObservers []pluginconfig.TokenDat if params.ExecuteOffChainConfig == nil { params.ExecuteOffChainConfig = &pluginconfig.ExecuteOffchainConfig{ BatchGasLimit: globals.BatchGasLimit, - RelativeBoostPerWaitHour: globals.RelativeBoostPerWaitHour, InflightCacheExpiry: *config.MustNewDuration(globals.InflightCacheExpiry), RootSnoozeTime: *config.MustNewDuration(globals.RootSnoozeTime), MessageVisibilityInterval: *config.MustNewDuration(globals.PermissionLessExecutionThreshold), diff --git a/deployment/go.mod b/deployment/go.mod index f1a0f6fb3f3..2fa4e14ef63 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -30,7 +30,7 @@ require ( github.com/sethvargo/go-retry v0.2.4 github.com/smartcontractkit/ccip-owner-contracts v0.1.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb diff --git a/deployment/go.sum b/deployment/go.sum index df1bf1dc209..f5125d641fc 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1134,8 +1134,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1:Z5QRY8DtXnxnPwbo+mR1mxwaL+OClza3ATUqcQ1Ynz8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 h1:XUz6jj+pPIvRbmlalXyFf6O0hGicU8thQtjFvw7dPLo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= diff --git a/go.mod b/go.mod index bdd5ee85fff..b257bdecab1 100644 --- a/go.mod +++ b/go.mod @@ -76,7 +76,7 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 diff --git a/go.sum b/go.sum index bde89e1c8a3..b9fe39601a3 100644 --- a/go.sum +++ b/go.sum @@ -1018,8 +1018,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1:Z5QRY8DtXnxnPwbo+mR1mxwaL+OClza3ATUqcQ1Ynz8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 h1:XUz6jj+pPIvRbmlalXyFf6O0hGicU8thQtjFvw7dPLo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 47986b51869..072af129c63 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -46,7 +46,7 @@ require ( github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index a8bf643a088..dd2bac1d964 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1384,8 +1384,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1:Z5QRY8DtXnxnPwbo+mR1mxwaL+OClza3ATUqcQ1Ynz8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 h1:XUz6jj+pPIvRbmlalXyFf6O0hGicU8thQtjFvw7dPLo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index e699c548a0a..2e7558cce85 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -28,7 +28,7 @@ require ( github.com/rs/zerolog v1.33.0 github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 04569532d2f..f45501304d7 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1369,8 +1369,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1:Z5QRY8DtXnxnPwbo+mR1mxwaL+OClza3ATUqcQ1Ynz8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 h1:XUz6jj+pPIvRbmlalXyFf6O0hGicU8thQtjFvw7dPLo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= diff --git a/integration-tests/smoke/ccip/ccip_add_chain_test.go b/integration-tests/smoke/ccip/ccip_add_chain_test.go index 22c5acea9fa..0b5f9a3ad46 100644 --- a/integration-tests/smoke/ccip/ccip_add_chain_test.go +++ b/integration-tests/smoke/ccip/ccip_add_chain_test.go @@ -40,10 +40,6 @@ func Test_AddChain(t *testing.T) { testhelpers.WithPrerequisiteDeploymentOnly(nil), testhelpers.WithNumOfUsersPerChain(usersPerChain), testhelpers.WithNoJobsAndContracts(), - testhelpers.WithOCRConfigOverride(func(params *v1_6.CCIPOCRParams) { - // Only 1 boost (=OCR round) is enough to cover the fee - params.ExecuteOffChainConfig.RelativeBoostPerWaitHour = 1 - }), ) allChains := maps.Keys(e.Env.Chains) diff --git a/integration-tests/smoke/ccip/ccip_fee_boosting_test.go b/integration-tests/smoke/ccip/ccip_fee_boosting_test.go deleted file mode 100644 index e8e300b466f..00000000000 --- a/integration-tests/smoke/ccip/ccip_fee_boosting_test.go +++ /dev/null @@ -1,287 +0,0 @@ -package ccip - -import ( - "context" - "math/big" - "testing" - "time" - - "github.com/smartcontractkit/chainlink-common/pkg/config" - - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_6" - commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" - testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/require" - "golang.org/x/exp/maps" - - "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" - - cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" - - "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm" - - "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" -) - -var ( - linkPrice = deployment.E18Mult(100) - wethPrice = deployment.E18Mult(4000) -) - -func Test_CCIPFeeBoosting(t *testing.T) { - t.Skip("Skipping test as Fee Boosting is disabled") - e, _, _ := testsetups.NewIntegrationEnvironment( - t, - testhelpers.WithOCRConfigOverride(func(params *v1_6.CCIPOCRParams) { - params.ExecuteOffChainConfig.RelativeBoostPerWaitHour = 1 - // Disable token price updates - params.CommitOffChainConfig.TokenPriceBatchWriteFrequency = *config.MustNewDuration(1_000_000 * time.Hour) - // Disable gas price updates - params.CommitOffChainConfig.RemoteGasPriceBatchWriteFrequency = *config.MustNewDuration(1_000_000 * time.Hour) - // Disable token price updates - params.CommitOffChainConfig.TokenInfo = nil - }), - ) - - state, err := changeset.LoadOnchainState(e.Env) - require.NoError(t, err) - - allChainSelectors := maps.Keys(e.Env.Chains) - require.Len(t, allChainSelectors, 2) - sourceChain := allChainSelectors[0] - destChain := allChainSelectors[1] - t.Log("All chain selectors:", allChainSelectors, - ", home chain selector:", e.HomeChainSel, - ", feed chain selector:", e.FeedChainSel, - ", source chain selector:", sourceChain, - ", dest chain selector:", destChain, - ) - - // TODO: discrepancy between client and the gas estimator gas price to be fixed - hardcoded for now - // fetchedGasPriceDest, err := e.Env.Chains[destChain].Client.SuggestGasPrice(tests.Context(t)) - fetchedGasPriceDest := big.NewInt(20e9) // 20 Gwei = default gas price - require.NoError(t, err) - originalGasPriceDestUSD := new(big.Int).Div( - new(big.Int).Mul(fetchedGasPriceDest, wethPrice), - big.NewInt(1e18), - ) - t.Log("Gas price on dest chain (USD):", originalGasPriceDestUSD) - - // Adjust destination gas price on source fee quoter to 95% of the current value - adjustedGasPriceDest := - new(big.Int).Div( - new(big.Int).Mul(originalGasPriceDestUSD, big.NewInt(99)), - big.NewInt(100), - ) - t.Log("Adjusted gas price on dest chain:", adjustedGasPriceDest) - - feeQuoterCfg := v1_6.DefaultFeeQuoterDestChainConfig(true) - // the default adds 10% to the gas price, we want to increase it - // to make sure the fee boosting will be finished in proper time for testing - feeQuoterCfg.GasMultiplierWeiPerEth = 120e16 - - testhelpers.AddLane(t, &e, sourceChain, destChain, false, - map[uint64]*big.Int{ - destChain: testhelpers.ToPackedFee(adjustedGasPriceDest, big.NewInt(0)), - }, - map[common.Address]*big.Int{ - state.Chains[sourceChain].LinkToken.Address(): linkPrice, - state.Chains[sourceChain].Weth9.Address(): wethPrice, - }, - feeQuoterCfg) - - // Update token prices in destination chain FeeQuoter - e.Env, err = commoncs.Apply(t, e.Env, e.TimelockContracts(t), - commoncs.Configure( - deployment.CreateLegacyChangeSet(v1_6.UpdateFeeQuoterPricesChangeset), - v1_6.UpdateFeeQuoterPricesConfig{ - PricesByChain: map[uint64]v1_6.FeeQuoterPriceUpdatePerSource{ - destChain: { - TokenPrices: map[common.Address]*big.Int{ - state.Chains[destChain].LinkToken.Address(): linkPrice, - state.Chains[destChain].Weth9.Address(): wethPrice, - }, - }, - }, - }, - ), - ) - require.NoError(t, err) - - startBlocks := make(map[uint64]*uint64) - expectedSeqNum := make(map[testhelpers.SourceDestPair]uint64) - expectedSeqNumExec := make(map[testhelpers.SourceDestPair][]uint64) - - latesthdr, err := e.Env.Chains[sourceChain].Client.HeaderByNumber(testcontext.Get(t), nil) - require.NoError(t, err) - block := latesthdr.Number.Uint64() - msgSentEvent := testhelpers.TestSendRequest(t, e.Env, state, sourceChain, destChain, false, router.ClientEVM2AnyMessage{ - Receiver: common.LeftPadBytes(state.Chains[destChain].Receiver.Address().Bytes(), 32), - Data: []byte("message that needs fee boosting"), - TokenAmounts: nil, - FeeToken: common.HexToAddress("0x0"), - ExtraArgs: nil, - }) - startBlocks[sourceChain] = &block - expectedSeqNum[testhelpers.SourceDestPair{ - SourceChainSelector: sourceChain, - DestChainSelector: destChain, - }] = msgSentEvent.SequenceNumber - expectedSeqNumExec[testhelpers.SourceDestPair{ - SourceChainSelector: sourceChain, - DestChainSelector: destChain, - }] = []uint64{msgSentEvent.SequenceNumber} - - e.Env, err = commoncs.Apply(t, e.Env, e.TimelockContracts(t), - commoncs.Configure( - deployment.CreateLegacyChangeSet(v1_6.UpdateFeeQuoterPricesChangeset), - v1_6.UpdateFeeQuoterPricesConfig{ - PricesByChain: map[uint64]v1_6.FeeQuoterPriceUpdatePerSource{ - sourceChain: { - GasPrices: map[uint64]*big.Int{ - destChain: originalGasPriceDestUSD, - }, - }, - }, - }, - ), - ) - require.NoError(t, err) - - // Confirm gas prices are updated - srcFeeQuoter := state.Chains[sourceChain].FeeQuoter - err = testhelpers.ConfirmGasPriceUpdated(t, e.Env.Chains[destChain], srcFeeQuoter, 0, originalGasPriceDestUSD) - require.NoError(t, err) - - // Confirm that fee boosting will be triggered - require.True(t, willTriggerFeeBoosting(t, msgSentEvent, state, sourceChain, destChain)) - - // hack - time.Sleep(30 * time.Second) - replayBlocks := make(map[uint64]uint64) - replayBlocks[sourceChain] = 1 - replayBlocks[destChain] = 1 - testhelpers.ReplayLogs(t, e.Env.Offchain, replayBlocks) - - // Confirm that the message is committed and executed - testhelpers.ConfirmCommitForAllWithExpectedSeqNums(t, e.Env, state, expectedSeqNum, startBlocks) - testhelpers.ConfirmExecWithSeqNrsForAll(t, e.Env, state, expectedSeqNumExec, startBlocks) -} - -// TODO: Find a more accurate way to determine if fee boosting will be triggered -func willTriggerFeeBoosting( - t *testing.T, - msgSentEvent *onramp.OnRampCCIPMessageSent, - state changeset.CCIPOnChainState, - srcChain, destChain uint64) bool { - msg := convertToMessage(msgSentEvent.Message) - t.Log("\n=== Fee Boosting Analysis ===") - t.Logf("Src Chain: %d", msg.Header.SourceChainSelector) - t.Logf("Dest Chain: %d", msg.Header.DestChainSelector) - - ep := ccipevm.NewGasEstimateProvider() - chainState, exists := state.Chains[srcChain] - require.True(t, exists) - feeQuoter := chainState.FeeQuoter - - premium, err := feeQuoter.GetPremiumMultiplierWeiPerEth(&bind.CallOpts{Context: context.Background()}, chainState.Weth9.Address()) - require.NoError(t, err) - t.Logf("Premium: %d", premium) - - // Get LINK price - linkPrice, err := feeQuoter.GetTokenPrice(&bind.CallOpts{Context: context.Background()}, chainState.LinkToken.Address()) - require.NoError(t, err) - t.Logf("LINK Price: %s", linkPrice.Value.String()) - t.Logf("Juels in message: %s", msg.FeeValueJuels.String()) - - // Calculate fee in USD token - fee := new(big.Int).Div( - new(big.Int).Mul(linkPrice.Value, msg.FeeValueJuels.Int), - new(big.Int).Exp(big.NewInt(10), big.NewInt(18), nil), - ) - t.Logf("Fee paid (in USD token): %s", fee.String()) - - // Calculate message gas - messageGas := new(big.Int).SetUint64(ep.CalculateMessageMaxGas(msg)) - t.Logf("Estimated message gas: %s", messageGas.String()) - - // Get token and gas prices - nativeTokenAddress := chainState.Weth9.Address() - tokenAndGasPrice, err := feeQuoter.GetTokenAndGasPrices(&bind.CallOpts{Context: context.Background()}, nativeTokenAddress, destChain) - require.NoError(t, err) - t.Logf("Raw gas price (uint224): %s for chain: %d", tokenAndGasPrice.GasPriceValue.String(), destChain) - - // Extract uint112 gas price - gasPrice, err := convertGasPriceToUint112(tokenAndGasPrice.GasPriceValue) - require.NoError(t, err) - t.Logf("Extracted gas price (uint112): %s", gasPrice.String()) - t.Logf("Native token price: %s", tokenAndGasPrice.TokenPrice.String()) - - // Calculate total execution cost - execCost := new(big.Int).Mul(messageGas, gasPrice) - t.Logf("Total execution cost: %s", execCost.String()) - - // Check if fee boosting will trigger - willBoost := execCost.Cmp(fee) > 0 - t.Logf("\nWill fee boosting trigger? %v", willBoost) - t.Logf("Execution cost / Fee ratio: %.2f", - new(big.Float).Quo( - new(big.Float).SetInt(execCost), - new(big.Float).SetInt(fee), - ), - ) - - return execCost.Cmp(fee) > 0 -} - -func convertGasPriceToUint112(gasPrice *big.Int) (*big.Int, error) { - // Create a mask for uint112 (112 bits of 1s) - mask := new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 112), big.NewInt(1)) - - // Extract the lower 112 bits using AND operation - result := new(big.Int).And(gasPrice, mask) - - return result, nil -} - -func convertToMessage(msg onramp.InternalEVM2AnyRampMessage) cciptypes.Message { - // Convert header - header := cciptypes.RampMessageHeader{ - MessageID: cciptypes.Bytes32(msg.Header.MessageId), - SourceChainSelector: cciptypes.ChainSelector(msg.Header.SourceChainSelector), - DestChainSelector: cciptypes.ChainSelector(msg.Header.DestChainSelector), - SequenceNumber: cciptypes.SeqNum(msg.Header.SequenceNumber), - Nonce: msg.Header.Nonce, - } - - // Convert token amounts - tokenAmounts := make([]cciptypes.RampTokenAmount, len(msg.TokenAmounts)) - for i, ta := range msg.TokenAmounts { - tokenAmounts[i] = cciptypes.RampTokenAmount{ - SourcePoolAddress: cciptypes.UnknownAddress(ta.SourcePoolAddress.Bytes()), - DestTokenAddress: cciptypes.UnknownAddress(ta.DestTokenAddress), - ExtraData: cciptypes.Bytes(ta.ExtraData), - Amount: cciptypes.BigInt{Int: ta.Amount}, - DestExecData: cciptypes.Bytes(ta.DestExecData), - } - } - - return cciptypes.Message{ - Header: header, - Sender: cciptypes.UnknownAddress(msg.Sender.Bytes()), - Data: cciptypes.Bytes(msg.Data), - Receiver: cciptypes.UnknownAddress(msg.Receiver), - ExtraArgs: cciptypes.Bytes(msg.ExtraArgs), - FeeToken: cciptypes.UnknownAddress(msg.FeeToken.Bytes()), - FeeTokenAmount: cciptypes.BigInt{Int: msg.FeeTokenAmount}, - FeeValueJuels: cciptypes.BigInt{Int: msg.FeeValueJuels}, - TokenAmounts: tokenAmounts, - } -} diff --git a/system-tests/lib/go.mod b/system-tests/lib/go.mod index 8868a5e7f6e..815fe491643 100644 --- a/system-tests/lib/go.mod +++ b/system-tests/lib/go.mod @@ -338,7 +338,7 @@ require ( github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect diff --git a/system-tests/lib/go.sum b/system-tests/lib/go.sum index a52fa0c717d..22041e117e8 100644 --- a/system-tests/lib/go.sum +++ b/system-tests/lib/go.sum @@ -1122,8 +1122,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1:Z5QRY8DtXnxnPwbo+mR1mxwaL+OClza3ATUqcQ1Ynz8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 h1:XUz6jj+pPIvRbmlalXyFf6O0hGicU8thQtjFvw7dPLo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= diff --git a/system-tests/tests/go.mod b/system-tests/tests/go.mod index c46809f5f61..be753da2e5c 100644 --- a/system-tests/tests/go.mod +++ b/system-tests/tests/go.mod @@ -341,7 +341,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect diff --git a/system-tests/tests/go.sum b/system-tests/tests/go.sum index 57a42423877..7a02d902f03 100644 --- a/system-tests/tests/go.sum +++ b/system-tests/tests/go.sum @@ -1122,8 +1122,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb h1:Z5QRY8DtXnxnPwbo+mR1mxwaL+OClza3ATUqcQ1Ynz8= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224132459-c57ae4a97dcb/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 h1:XUz6jj+pPIvRbmlalXyFf6O0hGicU8thQtjFvw7dPLo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= From 73b6542360a051845e2916a00032c534a8263521 Mon Sep 17 00:00:00 2001 From: pavel-raykov <165708424+pavel-raykov@users.noreply.github.com> Date: Mon, 24 Feb 2025 21:44:24 +0100 Subject: [PATCH 44/58] Minor (#16550) --- .changeset/late-goats-exercise.md | 5 +++++ core/utils/json_normalization_test.go | 7 +++---- 2 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 .changeset/late-goats-exercise.md diff --git a/.changeset/late-goats-exercise.md b/.changeset/late-goats-exercise.md new file mode 100644 index 00000000000..9433719dc4e --- /dev/null +++ b/.changeset/late-goats-exercise.md @@ -0,0 +1,5 @@ +--- +"chainlink": minor +--- + +#updated Removed unnecessary dependendies from json_normalization_test.go. diff --git a/core/utils/json_normalization_test.go b/core/utils/json_normalization_test.go index 943145c53e3..f01dd0dacaf 100644 --- a/core/utils/json_normalization_test.go +++ b/core/utils/json_normalization_test.go @@ -4,7 +4,6 @@ import ( "encoding/json" "testing" - "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" "github.com/smartcontractkit/chainlink/v2/core/utils" "github.com/stretchr/testify/assert" @@ -34,12 +33,12 @@ func TestNormalizedJSON(t *testing.T) { false, }, {"reordering", - cltest.JSONFromString(t, `{"a": "!", "A": "1"}`), + map[string]string{"a": "!", "A": "1"}, `{"A":"1","a":"!"}`, false, }, {"more key reordering", - cltest.JSONFromString(t, `{"a": "!", "A": "1", "B": "@", "b":"?", "c":"..."}`), + map[string]string{"a": "!", "A": "1", "B": "@", "b": "?", "c": "..."}, `{"A":"1","B":"@","a":"!","b":"?","c":"..."}`, false, }, @@ -52,7 +51,7 @@ func TestNormalizedJSON(t *testing.T) { str, err := utils.NormalizedJSON(jsonBytes) - cltest.AssertError(t, test.wantError, err) + assert.Equal(t, test.wantError, err != nil) assert.Equal(t, test.want, str) }) } From 4e86fb8523085ae0e13b9ddad3f98ca18490d3b3 Mon Sep 17 00:00:00 2001 From: Cedric Date: Mon, 24 Feb 2025 21:30:38 +0000 Subject: [PATCH 45/58] [CAPPL-523] Filter events by DON ID (#16420) * [CAPPL-523] Filter events by DON ID * Lint fixes --- .../workflows/syncer/workflow_syncer_test.go | 77 +++++++++++++++++++ .../workflows/syncer/workflow_registry.go | 31 +++++++- 2 files changed, 105 insertions(+), 3 deletions(-) diff --git a/core/services/relay/evm/capabilities/workflows/syncer/workflow_syncer_test.go b/core/services/relay/evm/capabilities/workflows/syncer/workflow_syncer_test.go index ca9674700c9..26b7015a6c7 100644 --- a/core/services/relay/evm/capabilities/workflows/syncer/workflow_syncer_test.go +++ b/core/services/relay/evm/capabilities/workflows/syncer/workflow_syncer_test.go @@ -399,6 +399,83 @@ func Test_SecretsWorker(t *testing.T) { }, tests.WaitTimeout(t), time.Second) } +func Test_RegistrySyncer_SkipsEventsNotBelongingToDON(t *testing.T) { + var ( + lggr = logger.TestLogger(t) + backendTH = testutils.NewEVMBackendTH(t) + + giveTicker = time.NewTicker(500 * time.Millisecond) + giveBinaryURL = "https://original-url.com" + donID = uint32(1) + otherDonID = uint32(2) + skippedWorkflow = RegisterWorkflowCMD{ + Name: "test-wf2", + DonID: otherDonID, + Status: uint8(1), + BinaryURL: giveBinaryURL, + } + giveWorkflow = RegisterWorkflowCMD{ + Name: "test-wf", + DonID: donID, + Status: uint8(1), + BinaryURL: "someurl", + } + wantContents = "updated contents" + ) + + defer giveTicker.Stop() + + // Deploy a test workflow_registry + wfRegistryAddr, _, wfRegistryC, err := workflow_registry_wrapper.DeployWorkflowRegistry(backendTH.ContractsOwner, backendTH.Backend.Client()) + backendTH.Backend.Commit() + require.NoError(t, err) + + from := [20]byte(backendTH.ContractsOwner.From) + id, err := pkgworkflows.GenerateWorkflowID(from[:], "test-wf", []byte(wantContents), []byte(""), "") + require.NoError(t, err) + giveWorkflow.ID = id + + from = [20]byte(backendTH.ContractsOwner.From) + id, err = pkgworkflows.GenerateWorkflowID(from[:], "test-wf", []byte(wantContents), []byte("dummy config"), "") + require.NoError(t, err) + skippedWorkflow.ID = id + + handler := newTestEvtHandler() + + worker := syncer.NewWorkflowRegistry( + lggr, + func(ctx context.Context, bytes []byte) (syncer.ContractReader, error) { + return backendTH.NewContractReader(ctx, t, bytes) + }, + wfRegistryAddr.Hex(), + syncer.WorkflowEventPollerConfig{QueryCount: 20}, + handler, + &testDonNotifier{ + don: capabilities.DON{ + ID: donID, + }, + err: nil, + }, + syncer.WithTicker(giveTicker.C), + ) + + // setup contract state to allow the secrets to be updated + updateAllowedDONs(t, backendTH, wfRegistryC, []uint32{donID, otherDonID}, true) + updateAuthorizedAddress(t, backendTH, wfRegistryC, []common.Address{backendTH.ContractsOwner.From}, true) + + servicetest.Run(t, worker) + + // generate a log event + registerWorkflow(t, backendTH, wfRegistryC, skippedWorkflow) + registerWorkflow(t, backendTH, wfRegistryC, giveWorkflow) + + require.Eventually(t, func() bool { + // we process events in order, and should only receive 1 event + // the first is skipped as it belongs to another don. + return len(handler.GetEvents()) == 1 + }, tests.WaitTimeout(t), time.Second) +} + func Test_RegistrySyncer_WorkflowRegistered_InitiallyPaused(t *testing.T) { var ( ctx = coretestutils.Context(t) diff --git a/core/services/workflows/syncer/workflow_registry.go b/core/services/workflows/syncer/workflow_registry.go index 65ecdf1f467..b5da8f58c5b 100644 --- a/core/services/workflows/syncer/workflow_registry.go +++ b/core/services/workflows/syncer/workflow_registry.go @@ -6,6 +6,7 @@ import ( "encoding/json" "fmt" "iter" + "strconv" "strings" "sync" "time" @@ -63,6 +64,7 @@ type WorkflowRegistryEvent struct { Data any EventType WorkflowRegistryEventType Head Head + DonID *uint32 } func (we WorkflowRegistryEvent) GetEventType() WorkflowRegistryEventType { @@ -231,7 +233,7 @@ func (w *workflowRegistry) Start(_ context.Context) error { } } - w.readRegistryEvents(ctx, reader, loadWorkflowsHead.Height) + w.readRegistryEvents(ctx, don, reader, loadWorkflowsHead.Height) }() return nil @@ -259,7 +261,7 @@ func (w *workflowRegistry) Name() string { } // readRegistryEvents polls the contract for events and send them to the events channel. -func (w *workflowRegistry) readRegistryEvents(ctx context.Context, reader ContractReader, lastReadBlockNumber string) { +func (w *workflowRegistry) readRegistryEvents(ctx context.Context, don capabilities.DON, reader ContractReader, lastReadBlockNumber string) { ticker := w.getTicker() var keyQueries = make([]types.ContractKeyFilter, 0, len(w.eventTypes)) @@ -325,7 +327,25 @@ func (w *workflowRegistry) readRegistryEvents(ctx context.Context, reader Contra continue } - events = append(events, toWorkflowRegistryEventResponse(log.Sequence, log.EventType, w.lggr)) + event := toWorkflowRegistryEventResponse(log.Sequence, log.EventType, w.lggr) + + switch { + case event.Event.DonID == nil: + // event is missing a DonID, so don't filter it out; + // it applies to all Dons + events = append(events, event) + case *event.Event.DonID == don.ID: + // event has a DonID and matches, so it applies to this DON. + events = append(events, event) + default: + // event doesn't match, let's skip it + donID := "MISSING_DON_ID" + if event.Event.DonID != nil { + donID = strconv.FormatUint(uint64(*event.Event.DonID), 10) + } + w.lggr.Debugw("event belongs to a different don, skipping...", "don", don.ID, "gotDON", donID) + } + cursor = log.Sequence.Cursor } @@ -540,6 +560,7 @@ func toWorkflowRegistryEventResponse( return resp } resp.Event.Data = data + resp.Event.DonID = &data.DonID case WorkflowUpdatedEvent: var data WorkflowRegistryWorkflowUpdatedV1 if err := dataAsValuesMap.UnwrapTo(&data); err != nil { @@ -549,6 +570,7 @@ func toWorkflowRegistryEventResponse( return resp } resp.Event.Data = data + resp.Event.DonID = &data.DonID case WorkflowPausedEvent: var data WorkflowRegistryWorkflowPausedV1 if err := dataAsValuesMap.UnwrapTo(&data); err != nil { @@ -558,6 +580,7 @@ func toWorkflowRegistryEventResponse( return resp } resp.Event.Data = data + resp.Event.DonID = &data.DonID case WorkflowActivatedEvent: var data WorkflowRegistryWorkflowActivatedV1 if err := dataAsValuesMap.UnwrapTo(&data); err != nil { @@ -567,6 +590,7 @@ func toWorkflowRegistryEventResponse( return resp } resp.Event.Data = data + resp.Event.DonID = &data.DonID case WorkflowDeletedEvent: var data WorkflowRegistryWorkflowDeletedV1 if err := dataAsValuesMap.UnwrapTo(&data); err != nil { @@ -576,6 +600,7 @@ func toWorkflowRegistryEventResponse( return resp } resp.Event.Data = data + resp.Event.DonID = &data.DonID default: lggr.Errorf("unknown event type: %s", evt) resp.Event = nil From 5609153fca504445bea11f89196e5c293cc30a3e Mon Sep 17 00:00:00 2001 From: Jordan Krage Date: Mon, 24 Feb 2025 15:53:16 -0600 Subject: [PATCH 46/58] core/chains/evm/txm: move mocks internal (#16399) --- .mockery.yaml | 8 +- core/chains/evm/forwarders/mocks/orm.go | 335 --------- ...uilder.go => mock_attempt_builder_test.go} | 52 +- .../{mocks/client.go => mock_client_test.go} | 68 +- core/chains/evm/txm/mock_keystore_test.go | 98 +++ core/chains/evm/txm/mock_tx_store_test.go | 647 ++++++++++++++++++ core/chains/evm/txm/mocks/keystore.go | 98 --- core/chains/evm/txm/mocks/tx_store.go | 647 ------------------ core/chains/evm/txm/txm_test.go | 39 +- 9 files changed, 829 insertions(+), 1163 deletions(-) delete mode 100644 core/chains/evm/forwarders/mocks/orm.go rename core/chains/evm/txm/{mocks/attempt_builder.go => mock_attempt_builder_test.go} (52%) rename core/chains/evm/txm/{mocks/client.go => mock_client_test.go} (50%) create mode 100644 core/chains/evm/txm/mock_keystore_test.go create mode 100644 core/chains/evm/txm/mock_tx_store_test.go delete mode 100644 core/chains/evm/txm/mocks/keystore.go delete mode 100644 core/chains/evm/txm/mocks/tx_store.go diff --git a/.mockery.yaml b/.mockery.yaml index 7ad18b97802..e49546519fd 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -34,9 +34,6 @@ packages: interfaces: Dispatcher: Receiver: - github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders: - interfaces: - ORM: github.com/smartcontractkit/chainlink/v2/core/chains/evm/log: interfaces: Broadcaster: @@ -48,6 +45,11 @@ packages: interfaces: LogPoller: github.com/smartcontractkit/chainlink/v2/core/chains/evm/txm: + config: + dir: core/chains/evm/txm + outpkg: txm + mockname: "mock{{ .InterfaceName }}" + filename: "mock_{{ .InterfaceName | snakecase }}_test.go" interfaces: Client: TxStore: diff --git a/core/chains/evm/forwarders/mocks/orm.go b/core/chains/evm/forwarders/mocks/orm.go deleted file mode 100644 index 86783dc3b1e..00000000000 --- a/core/chains/evm/forwarders/mocks/orm.go +++ /dev/null @@ -1,335 +0,0 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. - -package mocks - -import ( - common "github.com/ethereum/go-ethereum/common" - big "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - - context "context" - - forwarders "github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders" - - mock "github.com/stretchr/testify/mock" - - sqlutil "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" -) - -// ORM is an autogenerated mock type for the ORM type -type ORM struct { - mock.Mock -} - -type ORM_Expecter struct { - mock *mock.Mock -} - -func (_m *ORM) EXPECT() *ORM_Expecter { - return &ORM_Expecter{mock: &_m.Mock} -} - -// CreateForwarder provides a mock function with given fields: ctx, addr, evmChainId -func (_m *ORM) CreateForwarder(ctx context.Context, addr common.Address, evmChainId big.Big) (forwarders.Forwarder, error) { - ret := _m.Called(ctx, addr, evmChainId) - - if len(ret) == 0 { - panic("no return value specified for CreateForwarder") - } - - var r0 forwarders.Forwarder - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, common.Address, big.Big) (forwarders.Forwarder, error)); ok { - return rf(ctx, addr, evmChainId) - } - if rf, ok := ret.Get(0).(func(context.Context, common.Address, big.Big) forwarders.Forwarder); ok { - r0 = rf(ctx, addr, evmChainId) - } else { - r0 = ret.Get(0).(forwarders.Forwarder) - } - - if rf, ok := ret.Get(1).(func(context.Context, common.Address, big.Big) error); ok { - r1 = rf(ctx, addr, evmChainId) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// ORM_CreateForwarder_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateForwarder' -type ORM_CreateForwarder_Call struct { - *mock.Call -} - -// CreateForwarder is a helper method to define mock.On call -// - ctx context.Context -// - addr common.Address -// - evmChainId big.Big -func (_e *ORM_Expecter) CreateForwarder(ctx interface{}, addr interface{}, evmChainId interface{}) *ORM_CreateForwarder_Call { - return &ORM_CreateForwarder_Call{Call: _e.mock.On("CreateForwarder", ctx, addr, evmChainId)} -} - -func (_c *ORM_CreateForwarder_Call) Run(run func(ctx context.Context, addr common.Address, evmChainId big.Big)) *ORM_CreateForwarder_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(common.Address), args[2].(big.Big)) - }) - return _c -} - -func (_c *ORM_CreateForwarder_Call) Return(fwd forwarders.Forwarder, err error) *ORM_CreateForwarder_Call { - _c.Call.Return(fwd, err) - return _c -} - -func (_c *ORM_CreateForwarder_Call) RunAndReturn(run func(context.Context, common.Address, big.Big) (forwarders.Forwarder, error)) *ORM_CreateForwarder_Call { - _c.Call.Return(run) - return _c -} - -// DeleteForwarder provides a mock function with given fields: ctx, id, cleanup -func (_m *ORM) DeleteForwarder(ctx context.Context, id int64, cleanup func(sqlutil.DataSource, int64, common.Address) error) error { - ret := _m.Called(ctx, id, cleanup) - - if len(ret) == 0 { - panic("no return value specified for DeleteForwarder") - } - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, int64, func(sqlutil.DataSource, int64, common.Address) error) error); ok { - r0 = rf(ctx, id, cleanup) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// ORM_DeleteForwarder_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteForwarder' -type ORM_DeleteForwarder_Call struct { - *mock.Call -} - -// DeleteForwarder is a helper method to define mock.On call -// - ctx context.Context -// - id int64 -// - cleanup func(sqlutil.DataSource , int64 , common.Address) error -func (_e *ORM_Expecter) DeleteForwarder(ctx interface{}, id interface{}, cleanup interface{}) *ORM_DeleteForwarder_Call { - return &ORM_DeleteForwarder_Call{Call: _e.mock.On("DeleteForwarder", ctx, id, cleanup)} -} - -func (_c *ORM_DeleteForwarder_Call) Run(run func(ctx context.Context, id int64, cleanup func(sqlutil.DataSource, int64, common.Address) error)) *ORM_DeleteForwarder_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(int64), args[2].(func(sqlutil.DataSource, int64, common.Address) error)) - }) - return _c -} - -func (_c *ORM_DeleteForwarder_Call) Return(_a0 error) *ORM_DeleteForwarder_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *ORM_DeleteForwarder_Call) RunAndReturn(run func(context.Context, int64, func(sqlutil.DataSource, int64, common.Address) error) error) *ORM_DeleteForwarder_Call { - _c.Call.Return(run) - return _c -} - -// FindForwarders provides a mock function with given fields: ctx, offset, limit -func (_m *ORM) FindForwarders(ctx context.Context, offset int, limit int) ([]forwarders.Forwarder, int, error) { - ret := _m.Called(ctx, offset, limit) - - if len(ret) == 0 { - panic("no return value specified for FindForwarders") - } - - var r0 []forwarders.Forwarder - var r1 int - var r2 error - if rf, ok := ret.Get(0).(func(context.Context, int, int) ([]forwarders.Forwarder, int, error)); ok { - return rf(ctx, offset, limit) - } - if rf, ok := ret.Get(0).(func(context.Context, int, int) []forwarders.Forwarder); ok { - r0 = rf(ctx, offset, limit) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]forwarders.Forwarder) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, int, int) int); ok { - r1 = rf(ctx, offset, limit) - } else { - r1 = ret.Get(1).(int) - } - - if rf, ok := ret.Get(2).(func(context.Context, int, int) error); ok { - r2 = rf(ctx, offset, limit) - } else { - r2 = ret.Error(2) - } - - return r0, r1, r2 -} - -// ORM_FindForwarders_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FindForwarders' -type ORM_FindForwarders_Call struct { - *mock.Call -} - -// FindForwarders is a helper method to define mock.On call -// - ctx context.Context -// - offset int -// - limit int -func (_e *ORM_Expecter) FindForwarders(ctx interface{}, offset interface{}, limit interface{}) *ORM_FindForwarders_Call { - return &ORM_FindForwarders_Call{Call: _e.mock.On("FindForwarders", ctx, offset, limit)} -} - -func (_c *ORM_FindForwarders_Call) Run(run func(ctx context.Context, offset int, limit int)) *ORM_FindForwarders_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(int), args[2].(int)) - }) - return _c -} - -func (_c *ORM_FindForwarders_Call) Return(_a0 []forwarders.Forwarder, _a1 int, _a2 error) *ORM_FindForwarders_Call { - _c.Call.Return(_a0, _a1, _a2) - return _c -} - -func (_c *ORM_FindForwarders_Call) RunAndReturn(run func(context.Context, int, int) ([]forwarders.Forwarder, int, error)) *ORM_FindForwarders_Call { - _c.Call.Return(run) - return _c -} - -// FindForwardersByChain provides a mock function with given fields: ctx, evmChainId -func (_m *ORM) FindForwardersByChain(ctx context.Context, evmChainId big.Big) ([]forwarders.Forwarder, error) { - ret := _m.Called(ctx, evmChainId) - - if len(ret) == 0 { - panic("no return value specified for FindForwardersByChain") - } - - var r0 []forwarders.Forwarder - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, big.Big) ([]forwarders.Forwarder, error)); ok { - return rf(ctx, evmChainId) - } - if rf, ok := ret.Get(0).(func(context.Context, big.Big) []forwarders.Forwarder); ok { - r0 = rf(ctx, evmChainId) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]forwarders.Forwarder) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, big.Big) error); ok { - r1 = rf(ctx, evmChainId) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// ORM_FindForwardersByChain_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FindForwardersByChain' -type ORM_FindForwardersByChain_Call struct { - *mock.Call -} - -// FindForwardersByChain is a helper method to define mock.On call -// - ctx context.Context -// - evmChainId big.Big -func (_e *ORM_Expecter) FindForwardersByChain(ctx interface{}, evmChainId interface{}) *ORM_FindForwardersByChain_Call { - return &ORM_FindForwardersByChain_Call{Call: _e.mock.On("FindForwardersByChain", ctx, evmChainId)} -} - -func (_c *ORM_FindForwardersByChain_Call) Run(run func(ctx context.Context, evmChainId big.Big)) *ORM_FindForwardersByChain_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(big.Big)) - }) - return _c -} - -func (_c *ORM_FindForwardersByChain_Call) Return(_a0 []forwarders.Forwarder, _a1 error) *ORM_FindForwardersByChain_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *ORM_FindForwardersByChain_Call) RunAndReturn(run func(context.Context, big.Big) ([]forwarders.Forwarder, error)) *ORM_FindForwardersByChain_Call { - _c.Call.Return(run) - return _c -} - -// FindForwardersInListByChain provides a mock function with given fields: ctx, evmChainId, addrs -func (_m *ORM) FindForwardersInListByChain(ctx context.Context, evmChainId big.Big, addrs []common.Address) ([]forwarders.Forwarder, error) { - ret := _m.Called(ctx, evmChainId, addrs) - - if len(ret) == 0 { - panic("no return value specified for FindForwardersInListByChain") - } - - var r0 []forwarders.Forwarder - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, big.Big, []common.Address) ([]forwarders.Forwarder, error)); ok { - return rf(ctx, evmChainId, addrs) - } - if rf, ok := ret.Get(0).(func(context.Context, big.Big, []common.Address) []forwarders.Forwarder); ok { - r0 = rf(ctx, evmChainId, addrs) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]forwarders.Forwarder) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, big.Big, []common.Address) error); ok { - r1 = rf(ctx, evmChainId, addrs) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// ORM_FindForwardersInListByChain_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FindForwardersInListByChain' -type ORM_FindForwardersInListByChain_Call struct { - *mock.Call -} - -// FindForwardersInListByChain is a helper method to define mock.On call -// - ctx context.Context -// - evmChainId big.Big -// - addrs []common.Address -func (_e *ORM_Expecter) FindForwardersInListByChain(ctx interface{}, evmChainId interface{}, addrs interface{}) *ORM_FindForwardersInListByChain_Call { - return &ORM_FindForwardersInListByChain_Call{Call: _e.mock.On("FindForwardersInListByChain", ctx, evmChainId, addrs)} -} - -func (_c *ORM_FindForwardersInListByChain_Call) Run(run func(ctx context.Context, evmChainId big.Big, addrs []common.Address)) *ORM_FindForwardersInListByChain_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(big.Big), args[2].([]common.Address)) - }) - return _c -} - -func (_c *ORM_FindForwardersInListByChain_Call) Return(_a0 []forwarders.Forwarder, _a1 error) *ORM_FindForwardersInListByChain_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *ORM_FindForwardersInListByChain_Call) RunAndReturn(run func(context.Context, big.Big, []common.Address) ([]forwarders.Forwarder, error)) *ORM_FindForwardersInListByChain_Call { - _c.Call.Return(run) - return _c -} - -// NewORM creates a new instance of ORM. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewORM(t interface { - mock.TestingT - Cleanup(func()) -}) *ORM { - mock := &ORM{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/core/chains/evm/txm/mocks/attempt_builder.go b/core/chains/evm/txm/mock_attempt_builder_test.go similarity index 52% rename from core/chains/evm/txm/mocks/attempt_builder.go rename to core/chains/evm/txm/mock_attempt_builder_test.go index 91961e5d420..db0f036026c 100644 --- a/core/chains/evm/txm/mocks/attempt_builder.go +++ b/core/chains/evm/txm/mock_attempt_builder_test.go @@ -1,6 +1,6 @@ // Code generated by mockery v2.50.0. DO NOT EDIT. -package mocks +package txm import ( context "context" @@ -11,21 +11,21 @@ import ( types "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txm/types" ) -// AttemptBuilder is an autogenerated mock type for the AttemptBuilder type -type AttemptBuilder struct { +// mockAttemptBuilder is an autogenerated mock type for the AttemptBuilder type +type mockAttemptBuilder struct { mock.Mock } -type AttemptBuilder_Expecter struct { +type mockAttemptBuilder_Expecter struct { mock *mock.Mock } -func (_m *AttemptBuilder) EXPECT() *AttemptBuilder_Expecter { - return &AttemptBuilder_Expecter{mock: &_m.Mock} +func (_m *mockAttemptBuilder) EXPECT() *mockAttemptBuilder_Expecter { + return &mockAttemptBuilder_Expecter{mock: &_m.Mock} } // NewAttempt provides a mock function with given fields: _a0, _a1, _a2, _a3 -func (_m *AttemptBuilder) NewAttempt(_a0 context.Context, _a1 logger.Logger, _a2 *types.Transaction, _a3 bool) (*types.Attempt, error) { +func (_m *mockAttemptBuilder) NewAttempt(_a0 context.Context, _a1 logger.Logger, _a2 *types.Transaction, _a3 bool) (*types.Attempt, error) { ret := _m.Called(_a0, _a1, _a2, _a3) if len(ret) == 0 { @@ -54,8 +54,8 @@ func (_m *AttemptBuilder) NewAttempt(_a0 context.Context, _a1 logger.Logger, _a2 return r0, r1 } -// AttemptBuilder_NewAttempt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewAttempt' -type AttemptBuilder_NewAttempt_Call struct { +// mockAttemptBuilder_NewAttempt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewAttempt' +type mockAttemptBuilder_NewAttempt_Call struct { *mock.Call } @@ -64,29 +64,29 @@ type AttemptBuilder_NewAttempt_Call struct { // - _a1 logger.Logger // - _a2 *types.Transaction // - _a3 bool -func (_e *AttemptBuilder_Expecter) NewAttempt(_a0 interface{}, _a1 interface{}, _a2 interface{}, _a3 interface{}) *AttemptBuilder_NewAttempt_Call { - return &AttemptBuilder_NewAttempt_Call{Call: _e.mock.On("NewAttempt", _a0, _a1, _a2, _a3)} +func (_e *mockAttemptBuilder_Expecter) NewAttempt(_a0 interface{}, _a1 interface{}, _a2 interface{}, _a3 interface{}) *mockAttemptBuilder_NewAttempt_Call { + return &mockAttemptBuilder_NewAttempt_Call{Call: _e.mock.On("NewAttempt", _a0, _a1, _a2, _a3)} } -func (_c *AttemptBuilder_NewAttempt_Call) Run(run func(_a0 context.Context, _a1 logger.Logger, _a2 *types.Transaction, _a3 bool)) *AttemptBuilder_NewAttempt_Call { +func (_c *mockAttemptBuilder_NewAttempt_Call) Run(run func(_a0 context.Context, _a1 logger.Logger, _a2 *types.Transaction, _a3 bool)) *mockAttemptBuilder_NewAttempt_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(logger.Logger), args[2].(*types.Transaction), args[3].(bool)) }) return _c } -func (_c *AttemptBuilder_NewAttempt_Call) Return(_a0 *types.Attempt, _a1 error) *AttemptBuilder_NewAttempt_Call { +func (_c *mockAttemptBuilder_NewAttempt_Call) Return(_a0 *types.Attempt, _a1 error) *mockAttemptBuilder_NewAttempt_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *AttemptBuilder_NewAttempt_Call) RunAndReturn(run func(context.Context, logger.Logger, *types.Transaction, bool) (*types.Attempt, error)) *AttemptBuilder_NewAttempt_Call { +func (_c *mockAttemptBuilder_NewAttempt_Call) RunAndReturn(run func(context.Context, logger.Logger, *types.Transaction, bool) (*types.Attempt, error)) *mockAttemptBuilder_NewAttempt_Call { _c.Call.Return(run) return _c } // NewBumpAttempt provides a mock function with given fields: _a0, _a1, _a2, _a3 -func (_m *AttemptBuilder) NewBumpAttempt(_a0 context.Context, _a1 logger.Logger, _a2 *types.Transaction, _a3 types.Attempt) (*types.Attempt, error) { +func (_m *mockAttemptBuilder) NewBumpAttempt(_a0 context.Context, _a1 logger.Logger, _a2 *types.Transaction, _a3 types.Attempt) (*types.Attempt, error) { ret := _m.Called(_a0, _a1, _a2, _a3) if len(ret) == 0 { @@ -115,8 +115,8 @@ func (_m *AttemptBuilder) NewBumpAttempt(_a0 context.Context, _a1 logger.Logger, return r0, r1 } -// AttemptBuilder_NewBumpAttempt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewBumpAttempt' -type AttemptBuilder_NewBumpAttempt_Call struct { +// mockAttemptBuilder_NewBumpAttempt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewBumpAttempt' +type mockAttemptBuilder_NewBumpAttempt_Call struct { *mock.Call } @@ -125,34 +125,34 @@ type AttemptBuilder_NewBumpAttempt_Call struct { // - _a1 logger.Logger // - _a2 *types.Transaction // - _a3 types.Attempt -func (_e *AttemptBuilder_Expecter) NewBumpAttempt(_a0 interface{}, _a1 interface{}, _a2 interface{}, _a3 interface{}) *AttemptBuilder_NewBumpAttempt_Call { - return &AttemptBuilder_NewBumpAttempt_Call{Call: _e.mock.On("NewBumpAttempt", _a0, _a1, _a2, _a3)} +func (_e *mockAttemptBuilder_Expecter) NewBumpAttempt(_a0 interface{}, _a1 interface{}, _a2 interface{}, _a3 interface{}) *mockAttemptBuilder_NewBumpAttempt_Call { + return &mockAttemptBuilder_NewBumpAttempt_Call{Call: _e.mock.On("NewBumpAttempt", _a0, _a1, _a2, _a3)} } -func (_c *AttemptBuilder_NewBumpAttempt_Call) Run(run func(_a0 context.Context, _a1 logger.Logger, _a2 *types.Transaction, _a3 types.Attempt)) *AttemptBuilder_NewBumpAttempt_Call { +func (_c *mockAttemptBuilder_NewBumpAttempt_Call) Run(run func(_a0 context.Context, _a1 logger.Logger, _a2 *types.Transaction, _a3 types.Attempt)) *mockAttemptBuilder_NewBumpAttempt_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(logger.Logger), args[2].(*types.Transaction), args[3].(types.Attempt)) }) return _c } -func (_c *AttemptBuilder_NewBumpAttempt_Call) Return(_a0 *types.Attempt, _a1 error) *AttemptBuilder_NewBumpAttempt_Call { +func (_c *mockAttemptBuilder_NewBumpAttempt_Call) Return(_a0 *types.Attempt, _a1 error) *mockAttemptBuilder_NewBumpAttempt_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *AttemptBuilder_NewBumpAttempt_Call) RunAndReturn(run func(context.Context, logger.Logger, *types.Transaction, types.Attempt) (*types.Attempt, error)) *AttemptBuilder_NewBumpAttempt_Call { +func (_c *mockAttemptBuilder_NewBumpAttempt_Call) RunAndReturn(run func(context.Context, logger.Logger, *types.Transaction, types.Attempt) (*types.Attempt, error)) *mockAttemptBuilder_NewBumpAttempt_Call { _c.Call.Return(run) return _c } -// NewAttemptBuilder creates a new instance of AttemptBuilder. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// newMockAttemptBuilder creates a new instance of mockAttemptBuilder. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. // The first argument is typically a *testing.T value. -func NewAttemptBuilder(t interface { +func newMockAttemptBuilder(t interface { mock.TestingT Cleanup(func()) -}) *AttemptBuilder { - mock := &AttemptBuilder{} +}) *mockAttemptBuilder { + mock := &mockAttemptBuilder{} mock.Mock.Test(t) t.Cleanup(func() { mock.AssertExpectations(t) }) diff --git a/core/chains/evm/txm/mocks/client.go b/core/chains/evm/txm/mock_client_test.go similarity index 50% rename from core/chains/evm/txm/mocks/client.go rename to core/chains/evm/txm/mock_client_test.go index cac2e55491a..68bf3001427 100644 --- a/core/chains/evm/txm/mocks/client.go +++ b/core/chains/evm/txm/mock_client_test.go @@ -1,6 +1,6 @@ // Code generated by mockery v2.50.0. DO NOT EDIT. -package mocks +package txm import ( context "context" @@ -13,21 +13,21 @@ import ( types "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txm/types" ) -// Client is an autogenerated mock type for the Client type -type Client struct { +// mockClient is an autogenerated mock type for the Client type +type mockClient struct { mock.Mock } -type Client_Expecter struct { +type mockClient_Expecter struct { mock *mock.Mock } -func (_m *Client) EXPECT() *Client_Expecter { - return &Client_Expecter{mock: &_m.Mock} +func (_m *mockClient) EXPECT() *mockClient_Expecter { + return &mockClient_Expecter{mock: &_m.Mock} } // NonceAt provides a mock function with given fields: _a0, _a1, _a2 -func (_m *Client) NonceAt(_a0 context.Context, _a1 common.Address, _a2 *big.Int) (uint64, error) { +func (_m *mockClient) NonceAt(_a0 context.Context, _a1 common.Address, _a2 *big.Int) (uint64, error) { ret := _m.Called(_a0, _a1, _a2) if len(ret) == 0 { @@ -54,8 +54,8 @@ func (_m *Client) NonceAt(_a0 context.Context, _a1 common.Address, _a2 *big.Int) return r0, r1 } -// Client_NonceAt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NonceAt' -type Client_NonceAt_Call struct { +// mockClient_NonceAt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NonceAt' +type mockClient_NonceAt_Call struct { *mock.Call } @@ -63,29 +63,29 @@ type Client_NonceAt_Call struct { // - _a0 context.Context // - _a1 common.Address // - _a2 *big.Int -func (_e *Client_Expecter) NonceAt(_a0 interface{}, _a1 interface{}, _a2 interface{}) *Client_NonceAt_Call { - return &Client_NonceAt_Call{Call: _e.mock.On("NonceAt", _a0, _a1, _a2)} +func (_e *mockClient_Expecter) NonceAt(_a0 interface{}, _a1 interface{}, _a2 interface{}) *mockClient_NonceAt_Call { + return &mockClient_NonceAt_Call{Call: _e.mock.On("NonceAt", _a0, _a1, _a2)} } -func (_c *Client_NonceAt_Call) Run(run func(_a0 context.Context, _a1 common.Address, _a2 *big.Int)) *Client_NonceAt_Call { +func (_c *mockClient_NonceAt_Call) Run(run func(_a0 context.Context, _a1 common.Address, _a2 *big.Int)) *mockClient_NonceAt_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(common.Address), args[2].(*big.Int)) }) return _c } -func (_c *Client_NonceAt_Call) Return(_a0 uint64, _a1 error) *Client_NonceAt_Call { +func (_c *mockClient_NonceAt_Call) Return(_a0 uint64, _a1 error) *mockClient_NonceAt_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *Client_NonceAt_Call) RunAndReturn(run func(context.Context, common.Address, *big.Int) (uint64, error)) *Client_NonceAt_Call { +func (_c *mockClient_NonceAt_Call) RunAndReturn(run func(context.Context, common.Address, *big.Int) (uint64, error)) *mockClient_NonceAt_Call { _c.Call.Return(run) return _c } // PendingNonceAt provides a mock function with given fields: _a0, _a1 -func (_m *Client) PendingNonceAt(_a0 context.Context, _a1 common.Address) (uint64, error) { +func (_m *mockClient) PendingNonceAt(_a0 context.Context, _a1 common.Address) (uint64, error) { ret := _m.Called(_a0, _a1) if len(ret) == 0 { @@ -112,37 +112,37 @@ func (_m *Client) PendingNonceAt(_a0 context.Context, _a1 common.Address) (uint6 return r0, r1 } -// Client_PendingNonceAt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PendingNonceAt' -type Client_PendingNonceAt_Call struct { +// mockClient_PendingNonceAt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PendingNonceAt' +type mockClient_PendingNonceAt_Call struct { *mock.Call } // PendingNonceAt is a helper method to define mock.On call // - _a0 context.Context // - _a1 common.Address -func (_e *Client_Expecter) PendingNonceAt(_a0 interface{}, _a1 interface{}) *Client_PendingNonceAt_Call { - return &Client_PendingNonceAt_Call{Call: _e.mock.On("PendingNonceAt", _a0, _a1)} +func (_e *mockClient_Expecter) PendingNonceAt(_a0 interface{}, _a1 interface{}) *mockClient_PendingNonceAt_Call { + return &mockClient_PendingNonceAt_Call{Call: _e.mock.On("PendingNonceAt", _a0, _a1)} } -func (_c *Client_PendingNonceAt_Call) Run(run func(_a0 context.Context, _a1 common.Address)) *Client_PendingNonceAt_Call { +func (_c *mockClient_PendingNonceAt_Call) Run(run func(_a0 context.Context, _a1 common.Address)) *mockClient_PendingNonceAt_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(common.Address)) }) return _c } -func (_c *Client_PendingNonceAt_Call) Return(_a0 uint64, _a1 error) *Client_PendingNonceAt_Call { +func (_c *mockClient_PendingNonceAt_Call) Return(_a0 uint64, _a1 error) *mockClient_PendingNonceAt_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *Client_PendingNonceAt_Call) RunAndReturn(run func(context.Context, common.Address) (uint64, error)) *Client_PendingNonceAt_Call { +func (_c *mockClient_PendingNonceAt_Call) RunAndReturn(run func(context.Context, common.Address) (uint64, error)) *mockClient_PendingNonceAt_Call { _c.Call.Return(run) return _c } // SendTransaction provides a mock function with given fields: ctx, tx, attempt -func (_m *Client) SendTransaction(ctx context.Context, tx *types.Transaction, attempt *types.Attempt) error { +func (_m *mockClient) SendTransaction(ctx context.Context, tx *types.Transaction, attempt *types.Attempt) error { ret := _m.Called(ctx, tx, attempt) if len(ret) == 0 { @@ -159,8 +159,8 @@ func (_m *Client) SendTransaction(ctx context.Context, tx *types.Transaction, at return r0 } -// Client_SendTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendTransaction' -type Client_SendTransaction_Call struct { +// mockClient_SendTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendTransaction' +type mockClient_SendTransaction_Call struct { *mock.Call } @@ -168,34 +168,34 @@ type Client_SendTransaction_Call struct { // - ctx context.Context // - tx *types.Transaction // - attempt *types.Attempt -func (_e *Client_Expecter) SendTransaction(ctx interface{}, tx interface{}, attempt interface{}) *Client_SendTransaction_Call { - return &Client_SendTransaction_Call{Call: _e.mock.On("SendTransaction", ctx, tx, attempt)} +func (_e *mockClient_Expecter) SendTransaction(ctx interface{}, tx interface{}, attempt interface{}) *mockClient_SendTransaction_Call { + return &mockClient_SendTransaction_Call{Call: _e.mock.On("SendTransaction", ctx, tx, attempt)} } -func (_c *Client_SendTransaction_Call) Run(run func(ctx context.Context, tx *types.Transaction, attempt *types.Attempt)) *Client_SendTransaction_Call { +func (_c *mockClient_SendTransaction_Call) Run(run func(ctx context.Context, tx *types.Transaction, attempt *types.Attempt)) *mockClient_SendTransaction_Call { _c.Call.Run(func(args mock.Arguments) { run(args[0].(context.Context), args[1].(*types.Transaction), args[2].(*types.Attempt)) }) return _c } -func (_c *Client_SendTransaction_Call) Return(_a0 error) *Client_SendTransaction_Call { +func (_c *mockClient_SendTransaction_Call) Return(_a0 error) *mockClient_SendTransaction_Call { _c.Call.Return(_a0) return _c } -func (_c *Client_SendTransaction_Call) RunAndReturn(run func(context.Context, *types.Transaction, *types.Attempt) error) *Client_SendTransaction_Call { +func (_c *mockClient_SendTransaction_Call) RunAndReturn(run func(context.Context, *types.Transaction, *types.Attempt) error) *mockClient_SendTransaction_Call { _c.Call.Return(run) return _c } -// NewClient creates a new instance of Client. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// newMockClient creates a new instance of mockClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. // The first argument is typically a *testing.T value. -func NewClient(t interface { +func newMockClient(t interface { mock.TestingT Cleanup(func()) -}) *Client { - mock := &Client{} +}) *mockClient { + mock := &mockClient{} mock.Mock.Test(t) t.Cleanup(func() { mock.AssertExpectations(t) }) diff --git a/core/chains/evm/txm/mock_keystore_test.go b/core/chains/evm/txm/mock_keystore_test.go new file mode 100644 index 00000000000..f30e17e5024 --- /dev/null +++ b/core/chains/evm/txm/mock_keystore_test.go @@ -0,0 +1,98 @@ +// Code generated by mockery v2.50.0. DO NOT EDIT. + +package txm + +import ( + context "context" + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" +) + +// mockKeystore is an autogenerated mock type for the Keystore type +type mockKeystore struct { + mock.Mock +} + +type mockKeystore_Expecter struct { + mock *mock.Mock +} + +func (_m *mockKeystore) EXPECT() *mockKeystore_Expecter { + return &mockKeystore_Expecter{mock: &_m.Mock} +} + +// EnabledAddressesForChain provides a mock function with given fields: ctx, chainID +func (_m *mockKeystore) EnabledAddressesForChain(ctx context.Context, chainID *big.Int) ([]common.Address, error) { + ret := _m.Called(ctx, chainID) + + if len(ret) == 0 { + panic("no return value specified for EnabledAddressesForChain") + } + + var r0 []common.Address + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) ([]common.Address, error)); ok { + return rf(ctx, chainID) + } + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) []common.Address); ok { + r0 = rf(ctx, chainID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]common.Address) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *big.Int) error); ok { + r1 = rf(ctx, chainID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockKeystore_EnabledAddressesForChain_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EnabledAddressesForChain' +type mockKeystore_EnabledAddressesForChain_Call struct { + *mock.Call +} + +// EnabledAddressesForChain is a helper method to define mock.On call +// - ctx context.Context +// - chainID *big.Int +func (_e *mockKeystore_Expecter) EnabledAddressesForChain(ctx interface{}, chainID interface{}) *mockKeystore_EnabledAddressesForChain_Call { + return &mockKeystore_EnabledAddressesForChain_Call{Call: _e.mock.On("EnabledAddressesForChain", ctx, chainID)} +} + +func (_c *mockKeystore_EnabledAddressesForChain_Call) Run(run func(ctx context.Context, chainID *big.Int)) *mockKeystore_EnabledAddressesForChain_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*big.Int)) + }) + return _c +} + +func (_c *mockKeystore_EnabledAddressesForChain_Call) Return(addresses []common.Address, err error) *mockKeystore_EnabledAddressesForChain_Call { + _c.Call.Return(addresses, err) + return _c +} + +func (_c *mockKeystore_EnabledAddressesForChain_Call) RunAndReturn(run func(context.Context, *big.Int) ([]common.Address, error)) *mockKeystore_EnabledAddressesForChain_Call { + _c.Call.Return(run) + return _c +} + +// newMockKeystore creates a new instance of mockKeystore. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockKeystore(t interface { + mock.TestingT + Cleanup(func()) +}) *mockKeystore { + mock := &mockKeystore{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/core/chains/evm/txm/mock_tx_store_test.go b/core/chains/evm/txm/mock_tx_store_test.go new file mode 100644 index 00000000000..18dd11a4196 --- /dev/null +++ b/core/chains/evm/txm/mock_tx_store_test.go @@ -0,0 +1,647 @@ +// Code generated by mockery v2.50.0. DO NOT EDIT. + +package txm + +import ( + context "context" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + types "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txm/types" +) + +// mockTxStore is an autogenerated mock type for the TxStore type +type mockTxStore struct { + mock.Mock +} + +type mockTxStore_Expecter struct { + mock *mock.Mock +} + +func (_m *mockTxStore) EXPECT() *mockTxStore_Expecter { + return &mockTxStore_Expecter{mock: &_m.Mock} +} + +// AbandonPendingTransactions provides a mock function with given fields: _a0, _a1 +func (_m *mockTxStore) AbandonPendingTransactions(_a0 context.Context, _a1 common.Address) error { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for AbandonPendingTransactions") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address) error); ok { + r0 = rf(_a0, _a1) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// mockTxStore_AbandonPendingTransactions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AbandonPendingTransactions' +type mockTxStore_AbandonPendingTransactions_Call struct { + *mock.Call +} + +// AbandonPendingTransactions is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 common.Address +func (_e *mockTxStore_Expecter) AbandonPendingTransactions(_a0 interface{}, _a1 interface{}) *mockTxStore_AbandonPendingTransactions_Call { + return &mockTxStore_AbandonPendingTransactions_Call{Call: _e.mock.On("AbandonPendingTransactions", _a0, _a1)} +} + +func (_c *mockTxStore_AbandonPendingTransactions_Call) Run(run func(_a0 context.Context, _a1 common.Address)) *mockTxStore_AbandonPendingTransactions_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Address)) + }) + return _c +} + +func (_c *mockTxStore_AbandonPendingTransactions_Call) Return(_a0 error) *mockTxStore_AbandonPendingTransactions_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockTxStore_AbandonPendingTransactions_Call) RunAndReturn(run func(context.Context, common.Address) error) *mockTxStore_AbandonPendingTransactions_Call { + _c.Call.Return(run) + return _c +} + +// AppendAttemptToTransaction provides a mock function with given fields: _a0, _a1, _a2, _a3 +func (_m *mockTxStore) AppendAttemptToTransaction(_a0 context.Context, _a1 uint64, _a2 common.Address, _a3 *types.Attempt) error { + ret := _m.Called(_a0, _a1, _a2, _a3) + + if len(ret) == 0 { + panic("no return value specified for AppendAttemptToTransaction") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, uint64, common.Address, *types.Attempt) error); ok { + r0 = rf(_a0, _a1, _a2, _a3) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// mockTxStore_AppendAttemptToTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AppendAttemptToTransaction' +type mockTxStore_AppendAttemptToTransaction_Call struct { + *mock.Call +} + +// AppendAttemptToTransaction is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 uint64 +// - _a2 common.Address +// - _a3 *types.Attempt +func (_e *mockTxStore_Expecter) AppendAttemptToTransaction(_a0 interface{}, _a1 interface{}, _a2 interface{}, _a3 interface{}) *mockTxStore_AppendAttemptToTransaction_Call { + return &mockTxStore_AppendAttemptToTransaction_Call{Call: _e.mock.On("AppendAttemptToTransaction", _a0, _a1, _a2, _a3)} +} + +func (_c *mockTxStore_AppendAttemptToTransaction_Call) Run(run func(_a0 context.Context, _a1 uint64, _a2 common.Address, _a3 *types.Attempt)) *mockTxStore_AppendAttemptToTransaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64), args[2].(common.Address), args[3].(*types.Attempt)) + }) + return _c +} + +func (_c *mockTxStore_AppendAttemptToTransaction_Call) Return(_a0 error) *mockTxStore_AppendAttemptToTransaction_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockTxStore_AppendAttemptToTransaction_Call) RunAndReturn(run func(context.Context, uint64, common.Address, *types.Attempt) error) *mockTxStore_AppendAttemptToTransaction_Call { + _c.Call.Return(run) + return _c +} + +// CreateEmptyUnconfirmedTransaction provides a mock function with given fields: _a0, _a1, _a2, _a3 +func (_m *mockTxStore) CreateEmptyUnconfirmedTransaction(_a0 context.Context, _a1 common.Address, _a2 uint64, _a3 uint64) (*types.Transaction, error) { + ret := _m.Called(_a0, _a1, _a2, _a3) + + if len(ret) == 0 { + panic("no return value specified for CreateEmptyUnconfirmedTransaction") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address, uint64, uint64) (*types.Transaction, error)); ok { + return rf(_a0, _a1, _a2, _a3) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address, uint64, uint64) *types.Transaction); ok { + r0 = rf(_a0, _a1, _a2, _a3) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address, uint64, uint64) error); ok { + r1 = rf(_a0, _a1, _a2, _a3) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockTxStore_CreateEmptyUnconfirmedTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateEmptyUnconfirmedTransaction' +type mockTxStore_CreateEmptyUnconfirmedTransaction_Call struct { + *mock.Call +} + +// CreateEmptyUnconfirmedTransaction is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 common.Address +// - _a2 uint64 +// - _a3 uint64 +func (_e *mockTxStore_Expecter) CreateEmptyUnconfirmedTransaction(_a0 interface{}, _a1 interface{}, _a2 interface{}, _a3 interface{}) *mockTxStore_CreateEmptyUnconfirmedTransaction_Call { + return &mockTxStore_CreateEmptyUnconfirmedTransaction_Call{Call: _e.mock.On("CreateEmptyUnconfirmedTransaction", _a0, _a1, _a2, _a3)} +} + +func (_c *mockTxStore_CreateEmptyUnconfirmedTransaction_Call) Run(run func(_a0 context.Context, _a1 common.Address, _a2 uint64, _a3 uint64)) *mockTxStore_CreateEmptyUnconfirmedTransaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Address), args[2].(uint64), args[3].(uint64)) + }) + return _c +} + +func (_c *mockTxStore_CreateEmptyUnconfirmedTransaction_Call) Return(_a0 *types.Transaction, _a1 error) *mockTxStore_CreateEmptyUnconfirmedTransaction_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *mockTxStore_CreateEmptyUnconfirmedTransaction_Call) RunAndReturn(run func(context.Context, common.Address, uint64, uint64) (*types.Transaction, error)) *mockTxStore_CreateEmptyUnconfirmedTransaction_Call { + _c.Call.Return(run) + return _c +} + +// CreateTransaction provides a mock function with given fields: _a0, _a1 +func (_m *mockTxStore) CreateTransaction(_a0 context.Context, _a1 *types.TxRequest) (*types.Transaction, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for CreateTransaction") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.TxRequest) (*types.Transaction, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *types.TxRequest) *types.Transaction); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *types.TxRequest) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockTxStore_CreateTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateTransaction' +type mockTxStore_CreateTransaction_Call struct { + *mock.Call +} + +// CreateTransaction is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *types.TxRequest +func (_e *mockTxStore_Expecter) CreateTransaction(_a0 interface{}, _a1 interface{}) *mockTxStore_CreateTransaction_Call { + return &mockTxStore_CreateTransaction_Call{Call: _e.mock.On("CreateTransaction", _a0, _a1)} +} + +func (_c *mockTxStore_CreateTransaction_Call) Run(run func(_a0 context.Context, _a1 *types.TxRequest)) *mockTxStore_CreateTransaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*types.TxRequest)) + }) + return _c +} + +func (_c *mockTxStore_CreateTransaction_Call) Return(_a0 *types.Transaction, _a1 error) *mockTxStore_CreateTransaction_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *mockTxStore_CreateTransaction_Call) RunAndReturn(run func(context.Context, *types.TxRequest) (*types.Transaction, error)) *mockTxStore_CreateTransaction_Call { + _c.Call.Return(run) + return _c +} + +// DeleteAttemptForUnconfirmedTx provides a mock function with given fields: _a0, _a1, _a2, _a3 +func (_m *mockTxStore) DeleteAttemptForUnconfirmedTx(_a0 context.Context, _a1 uint64, _a2 *types.Attempt, _a3 common.Address) error { + ret := _m.Called(_a0, _a1, _a2, _a3) + + if len(ret) == 0 { + panic("no return value specified for DeleteAttemptForUnconfirmedTx") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, uint64, *types.Attempt, common.Address) error); ok { + r0 = rf(_a0, _a1, _a2, _a3) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// mockTxStore_DeleteAttemptForUnconfirmedTx_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteAttemptForUnconfirmedTx' +type mockTxStore_DeleteAttemptForUnconfirmedTx_Call struct { + *mock.Call +} + +// DeleteAttemptForUnconfirmedTx is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 uint64 +// - _a2 *types.Attempt +// - _a3 common.Address +func (_e *mockTxStore_Expecter) DeleteAttemptForUnconfirmedTx(_a0 interface{}, _a1 interface{}, _a2 interface{}, _a3 interface{}) *mockTxStore_DeleteAttemptForUnconfirmedTx_Call { + return &mockTxStore_DeleteAttemptForUnconfirmedTx_Call{Call: _e.mock.On("DeleteAttemptForUnconfirmedTx", _a0, _a1, _a2, _a3)} +} + +func (_c *mockTxStore_DeleteAttemptForUnconfirmedTx_Call) Run(run func(_a0 context.Context, _a1 uint64, _a2 *types.Attempt, _a3 common.Address)) *mockTxStore_DeleteAttemptForUnconfirmedTx_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64), args[2].(*types.Attempt), args[3].(common.Address)) + }) + return _c +} + +func (_c *mockTxStore_DeleteAttemptForUnconfirmedTx_Call) Return(_a0 error) *mockTxStore_DeleteAttemptForUnconfirmedTx_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockTxStore_DeleteAttemptForUnconfirmedTx_Call) RunAndReturn(run func(context.Context, uint64, *types.Attempt, common.Address) error) *mockTxStore_DeleteAttemptForUnconfirmedTx_Call { + _c.Call.Return(run) + return _c +} + +// FetchUnconfirmedTransactionAtNonceWithCount provides a mock function with given fields: _a0, _a1, _a2 +func (_m *mockTxStore) FetchUnconfirmedTransactionAtNonceWithCount(_a0 context.Context, _a1 uint64, _a2 common.Address) (*types.Transaction, int, error) { + ret := _m.Called(_a0, _a1, _a2) + + if len(ret) == 0 { + panic("no return value specified for FetchUnconfirmedTransactionAtNonceWithCount") + } + + var r0 *types.Transaction + var r1 int + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, uint64, common.Address) (*types.Transaction, int, error)); ok { + return rf(_a0, _a1, _a2) + } + if rf, ok := ret.Get(0).(func(context.Context, uint64, common.Address) *types.Transaction); ok { + r0 = rf(_a0, _a1, _a2) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, uint64, common.Address) int); ok { + r1 = rf(_a0, _a1, _a2) + } else { + r1 = ret.Get(1).(int) + } + + if rf, ok := ret.Get(2).(func(context.Context, uint64, common.Address) error); ok { + r2 = rf(_a0, _a1, _a2) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// mockTxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FetchUnconfirmedTransactionAtNonceWithCount' +type mockTxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call struct { + *mock.Call +} + +// FetchUnconfirmedTransactionAtNonceWithCount is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 uint64 +// - _a2 common.Address +func (_e *mockTxStore_Expecter) FetchUnconfirmedTransactionAtNonceWithCount(_a0 interface{}, _a1 interface{}, _a2 interface{}) *mockTxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call { + return &mockTxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call{Call: _e.mock.On("FetchUnconfirmedTransactionAtNonceWithCount", _a0, _a1, _a2)} +} + +func (_c *mockTxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call) Run(run func(_a0 context.Context, _a1 uint64, _a2 common.Address)) *mockTxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64), args[2].(common.Address)) + }) + return _c +} + +func (_c *mockTxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call) Return(_a0 *types.Transaction, _a1 int, _a2 error) *mockTxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call { + _c.Call.Return(_a0, _a1, _a2) + return _c +} + +func (_c *mockTxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call) RunAndReturn(run func(context.Context, uint64, common.Address) (*types.Transaction, int, error)) *mockTxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call { + _c.Call.Return(run) + return _c +} + +// MarkConfirmedAndReorgedTransactions provides a mock function with given fields: _a0, _a1, _a2 +func (_m *mockTxStore) MarkConfirmedAndReorgedTransactions(_a0 context.Context, _a1 uint64, _a2 common.Address) ([]*types.Transaction, []uint64, error) { + ret := _m.Called(_a0, _a1, _a2) + + if len(ret) == 0 { + panic("no return value specified for MarkConfirmedAndReorgedTransactions") + } + + var r0 []*types.Transaction + var r1 []uint64 + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, uint64, common.Address) ([]*types.Transaction, []uint64, error)); ok { + return rf(_a0, _a1, _a2) + } + if rf, ok := ret.Get(0).(func(context.Context, uint64, common.Address) []*types.Transaction); ok { + r0 = rf(_a0, _a1, _a2) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, uint64, common.Address) []uint64); ok { + r1 = rf(_a0, _a1, _a2) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([]uint64) + } + } + + if rf, ok := ret.Get(2).(func(context.Context, uint64, common.Address) error); ok { + r2 = rf(_a0, _a1, _a2) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// mockTxStore_MarkConfirmedAndReorgedTransactions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MarkConfirmedAndReorgedTransactions' +type mockTxStore_MarkConfirmedAndReorgedTransactions_Call struct { + *mock.Call +} + +// MarkConfirmedAndReorgedTransactions is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 uint64 +// - _a2 common.Address +func (_e *mockTxStore_Expecter) MarkConfirmedAndReorgedTransactions(_a0 interface{}, _a1 interface{}, _a2 interface{}) *mockTxStore_MarkConfirmedAndReorgedTransactions_Call { + return &mockTxStore_MarkConfirmedAndReorgedTransactions_Call{Call: _e.mock.On("MarkConfirmedAndReorgedTransactions", _a0, _a1, _a2)} +} + +func (_c *mockTxStore_MarkConfirmedAndReorgedTransactions_Call) Run(run func(_a0 context.Context, _a1 uint64, _a2 common.Address)) *mockTxStore_MarkConfirmedAndReorgedTransactions_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64), args[2].(common.Address)) + }) + return _c +} + +func (_c *mockTxStore_MarkConfirmedAndReorgedTransactions_Call) Return(_a0 []*types.Transaction, _a1 []uint64, _a2 error) *mockTxStore_MarkConfirmedAndReorgedTransactions_Call { + _c.Call.Return(_a0, _a1, _a2) + return _c +} + +func (_c *mockTxStore_MarkConfirmedAndReorgedTransactions_Call) RunAndReturn(run func(context.Context, uint64, common.Address) ([]*types.Transaction, []uint64, error)) *mockTxStore_MarkConfirmedAndReorgedTransactions_Call { + _c.Call.Return(run) + return _c +} + +// MarkTxFatal provides a mock function with given fields: _a0, _a1, _a2 +func (_m *mockTxStore) MarkTxFatal(_a0 context.Context, _a1 *types.Transaction, _a2 common.Address) error { + ret := _m.Called(_a0, _a1, _a2) + + if len(ret) == 0 { + panic("no return value specified for MarkTxFatal") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *types.Transaction, common.Address) error); ok { + r0 = rf(_a0, _a1, _a2) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// mockTxStore_MarkTxFatal_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MarkTxFatal' +type mockTxStore_MarkTxFatal_Call struct { + *mock.Call +} + +// MarkTxFatal is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 *types.Transaction +// - _a2 common.Address +func (_e *mockTxStore_Expecter) MarkTxFatal(_a0 interface{}, _a1 interface{}, _a2 interface{}) *mockTxStore_MarkTxFatal_Call { + return &mockTxStore_MarkTxFatal_Call{Call: _e.mock.On("MarkTxFatal", _a0, _a1, _a2)} +} + +func (_c *mockTxStore_MarkTxFatal_Call) Run(run func(_a0 context.Context, _a1 *types.Transaction, _a2 common.Address)) *mockTxStore_MarkTxFatal_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*types.Transaction), args[2].(common.Address)) + }) + return _c +} + +func (_c *mockTxStore_MarkTxFatal_Call) Return(_a0 error) *mockTxStore_MarkTxFatal_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockTxStore_MarkTxFatal_Call) RunAndReturn(run func(context.Context, *types.Transaction, common.Address) error) *mockTxStore_MarkTxFatal_Call { + _c.Call.Return(run) + return _c +} + +// MarkUnconfirmedTransactionPurgeable provides a mock function with given fields: _a0, _a1, _a2 +func (_m *mockTxStore) MarkUnconfirmedTransactionPurgeable(_a0 context.Context, _a1 uint64, _a2 common.Address) error { + ret := _m.Called(_a0, _a1, _a2) + + if len(ret) == 0 { + panic("no return value specified for MarkUnconfirmedTransactionPurgeable") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, uint64, common.Address) error); ok { + r0 = rf(_a0, _a1, _a2) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// mockTxStore_MarkUnconfirmedTransactionPurgeable_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MarkUnconfirmedTransactionPurgeable' +type mockTxStore_MarkUnconfirmedTransactionPurgeable_Call struct { + *mock.Call +} + +// MarkUnconfirmedTransactionPurgeable is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 uint64 +// - _a2 common.Address +func (_e *mockTxStore_Expecter) MarkUnconfirmedTransactionPurgeable(_a0 interface{}, _a1 interface{}, _a2 interface{}) *mockTxStore_MarkUnconfirmedTransactionPurgeable_Call { + return &mockTxStore_MarkUnconfirmedTransactionPurgeable_Call{Call: _e.mock.On("MarkUnconfirmedTransactionPurgeable", _a0, _a1, _a2)} +} + +func (_c *mockTxStore_MarkUnconfirmedTransactionPurgeable_Call) Run(run func(_a0 context.Context, _a1 uint64, _a2 common.Address)) *mockTxStore_MarkUnconfirmedTransactionPurgeable_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64), args[2].(common.Address)) + }) + return _c +} + +func (_c *mockTxStore_MarkUnconfirmedTransactionPurgeable_Call) Return(_a0 error) *mockTxStore_MarkUnconfirmedTransactionPurgeable_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockTxStore_MarkUnconfirmedTransactionPurgeable_Call) RunAndReturn(run func(context.Context, uint64, common.Address) error) *mockTxStore_MarkUnconfirmedTransactionPurgeable_Call { + _c.Call.Return(run) + return _c +} + +// UpdateTransactionBroadcast provides a mock function with given fields: _a0, _a1, _a2, _a3, _a4 +func (_m *mockTxStore) UpdateTransactionBroadcast(_a0 context.Context, _a1 uint64, _a2 uint64, _a3 common.Hash, _a4 common.Address) error { + ret := _m.Called(_a0, _a1, _a2, _a3, _a4) + + if len(ret) == 0 { + panic("no return value specified for UpdateTransactionBroadcast") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, uint64, uint64, common.Hash, common.Address) error); ok { + r0 = rf(_a0, _a1, _a2, _a3, _a4) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// mockTxStore_UpdateTransactionBroadcast_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateTransactionBroadcast' +type mockTxStore_UpdateTransactionBroadcast_Call struct { + *mock.Call +} + +// UpdateTransactionBroadcast is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 uint64 +// - _a2 uint64 +// - _a3 common.Hash +// - _a4 common.Address +func (_e *mockTxStore_Expecter) UpdateTransactionBroadcast(_a0 interface{}, _a1 interface{}, _a2 interface{}, _a3 interface{}, _a4 interface{}) *mockTxStore_UpdateTransactionBroadcast_Call { + return &mockTxStore_UpdateTransactionBroadcast_Call{Call: _e.mock.On("UpdateTransactionBroadcast", _a0, _a1, _a2, _a3, _a4)} +} + +func (_c *mockTxStore_UpdateTransactionBroadcast_Call) Run(run func(_a0 context.Context, _a1 uint64, _a2 uint64, _a3 common.Hash, _a4 common.Address)) *mockTxStore_UpdateTransactionBroadcast_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64), args[2].(uint64), args[3].(common.Hash), args[4].(common.Address)) + }) + return _c +} + +func (_c *mockTxStore_UpdateTransactionBroadcast_Call) Return(_a0 error) *mockTxStore_UpdateTransactionBroadcast_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *mockTxStore_UpdateTransactionBroadcast_Call) RunAndReturn(run func(context.Context, uint64, uint64, common.Hash, common.Address) error) *mockTxStore_UpdateTransactionBroadcast_Call { + _c.Call.Return(run) + return _c +} + +// UpdateUnstartedTransactionWithNonce provides a mock function with given fields: _a0, _a1, _a2 +func (_m *mockTxStore) UpdateUnstartedTransactionWithNonce(_a0 context.Context, _a1 common.Address, _a2 uint64) (*types.Transaction, error) { + ret := _m.Called(_a0, _a1, _a2) + + if len(ret) == 0 { + panic("no return value specified for UpdateUnstartedTransactionWithNonce") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address, uint64) (*types.Transaction, error)); ok { + return rf(_a0, _a1, _a2) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address, uint64) *types.Transaction); ok { + r0 = rf(_a0, _a1, _a2) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address, uint64) error); ok { + r1 = rf(_a0, _a1, _a2) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// mockTxStore_UpdateUnstartedTransactionWithNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateUnstartedTransactionWithNonce' +type mockTxStore_UpdateUnstartedTransactionWithNonce_Call struct { + *mock.Call +} + +// UpdateUnstartedTransactionWithNonce is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 common.Address +// - _a2 uint64 +func (_e *mockTxStore_Expecter) UpdateUnstartedTransactionWithNonce(_a0 interface{}, _a1 interface{}, _a2 interface{}) *mockTxStore_UpdateUnstartedTransactionWithNonce_Call { + return &mockTxStore_UpdateUnstartedTransactionWithNonce_Call{Call: _e.mock.On("UpdateUnstartedTransactionWithNonce", _a0, _a1, _a2)} +} + +func (_c *mockTxStore_UpdateUnstartedTransactionWithNonce_Call) Run(run func(_a0 context.Context, _a1 common.Address, _a2 uint64)) *mockTxStore_UpdateUnstartedTransactionWithNonce_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Address), args[2].(uint64)) + }) + return _c +} + +func (_c *mockTxStore_UpdateUnstartedTransactionWithNonce_Call) Return(_a0 *types.Transaction, _a1 error) *mockTxStore_UpdateUnstartedTransactionWithNonce_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *mockTxStore_UpdateUnstartedTransactionWithNonce_Call) RunAndReturn(run func(context.Context, common.Address, uint64) (*types.Transaction, error)) *mockTxStore_UpdateUnstartedTransactionWithNonce_Call { + _c.Call.Return(run) + return _c +} + +// newMockTxStore creates a new instance of mockTxStore. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockTxStore(t interface { + mock.TestingT + Cleanup(func()) +}) *mockTxStore { + mock := &mockTxStore{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/core/chains/evm/txm/mocks/keystore.go b/core/chains/evm/txm/mocks/keystore.go deleted file mode 100644 index 3d11a6fa549..00000000000 --- a/core/chains/evm/txm/mocks/keystore.go +++ /dev/null @@ -1,98 +0,0 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. - -package mocks - -import ( - context "context" - big "math/big" - - common "github.com/ethereum/go-ethereum/common" - - mock "github.com/stretchr/testify/mock" -) - -// Keystore is an autogenerated mock type for the Keystore type -type Keystore struct { - mock.Mock -} - -type Keystore_Expecter struct { - mock *mock.Mock -} - -func (_m *Keystore) EXPECT() *Keystore_Expecter { - return &Keystore_Expecter{mock: &_m.Mock} -} - -// EnabledAddressesForChain provides a mock function with given fields: ctx, chainID -func (_m *Keystore) EnabledAddressesForChain(ctx context.Context, chainID *big.Int) ([]common.Address, error) { - ret := _m.Called(ctx, chainID) - - if len(ret) == 0 { - panic("no return value specified for EnabledAddressesForChain") - } - - var r0 []common.Address - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *big.Int) ([]common.Address, error)); ok { - return rf(ctx, chainID) - } - if rf, ok := ret.Get(0).(func(context.Context, *big.Int) []common.Address); ok { - r0 = rf(ctx, chainID) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]common.Address) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *big.Int) error); ok { - r1 = rf(ctx, chainID) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// Keystore_EnabledAddressesForChain_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EnabledAddressesForChain' -type Keystore_EnabledAddressesForChain_Call struct { - *mock.Call -} - -// EnabledAddressesForChain is a helper method to define mock.On call -// - ctx context.Context -// - chainID *big.Int -func (_e *Keystore_Expecter) EnabledAddressesForChain(ctx interface{}, chainID interface{}) *Keystore_EnabledAddressesForChain_Call { - return &Keystore_EnabledAddressesForChain_Call{Call: _e.mock.On("EnabledAddressesForChain", ctx, chainID)} -} - -func (_c *Keystore_EnabledAddressesForChain_Call) Run(run func(ctx context.Context, chainID *big.Int)) *Keystore_EnabledAddressesForChain_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*big.Int)) - }) - return _c -} - -func (_c *Keystore_EnabledAddressesForChain_Call) Return(addresses []common.Address, err error) *Keystore_EnabledAddressesForChain_Call { - _c.Call.Return(addresses, err) - return _c -} - -func (_c *Keystore_EnabledAddressesForChain_Call) RunAndReturn(run func(context.Context, *big.Int) ([]common.Address, error)) *Keystore_EnabledAddressesForChain_Call { - _c.Call.Return(run) - return _c -} - -// NewKeystore creates a new instance of Keystore. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewKeystore(t interface { - mock.TestingT - Cleanup(func()) -}) *Keystore { - mock := &Keystore{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/core/chains/evm/txm/mocks/tx_store.go b/core/chains/evm/txm/mocks/tx_store.go deleted file mode 100644 index 318b36942b8..00000000000 --- a/core/chains/evm/txm/mocks/tx_store.go +++ /dev/null @@ -1,647 +0,0 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. - -package mocks - -import ( - context "context" - - common "github.com/ethereum/go-ethereum/common" - - mock "github.com/stretchr/testify/mock" - - types "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txm/types" -) - -// TxStore is an autogenerated mock type for the TxStore type -type TxStore struct { - mock.Mock -} - -type TxStore_Expecter struct { - mock *mock.Mock -} - -func (_m *TxStore) EXPECT() *TxStore_Expecter { - return &TxStore_Expecter{mock: &_m.Mock} -} - -// AbandonPendingTransactions provides a mock function with given fields: _a0, _a1 -func (_m *TxStore) AbandonPendingTransactions(_a0 context.Context, _a1 common.Address) error { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for AbandonPendingTransactions") - } - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, common.Address) error); ok { - r0 = rf(_a0, _a1) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// TxStore_AbandonPendingTransactions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AbandonPendingTransactions' -type TxStore_AbandonPendingTransactions_Call struct { - *mock.Call -} - -// AbandonPendingTransactions is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 common.Address -func (_e *TxStore_Expecter) AbandonPendingTransactions(_a0 interface{}, _a1 interface{}) *TxStore_AbandonPendingTransactions_Call { - return &TxStore_AbandonPendingTransactions_Call{Call: _e.mock.On("AbandonPendingTransactions", _a0, _a1)} -} - -func (_c *TxStore_AbandonPendingTransactions_Call) Run(run func(_a0 context.Context, _a1 common.Address)) *TxStore_AbandonPendingTransactions_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(common.Address)) - }) - return _c -} - -func (_c *TxStore_AbandonPendingTransactions_Call) Return(_a0 error) *TxStore_AbandonPendingTransactions_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *TxStore_AbandonPendingTransactions_Call) RunAndReturn(run func(context.Context, common.Address) error) *TxStore_AbandonPendingTransactions_Call { - _c.Call.Return(run) - return _c -} - -// AppendAttemptToTransaction provides a mock function with given fields: _a0, _a1, _a2, _a3 -func (_m *TxStore) AppendAttemptToTransaction(_a0 context.Context, _a1 uint64, _a2 common.Address, _a3 *types.Attempt) error { - ret := _m.Called(_a0, _a1, _a2, _a3) - - if len(ret) == 0 { - panic("no return value specified for AppendAttemptToTransaction") - } - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, uint64, common.Address, *types.Attempt) error); ok { - r0 = rf(_a0, _a1, _a2, _a3) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// TxStore_AppendAttemptToTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AppendAttemptToTransaction' -type TxStore_AppendAttemptToTransaction_Call struct { - *mock.Call -} - -// AppendAttemptToTransaction is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 uint64 -// - _a2 common.Address -// - _a3 *types.Attempt -func (_e *TxStore_Expecter) AppendAttemptToTransaction(_a0 interface{}, _a1 interface{}, _a2 interface{}, _a3 interface{}) *TxStore_AppendAttemptToTransaction_Call { - return &TxStore_AppendAttemptToTransaction_Call{Call: _e.mock.On("AppendAttemptToTransaction", _a0, _a1, _a2, _a3)} -} - -func (_c *TxStore_AppendAttemptToTransaction_Call) Run(run func(_a0 context.Context, _a1 uint64, _a2 common.Address, _a3 *types.Attempt)) *TxStore_AppendAttemptToTransaction_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(uint64), args[2].(common.Address), args[3].(*types.Attempt)) - }) - return _c -} - -func (_c *TxStore_AppendAttemptToTransaction_Call) Return(_a0 error) *TxStore_AppendAttemptToTransaction_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *TxStore_AppendAttemptToTransaction_Call) RunAndReturn(run func(context.Context, uint64, common.Address, *types.Attempt) error) *TxStore_AppendAttemptToTransaction_Call { - _c.Call.Return(run) - return _c -} - -// CreateEmptyUnconfirmedTransaction provides a mock function with given fields: _a0, _a1, _a2, _a3 -func (_m *TxStore) CreateEmptyUnconfirmedTransaction(_a0 context.Context, _a1 common.Address, _a2 uint64, _a3 uint64) (*types.Transaction, error) { - ret := _m.Called(_a0, _a1, _a2, _a3) - - if len(ret) == 0 { - panic("no return value specified for CreateEmptyUnconfirmedTransaction") - } - - var r0 *types.Transaction - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, common.Address, uint64, uint64) (*types.Transaction, error)); ok { - return rf(_a0, _a1, _a2, _a3) - } - if rf, ok := ret.Get(0).(func(context.Context, common.Address, uint64, uint64) *types.Transaction); ok { - r0 = rf(_a0, _a1, _a2, _a3) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Transaction) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, common.Address, uint64, uint64) error); ok { - r1 = rf(_a0, _a1, _a2, _a3) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// TxStore_CreateEmptyUnconfirmedTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateEmptyUnconfirmedTransaction' -type TxStore_CreateEmptyUnconfirmedTransaction_Call struct { - *mock.Call -} - -// CreateEmptyUnconfirmedTransaction is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 common.Address -// - _a2 uint64 -// - _a3 uint64 -func (_e *TxStore_Expecter) CreateEmptyUnconfirmedTransaction(_a0 interface{}, _a1 interface{}, _a2 interface{}, _a3 interface{}) *TxStore_CreateEmptyUnconfirmedTransaction_Call { - return &TxStore_CreateEmptyUnconfirmedTransaction_Call{Call: _e.mock.On("CreateEmptyUnconfirmedTransaction", _a0, _a1, _a2, _a3)} -} - -func (_c *TxStore_CreateEmptyUnconfirmedTransaction_Call) Run(run func(_a0 context.Context, _a1 common.Address, _a2 uint64, _a3 uint64)) *TxStore_CreateEmptyUnconfirmedTransaction_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(common.Address), args[2].(uint64), args[3].(uint64)) - }) - return _c -} - -func (_c *TxStore_CreateEmptyUnconfirmedTransaction_Call) Return(_a0 *types.Transaction, _a1 error) *TxStore_CreateEmptyUnconfirmedTransaction_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *TxStore_CreateEmptyUnconfirmedTransaction_Call) RunAndReturn(run func(context.Context, common.Address, uint64, uint64) (*types.Transaction, error)) *TxStore_CreateEmptyUnconfirmedTransaction_Call { - _c.Call.Return(run) - return _c -} - -// CreateTransaction provides a mock function with given fields: _a0, _a1 -func (_m *TxStore) CreateTransaction(_a0 context.Context, _a1 *types.TxRequest) (*types.Transaction, error) { - ret := _m.Called(_a0, _a1) - - if len(ret) == 0 { - panic("no return value specified for CreateTransaction") - } - - var r0 *types.Transaction - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *types.TxRequest) (*types.Transaction, error)); ok { - return rf(_a0, _a1) - } - if rf, ok := ret.Get(0).(func(context.Context, *types.TxRequest) *types.Transaction); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Transaction) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, *types.TxRequest) error); ok { - r1 = rf(_a0, _a1) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// TxStore_CreateTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CreateTransaction' -type TxStore_CreateTransaction_Call struct { - *mock.Call -} - -// CreateTransaction is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *types.TxRequest -func (_e *TxStore_Expecter) CreateTransaction(_a0 interface{}, _a1 interface{}) *TxStore_CreateTransaction_Call { - return &TxStore_CreateTransaction_Call{Call: _e.mock.On("CreateTransaction", _a0, _a1)} -} - -func (_c *TxStore_CreateTransaction_Call) Run(run func(_a0 context.Context, _a1 *types.TxRequest)) *TxStore_CreateTransaction_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*types.TxRequest)) - }) - return _c -} - -func (_c *TxStore_CreateTransaction_Call) Return(_a0 *types.Transaction, _a1 error) *TxStore_CreateTransaction_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *TxStore_CreateTransaction_Call) RunAndReturn(run func(context.Context, *types.TxRequest) (*types.Transaction, error)) *TxStore_CreateTransaction_Call { - _c.Call.Return(run) - return _c -} - -// DeleteAttemptForUnconfirmedTx provides a mock function with given fields: _a0, _a1, _a2, _a3 -func (_m *TxStore) DeleteAttemptForUnconfirmedTx(_a0 context.Context, _a1 uint64, _a2 *types.Attempt, _a3 common.Address) error { - ret := _m.Called(_a0, _a1, _a2, _a3) - - if len(ret) == 0 { - panic("no return value specified for DeleteAttemptForUnconfirmedTx") - } - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, uint64, *types.Attempt, common.Address) error); ok { - r0 = rf(_a0, _a1, _a2, _a3) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// TxStore_DeleteAttemptForUnconfirmedTx_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteAttemptForUnconfirmedTx' -type TxStore_DeleteAttemptForUnconfirmedTx_Call struct { - *mock.Call -} - -// DeleteAttemptForUnconfirmedTx is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 uint64 -// - _a2 *types.Attempt -// - _a3 common.Address -func (_e *TxStore_Expecter) DeleteAttemptForUnconfirmedTx(_a0 interface{}, _a1 interface{}, _a2 interface{}, _a3 interface{}) *TxStore_DeleteAttemptForUnconfirmedTx_Call { - return &TxStore_DeleteAttemptForUnconfirmedTx_Call{Call: _e.mock.On("DeleteAttemptForUnconfirmedTx", _a0, _a1, _a2, _a3)} -} - -func (_c *TxStore_DeleteAttemptForUnconfirmedTx_Call) Run(run func(_a0 context.Context, _a1 uint64, _a2 *types.Attempt, _a3 common.Address)) *TxStore_DeleteAttemptForUnconfirmedTx_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(uint64), args[2].(*types.Attempt), args[3].(common.Address)) - }) - return _c -} - -func (_c *TxStore_DeleteAttemptForUnconfirmedTx_Call) Return(_a0 error) *TxStore_DeleteAttemptForUnconfirmedTx_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *TxStore_DeleteAttemptForUnconfirmedTx_Call) RunAndReturn(run func(context.Context, uint64, *types.Attempt, common.Address) error) *TxStore_DeleteAttemptForUnconfirmedTx_Call { - _c.Call.Return(run) - return _c -} - -// FetchUnconfirmedTransactionAtNonceWithCount provides a mock function with given fields: _a0, _a1, _a2 -func (_m *TxStore) FetchUnconfirmedTransactionAtNonceWithCount(_a0 context.Context, _a1 uint64, _a2 common.Address) (*types.Transaction, int, error) { - ret := _m.Called(_a0, _a1, _a2) - - if len(ret) == 0 { - panic("no return value specified for FetchUnconfirmedTransactionAtNonceWithCount") - } - - var r0 *types.Transaction - var r1 int - var r2 error - if rf, ok := ret.Get(0).(func(context.Context, uint64, common.Address) (*types.Transaction, int, error)); ok { - return rf(_a0, _a1, _a2) - } - if rf, ok := ret.Get(0).(func(context.Context, uint64, common.Address) *types.Transaction); ok { - r0 = rf(_a0, _a1, _a2) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Transaction) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, uint64, common.Address) int); ok { - r1 = rf(_a0, _a1, _a2) - } else { - r1 = ret.Get(1).(int) - } - - if rf, ok := ret.Get(2).(func(context.Context, uint64, common.Address) error); ok { - r2 = rf(_a0, _a1, _a2) - } else { - r2 = ret.Error(2) - } - - return r0, r1, r2 -} - -// TxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FetchUnconfirmedTransactionAtNonceWithCount' -type TxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call struct { - *mock.Call -} - -// FetchUnconfirmedTransactionAtNonceWithCount is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 uint64 -// - _a2 common.Address -func (_e *TxStore_Expecter) FetchUnconfirmedTransactionAtNonceWithCount(_a0 interface{}, _a1 interface{}, _a2 interface{}) *TxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call { - return &TxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call{Call: _e.mock.On("FetchUnconfirmedTransactionAtNonceWithCount", _a0, _a1, _a2)} -} - -func (_c *TxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call) Run(run func(_a0 context.Context, _a1 uint64, _a2 common.Address)) *TxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(uint64), args[2].(common.Address)) - }) - return _c -} - -func (_c *TxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call) Return(_a0 *types.Transaction, _a1 int, _a2 error) *TxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call { - _c.Call.Return(_a0, _a1, _a2) - return _c -} - -func (_c *TxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call) RunAndReturn(run func(context.Context, uint64, common.Address) (*types.Transaction, int, error)) *TxStore_FetchUnconfirmedTransactionAtNonceWithCount_Call { - _c.Call.Return(run) - return _c -} - -// MarkConfirmedAndReorgedTransactions provides a mock function with given fields: _a0, _a1, _a2 -func (_m *TxStore) MarkConfirmedAndReorgedTransactions(_a0 context.Context, _a1 uint64, _a2 common.Address) ([]*types.Transaction, []uint64, error) { - ret := _m.Called(_a0, _a1, _a2) - - if len(ret) == 0 { - panic("no return value specified for MarkConfirmedAndReorgedTransactions") - } - - var r0 []*types.Transaction - var r1 []uint64 - var r2 error - if rf, ok := ret.Get(0).(func(context.Context, uint64, common.Address) ([]*types.Transaction, []uint64, error)); ok { - return rf(_a0, _a1, _a2) - } - if rf, ok := ret.Get(0).(func(context.Context, uint64, common.Address) []*types.Transaction); ok { - r0 = rf(_a0, _a1, _a2) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]*types.Transaction) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, uint64, common.Address) []uint64); ok { - r1 = rf(_a0, _a1, _a2) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).([]uint64) - } - } - - if rf, ok := ret.Get(2).(func(context.Context, uint64, common.Address) error); ok { - r2 = rf(_a0, _a1, _a2) - } else { - r2 = ret.Error(2) - } - - return r0, r1, r2 -} - -// TxStore_MarkConfirmedAndReorgedTransactions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MarkConfirmedAndReorgedTransactions' -type TxStore_MarkConfirmedAndReorgedTransactions_Call struct { - *mock.Call -} - -// MarkConfirmedAndReorgedTransactions is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 uint64 -// - _a2 common.Address -func (_e *TxStore_Expecter) MarkConfirmedAndReorgedTransactions(_a0 interface{}, _a1 interface{}, _a2 interface{}) *TxStore_MarkConfirmedAndReorgedTransactions_Call { - return &TxStore_MarkConfirmedAndReorgedTransactions_Call{Call: _e.mock.On("MarkConfirmedAndReorgedTransactions", _a0, _a1, _a2)} -} - -func (_c *TxStore_MarkConfirmedAndReorgedTransactions_Call) Run(run func(_a0 context.Context, _a1 uint64, _a2 common.Address)) *TxStore_MarkConfirmedAndReorgedTransactions_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(uint64), args[2].(common.Address)) - }) - return _c -} - -func (_c *TxStore_MarkConfirmedAndReorgedTransactions_Call) Return(_a0 []*types.Transaction, _a1 []uint64, _a2 error) *TxStore_MarkConfirmedAndReorgedTransactions_Call { - _c.Call.Return(_a0, _a1, _a2) - return _c -} - -func (_c *TxStore_MarkConfirmedAndReorgedTransactions_Call) RunAndReturn(run func(context.Context, uint64, common.Address) ([]*types.Transaction, []uint64, error)) *TxStore_MarkConfirmedAndReorgedTransactions_Call { - _c.Call.Return(run) - return _c -} - -// MarkTxFatal provides a mock function with given fields: _a0, _a1, _a2 -func (_m *TxStore) MarkTxFatal(_a0 context.Context, _a1 *types.Transaction, _a2 common.Address) error { - ret := _m.Called(_a0, _a1, _a2) - - if len(ret) == 0 { - panic("no return value specified for MarkTxFatal") - } - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, *types.Transaction, common.Address) error); ok { - r0 = rf(_a0, _a1, _a2) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// TxStore_MarkTxFatal_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MarkTxFatal' -type TxStore_MarkTxFatal_Call struct { - *mock.Call -} - -// MarkTxFatal is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 *types.Transaction -// - _a2 common.Address -func (_e *TxStore_Expecter) MarkTxFatal(_a0 interface{}, _a1 interface{}, _a2 interface{}) *TxStore_MarkTxFatal_Call { - return &TxStore_MarkTxFatal_Call{Call: _e.mock.On("MarkTxFatal", _a0, _a1, _a2)} -} - -func (_c *TxStore_MarkTxFatal_Call) Run(run func(_a0 context.Context, _a1 *types.Transaction, _a2 common.Address)) *TxStore_MarkTxFatal_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(*types.Transaction), args[2].(common.Address)) - }) - return _c -} - -func (_c *TxStore_MarkTxFatal_Call) Return(_a0 error) *TxStore_MarkTxFatal_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *TxStore_MarkTxFatal_Call) RunAndReturn(run func(context.Context, *types.Transaction, common.Address) error) *TxStore_MarkTxFatal_Call { - _c.Call.Return(run) - return _c -} - -// MarkUnconfirmedTransactionPurgeable provides a mock function with given fields: _a0, _a1, _a2 -func (_m *TxStore) MarkUnconfirmedTransactionPurgeable(_a0 context.Context, _a1 uint64, _a2 common.Address) error { - ret := _m.Called(_a0, _a1, _a2) - - if len(ret) == 0 { - panic("no return value specified for MarkUnconfirmedTransactionPurgeable") - } - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, uint64, common.Address) error); ok { - r0 = rf(_a0, _a1, _a2) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// TxStore_MarkUnconfirmedTransactionPurgeable_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MarkUnconfirmedTransactionPurgeable' -type TxStore_MarkUnconfirmedTransactionPurgeable_Call struct { - *mock.Call -} - -// MarkUnconfirmedTransactionPurgeable is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 uint64 -// - _a2 common.Address -func (_e *TxStore_Expecter) MarkUnconfirmedTransactionPurgeable(_a0 interface{}, _a1 interface{}, _a2 interface{}) *TxStore_MarkUnconfirmedTransactionPurgeable_Call { - return &TxStore_MarkUnconfirmedTransactionPurgeable_Call{Call: _e.mock.On("MarkUnconfirmedTransactionPurgeable", _a0, _a1, _a2)} -} - -func (_c *TxStore_MarkUnconfirmedTransactionPurgeable_Call) Run(run func(_a0 context.Context, _a1 uint64, _a2 common.Address)) *TxStore_MarkUnconfirmedTransactionPurgeable_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(uint64), args[2].(common.Address)) - }) - return _c -} - -func (_c *TxStore_MarkUnconfirmedTransactionPurgeable_Call) Return(_a0 error) *TxStore_MarkUnconfirmedTransactionPurgeable_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *TxStore_MarkUnconfirmedTransactionPurgeable_Call) RunAndReturn(run func(context.Context, uint64, common.Address) error) *TxStore_MarkUnconfirmedTransactionPurgeable_Call { - _c.Call.Return(run) - return _c -} - -// UpdateTransactionBroadcast provides a mock function with given fields: _a0, _a1, _a2, _a3, _a4 -func (_m *TxStore) UpdateTransactionBroadcast(_a0 context.Context, _a1 uint64, _a2 uint64, _a3 common.Hash, _a4 common.Address) error { - ret := _m.Called(_a0, _a1, _a2, _a3, _a4) - - if len(ret) == 0 { - panic("no return value specified for UpdateTransactionBroadcast") - } - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, uint64, uint64, common.Hash, common.Address) error); ok { - r0 = rf(_a0, _a1, _a2, _a3, _a4) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// TxStore_UpdateTransactionBroadcast_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateTransactionBroadcast' -type TxStore_UpdateTransactionBroadcast_Call struct { - *mock.Call -} - -// UpdateTransactionBroadcast is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 uint64 -// - _a2 uint64 -// - _a3 common.Hash -// - _a4 common.Address -func (_e *TxStore_Expecter) UpdateTransactionBroadcast(_a0 interface{}, _a1 interface{}, _a2 interface{}, _a3 interface{}, _a4 interface{}) *TxStore_UpdateTransactionBroadcast_Call { - return &TxStore_UpdateTransactionBroadcast_Call{Call: _e.mock.On("UpdateTransactionBroadcast", _a0, _a1, _a2, _a3, _a4)} -} - -func (_c *TxStore_UpdateTransactionBroadcast_Call) Run(run func(_a0 context.Context, _a1 uint64, _a2 uint64, _a3 common.Hash, _a4 common.Address)) *TxStore_UpdateTransactionBroadcast_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(uint64), args[2].(uint64), args[3].(common.Hash), args[4].(common.Address)) - }) - return _c -} - -func (_c *TxStore_UpdateTransactionBroadcast_Call) Return(_a0 error) *TxStore_UpdateTransactionBroadcast_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *TxStore_UpdateTransactionBroadcast_Call) RunAndReturn(run func(context.Context, uint64, uint64, common.Hash, common.Address) error) *TxStore_UpdateTransactionBroadcast_Call { - _c.Call.Return(run) - return _c -} - -// UpdateUnstartedTransactionWithNonce provides a mock function with given fields: _a0, _a1, _a2 -func (_m *TxStore) UpdateUnstartedTransactionWithNonce(_a0 context.Context, _a1 common.Address, _a2 uint64) (*types.Transaction, error) { - ret := _m.Called(_a0, _a1, _a2) - - if len(ret) == 0 { - panic("no return value specified for UpdateUnstartedTransactionWithNonce") - } - - var r0 *types.Transaction - var r1 error - if rf, ok := ret.Get(0).(func(context.Context, common.Address, uint64) (*types.Transaction, error)); ok { - return rf(_a0, _a1, _a2) - } - if rf, ok := ret.Get(0).(func(context.Context, common.Address, uint64) *types.Transaction); ok { - r0 = rf(_a0, _a1, _a2) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Transaction) - } - } - - if rf, ok := ret.Get(1).(func(context.Context, common.Address, uint64) error); ok { - r1 = rf(_a0, _a1, _a2) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// TxStore_UpdateUnstartedTransactionWithNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateUnstartedTransactionWithNonce' -type TxStore_UpdateUnstartedTransactionWithNonce_Call struct { - *mock.Call -} - -// UpdateUnstartedTransactionWithNonce is a helper method to define mock.On call -// - _a0 context.Context -// - _a1 common.Address -// - _a2 uint64 -func (_e *TxStore_Expecter) UpdateUnstartedTransactionWithNonce(_a0 interface{}, _a1 interface{}, _a2 interface{}) *TxStore_UpdateUnstartedTransactionWithNonce_Call { - return &TxStore_UpdateUnstartedTransactionWithNonce_Call{Call: _e.mock.On("UpdateUnstartedTransactionWithNonce", _a0, _a1, _a2)} -} - -func (_c *TxStore_UpdateUnstartedTransactionWithNonce_Call) Run(run func(_a0 context.Context, _a1 common.Address, _a2 uint64)) *TxStore_UpdateUnstartedTransactionWithNonce_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(common.Address), args[2].(uint64)) - }) - return _c -} - -func (_c *TxStore_UpdateUnstartedTransactionWithNonce_Call) Return(_a0 *types.Transaction, _a1 error) *TxStore_UpdateUnstartedTransactionWithNonce_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *TxStore_UpdateUnstartedTransactionWithNonce_Call) RunAndReturn(run func(context.Context, common.Address, uint64) (*types.Transaction, error)) *TxStore_UpdateUnstartedTransactionWithNonce_Call { - _c.Call.Return(run) - return _c -} - -// NewTxStore creates a new instance of TxStore. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewTxStore(t interface { - mock.TestingT - Cleanup(func()) -}) *TxStore { - mock := &TxStore{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/core/chains/evm/txm/txm_test.go b/core/chains/evm/txm/txm_test.go index 7b5e5bdd702..13b987000ed 100644 --- a/core/chains/evm/txm/txm_test.go +++ b/core/chains/evm/txm/txm_test.go @@ -19,7 +19,6 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/gas" "github.com/smartcontractkit/chainlink-integrations/evm/testutils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txm/mocks" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txm/storage" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txm/types" ) @@ -27,13 +26,13 @@ import ( func TestLifecycle(t *testing.T) { t.Parallel() - client := mocks.NewClient(t) - ab := mocks.NewAttemptBuilder(t) + client := newMockClient(t) + ab := newMockAttemptBuilder(t) address1 := testutils.NewAddress() address2 := testutils.NewAddress() assert.NotEqual(t, address1, address2) addresses := []common.Address{address1, address2} - keystore := mocks.NewKeystore(t) + keystore := newMockKeystore(t) t.Run("retries if initial pending nonce call fails", func(t *testing.T) { lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) @@ -73,7 +72,7 @@ func TestTrigger(t *testing.T) { t.Parallel() address := testutils.NewAddress() - keystore := mocks.NewKeystore(t) + keystore := newMockKeystore(t) t.Run("Trigger fails if Txm is unstarted", func(t *testing.T) { lggr, observedLogs := logger.TestObserved(t, zap.ErrorLevel) txm := NewTxm(lggr, nil, nil, nil, nil, nil, Config{}, keystore) @@ -85,8 +84,8 @@ func TestTrigger(t *testing.T) { lggr := logger.Test(t) txStore := storage.NewInMemoryStoreManager(lggr, testutils.FixtureChainID) require.NoError(t, txStore.Add(address)) - client := mocks.NewClient(t) - ab := mocks.NewAttemptBuilder(t) + client := newMockClient(t) + ab := newMockAttemptBuilder(t) config := Config{BlockTime: 1 * time.Minute, RetryBlockThreshold: 10} keystore.On("EnabledAddressesForChain", mock.Anything, mock.Anything).Return([]common.Address{address}, nil) txm := NewTxm(lggr, testutils.FixtureChainID, client, ab, txStore, nil, config, keystore) @@ -102,14 +101,14 @@ func TestBroadcastTransaction(t *testing.T) { t.Parallel() ctx := tests.Context(t) - client := mocks.NewClient(t) - ab := mocks.NewAttemptBuilder(t) + client := newMockClient(t) + ab := newMockAttemptBuilder(t) config := Config{} address := testutils.NewAddress() - keystore := mocks.NewKeystore(t) + keystore := newMockKeystore(t) t.Run("fails if FetchUnconfirmedTransactionAtNonceWithCount for unconfirmed transactions fails", func(t *testing.T) { - mTxStore := mocks.NewTxStore(t) + mTxStore := newMockTxStore(t) mTxStore.On("FetchUnconfirmedTransactionAtNonceWithCount", mock.Anything, mock.Anything, mock.Anything).Return(nil, 0, errors.New("call failed")).Once() txm := NewTxm(logger.Test(t), testutils.FixtureChainID, client, ab, mTxStore, nil, config, keystore) bo, err := txm.broadcastTransaction(ctx, address) @@ -120,7 +119,7 @@ func TestBroadcastTransaction(t *testing.T) { t.Run("throws a warning and returns if unconfirmed transactions exceed maxInFlightTransactions", func(t *testing.T) { lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) - mTxStore := mocks.NewTxStore(t) + mTxStore := newMockTxStore(t) mTxStore.On("FetchUnconfirmedTransactionAtNonceWithCount", mock.Anything, mock.Anything, mock.Anything).Return(nil, maxInFlightTransactions+1, nil).Once() txm := NewTxm(lggr, testutils.FixtureChainID, client, ab, mTxStore, nil, config, keystore) bo, err := txm.broadcastTransaction(ctx, address) @@ -131,7 +130,7 @@ func TestBroadcastTransaction(t *testing.T) { t.Run("checks pending nonce if unconfirmed transactions are equal or more than maxInFlightSubset", func(t *testing.T) { lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) - mTxStore := mocks.NewTxStore(t) + mTxStore := newMockTxStore(t) txm := NewTxm(lggr, testutils.FixtureChainID, client, ab, mTxStore, nil, config, keystore) txm.setNonce(address, 1) mTxStore.On("FetchUnconfirmedTransactionAtNonceWithCount", mock.Anything, mock.Anything, mock.Anything).Return(nil, maxInFlightSubset, nil).Twice() @@ -150,7 +149,7 @@ func TestBroadcastTransaction(t *testing.T) { }) t.Run("fails if UpdateUnstartedTransactionWithNonce fails", func(t *testing.T) { - mTxStore := mocks.NewTxStore(t) + mTxStore := newMockTxStore(t) mTxStore.On("FetchUnconfirmedTransactionAtNonceWithCount", mock.Anything, mock.Anything, mock.Anything).Return(nil, 0, nil).Once() txm := NewTxm(logger.Test(t), testutils.FixtureChainID, client, ab, mTxStore, nil, config, keystore) mTxStore.On("UpdateUnstartedTransactionWithNonce", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("call failed")).Once() @@ -217,12 +216,12 @@ func TestBackfillTransactions(t *testing.T) { t.Parallel() ctx := tests.Context(t) - client := mocks.NewClient(t) - ab := mocks.NewAttemptBuilder(t) - txStore := mocks.NewTxStore(t) + client := newMockClient(t) + ab := newMockAttemptBuilder(t) + txStore := newMockTxStore(t) config := Config{} address := testutils.NewAddress() - keystore := mocks.NewKeystore(t) + keystore := newMockKeystore(t) t.Run("fails if latest nonce fetching fails", func(t *testing.T) { txm := NewTxm(logger.Test(t), testutils.FixtureChainID, client, ab, txStore, nil, config, keystore) @@ -248,7 +247,7 @@ func TestBackfillTransactions(t *testing.T) { lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) txStore := storage.NewInMemoryStoreManager(lggr, testutils.FixtureChainID) require.NoError(t, txStore.Add(address)) - ab := mocks.NewAttemptBuilder(t) + ab := newMockAttemptBuilder(t) c := Config{EIP1559: false, BlockTime: 10 * time.Minute, RetryBlockThreshold: 10, EmptyTxLimitDefault: 22000} txm := NewTxm(lggr, testutils.FixtureChainID, client, ab, txStore, nil, c, keystore) emptyMetrics, err := NewTxmMetrics(testutils.FixtureChainID) @@ -290,7 +289,7 @@ func TestBackfillTransactions(t *testing.T) { lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel) txStore := storage.NewInMemoryStoreManager(lggr, testutils.FixtureChainID) require.NoError(t, txStore.Add(address)) - ab := mocks.NewAttemptBuilder(t) + ab := newMockAttemptBuilder(t) c := Config{EIP1559: false, BlockTime: 1 * time.Second, RetryBlockThreshold: 1, EmptyTxLimitDefault: 22000} txm := NewTxm(lggr, testutils.FixtureChainID, client, ab, txStore, nil, c, keystore) emptyMetrics, err := NewTxmMetrics(testutils.FixtureChainID) From 37d65f78487e702803a213b42dc330c24107a80a Mon Sep 17 00:00:00 2001 From: Erik Burton Date: Mon, 24 Feb 2025 16:35:34 -0800 Subject: [PATCH 47/58] chore: goreleaser workflow maintanence (#16551) --- .../goreleaser-build-sign-publish/action.yml | 16 ++++++---------- .github/workflows/build-publish-develop-pr.yml | 4 ++++ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/actions/goreleaser-build-sign-publish/action.yml b/.github/actions/goreleaser-build-sign-publish/action.yml index dcf21844e3d..0c7c05fe618 100644 --- a/.github/actions/goreleaser-build-sign-publish/action.yml +++ b/.github/actions/goreleaser-build-sign-publish/action.yml @@ -19,7 +19,7 @@ inputs: required: false # goreleaser inputs goreleaser-release-type: - description: The goreleaser release type, it can be either "nightly", "merge", "snapshot", "release" + description: The goreleaser release type, it can be either "nightly", "merge", "snapshot", "release" default: "snapshot" required: false goreleaser-config: @@ -33,22 +33,18 @@ inputs: buildkit debug information, and goreleaser debug, etc. required: false default: "${{ runner.debug == '1' }}" - + runs: using: composite steps: - - # We need QEMU to test the cross architecture builds after they're built. - name: Set up QEMU - uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3.2.0 + - # We need QEMU to test the cross architecture builds after they're built. + name: Set up QEMU + uses: docker/setup-qemu-action@4574d27a4764455b42196d70a065bc6853246a25 # v3.4.0 - name: Setup docker buildx - uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3.7.0 + uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0 with: buildkitd-flags: ${{ inputs.enable-debug == 'true' && '--debug' || '' }} - # v0.16.0 until grpc fix is released - # see: https://github.com/docker/buildx/issues/2789#issuecomment-2487981922 - driver-opts: | - image=moby/buildkit:v0.16.0 - name: Set up Go uses: ./.github/actions/setup-go diff --git a/.github/workflows/build-publish-develop-pr.yml b/.github/workflows/build-publish-develop-pr.yml index f870d12d900..9f918541673 100644 --- a/.github/workflows/build-publish-develop-pr.yml +++ b/.github/workflows/build-publish-develop-pr.yml @@ -23,6 +23,10 @@ on: required: false default: "false" +concurrency: + group: "build-publish-${{ github.ref_name }}-${{ github.sha }}" + cancel-in-progress: true + env: # Use github.sha here otherwise a race condition exists if # a commit is pushed to develop before merge is run. From 3b8d0ade3019dfe82be34dbeb3b7ae3b5ee121e0 Mon Sep 17 00:00:00 2001 From: nogo <110664798+0xnogo@users.noreply.github.com> Date: Tue, 25 Feb 2025 13:02:41 +0400 Subject: [PATCH 48/58] Add finality level to ExecutedMessages integration tests (#16516) * add finality level to ExecutedMessages * bump * bump cl-ccip * merge * bump * final cl-ccip commit --- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 ++-- deployment/go.mod | 2 +- deployment/go.sum | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 ++-- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 ++-- integration-tests/smoke/ccip/ccip_reader_test.go | 3 +++ system-tests/lib/go.mod | 2 +- system-tests/lib/go.sum | 4 ++-- system-tests/tests/go.mod | 2 +- system-tests/tests/go.sum | 4 ++-- 15 files changed, 24 insertions(+), 21 deletions(-) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 1db0b021428..be733c75ea8 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -340,7 +340,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index b4e4f8abb1a..0dfd90507fd 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1086,8 +1086,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 h1:XUz6jj+pPIvRbmlalXyFf6O0hGicU8thQtjFvw7dPLo= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b h1:NRkuA25iJoNBmykOM5BelkLAxMcTSQ86EE76xw18d+o= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= diff --git a/deployment/go.mod b/deployment/go.mod index 2fa4e14ef63..b1b38e1b9cc 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -30,7 +30,7 @@ require ( github.com/sethvargo/go-retry v0.2.4 github.com/smartcontractkit/ccip-owner-contracts v0.1.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb diff --git a/deployment/go.sum b/deployment/go.sum index f5125d641fc..ba7603aeea9 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1134,8 +1134,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 h1:XUz6jj+pPIvRbmlalXyFf6O0hGicU8thQtjFvw7dPLo= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b h1:NRkuA25iJoNBmykOM5BelkLAxMcTSQ86EE76xw18d+o= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= diff --git a/go.mod b/go.mod index b257bdecab1..a3e2b92e010 100644 --- a/go.mod +++ b/go.mod @@ -76,7 +76,7 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 diff --git a/go.sum b/go.sum index b9fe39601a3..657608765d4 100644 --- a/go.sum +++ b/go.sum @@ -1018,8 +1018,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 h1:XUz6jj+pPIvRbmlalXyFf6O0hGicU8thQtjFvw7dPLo= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b h1:NRkuA25iJoNBmykOM5BelkLAxMcTSQ86EE76xw18d+o= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 072af129c63..fd7dba615d6 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -46,7 +46,7 @@ require ( github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index dd2bac1d964..4fbb2e605c9 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1384,8 +1384,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 h1:XUz6jj+pPIvRbmlalXyFf6O0hGicU8thQtjFvw7dPLo= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b h1:NRkuA25iJoNBmykOM5BelkLAxMcTSQ86EE76xw18d+o= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 2e7558cce85..200b901564c 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -28,7 +28,7 @@ require ( github.com/rs/zerolog v1.33.0 github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index f45501304d7..647d2dc4037 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1369,8 +1369,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 h1:XUz6jj+pPIvRbmlalXyFf6O0hGicU8thQtjFvw7dPLo= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b h1:NRkuA25iJoNBmykOM5BelkLAxMcTSQ86EE76xw18d+o= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= diff --git a/integration-tests/smoke/ccip/ccip_reader_test.go b/integration-tests/smoke/ccip/ccip_reader_test.go index 2023ca184fb..b95f543fcd0 100644 --- a/integration-tests/smoke/ccip/ccip_reader_test.go +++ b/integration-tests/smoke/ccip/ccip_reader_test.go @@ -37,6 +37,7 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-ccip/plugintypes" "github.com/smartcontractkit/chainlink-common/pkg/types" + "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-integrations/evm/assets" @@ -594,6 +595,7 @@ func TestCCIPReader_ExecutedMessages(t *testing.T) { ctx, chainS1, cciptypes.NewSeqNumRange(14, 15), + primitives.Unconfirmed, ) require.NoError(t, err) return len(executedMsgs) == 2 @@ -1458,6 +1460,7 @@ func benchmarkExecutedMessages(b *testing.B, logsInsertedFirst int, startSeqNum, ctx, chainS1, cciptypes.NewSeqNumRange(startSeqNum, endSeqNum), + primitives.Unconfirmed, ) require.NoError(b, err) require.Len(b, executedRanges, expectedRangeLen) diff --git a/system-tests/lib/go.mod b/system-tests/lib/go.mod index 815fe491643..eec05235bef 100644 --- a/system-tests/lib/go.mod +++ b/system-tests/lib/go.mod @@ -338,7 +338,7 @@ require ( github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect diff --git a/system-tests/lib/go.sum b/system-tests/lib/go.sum index 22041e117e8..5af490cdeef 100644 --- a/system-tests/lib/go.sum +++ b/system-tests/lib/go.sum @@ -1122,8 +1122,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 h1:XUz6jj+pPIvRbmlalXyFf6O0hGicU8thQtjFvw7dPLo= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b h1:NRkuA25iJoNBmykOM5BelkLAxMcTSQ86EE76xw18d+o= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= diff --git a/system-tests/tests/go.mod b/system-tests/tests/go.mod index be753da2e5c..b2333c945d6 100644 --- a/system-tests/tests/go.mod +++ b/system-tests/tests/go.mod @@ -341,7 +341,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect diff --git a/system-tests/tests/go.sum b/system-tests/tests/go.sum index 7a02d902f03..b0eca008a20 100644 --- a/system-tests/tests/go.sum +++ b/system-tests/tests/go.sum @@ -1122,8 +1122,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512 h1:XUz6jj+pPIvRbmlalXyFf6O0hGicU8thQtjFvw7dPLo= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250224184104-b25011bb3512/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b h1:NRkuA25iJoNBmykOM5BelkLAxMcTSQ86EE76xw18d+o= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= From b553195681782b3c7c46f04011f0bf73f71bb24e Mon Sep 17 00:00:00 2001 From: Lukasz <120112546+lukaszcl@users.noreply.github.com> Date: Tue, 25 Feb 2025 12:14:24 +0100 Subject: [PATCH 49/58] Bump E2E test workflow (#16536) * Bump workflow * bump * Bump --- .github/workflows/automation-benchmark-tests.yml | 2 +- .github/workflows/automation-load-tests.yml | 2 +- .github/workflows/automation-nightly-tests.yml | 2 +- .github/workflows/automation-ondemand-tests.yml | 2 +- .github/workflows/ccip-load-tests.yml | 2 +- .github/workflows/integration-chaos-tests.yml | 4 ++-- .github/workflows/integration-in-memory-tests.yml | 2 +- .github/workflows/integration-tests.yml | 10 +++++----- .github/workflows/on-demand-ocr-soak-test.yml | 2 +- .github/workflows/on-demand-vrfv2-performance-test.yml | 2 +- .github/workflows/on-demand-vrfv2-smoke-tests.yml | 2 +- .../workflows/on-demand-vrfv2plus-performance-test.yml | 2 +- .github/workflows/on-demand-vrfv2plus-smoke-tests.yml | 2 +- .github/workflows/run-nightly-e2e-tests.yml | 2 +- .github/workflows/run-selected-e2e-tests.yml | 2 +- 15 files changed, 20 insertions(+), 20 deletions(-) diff --git a/.github/workflows/automation-benchmark-tests.yml b/.github/workflows/automation-benchmark-tests.yml index be0d2c6de32..85fc74d391a 100644 --- a/.github/workflows/automation-benchmark-tests.yml +++ b/.github/workflows/automation-benchmark-tests.yml @@ -28,7 +28,7 @@ on: jobs: run-e2e-tests-workflow: name: Run E2E Tests - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 with: test_path: .github/e2e-tests.yml test_ids: '${{ inputs.testType }}/automation_test.go:TestAutomationBenchmark' diff --git a/.github/workflows/automation-load-tests.yml b/.github/workflows/automation-load-tests.yml index 5f844ee2c40..e1c44155169 100644 --- a/.github/workflows/automation-load-tests.yml +++ b/.github/workflows/automation-load-tests.yml @@ -23,7 +23,7 @@ on: jobs: run-e2e-tests-workflow: name: Run E2E Tests - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 with: test_path: .github/e2e-tests.yml test_ids: 'load/automationv2_1/automationv2_1_test.go:TestLogTrigger' diff --git a/.github/workflows/automation-nightly-tests.yml b/.github/workflows/automation-nightly-tests.yml index 8b86a354157..f5917a8f0a7 100644 --- a/.github/workflows/automation-nightly-tests.yml +++ b/.github/workflows/automation-nightly-tests.yml @@ -10,7 +10,7 @@ on: jobs: run-e2e-tests-workflow: name: Run E2E Tests - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 with: test_path: .github/e2e-tests.yml test_trigger: Automation Nightly Tests diff --git a/.github/workflows/automation-ondemand-tests.yml b/.github/workflows/automation-ondemand-tests.yml index cbc59e022f6..3084bd5d72a 100644 --- a/.github/workflows/automation-ondemand-tests.yml +++ b/.github/workflows/automation-ondemand-tests.yml @@ -168,7 +168,7 @@ jobs: call-run-e2e-tests-workflow: name: Run E2E Tests needs: set-tests-to-run - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 with: test_path: .github/e2e-tests.yml test_list: ${{ needs.set-tests-to-run.outputs.test_list }} diff --git a/.github/workflows/ccip-load-tests.yml b/.github/workflows/ccip-load-tests.yml index a9689f3ae26..2334e9b48d5 100644 --- a/.github/workflows/ccip-load-tests.yml +++ b/.github/workflows/ccip-load-tests.yml @@ -37,7 +37,7 @@ concurrency: jobs: run-e2e-tests-workflow: name: Run E2E Tests - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 with: test_path: .github/e2e-tests.yml test_trigger: E2E CCIP Load Tests diff --git a/.github/workflows/integration-chaos-tests.yml b/.github/workflows/integration-chaos-tests.yml index 6018422ec0a..4850aeb10a3 100644 --- a/.github/workflows/integration-chaos-tests.yml +++ b/.github/workflows/integration-chaos-tests.yml @@ -15,7 +15,7 @@ on: jobs: run-e2e-tests-workflow-dispatch: name: Run E2E Tests (Workflow Dispatch) - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 if: github.event_name == 'workflow_dispatch' with: test_path: .github/e2e-tests.yml @@ -48,7 +48,7 @@ jobs: run-e2e-tests-workflow: name: Run E2E Tests (Push and Sechedule) - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 if: github.event_name != 'workflow_dispatch' with: test_path: .github/e2e-tests.yml diff --git a/.github/workflows/integration-in-memory-tests.yml b/.github/workflows/integration-in-memory-tests.yml index 2477da35430..dcbe988693d 100644 --- a/.github/workflows/integration-in-memory-tests.yml +++ b/.github/workflows/integration-in-memory-tests.yml @@ -74,7 +74,7 @@ jobs: contents: read needs: changes if: github.event_name == 'pull_request' && ( needs.changes.outputs.ccip_changes == 'true' || needs.changes.outputs.core_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true') - uses: smartcontractkit/.github/.github/workflows/run-integration-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-integration-tests.yml@bb2d725fba3a42858bcb91e816987ca7cd063488 with: workflow_name: Run CCIP Integration Tests For PR test_path: .github/integration-in-memory-tests.yml diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 442117e1270..189067ca7f5 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -183,7 +183,7 @@ jobs: contents: read needs: [build-chainlink, changes] if: github.event_name == 'pull_request' && ( needs.changes.outputs.keystone_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true') - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@18ee2276811ff4ad56a2284590c9917bec33b748 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 with: workflow_name: Run Core Workflow Engine Tests For PR chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.sha }} @@ -224,7 +224,7 @@ jobs: contents: read needs: [build-chainlink, changes] if: github.event_name == 'pull_request' && ( needs.changes.outputs.core_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true') - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@18ee2276811ff4ad56a2284590c9917bec33b748 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 with: workflow_name: Run Core E2E Tests For PR chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.sha }} @@ -263,7 +263,7 @@ jobs: contents: read needs: [build-chainlink, changes] if: github.event_name == 'merge_group' && ( needs.changes.outputs.core_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true') - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@18ee2276811ff4ad56a2284590c9917bec33b748 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 with: workflow_name: Run Core E2E Tests For Merge Queue chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.sha }} @@ -306,7 +306,7 @@ jobs: contents: read needs: [build-chainlink, changes] if: github.event_name == 'pull_request' && (needs.changes.outputs.ccip_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true') - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@18ee2276811ff4ad56a2284590c9917bec33b748 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 with: workflow_name: Run CCIP E2E Tests For PR chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.sha }} @@ -348,7 +348,7 @@ jobs: contents: read needs: [build-chainlink, changes] if: github.event_name == 'merge_group' && (needs.changes.outputs.ccip_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true') - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@18ee2276811ff4ad56a2284590c9917bec33b748 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 with: workflow_name: Run CCIP E2E Tests For Merge Queue chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.sha }} diff --git a/.github/workflows/on-demand-ocr-soak-test.yml b/.github/workflows/on-demand-ocr-soak-test.yml index 587847b8279..9b40335b13a 100644 --- a/.github/workflows/on-demand-ocr-soak-test.yml +++ b/.github/workflows/on-demand-ocr-soak-test.yml @@ -43,7 +43,7 @@ on: jobs: run-e2e-tests-workflow: name: Run E2E Tests - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 with: test_path: .github/e2e-tests.yml test_ids: ${{ inputs.testToRun}} diff --git a/.github/workflows/on-demand-vrfv2-performance-test.yml b/.github/workflows/on-demand-vrfv2-performance-test.yml index 7d9ae353a20..7e72aeaffd3 100644 --- a/.github/workflows/on-demand-vrfv2-performance-test.yml +++ b/.github/workflows/on-demand-vrfv2-performance-test.yml @@ -71,7 +71,7 @@ jobs: run-e2e-tests-workflow: name: Run E2E Tests needs: set-tests-to-run - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 with: custom_test_list_json: ${{ needs.set-tests-to-run.outputs.test_list }} chainlink_version: ${{ inputs.chainlink_version }} diff --git a/.github/workflows/on-demand-vrfv2-smoke-tests.yml b/.github/workflows/on-demand-vrfv2-smoke-tests.yml index 7663e44611f..99a8cee64ad 100644 --- a/.github/workflows/on-demand-vrfv2-smoke-tests.yml +++ b/.github/workflows/on-demand-vrfv2-smoke-tests.yml @@ -74,7 +74,7 @@ jobs: run-e2e-tests-workflow: name: Run E2E Tests needs: set-tests-to-run - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 with: custom_test_list_json: ${{ needs.set-tests-to-run.outputs.test_list }} chainlink_version: ${{ inputs.chainlink_version }} diff --git a/.github/workflows/on-demand-vrfv2plus-performance-test.yml b/.github/workflows/on-demand-vrfv2plus-performance-test.yml index aa853e40e79..835abfe8f48 100644 --- a/.github/workflows/on-demand-vrfv2plus-performance-test.yml +++ b/.github/workflows/on-demand-vrfv2plus-performance-test.yml @@ -71,7 +71,7 @@ jobs: run-e2e-tests-workflow: name: Run E2E Tests needs: set-tests-to-run - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 with: custom_test_list_json: ${{ needs.set-tests-to-run.outputs.test_list }} chainlink_version: ${{ inputs.chainlink_version }} diff --git a/.github/workflows/on-demand-vrfv2plus-smoke-tests.yml b/.github/workflows/on-demand-vrfv2plus-smoke-tests.yml index a87cf373801..fec3b1b51d9 100644 --- a/.github/workflows/on-demand-vrfv2plus-smoke-tests.yml +++ b/.github/workflows/on-demand-vrfv2plus-smoke-tests.yml @@ -74,7 +74,7 @@ jobs: run-e2e-tests-workflow: name: Run E2E Tests needs: set-tests-to-run - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 with: custom_test_list_json: ${{ needs.set-tests-to-run.outputs.test_list }} chainlink_version: ${{ inputs.chainlink_version }} diff --git a/.github/workflows/run-nightly-e2e-tests.yml b/.github/workflows/run-nightly-e2e-tests.yml index 066ac9e1057..35339915599 100644 --- a/.github/workflows/run-nightly-e2e-tests.yml +++ b/.github/workflows/run-nightly-e2e-tests.yml @@ -25,7 +25,7 @@ on: jobs: call-run-e2e-tests-workflow: name: Run E2E Tests - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 with: chainlink_version: ${{ inputs.chainlink_version || 'develop' }} test_path: .github/e2e-tests.yml diff --git a/.github/workflows/run-selected-e2e-tests.yml b/.github/workflows/run-selected-e2e-tests.yml index f7e622ca94f..ad8807399d3 100644 --- a/.github/workflows/run-selected-e2e-tests.yml +++ b/.github/workflows/run-selected-e2e-tests.yml @@ -40,7 +40,7 @@ run-name: ${{ inputs.workflow_run_name }} jobs: call-run-e2e-tests-workflow: name: Run E2E Tests - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@244b17ef5c6ddad3cc841ba90117304216d031f5 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@70a84a2a8546ea6dd8778217df16558e9a5afba3 with: chainlink_version: ${{ github.event.inputs.chainlink_version }} test_path: .github/e2e-tests.yml From dac2a25ce5cd25ec18b663fd03c3eeec5e4129b7 Mon Sep 17 00:00:00 2001 From: Mateusz Sekara Date: Tue, 25 Feb 2025 13:03:43 +0100 Subject: [PATCH 50/58] Print OCR3 settings upon plugin init (#16557) * Logging OCR3 settings during the plugin init * Logging OCR3 settings during the plugin init * Logging OCR3 settings during the plugin init --- .../capabilities/ccip/oraclecreator/plugin.go | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/core/capabilities/ccip/oraclecreator/plugin.go b/core/capabilities/ccip/oraclecreator/plugin.go index baea4697039..e11d913ed52 100644 --- a/core/capabilities/ccip/oraclecreator/plugin.go +++ b/core/capabilities/ccip/oraclecreator/plugin.go @@ -178,6 +178,26 @@ func (i *pluginOracleCreator) Create(ctx context.Context, donID uint32, config c return nil, fmt.Errorf("failed to get public config from OCR config: %w", err) } + i.lggr.Infow("Creating plugin using OCR3 settings", + "plugin", pluginType.String(), + "chainSelector", chainSelector, + "chainID", destChainID, + "deltaProgress", publicConfig.DeltaProgress, + "deltaResend", publicConfig.DeltaResend, + "deltaInitial", publicConfig.DeltaInitial, + "deltaRound", publicConfig.DeltaRound, + "deltaGrace", publicConfig.DeltaGrace, + "deltaCertifiedCommitRequest", publicConfig.DeltaCertifiedCommitRequest, + "deltaStage", publicConfig.DeltaStage, + "rMax", publicConfig.RMax, + "s", publicConfig.S, + "maxDurationInitialization", publicConfig.MaxDurationInitialization, + "maxDurationQuery", publicConfig.MaxDurationQuery, + "maxDurationObservation", publicConfig.MaxDurationObservation, + "maxDurationShouldAcceptAttestedReport", publicConfig.MaxDurationShouldAcceptAttestedReport, + "maxDurationShouldTransmitAcceptedReport", publicConfig.MaxDurationShouldTransmitAcceptedReport, + ) + offrampAddrStr, err := i.addressCodec.AddressBytesToString(config.Config.OfframpAddress, cciptypes.ChainSelector(chainSelector)) if err != nil { return nil, err From 56885fd9b05f931544f1d5fe5c5bea30813d13c3 Mon Sep 17 00:00:00 2001 From: Makram Date: Tue, 25 Feb 2025 15:36:54 +0200 Subject: [PATCH 51/58] go.mod: bump cl-ccip (#16561) Has a fix for https://smartcontract-it.atlassian.net/browse/CCIP-5312 --- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 ++-- deployment/go.mod | 2 +- deployment/go.sum | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 ++-- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 ++-- system-tests/lib/go.mod | 2 +- system-tests/lib/go.sum | 4 ++-- system-tests/tests/go.mod | 2 +- system-tests/tests/go.sum | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index be733c75ea8..f2816426ffb 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -340,7 +340,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 0dfd90507fd..b9fbec5ce3d 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1086,8 +1086,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b h1:NRkuA25iJoNBmykOM5BelkLAxMcTSQ86EE76xw18d+o= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61 h1:x8GMgtVnW81t//lDpizA+/t225RThOjw8ydtrORFS7Q= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= diff --git a/deployment/go.mod b/deployment/go.mod index b1b38e1b9cc..c05a790a70e 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -30,7 +30,7 @@ require ( github.com/sethvargo/go-retry v0.2.4 github.com/smartcontractkit/ccip-owner-contracts v0.1.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb diff --git a/deployment/go.sum b/deployment/go.sum index ba7603aeea9..ab451ad0e19 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1134,8 +1134,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b h1:NRkuA25iJoNBmykOM5BelkLAxMcTSQ86EE76xw18d+o= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61 h1:x8GMgtVnW81t//lDpizA+/t225RThOjw8ydtrORFS7Q= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= diff --git a/go.mod b/go.mod index a3e2b92e010..fd764f67620 100644 --- a/go.mod +++ b/go.mod @@ -76,7 +76,7 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 diff --git a/go.sum b/go.sum index 657608765d4..469ecfc4b0f 100644 --- a/go.sum +++ b/go.sum @@ -1018,8 +1018,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b h1:NRkuA25iJoNBmykOM5BelkLAxMcTSQ86EE76xw18d+o= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61 h1:x8GMgtVnW81t//lDpizA+/t225RThOjw8ydtrORFS7Q= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index fd7dba615d6..238c5372217 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -46,7 +46,7 @@ require ( github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/job-distributor v0.9.0 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 4fbb2e605c9..078fcd98f4c 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1384,8 +1384,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b h1:NRkuA25iJoNBmykOM5BelkLAxMcTSQ86EE76xw18d+o= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61 h1:x8GMgtVnW81t//lDpizA+/t225RThOjw8ydtrORFS7Q= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 200b901564c..aaabb09adb1 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -28,7 +28,7 @@ require ( github.com/rs/zerolog v1.33.0 github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 647d2dc4037..f1bb9cc14bd 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1369,8 +1369,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b h1:NRkuA25iJoNBmykOM5BelkLAxMcTSQ86EE76xw18d+o= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61 h1:x8GMgtVnW81t//lDpizA+/t225RThOjw8ydtrORFS7Q= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= diff --git a/system-tests/lib/go.mod b/system-tests/lib/go.mod index eec05235bef..3146bd65a37 100644 --- a/system-tests/lib/go.mod +++ b/system-tests/lib/go.mod @@ -338,7 +338,7 @@ require ( github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect diff --git a/system-tests/lib/go.sum b/system-tests/lib/go.sum index 5af490cdeef..41a96a447f0 100644 --- a/system-tests/lib/go.sum +++ b/system-tests/lib/go.sum @@ -1122,8 +1122,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b h1:NRkuA25iJoNBmykOM5BelkLAxMcTSQ86EE76xw18d+o= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61 h1:x8GMgtVnW81t//lDpizA+/t225RThOjw8ydtrORFS7Q= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= diff --git a/system-tests/tests/go.mod b/system-tests/tests/go.mod index b2333c945d6..75bb1fefc3b 100644 --- a/system-tests/tests/go.mod +++ b/system-tests/tests/go.mod @@ -341,7 +341,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect diff --git a/system-tests/tests/go.sum b/system-tests/tests/go.sum index b0eca008a20..6e59888065f 100644 --- a/system-tests/tests/go.sum +++ b/system-tests/tests/go.sum @@ -1122,8 +1122,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b h1:NRkuA25iJoNBmykOM5BelkLAxMcTSQ86EE76xw18d+o= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225082728-02822188ef7b/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61 h1:x8GMgtVnW81t//lDpizA+/t225RThOjw8ydtrORFS7Q= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= From 281c853af4e63dffef5fa1ea0dd740c1a513177f Mon Sep 17 00:00:00 2001 From: Margaret Ma Date: Tue, 25 Feb 2025 10:13:31 -0500 Subject: [PATCH 52/58] [CAPPL-576] use workflow key instead of evm config key (#16517) * use workflow key instead of evm config key as encryption pub key * update jd version in e2e tests --- .github/e2e-tests.yml | 26 +++---- .../services/keystore/keys/workflowkey/key.go | 15 ++++ .../keystore/keys/workflowkey/key_test.go | 39 ++++++++++ deployment/environment/memory/node.go | 11 ++- deployment/environment/test/jd.go | 18 ++--- deployment/environment/test/jd_test.go | 72 +++++++++++-------- deployment/environment/test/nodes.go | 2 + .../keystone/changeset/internal/deploy.go | 6 +- .../changeset/internal/deploy_test.go | 4 +- 9 files changed, 136 insertions(+), 57 deletions(-) diff --git a/.github/e2e-tests.yml b/.github/e2e-tests.yml index 3bb3f6b2023..a2785367763 100644 --- a/.github/e2e-tests.yml +++ b/.github/e2e-tests.yml @@ -194,7 +194,7 @@ runner-test-matrix: pyroscope_env: ci-smoke-capabilities-evm-simulated test_env_vars: E2E_TEST_CHAINLINK_VERSION: '{{ env.DEFAULT_CHAINLINK_PLUGINS_VERSION }}' # This is the chainlink version that has the plugins - E2E_JD_VERSION: 0.6.0 # there is no latest tag for this repo, so we need to specify the version + E2E_JD_VERSION: 0.9.0 # there is no latest tag for this repo, so we need to specify the version GITHUB_READ_TOKEN: '{{ env.GITHUB_API_TOKEN }}' # GATI-provided token that can read from capabilities and dev-platform repos CI: "true" CTF_CONFIGS: "environment-ci.toml" @@ -966,7 +966,7 @@ runner-test-matrix: pyroscope_env: ci-smoke-ccipv1_6-evm-simulated test_env_vars: E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2 - E2E_JD_VERSION: 0.6.0 + E2E_JD_VERSION: 0.9.0 CCIP_V16_TEST_ENV: docker - id: smoke/ccip/ccip_gas_price_updates_test.go:* @@ -980,7 +980,7 @@ runner-test-matrix: pyroscope_env: ci-smoke-ccipv1_6-evm-simulated test_env_vars: E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2 - E2E_JD_VERSION: 0.6.0 + E2E_JD_VERSION: 0.9.0 CCIP_V16_TEST_ENV: docker - id: smoke/ccip/ccip_rmn_test.go:^TestRMN_TwoMessagesOnTwoLanesIncludingBatching$ @@ -994,7 +994,7 @@ runner-test-matrix: pyroscope_env: ci-smoke-ccipv1_6-evm-simulated test_env_vars: E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2 - E2E_JD_VERSION: 0.6.0 + E2E_JD_VERSION: 0.9.0 E2E_RMN_RAGEPROXY_VERSION: 678509b E2E_RMN_AFN2PROXY_VERSION: 678509b CCIP_V16_TEST_ENV: docker @@ -1010,7 +1010,7 @@ runner-test-matrix: pyroscope_env: ci-smoke-ccipv1_6-evm-simulated test_env_vars: E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2 - E2E_JD_VERSION: 0.6.0 + E2E_JD_VERSION: 0.9.0 E2E_RMN_RAGEPROXY_VERSION: 678509b E2E_RMN_AFN2PROXY_VERSION: 678509b CCIP_V16_TEST_ENV: docker @@ -1026,7 +1026,7 @@ runner-test-matrix: pyroscope_env: ci-smoke-ccipv1_6-evm-simulated test_env_vars: E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2 - E2E_JD_VERSION: 0.6.0 + E2E_JD_VERSION: 0.9.0 E2E_RMN_RAGEPROXY_VERSION: 678509b E2E_RMN_AFN2PROXY_VERSION: 678509b CCIP_V16_TEST_ENV: docker @@ -1042,7 +1042,7 @@ runner-test-matrix: pyroscope_env: ci-smoke-ccipv1_6-evm-simulated test_env_vars: E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2 - E2E_JD_VERSION: 0.6.0 + E2E_JD_VERSION: 0.9.0 E2E_RMN_RAGEPROXY_VERSION: 678509b E2E_RMN_AFN2PROXY_VERSION: 678509b CCIP_V16_TEST_ENV: docker @@ -1058,7 +1058,7 @@ runner-test-matrix: pyroscope_env: ci-smoke-ccipv1_6-evm-simulated test_env_vars: E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2 - E2E_JD_VERSION: 0.6.0 + E2E_JD_VERSION: 0.9.0 E2E_RMN_RAGEPROXY_VERSION: 678509b E2E_RMN_AFN2PROXY_VERSION: 678509b CCIP_V16_TEST_ENV: docker @@ -1074,7 +1074,7 @@ runner-test-matrix: pyroscope_env: ci-smoke-ccipv1_6-evm-simulated test_env_vars: E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2 - E2E_JD_VERSION: 0.6.0 + E2E_JD_VERSION: 0.9.0 E2E_RMN_RAGEPROXY_VERSION: 678509b E2E_RMN_AFN2PROXY_VERSION: 678509b CCIP_V16_TEST_ENV: docker @@ -1090,7 +1090,7 @@ runner-test-matrix: pyroscope_env: ci-smoke-ccipv1_6-evm-simulated test_env_vars: E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2 - E2E_JD_VERSION: 0.6.0 + E2E_JD_VERSION: 0.9.0 E2E_RMN_RAGEPROXY_VERSION: 678509b E2E_RMN_AFN2PROXY_VERSION: 678509b CCIP_V16_TEST_ENV: docker @@ -1106,7 +1106,7 @@ runner-test-matrix: pyroscope_env: ci-smoke-ccipv1_6-evm-simulated test_env_vars: E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2 - E2E_JD_VERSION: 0.6.0 + E2E_JD_VERSION: 0.9.0 E2E_RMN_RAGEPROXY_VERSION: 678509b E2E_RMN_AFN2PROXY_VERSION: 678509b CCIP_V16_TEST_ENV: docker @@ -1122,7 +1122,7 @@ runner-test-matrix: pyroscope_env: ci-smoke-ccipv1_6-evm-simulated test_env_vars: E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2 - E2E_JD_VERSION: 0.6.0 + E2E_JD_VERSION: 0.9.0 E2E_RMN_RAGEPROXY_VERSION: 678509b E2E_RMN_AFN2PROXY_VERSION: 678509b CCIP_V16_TEST_ENV: docker @@ -1138,7 +1138,7 @@ runner-test-matrix: pyroscope_env: ci-smoke-ccipv1_6-evm-simulated test_env_vars: E2E_TEST_SELECTED_NETWORK: SIMULATED_1,SIMULATED_2 - E2E_JD_VERSION: 0.6.0 + E2E_JD_VERSION: 0.9.0 E2E_RMN_RAGEPROXY_VERSION: 678509b E2E_RMN_AFN2PROXY_VERSION: 678509b CCIP_V16_TEST_ENV: docker diff --git a/core/services/keystore/keys/workflowkey/key.go b/core/services/keystore/keys/workflowkey/key.go index 084878a5ee3..430ace01c83 100644 --- a/core/services/keystore/keys/workflowkey/key.go +++ b/core/services/keystore/keys/workflowkey/key.go @@ -1,10 +1,12 @@ package workflowkey import ( + "crypto/ed25519" cryptorand "crypto/rand" "encoding/hex" "errors" "fmt" + "math/big" "golang.org/x/crypto/curve25519" "golang.org/x/crypto/nacl/box" @@ -121,3 +123,16 @@ func curve25519PubKeyFromPrivateKey(privateKey [curve25519.PointSize]byte) *[cur return &publicKey } + +func MustNewXXXTestingOnly(k *big.Int) Key { + seed := make([]byte, ed25519.SeedSize) + copy(seed, k.Bytes()) + privKey := ed25519.NewKeyFromSeed(seed) + + var privateKey [32]byte + copy(privateKey[:], privKey.Seed()) + return Key{ + privateKey: &privateKey, + publicKey: curve25519PubKeyFromPrivateKey(privateKey), + } +} diff --git a/core/services/keystore/keys/workflowkey/key_test.go b/core/services/keystore/keys/workflowkey/key_test.go index 3e3a9413a90..6dd4979c827 100644 --- a/core/services/keystore/keys/workflowkey/key_test.go +++ b/core/services/keystore/keys/workflowkey/key_test.go @@ -4,6 +4,7 @@ import ( cryptorand "crypto/rand" "encoding/hex" "fmt" + "math/big" "testing" "github.com/stretchr/testify/assert" @@ -86,3 +87,41 @@ func TestDecrypt(t *testing.T) { assert.Equal(t, secret, plaintext) } + +func TestMustNewXXXTestingOnly(t *testing.T) { + tests := []struct { + name string + k *big.Int + wantSuccess bool + }{ + { + name: "generates valid key from big.Int", + k: big.NewInt(1), + wantSuccess: true, + }, + { + name: "panics on nil input", + k: nil, + wantSuccess: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if !tt.wantSuccess { + require.Panics(t, func() { MustNewXXXTestingOnly(tt.k) }) + return + } + + key := MustNewXXXTestingOnly(tt.k) + require.NotNil(t, key.privateKey) + require.NotNil(t, key.publicKey) + + // Verify key generation is deterministic + if tt.k.Cmp(big.NewInt(1)) != 0 { + key1 := MustNewXXXTestingOnly(tt.k) + require.Equal(t, key1.PublicKey(), key.PublicKey()) + } + }) + } +} diff --git a/deployment/environment/memory/node.go b/deployment/environment/memory/node.go index 0f81bb60b19..d4a950f431f 100644 --- a/deployment/environment/memory/node.go +++ b/deployment/environment/memory/node.go @@ -46,6 +46,7 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/csakey" "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ocr2key" "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey" + "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/workflowkey" "github.com/smartcontractkit/chainlink/v2/core/services/relay" "github.com/smartcontractkit/chainlink/v2/core/utils" "github.com/smartcontractkit/chainlink/v2/core/utils/testutils/heavyweight" @@ -304,7 +305,8 @@ func NewNode( eks: &EthKeystoreSim{ Eth: master.Eth(), }, - csa: master.CSA(), + csa: master.CSA(), + workflow: master.Workflow(), } // Build evm factory using clients + keystore. @@ -338,6 +340,7 @@ func NewNode( ctx := tests.Context(t) require.NoError(t, master.Unlock(ctx, "password")) require.NoError(t, master.CSA().EnsureKey(ctx)) + require.NoError(t, master.Workflow().EnsureKey(ctx)) beholderAuthHeaders, csaPubKeyHex, err := keystore.BuildBeholderAuth(master) require.NoError(t, err) @@ -392,6 +395,7 @@ func NewNode( type Keys struct { PeerID p2pkey.PeerID CSA csakey.KeyV2 + WorkflowKey workflowkey.Key Transmitters map[uint64]string // chainSelector => address OCRKeyBundles map[chaintype.ChainType]ocr2key.KeyBundle } @@ -587,8 +591,9 @@ func (e *EthKeystoreSim) SignTx(ctx context.Context, address common.Address, tx } type KeystoreSim struct { - eks keystore.Eth - csa keystore.CSA + eks keystore.Eth + csa keystore.CSA + workflow keystore.Workflow } func (e KeystoreSim) Eth() keystore.Eth { diff --git a/deployment/environment/test/jd.go b/deployment/environment/test/jd.go index a5efd5ebe19..abfd3a0d7b8 100644 --- a/deployment/environment/test/jd.go +++ b/deployment/environment/test/jd.go @@ -184,10 +184,11 @@ func newWrapperFromUpdate(req *nodev1.UpdateNodeRequest) (*wrappedNode, error) { func newJDNode(n deployment.Node) *nodev1.Node { out := nodev1.Node{ - Id: n.NodeID, - Labels: n.Labels, - Name: n.Name, - PublicKey: n.CSAKey, + Id: n.NodeID, + Labels: n.Labels, + Name: n.Name, + PublicKey: n.CSAKey, + WorkflowKey: &n.WorkflowKey, } return &out @@ -195,10 +196,11 @@ func newJDNode(n deployment.Node) *nodev1.Node { func newDeploymentNode(n *nodev1.Node) (deployment.Node, error) { out := deployment.Node{ - NodeID: n.Id, - Labels: n.Labels, - Name: n.Name, - CSAKey: n.PublicKey, + NodeID: n.Id, + Labels: n.Labels, + Name: n.Name, + CSAKey: n.PublicKey, + WorkflowKey: n.GetWorkflowKey(), } for _, label := range n.Labels { if p, err := p2pkey.MakePeerID(*label.Value); err == nil { diff --git a/deployment/environment/test/jd_test.go b/deployment/environment/test/jd_test.go index a262a7eb8ef..3a06dbc452f 100644 --- a/deployment/environment/test/jd_test.go +++ b/deployment/environment/test/jd_test.go @@ -71,20 +71,24 @@ func TestJDNodeService_GetNode(t *testing.T) { } func TestJDNodeService_ListNodes(t *testing.T) { + workflowKey1 := "workflow_key_1" + workflowKey2 := "workflow_key_2" nodes := []deployment.Node{ { - NodeID: "node1", - Name: "Node 1", - CSAKey: "csa_key_1", - PeerID: testPeerID(t, "peer_id_1"), - Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}}, + NodeID: "node1", + Name: "Node 1", + CSAKey: "csa_key_1", + PeerID: testPeerID(t, "peer_id_1"), + Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}}, + WorkflowKey: workflowKey1, }, { - NodeID: "node2", - Name: "Node 2", - CSAKey: "csa_key_2", - PeerID: testPeerID(t, "peer_id_2"), - Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}, {Key: "baz", Value: ptr("qux")}}, + NodeID: "node2", + Name: "Node 2", + CSAKey: "csa_key_2", + PeerID: testPeerID(t, "peer_id_2"), + Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}, {Key: "baz", Value: ptr("qux")}}, + WorkflowKey: workflowKey2, }, } @@ -99,45 +103,45 @@ func TestJDNodeService_ListNodes(t *testing.T) { name: "all nodes", filter: nil, want: []*nodev1.Node{ - {Id: "node1", Name: "Node 1", PublicKey: "csa_key_1", Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}}}, - {Id: "node2", Name: "Node 2", PublicKey: "csa_key_2", Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}, {Key: "baz", Value: ptr("qux")}}}, + {Id: "node1", Name: "Node 1", PublicKey: "csa_key_1", Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}}, WorkflowKey: &workflowKey1}, + {Id: "node2", Name: "Node 2", PublicKey: "csa_key_2", Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}, {Key: "baz", Value: ptr("qux")}}, WorkflowKey: &workflowKey2}, }, }, { name: "filter by id", filter: &nodev1.ListNodesRequest_Filter{Ids: []string{"node1"}}, want: []*nodev1.Node{ - {Id: "node1", Name: "Node 1", PublicKey: "csa_key_1", Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}}}, + {Id: "node1", Name: "Node 1", PublicKey: "csa_key_1", Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}}, WorkflowKey: &workflowKey1}, }, }, { name: "filter EQ common label", filter: &nodev1.ListNodesRequest_Filter{Selectors: []*ptypes.Selector{{Op: ptypes.SelectorOp_EQ, Key: "foo", Value: ptr("bar")}}}, want: []*nodev1.Node{ - {Id: "node1", Name: "Node 1", PublicKey: "csa_key_1", Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}}}, - {Id: "node2", Name: "Node 2", PublicKey: "csa_key_2", Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}, {Key: "baz", Value: ptr("qux")}}}, + {Id: "node1", Name: "Node 1", PublicKey: "csa_key_1", Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}}, WorkflowKey: &workflowKey1}, + {Id: "node2", Name: "Node 2", PublicKey: "csa_key_2", Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}, {Key: "baz", Value: ptr("qux")}}, WorkflowKey: &workflowKey2}, }, }, { name: "filter EQ single label", filter: &nodev1.ListNodesRequest_Filter{Selectors: []*ptypes.Selector{{Op: ptypes.SelectorOp_EQ, Key: "baz", Value: ptr("qux")}}}, want: []*nodev1.Node{ - {Id: "node2", Name: "Node 2", PublicKey: "csa_key_2", Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}, {Key: "baz", Value: ptr("qux")}}}, + {Id: "node2", Name: "Node 2", PublicKey: "csa_key_2", Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}, {Key: "baz", Value: ptr("qux")}}, WorkflowKey: &workflowKey2}, }, }, { name: "filter EXIST common label name", filter: &nodev1.ListNodesRequest_Filter{Selectors: []*ptypes.Selector{{Op: ptypes.SelectorOp_EXIST, Key: "foo"}}}, want: []*nodev1.Node{ - {Id: "node1", Name: "Node 1", PublicKey: "csa_key_1", Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}}}, - {Id: "node2", Name: "Node 2", PublicKey: "csa_key_2", Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}, {Key: "baz", Value: ptr("qux")}}}, + {Id: "node1", Name: "Node 1", PublicKey: "csa_key_1", Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}}, WorkflowKey: &workflowKey1}, + {Id: "node2", Name: "Node 2", PublicKey: "csa_key_2", Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}, {Key: "baz", Value: ptr("qux")}}, WorkflowKey: &workflowKey2}, }, }, { name: "filter EXIST single label value", filter: &nodev1.ListNodesRequest_Filter{Selectors: []*ptypes.Selector{{Op: ptypes.SelectorOp_EXIST, Key: "baz"}}}, want: []*nodev1.Node{ - {Id: "node2", Name: "Node 2", PublicKey: "csa_key_2", Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}, {Key: "baz", Value: ptr("qux")}}}, + {Id: "node2", Name: "Node 2", PublicKey: "csa_key_2", Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}, {Key: "baz", Value: ptr("qux")}}, WorkflowKey: &workflowKey2}, }, }, } @@ -328,25 +332,31 @@ func TestJDNodeService_ListNodeChainConfigs(t *testing.T) { } func TestNewJDServiceFromListNodes(t *testing.T) { + workflowKey1 := "workflow_key_1" + workflowKey2 := "workflow_key_2" + workflowKey3 := "workflow_key_3" testData := &nodev1.ListNodesResponse{ Nodes: []*nodev1.Node{ { - Id: "node1", - Name: "Node 1", - PublicKey: "csa_key_1", - Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}}, + Id: "node1", + Name: "Node 1", + PublicKey: "csa_key_1", + Labels: []*ptypes.Label{{Key: "foo", Value: ptr("bar")}}, + WorkflowKey: &workflowKey1, }, { - Id: "node2", - Name: "Node 2", - PublicKey: "csa_key_2", - Labels: []*ptypes.Label{{Key: "baz", Value: ptr("qux")}}, + Id: "node2", + Name: "Node 2", + PublicKey: "csa_key_2", + Labels: []*ptypes.Label{{Key: "baz", Value: ptr("qux")}}, + WorkflowKey: &workflowKey2, }, { - Id: "node3", - Name: "Node 3", - PublicKey: "csa_key_3", - Labels: []*ptypes.Label{{Key: "p2p", Value: ptr(testPeerID(t, "peer_id_3").String())}}, + Id: "node3", + Name: "Node 3", + PublicKey: "csa_key_3", + Labels: []*ptypes.Label{{Key: "p2p", Value: ptr(testPeerID(t, "peer_id_3").String())}}, + WorkflowKey: &workflowKey3, }, }, } diff --git a/deployment/environment/test/nodes.go b/deployment/environment/test/nodes.go index 1f91dac82ba..d7fafb6ec89 100644 --- a/deployment/environment/test/nodes.go +++ b/deployment/environment/test/nodes.go @@ -15,6 +15,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/csakey" "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey" + "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/workflowkey" ) type NodeConfig struct { @@ -41,6 +42,7 @@ func NewNode(t *testing.T, c NodeConfig) *deployment.Node { Name: c.Name, PeerID: p2p.PeerID(), CSAKey: csakey.MustNewV2XXXTestingOnly(k).ID(), + WorkflowKey: workflowkey.MustNewXXXTestingOnly(k).ID(), AdminAddr: gethcommon.BigToAddress(k).Hex(), Labels: labelsConversion(c.Labels), SelToOCRConfig: ocrConfigs, diff --git a/deployment/keystone/changeset/internal/deploy.go b/deployment/keystone/changeset/internal/deploy.go index e67ea047d7d..773adfddadd 100644 --- a/deployment/keystone/changeset/internal/deploy.go +++ b/deployment/keystone/changeset/internal/deploy.go @@ -659,6 +659,10 @@ func RegisterNodes(lggr logger.Logger, req *RegisterNodesRequest) (*RegisterNode // the signer is the onchain public key // the enc is the encryption public key func extractSignerEncryptionKeys(n deployment.Node, chainSel uint64) (signer [32]byte, enc [32]byte, err error) { + wfKey, err := hex.DecodeString(n.WorkflowKey) + if err != nil || len(wfKey) == 0 || bytes.Equal(wfKey, make([]byte, 32)) { + return signer, enc, fmt.Errorf("invalid workflow key (cannot be empty or zero) with error: %w", err) + } chainID, err := chainsel.ChainIdFromSelector(chainSel) if err != nil { return signer, enc, fmt.Errorf("error getting chain id for selector %d: %w", chainSel, err) @@ -673,7 +677,7 @@ func extractSignerEncryptionKeys(n deployment.Node, chainSel uint64) (signer [32 return signer, enc, fmt.Errorf("config for selector %v not found on node (id: %s, name: %s)", chainSel, n.NodeID, n.Name) } copy(signer[:], evmCC.OnchainPublicKey) - copy(enc[:], evmCC.ConfigEncryptionPublicKey[:]) + copy(enc[:], wfKey) return signer, enc, nil } diff --git a/deployment/keystone/changeset/internal/deploy_test.go b/deployment/keystone/changeset/internal/deploy_test.go index 41c1a793d4e..d914b0d1559 100644 --- a/deployment/keystone/changeset/internal/deploy_test.go +++ b/deployment/keystone/changeset/internal/deploy_test.go @@ -2,6 +2,7 @@ package internal_test import ( "context" + "encoding/hex" "maps" "testing" @@ -213,7 +214,6 @@ func Test_RegisterNodes(t *testing.T) { want: expected{nOps: 1}, input: testInput, }, - { name: "no mcms", useMCMS: false, @@ -273,6 +273,7 @@ func Test_RegisterNodes(t *testing.T) { ConfigEncryptionPublicKey: tc.input.EncryptionPublicKey, }, }, + WorkflowKey: hex.EncodeToString(tc.input.EncryptionPublicKey[:]), }, }, }, @@ -329,6 +330,7 @@ func Test_RegisterNodes(t *testing.T) { ChainSelector: chain.Selector, }: {}, }, + WorkflowKey: hex.EncodeToString(registeredNodeParams[0].EncryptionPublicKey[:]), }, }, }, From 06e272503a5c67837d8949b4783efb2948f1b0de Mon Sep 17 00:00:00 2001 From: Justin Kaseman Date: Tue, 25 Feb 2025 08:27:22 -0800 Subject: [PATCH 53/58] Change default Workflow Execution Rate Limits to PerSender 200 (#16549) * Change default Workflow Execution Rate Limits to PerSender 200 * Regen docs --- core/config/docs/core.toml | 4 ++-- core/services/chainlink/config_test.go | 4 ++-- .../chainlink/testdata/config-empty-effective.toml | 4 ++-- core/services/chainlink/testdata/config-full.toml | 4 ++-- .../chainlink/testdata/config-multi-chain-effective.toml | 4 ++-- core/web/resolver/testdata/config-empty-effective.toml | 4 ++-- core/web/resolver/testdata/config-full.toml | 4 ++-- .../resolver/testdata/config-multi-chain-effective.toml | 4 ++-- docs/CONFIG.md | 8 ++++---- testdata/scripts/config/merge_raw_configs.txtar | 4 ++-- testdata/scripts/node/validate/default.txtar | 4 ++-- testdata/scripts/node/validate/defaults-override.txtar | 4 ++-- .../node/validate/disk-based-logging-disabled.txtar | 4 ++-- .../scripts/node/validate/disk-based-logging-no-dir.txtar | 4 ++-- testdata/scripts/node/validate/disk-based-logging.txtar | 4 ++-- testdata/scripts/node/validate/fallback-override.txtar | 4 ++-- testdata/scripts/node/validate/invalid-ocr-p2p.txtar | 4 ++-- testdata/scripts/node/validate/invalid.txtar | 4 ++-- testdata/scripts/node/validate/valid.txtar | 4 ++-- testdata/scripts/node/validate/warnings.txtar | 4 ++-- 20 files changed, 42 insertions(+), 42 deletions(-) diff --git a/core/config/docs/core.toml b/core/config/docs/core.toml index cb3fd3ec151..52d2d5afadf 100644 --- a/core/config/docs/core.toml +++ b/core/config/docs/core.toml @@ -452,9 +452,9 @@ GlobalRPS = 200 # Default # GlobalBurst is the global burst limit for the dispatcher. GlobalBurst = 200 # Default # PerSenderRPS is the per-sender rate limit for the dispatcher. -PerSenderRPS = 100 # Default +PerSenderRPS = 200 # Default # PerSenderBurst is the per-sender burst limit for the dispatcher. -PerSenderBurst = 100 # Default +PerSenderBurst = 200 # Default [Capabilities.WorkflowRegistry] # Address is the address for the workflow registry contract. diff --git a/core/services/chainlink/config_test.go b/core/services/chainlink/config_test.go index 3e12c9d4aec..9a7a65deed0 100644 --- a/core/services/chainlink/config_test.go +++ b/core/services/chainlink/config_test.go @@ -445,8 +445,8 @@ func TestConfig_Marshal(t *testing.T) { RateLimit: toml.EngineExecutionRateLimit{ GlobalRPS: ptr(200.00), GlobalBurst: ptr(200), - PerSenderRPS: ptr(100.0), - PerSenderBurst: ptr(100), + PerSenderRPS: ptr(200.0), + PerSenderBurst: ptr(200), }, Peering: toml.P2P{ IncomingMessageBufferSize: ptr[int64](13), diff --git a/core/services/chainlink/testdata/config-empty-effective.toml b/core/services/chainlink/testdata/config-empty-effective.toml index e0ac0520bd7..04a15d802c6 100644 --- a/core/services/chainlink/testdata/config-empty-effective.toml +++ b/core/services/chainlink/testdata/config-empty-effective.toml @@ -247,8 +247,8 @@ ReaperMaxAge = '48h0m0s' [Capabilities.RateLimit] GlobalRPS = 200.0 GlobalBurst = 200 -PerSenderRPS = 100.0 -PerSenderBurst = 100 +PerSenderRPS = 200.0 +PerSenderBurst = 200 [Capabilities.Peering] IncomingMessageBufferSize = 10 diff --git a/core/services/chainlink/testdata/config-full.toml b/core/services/chainlink/testdata/config-full.toml index 9d13abb29bc..15098deb97c 100644 --- a/core/services/chainlink/testdata/config-full.toml +++ b/core/services/chainlink/testdata/config-full.toml @@ -257,8 +257,8 @@ ReaperMaxAge = '678h0m0s' [Capabilities.RateLimit] GlobalRPS = 200.0 GlobalBurst = 200 -PerSenderRPS = 100.0 -PerSenderBurst = 100 +PerSenderRPS = 200.0 +PerSenderBurst = 200 [Capabilities.Peering] IncomingMessageBufferSize = 13 diff --git a/core/services/chainlink/testdata/config-multi-chain-effective.toml b/core/services/chainlink/testdata/config-multi-chain-effective.toml index a7a561ecd28..7d9c6bd8a30 100644 --- a/core/services/chainlink/testdata/config-multi-chain-effective.toml +++ b/core/services/chainlink/testdata/config-multi-chain-effective.toml @@ -247,8 +247,8 @@ ReaperMaxAge = '48h0m0s' [Capabilities.RateLimit] GlobalRPS = 200.0 GlobalBurst = 200 -PerSenderRPS = 100.0 -PerSenderBurst = 100 +PerSenderRPS = 200.0 +PerSenderBurst = 200 [Capabilities.Peering] IncomingMessageBufferSize = 10 diff --git a/core/web/resolver/testdata/config-empty-effective.toml b/core/web/resolver/testdata/config-empty-effective.toml index e0ac0520bd7..04a15d802c6 100644 --- a/core/web/resolver/testdata/config-empty-effective.toml +++ b/core/web/resolver/testdata/config-empty-effective.toml @@ -247,8 +247,8 @@ ReaperMaxAge = '48h0m0s' [Capabilities.RateLimit] GlobalRPS = 200.0 GlobalBurst = 200 -PerSenderRPS = 100.0 -PerSenderBurst = 100 +PerSenderRPS = 200.0 +PerSenderBurst = 200 [Capabilities.Peering] IncomingMessageBufferSize = 10 diff --git a/core/web/resolver/testdata/config-full.toml b/core/web/resolver/testdata/config-full.toml index 9888e2583fe..2bea413958e 100644 --- a/core/web/resolver/testdata/config-full.toml +++ b/core/web/resolver/testdata/config-full.toml @@ -257,8 +257,8 @@ ReaperMaxAge = '678h0m0s' [Capabilities.RateLimit] GlobalRPS = 200.0 GlobalBurst = 200 -PerSenderRPS = 100.0 -PerSenderBurst = 100 +PerSenderRPS = 200.0 +PerSenderBurst = 200 [Capabilities.Peering] IncomingMessageBufferSize = 13 diff --git a/core/web/resolver/testdata/config-multi-chain-effective.toml b/core/web/resolver/testdata/config-multi-chain-effective.toml index d4e7d543cdd..a2c83607623 100644 --- a/core/web/resolver/testdata/config-multi-chain-effective.toml +++ b/core/web/resolver/testdata/config-multi-chain-effective.toml @@ -247,8 +247,8 @@ ReaperMaxAge = '48h0m0s' [Capabilities.RateLimit] GlobalRPS = 200.0 GlobalBurst = 200 -PerSenderRPS = 100.0 -PerSenderBurst = 100 +PerSenderRPS = 200.0 +PerSenderBurst = 200 [Capabilities.Peering] IncomingMessageBufferSize = 10 diff --git a/docs/CONFIG.md b/docs/CONFIG.md index a4fdeb20b5d..87826476bbd 100644 --- a/docs/CONFIG.md +++ b/docs/CONFIG.md @@ -1225,8 +1225,8 @@ but the host and port must be fully specified and cannot be empty. You can speci [Capabilities.RateLimit] GlobalRPS = 200 # Default GlobalBurst = 200 # Default -PerSenderRPS = 100 # Default -PerSenderBurst = 100 # Default +PerSenderRPS = 200 # Default +PerSenderBurst = 200 # Default ``` @@ -1244,13 +1244,13 @@ GlobalBurst is the global burst limit for the dispatcher. ### PerSenderRPS ```toml -PerSenderRPS = 100 # Default +PerSenderRPS = 200 # Default ``` PerSenderRPS is the per-sender rate limit for the dispatcher. ### PerSenderBurst ```toml -PerSenderBurst = 100 # Default +PerSenderBurst = 200 # Default ``` PerSenderBurst is the per-sender burst limit for the dispatcher. diff --git a/testdata/scripts/config/merge_raw_configs.txtar b/testdata/scripts/config/merge_raw_configs.txtar index 361d7717a6f..3a89fcef08b 100644 --- a/testdata/scripts/config/merge_raw_configs.txtar +++ b/testdata/scripts/config/merge_raw_configs.txtar @@ -394,8 +394,8 @@ ReaperMaxAge = '48h0m0s' [Capabilities.RateLimit] GlobalRPS = 200.0 GlobalBurst = 200 -PerSenderRPS = 100.0 -PerSenderBurst = 100 +PerSenderRPS = 200.0 +PerSenderBurst = 200 [Capabilities.Peering] IncomingMessageBufferSize = 10 diff --git a/testdata/scripts/node/validate/default.txtar b/testdata/scripts/node/validate/default.txtar index feab98e51aa..1f66fb53137 100644 --- a/testdata/scripts/node/validate/default.txtar +++ b/testdata/scripts/node/validate/default.txtar @@ -259,8 +259,8 @@ ReaperMaxAge = '48h0m0s' [Capabilities.RateLimit] GlobalRPS = 200.0 GlobalBurst = 200 -PerSenderRPS = 100.0 -PerSenderBurst = 100 +PerSenderRPS = 200.0 +PerSenderBurst = 200 [Capabilities.Peering] IncomingMessageBufferSize = 10 diff --git a/testdata/scripts/node/validate/defaults-override.txtar b/testdata/scripts/node/validate/defaults-override.txtar index 46de7109da5..7464b589abf 100644 --- a/testdata/scripts/node/validate/defaults-override.txtar +++ b/testdata/scripts/node/validate/defaults-override.txtar @@ -320,8 +320,8 @@ ReaperMaxAge = '48h0m0s' [Capabilities.RateLimit] GlobalRPS = 200.0 GlobalBurst = 200 -PerSenderRPS = 100.0 -PerSenderBurst = 100 +PerSenderRPS = 200.0 +PerSenderBurst = 200 [Capabilities.Peering] IncomingMessageBufferSize = 10 diff --git a/testdata/scripts/node/validate/disk-based-logging-disabled.txtar b/testdata/scripts/node/validate/disk-based-logging-disabled.txtar index 32744204203..6bd9d950c8b 100644 --- a/testdata/scripts/node/validate/disk-based-logging-disabled.txtar +++ b/testdata/scripts/node/validate/disk-based-logging-disabled.txtar @@ -303,8 +303,8 @@ ReaperMaxAge = '48h0m0s' [Capabilities.RateLimit] GlobalRPS = 200.0 GlobalBurst = 200 -PerSenderRPS = 100.0 -PerSenderBurst = 100 +PerSenderRPS = 200.0 +PerSenderBurst = 200 [Capabilities.Peering] IncomingMessageBufferSize = 10 diff --git a/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar b/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar index 9939a6cb020..36349e453bf 100644 --- a/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar +++ b/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar @@ -303,8 +303,8 @@ ReaperMaxAge = '48h0m0s' [Capabilities.RateLimit] GlobalRPS = 200.0 GlobalBurst = 200 -PerSenderRPS = 100.0 -PerSenderBurst = 100 +PerSenderRPS = 200.0 +PerSenderBurst = 200 [Capabilities.Peering] IncomingMessageBufferSize = 10 diff --git a/testdata/scripts/node/validate/disk-based-logging.txtar b/testdata/scripts/node/validate/disk-based-logging.txtar index 46343b6001f..2be081be3e1 100644 --- a/testdata/scripts/node/validate/disk-based-logging.txtar +++ b/testdata/scripts/node/validate/disk-based-logging.txtar @@ -303,8 +303,8 @@ ReaperMaxAge = '48h0m0s' [Capabilities.RateLimit] GlobalRPS = 200.0 GlobalBurst = 200 -PerSenderRPS = 100.0 -PerSenderBurst = 100 +PerSenderRPS = 200.0 +PerSenderBurst = 200 [Capabilities.Peering] IncomingMessageBufferSize = 10 diff --git a/testdata/scripts/node/validate/fallback-override.txtar b/testdata/scripts/node/validate/fallback-override.txtar index b28d2e2eb0c..6500d256bc7 100644 --- a/testdata/scripts/node/validate/fallback-override.txtar +++ b/testdata/scripts/node/validate/fallback-override.txtar @@ -397,8 +397,8 @@ ReaperMaxAge = '48h0m0s' [Capabilities.RateLimit] GlobalRPS = 200.0 GlobalBurst = 200 -PerSenderRPS = 100.0 -PerSenderBurst = 100 +PerSenderRPS = 200.0 +PerSenderBurst = 200 [Capabilities.Peering] IncomingMessageBufferSize = 10 diff --git a/testdata/scripts/node/validate/invalid-ocr-p2p.txtar b/testdata/scripts/node/validate/invalid-ocr-p2p.txtar index 1472205fc19..cea730bde17 100644 --- a/testdata/scripts/node/validate/invalid-ocr-p2p.txtar +++ b/testdata/scripts/node/validate/invalid-ocr-p2p.txtar @@ -288,8 +288,8 @@ ReaperMaxAge = '48h0m0s' [Capabilities.RateLimit] GlobalRPS = 200.0 GlobalBurst = 200 -PerSenderRPS = 100.0 -PerSenderBurst = 100 +PerSenderRPS = 200.0 +PerSenderBurst = 200 [Capabilities.Peering] IncomingMessageBufferSize = 10 diff --git a/testdata/scripts/node/validate/invalid.txtar b/testdata/scripts/node/validate/invalid.txtar index 09e142c8e82..2a88bb81252 100644 --- a/testdata/scripts/node/validate/invalid.txtar +++ b/testdata/scripts/node/validate/invalid.txtar @@ -293,8 +293,8 @@ ReaperMaxAge = '48h0m0s' [Capabilities.RateLimit] GlobalRPS = 200.0 GlobalBurst = 200 -PerSenderRPS = 100.0 -PerSenderBurst = 100 +PerSenderRPS = 200.0 +PerSenderBurst = 200 [Capabilities.Peering] IncomingMessageBufferSize = 10 diff --git a/testdata/scripts/node/validate/valid.txtar b/testdata/scripts/node/validate/valid.txtar index 236e2980e34..48b1d96fae9 100644 --- a/testdata/scripts/node/validate/valid.txtar +++ b/testdata/scripts/node/validate/valid.txtar @@ -300,8 +300,8 @@ ReaperMaxAge = '48h0m0s' [Capabilities.RateLimit] GlobalRPS = 200.0 GlobalBurst = 200 -PerSenderRPS = 100.0 -PerSenderBurst = 100 +PerSenderRPS = 200.0 +PerSenderBurst = 200 [Capabilities.Peering] IncomingMessageBufferSize = 10 diff --git a/testdata/scripts/node/validate/warnings.txtar b/testdata/scripts/node/validate/warnings.txtar index f49f448a7ac..826a6243110 100644 --- a/testdata/scripts/node/validate/warnings.txtar +++ b/testdata/scripts/node/validate/warnings.txtar @@ -282,8 +282,8 @@ ReaperMaxAge = '48h0m0s' [Capabilities.RateLimit] GlobalRPS = 200.0 GlobalBurst = 200 -PerSenderRPS = 100.0 -PerSenderBurst = 100 +PerSenderRPS = 200.0 +PerSenderBurst = 200 [Capabilities.Peering] IncomingMessageBufferSize = 10 From e13e5675d3852b04e18dad9881e958066a2bf87a Mon Sep 17 00:00:00 2001 From: krehermann <16602512+krehermann@users.noreply.github.com> Date: Tue, 25 Feb 2025 09:46:01 -0700 Subject: [PATCH 54/58] feat(BCF-3477): support importing keys via TOML secrets (#16505) * wip: support single eth key secret * import p2p key * support multiple eth keys * fix eth keys plumbing and add test * rename vars * working locally * cleanup * address feedback * linter --- .changeset/shaggy-brooms-rush.md | 5 + core/cmd/shell_local.go | 36 +++++ core/config/eth_key_config.go | 21 +++ core/config/toml/types.go | 133 +++++++++++++++++- core/config/toml/types_test.go | 59 +++++++- core/services/chainlink/config.go | 8 ++ core/services/chainlink/config_general.go | 7 + .../chainlink/config_imported_eth_key.go | 57 ++++++++ .../chainlink/config_imported_p2p_key.go | 21 +++ .../chainlink/mocks/general_config.go | 94 +++++++++++++ .../testdata/secrets-full-redacted.toml | 15 ++ .../chainlink/testdata/secrets-full.toml | 21 ++- core/services/chainlink/types.go | 9 ++ core/services/keystore/p2p.go | 2 +- 14 files changed, 481 insertions(+), 7 deletions(-) create mode 100644 .changeset/shaggy-brooms-rush.md create mode 100644 core/config/eth_key_config.go create mode 100644 core/services/chainlink/config_imported_eth_key.go create mode 100644 core/services/chainlink/config_imported_p2p_key.go diff --git a/.changeset/shaggy-brooms-rush.md b/.changeset/shaggy-brooms-rush.md new file mode 100644 index 00000000000..0eed033fb23 --- /dev/null +++ b/.changeset/shaggy-brooms-rush.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#added support importing eth and p2p keys on startup diff --git a/core/cmd/shell_local.go b/core/cmd/shell_local.go index 478f3ccacd4..40b606da77d 100644 --- a/core/cmd/shell_local.go +++ b/core/cmd/shell_local.go @@ -21,12 +21,16 @@ import ( "golang.org/x/sync/errgroup" "gopkg.in/guregu/null.v4" + chain_selectors "github.com/smartcontractkit/chain-selectors" + "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/gas" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" + "github.com/smartcontractkit/chainlink/v2/core/build" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/logger" + "github.com/smartcontractkit/chainlink/v2/core/services/keystore" "github.com/smartcontractkit/chainlink/v2/core/services/keystore/chaintype" "github.com/smartcontractkit/chainlink/v2/core/services/pg" "github.com/smartcontractkit/chainlink/v2/core/sessions" @@ -378,6 +382,28 @@ func (s *Shell) runNode(c *cli.Context) error { legacyEVMChains := app.GetRelayers().LegacyEVMChains() if s.Config.EVMEnabled() { + // ensure any imported keys are imported + for _, k := range s.Config.ImportedEthKeys().List() { + lggr.Debug("Importing eth key") + id, err2 := chain_selectors.GetChainIDFromSelector(k.ChainDetails().ChainSelector) + if err != nil { + return s.errorOut(errors.Wrapf(err2, "error getting chain id from selector when trying to import eth key %v", k.JSON())) + } + cid, _ := big.NewInt(0).SetString(id, 10) + if cid == nil { + return s.errorOut(fmt.Errorf("error converting chain id '%s' to big int", id)) + } + _, err2 = app.GetKeyStore().Eth().Import(rootCtx, []byte(k.JSON()), k.Password(), cid) + if err2 != nil { + if errors.Is(err, keystore.ErrKeyExists) { + lggr.Debugf("Eth key %s already exists for chain %v", k.JSON(), k.ChainDetails()) + continue + } + return s.errorOut(errors.Wrap(err2, "error importing eth key")) + } + lggr.Debugf("Imported eth key %s for chain %v", k.JSON(), k.ChainDetails()) + } + chainList, err2 := legacyEVMChains.List() if err2 != nil { return fmt.Errorf("error listing legacy evm chains: %w", err2) @@ -426,7 +452,17 @@ func (s *Shell) runNode(c *cli.Context) error { return errors.Wrap(err2, "failed to ensure ocr key") } } + if s.Config.P2P().Enabled() { + if s.Config.ImportedP2PKey().JSON() != "" { + lggr.Debugf("Importing p2p key %s", s.Config.ImportedP2PKey().JSON()) + _, err2 := app.GetKeyStore().P2P().Import(rootCtx, []byte(s.Config.ImportedP2PKey().JSON()), s.Config.ImportedP2PKey().Password()) + if errors.Is(err2, keystore.ErrKeyExists) { + lggr.Debugf("P2P key already exists %s", s.Config.ImportedP2PKey().JSON()) + } else if err2 != nil { + return s.errorOut(errors.Wrap(err2, "error importing p2p key")) + } + } err2 := app.GetKeyStore().P2P().EnsureKey(rootCtx) if err2 != nil { return errors.Wrap(err2, "failed to ensure p2p key") diff --git a/core/config/eth_key_config.go b/core/config/eth_key_config.go new file mode 100644 index 00000000000..03df1fa6797 --- /dev/null +++ b/core/config/eth_key_config.go @@ -0,0 +1,21 @@ +package config + +import chain_selectors "github.com/smartcontractkit/chain-selectors" + +type ImportableEthKey interface { + // ChainDetails returns the chain details for the key. + ChainDetails() chain_selectors.ChainDetails + ImportableKey +} + +type ImportableKey interface { + // JSON must be a valid JSON string conforming to the + // particular key format. + JSON() string + // Password is the password used to encrypt the key. + Password() string +} + +type ImportableEthKeyLister interface { + List() []ImportableEthKey +} diff --git a/core/config/toml/types.go b/core/config/toml/types.go index 4a34384e74d..1e0eaa5fba3 100644 --- a/core/config/toml/types.go +++ b/core/config/toml/types.go @@ -13,6 +13,7 @@ import ( "go.uber.org/multierr" "go.uber.org/zap/zapcore" + chain_selectors "github.com/smartcontractkit/chain-selectors" ocrcommontypes "github.com/smartcontractkit/libocr/commontypes" commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" @@ -123,6 +124,49 @@ type Secrets struct { Prometheus PrometheusSecrets `toml:",omitempty"` Mercury MercurySecrets `toml:",omitempty"` Threshold ThresholdKeyShareSecrets `toml:",omitempty"` + EVM EthKeys `toml:",omitempty"` // choose EVM as the TOML field name to align with relayer config convention + P2PKey P2PKey `toml:",omitempty"` +} + +type EthKeys struct { + Keys []*EthKey +} + +func (e *EthKeys) SetFrom(f *EthKeys) error { + err := e.validateMerge(f) + if err != nil { + return err + } + if f == nil || len(f.Keys) == 0 { + return nil + } + e.Keys = make([]*EthKey, len(f.Keys)) + copy(e.Keys, f.Keys) + return nil +} + +func (e *EthKeys) validateMerge(f *EthKeys) (err error) { + have := make(map[int]struct{}) + if e != nil && f != nil { + for _, ethKey := range e.Keys { + have[*ethKey.ID] = struct{}{} + } + for _, ethKey := range f.Keys { + if _, ok := have[*ethKey.ID]; ok { + err = multierr.Append(err, configutils.ErrOverride{Name: fmt.Sprintf("EthKeys: %d", *ethKey.ID)}) + } + } + } + return err +} + +func (e *EthKeys) ValidateConfig() (err error) { + for i, ethKey := range e.Keys { + if err2 := ethKey.ValidateConfig(); err2 != nil { + err = multierr.Append(err, configutils.ErrInvalid{Name: fmt.Sprintf("EthKeys[%d]", i), Value: ethKey, Msg: "invalid EthKey"}) + } + } + return err } func dbURLPasswordComplexity(err error) string { @@ -148,12 +192,12 @@ func validateDBURL(dbURI url.URL) error { // fallback to user info userInfo := dbURI.User if userInfo == nil { - return fmt.Errorf("DB URL must be authenticated; plaintext URLs are not allowed") + return errors.New("DB URL must be authenticated; plaintext URLs are not allowed") } var pwSet bool pw, pwSet = userInfo.Password() if !pwSet { - return fmt.Errorf("DB URL must be authenticated; password is required") + return errors.New("DB URL must be authenticated; password is required") } } @@ -216,6 +260,91 @@ func (d *DatabaseSecrets) validateMerge(f *DatabaseSecrets) (err error) { return err } +type EthKey struct { + JSON *models.Secret + ID *int // TODO: consider using a chain selector instead. tried using chain_selectors.ChainDetails but toml lib barfed on the embedded uint64 + Password *models.Secret +} + +func (e *EthKey) SetFrom(f *EthKey) (err error) { + err = e.validateMerge(f) + if err != nil { + return err + } + if v := f.JSON; v != nil { + e.JSON = v + } + if v := f.Password; v != nil { + e.Password = v + } + if v := f.ID; v != nil { + e.ID = v + } + return nil +} + +func (e *EthKey) validateMerge(f *EthKey) (err error) { + if e.JSON != nil && f.JSON != nil { + err = multierr.Append(err, configutils.ErrOverride{Name: "PrivateKey"}) + } + if e.ID != nil && f.ID != nil { + err = multierr.Append(err, configutils.ErrOverride{Name: "Selector"}) + } + if e.Password != nil && f.Password != nil { + err = multierr.Append(err, configutils.ErrOverride{Name: "Password"}) + } + return err +} + +func (e *EthKey) ValidateConfig() (err error) { + if (e.JSON != nil) != (e.Password != nil) && (e.Password != nil) != (e.ID != nil) { + err = multierr.Append(err, configutils.ErrInvalid{Name: "EthKey", Value: e.JSON, Msg: "all fields must be nil or non-nil"}) + } + // require valid id + if e.ID != nil { + _, ok := chain_selectors.ChainByEvmChainID(uint64(*e.ID)) //nolint:gosec // disable G115 + if !ok { + err = multierr.Append(err, configutils.ErrInvalid{Name: "ChainSelector", Value: e.ID, Msg: "invalid chain selector"}) + } + } + return err +} + +type P2PKey struct { + JSON *models.Secret + Password *models.Secret +} + +func (p *P2PKey) SetFrom(f *P2PKey) (err error) { + err = p.validateMerge(f) + if err != nil { + return err + } + if v := f.JSON; v != nil { + p.JSON = v + } + if v := f.Password; v != nil { + p.Password = v + } + return nil +} +func (p *P2PKey) validateMerge(f *P2PKey) (err error) { + if p.JSON != nil && f.JSON != nil { + err = multierr.Append(err, configutils.ErrOverride{Name: "JSON"}) + } + if p.Password != nil && f.Password != nil { + err = multierr.Append(err, configutils.ErrOverride{Name: "Password"}) + } + return err +} + +func (p *P2PKey) ValidateConfig() (err error) { + if (p.JSON != nil) != (p.Password != nil) { + err = multierr.Append(err, configutils.ErrInvalid{Name: "P2PKey", Value: p.JSON, Msg: "all fields must be nil or non-nil"}) + } + return err +} + type Passwords struct { Keystore *models.Secret VRF *models.Secret diff --git a/core/config/toml/types_test.go b/core/config/toml/types_test.go index 9c3fd1d02df..ccfde391cb4 100644 --- a/core/config/toml/types_test.go +++ b/core/config/toml/types_test.go @@ -1,12 +1,15 @@ package toml import ( + "bytes" "fmt" "net/url" "strings" "testing" + "github.com/pelletier/go-toml/v2" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" "github.com/smartcontractkit/chainlink/v2/core/build" @@ -101,7 +104,7 @@ func Test_validateDBURL(t *testing.T) { url := testutils.MustParseURL(t, test.url) err := validateDBURL(*url) if test.wantErr == "" { - assert.Nil(t, err) + assert.NoError(t, err) } else { assert.EqualError(t, err, test.wantErr) } @@ -577,5 +580,59 @@ func TestMercuryTLS_ValidateTLSCertPath(t *testing.T) { } } +func TestEthKeys_TOMLSerialization(t *testing.T) { + t.Parallel() + t.Run("encode", func(t *testing.T) { + ethKeysWrapper := EthKeys{ + Keys: []*EthKey{ + {JSON: ptr(models.Secret("key1")), Password: ptr(models.Secret("pass1")), ID: ptr(1)}, + {JSON: ptr(models.Secret("key2")), Password: ptr(models.Secret("pass2")), ID: ptr(99)}, + }, + } + + var buf bytes.Buffer + enc := toml.NewEncoder(&buf) + err := enc.Encode(ethKeysWrapper) + require.NoError(t, err) + + var decoded EthKeys + err = toml.NewDecoder(strings.NewReader(buf.String())).Decode(&decoded) + require.NoError(t, err) + assert.Equal(t, len(ethKeysWrapper.Keys), len(decoded.Keys)) + for i, key := range ethKeysWrapper.Keys { + // have to compare the GoString() of the Secret because it is redacted + assert.Equal(t, key.JSON.GoString(), decoded.Keys[i].JSON.GoString()) + assert.Equal(t, key.Password.GoString(), decoded.Keys[i].Password.GoString()) + assert.Equal(t, *key.ID, *decoded.Keys[i].ID) + } + }) + t.Run("decode", func(t *testing.T) { + var decoded2 EthKeys + btoml := `[[Keys]] +JSON = '{k:v}' +ID = 1337 +Password = 'something'` + err := toml.Unmarshal([]byte(btoml), &decoded2) + require.NoError(t, err) + assert.Len(t, decoded2.Keys, 1) + assert.Equal(t, 1337, *decoded2.Keys[0].ID) + assert.Equal(t, models.NewSecret("something"), decoded2.Keys[0].Password) + assert.Equal(t, models.NewSecret("{k:v}"), decoded2.Keys[0].JSON) + }) +} + +func TestEthKeys_SetFrom(t *testing.T) { + ethKeysWrapper1 := &EthKeys{} + ethKeysWrapper2 := EthKeys{ + Keys: []*EthKey{ + {JSON: ptr(models.Secret("key1")), Password: ptr(models.Secret("pass1")), ID: ptr(1)}, + }, + } + + err := ethKeysWrapper1.SetFrom(ðKeysWrapper2) + require.NoError(t, err) + assert.Equal(t, ethKeysWrapper2, *ethKeysWrapper1) +} + // ptr is a utility function for converting a value to a pointer to the value. func ptr[T any](t T) *T { return &t } diff --git a/core/services/chainlink/config.go b/core/services/chainlink/config.go index a7e944d633e..7d40dcc167c 100644 --- a/core/services/chainlink/config.go +++ b/core/services/chainlink/config.go @@ -404,6 +404,14 @@ func (s *Secrets) SetFrom(f *Secrets) (err error) { err = multierr.Append(err, commonconfig.NamedMultiErrorList(err2, "Threshold")) } + if err2 := s.EVM.SetFrom(&f.EVM); err2 != nil { + err = multierr.Append(err, commonconfig.NamedMultiErrorList(err2, "EthKeys")) + } + + if err2 := s.P2PKey.SetFrom(&f.P2PKey); err2 != nil { + err = multierr.Append(err, commonconfig.NamedMultiErrorList(err2, "P2PKey")) + } + _, err = commonconfig.MultiErrorList(err) return err diff --git a/core/services/chainlink/config_general.go b/core/services/chainlink/config_general.go index 0f6fea7518e..80641989ba1 100644 --- a/core/services/chainlink/config_general.go +++ b/core/services/chainlink/config_general.go @@ -519,6 +519,13 @@ func (g *generalConfig) Threshold() coreconfig.Threshold { return &thresholdConfig{s: g.secrets.Threshold} } +func (g *generalConfig) ImportedEthKeys() coreconfig.ImportableEthKeyLister { + return &importedEthKeyConfigs{s: g.secrets.EVM} +} +func (g *generalConfig) ImportedP2PKey() coreconfig.ImportableKey { + return &importedP2PKeyConfig{s: g.secrets.P2PKey} +} + func (g *generalConfig) Tracing() coreconfig.Tracing { return &tracingConfig{s: g.c.Tracing} } diff --git a/core/services/chainlink/config_imported_eth_key.go b/core/services/chainlink/config_imported_eth_key.go new file mode 100644 index 00000000000..a2f8aaedc1c --- /dev/null +++ b/core/services/chainlink/config_imported_eth_key.go @@ -0,0 +1,57 @@ +package chainlink + +import ( + chain_selectors "github.com/smartcontractkit/chain-selectors" + + "github.com/smartcontractkit/chainlink/v2/core/config" + "github.com/smartcontractkit/chainlink/v2/core/config/toml" +) + +type importedEthKeyConfig struct { + s toml.EthKey +} + +func (t *importedEthKeyConfig) JSON() string { + if t.s.JSON == nil { + return "" + } + return string(*t.s.JSON) +} + +func (t *importedEthKeyConfig) ChainDetails() chain_selectors.ChainDetails { + if t.s.ID == nil { + return chain_selectors.ChainDetails{} + } + d, ok := chain_selectors.ChainByEvmChainID(uint64(*t.s.ID)) //nolint:gosec // disable G115 + if !ok { + return chain_selectors.ChainDetails{} + } + return chain_selectors.ChainDetails{ + ChainSelector: d.Selector, + ChainName: d.Name, + } +} + +func (t *importedEthKeyConfig) Password() string { + if t.s.Password == nil { + return "" + } + return string(*t.s.Password) +} + +type importedEthKeyConfigs struct { + s toml.EthKeys +} + +func (t *importedEthKeyConfigs) List() []config.ImportableEthKey { + res := make([]config.ImportableEthKey, len(t.s.Keys)) + + if len(t.s.Keys) == 0 { + return res + } + + for i, v := range t.s.Keys { + res[i] = &importedEthKeyConfig{s: *v} + } + return res +} diff --git a/core/services/chainlink/config_imported_p2p_key.go b/core/services/chainlink/config_imported_p2p_key.go new file mode 100644 index 00000000000..d2e26821942 --- /dev/null +++ b/core/services/chainlink/config_imported_p2p_key.go @@ -0,0 +1,21 @@ +package chainlink + +import "github.com/smartcontractkit/chainlink/v2/core/config/toml" + +type importedP2PKeyConfig struct { + s toml.P2PKey +} + +func (t *importedP2PKeyConfig) JSON() string { + if t.s.JSON == nil { + return "" + } + return string(*t.s.JSON) +} + +func (t *importedP2PKeyConfig) Password() string { + if t.s.Password == nil { + return "" + } + return string(*t.s.Password) +} diff --git a/core/services/chainlink/mocks/general_config.go b/core/services/chainlink/mocks/general_config.go index 8f9e3f46816..02b63cfe1c5 100644 --- a/core/services/chainlink/mocks/general_config.go +++ b/core/services/chainlink/mocks/general_config.go @@ -692,6 +692,100 @@ func (_c *GeneralConfig_FluxMonitor_Call) RunAndReturn(run func() config.FluxMon return _c } +// ImportedEthKeys provides a mock function with no fields +func (_m *GeneralConfig) ImportedEthKeys() config.ImportableEthKeyLister { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for ImportedEthKeys") + } + + var r0 config.ImportableEthKeyLister + if rf, ok := ret.Get(0).(func() config.ImportableEthKeyLister); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(config.ImportableEthKeyLister) + } + } + + return r0 +} + +// GeneralConfig_ImportedEthKeys_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ImportedEthKeys' +type GeneralConfig_ImportedEthKeys_Call struct { + *mock.Call +} + +// ImportedEthKeys is a helper method to define mock.On call +func (_e *GeneralConfig_Expecter) ImportedEthKeys() *GeneralConfig_ImportedEthKeys_Call { + return &GeneralConfig_ImportedEthKeys_Call{Call: _e.mock.On("ImportedEthKeys")} +} + +func (_c *GeneralConfig_ImportedEthKeys_Call) Run(run func()) *GeneralConfig_ImportedEthKeys_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *GeneralConfig_ImportedEthKeys_Call) Return(_a0 config.ImportableEthKeyLister) *GeneralConfig_ImportedEthKeys_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *GeneralConfig_ImportedEthKeys_Call) RunAndReturn(run func() config.ImportableEthKeyLister) *GeneralConfig_ImportedEthKeys_Call { + _c.Call.Return(run) + return _c +} + +// ImportedP2PKey provides a mock function with no fields +func (_m *GeneralConfig) ImportedP2PKey() config.ImportableKey { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for ImportedP2PKey") + } + + var r0 config.ImportableKey + if rf, ok := ret.Get(0).(func() config.ImportableKey); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(config.ImportableKey) + } + } + + return r0 +} + +// GeneralConfig_ImportedP2PKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ImportedP2PKey' +type GeneralConfig_ImportedP2PKey_Call struct { + *mock.Call +} + +// ImportedP2PKey is a helper method to define mock.On call +func (_e *GeneralConfig_Expecter) ImportedP2PKey() *GeneralConfig_ImportedP2PKey_Call { + return &GeneralConfig_ImportedP2PKey_Call{Call: _e.mock.On("ImportedP2PKey")} +} + +func (_c *GeneralConfig_ImportedP2PKey_Call) Run(run func()) *GeneralConfig_ImportedP2PKey_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *GeneralConfig_ImportedP2PKey_Call) Return(_a0 config.ImportableKey) *GeneralConfig_ImportedP2PKey_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *GeneralConfig_ImportedP2PKey_Call) RunAndReturn(run func() config.ImportableKey) *GeneralConfig_ImportedP2PKey_Call { + _c.Call.Return(run) + return _c +} + // Insecure provides a mock function with no fields func (_m *GeneralConfig) Insecure() config.Insecure { ret := _m.Called() diff --git a/core/services/chainlink/testdata/secrets-full-redacted.toml b/core/services/chainlink/testdata/secrets-full-redacted.toml index 9d91d79cb51..bfbb6e0941e 100644 --- a/core/services/chainlink/testdata/secrets-full-redacted.toml +++ b/core/services/chainlink/testdata/secrets-full-redacted.toml @@ -36,3 +36,18 @@ LegacyURL = 'xxxxx' URL = 'xxxxx' Username = 'xxxxx' Password = 'xxxxx' + +[EVM] +[[EVM.Keys]] +JSON = 'xxxxx' +ID = 1337 +Password = 'xxxxx' + +[[EVM.Keys]] +JSON = 'xxxxx' +ID = 9999 +Password = 'xxxxx' + +[P2PKey] +JSON = 'xxxxx' +Password = 'xxxxx' diff --git a/core/services/chainlink/testdata/secrets-full.toml b/core/services/chainlink/testdata/secrets-full.toml index 37a3e2e7dc2..3cd1202b9f0 100644 --- a/core/services/chainlink/testdata/secrets-full.toml +++ b/core/services/chainlink/testdata/secrets-full.toml @@ -8,9 +8,9 @@ VRF = "VRF_pass" [WebServer] [WebServer.LDAP] -ServerAddress = 'ldaps://127.0.0.1' -ReadOnlyUserLogin = 'viewer@example.com' -ReadOnlyUserPass = 'password' +ServerAddress = 'ldaps://127.0.0.1' +ReadOnlyUserLogin = 'viewer@example.com' +ReadOnlyUserPass = 'password' [Pyroscope] AuthToken = "pyroscope-token" @@ -33,3 +33,18 @@ LegacyURL = "https://chain2.old.link" URL = "https://chain2.link" Username = "username2" Password = "password2" + +[EVM] +[[EVM.Keys]] +JSON = '{"address":"f21997c29122b22f305ab16f67ae7e629ef717c1","crypto":{"cipher":"aes-128-ctr","ciphertext":"30305aaa098ea598d52d051e7456b3da8d9c341e7a059465ee4725e5fd791b77","cipherparams":{"iv":"60c25ca87354b54ce8737448856e0e29"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"0b76de520af402f80ec294dafe3c977037cbb4c1a67064156283112067d07498"},"mac":"fa981522b76c95d67a2d5b20aa28a27bce007156ec889b72ef01852d3ff5ff12"},"id":"00000000-0000-0000-0000-000000000000","version":3}' +ID = 1337 +Password = '' + +[[EVM.Keys]] +JSON = '{"address":"f21997c29122b22f305ab16f67ae7e629ef717c1","crypto":{"cipher":"aes-128-ctr","ciphertext":"30305aaa098ea598d52d051e7456b3da8d9c341e7a059465ee4725e5fd791b77","cipherparams":{"iv":"60c25ca87354b54ce8737448856e0e29"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"0b76de520af402f80ec294dafe3c977037cbb4c1a67064156283112067d07498"},"mac":"fa981522b76c95d67a2d5b20aa28a27bce007156ec889b72ef01852d3ff5ff12"},"id":"00000000-0000-0000-0000-000000000000","version":3}' +ID = 9999 +Password = '' + +[P2PKey] +JSON = '{"keyType":"P2P","publicKey":"ca3ddaa1faa0da0290a7ea2af63159de5648b853425be4f3cd59af43634b6652","peerID":"p2p_12D3KooWPRqEAWAEoNLkQKyAsk4ugefGyCquwhrRxQTKi3JRYXEq","crypto":{"cipher":"aes-128-ctr","ciphertext":"463a9e775cc3ae62ba1b9354da2d007221be22ef98b39862466bf7ace16a074cb6ff27be72fb96bd45dd96adcb74a31b35b665c9063e4b7f9077039f76f4fe270f34c9f3","cipherparams":{"iv":"741ba370caa7d34b8b0879e7afd3524f"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"51a575db1450e8c368396a221cb0acfcab3db83f2229fdc4b9065dca286d2069"},"mac":"911b25e421cbd8771e3bc8e434f8fdabf47942f96f71e62db1be65629ec06929"}}' +Password = '' diff --git a/core/services/chainlink/types.go b/core/services/chainlink/types.go index 49ed9961ee2..2365a9a02f0 100644 --- a/core/services/chainlink/types.go +++ b/core/services/chainlink/types.go @@ -5,6 +5,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" "github.com/smartcontractkit/chainlink/v2/core/config" + coreconfig "github.com/smartcontractkit/chainlink/v2/core/config" ) type GeneralConfig interface { @@ -17,4 +18,12 @@ type GeneralConfig interface { TronConfigs() RawConfigs // ConfigTOML returns both the user provided and effective configuration as TOML. ConfigTOML() (user, effective string) + ImportedSecretConfig +} + +// ImportedSecretConfig is a configuration for imported secrets +// to be imported into the keystore upon startup. +type ImportedSecretConfig interface { + ImportedP2PKey() coreconfig.ImportableKey + ImportedEthKeys() coreconfig.ImportableEthKeyLister } diff --git a/core/services/keystore/p2p.go b/core/services/keystore/p2p.go index bf7437ac3e6..259f7188856 100644 --- a/core/services/keystore/p2p.go +++ b/core/services/keystore/p2p.go @@ -110,7 +110,7 @@ func (ks *p2p) Import(ctx context.Context, keyJSON []byte, password string) (p2p return p2pkey.KeyV2{}, errors.Wrap(err, "P2PKeyStore#ImportKey failed to decrypt key") } if _, found := ks.keyRing.P2P[key.ID()]; found { - return p2pkey.KeyV2{}, fmt.Errorf("key with ID %s already exists", key.ID()) + return p2pkey.KeyV2{}, fmt.Errorf("p2p key %s: %w", key.ID(), ErrKeyExists) } return key, ks.keyManager.safeAddKey(ctx, key) } From 9abe6955ab3481d75f2b321ec008ce3f4b23c932 Mon Sep 17 00:00:00 2001 From: Aleksandr Bukata <96521086+bukata-sa@users.noreply.github.com> Date: Tue, 25 Feb 2025 17:05:51 +0000 Subject: [PATCH 55/58] CCIP-4796 ccip analyze mcms proposal (#16384) * CCIP-4796 ccip analyze mcms proposal * mcms analyze * integrate into deployer group * review fixes * review fixes --- deployment/ccip/changeset/deployer_group.go | 82 +++- .../ccip/changeset/deployer_group_test.go | 4 + deployment/ccip/changeset/state.go | 61 ++- deployment/changeset.go | 9 +- deployment/common/proposalutils/analyze.go | 426 ++++++++++++++++++ .../common/proposalutils/analyze_test.go | 148 ++++++ 6 files changed, 697 insertions(+), 33 deletions(-) create mode 100644 deployment/common/proposalutils/analyze.go create mode 100644 deployment/common/proposalutils/analyze_test.go diff --git a/deployment/ccip/changeset/deployer_group.go b/deployment/ccip/changeset/deployer_group.go index ca6828f6aa4..e389de0325a 100644 --- a/deployment/ccip/changeset/deployer_group.go +++ b/deployment/ccip/changeset/deployer_group.go @@ -5,17 +5,20 @@ import ( "fmt" "math/big" "slices" + "strings" "time" - "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" "golang.org/x/sync/errgroup" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" mcmslib "github.com/smartcontractkit/mcms" mcmstypes "github.com/smartcontractkit/mcms/types" + "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" ) @@ -45,18 +48,25 @@ type DeployerGroup struct { state CCIPOnChainState mcmConfig *MCMSConfig deploymentContext *DeploymentContext + txDecoder *proposalutils.TxCallDecoder + describeContext *proposalutils.ArgumentContext +} + +type DescribedTransaction struct { + Tx *types.Transaction + Description string } type DeploymentContext struct { description string - transactions map[uint64][]*types.Transaction + transactions map[uint64][]DescribedTransaction previousConfig *DeploymentContext } func NewDeploymentContext(description string) *DeploymentContext { return &DeploymentContext{ description: description, - transactions: make(map[uint64][]*types.Transaction), + transactions: make(map[uint64][]DescribedTransaction), previousConfig: nil, } } @@ -64,7 +74,7 @@ func NewDeploymentContext(description string) *DeploymentContext { func (d *DeploymentContext) Fork(description string) *DeploymentContext { return &DeploymentContext{ description: description, - transactions: make(map[uint64][]*types.Transaction), + transactions: make(map[uint64][]DescribedTransaction), previousConfig: d, } } @@ -74,9 +84,11 @@ type DeployerGroupWithContext interface { } type deployerGroupBuilder struct { - e deployment.Environment - state CCIPOnChainState - mcmConfig *MCMSConfig + e deployment.Environment + state CCIPOnChainState + mcmConfig *MCMSConfig + txDecoder *proposalutils.TxCallDecoder + describeContext *proposalutils.ArgumentContext } func (d *deployerGroupBuilder) WithDeploymentContext(description string) *DeployerGroup { @@ -84,6 +96,8 @@ func (d *deployerGroupBuilder) WithDeploymentContext(description string) *Deploy e: d.e, mcmConfig: d.mcmConfig, state: d.state, + txDecoder: d.txDecoder, + describeContext: d.describeContext, deploymentContext: NewDeploymentContext(description), } } @@ -101,10 +115,13 @@ func (d *deployerGroupBuilder) WithDeploymentContext(description string) *Deploy // # Execute the transaction or create the proposal // deployerGroup.Enact("Curse RMNRemote") func NewDeployerGroup(e deployment.Environment, state CCIPOnChainState, mcmConfig *MCMSConfig) DeployerGroupWithContext { + addresses, _ := e.ExistingAddresses.Addresses() return &deployerGroupBuilder{ - e: e, - mcmConfig: mcmConfig, - state: state, + e: e, + mcmConfig: mcmConfig, + state: state, + txDecoder: proposalutils.NewTxCallDecoder(nil), + describeContext: proposalutils.NewArgumentContext(addresses), } } @@ -113,6 +130,8 @@ func (d *DeployerGroup) WithDeploymentContext(description string) *DeployerGroup e: d.e, mcmConfig: d.mcmConfig, state: d.state, + txDecoder: d.txDecoder, + describeContext: d.describeContext, deploymentContext: d.deploymentContext.Fork(description), } } @@ -160,7 +179,6 @@ func (d *DeployerGroup) GetDeployer(chain uint64) (*bind.TransactOpts, error) { } startingNonce = new(big.Int).SetUint64(nonce) } - dc := d.deploymentContext sim.Signer = func(a common.Address, t *types.Transaction) (*types.Transaction, error) { txCount, err := d.getTransactionCount(chain) @@ -174,7 +192,21 @@ func (d *DeployerGroup) GetDeployer(chain uint64) (*bind.TransactOpts, error) { if err != nil { return nil, err } - dc.transactions[chain] = append(dc.transactions[chain], tx) + var description string + if abiStr, ok := d.state.Chains[chain].ABIByAddress[tx.To().Hex()]; ok { + _abi, err := abi.JSON(strings.NewReader(abiStr)) + if err != nil { + return nil, fmt.Errorf("could not get ABI: %w", err) + } + decodedCall, err := d.txDecoder.Analyze(tx.To().String(), &_abi, tx.Data()) + if err != nil { + d.e.Logger.Errorw("could not analyze transaction", + "chain", chain, "address", tx.To().Hex(), "nonce", currentNonce, "error", err) + } else { + description = decodedCall.Describe(d.describeContext) + } + } + dc.transactions[chain] = append(dc.transactions[chain], DescribedTransaction{Tx: tx, Description: description}) // Update the nonce to consider the transactions that have been sent sim.Nonce = big.NewInt(0).Add(currentNonce, big.NewInt(1)) return tx, nil @@ -191,8 +223,8 @@ func (d *DeployerGroup) getContextChainInOrder() []*DeploymentContext { return contexts } -func (d *DeployerGroup) getTransactions() map[uint64][]*types.Transaction { - transactions := make(map[uint64][]*types.Transaction) +func (d *DeployerGroup) getTransactions() map[uint64][]DescribedTransaction { + transactions := make(map[uint64][]DescribedTransaction) for _, c := range d.getContextChainInOrder() { for k, v := range c.transactions { transactions[k] = append(transactions[k], v...) @@ -216,23 +248,28 @@ func (d *DeployerGroup) Enact() (deployment.ChangesetOutput, error) { func (d *DeployerGroup) enactMcms() (deployment.ChangesetOutput, error) { contexts := d.getContextChainInOrder() - proposals := make([]mcmslib.TimelockProposal, 0) + proposals := make([]mcmslib.TimelockProposal, 0, len(contexts)) + describedProposals := make([]string, 0, len(contexts)) for _, dc := range contexts { - batches := make([]mcmstypes.BatchOperation, 0) + batches := make([]mcmstypes.BatchOperation, 0, len(dc.transactions)) + describedBatches := make([][]string, 0, len(dc.transactions)) for selector, txs := range dc.transactions { mcmTransactions := make([]mcmstypes.Transaction, len(txs)) + describedTxs := make([]string, len(txs)) for i, tx := range txs { var err error - mcmTransactions[i], err = proposalutils.TransactionForChain(selector, tx.To().Hex(), tx.Data(), tx.Value(), "", []string{}) + mcmTransactions[i], err = proposalutils.TransactionForChain(selector, tx.Tx.To().Hex(), tx.Tx.Data(), tx.Tx.Value(), "", []string{}) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to build mcms transaction: %w", err) } + describedTxs[i] = tx.Description } batches = append(batches, mcmstypes.BatchOperation{ ChainSelector: mcmstypes.ChainSelector(selector), Transactions: mcmTransactions, }) + describedBatches = append(describedBatches, describedTxs) } if len(batches) == 0 { @@ -259,6 +296,7 @@ func (d *DeployerGroup) enactMcms() (deployment.ChangesetOutput, error) { if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to build proposal %w", err) } + describedProposal := proposalutils.DescribeTimelockProposal(proposal, describedBatches) // Update the proposal metadata to incorporate the startingOpCount // from the previous proposal @@ -274,9 +312,13 @@ func (d *DeployerGroup) enactMcms() (deployment.ChangesetOutput, error) { } proposals = append(proposals, *proposal) + describedProposals = append(describedProposals, describedProposal) } - return deployment.ChangesetOutput{MCMSTimelockProposals: proposals}, nil + return deployment.ChangesetOutput{ + MCMSTimelockProposals: proposals, + DescribedTimelockProposals: describedProposals, + }, nil } func getBatchCountForChain(chain mcmstypes.ChainSelector, timelockProposal *mcmslib.TimelockProposal) uint64 { @@ -298,12 +340,12 @@ func (d *DeployerGroup) enactDeployer() (deployment.ChangesetOutput, error) { selector, txs := selector, txs g.Go(func() error { for _, tx := range txs { - err := d.e.Chains[selector].Client.SendTransaction(context.Background(), tx) + err := d.e.Chains[selector].Client.SendTransaction(context.Background(), tx.Tx) if err != nil { return fmt.Errorf("failed to send transaction: %w", err) } // TODO how to pass abi here to decode error reason - _, err = deployment.ConfirmIfNoError(d.e.Chains[selector], tx, err) + _, err = deployment.ConfirmIfNoError(d.e.Chains[selector], tx.Tx, err) if err != nil { return fmt.Errorf("waiting for tx to be mined failed: %w", err) } diff --git a/deployment/ccip/changeset/deployer_group_test.go b/deployment/ccip/changeset/deployer_group_test.go index edacadb5de1..fd7dea238e6 100644 --- a/deployment/ccip/changeset/deployer_group_test.go +++ b/deployment/ccip/changeset/deployer_group_test.go @@ -338,6 +338,10 @@ func TestDeployerGroupGenerateMultipleProposals(t *testing.T) { require.Equal(t, uint64(2), cs.MCMSTimelockProposals[0].ChainMetadata[mcmstypes.ChainSelector(e.Env.AllChainSelectors()[tc.mints[0].selectorIndex])].StartingOpCount) require.Equal(t, uint64(3), cs.MCMSTimelockProposals[1].ChainMetadata[mcmstypes.ChainSelector(e.Env.AllChainSelectors()[tc.mints[1].selectorIndex])].StartingOpCount) require.Equal(t, uint64(2), cs.MCMSTimelockProposals[2].ChainMetadata[mcmstypes.ChainSelector(e.Env.AllChainSelectors()[tc.mints[2].selectorIndex])].StartingOpCount) + require.Len(t, cs.DescribedTimelockProposals, len(tc.mints)) + require.NotEmpty(t, cs.DescribedTimelockProposals[0]) + require.NotEmpty(t, cs.DescribedTimelockProposals[1]) + require.NotEmpty(t, cs.DescribedTimelockProposals[2]) } func TestDeployerGroupMultipleProposalsMCMS(t *testing.T) { diff --git a/deployment/ccip/changeset/state.go b/deployment/ccip/changeset/state.go index 865521b7432..81981d81b07 100644 --- a/deployment/ccip/changeset/state.go +++ b/deployment/ccip/changeset/state.go @@ -13,6 +13,8 @@ import ( solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/burn_from_mint_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/link_token" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" @@ -121,6 +123,7 @@ type CCIPChainState struct { commoncs.MCMSWithTimelockState commoncs.LinkTokenState commoncs.StaticLinkTokenState + ABIByAddress map[string]string OnRamp onramp.OnRampInterface OffRamp offramp.OffRampInterface FeeQuoter *fee_quoter.FeeQuoter @@ -706,95 +709,113 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s return state, err } state.StaticLinkTokenState = *staticLinkState + state.ABIByAddress = make(map[string]string) for address, tvStr := range addresses { switch tvStr.String() { - case deployment.NewTypeAndVersion(commontypes.RBACTimelock, deployment.Version1_0_0).String(), - deployment.NewTypeAndVersion(commontypes.CallProxy, deployment.Version1_0_0).String(), - deployment.NewTypeAndVersion(commontypes.ProposerManyChainMultisig, deployment.Version1_0_0).String(), + case deployment.NewTypeAndVersion(commontypes.RBACTimelock, deployment.Version1_0_0).String(): + state.ABIByAddress[address] = gethwrappers.RBACTimelockABI + case deployment.NewTypeAndVersion(commontypes.CallProxy, deployment.Version1_0_0).String(): + state.ABIByAddress[address] = gethwrappers.CallProxyABI + case deployment.NewTypeAndVersion(commontypes.ProposerManyChainMultisig, deployment.Version1_0_0).String(), deployment.NewTypeAndVersion(commontypes.CancellerManyChainMultisig, deployment.Version1_0_0).String(), deployment.NewTypeAndVersion(commontypes.BypasserManyChainMultisig, deployment.Version1_0_0).String(), - deployment.NewTypeAndVersion(commontypes.LinkToken, deployment.Version1_0_0).String(), - deployment.NewTypeAndVersion(commontypes.StaticLinkToken, deployment.Version1_0_0).String(): - // Skip common contracts, they are already loaded. - continue + deployment.NewTypeAndVersion(commontypes.ManyChainMultisig, deployment.Version1_0_0).String(): + state.ABIByAddress[address] = gethwrappers.ManyChainMultiSigABI + case deployment.NewTypeAndVersion(commontypes.LinkToken, deployment.Version1_0_0).String(): + state.ABIByAddress[address] = link_token.LinkTokenABI + case deployment.NewTypeAndVersion(commontypes.StaticLinkToken, deployment.Version1_0_0).String(): + state.ABIByAddress[address] = link_token_interface.LinkTokenABI case deployment.NewTypeAndVersion(CapabilitiesRegistry, deployment.Version1_0_0).String(): cr, err := capabilities_registry.NewCapabilitiesRegistry(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.CapabilityRegistry = cr + state.ABIByAddress[address] = capabilities_registry.CapabilitiesRegistryABI case deployment.NewTypeAndVersion(OnRamp, deployment.Version1_6_0).String(): onRampC, err := onramp.NewOnRamp(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.OnRamp = onRampC + state.ABIByAddress[address] = onramp.OnRampABI case deployment.NewTypeAndVersion(OffRamp, deployment.Version1_6_0).String(): offRamp, err := offramp.NewOffRamp(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.OffRamp = offRamp + state.ABIByAddress[address] = offramp.OffRampABI case deployment.NewTypeAndVersion(ARMProxy, deployment.Version1_0_0).String(): armProxy, err := rmn_proxy_contract.NewRMNProxy(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.RMNProxy = armProxy + state.ABIByAddress[address] = rmn_proxy_contract.RMNProxyABI case deployment.NewTypeAndVersion(RMNRemote, deployment.Version1_6_0).String(): rmnRemote, err := rmn_remote.NewRMNRemote(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.RMNRemote = rmnRemote + state.ABIByAddress[address] = rmn_remote.RMNRemoteABI case deployment.NewTypeAndVersion(RMNHome, deployment.Version1_6_0).String(): rmnHome, err := rmn_home.NewRMNHome(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.RMNHome = rmnHome + state.ABIByAddress[address] = rmn_home.RMNHomeABI case deployment.NewTypeAndVersion(WETH9, deployment.Version1_0_0).String(): - weth9, err := weth9.NewWETH9(common.HexToAddress(address), chain.Client) + _weth9, err := weth9.NewWETH9(common.HexToAddress(address), chain.Client) if err != nil { return state, err } - state.Weth9 = weth9 + state.Weth9 = _weth9 + state.ABIByAddress[address] = weth9.WETH9ABI case deployment.NewTypeAndVersion(NonceManager, deployment.Version1_6_0).String(): nm, err := nonce_manager.NewNonceManager(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.NonceManager = nm + state.ABIByAddress[address] = nonce_manager.NonceManagerABI case deployment.NewTypeAndVersion(TokenAdminRegistry, deployment.Version1_5_0).String(): tm, err := token_admin_registry.NewTokenAdminRegistry(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.TokenAdminRegistry = tm + state.ABIByAddress[address] = token_admin_registry.TokenAdminRegistryABI case deployment.NewTypeAndVersion(RegistryModule, deployment.Version1_5_0).String(): rm, err := registry_module_owner_custom.NewRegistryModuleOwnerCustom(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.RegistryModule = rm + state.ABIByAddress[address] = registry_module_owner_custom.RegistryModuleOwnerCustomABI case deployment.NewTypeAndVersion(Router, deployment.Version1_2_0).String(): r, err := router.NewRouter(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.Router = r + state.ABIByAddress[address] = router.RouterABI case deployment.NewTypeAndVersion(TestRouter, deployment.Version1_2_0).String(): r, err := router.NewRouter(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.TestRouter = r + state.ABIByAddress[address] = router.RouterABI case deployment.NewTypeAndVersion(FeeQuoter, deployment.Version1_6_0).String(): fq, err := fee_quoter.NewFeeQuoter(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.FeeQuoter = fq + state.ABIByAddress[address] = fee_quoter.FeeQuoterABI case deployment.NewTypeAndVersion(USDCToken, deployment.Version1_0_0).String(): ut, err := burn_mint_erc677.NewBurnMintERC677(common.HexToAddress(address), chain.Client) if err != nil { @@ -803,6 +824,7 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s state.BurnMintTokens677 = map[TokenSymbol]*burn_mint_erc677.BurnMintERC677{ USDCSymbol: ut, } + state.ABIByAddress[address] = burn_mint_erc677.BurnMintERC677ABI case deployment.NewTypeAndVersion(USDCTokenPool, deployment.Version1_5_1).String(): utp, err := usdc_token_pool.NewUSDCTokenPool(common.HexToAddress(address), chain.Client) if err != nil { @@ -821,42 +843,49 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s state.USDCTokenPools = make(map[semver.Version]*usdc_token_pool.USDCTokenPool) } state.USDCTokenPools[deployment.Version1_5_1] = utp + state.ABIByAddress[address] = usdc_token_pool.USDCTokenPoolABI case deployment.NewTypeAndVersion(USDCMockTransmitter, deployment.Version1_0_0).String(): umt, err := mock_usdc_token_transmitter.NewMockE2EUSDCTransmitter(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.MockUSDCTransmitter = umt + state.ABIByAddress[address] = mock_usdc_token_transmitter.MockE2EUSDCTransmitterABI case deployment.NewTypeAndVersion(USDCTokenMessenger, deployment.Version1_0_0).String(): utm, err := mock_usdc_token_messenger.NewMockE2EUSDCTokenMessenger(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.MockUSDCTokenMessenger = utm + state.ABIByAddress[address] = mock_usdc_token_messenger.MockE2EUSDCTokenMessengerABI case deployment.NewTypeAndVersion(CCIPHome, deployment.Version1_6_0).String(): ccipHome, err := ccip_home.NewCCIPHome(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.CCIPHome = ccipHome + state.ABIByAddress[address] = ccip_home.CCIPHomeABI case deployment.NewTypeAndVersion(CCIPReceiver, deployment.Version1_0_0).String(): mr, err := maybe_revert_message_receiver.NewMaybeRevertMessageReceiver(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.Receiver = mr + state.ABIByAddress[address] = maybe_revert_message_receiver.MaybeRevertMessageReceiverABI case deployment.NewTypeAndVersion(LogMessageDataReceiver, deployment.Version1_0_0).String(): mr, err := log_message_data_receiver.NewLogMessageDataReceiver(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.LogMessageDataReceiver = mr + state.ABIByAddress[address] = log_message_data_receiver.LogMessageDataReceiverABI case deployment.NewTypeAndVersion(Multicall3, deployment.Version1_0_0).String(): mc, err := multicall3.NewMulticall3(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.Multicall3 = mc + state.ABIByAddress[address] = multicall3.Multicall3ABI case deployment.NewTypeAndVersion(PriceFeed, deployment.Version1_0_0).String(): feed, err := aggregator_v3_interface.NewAggregatorV3Interface(common.HexToAddress(address), chain.Client) if err != nil { @@ -874,6 +903,7 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s return state, fmt.Errorf("unknown feed description %s", desc) } state.USDFeeds[key] = feed + state.ABIByAddress[address] = aggregator_v3_interface.AggregatorV3InterfaceABI case deployment.NewTypeAndVersion(BurnMintTokenPool, deployment.Version1_5_1).String(): ethAddress := common.HexToAddress(address) pool, metadata, err := NewTokenPoolWithMetadata(ctx, burn_mint_token_pool.NewBurnMintTokenPool, ethAddress, chain.Client) @@ -881,6 +911,7 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s return state, fmt.Errorf("failed to connect address %s with token pool bindings and get token symbol: %w", ethAddress, err) } state.BurnMintTokenPools = helpers.AddValueToNestedMap(state.BurnMintTokenPools, metadata.Symbol, metadata.Version, pool) + state.ABIByAddress[address] = burn_mint_token_pool.BurnMintTokenPoolABI case deployment.NewTypeAndVersion(BurnWithFromMintTokenPool, deployment.Version1_5_1).String(): ethAddress := common.HexToAddress(address) pool, metadata, err := NewTokenPoolWithMetadata(ctx, burn_with_from_mint_token_pool.NewBurnWithFromMintTokenPool, ethAddress, chain.Client) @@ -888,6 +919,7 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s return state, fmt.Errorf("failed to connect address %s with token pool bindings and get token symbol: %w", ethAddress, err) } state.BurnWithFromMintTokenPools = helpers.AddValueToNestedMap(state.BurnWithFromMintTokenPools, metadata.Symbol, metadata.Version, pool) + state.ABIByAddress[address] = burn_with_from_mint_token_pool.BurnWithFromMintTokenPoolABI case deployment.NewTypeAndVersion(BurnFromMintTokenPool, deployment.Version1_5_1).String(): ethAddress := common.HexToAddress(address) pool, metadata, err := NewTokenPoolWithMetadata(ctx, burn_from_mint_token_pool.NewBurnFromMintTokenPool, ethAddress, chain.Client) @@ -895,6 +927,7 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s return state, fmt.Errorf("failed to connect address %s with token pool bindings and get token symbol: %w", ethAddress, err) } state.BurnFromMintTokenPools = helpers.AddValueToNestedMap(state.BurnFromMintTokenPools, metadata.Symbol, metadata.Version, pool) + state.ABIByAddress[address] = burn_from_mint_token_pool.BurnFromMintTokenPoolABI case deployment.NewTypeAndVersion(LockReleaseTokenPool, deployment.Version1_5_1).String(): ethAddress := common.HexToAddress(address) pool, metadata, err := NewTokenPoolWithMetadata(ctx, lock_release_token_pool.NewLockReleaseTokenPool, ethAddress, chain.Client) @@ -902,6 +935,7 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s return state, fmt.Errorf("failed to connect address %s with token pool bindings and get token symbol: %w", ethAddress, err) } state.LockReleaseTokenPools = helpers.AddValueToNestedMap(state.LockReleaseTokenPools, metadata.Symbol, metadata.Version, pool) + state.ABIByAddress[address] = lock_release_token_pool.LockReleaseTokenPoolABI case deployment.NewTypeAndVersion(BurnMintToken, deployment.Version1_0_0).String(): tok, err := burn_mint_erc677.NewBurnMintERC677(common.HexToAddress(address), chain.Client) if err != nil { @@ -915,6 +949,7 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s return state, fmt.Errorf("failed to get token symbol of token at %s: %w", address, err) } state.BurnMintTokens677[TokenSymbol(symbol)] = tok + state.ABIByAddress[address] = burn_mint_erc677.BurnMintERC677ABI case deployment.NewTypeAndVersion(ERC20Token, deployment.Version1_0_0).String(): tok, err := erc20.NewERC20(common.HexToAddress(address), chain.Client) if err != nil { @@ -928,6 +963,7 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s return state, fmt.Errorf("failed to get token symbol of token at %s: %w", address, err) } state.ERC20Tokens[TokenSymbol(symbol)] = tok + state.ABIByAddress[address] = erc20.ERC20ABI case deployment.NewTypeAndVersion(ERC677Token, deployment.Version1_0_0).String(): tok, err := erc677.NewERC677(common.HexToAddress(address), chain.Client) if err != nil { @@ -941,6 +977,7 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s return state, fmt.Errorf("failed to get token symbol of token at %s: %w", address, err) } state.ERC677Tokens[TokenSymbol(symbol)] = tok + state.ABIByAddress[address] = erc677.ERC677ABI // legacy addresses below case deployment.NewTypeAndVersion(OnRamp, deployment.Version1_5_0).String(): onRampC, err := evm_2_evm_onramp.NewEVM2EVMOnRamp(common.HexToAddress(address), chain.Client) @@ -955,6 +992,7 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s state.EVM2EVMOnRamp = make(map[uint64]*evm_2_evm_onramp.EVM2EVMOnRamp) } state.EVM2EVMOnRamp[sCfg.DestChainSelector] = onRampC + state.ABIByAddress[address] = evm_2_evm_onramp.EVM2EVMOnRampABI case deployment.NewTypeAndVersion(OffRamp, deployment.Version1_5_0).String(): offRamp, err := evm_2_evm_offramp.NewEVM2EVMOffRamp(common.HexToAddress(address), chain.Client) if err != nil { @@ -968,6 +1006,7 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s state.EVM2EVMOffRamp = make(map[uint64]*evm_2_evm_offramp.EVM2EVMOffRamp) } state.EVM2EVMOffRamp[sCfg.SourceChainSelector] = offRamp + state.ABIByAddress[address] = evm_2_evm_offramp.EVM2EVMOffRampABI case deployment.NewTypeAndVersion(CommitStore, deployment.Version1_5_0).String(): commitStore, err := commit_store.NewCommitStore(common.HexToAddress(address), chain.Client) if err != nil { @@ -981,24 +1020,28 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s state.CommitStore = make(map[uint64]*commit_store.CommitStore) } state.CommitStore[sCfg.SourceChainSelector] = commitStore + state.ABIByAddress[address] = commit_store.CommitStoreABI case deployment.NewTypeAndVersion(PriceRegistry, deployment.Version1_2_0).String(): pr, err := price_registry_1_2_0.NewPriceRegistry(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.PriceRegistry = pr + state.ABIByAddress[address] = price_registry_1_2_0.PriceRegistryABI case deployment.NewTypeAndVersion(RMN, deployment.Version1_5_0).String(): rmnC, err := rmn_contract.NewRMNContract(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.RMN = rmnC + state.ABIByAddress[address] = rmn_contract.RMNContractABI case deployment.NewTypeAndVersion(MockRMN, deployment.Version1_0_0).String(): mockRMN, err := mock_rmn_contract.NewMockRMNContract(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.MockRMN = mockRMN + state.ABIByAddress[address] = mock_rmn_contract.MockRMNContractABI default: return state, fmt.Errorf("unknown contract %s", tvStr) } diff --git a/deployment/changeset.go b/deployment/changeset.go index ca25d4251b3..dfa1fbae7e5 100644 --- a/deployment/changeset.go +++ b/deployment/changeset.go @@ -104,10 +104,11 @@ type ChangesetOutput struct { JobSpecs map[string][]string `deprecated:"true"` Jobs []ProposedJob // Deprecated: Prefer MCMSTimelockProposals instead, will be removed in future - Proposals []timelock.MCMSWithTimelockProposal - MCMSTimelockProposals []mcms.TimelockProposal - MCMSProposals []mcms.Proposal - AddressBook AddressBook + Proposals []timelock.MCMSWithTimelockProposal + MCMSTimelockProposals []mcms.TimelockProposal + DescribedTimelockProposals []string + MCMSProposals []mcms.Proposal + AddressBook AddressBook } // ViewState produces a product specific JSON representation of diff --git a/deployment/common/proposalutils/analyze.go b/deployment/common/proposalutils/analyze.go new file mode 100644 index 00000000000..3da1bbb6404 --- /dev/null +++ b/deployment/common/proposalutils/analyze.go @@ -0,0 +1,426 @@ +package proposalutils + +import ( + "fmt" + "reflect" + "regexp" + "strconv" + "strings" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + chain_selectors "github.com/smartcontractkit/chain-selectors" + mcmslib "github.com/smartcontractkit/mcms" + + "github.com/smartcontractkit/chainlink/deployment" +) + +const Indent = " " +const DoubleIndent = Indent + Indent + +var ( + _ Analyzer = BytesAndAddressAnalyzer + _ Analyzer = ChainSelectorAnalyzer + chainSelectorRegex = regexp.MustCompile(`[cC]hain([sS]el)?.*$`) +) + +// Argument is a unit of decoded proposal. Calling Describe on it returns human-readable representation of its content. +// Some implementations are recursive (arrays, structs) and require attention to formatting. +type Argument interface { + Describe(ctx *ArgumentContext) string +} + +// Analyzer is an extension point of proposal decoding. +// You can implement your own Analyzer which returns your own Argument instance. +type Analyzer func(argName string, argAbi *abi.Type, argVal interface{}, analyzers []Analyzer) Argument + +// ArgumentContext is a storage for context that may need to Argument during its description. +// Refer to BytesAndAddressAnalyzer and ChainSelectorAnalyzer for usage examples +type ArgumentContext struct { + Ctx map[string]interface{} +} + +func ContextGet[T any](ctx *ArgumentContext, key string) (T, error) { + ctxElemRaw, ok := ctx.Ctx[key] + if !ok { + return *new(T), fmt.Errorf("context element %s not found", key) + } + ctxElem, ok := ctxElemRaw.(T) + if !ok { + return *new(T), fmt.Errorf("context element %s type mismatch (expected: %T, was: %T)", key, ctxElem, ctxElemRaw) + } + return ctxElem, nil +} + +func NewArgumentContext(addresses deployment.AddressesByChain) *ArgumentContext { + return &ArgumentContext{ + Ctx: map[string]interface{}{ + "AddressesByChain": addresses, + }, + } +} + +type NamedArgument struct { + Name string + Value Argument +} + +func (n NamedArgument) Describe(context *ArgumentContext) string { + return fmt.Sprintf("%s: %s", n.Name, n.Value.Describe(context)) +} + +type ArrayArgument struct { + Elements []Argument +} + +func (a ArrayArgument) Describe(context *ArgumentContext) string { + indented := false + elementsDescribed := make([]string, 0, len(a.Elements)) + for _, arg := range a.Elements { + argDescribed := arg.Describe(context) + indented = indented || strings.Contains(argDescribed, Indent) + elementsDescribed = append(elementsDescribed, argDescribed) + } + description := strings.Builder{} + if indented { + // Write each element in new line + indentation + description.WriteString("[\n") + for i, elem := range elementsDescribed { + description.WriteString(indentString(elem)) + if i < len(a.Elements)-1 { + description.WriteString(",\n") + } + } + description.WriteString("\n]") + } else { + // Write elements in one line + description.WriteString("[") + for i, elem := range elementsDescribed { + description.WriteString(elem) + if i < len(a.Elements)-1 { + description.WriteString(",") + } + } + description.WriteString("]") + } + return description.String() +} + +type StructArgument struct { + Fields []NamedArgument +} + +func (s StructArgument) Describe(context *ArgumentContext) string { + description := strings.Builder{} + if len(s.Fields) >= 2 { + // Pretty format struct with indentation + description.WriteString("{\n") + for _, arg := range s.Fields { + description.WriteString(indentString(arg.Describe(context))) + description.WriteString("\n") + } + description.WriteString("}") + } else { + // Struct in one line + description.WriteString("{ ") + for i, arg := range s.Fields { + description.WriteString(arg.Describe(context)) + if i < len(s.Fields)-1 { + description.WriteString(", ") + } + } + description.WriteString(" }") + } + return description.String() +} + +type SimpleArgument struct { + Value string +} + +func (s SimpleArgument) Describe(_ *ArgumentContext) string { + return s.Value +} + +type ChainSelectorArgument struct { + Value uint64 +} + +func (c ChainSelectorArgument) Describe(_ *ArgumentContext) string { + chainName, err := GetChainNameBySelector(c.Value) + if err != nil || chainName == "" { + return fmt.Sprintf("%d ()", c.Value) + } + return fmt.Sprintf("%d (%s)", c.Value, chainName) +} + +type BytesArgument struct { + Value []byte +} + +func (a BytesArgument) Describe(_ *ArgumentContext) string { + return hexutil.Encode(a.Value) +} + +type AddressArgument struct { + Value common.Address +} + +func (a AddressArgument) Describe(ctx *ArgumentContext) string { + description := a.Value.Hex() + " (address of from )" + addresses, err := ContextGet[deployment.AddressesByChain](ctx, "AddressesByChain") + if err != nil { + return description + } + for chainSel, addresses := range addresses { + chainName, err := GetChainNameBySelector(chainSel) + if err != nil || chainName == "" { + chainName = strconv.FormatUint(chainSel, 10) + } + typeAndVersion, ok := addresses[a.Value.Hex()] + if ok { + return fmt.Sprintf("%s (address of %s from %s)", a.Value.Hex(), typeAndVersion.String(), chainName) + } + } + return description +} + +type DecodedCall struct { + Address string + Method string + Inputs []NamedArgument + Outputs []NamedArgument +} + +func (d *DecodedCall) Describe(context *ArgumentContext) string { + description := strings.Builder{} + description.WriteString(fmt.Sprintf("Address: %s\n", AddressArgument{Value: common.HexToAddress(d.Address)}.Describe(context))) + description.WriteString(fmt.Sprintf("Method: %s\n", d.Method)) + describedInputs := d.describeArguments(d.Inputs, context) + if len(describedInputs) > 0 { + description.WriteString(fmt.Sprintf("Inputs:\n%s\n", indentString(describedInputs))) + } + describedOutputs := d.describeArguments(d.Outputs, context) + if len(describedOutputs) > 0 { + description.WriteString(fmt.Sprintf("Outputs:\n%s\n", indentString(describedOutputs))) + } + return description.String() +} + +func (d *DecodedCall) describeArguments(arguments []NamedArgument, context *ArgumentContext) string { + description := strings.Builder{} + for _, argument := range arguments { + description.WriteString(argument.Describe(context)) + description.WriteRune('\n') + } + return description.String() +} + +type TxCallDecoder struct { + Analyzers []Analyzer +} + +func NewTxCallDecoder(extraAnalyzers []Analyzer) *TxCallDecoder { + analyzers := make([]Analyzer, 0, len(extraAnalyzers)+2) + analyzers = append(analyzers, extraAnalyzers...) + analyzers = append(analyzers, BytesAndAddressAnalyzer) + analyzers = append(analyzers, ChainSelectorAnalyzer) + return &TxCallDecoder{Analyzers: analyzers} +} + +func (p *TxCallDecoder) Analyze(address string, abi *abi.ABI, data []byte) (*DecodedCall, error) { + methodID, methodData := data[:4], data[4:] + method, err := abi.MethodById(methodID) + if err != nil { + return nil, err + } + outs := make(map[string]interface{}) + err = method.Outputs.UnpackIntoMap(outs, methodData) + if err != nil { + return nil, err + } + args := make(map[string]interface{}) + err = method.Inputs.UnpackIntoMap(args, methodData) + if err != nil { + return nil, err + } + return p.analyzeMethodCall(address, method, args, outs) +} + +func (p *TxCallDecoder) analyzeMethodCall(address string, method *abi.Method, args map[string]interface{}, outs map[string]interface{}) (*DecodedCall, error) { + inputs := make([]NamedArgument, len(method.Inputs)) + for i, input := range method.Inputs { + arg, ok := args[input.Name] + if !ok { + return nil, fmt.Errorf("missing argument '%s'", input.Name) + } + inputs[i] = NamedArgument{ + Name: input.Name, + Value: p.analyzeArg(input.Name, &input.Type, arg), + } + } + outputs := make([]NamedArgument, len(method.Outputs)) + for i, output := range method.Outputs { + out, ok := outs[output.Name] + if !ok { + return nil, fmt.Errorf("missing output '%s'", output.Name) + } + outputs[i] = NamedArgument{ + Name: output.Name, + Value: p.analyzeArg(output.Name, &output.Type, out), + } + } + return &DecodedCall{ + Address: address, + Method: method.String(), + Inputs: inputs, + Outputs: outputs, + }, nil +} + +func (p *TxCallDecoder) analyzeArg(argName string, argAbi *abi.Type, argVal interface{}) Argument { + if len(p.Analyzers) > 0 { + for _, analyzer := range p.Analyzers { + arg := analyzer(argName, argAbi, argVal, p.Analyzers) + if arg != nil { + return arg + } + } + } + // Struct analyzer + if argAbi.T == abi.TupleTy { + return p.analyzeStruct(argAbi, argVal) + } + // Array analyzer + if argAbi.T == abi.SliceTy || argAbi.T == abi.ArrayTy { + return p.analyzeArray(argName, argAbi, argVal) + } + // Fallback + return SimpleArgument{Value: fmt.Sprintf("%v", argVal)} +} + +func (p *TxCallDecoder) analyzeStruct(argAbi *abi.Type, argVal interface{}) StructArgument { + argTyp := argAbi.GetType() + fields := make([]NamedArgument, argTyp.NumField()) + for i := 0; i < argTyp.NumField(); i++ { + if !argTyp.Field(i).IsExported() { + continue + } + argFieldName := argTyp.Field(i).Name + argFieldAbi := argAbi.TupleElems[i] + argFieldTyp := reflect.ValueOf(argVal).FieldByName(argFieldName) + argument := p.analyzeArg(argFieldName, argFieldAbi, argFieldTyp.Interface()) + fields[i] = NamedArgument{ + Name: argFieldName, + Value: argument, + } + } + return StructArgument{ + Fields: fields, + } +} + +func (p *TxCallDecoder) analyzeArray(argName string, argAbi *abi.Type, argVal interface{}) ArrayArgument { + argTyp := reflect.ValueOf(argVal) + elements := make([]Argument, argTyp.Len()) + for i := 0; i < argTyp.Len(); i++ { + argElemTyp := argTyp.Index(i) + argument := p.analyzeArg(argName, argAbi.Elem, argElemTyp.Interface()) + elements[i] = argument + } + return ArrayArgument{ + Elements: elements, + } +} + +func BytesAndAddressAnalyzer(_ string, argAbi *abi.Type, argVal interface{}, _ []Analyzer) Argument { + if argAbi.T == abi.FixedBytesTy || argAbi.T == abi.BytesTy || argAbi.T == abi.AddressTy { + argArrTyp := reflect.ValueOf(argVal) + argArr := make([]byte, argArrTyp.Len()) + for i := 0; i < argArrTyp.Len(); i++ { + argArr[i] = byte(argArrTyp.Index(i).Uint()) + } + if argAbi.T == abi.AddressTy { + return AddressArgument{Value: common.BytesToAddress(argArr)} + } + return BytesArgument{Value: argArr} + } + return nil +} + +func ChainSelectorAnalyzer(argName string, argAbi *abi.Type, argVal interface{}, _ []Analyzer) Argument { + if argAbi.GetType().Kind() == reflect.Uint64 && chainSelectorRegex.MatchString(argName) { + return ChainSelectorArgument{Value: argVal.(uint64)} + } + return nil +} + +func indentString(s string) string { + return indentStringWith(s, Indent) +} + +func indentStringWith(s string, indent string) string { + result := &strings.Builder{} + components := strings.Split(s, "\n") + for i, component := range components { + result.WriteString(indent) + result.WriteString(component) + if i < len(components)-1 { + result.WriteString("\n") + } + } + return result.String() +} + +func GetChainNameBySelector(selector uint64) (string, error) { + chainID, err := chain_selectors.GetChainIDFromSelector(selector) + if err != nil { + return "", err + } + family, err := chain_selectors.GetSelectorFamily(selector) + if err != nil { + return "", err + } + chainInfo, err := chain_selectors.GetChainDetailsByChainIDAndFamily(chainID, family) + if err != nil { + return "", err + } + return chainInfo.ChainName, nil +} + +func DescribeProposal(proposal *mcmslib.Proposal, describedOperations []string) string { + var describedProposal strings.Builder + for opIdx, opDesc := range describedOperations { + chainSelector := uint64(proposal.Operations[opIdx].ChainSelector) + chainName, err := GetChainNameBySelector(chainSelector) + if err != nil || chainName == "" { + chainName = "" + } + describedProposal.WriteString("Operation #" + strconv.Itoa(opIdx)) + describedProposal.WriteString(fmt.Sprintf("Chain selector: %v (%s)\n", chainSelector, chainName)) + describedProposal.WriteString(indentString(opDesc)) + describedProposal.WriteString("\n") + } + return describedProposal.String() +} + +func DescribeTimelockProposal(proposal *mcmslib.TimelockProposal, describedBatches [][]string) string { + var describedProposal strings.Builder + for batchIdx, describedOperations := range describedBatches { + chainSelector := uint64(proposal.Operations[batchIdx].ChainSelector) + chainName, err := GetChainNameBySelector(chainSelector) + if err != nil || chainName == "" { + chainName = "" + } + describedProposal.WriteString(fmt.Sprintf("Batch #%v\n", batchIdx)) + describedProposal.WriteString(fmt.Sprintf("Chain selector: %v (%s)\n", chainSelector, chainName)) + for opIdx, opDesc := range describedOperations { + describedProposal.WriteString(indentString("Operation #" + strconv.Itoa(opIdx))) + describedProposal.WriteString("\n") + describedProposal.WriteString(indentStringWith(opDesc, DoubleIndent)) + describedProposal.WriteString("\n") + } + } + return describedProposal.String() +} diff --git a/deployment/common/proposalutils/analyze_test.go b/deployment/common/proposalutils/analyze_test.go new file mode 100644 index 00000000000..2505af0b02d --- /dev/null +++ b/deployment/common/proposalutils/analyze_test.go @@ -0,0 +1,148 @@ +package proposalutils + +import ( + "encoding/base64" + "strings" + "testing" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_home" +) + +func Test_AnalyzeRmnHomeSetConfig(t *testing.T) { + dataEncoded := "EY26xQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+mHAtKPceHWHsUU/gZ3gbQUSqxoUZSI6A1wsufMtT1Ds0lEhXpCRE0bKF15QNbgZoIwngeB5DppZ27p+FxzwtFJl4urMXKidA5eY8JSHVPtI1h4ZiTOwbcUx4ju2t4QG2jZ8/J045hVKKkjqbrOPTnFXdd4sYe0Egs4TMSMiShZgAHkr6j6Bhgz3+4p0ob33+C3inZ/H6HxUrzaTVNBUGFa+O4yMWpkJ/FppF/cGzqRqFrEWePBy5HGnhxR8MH8IQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3kG6T8nZGtkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzPCjGiIfPJsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMEYRtq/7p2oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" + data := make([]byte, base64.StdEncoding.DecodedLen(len(dataEncoded))) + _, err := base64.StdEncoding.Decode(data, []byte(dataEncoded)) + require.NoError(t, err) + _abi, err := abi.JSON(strings.NewReader(rmn_home.RMNHomeABI)) + require.NoError(t, err) + decoder := NewTxCallDecoder(nil) + analyzeResult, err := decoder.Analyze(common.Address{}.Hex(), &_abi, data) + require.NoError(t, err) + assert.Equal(t, _abi.Methods["setCandidate"].String(), analyzeResult.Method) + assert.Equal(t, "staticConfig", analyzeResult.Inputs[0].Name) + assert.Equal(t, StructArgument{ + Fields: []NamedArgument{ + { + Name: "Nodes", + Value: ArrayArgument{ + Elements: []Argument{ + StructArgument{ + Fields: []NamedArgument{ + { + Name: "PeerId", + Value: BytesArgument{Value: hexutil.MustDecode("0xe98702d28f71e1d61ec514fe067781b4144aac68519488e80d70b2e7ccb53d43")}, + }, + { + Name: "OffchainPublicKey", + Value: BytesArgument{Value: hexutil.MustDecode("0xb34944857a42444d1b285d7940d6e06682309e0781e43a69676ee9f85c73c2d1")}, + }, + }, + }, + StructArgument{ + Fields: []NamedArgument{ + { + Name: "PeerId", + Value: BytesArgument{Value: hexutil.MustDecode("0x49978bab3172a2740e5e63c2521d53ed2358786624cec1b714c788eedade101b")}, + }, + { + Name: "OffchainPublicKey", + Value: BytesArgument{Value: hexutil.MustDecode("0x68d9f3f274e3985528a923a9bace3d39c55dd778b187b4120b384cc48c892859")}, + }, + }, + }, + StructArgument{ + Fields: []NamedArgument{ + { + Name: "PeerId", + Value: BytesArgument{Value: hexutil.MustDecode("0x8001e4afa8fa061833dfee29d286f7dfe0b78a767f1fa1f152bcda4d53415061")}, + }, + { + Name: "OffchainPublicKey", + Value: BytesArgument{Value: hexutil.MustDecode("0x5af8ee32316a6427f169a45fdc1b3a91a85ac459e3c1cb91c69e1c51f0c1fc21")}, + }, + }, + }, + }, + }, + }, + { + Name: "OffchainConfig", + Value: BytesArgument{Value: hexutil.MustDecode("0x")}, + }, + }, + }, analyzeResult.Inputs[0].Value) + assert.Equal(t, "dynamicConfig", analyzeResult.Inputs[1].Name) + assert.Equal(t, StructArgument{ + Fields: []NamedArgument{ + { + Name: "SourceChains", + Value: ArrayArgument{ + Elements: []Argument{ + StructArgument{ + Fields: []NamedArgument{ + { + Name: "ChainSelector", + Value: ChainSelectorArgument{Value: 16015286601757825753}, + }, + { + Name: "FObserve", + Value: SimpleArgument{Value: "1"}, + }, + { + Name: "ObserverNodesBitmap", + Value: SimpleArgument{Value: "7"}, + }, + }, + }, + StructArgument{ + Fields: []NamedArgument{ + { + Name: "ChainSelector", + Value: ChainSelectorArgument{Value: 14767482510784806043}, + }, + { + Name: "FObserve", + Value: SimpleArgument{Value: "1"}, + }, + { + Name: "ObserverNodesBitmap", + Value: SimpleArgument{Value: "7"}, + }, + }, + }, + StructArgument{ + Fields: []NamedArgument{ + { + Name: "ChainSelector", + Value: ChainSelectorArgument{Value: 3478487238524512106}, + }, + { + Name: "FObserve", + Value: SimpleArgument{Value: "1"}, + }, + { + Name: "ObserverNodesBitmap", + Value: SimpleArgument{Value: "7"}, + }, + }, + }, + }, + }, + }, + { + Name: "OffchainConfig", + Value: BytesArgument{Value: hexutil.MustDecode("0x")}, + }, + }, + }, analyzeResult.Inputs[1].Value) + assert.Equal(t, "digestToOverwrite", analyzeResult.Inputs[2].Name) + assert.Equal(t, BytesArgument{Value: hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000000000")}, analyzeResult.Inputs[2].Value) + assert.Equal(t, "newConfigDigest", analyzeResult.Outputs[0].Name) + assert.Equal(t, BytesArgument{Value: hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000000060")}, analyzeResult.Outputs[0].Value) +} From 576c0e3851bef290249e4221bda6aa47b9d73606 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 25 Feb 2025 12:06:32 -0500 Subject: [PATCH 56/58] ReportCodec verification of channel definitions; bump go to 1.24 (#16541) * ReportCodec verification of channel definitions * Bump go to 1.24 * remove obsolete cluster profile * Fix mockery * Fix tests --------- Co-authored-by: skudasov --- .github/actions/golangci-lint/action.yml | 2 +- GNUmakefile | 4 +- common/txmgr/mocks/tx_manager.go | 2 +- common/txmgr/types/mocks/forwarder_manager.go | 2 +- common/txmgr/types/mocks/key_store.go | 2 +- .../txmgr/types/mocks/tx_attempt_builder.go | 2 +- common/txmgr/types/mocks/tx_store.go | 2 +- common/txmgr/types/mocks/tx_strategy.go | 2 +- common/types/mocks/monitoring_endpoint.go | 2 +- contracts/GNUmakefile | 2 +- core/bridges/mocks/orm.go | 2 +- .../ccip/common/mocks/extra_data_codec.go | 2 +- .../ccip/types/mocks/ccip_oracle.go | 2 +- .../ccip/types/mocks/oracle_creator.go | 2 +- core/capabilities/remote/types/messages.pb.go | 2 +- .../remote/types/mocks/dispatcher.go | 2 +- .../remote/types/mocks/receiver.go | 2 +- .../targets/mocks/contract_value_getter.go | 2 +- .../targets/mocks/contract_writer.go | 2 +- core/chainlink.Dockerfile | 4 +- core/chains/evm/log/mocks/abigen_contract.go | 2 +- core/chains/evm/log/mocks/broadcast.go | 2 +- core/chains/evm/log/mocks/broadcaster.go | 2 +- core/chains/evm/logpoller/mocks/log_poller.go | 2 +- .../evm/txm/mock_attempt_builder_test.go | 2 +- core/chains/evm/txm/mock_client_test.go | 2 +- core/chains/evm/txm/mock_keystore_test.go | 2 +- core/chains/evm/txm/mock_tx_store_test.go | 2 +- core/chains/evm/txmgr/mocks/config.go | 2 +- core/chains/evm/txmgr/mocks/evm_tx_store.go | 2 +- core/chains/legacyevm/mocks/chain.go | 2 +- .../legacyevm/mocks/legacy_chain_container.go | 2 +- core/cmd/mocks/prompter.go | 2 +- core/config/mocks/telemetry_ingress.go | 2 +- .../mocks/telemetry_ingress_endpoint.go | 2 +- .../ccip/mocks/commit_store_interface.go | 2 +- .../ccip/mocks/evm2_evm_off_ramp_interface.go | 2 +- .../ccip/mocks/evm2_evm_on_ramp_interface.go | 2 +- .../ccip/mocks/link_token_interface.go | 2 +- .../v1_2_0/evm2_evm_off_ramp_interface.go | 2 +- .../arbitrum_gateway_router_interface.go | 2 +- .../arbitrum_inbox_interface.go | 2 +- .../arbitrum_l1_bridge_adapter_interface.go | 2 +- .../arbitrum_l2_bridge_adapter_interface.go | 2 +- .../arb_rollup_core_interface.go | 2 +- .../mocks/mock_arbsys/arb_sys_interface.go | 2 +- .../l2_arbitrum_gateway_interface.go | 2 +- .../l2_arbitrum_messenger_interface.go | 2 +- .../node_interface_interface.go | 2 +- ...optimism_dispute_game_factory_interface.go | 2 +- .../optimism_l2_output_oracle_interface.go | 2 +- .../optimism_portal_interface.go | 2 +- .../optimism_portal2_interface.go | 2 +- core/internal/cltest/factories.go | 4 +- core/internal/mocks/application.go | 2 +- core/internal/mocks/flags.go | 2 +- core/internal/mocks/flux_aggregator.go | 2 +- core/logger/logger_mocks.go | 2 +- core/scripts/go.mod | 161 ++-- core/scripts/go.sum | 316 ++++---- core/services/blockhashstore/mocks/bhs.go | 2 +- core/services/blockhashstore/mocks/timer.go | 2 +- core/services/ccip/mocks/orm.go | 2 +- .../chainlink/mocks/general_config.go | 2 +- .../feeds/mocks/connections_manager.go | 2 +- .../feeds/mocks/feeds_manager_client.go | 2 +- core/services/feeds/mocks/orm.go | 2 +- core/services/feeds/mocks/service.go | 2 +- .../fluxmonitorv2/mocks/contract_submitter.go | 2 +- core/services/fluxmonitorv2/mocks/flags.go | 2 +- .../mocks/key_store_interface.go | 2 +- core/services/fluxmonitorv2/mocks/orm.go | 2 +- .../functions/mocks/bridge_accessor.go | 2 +- .../mocks/external_adapter_client.go | 2 +- .../functions/mocks/functions_listener.go | 2 +- .../functions/mocks/offchain_transmitter.go | 2 +- core/services/functions/mocks/orm.go | 2 +- .../connector/mocks/gateway_connector.go | 2 +- .../mocks/gateway_connector_handler.go | 2 +- .../gateway/connector/mocks/signer.go | 2 +- .../allowlist/mocks/onchain_allowlist.go | 2 +- .../handlers/functions/allowlist/mocks/orm.go | 2 +- .../mocks/onchain_subscriptions.go | 2 +- .../functions/subscriptions/mocks/orm.go | 2 +- core/services/gateway/handlers/mocks/don.go | 2 +- .../gateway/handlers/mocks/handler.go | 2 +- .../network/mocks/connection_acceptor.go | 2 +- .../network/mocks/connection_initiator.go | 2 +- .../gateway/network/mocks/http_client.go | 2 +- .../network/mocks/http_request_handler.go | 2 +- .../gateway/network/mocks/http_server.go | 2 +- .../network/mocks/web_socket_server.go | 2 +- .../headreporter/head_reporter_mock.go | 2 +- .../headreporter/prometheus_backend_mock.go | 2 +- core/services/job/mocks/kv_store.go | 2 +- core/services/job/mocks/orm.go | 2 +- core/services/job/mocks/service_ctx.go | 2 +- core/services/job/mocks/spawner.go | 2 +- core/services/keystore/mocks/aptos.go | 2 +- core/services/keystore/mocks/cosmos.go | 2 +- core/services/keystore/mocks/csa.go | 2 +- core/services/keystore/mocks/eth.go | 2 +- core/services/keystore/mocks/master.go | 2 +- core/services/keystore/mocks/ocr.go | 2 +- core/services/keystore/mocks/ocr2.go | 2 +- core/services/keystore/mocks/p2p.go | 2 +- core/services/keystore/mocks/solana.go | 2 +- core/services/keystore/mocks/starknet.go | 2 +- core/services/keystore/mocks/tron.go | 2 +- core/services/keystore/mocks/vrf.go | 2 +- core/services/keystore/mocks/workflow.go | 2 +- .../llo/attested_retirement_report.pb.go | 2 +- .../report_codec_evm_abi_encode_unpacked.go | 26 +- ...port_codec_evm_abi_encode_unpacked_test.go | 99 +++ .../llo/evm/report_codec_premium_legacy.go | 22 +- .../evm/report_codec_premium_legacy_test.go | 80 ++ core/services/llo/telem/telem_streams.pb.go | 2 +- core/services/mocks/checker.go | 2 +- .../ocr/mocks/ocr_contract_tracker_db.go | 2 +- .../mocks/gas_price_interceptor_mock.go | 2 +- .../internal/cache/mocks/chain_health_mock.go | 2 +- .../mocks/token_pool_batched_reader_mock.go | 2 +- .../mocks/price_registry_mock.go | 2 +- .../mocks/commit_store_reader_mock.go | 2 +- .../mocks/fee_estimator_config_mock.go | 2 +- .../ccipdata/mocks/offramp_reader_mock.go | 2 +- .../ccipdata/mocks/onramp_reader_mock.go | 2 +- .../mocks/price_registry_reader_mock.go | 2 +- .../ccipdata/mocks/token_pool_reader_mock.go | 2 +- .../ccipdata/mocks/usdc_reader_mock.go | 2 +- .../ccipdb/mocks/price_service_mock.go | 2 +- .../pricegetter/all_price_getter_mock.go | 2 +- .../plugins/ccip/internal/pricegetter/mock.go | 2 +- .../internal/rpclib/rpclibmocks/evm_mock.go | 2 +- .../prices/gas_price_estimator_commit_mock.go | 2 +- .../prices/gas_price_estimator_exec_mock.go | 2 +- .../ccip/prices/gas_price_estimator_mock.go | 2 +- .../plugins/ccip/tokendata/reader_mock.go | 2 +- .../evmregistry/v20/mocks/registry.go | 2 +- .../v21/core/mocks/upkeep_state_reader.go | 2 +- .../evmregistry/v21/mocks/http_client.go | 2 +- .../evmregistry/v21/mocks/registry.go | 2 +- .../promwrapper/mocks/prometheus_backend.go | 2 +- .../ocr2/plugins/threshold/mocks/decryptor.go | 2 +- core/services/p2p/types/mocks/peer.go | 2 +- core/services/p2p/types/mocks/peer_wrapper.go | 2 +- core/services/p2p/types/mocks/signer.go | 2 +- core/services/pipeline/mocks/config.go | 2 +- core/services/pipeline/mocks/orm.go | 2 +- .../mocks/pipeline_param_unmarshaler.go | 2 +- core/services/pipeline/mocks/runner.go | 2 +- core/services/registrysyncer/mocks/orm.go | 2 +- .../relay/evm/mercury/mocks/async_deleter.go | 2 +- .../relay/evm/mercury/wsrpc/pb/mercury.pb.go | 2 +- core/services/relay/evm/mocks/codec.go | 2 +- .../relay/evm/mocks/request_round_db.go | 2 +- .../relay/evm/read/mocks/batch_caller.go | 2 +- core/services/relay/evm/read/mocks/reader.go | 2 +- .../relay/evm/read/mocks/registrar.go | 2 +- .../mocks/ccip_transaction_status_checker.go | 2 +- .../evm/types/mocks/log_poller_wrapper.go | 2 +- core/services/s4/mocks/orm.go | 2 +- core/services/s4/mocks/storage.go | 2 +- .../synchronization/mocks/telem_client.go | 2 +- .../mocks/telemetry_service.go | 2 +- .../monitoring_endpoint_generator_mock.go | 2 +- .../vrf/mocks/aggregator_v3_interface.go | 2 +- core/services/vrf/mocks/config.go | 2 +- core/services/vrf/mocks/fee_config.go | 2 +- core/services/vrf/mocks/vrf_coordinator_v2.go | 2 +- .../mocks/external_initiator_manager.go | 2 +- core/services/webhook/mocks/http_client.go | 2 +- core/services/workflows/syncer/mocks/orm.go | 2 +- core/sessions/ldapauth/mocks/ldap_client.go | 2 +- core/sessions/ldapauth/mocks/ldap_conn.go | 2 +- .../sessions/mocks/authentication_provider.go | 2 +- core/sessions/mocks/basic_admin_users_orm.go | 2 +- .../v1_0/mocks/workflow_registry_interface.go | 2 +- deployment/go.mod | 143 ++-- deployment/go.sum | 289 ++++---- deployment/mocks/offchain_client_mock.go | 2 +- go.md | 1 + go.mod | 152 ++-- go.sum | 306 ++++---- integration-tests/go.mod | 285 ++++---- integration-tests/go.sum | 683 +++++++++-------- integration-tests/load/go.mod | 285 ++++---- integration-tests/load/go.sum | 687 ++++++++++-------- .../load/zcluster/cluster_entrypoint_test.go | 41 -- plugins/chainlink.Dockerfile | 2 +- system-tests/lib/go.mod | 143 ++-- system-tests/lib/go.sum | 289 ++++---- system-tests/tests/go.mod | 141 ++-- system-tests/tests/go.sum | 285 ++++---- 194 files changed, 2603 insertions(+), 2185 deletions(-) delete mode 100644 integration-tests/load/zcluster/cluster_entrypoint_test.go diff --git a/.github/actions/golangci-lint/action.yml b/.github/actions/golangci-lint/action.yml index 18c2e129ac5..ab2e18c0eb9 100644 --- a/.github/actions/golangci-lint/action.yml +++ b/.github/actions/golangci-lint/action.yml @@ -67,7 +67,7 @@ runs: - name: Golangci-lint uses: golangci/golangci-lint-action@38e1018663fa5173f3968ea0777460d3de38f256 # v5.3.0 with: - version: v1.62.2 + version: v1.64.5 only-new-issues: true args: --out-format colored-line-number,checkstyle:golangci-lint-report.xml working-directory: ${{ steps.set-working-directory.outputs.golangci-lint-working-directory }} diff --git a/GNUmakefile b/GNUmakefile index 66bb1aeba37..aa5c9c31692 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -164,7 +164,7 @@ gomodslocalupdate: gomods ## Run gomod-local-update .PHONY: mockery mockery: $(mockery) ## Install mockery. - go install github.com/vektra/mockery/v2@v2.50.0 + go install github.com/vektra/mockery/v2@v2.52.3 .PHONY: codecgen codecgen: $(codecgen) ## Install codecgen @@ -192,7 +192,7 @@ config-docs: ## Generate core node configuration documentation .PHONY: golangci-lint golangci-lint: ## Run golangci-lint for all issues. [ -d "./golangci-lint" ] || mkdir ./golangci-lint && \ - docker run --rm -v $(shell pwd):/app -w /app golangci/golangci-lint:v1.62.2 golangci-lint run --max-issues-per-linter 0 --max-same-issues 0 | tee ./golangci-lint/$(shell date +%Y-%m-%d_%H:%M:%S).txt + docker run --rm -v $(shell pwd):/app -w /app golangci/golangci-lint:v1.64.5 golangci-lint run --max-issues-per-linter 0 --max-same-issues 0 | tee ./golangci-lint/$(shell date +%Y-%m-%d_%H:%M:%S).txt .PHONY: modgraph modgraph: diff --git a/common/txmgr/mocks/tx_manager.go b/common/txmgr/mocks/tx_manager.go index 2cd14face98..2790ef20ad0 100644 --- a/common/txmgr/mocks/tx_manager.go +++ b/common/txmgr/mocks/tx_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/common/txmgr/types/mocks/forwarder_manager.go b/common/txmgr/types/mocks/forwarder_manager.go index f6f9a98d6f4..4870364e51e 100644 --- a/common/txmgr/types/mocks/forwarder_manager.go +++ b/common/txmgr/types/mocks/forwarder_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/common/txmgr/types/mocks/key_store.go b/common/txmgr/types/mocks/key_store.go index 050128eaa54..08cce1b279f 100644 --- a/common/txmgr/types/mocks/key_store.go +++ b/common/txmgr/types/mocks/key_store.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/common/txmgr/types/mocks/tx_attempt_builder.go b/common/txmgr/types/mocks/tx_attempt_builder.go index 8f8c0ce9a5a..230ce428e1d 100644 --- a/common/txmgr/types/mocks/tx_attempt_builder.go +++ b/common/txmgr/types/mocks/tx_attempt_builder.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/common/txmgr/types/mocks/tx_store.go b/common/txmgr/types/mocks/tx_store.go index d126dc363fb..532aa9965b5 100644 --- a/common/txmgr/types/mocks/tx_store.go +++ b/common/txmgr/types/mocks/tx_store.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/common/txmgr/types/mocks/tx_strategy.go b/common/txmgr/types/mocks/tx_strategy.go index 8822107d863..4653bafdd7a 100644 --- a/common/txmgr/types/mocks/tx_strategy.go +++ b/common/txmgr/types/mocks/tx_strategy.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/common/types/mocks/monitoring_endpoint.go b/common/types/mocks/monitoring_endpoint.go index 892391d79a3..8f2b36ec8b2 100644 --- a/common/types/mocks/monitoring_endpoint.go +++ b/common/types/mocks/monitoring_endpoint.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/contracts/GNUmakefile b/contracts/GNUmakefile index 37422b6a8e9..d6850886789 100644 --- a/contracts/GNUmakefile +++ b/contracts/GNUmakefile @@ -39,7 +39,7 @@ abigen: ## Build & install abigen. .PHONY: mockery mockery: $(mockery) ## Install mockery. - go install github.com/vektra/mockery/v2@v2.50.0 + go install github.com/vektra/mockery/v2@v2.52.3 .PHONY: foundry foundry: ## Install foundry. diff --git a/core/bridges/mocks/orm.go b/core/bridges/mocks/orm.go index d1ecd7c6adc..b34789e90af 100644 --- a/core/bridges/mocks/orm.go +++ b/core/bridges/mocks/orm.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/capabilities/ccip/common/mocks/extra_data_codec.go b/core/capabilities/ccip/common/mocks/extra_data_codec.go index d52d2bd8497..5d581998be8 100644 --- a/core/capabilities/ccip/common/mocks/extra_data_codec.go +++ b/core/capabilities/ccip/common/mocks/extra_data_codec.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/capabilities/ccip/types/mocks/ccip_oracle.go b/core/capabilities/ccip/types/mocks/ccip_oracle.go index 5f1b7202e52..b0b7fdd8107 100644 --- a/core/capabilities/ccip/types/mocks/ccip_oracle.go +++ b/core/capabilities/ccip/types/mocks/ccip_oracle.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/capabilities/ccip/types/mocks/oracle_creator.go b/core/capabilities/ccip/types/mocks/oracle_creator.go index 3618e70e7b7..f2bb7c19030 100644 --- a/core/capabilities/ccip/types/mocks/oracle_creator.go +++ b/core/capabilities/ccip/types/mocks/oracle_creator.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/capabilities/remote/types/messages.pb.go b/core/capabilities/remote/types/messages.pb.go index dcbca5d6398..547ca9c8678 100644 --- a/core/capabilities/remote/types/messages.pb.go +++ b/core/capabilities/remote/types/messages.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc v5.29.3 // source: core/capabilities/remote/types/messages.proto diff --git a/core/capabilities/remote/types/mocks/dispatcher.go b/core/capabilities/remote/types/mocks/dispatcher.go index 161cec75b2f..f2f22d262d6 100644 --- a/core/capabilities/remote/types/mocks/dispatcher.go +++ b/core/capabilities/remote/types/mocks/dispatcher.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/capabilities/remote/types/mocks/receiver.go b/core/capabilities/remote/types/mocks/receiver.go index 143c57ab079..aa88650ea71 100644 --- a/core/capabilities/remote/types/mocks/receiver.go +++ b/core/capabilities/remote/types/mocks/receiver.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/capabilities/targets/mocks/contract_value_getter.go b/core/capabilities/targets/mocks/contract_value_getter.go index e342442e3a5..a08e60123a5 100644 --- a/core/capabilities/targets/mocks/contract_value_getter.go +++ b/core/capabilities/targets/mocks/contract_value_getter.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/capabilities/targets/mocks/contract_writer.go b/core/capabilities/targets/mocks/contract_writer.go index 55eb88b9ce2..a0140653cef 100644 --- a/core/capabilities/targets/mocks/contract_writer.go +++ b/core/capabilities/targets/mocks/contract_writer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/chainlink.Dockerfile b/core/chainlink.Dockerfile index 171da2662a4..2f662fe846d 100644 --- a/core/chainlink.Dockerfile +++ b/core/chainlink.Dockerfile @@ -1,5 +1,5 @@ # Build image: Chainlink binary -FROM golang:1.23-bullseye as buildgo +FROM golang:1.24-bullseye as buildgo RUN go version WORKDIR /chainlink @@ -31,7 +31,7 @@ RUN go list -m -f "{{.Dir}}" github.com/smartcontractkit/chainlink-feeds | xargs RUN go list -m -f "{{.Dir}}" github.com/smartcontractkit/chainlink-solana | xargs -I % ln -s % /chainlink-solana # Build image: Plugins -FROM golang:1.23-bullseye as buildplugins +FROM golang:1.24-bullseye as buildplugins RUN go version WORKDIR /chainlink-feeds diff --git a/core/chains/evm/log/mocks/abigen_contract.go b/core/chains/evm/log/mocks/abigen_contract.go index 7fd1479810f..fd7e1419ada 100644 --- a/core/chains/evm/log/mocks/abigen_contract.go +++ b/core/chains/evm/log/mocks/abigen_contract.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/chains/evm/log/mocks/broadcast.go b/core/chains/evm/log/mocks/broadcast.go index 4d7367819a2..f7c92e0001e 100644 --- a/core/chains/evm/log/mocks/broadcast.go +++ b/core/chains/evm/log/mocks/broadcast.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/chains/evm/log/mocks/broadcaster.go b/core/chains/evm/log/mocks/broadcaster.go index c7804396df9..ffe7f0d59b4 100644 --- a/core/chains/evm/log/mocks/broadcaster.go +++ b/core/chains/evm/log/mocks/broadcaster.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/chains/evm/logpoller/mocks/log_poller.go b/core/chains/evm/logpoller/mocks/log_poller.go index f4865555b6e..deec3b9b55b 100644 --- a/core/chains/evm/logpoller/mocks/log_poller.go +++ b/core/chains/evm/logpoller/mocks/log_poller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/chains/evm/txm/mock_attempt_builder_test.go b/core/chains/evm/txm/mock_attempt_builder_test.go index db0f036026c..a4d468593ff 100644 --- a/core/chains/evm/txm/mock_attempt_builder_test.go +++ b/core/chains/evm/txm/mock_attempt_builder_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package txm diff --git a/core/chains/evm/txm/mock_client_test.go b/core/chains/evm/txm/mock_client_test.go index 68bf3001427..514becd6dce 100644 --- a/core/chains/evm/txm/mock_client_test.go +++ b/core/chains/evm/txm/mock_client_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package txm diff --git a/core/chains/evm/txm/mock_keystore_test.go b/core/chains/evm/txm/mock_keystore_test.go index f30e17e5024..5679a665b26 100644 --- a/core/chains/evm/txm/mock_keystore_test.go +++ b/core/chains/evm/txm/mock_keystore_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package txm diff --git a/core/chains/evm/txm/mock_tx_store_test.go b/core/chains/evm/txm/mock_tx_store_test.go index 18dd11a4196..96b396d966c 100644 --- a/core/chains/evm/txm/mock_tx_store_test.go +++ b/core/chains/evm/txm/mock_tx_store_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package txm diff --git a/core/chains/evm/txmgr/mocks/config.go b/core/chains/evm/txmgr/mocks/config.go index cb591e584b0..cc5ef4cc679 100644 --- a/core/chains/evm/txmgr/mocks/config.go +++ b/core/chains/evm/txmgr/mocks/config.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/chains/evm/txmgr/mocks/evm_tx_store.go b/core/chains/evm/txmgr/mocks/evm_tx_store.go index b9eb4cec5c8..23a8eb3cec4 100644 --- a/core/chains/evm/txmgr/mocks/evm_tx_store.go +++ b/core/chains/evm/txmgr/mocks/evm_tx_store.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/chains/legacyevm/mocks/chain.go b/core/chains/legacyevm/mocks/chain.go index cc5fdacd7ae..0968c7157c7 100644 --- a/core/chains/legacyevm/mocks/chain.go +++ b/core/chains/legacyevm/mocks/chain.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/chains/legacyevm/mocks/legacy_chain_container.go b/core/chains/legacyevm/mocks/legacy_chain_container.go index 60c0d48f7b8..367452b4ef3 100644 --- a/core/chains/legacyevm/mocks/legacy_chain_container.go +++ b/core/chains/legacyevm/mocks/legacy_chain_container.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/cmd/mocks/prompter.go b/core/cmd/mocks/prompter.go index aca41d1ed4a..73ae26c7475 100644 --- a/core/cmd/mocks/prompter.go +++ b/core/cmd/mocks/prompter.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/config/mocks/telemetry_ingress.go b/core/config/mocks/telemetry_ingress.go index e77a559cd7c..22c7cd26871 100644 --- a/core/config/mocks/telemetry_ingress.go +++ b/core/config/mocks/telemetry_ingress.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/config/mocks/telemetry_ingress_endpoint.go b/core/config/mocks/telemetry_ingress_endpoint.go index b8fa4dfe485..d737639a97c 100644 --- a/core/config/mocks/telemetry_ingress_endpoint.go +++ b/core/config/mocks/telemetry_ingress_endpoint.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/gethwrappers/ccip/mocks/commit_store_interface.go b/core/gethwrappers/ccip/mocks/commit_store_interface.go index 08f3dd8a904..59872b00fa6 100644 --- a/core/gethwrappers/ccip/mocks/commit_store_interface.go +++ b/core/gethwrappers/ccip/mocks/commit_store_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mock_contracts diff --git a/core/gethwrappers/ccip/mocks/evm2_evm_off_ramp_interface.go b/core/gethwrappers/ccip/mocks/evm2_evm_off_ramp_interface.go index d0e0e52b527..1915f11dbb3 100644 --- a/core/gethwrappers/ccip/mocks/evm2_evm_off_ramp_interface.go +++ b/core/gethwrappers/ccip/mocks/evm2_evm_off_ramp_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mock_contracts diff --git a/core/gethwrappers/ccip/mocks/evm2_evm_on_ramp_interface.go b/core/gethwrappers/ccip/mocks/evm2_evm_on_ramp_interface.go index f625480d071..3370e127211 100644 --- a/core/gethwrappers/ccip/mocks/evm2_evm_on_ramp_interface.go +++ b/core/gethwrappers/ccip/mocks/evm2_evm_on_ramp_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mock_contracts diff --git a/core/gethwrappers/ccip/mocks/link_token_interface.go b/core/gethwrappers/ccip/mocks/link_token_interface.go index dcf0c1cadbc..1f42fc97577 100644 --- a/core/gethwrappers/ccip/mocks/link_token_interface.go +++ b/core/gethwrappers/ccip/mocks/link_token_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mock_contracts diff --git a/core/gethwrappers/ccip/mocks/v1_2_0/evm2_evm_off_ramp_interface.go b/core/gethwrappers/ccip/mocks/v1_2_0/evm2_evm_off_ramp_interface.go index 983ef7cd49a..1ec05536cf6 100644 --- a/core/gethwrappers/ccip/mocks/v1_2_0/evm2_evm_off_ramp_interface.go +++ b/core/gethwrappers/ccip/mocks/v1_2_0/evm2_evm_off_ramp_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mock_contracts diff --git a/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_gateway_router/arbitrum_gateway_router_interface.go b/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_gateway_router/arbitrum_gateway_router_interface.go index d7b88a8f27b..e29f399d4a7 100644 --- a/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_gateway_router/arbitrum_gateway_router_interface.go +++ b/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_gateway_router/arbitrum_gateway_router_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mock_arbitrum_gateway_router diff --git a/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_inbox/arbitrum_inbox_interface.go b/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_inbox/arbitrum_inbox_interface.go index 934613e32fc..19da3192f08 100644 --- a/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_inbox/arbitrum_inbox_interface.go +++ b/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_inbox/arbitrum_inbox_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mock_arbitrum_inbox diff --git a/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_l1_bridge_adapter/arbitrum_l1_bridge_adapter_interface.go b/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_l1_bridge_adapter/arbitrum_l1_bridge_adapter_interface.go index d1728d94e92..39056ff0776 100644 --- a/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_l1_bridge_adapter/arbitrum_l1_bridge_adapter_interface.go +++ b/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_l1_bridge_adapter/arbitrum_l1_bridge_adapter_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mock_arbitrum_l1_bridge_adapter diff --git a/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_l2_bridge_adapter/arbitrum_l2_bridge_adapter_interface.go b/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_l2_bridge_adapter/arbitrum_l2_bridge_adapter_interface.go index dc176879aa4..b7ad5f05ac4 100644 --- a/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_l2_bridge_adapter/arbitrum_l2_bridge_adapter_interface.go +++ b/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_l2_bridge_adapter/arbitrum_l2_bridge_adapter_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mock_arbitrum_l2_bridge_adapter diff --git a/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_rollup_core/arb_rollup_core_interface.go b/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_rollup_core/arb_rollup_core_interface.go index 8dead9cf8b1..60746b524a0 100644 --- a/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_rollup_core/arb_rollup_core_interface.go +++ b/core/gethwrappers/liquiditymanager/mocks/mock_arbitrum_rollup_core/arb_rollup_core_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mock_arbitrum_rollup_core diff --git a/core/gethwrappers/liquiditymanager/mocks/mock_arbsys/arb_sys_interface.go b/core/gethwrappers/liquiditymanager/mocks/mock_arbsys/arb_sys_interface.go index 6e1af68b03d..a264403fa16 100644 --- a/core/gethwrappers/liquiditymanager/mocks/mock_arbsys/arb_sys_interface.go +++ b/core/gethwrappers/liquiditymanager/mocks/mock_arbsys/arb_sys_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mock_arbsys diff --git a/core/gethwrappers/liquiditymanager/mocks/mock_l2_arbitrum_gateway/l2_arbitrum_gateway_interface.go b/core/gethwrappers/liquiditymanager/mocks/mock_l2_arbitrum_gateway/l2_arbitrum_gateway_interface.go index d1b85f5a26b..850858860e1 100644 --- a/core/gethwrappers/liquiditymanager/mocks/mock_l2_arbitrum_gateway/l2_arbitrum_gateway_interface.go +++ b/core/gethwrappers/liquiditymanager/mocks/mock_l2_arbitrum_gateway/l2_arbitrum_gateway_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mock_l2_arbitrum_gateway diff --git a/core/gethwrappers/liquiditymanager/mocks/mock_l2_arbitrum_messenger/l2_arbitrum_messenger_interface.go b/core/gethwrappers/liquiditymanager/mocks/mock_l2_arbitrum_messenger/l2_arbitrum_messenger_interface.go index 576c15dbeef..a1dd6553f06 100644 --- a/core/gethwrappers/liquiditymanager/mocks/mock_l2_arbitrum_messenger/l2_arbitrum_messenger_interface.go +++ b/core/gethwrappers/liquiditymanager/mocks/mock_l2_arbitrum_messenger/l2_arbitrum_messenger_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mock_l2_arbitrum_messenger diff --git a/core/gethwrappers/liquiditymanager/mocks/mock_node_interface/node_interface_interface.go b/core/gethwrappers/liquiditymanager/mocks/mock_node_interface/node_interface_interface.go index 0f85d52cb23..f51de46c6ff 100644 --- a/core/gethwrappers/liquiditymanager/mocks/mock_node_interface/node_interface_interface.go +++ b/core/gethwrappers/liquiditymanager/mocks/mock_node_interface/node_interface_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mock_node_interface diff --git a/core/gethwrappers/liquiditymanager/mocks/mock_optimism_dispute_game_factory/optimism_dispute_game_factory_interface.go b/core/gethwrappers/liquiditymanager/mocks/mock_optimism_dispute_game_factory/optimism_dispute_game_factory_interface.go index 0e47f57a1f3..5076f95ba16 100644 --- a/core/gethwrappers/liquiditymanager/mocks/mock_optimism_dispute_game_factory/optimism_dispute_game_factory_interface.go +++ b/core/gethwrappers/liquiditymanager/mocks/mock_optimism_dispute_game_factory/optimism_dispute_game_factory_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mock_optimism_dispute_game_factory diff --git a/core/gethwrappers/liquiditymanager/mocks/mock_optimism_l2_output_oracle/optimism_l2_output_oracle_interface.go b/core/gethwrappers/liquiditymanager/mocks/mock_optimism_l2_output_oracle/optimism_l2_output_oracle_interface.go index bffece06092..ad56979ace7 100644 --- a/core/gethwrappers/liquiditymanager/mocks/mock_optimism_l2_output_oracle/optimism_l2_output_oracle_interface.go +++ b/core/gethwrappers/liquiditymanager/mocks/mock_optimism_l2_output_oracle/optimism_l2_output_oracle_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mock_optimism_l2_output_oracle diff --git a/core/gethwrappers/liquiditymanager/mocks/mock_optimism_portal/optimism_portal_interface.go b/core/gethwrappers/liquiditymanager/mocks/mock_optimism_portal/optimism_portal_interface.go index cdfd585df4d..f92851c3d8b 100644 --- a/core/gethwrappers/liquiditymanager/mocks/mock_optimism_portal/optimism_portal_interface.go +++ b/core/gethwrappers/liquiditymanager/mocks/mock_optimism_portal/optimism_portal_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mock_optimism_portal diff --git a/core/gethwrappers/liquiditymanager/mocks/mock_optimism_portal_2/optimism_portal2_interface.go b/core/gethwrappers/liquiditymanager/mocks/mock_optimism_portal_2/optimism_portal2_interface.go index bb820a7f415..5ff6aac4838 100644 --- a/core/gethwrappers/liquiditymanager/mocks/mock_optimism_portal_2/optimism_portal2_interface.go +++ b/core/gethwrappers/liquiditymanager/mocks/mock_optimism_portal_2/optimism_portal2_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mock_optimism_portal_2 diff --git a/core/internal/cltest/factories.go b/core/internal/cltest/factories.go index 37d91f1a69d..980f7b7bb29 100644 --- a/core/internal/cltest/factories.go +++ b/core/internal/cltest/factories.go @@ -116,8 +116,8 @@ func WebURL(t testing.TB, unparsed string) models.WebURL { } // JSONFromString create JSON from given body and arguments -func JSONFromString(t testing.TB, body string, args ...interface{}) models.JSON { - return JSONFromBytes(t, []byte(fmt.Sprintf(body, args...))) +func JSONFromString(t testing.TB, body string) models.JSON { + return JSONFromBytes(t, []byte(body)) } // JSONFromBytes creates JSON from a given byte array diff --git a/core/internal/mocks/application.go b/core/internal/mocks/application.go index e528930dbb4..728e737d29b 100644 --- a/core/internal/mocks/application.go +++ b/core/internal/mocks/application.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/internal/mocks/flags.go b/core/internal/mocks/flags.go index 53e340b0262..6f3272bbb49 100644 --- a/core/internal/mocks/flags.go +++ b/core/internal/mocks/flags.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/internal/mocks/flux_aggregator.go b/core/internal/mocks/flux_aggregator.go index 9360a22fba5..1f2b78cb35a 100644 --- a/core/internal/mocks/flux_aggregator.go +++ b/core/internal/mocks/flux_aggregator.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/logger/logger_mocks.go b/core/logger/logger_mocks.go index 09b303e02d0..f403ddc7147 100644 --- a/core/logger/logger_mocks.go +++ b/core/logger/logger_mocks.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package logger diff --git a/core/scripts/go.mod b/core/scripts/go.mod index f2816426ffb..26490e4fb2e 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -1,8 +1,8 @@ module github.com/smartcontractkit/chainlink/core/scripts -go 1.23.3 +go 1.24 -toolchain go1.23.4 +toolchain go1.24.0 // Make sure we're working with the latest chainlink libs replace github.com/smartcontractkit/chainlink/v2 => ../../ @@ -17,7 +17,7 @@ require ( ) require ( - github.com/docker/docker v27.3.1+incompatible + github.com/docker/docker v27.4.1+incompatible github.com/docker/go-connections v0.5.0 github.com/ethereum/go-ethereum v1.15.0 github.com/gkampitakis/go-snaps v0.5.4 @@ -31,11 +31,11 @@ require ( github.com/olekukonko/tablewriter v0.0.5 github.com/pelletier/go-toml/v2 v2.2.3 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.20.5 + github.com/prometheus/client_golang v1.21.0 github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 - github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 + github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 @@ -46,11 +46,11 @@ require ( github.com/umbracle/fastrlp v0.0.0-20220527094140-59d5dd30e722 github.com/urfave/cli v1.22.14 go.uber.org/zap v1.27.0 - google.golang.org/protobuf v1.36.4 + google.golang.org/protobuf v1.36.5 gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.31.2 - k8s.io/apimachinery v0.31.2 - k8s.io/client-go v0.31.2 + k8s.io/api v0.31.3 + k8s.io/apimachinery v0.31.3 + k8s.io/client-go v0.31.3 ) require ( @@ -65,7 +65,7 @@ require ( github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect github.com/DataDog/zstd v1.5.2 // indirect github.com/Depado/ginprom v1.8.0 // indirect - github.com/Masterminds/semver/v3 v3.3.0 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/NethermindEth/juno v0.3.1 // indirect github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb // indirect @@ -76,7 +76,7 @@ require ( github.com/aptos-labs/aptos-go-sdk v1.5.0 // indirect github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c // indirect github.com/avast/retry-go/v4 v4.6.0 // indirect - github.com/aws/aws-sdk-go v1.54.19 // indirect + github.com/aws/aws-sdk-go v1.55.6 // indirect github.com/aws/aws-sdk-go-v2 v1.32.2 // indirect github.com/aws/aws-sdk-go-v2/config v1.28.0 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.41 // indirect @@ -153,9 +153,9 @@ require ( github.com/esote/minmaxheap v1.0.0 // indirect github.com/ethereum/c-kzg-4844 v1.0.3 // indirect github.com/ethereum/go-verkle v0.2.2 // indirect - github.com/fatih/color v1.17.0 // indirect + github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.8 // indirect github.com/gagliardetto/binary v0.8.0 // indirect @@ -173,7 +173,7 @@ require ( github.com/gkampitakis/ciinfo v0.3.0 // indirect github.com/gkampitakis/go-diff v1.3.2 // indirect github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect - github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 // indirect + github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-ldap/ldap/v3 v3.4.6 // indirect @@ -186,22 +186,22 @@ require ( github.com/go-openapi/swag 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.24.0 // indirect - github.com/go-resty/resty/v2 v2.15.3 // indirect - github.com/go-viper/mapstructure/v2 v2.1.0 // indirect + github.com/go-playground/validator/v10 v10.25.0 // indirect + github.com/go-resty/resty/v2 v2.16.3 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // 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.3 // indirect + github.com/goccy/go-json v0.10.5 // 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 github.com/gogo/protobuf v1.3.3 // indirect github.com/golang-jwt/jwt/v4 v4.5.1 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect - github.com/golang/glog v1.2.2 // indirect + github.com/golang/glog v1.2.3 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/btree v1.1.2 // indirect + github.com/google/btree v1.1.3 // indirect github.com/google/flatbuffers v24.3.25+incompatible // indirect github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect github.com/google/go-tpm v0.9.0 // indirect @@ -216,9 +216,9 @@ require ( github.com/graph-gophers/dataloader v5.0.0+incompatible // indirect github.com/graph-gophers/graphql-go v1.5.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect - github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect @@ -228,11 +228,11 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-envparse v0.1.0 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect - github.com/hashicorp/go-plugin v1.6.2 // indirect + github.com/hashicorp/go-plugin v1.6.3 // indirect github.com/hashicorp/go-retryablehttp v0.7.7 // indirect - github.com/hashicorp/golang-lru v0.6.0 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hashicorp/yamux v0.1.2 // indirect github.com/hasura/go-graphql-client v0.13.1 // indirect github.com/hdevalence/ed25519consensus v0.2.0 // indirect github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect @@ -242,7 +242,7 @@ require ( github.com/iancoleman/strcase v0.3.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/invopop/jsonschema v0.12.0 // indirect + github.com/invopop/jsonschema v0.13.0 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgconn v1.14.3 // indirect github.com/jackc/pgio v1.0.0 // indirect @@ -258,8 +258,8 @@ require ( github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52 // indirect - github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.8 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // 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 @@ -271,19 +271,19 @@ require ( github.com/logrusorgru/aurora v2.0.3+incompatible // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/mailru/easyjson v0.9.0 // indirect github.com/marcboeker/go-duckdb v1.8.3 // indirect github.com/maruel/natural v1.1.1 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mfridman/interpolate v0.0.2 // indirect - github.com/miekg/dns v1.1.61 // indirect + github.com/miekg/dns v1.1.63 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect github.com/mitchellh/pointerstructure v1.2.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect @@ -303,27 +303,27 @@ require ( github.com/onsi/ginkgo/v2 v2.20.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect - github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect github.com/patrickmn/go-cache v2.1.0+incompatible // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect - github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pion/dtls/v2 v2.2.7 // indirect github.com/pion/logging v0.2.2 // indirect github.com/pion/stun/v2 v2.0.0 // indirect github.com/pion/transport/v2 v2.2.1 // indirect github.com/pion/transport/v3 v3.0.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/pressly/goose/v3 v3.21.1 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.60.1 // indirect + github.com/prometheus/common v0.62.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect - github.com/prometheus/prometheus v0.54.1 // indirect + github.com/prometheus/prometheus v0.302.0 // 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 + github.com/rs/cors v1.11.1 // indirect github.com/rs/zerolog v1.33.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect @@ -357,9 +357,9 @@ require ( github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de // indirect github.com/smartcontractkit/wsrpc v0.8.3 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/afero v1.12.0 // indirect github.com/spf13/cast v1.7.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect @@ -372,8 +372,8 @@ require ( github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/sjson v1.2.5 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tklauser/go-sysconf v0.3.13 // indirect + github.com/tklauser/numcpus v0.7.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect github.com/ulule/limiter/v3 v3.11.2 // indirect @@ -389,49 +389,50 @@ require ( github.com/zondax/ledger-go v0.14.3 // indirect go.dedis.ch/fixbuf v1.0.3 // indirect go.dedis.ch/kyber/v3 v3.1.0 // indirect - go.etcd.io/bbolt v1.3.9 // indirect - go.mongodb.org/mongo-driver v1.15.0 // indirect + go.etcd.io/bbolt v1.4.0 // indirect + go.mongodb.org/mongo-driver v1.17.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect - go.opentelemetry.io/otel v1.31.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 // indirect - go.opentelemetry.io/otel/log v0.6.0 // indirect - go.opentelemetry.io/otel/metric v1.31.0 // indirect - go.opentelemetry.io/otel/sdk v1.31.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.6.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.31.0 // indirect - go.opentelemetry.io/otel/trace v1.31.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect + go.opentelemetry.io/otel v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 // indirect + go.opentelemetry.io/otel/log v0.10.0 // indirect + go.opentelemetry.io/otel/metric v1.34.0 // indirect + go.opentelemetry.io/otel/sdk v1.34.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.10.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect + go.opentelemetry.io/otel/trace v1.34.0 // indirect + go.opentelemetry.io/proto/otlp v1.5.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/ratelimit v0.3.1 // indirect golang.org/x/arch v0.11.0 // indirect - golang.org/x/crypto v0.32.0 // indirect - golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c // indirect - golang.org/x/mod v0.22.0 // indirect - golang.org/x/net v0.34.0 // indirect - golang.org/x/oauth2 v0.23.0 // indirect - golang.org/x/sync v0.10.0 // indirect - golang.org/x/sys v0.29.0 // indirect - golang.org/x/term v0.28.0 // indirect - golang.org/x/text v0.21.0 // indirect - golang.org/x/time v0.7.0 // indirect - golang.org/x/tools v0.29.0 // indirect + golang.org/x/crypto v0.33.0 // indirect + golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa // indirect + golang.org/x/mod v0.23.0 // indirect + golang.org/x/net v0.35.0 // indirect + golang.org/x/oauth2 v0.26.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/term v0.29.0 // indirect + golang.org/x/text v0.22.0 // indirect + golang.org/x/time v0.10.0 // indirect + golang.org/x/tools v0.30.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gonum.org/v1/gonum v0.15.1 // indirect - google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect - google.golang.org/grpc v1.67.1 // indirect + google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 // indirect + google.golang.org/grpc v1.70.0 // indirect gopkg.in/guregu/null.v4 v4.0.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect @@ -439,7 +440,7 @@ require ( gopkg.in/yaml.v2 v2.4.0 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f // indirect - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect + k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 // indirect pgregory.net/rapid v1.1.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index b9fbec5ce3d..ff891a5050c 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -73,8 +73,8 @@ github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwS github.com/Depado/ginprom v1.8.0 h1:zaaibRLNI1dMiiuj1MKzatm8qrcHzikMlCc1anqOdyo= github.com/Depado/ginprom v1.8.0/go.mod h1:XBaKzeNBqPF4vxJpNLincSQZeMDnZp1tIbU0FU0UKgg= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= -github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NethermindEth/juno v0.3.1 h1:AW72LiAm9gqUeCVJWvepnZcTnpU4Vkl0KzPMxS+42FA= @@ -118,8 +118,8 @@ github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c h1:cxQ github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c/go.mod h1:3XzxudkrYVUvbduN/uI2fl4lSrMSzU0+3RCu2mpnfx8= github.com/avast/retry-go/v4 v4.6.0 h1:K9xNA+KeB8HHc2aWFuLb25Offp+0iVRXEvFx8IinRJA= github.com/avast/retry-go/v4 v4.6.0/go.mod h1:gvWlPhBVsvBbLkVGDg/KwvBv0bEkCOLRRSHKIr2PyOE= -github.com/aws/aws-sdk-go v1.54.19 h1:tyWV+07jagrNiCcGRzRhdtVjQs7Vy41NwsuOcl0IbVI= -github.com/aws/aws-sdk-go v1.54.19/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go v1.55.6 h1:cSg4pvZ3m8dgYcgqB97MrcdjUmZ1BeMYKUxMMB89IPk= +github.com/aws/aws-sdk-go v1.55.6/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v1.32.2 h1:AkNLZEyYMLnx/Q/mSKkcMqwNFXMAvFto9bNsHqcTduI= github.com/aws/aws-sdk-go-v2 v1.32.2/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= github.com/aws/aws-sdk-go-v2/config v1.28.0 h1:FosVYWcqEtWNxHn8gB/Vs6jOlNwSoyOCA/g/sxyySOQ= @@ -319,8 +319,8 @@ github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WA github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= -github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.4.1+incompatible h1:ZJvcY7gfwHn1JF48PfbyXg7Jyt9ZCWDW+GGXOIxEwp4= +github.com/docker/docker v27.4.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -353,8 +353,8 @@ github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cn github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -364,8 +364,8 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= 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.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= @@ -414,8 +414,8 @@ github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3Bop github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 h1:ymLjT4f35nQbASLnvxEde4XOBL+Sn7rFuV+FOJqkljg= -github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0/go.mod h1:6daplAwHHGbUGib4990V3Il26O0OC4aRyvewaaAihaA= +github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa h1:Rpu6sKAzIeSWBkrFHD52g8yipagcPbY2Lmm70NL1Gzc= +github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa/go.mod h1:TiCD2a1pcmjd7YnhGH0f/zKNcCD06B029pHhzV23c2M= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -451,10 +451,10 @@ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl 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.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= -github.com/go-playground/validator/v10 v10.24.0 h1:KHQckvo8G6hlWnrPX4NJJ+aBfWNAE/HH+qdL2cBpCmg= -github.com/go-playground/validator/v10 v10.24.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= -github.com/go-resty/resty/v2 v2.15.3 h1:bqff+hcqAflpiF591hhJzNdkRsFhlB96CYfBwSFvql8= -github.com/go-resty/resty/v2 v2.15.3/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU= +github.com/go-playground/validator/v10 v10.25.0 h1:5Dh7cjvzR7BRZadnsVOzPhWsrwUr0nmsZJxEAnFLNO8= +github.com/go-playground/validator/v10 v10.25.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= +github.com/go-resty/resty/v2 v2.16.3 h1:zacNT7lt4b8M/io2Ahj6yPypL7bqx9n1iprfQuodV+E= +github.com/go-resty/resty/v2 v2.16.3/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -462,15 +462,15 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8Wd github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/go-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpGyP1XxdC/w= -github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-webauthn/webauthn v0.9.4 h1:YxvHSqgUyc5AK2pZbqkWWR55qKeDPhP8zLDr6lpIc2g= github.com/go-webauthn/webauthn v0.9.4/go.mod h1:LqupCtzSef38FcxzaklmOn7AykGKhAhr9xlRbdbgnTw= 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/goccy/go-json v0.9.7/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-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/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= @@ -488,8 +488,8 @@ github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= -github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.3 h1:oDTdz9f5VGVVNGu/Q7UXKWYsD0873HXLHdJUNBsSEKM= +github.com/golang/glog v1.2.3/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -529,8 +529,8 @@ github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXi github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU= @@ -586,10 +586,10 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY= @@ -608,12 +608,12 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaW github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0 h1:FbSCl+KggFl+Ocym490i/EyXF4lPgLoUtcSWquBM0Rs= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0/go.mod h1:qOchhhIlmRcqk/O9uCo/puJlyo07YINaIqdZfZG3Jkc= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= @@ -644,8 +644,8 @@ github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8Io github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-plugin v1.6.2 h1:zdGAEd0V1lCaU0u+MxWQhtSDQmahpkwOun8U8EiRVog= -github.com/hashicorp/go-plugin v1.6.2/go.mod h1:CkgLQ5CZqNmdL9U9JzM532t8ZiYQ35+pj3b1FD37R0Q= +github.com/hashicorp/go-plugin v1.6.3 h1:xgHB+ZUSYeuJi96WtxEjzi23uh7YQpznjGh0U0UUrwg= +github.com/hashicorp/go-plugin v1.6.3/go.mod h1:MRobyh+Wc/nYy1V4KAXUiYfzxoYhs7V1mlH1Z7iY2h0= github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= @@ -656,8 +656,8 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= -github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -666,8 +666,8 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= +github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= github.com/hasura/go-graphql-client v0.13.1 h1:kKbjhxhpwz58usVl+Xvgah/TDha5K2akNTRQdsEHN6U= github.com/hasura/go-graphql-client v0.13.1/go.mod h1:k7FF7h53C+hSNFRG3++DdVZWIuHdCaTbI7siTJ//zGQ= github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= @@ -692,8 +692,8 @@ github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+h github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= -github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= +github.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E= +github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -779,11 +779,11 @@ github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -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/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -825,8 +825,8 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f h1:tVvGiZQFjOXP+9YyGqSA6jE55x1XVxmoPYudncxrZ8U= github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f/go.mod h1:Z60vy0EZVSu0bOugCHdcN5ZxFMKSpjRgsnh0XKPFqqk= github.com/marcboeker/go-duckdb v1.8.3 h1:ZkYwiIZhbYsT6MmJsZ3UPTHrTZccDdM4ztoqSlEMXiQ= @@ -838,8 +838,9 @@ github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcncea github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -859,8 +860,8 @@ github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6B github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= -github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= +github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY= +github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= @@ -882,8 +883,8 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY= +github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= @@ -952,8 +953,9 @@ github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQ github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/runc v1.1.10 h1:EaL5WeO9lv9wmS6SASjszOeQdSctvpbu0DdBQBizE40= github.com/opencontainers/runc v1.1.10/go.mod h1:+/R6+KmDlh+hOO8NkjmgkG9Qzvypzk0yXxAPYYR65+M= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -968,8 +970,8 @@ github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNH github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= -github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= @@ -992,21 +994,22 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pressly/goose/v3 v3.21.1 h1:5SSAKKWej8LVVzNLuT6KIvP1eFDuPvxa+B6H0w78buQ= github.com/pressly/goose/v3 v3.21.1/go.mod h1:sqthmzV8PitchEkjecFJII//l43dLOCzfWh8pHEe+vE= -github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= -github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ= -github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY= +github.com/prometheus/prometheus v0.302.0 h1:47EsaoBRroS2ekSyMSOPIjXwYnY/mxoFk0xt2dkFvfI= +github.com/prometheus/prometheus v0.302.0/go.mod h1:YcyCoTbUR/TM8rY3Aoeqr0AWTu/pu1Ehh+trpX3eRzg= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= @@ -1027,8 +1030,8 @@ github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6po github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= @@ -1092,8 +1095,8 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0/go.mod h1:YQuXIqQpmpAqstWV0LHaDTJ5nsSWuip5ivEM+Fisb+4= -github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= -github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= +github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e h1:QBG+Wn5rHAi4gjnBAq6x6CZj/GjWAahFjj81VhQEu6U= +github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e/go.mod h1:2yUpKW1/jFxpozO/Zkh3fKDzI0jthXoEcU2xuDq+vlo= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= @@ -1139,8 +1142,8 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= +github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= @@ -1152,8 +1155,9 @@ github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3k github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= @@ -1210,10 +1214,12 @@ github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= +github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= @@ -1271,13 +1277,13 @@ go.dedis.ch/kyber/v3 v3.1.0/go.mod h1:kXy7p3STAurkADD+/aZcsznZGKVHEqbtmdIzvPfrs1 go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= -go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= -go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= +go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk= +go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= -go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.mongodb.org/mongo-driver v1.17.0 h1:Hp4q2MCjvY19ViwimTs00wHi7G4yzxh4/2+nTx8r40k= +go.mongodb.org/mongo-driver v1.17.0/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1285,52 +1291,54 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0 h1:1f31+6grJmV3X4lxcEvUy13i5/kfDw1nJZwhd8mA4tg= go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0/go.mod h1:1P/02zM3OwkX9uki+Wmxw3a5GVb6KUXRsa7m7bOC9Fg= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= go.opentelemetry.io/contrib/propagators/b3 v1.24.0 h1:n4xwCdTx3pZqZs2CjS/CUZAs03y3dZcGhC/FepKtEUY= go.opentelemetry.io/contrib/propagators/b3 v1.24.0/go.mod h1:k5wRxKRU2uXx2F8uNJ4TaonuEO/V7/5xoz7kdsDACT8= go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= -go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= -go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 h1:UiRNKd1OgqsLbFwE+wkAWTdiAxXtCBqKIHeBIse4FUA= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9/go.mod h1:eqZlW3pJWhjyexnDPrdQxix1pn0wwhI4AO4GKpP/bMI= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 h1:QSKmLBzbFULSyHzOdO9JsN9lpE4zkrz1byYGmJecdVE= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0/go.mod h1:sTQ/NH8Yrirf0sJ5rWqVu+oT82i4zL9FaF6rWcqnptM= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0/go.mod h1:yeGZANgEcpdx/WK0IvvRFC+2oLiMS2u4L/0Rj2M2Qr0= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 h1:VrMAbeJz4gnVDg2zEzjHG4dEH86j4jO6VYB+NgtGD8s= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0/go.mod h1:qqN/uFdpeitTvm+JDqqnjm517pmQRYxTORbETHq5tOc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 h1:0MH3f8lZrflbUWXVxyBg/zviDFdGE062uKh5+fu8Vv0= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0/go.mod h1:Vh68vYiHY5mPdekTr0ox0sALsqjoVy0w3Os278yX5SQ= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 h1:BJee2iLkfRfl9lc7aFmBwkWxY/RI1RDdXepSF6y8TPE= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0/go.mod h1:DIzlHs3DRscCIBU3Y9YSzPfScwnYnzfnCd4g8zA7bZc= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= -go.opentelemetry.io/otel/log v0.6.0 h1:nH66tr+dmEgW5y+F9LanGJUBYPrRgP4g2EkmPE3LeK8= -go.opentelemetry.io/otel/log v0.6.0/go.mod h1:KdySypjQHhP069JX0z/t26VHwa8vSwzgaKmXtIB3fJM= -go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= -go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= -go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= -go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= -go.opentelemetry.io/otel/sdk/log v0.6.0 h1:4J8BwXY4EeDE9Mowg+CyhWVBhTSLXVXodiXxS/+PGqI= -go.opentelemetry.io/otel/sdk/log v0.6.0/go.mod h1:L1DN8RMAduKkrwRAFDEX3E3TLOq46+XMGSbUfHU/+vE= -go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= -go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= +go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 h1:5dTKu4I5Dn4P2hxyW3l3jTaZx9ACgg0ECos1eAVrheY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0/go.mod h1:P5HcUI8obLrCCmM3sbVBohZFH34iszk/+CPWuakZWL8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 h1:q/heq5Zh8xV1+7GoMGJpTxM2Lhq5+bFxB29tshuRuw0= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0/go.mod h1:leO2CSTg0Y+LyvmR7Wm4pUxE8KAmaM2GCVx7O+RATLA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 h1:ajl4QczuJVA2TU9W9AGw++86Xga/RKt//16z/yxPgdk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0/go.mod h1:Vn3/rlOJ3ntf/Q3zAI0V5lDnTbHGaUsNUeF6nZmm7pA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 h1:GKCEAZLEpEf78cUvudQdTg0aET2ObOZRB2HtXA0qPAI= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0/go.mod h1:9/zqSWLCmHT/9Jo6fYeUDRRogOLL60ABLsHWS99lF8s= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 h1:czJDQwFrMbOr9Kk+BPo1y8WZIIFIK58SA1kykuVeiOU= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0/go.mod h1:lT7bmsxOe58Tq+JIOkTQMCGXdu47oA+VJKLZHbaBKbs= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 h1:jBpDk4HAUsrnVO1FsfCfCOTEc/MkInJmvfCHYLFiT80= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0/go.mod h1:H9LUIM1daaeZaz91vZcfeM0fejXPmgCYE8ZhzqfJuiU= +go.opentelemetry.io/otel/log v0.10.0 h1:1CXmspaRITvFcjA4kyVszuG4HjA61fPDxMb7q3BuyF0= +go.opentelemetry.io/otel/log v0.10.0/go.mod h1:PbVdm9bXKku/gL0oFfUF4wwsQsOPlpo4VEqjvxih+FM= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= +go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/sdk/log v0.10.0 h1:lR4teQGWfeDVGoute6l0Ou+RpFqQ9vaPdrNJlST0bvw= +go.opentelemetry.io/otel/sdk/log v0.10.0/go.mod h1:A+V1UTWREhWAittaQEG4bYm4gAZa6xnvVu+xKrIRkzo= +go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= +go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= -go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= -go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= +go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1382,8 +1390,8 @@ golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98y golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1394,8 +1402,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc= -golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1424,8 +1432,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= -golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= +golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1478,8 +1486,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1492,8 +1500,8 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE= +golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1507,8 +1515,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1593,8 +1601,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1605,8 +1613,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= -golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1622,13 +1630,13 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= -golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= +golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -1691,8 +1699,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= -golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= +golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= +golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1777,12 +1785,12 @@ google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU= -google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 h1:Pw6WnI9W/LIdRxqK7T6XGugGbHIRl5Q7q3BssH6xk4s= +google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4/go.mod h1:qbZzneIOXSq+KFAFut9krLfRLZiFLzZL5u2t8SV83EE= +google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2 h1:35ZFtrCgaAjF7AFAK0+lRSf+4AyYnWRbH7og13p7rZ4= +google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:W9ynFDP/shebLB1Hl/ESTOap2jHd6pmLXPNZC7SVDbA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 h1:DMTIbak9GhdaSxEjvVzAeNZvyc03I61duqNbnm3SU0M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1803,8 +1811,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1818,8 +1826,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= -google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1866,18 +1874,18 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -k8s.io/api v0.31.2 h1:3wLBbL5Uom/8Zy98GRPXpJ254nEFpl+hwndmk9RwmL0= -k8s.io/api v0.31.2/go.mod h1:bWmGvrGPssSK1ljmLzd3pwCQ9MgoTsRCuK35u6SygUk= -k8s.io/apimachinery v0.31.2 h1:i4vUt2hPK56W6mlT7Ry+AO8eEsyxMD1U44NR22CLTYw= -k8s.io/apimachinery v0.31.2/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= -k8s.io/client-go v0.31.2 h1:Y2F4dxU5d3AQj+ybwSMqQnpZH9F30//1ObxOKlTI9yc= -k8s.io/client-go v0.31.2/go.mod h1:NPa74jSVR/+eez2dFsEIHNa+3o09vtNaWwWwb1qSxSs= +k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8= +k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE= +k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4= +k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/client-go v0.31.3 h1:CAlZuM+PH2cm+86LOBemaJI/lQ5linJ6UFxKX/SoG+4= +k8s.io/client-go v0.31.3/go.mod h1:2CgjPUTpv3fE5dNygAr2NcM8nhHzXvxB8KL5gYc3kJs= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f h1:2sXuKesAYbRHxL3aE2PN6zX/gcJr22cjrsej+W784Tc= k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f/go.mod h1:UxDHUPsUwTOOxSU+oXURfFBcAS6JwiRXTYqYwfuGowc= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 h1:jGnCPejIetjiy2gqaJ5V0NLwTpF4wbQ6cZIItJCSHno= +k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk= diff --git a/core/services/blockhashstore/mocks/bhs.go b/core/services/blockhashstore/mocks/bhs.go index d3032c4bb0d..e410f904d25 100644 --- a/core/services/blockhashstore/mocks/bhs.go +++ b/core/services/blockhashstore/mocks/bhs.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/blockhashstore/mocks/timer.go b/core/services/blockhashstore/mocks/timer.go index e6fa10fbd07..a3cdb541dd0 100644 --- a/core/services/blockhashstore/mocks/timer.go +++ b/core/services/blockhashstore/mocks/timer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ccip/mocks/orm.go b/core/services/ccip/mocks/orm.go index 30c365b24f1..128fd9b741c 100644 --- a/core/services/ccip/mocks/orm.go +++ b/core/services/ccip/mocks/orm.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/chainlink/mocks/general_config.go b/core/services/chainlink/mocks/general_config.go index 02b63cfe1c5..12745c64c80 100644 --- a/core/services/chainlink/mocks/general_config.go +++ b/core/services/chainlink/mocks/general_config.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/feeds/mocks/connections_manager.go b/core/services/feeds/mocks/connections_manager.go index 20d68315297..8bf0b5f20a3 100644 --- a/core/services/feeds/mocks/connections_manager.go +++ b/core/services/feeds/mocks/connections_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/feeds/mocks/feeds_manager_client.go b/core/services/feeds/mocks/feeds_manager_client.go index 13ef5ed4c76..86cf0979fad 100644 --- a/core/services/feeds/mocks/feeds_manager_client.go +++ b/core/services/feeds/mocks/feeds_manager_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/feeds/mocks/orm.go b/core/services/feeds/mocks/orm.go index b6e00148682..bf31bc15624 100644 --- a/core/services/feeds/mocks/orm.go +++ b/core/services/feeds/mocks/orm.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/feeds/mocks/service.go b/core/services/feeds/mocks/service.go index 9d63e706c29..66df73e4eb9 100644 --- a/core/services/feeds/mocks/service.go +++ b/core/services/feeds/mocks/service.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/fluxmonitorv2/mocks/contract_submitter.go b/core/services/fluxmonitorv2/mocks/contract_submitter.go index 79fda08d29e..3adadfea13d 100644 --- a/core/services/fluxmonitorv2/mocks/contract_submitter.go +++ b/core/services/fluxmonitorv2/mocks/contract_submitter.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/fluxmonitorv2/mocks/flags.go b/core/services/fluxmonitorv2/mocks/flags.go index f1b098f7de6..89a9a96eef6 100644 --- a/core/services/fluxmonitorv2/mocks/flags.go +++ b/core/services/fluxmonitorv2/mocks/flags.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/fluxmonitorv2/mocks/key_store_interface.go b/core/services/fluxmonitorv2/mocks/key_store_interface.go index 67a28f97e9b..403073e841f 100644 --- a/core/services/fluxmonitorv2/mocks/key_store_interface.go +++ b/core/services/fluxmonitorv2/mocks/key_store_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/fluxmonitorv2/mocks/orm.go b/core/services/fluxmonitorv2/mocks/orm.go index 24f516dcdc2..69bcbae461c 100644 --- a/core/services/fluxmonitorv2/mocks/orm.go +++ b/core/services/fluxmonitorv2/mocks/orm.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/functions/mocks/bridge_accessor.go b/core/services/functions/mocks/bridge_accessor.go index 6672c55bee9..0f7070c61e6 100644 --- a/core/services/functions/mocks/bridge_accessor.go +++ b/core/services/functions/mocks/bridge_accessor.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/functions/mocks/external_adapter_client.go b/core/services/functions/mocks/external_adapter_client.go index 661ed076e4a..5936460301f 100644 --- a/core/services/functions/mocks/external_adapter_client.go +++ b/core/services/functions/mocks/external_adapter_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/functions/mocks/functions_listener.go b/core/services/functions/mocks/functions_listener.go index 52011a70167..d070f3ec56d 100644 --- a/core/services/functions/mocks/functions_listener.go +++ b/core/services/functions/mocks/functions_listener.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/functions/mocks/offchain_transmitter.go b/core/services/functions/mocks/offchain_transmitter.go index 91ca230be64..cb3ef045f13 100644 --- a/core/services/functions/mocks/offchain_transmitter.go +++ b/core/services/functions/mocks/offchain_transmitter.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/functions/mocks/orm.go b/core/services/functions/mocks/orm.go index 4e7f9d393cb..9c653f077ab 100644 --- a/core/services/functions/mocks/orm.go +++ b/core/services/functions/mocks/orm.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/gateway/connector/mocks/gateway_connector.go b/core/services/gateway/connector/mocks/gateway_connector.go index 51dcafe7091..fbe5499d5f7 100644 --- a/core/services/gateway/connector/mocks/gateway_connector.go +++ b/core/services/gateway/connector/mocks/gateway_connector.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/gateway/connector/mocks/gateway_connector_handler.go b/core/services/gateway/connector/mocks/gateway_connector_handler.go index 424f608a9b5..20c2f073010 100644 --- a/core/services/gateway/connector/mocks/gateway_connector_handler.go +++ b/core/services/gateway/connector/mocks/gateway_connector_handler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/gateway/connector/mocks/signer.go b/core/services/gateway/connector/mocks/signer.go index 9b2aa0fd97a..a513e75ccb8 100644 --- a/core/services/gateway/connector/mocks/signer.go +++ b/core/services/gateway/connector/mocks/signer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/gateway/handlers/functions/allowlist/mocks/onchain_allowlist.go b/core/services/gateway/handlers/functions/allowlist/mocks/onchain_allowlist.go index 8340413718e..016989a65ca 100644 --- a/core/services/gateway/handlers/functions/allowlist/mocks/onchain_allowlist.go +++ b/core/services/gateway/handlers/functions/allowlist/mocks/onchain_allowlist.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/gateway/handlers/functions/allowlist/mocks/orm.go b/core/services/gateway/handlers/functions/allowlist/mocks/orm.go index 261e967c820..bb21fdfcbf3 100644 --- a/core/services/gateway/handlers/functions/allowlist/mocks/orm.go +++ b/core/services/gateway/handlers/functions/allowlist/mocks/orm.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/gateway/handlers/functions/subscriptions/mocks/onchain_subscriptions.go b/core/services/gateway/handlers/functions/subscriptions/mocks/onchain_subscriptions.go index 7312f2a6743..47b36cd1a7c 100644 --- a/core/services/gateway/handlers/functions/subscriptions/mocks/onchain_subscriptions.go +++ b/core/services/gateway/handlers/functions/subscriptions/mocks/onchain_subscriptions.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/gateway/handlers/functions/subscriptions/mocks/orm.go b/core/services/gateway/handlers/functions/subscriptions/mocks/orm.go index c093bd1523e..63b27baed1d 100644 --- a/core/services/gateway/handlers/functions/subscriptions/mocks/orm.go +++ b/core/services/gateway/handlers/functions/subscriptions/mocks/orm.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/gateway/handlers/mocks/don.go b/core/services/gateway/handlers/mocks/don.go index 93ab52c2473..f83e6f062b0 100644 --- a/core/services/gateway/handlers/mocks/don.go +++ b/core/services/gateway/handlers/mocks/don.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/gateway/handlers/mocks/handler.go b/core/services/gateway/handlers/mocks/handler.go index 96f3faad15c..929ad90fd0e 100644 --- a/core/services/gateway/handlers/mocks/handler.go +++ b/core/services/gateway/handlers/mocks/handler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/gateway/network/mocks/connection_acceptor.go b/core/services/gateway/network/mocks/connection_acceptor.go index 48bcf9884a6..ffafc8f33d9 100644 --- a/core/services/gateway/network/mocks/connection_acceptor.go +++ b/core/services/gateway/network/mocks/connection_acceptor.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/gateway/network/mocks/connection_initiator.go b/core/services/gateway/network/mocks/connection_initiator.go index 5bf10d01aa9..24ed0acce13 100644 --- a/core/services/gateway/network/mocks/connection_initiator.go +++ b/core/services/gateway/network/mocks/connection_initiator.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/gateway/network/mocks/http_client.go b/core/services/gateway/network/mocks/http_client.go index 29bf4348036..2d9ca621910 100644 --- a/core/services/gateway/network/mocks/http_client.go +++ b/core/services/gateway/network/mocks/http_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/gateway/network/mocks/http_request_handler.go b/core/services/gateway/network/mocks/http_request_handler.go index 2756bddb3db..16eb566417d 100644 --- a/core/services/gateway/network/mocks/http_request_handler.go +++ b/core/services/gateway/network/mocks/http_request_handler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/gateway/network/mocks/http_server.go b/core/services/gateway/network/mocks/http_server.go index ae51ffaa512..7aa5ffca7c3 100644 --- a/core/services/gateway/network/mocks/http_server.go +++ b/core/services/gateway/network/mocks/http_server.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/gateway/network/mocks/web_socket_server.go b/core/services/gateway/network/mocks/web_socket_server.go index 34e478533ee..926f192088c 100644 --- a/core/services/gateway/network/mocks/web_socket_server.go +++ b/core/services/gateway/network/mocks/web_socket_server.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/headreporter/head_reporter_mock.go b/core/services/headreporter/head_reporter_mock.go index a4a7b14d766..e465e39f91b 100644 --- a/core/services/headreporter/head_reporter_mock.go +++ b/core/services/headreporter/head_reporter_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package headreporter diff --git a/core/services/headreporter/prometheus_backend_mock.go b/core/services/headreporter/prometheus_backend_mock.go index 031b5d4c937..ec86ab305c2 100644 --- a/core/services/headreporter/prometheus_backend_mock.go +++ b/core/services/headreporter/prometheus_backend_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package headreporter diff --git a/core/services/job/mocks/kv_store.go b/core/services/job/mocks/kv_store.go index 7fe62ded59e..c6ec755872f 100644 --- a/core/services/job/mocks/kv_store.go +++ b/core/services/job/mocks/kv_store.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/job/mocks/orm.go b/core/services/job/mocks/orm.go index 786f5d194d9..26ed3b123b0 100644 --- a/core/services/job/mocks/orm.go +++ b/core/services/job/mocks/orm.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/job/mocks/service_ctx.go b/core/services/job/mocks/service_ctx.go index 8f1ba3596c1..4d48d98e38a 100644 --- a/core/services/job/mocks/service_ctx.go +++ b/core/services/job/mocks/service_ctx.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/job/mocks/spawner.go b/core/services/job/mocks/spawner.go index a8039643bd5..172797a8c14 100644 --- a/core/services/job/mocks/spawner.go +++ b/core/services/job/mocks/spawner.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/keystore/mocks/aptos.go b/core/services/keystore/mocks/aptos.go index 98cb90457b7..fbe00a2743e 100644 --- a/core/services/keystore/mocks/aptos.go +++ b/core/services/keystore/mocks/aptos.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/keystore/mocks/cosmos.go b/core/services/keystore/mocks/cosmos.go index ef127191285..88131d8710c 100644 --- a/core/services/keystore/mocks/cosmos.go +++ b/core/services/keystore/mocks/cosmos.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/keystore/mocks/csa.go b/core/services/keystore/mocks/csa.go index 73a4c048806..aaf07273ffd 100644 --- a/core/services/keystore/mocks/csa.go +++ b/core/services/keystore/mocks/csa.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/keystore/mocks/eth.go b/core/services/keystore/mocks/eth.go index 44892fa3059..069cb8bb8a2 100644 --- a/core/services/keystore/mocks/eth.go +++ b/core/services/keystore/mocks/eth.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/keystore/mocks/master.go b/core/services/keystore/mocks/master.go index 6ea57639196..202b22163b3 100644 --- a/core/services/keystore/mocks/master.go +++ b/core/services/keystore/mocks/master.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/keystore/mocks/ocr.go b/core/services/keystore/mocks/ocr.go index bb0ecae9bda..94fc2baa9c3 100644 --- a/core/services/keystore/mocks/ocr.go +++ b/core/services/keystore/mocks/ocr.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/keystore/mocks/ocr2.go b/core/services/keystore/mocks/ocr2.go index 3497fa7ac4d..10e66df3b13 100644 --- a/core/services/keystore/mocks/ocr2.go +++ b/core/services/keystore/mocks/ocr2.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/keystore/mocks/p2p.go b/core/services/keystore/mocks/p2p.go index 917f620edd3..e15fbefd337 100644 --- a/core/services/keystore/mocks/p2p.go +++ b/core/services/keystore/mocks/p2p.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/keystore/mocks/solana.go b/core/services/keystore/mocks/solana.go index 3478b83bbe7..7d882396d77 100644 --- a/core/services/keystore/mocks/solana.go +++ b/core/services/keystore/mocks/solana.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/keystore/mocks/starknet.go b/core/services/keystore/mocks/starknet.go index 405408409b7..4e49bfceb9d 100644 --- a/core/services/keystore/mocks/starknet.go +++ b/core/services/keystore/mocks/starknet.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/keystore/mocks/tron.go b/core/services/keystore/mocks/tron.go index 0636f4e54e9..682b253fad0 100644 --- a/core/services/keystore/mocks/tron.go +++ b/core/services/keystore/mocks/tron.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/keystore/mocks/vrf.go b/core/services/keystore/mocks/vrf.go index e1705daa64a..d56aab6c821 100644 --- a/core/services/keystore/mocks/vrf.go +++ b/core/services/keystore/mocks/vrf.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/keystore/mocks/workflow.go b/core/services/keystore/mocks/workflow.go index 91929e13768..96a3918216b 100644 --- a/core/services/keystore/mocks/workflow.go +++ b/core/services/keystore/mocks/workflow.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/llo/attested_retirement_report.pb.go b/core/services/llo/attested_retirement_report.pb.go index d093a8eda25..f2e6641d2fc 100644 --- a/core/services/llo/attested_retirement_report.pb.go +++ b/core/services/llo/attested_retirement_report.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc v5.29.3 // source: attested_retirement_report.proto diff --git a/core/services/llo/evm/report_codec_evm_abi_encode_unpacked.go b/core/services/llo/evm/report_codec_evm_abi_encode_unpacked.go index ca40156a7c1..c24474f4a65 100644 --- a/core/services/llo/evm/report_codec_evm_abi_encode_unpacked.go +++ b/core/services/llo/evm/report_codec_evm_abi_encode_unpacked.go @@ -1,6 +1,7 @@ package evm import ( + "bytes" "context" "encoding/json" "errors" @@ -60,7 +61,9 @@ type ReportFormatEVMABIEncodeOpts struct { } func (r *ReportFormatEVMABIEncodeOpts) Decode(opts []byte) error { - return json.Unmarshal(opts, r) + decoder := json.NewDecoder(bytes.NewReader(opts)) + decoder.DisallowUnknownFields() // Error on unrecognized fields + return decoder.Decode(r) } func (r *ReportFormatEVMABIEncodeOpts) Encode() ([]byte, error) { @@ -122,6 +125,27 @@ func (r ReportCodecEVMABIEncodeUnpacked) Encode(ctx context.Context, report llo. return append(header, payload...), nil } +func (r ReportCodecEVMABIEncodeUnpacked) Verify(_ context.Context, cd llotypes.ChannelDefinition) error { + opts := new(ReportFormatEVMABIEncodeOpts) + if err := opts.Decode(cd.Opts); err != nil { + return fmt.Errorf("invalid Opts, got: %q; %w", cd.Opts, err) + } + if opts.BaseUSDFee.IsNegative() { + return errors.New("baseUSDFee must be non-negative") + } + if opts.FeedID == (common.Hash{}) { + return errors.New("feedID must not be zero") + } + if len(cd.Streams) < 3 { + return fmt.Errorf("expected at least 3 streams; got: %d", len(cd.Streams)) + } + // NOTE: First two streams are always expected to be native/link price + if len(opts.ABI) != len(cd.Streams)-2 { + return fmt.Errorf("ABI length mismatch; expected: %d, got: %d", len(cd.Streams)-2, len(opts.ABI)) + } + return nil +} + // BaseSchema represents the fixed base schema that remains unchanged for all // EVMABIEncodeUnpacked reports. // diff --git a/core/services/llo/evm/report_codec_evm_abi_encode_unpacked_test.go b/core/services/llo/evm/report_codec_evm_abi_encode_unpacked_test.go index 0a1d6ed9300..5a7c4ee7409 100644 --- a/core/services/llo/evm/report_codec_evm_abi_encode_unpacked_test.go +++ b/core/services/llo/evm/report_codec_evm_abi_encode_unpacked_test.go @@ -823,6 +823,105 @@ func Test_ABIEncoder_Encode(t *testing.T) { }) } +func TestReportCodecEVMABIEncodeUnpacked_Verify(t *testing.T) { + c := ReportCodecEVMABIEncodeUnpacked{} + t.Run("unrecognized fields in opts", func(t *testing.T) { + cd := llotypes.ChannelDefinition{ + ReportFormat: llotypes.ReportFormatEVMABIEncodeUnpacked, + Opts: []byte(`{"unknown":"field"}`), + } + err := c.Verify(tests.Context(t), cd) + require.Error(t, err) + assert.Contains(t, err.Error(), "unknown field") + }) + t.Run("invalid opts", func(t *testing.T) { + cd := llotypes.ChannelDefinition{ + ReportFormat: llotypes.ReportFormatEVMABIEncodeUnpacked, + Opts: []byte(`"invalid"`), + } + err := c.Verify(tests.Context(t), cd) + require.Error(t, err) + assert.EqualError(t, err, "invalid Opts, got: \"\\\"invalid\\\"\"; json: cannot unmarshal string into Go value of type evm.ReportFormatEVMABIEncodeOpts") + }) + t.Run("negative BaseUSDFee", func(t *testing.T) { + cd := llotypes.ChannelDefinition{ + ReportFormat: llotypes.ReportFormatEVMABIEncodeUnpacked, + Opts: []byte(`{"baseUSDFee":"-1"}`), + } + err := c.Verify(tests.Context(t), cd) + require.Error(t, err) + assert.Contains(t, err.Error(), "baseUSDFee must be non-negative") + }) + t.Run("zero feedID", func(t *testing.T) { + cd := llotypes.ChannelDefinition{ + ReportFormat: llotypes.ReportFormatEVMABIEncodeUnpacked, + Opts: []byte(`{"feedID":"0x0000000000000000000000000000000000000000000000000000000000000000"}`), + } + err := c.Verify(tests.Context(t), cd) + require.Error(t, err) + assert.Contains(t, err.Error(), "feedID must not be zero") + }) + t.Run("missing feedID", func(t *testing.T) { + cd := llotypes.ChannelDefinition{ + ReportFormat: llotypes.ReportFormatEVMABIEncodeUnpacked, + Opts: []byte(`{}`), + } + err := c.Verify(tests.Context(t), cd) + require.Error(t, err) + assert.Contains(t, err.Error(), "feedID must not be zero") + }) + t.Run("not enough streams", func(t *testing.T) { + cd := llotypes.ChannelDefinition{ + ReportFormat: llotypes.ReportFormatEVMABIEncodeUnpacked, + Streams: []llotypes.Stream{ + {StreamID: 1}, + {StreamID: 2}, + }, + Opts: []byte(`{"ABI":[{"streamID":1,"type":"int192"}],"feedID":"0x1111111111111111111111111111111111111111111111111111111111111111"}`), + } + err := c.Verify(tests.Context(t), cd) + require.Error(t, err) + assert.Contains(t, err.Error(), "expected at least 3 streams; got: 2") + }) + t.Run("ABI length does not match streams length", func(t *testing.T) { + cd := llotypes.ChannelDefinition{ + ReportFormat: llotypes.ReportFormatEVMABIEncodeUnpacked, + Streams: []llotypes.Stream{ + {StreamID: 1}, + {StreamID: 2}, + {StreamID: 3}, + {StreamID: 4}, + }, + Opts: []byte(`{"ABI":[{"streamID":1,"type":"int192"}],"feedID":"0x1111111111111111111111111111111111111111111111111111111111111111"}`), + } + err := c.Verify(tests.Context(t), cd) + require.Error(t, err) + assert.Contains(t, err.Error(), "ABI length mismatch; expected: 2, got: 1") + }) + t.Run("invalid feedID", func(t *testing.T) { + cd := llotypes.ChannelDefinition{ + ReportFormat: llotypes.ReportFormatEVMABIEncodeUnpacked, + Opts: []byte(`{"baseUSDFee":"1","feedID":"0x"}`), + } + err := c.Verify(tests.Context(t), cd) + require.Error(t, err) + assert.EqualError(t, err, "invalid Opts, got: \"{\\\"baseUSDFee\\\":\\\"1\\\",\\\"feedID\\\":\\\"0x\\\"}\"; hex string has length 0, want 64 for common.Hash") + }) + t.Run("valid", func(t *testing.T) { + cd := llotypes.ChannelDefinition{ + Streams: []llotypes.Stream{ + {StreamID: 1}, + {StreamID: 2}, + {StreamID: 3}, + }, + ReportFormat: llotypes.ReportFormatEVMABIEncodeUnpacked, + Opts: []byte(`{"baseUSDFee":"1","feedID":"0x1111111111111111111111111111111111111111111111111111111111111111","ABI":[{"streamID":1,"type":"int192"}]}`), + } + err := c.Verify(tests.Context(t), cd) + require.NoError(t, err) + }) +} + func padLeft32Byte(str string) string { if len(str) >= 64 { return str diff --git a/core/services/llo/evm/report_codec_premium_legacy.go b/core/services/llo/evm/report_codec_premium_legacy.go index 94028943664..b8dad12d9ad 100644 --- a/core/services/llo/evm/report_codec_premium_legacy.go +++ b/core/services/llo/evm/report_codec_premium_legacy.go @@ -1,6 +1,7 @@ package evm import ( + "bytes" "context" "encoding/json" "errors" @@ -57,7 +58,9 @@ func (r *ReportFormatEVMPremiumLegacyOpts) Decode(opts []byte) error { // special case if opts are unspecified, just use the zero options rather than erroring return nil } - return json.Unmarshal(opts, r) + decoder := json.NewDecoder(bytes.NewReader(opts)) + decoder.DisallowUnknownFields() // Error on unrecognized fields + return decoder.Decode(r) } func (r ReportCodecPremiumLegacy) Encode(ctx context.Context, report llo.Report, cd llotypes.ChannelDefinition) ([]byte, error) { @@ -103,6 +106,23 @@ func (r ReportCodecPremiumLegacy) Encode(ctx context.Context, report llo.Report, return codec.BuildReport(ctx, rf) } +func (r ReportCodecPremiumLegacy) Verify(ctx context.Context, cd llotypes.ChannelDefinition) error { + opts := ReportFormatEVMPremiumLegacyOpts{} + if err := (&opts).Decode(cd.Opts); err != nil { + return fmt.Errorf("invalid Opts, got: %q; %w", cd.Opts, err) + } + if opts.BaseUSDFee.IsNegative() { + return errors.New("baseUSDFee must be non-negative") + } + if opts.FeedID == (common.Hash{}) { + return errors.New("feedID must not be zero") + } + if len(cd.Streams) != 3 { + return fmt.Errorf("ReportFormatEVMPremiumLegacy requires exactly 3 streams (NativePrice, LinkPrice, Quote); got: %v", cd.Streams) + } + return nil +} + func (r ReportCodecPremiumLegacy) Decode(b []byte) (*reporttypes.Report, error) { codec := reportcodecv3.NewReportCodec([32]byte{}, r.Logger) return codec.Decode(b) diff --git a/core/services/llo/evm/report_codec_premium_legacy_test.go b/core/services/llo/evm/report_codec_premium_legacy_test.go index a88626e6c57..19a2a297262 100644 --- a/core/services/llo/evm/report_codec_premium_legacy_test.go +++ b/core/services/llo/evm/report_codec_premium_legacy_test.go @@ -253,3 +253,83 @@ func Test_LLOExtraHash(t *testing.T) { extraHash := LLOExtraHash(donID) assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000800000001", extraHash.String()) } + +func Test_ReportCodecPremiumLegacy_Verify(t *testing.T) { + c := ReportCodecPremiumLegacy{} + t.Run("unrecognized fields in opts", func(t *testing.T) { + cd := llotypes.ChannelDefinition{ + ReportFormat: llotypes.ReportFormatEVMABIEncodeUnpacked, + Opts: []byte(`{"unknown":"field"}`), + } + err := c.Verify(tests.Context(t), cd) + require.Error(t, err) + assert.Contains(t, err.Error(), "unknown field") + }) + t.Run("invalid opts", func(t *testing.T) { + cd := llotypes.ChannelDefinition{ + ReportFormat: llotypes.ReportFormatEVMABIEncodeUnpacked, + Opts: []byte(`"invalid"`), + } + err := c.Verify(tests.Context(t), cd) + require.Error(t, err) + assert.Contains(t, err.Error(), "invalid Opts, got: \"\\\"invalid\\\"\"; json: cannot unmarshal string into Go value of type evm.ReportFormatEVMPremiumLegacyOpts") + }) + t.Run("negative BaseUSDFee", func(t *testing.T) { + cd := llotypes.ChannelDefinition{ + ReportFormat: llotypes.ReportFormatEVMABIEncodeUnpacked, + Opts: []byte(`{"baseUSDFee":"-1"}`), + } + err := c.Verify(tests.Context(t), cd) + require.Error(t, err) + assert.Contains(t, err.Error(), "baseUSDFee must be non-negative") + }) + t.Run("zero feedID", func(t *testing.T) { + cd := llotypes.ChannelDefinition{ + ReportFormat: llotypes.ReportFormatEVMABIEncodeUnpacked, + Opts: []byte(`{"feedID":"0x"}`), + } + err := c.Verify(tests.Context(t), cd) + require.Error(t, err) + assert.Contains(t, err.Error(), "invalid Opts, got: \"{\\\"feedID\\\":\\\"0x\\\"}\"; hex string has length 0, want 64 for common.Hash") + }) + t.Run("incorrect number of streams", func(t *testing.T) { + cd := llotypes.ChannelDefinition{ + ReportFormat: llotypes.ReportFormatEVMABIEncodeUnpacked, + Opts: []byte(`{"baseUSDFee":"1","feedID":"0x1111111111111111111111111111111111111111111111111111111111111111"}`), + } + err := c.Verify(tests.Context(t), cd) + require.Error(t, err) + assert.Contains(t, err.Error(), "ReportFormatEVMPremiumLegacy requires exactly 3 streams (NativePrice, LinkPrice, Quote); got: []") + }) + t.Run("invalid feedID", func(t *testing.T) { + cd := llotypes.ChannelDefinition{ + ReportFormat: llotypes.ReportFormatEVMABIEncodeUnpacked, + Opts: []byte(`{"baseUSDFee":"1","feedID":"foo"}`), + } + err := c.Verify(tests.Context(t), cd) + require.Error(t, err) + assert.Contains(t, err.Error(), "invalid Opts, got: \"{\\\"baseUSDFee\\\":\\\"1\\\",\\\"feedID\\\":\\\"foo\\\"}\"; json: cannot unmarshal hex string without 0x prefix into Go struct field ReportFormatEVMPremiumLegacyOpts.feedID of type common.Hash") + }) + t.Run("valid", func(t *testing.T) { + cd := llotypes.ChannelDefinition{ + Streams: []llotypes.Stream{ + { + StreamID: 1, + Aggregator: llotypes.AggregatorMedian, + }, + { + StreamID: 2, + Aggregator: llotypes.AggregatorMedian, + }, + { + StreamID: 3, + Aggregator: llotypes.AggregatorMedian, + }, + }, + ReportFormat: llotypes.ReportFormatEVMABIEncodeUnpacked, + Opts: []byte(`{"baseUSDFee":"1","feedID":"0x1111111111111111111111111111111111111111111111111111111111111111"}`), + } + err := c.Verify(tests.Context(t), cd) + require.NoError(t, err) + }) +} diff --git a/core/services/llo/telem/telem_streams.pb.go b/core/services/llo/telem/telem_streams.pb.go index 1ea10cf35ab..435560f1cf8 100644 --- a/core/services/llo/telem/telem_streams.pb.go +++ b/core/services/llo/telem/telem_streams.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc v5.29.3 // source: telem_streams.proto diff --git a/core/services/mocks/checker.go b/core/services/mocks/checker.go index cda33d50ad0..dfb088835fa 100644 --- a/core/services/mocks/checker.go +++ b/core/services/mocks/checker.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr/mocks/ocr_contract_tracker_db.go b/core/services/ocr/mocks/ocr_contract_tracker_db.go index ea95cbd83f5..6d4445cbabc 100644 --- a/core/services/ocr/mocks/ocr_contract_tracker_db.go +++ b/core/services/ocr/mocks/ocr_contract_tracker_db.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr2/plugins/ccip/estimatorconfig/mocks/gas_price_interceptor_mock.go b/core/services/ocr2/plugins/ccip/estimatorconfig/mocks/gas_price_interceptor_mock.go index 78d7fa7bb35..ec11ff08794 100644 --- a/core/services/ocr2/plugins/ccip/estimatorconfig/mocks/gas_price_interceptor_mock.go +++ b/core/services/ocr2/plugins/ccip/estimatorconfig/mocks/gas_price_interceptor_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr2/plugins/ccip/internal/cache/mocks/chain_health_mock.go b/core/services/ocr2/plugins/ccip/internal/cache/mocks/chain_health_mock.go index 5f9d9dcccac..b47c98daeb2 100644 --- a/core/services/ocr2/plugins/ccip/internal/cache/mocks/chain_health_mock.go +++ b/core/services/ocr2/plugins/ccip/internal/cache/mocks/chain_health_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/batchreader/mocks/token_pool_batched_reader_mock.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/batchreader/mocks/token_pool_batched_reader_mock.go index 9bda468b31d..d030fb229d1 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/batchreader/mocks/token_pool_batched_reader_mock.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/batchreader/mocks/token_pool_batched_reader_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/ccipdataprovider/mocks/price_registry_mock.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/ccipdataprovider/mocks/price_registry_mock.go index 7655116ede4..d5ded9237c3 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/ccipdataprovider/mocks/price_registry_mock.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/ccipdataprovider/mocks/price_registry_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/commit_store_reader_mock.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/commit_store_reader_mock.go index 72a0e6b666f..9ec1900eada 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/commit_store_reader_mock.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/commit_store_reader_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/fee_estimator_config_mock.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/fee_estimator_config_mock.go index 9ce400406d4..7f3e9e850ff 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/fee_estimator_config_mock.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/fee_estimator_config_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/offramp_reader_mock.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/offramp_reader_mock.go index 255102feed2..f807bf388ee 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/offramp_reader_mock.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/offramp_reader_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/onramp_reader_mock.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/onramp_reader_mock.go index 1cd3d5ee49b..1317fcdb686 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/onramp_reader_mock.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/onramp_reader_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/price_registry_reader_mock.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/price_registry_reader_mock.go index 49812d2a87c..df7ca7af237 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/price_registry_reader_mock.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/price_registry_reader_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/token_pool_reader_mock.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/token_pool_reader_mock.go index 6ae5a2478bb..25428acb795 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/token_pool_reader_mock.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/token_pool_reader_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/usdc_reader_mock.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/usdc_reader_mock.go index 67823035e5e..a4166503c8b 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/usdc_reader_mock.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks/usdc_reader_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdb/mocks/price_service_mock.go b/core/services/ocr2/plugins/ccip/internal/ccipdb/mocks/price_service_mock.go index 8914ca0b987..5ef056b05db 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdb/mocks/price_service_mock.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdb/mocks/price_service_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr2/plugins/ccip/internal/pricegetter/all_price_getter_mock.go b/core/services/ocr2/plugins/ccip/internal/pricegetter/all_price_getter_mock.go index d05b14b67d2..7847350a365 100644 --- a/core/services/ocr2/plugins/ccip/internal/pricegetter/all_price_getter_mock.go +++ b/core/services/ocr2/plugins/ccip/internal/pricegetter/all_price_getter_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package pricegetter diff --git a/core/services/ocr2/plugins/ccip/internal/pricegetter/mock.go b/core/services/ocr2/plugins/ccip/internal/pricegetter/mock.go index abebd51494c..d22dce9093b 100644 --- a/core/services/ocr2/plugins/ccip/internal/pricegetter/mock.go +++ b/core/services/ocr2/plugins/ccip/internal/pricegetter/mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package pricegetter diff --git a/core/services/ocr2/plugins/ccip/internal/rpclib/rpclibmocks/evm_mock.go b/core/services/ocr2/plugins/ccip/internal/rpclib/rpclibmocks/evm_mock.go index 4d1d3b92735..1577eef6cc0 100644 --- a/core/services/ocr2/plugins/ccip/internal/rpclib/rpclibmocks/evm_mock.go +++ b/core/services/ocr2/plugins/ccip/internal/rpclib/rpclibmocks/evm_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package rpclibmocks diff --git a/core/services/ocr2/plugins/ccip/prices/gas_price_estimator_commit_mock.go b/core/services/ocr2/plugins/ccip/prices/gas_price_estimator_commit_mock.go index 4632ee0ca24..f8c75f28d96 100644 --- a/core/services/ocr2/plugins/ccip/prices/gas_price_estimator_commit_mock.go +++ b/core/services/ocr2/plugins/ccip/prices/gas_price_estimator_commit_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package prices diff --git a/core/services/ocr2/plugins/ccip/prices/gas_price_estimator_exec_mock.go b/core/services/ocr2/plugins/ccip/prices/gas_price_estimator_exec_mock.go index d45cbb202c3..5f635b994bd 100644 --- a/core/services/ocr2/plugins/ccip/prices/gas_price_estimator_exec_mock.go +++ b/core/services/ocr2/plugins/ccip/prices/gas_price_estimator_exec_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package prices diff --git a/core/services/ocr2/plugins/ccip/prices/gas_price_estimator_mock.go b/core/services/ocr2/plugins/ccip/prices/gas_price_estimator_mock.go index 7376f16c0c0..1f55bfc5c81 100644 --- a/core/services/ocr2/plugins/ccip/prices/gas_price_estimator_mock.go +++ b/core/services/ocr2/plugins/ccip/prices/gas_price_estimator_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package prices diff --git a/core/services/ocr2/plugins/ccip/tokendata/reader_mock.go b/core/services/ocr2/plugins/ccip/tokendata/reader_mock.go index c553eed3586..76c1670034f 100644 --- a/core/services/ocr2/plugins/ccip/tokendata/reader_mock.go +++ b/core/services/ocr2/plugins/ccip/tokendata/reader_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package tokendata diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/mocks/registry.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/mocks/registry.go index b4d2eea2508..61e8ae6991f 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/mocks/registry.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/mocks/registry.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/mocks/upkeep_state_reader.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/mocks/upkeep_state_reader.go index 24b5d92ace4..cc50508dfbb 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/mocks/upkeep_state_reader.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core/mocks/upkeep_state_reader.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mocks/http_client.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mocks/http_client.go index 896e1daec97..8b4d47b12b3 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mocks/http_client.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mocks/http_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mocks/registry.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mocks/registry.go index e386b7e0fab..304ff02ed85 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mocks/registry.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mocks/registry.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr2/plugins/promwrapper/mocks/prometheus_backend.go b/core/services/ocr2/plugins/promwrapper/mocks/prometheus_backend.go index 1e85e0d2735..428fe787237 100644 --- a/core/services/ocr2/plugins/promwrapper/mocks/prometheus_backend.go +++ b/core/services/ocr2/plugins/promwrapper/mocks/prometheus_backend.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/ocr2/plugins/threshold/mocks/decryptor.go b/core/services/ocr2/plugins/threshold/mocks/decryptor.go index 6b001b73bcc..b8aece2d9cb 100644 --- a/core/services/ocr2/plugins/threshold/mocks/decryptor.go +++ b/core/services/ocr2/plugins/threshold/mocks/decryptor.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/p2p/types/mocks/peer.go b/core/services/p2p/types/mocks/peer.go index e24c662ffaf..eca4fb5f40c 100644 --- a/core/services/p2p/types/mocks/peer.go +++ b/core/services/p2p/types/mocks/peer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/p2p/types/mocks/peer_wrapper.go b/core/services/p2p/types/mocks/peer_wrapper.go index 98ebff5f618..a1ef4d06bec 100644 --- a/core/services/p2p/types/mocks/peer_wrapper.go +++ b/core/services/p2p/types/mocks/peer_wrapper.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/p2p/types/mocks/signer.go b/core/services/p2p/types/mocks/signer.go index d027fca471a..57cce086545 100644 --- a/core/services/p2p/types/mocks/signer.go +++ b/core/services/p2p/types/mocks/signer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/pipeline/mocks/config.go b/core/services/pipeline/mocks/config.go index f5c6a11b1d7..c8b64049959 100644 --- a/core/services/pipeline/mocks/config.go +++ b/core/services/pipeline/mocks/config.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/pipeline/mocks/orm.go b/core/services/pipeline/mocks/orm.go index 7c13aac4c9e..bbac0712ba9 100644 --- a/core/services/pipeline/mocks/orm.go +++ b/core/services/pipeline/mocks/orm.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/pipeline/mocks/pipeline_param_unmarshaler.go b/core/services/pipeline/mocks/pipeline_param_unmarshaler.go index cb997d57081..c84d49b7ad3 100644 --- a/core/services/pipeline/mocks/pipeline_param_unmarshaler.go +++ b/core/services/pipeline/mocks/pipeline_param_unmarshaler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/pipeline/mocks/runner.go b/core/services/pipeline/mocks/runner.go index 9779d47d70d..aed1a4446f9 100644 --- a/core/services/pipeline/mocks/runner.go +++ b/core/services/pipeline/mocks/runner.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/registrysyncer/mocks/orm.go b/core/services/registrysyncer/mocks/orm.go index 419fe9ae564..44d6fa0dfbd 100644 --- a/core/services/registrysyncer/mocks/orm.go +++ b/core/services/registrysyncer/mocks/orm.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/relay/evm/mercury/mocks/async_deleter.go b/core/services/relay/evm/mercury/mocks/async_deleter.go index ce9dee690e5..6bc17678d0b 100644 --- a/core/services/relay/evm/mercury/mocks/async_deleter.go +++ b/core/services/relay/evm/mercury/mocks/async_deleter.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/relay/evm/mercury/wsrpc/pb/mercury.pb.go b/core/services/relay/evm/mercury/wsrpc/pb/mercury.pb.go index 260a8c25a24..4d7e6d5551d 100644 --- a/core/services/relay/evm/mercury/wsrpc/pb/mercury.pb.go +++ b/core/services/relay/evm/mercury/wsrpc/pb/mercury.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.4 +// protoc-gen-go v1.36.5 // protoc v5.29.3 // source: mercury.proto diff --git a/core/services/relay/evm/mocks/codec.go b/core/services/relay/evm/mocks/codec.go index f4a1e097e5a..1db028df099 100644 --- a/core/services/relay/evm/mocks/codec.go +++ b/core/services/relay/evm/mocks/codec.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/relay/evm/mocks/request_round_db.go b/core/services/relay/evm/mocks/request_round_db.go index 97a499f5d8e..ebbd726e41f 100644 --- a/core/services/relay/evm/mocks/request_round_db.go +++ b/core/services/relay/evm/mocks/request_round_db.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/relay/evm/read/mocks/batch_caller.go b/core/services/relay/evm/read/mocks/batch_caller.go index 4ac1d28b3e0..a5d391a92f2 100644 --- a/core/services/relay/evm/read/mocks/batch_caller.go +++ b/core/services/relay/evm/read/mocks/batch_caller.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/relay/evm/read/mocks/reader.go b/core/services/relay/evm/read/mocks/reader.go index 94fbeecd0f9..049abcbbe74 100644 --- a/core/services/relay/evm/read/mocks/reader.go +++ b/core/services/relay/evm/read/mocks/reader.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/relay/evm/read/mocks/registrar.go b/core/services/relay/evm/read/mocks/registrar.go index 1f4c5ef7f0e..3a1315cd7ff 100644 --- a/core/services/relay/evm/read/mocks/registrar.go +++ b/core/services/relay/evm/read/mocks/registrar.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/relay/evm/statuschecker/mocks/ccip_transaction_status_checker.go b/core/services/relay/evm/statuschecker/mocks/ccip_transaction_status_checker.go index 82841882328..080fc418d14 100644 --- a/core/services/relay/evm/statuschecker/mocks/ccip_transaction_status_checker.go +++ b/core/services/relay/evm/statuschecker/mocks/ccip_transaction_status_checker.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/relay/evm/types/mocks/log_poller_wrapper.go b/core/services/relay/evm/types/mocks/log_poller_wrapper.go index de9f9deca6c..143ec47308d 100644 --- a/core/services/relay/evm/types/mocks/log_poller_wrapper.go +++ b/core/services/relay/evm/types/mocks/log_poller_wrapper.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/s4/mocks/orm.go b/core/services/s4/mocks/orm.go index 989ac1914db..4bffe3adcef 100644 --- a/core/services/s4/mocks/orm.go +++ b/core/services/s4/mocks/orm.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/s4/mocks/storage.go b/core/services/s4/mocks/storage.go index 00ec97962a9..9760418785c 100644 --- a/core/services/s4/mocks/storage.go +++ b/core/services/s4/mocks/storage.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/synchronization/mocks/telem_client.go b/core/services/synchronization/mocks/telem_client.go index bc90bf2ffd6..4baa5ea6226 100644 --- a/core/services/synchronization/mocks/telem_client.go +++ b/core/services/synchronization/mocks/telem_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/synchronization/mocks/telemetry_service.go b/core/services/synchronization/mocks/telemetry_service.go index cd3d64de352..63cff60eac9 100644 --- a/core/services/synchronization/mocks/telemetry_service.go +++ b/core/services/synchronization/mocks/telemetry_service.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/telemetry/monitoring_endpoint_generator_mock.go b/core/services/telemetry/monitoring_endpoint_generator_mock.go index 0f0c6a07dab..56b1c0a2d55 100644 --- a/core/services/telemetry/monitoring_endpoint_generator_mock.go +++ b/core/services/telemetry/monitoring_endpoint_generator_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package telemetry diff --git a/core/services/vrf/mocks/aggregator_v3_interface.go b/core/services/vrf/mocks/aggregator_v3_interface.go index d4e9fd255e2..7002ea35db5 100644 --- a/core/services/vrf/mocks/aggregator_v3_interface.go +++ b/core/services/vrf/mocks/aggregator_v3_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/vrf/mocks/config.go b/core/services/vrf/mocks/config.go index b6195933599..0efb2be9e16 100644 --- a/core/services/vrf/mocks/config.go +++ b/core/services/vrf/mocks/config.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/vrf/mocks/fee_config.go b/core/services/vrf/mocks/fee_config.go index ce273befe70..fe076abbe1a 100644 --- a/core/services/vrf/mocks/fee_config.go +++ b/core/services/vrf/mocks/fee_config.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/vrf/mocks/vrf_coordinator_v2.go b/core/services/vrf/mocks/vrf_coordinator_v2.go index 8db8fca7219..a5f9d7e8501 100644 --- a/core/services/vrf/mocks/vrf_coordinator_v2.go +++ b/core/services/vrf/mocks/vrf_coordinator_v2.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/webhook/mocks/external_initiator_manager.go b/core/services/webhook/mocks/external_initiator_manager.go index 3d3afc4d895..cd42139908d 100644 --- a/core/services/webhook/mocks/external_initiator_manager.go +++ b/core/services/webhook/mocks/external_initiator_manager.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/webhook/mocks/http_client.go b/core/services/webhook/mocks/http_client.go index e795914057e..328cb3c6f16 100644 --- a/core/services/webhook/mocks/http_client.go +++ b/core/services/webhook/mocks/http_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/services/workflows/syncer/mocks/orm.go b/core/services/workflows/syncer/mocks/orm.go index 29f26701bd0..176b2d1c4f6 100644 --- a/core/services/workflows/syncer/mocks/orm.go +++ b/core/services/workflows/syncer/mocks/orm.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/sessions/ldapauth/mocks/ldap_client.go b/core/sessions/ldapauth/mocks/ldap_client.go index 7a09b6e1658..5f8e337aef6 100644 --- a/core/sessions/ldapauth/mocks/ldap_client.go +++ b/core/sessions/ldapauth/mocks/ldap_client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/sessions/ldapauth/mocks/ldap_conn.go b/core/sessions/ldapauth/mocks/ldap_conn.go index ccd9948f2f4..fbe52ae30e4 100644 --- a/core/sessions/ldapauth/mocks/ldap_conn.go +++ b/core/sessions/ldapauth/mocks/ldap_conn.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/sessions/mocks/authentication_provider.go b/core/sessions/mocks/authentication_provider.go index 844dc0f7d65..ae53256ef1e 100644 --- a/core/sessions/mocks/authentication_provider.go +++ b/core/sessions/mocks/authentication_provider.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/core/sessions/mocks/basic_admin_users_orm.go b/core/sessions/mocks/basic_admin_users_orm.go index b69479f248e..002b3f52422 100644 --- a/core/sessions/mocks/basic_admin_users_orm.go +++ b/core/sessions/mocks/basic_admin_users_orm.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/deployment/common/view/v1_0/mocks/workflow_registry_interface.go b/deployment/common/view/v1_0/mocks/workflow_registry_interface.go index 46fb6dcad5f..3d433767c4a 100644 --- a/deployment/common/view/v1_0/mocks/workflow_registry_interface.go +++ b/deployment/common/view/v1_0/mocks/workflow_registry_interface.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package mocks diff --git a/deployment/go.mod b/deployment/go.mod index c05a790a70e..2bd18e5ac37 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -1,6 +1,8 @@ module github.com/smartcontractkit/chainlink/deployment -go 1.23.3 +go 1.24 + +toolchain go1.24.0 // Make sure we're working with the latest chainlink libs replace github.com/smartcontractkit/chainlink/v2 => ../ @@ -11,7 +13,7 @@ require github.com/smartcontractkit/chainlink/v2 v2.0.0-20250221182743-098d1b0a7 require ( github.com/Khan/genqlient v0.7.0 - github.com/Masterminds/semver/v3 v3.3.0 + github.com/Masterminds/semver/v3 v3.3.1 github.com/aptos-labs/aptos-go-sdk v1.5.0 github.com/avast/retry-go/v4 v4.6.0 github.com/aws/aws-sdk-go v1.54.19 @@ -45,11 +47,11 @@ require ( github.com/testcontainers/testcontainers-go v0.35.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 - golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c - golang.org/x/oauth2 v0.23.0 - golang.org/x/sync v0.10.0 - google.golang.org/grpc v1.67.1 - google.golang.org/protobuf v1.36.4 + golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa + golang.org/x/oauth2 v0.26.0 + golang.org/x/sync v0.11.0 + google.golang.org/grpc v1.70.0 + google.golang.org/protobuf v1.36.5 gopkg.in/guregu/null.v4 v4.0.0 ) @@ -165,9 +167,9 @@ require ( github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/fatih/camelcase v1.0.0 // indirect - github.com/fatih/color v1.17.0 // indirect + github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.8 // indirect github.com/gagliardetto/treeout v0.1.4 // indirect @@ -178,7 +180,7 @@ require ( github.com/gin-gonic/gin v1.10.0 // indirect github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect github.com/go-errors/errors v1.4.2 // indirect - github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 // indirect + github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-ldap/ldap/v3 v3.4.6 // indirect @@ -191,22 +193,22 @@ require ( github.com/go-openapi/swag 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.24.0 // indirect - github.com/go-viper/mapstructure/v2 v2.1.0 // indirect + github.com/go-playground/validator/v10 v10.25.0 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // 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.3 // indirect + github.com/goccy/go-json v0.10.5 // 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 github.com/gogo/protobuf v1.3.3 // indirect github.com/golang-jwt/jwt/v4 v4.5.1 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect - github.com/golang/glog v1.2.2 // indirect + github.com/golang/glog v1.2.3 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/btree v1.1.2 // indirect + github.com/google/btree v1.1.3 // indirect github.com/google/flatbuffers v24.3.25+incompatible // indirect github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect github.com/google/go-github/v41 v41.0.0 // indirect @@ -223,9 +225,9 @@ require ( github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect - github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect @@ -234,11 +236,11 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-envparse v0.1.0 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect - github.com/hashicorp/go-plugin v1.6.2 // indirect + github.com/hashicorp/go-plugin v1.6.3 // indirect github.com/hashicorp/go-retryablehttp v0.7.7 // indirect - github.com/hashicorp/golang-lru v0.6.0 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hashicorp/yamux v0.1.2 // indirect github.com/hasura/go-graphql-client v0.13.1 // indirect github.com/hdevalence/ed25519consensus v0.2.0 // indirect github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect @@ -248,7 +250,7 @@ require ( github.com/iancoleman/strcase v0.3.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/invopop/jsonschema v0.12.0 // indirect + github.com/invopop/jsonschema v0.13.0 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgconn v1.14.3 // indirect github.com/jackc/pgio v1.0.0 // indirect @@ -268,8 +270,8 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52 // indirect github.com/kelseyhightower/envconfig v1.4.0 // indirect - github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.8 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // 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 @@ -282,18 +284,18 @@ require ( github.com/logrusorgru/aurora v2.0.3+incompatible // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/mailru/easyjson v0.9.0 // indirect github.com/marcboeker/go-duckdb v1.8.3 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mfridman/interpolate v0.0.2 // indirect - github.com/miekg/dns v1.1.61 // indirect + github.com/miekg/dns v1.1.63 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect github.com/mitchellh/pointerstructure v1.2.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect @@ -322,23 +324,23 @@ require ( github.com/pelletier/go-toml v1.9.5 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect - github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pion/dtls/v2 v2.2.7 // indirect github.com/pion/logging v0.2.2 // indirect github.com/pion/stun/v2 v2.0.0 // indirect github.com/pion/transport/v2 v2.2.1 // indirect github.com/pion/transport/v3 v3.0.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/pressly/goose/v3 v3.21.1 // indirect - github.com/prometheus/client_golang v1.20.5 // indirect + github.com/prometheus/client_golang v1.21.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.60.1 // indirect + github.com/prometheus/common v0.62.0 // indirect github.com/prometheus/procfs v0.15.1 // 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 + github.com/rs/cors v1.11.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect @@ -353,7 +355,7 @@ require ( github.com/shopspring/decimal v1.4.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect + github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect @@ -365,10 +367,10 @@ require ( github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de // indirect github.com/smartcontractkit/wsrpc v0.8.3 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/afero v1.12.0 // indirect github.com/spf13/cast v1.7.1 // indirect github.com/spf13/cobra v1.8.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/spf13/viper v1.19.0 // indirect github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 // indirect github.com/stretchr/objx v0.5.2 // indirect @@ -380,8 +382,8 @@ require ( github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tklauser/go-sysconf v0.3.13 // indirect + github.com/tklauser/numcpus v0.7.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect github.com/urfave/cli/v2 v2.27.5 // indirect @@ -396,46 +398,47 @@ require ( github.com/zondax/ledger-go v0.14.3 // indirect go.dedis.ch/fixbuf v1.0.3 // indirect go.dedis.ch/kyber/v3 v3.1.0 // indirect - go.etcd.io/bbolt v1.3.9 // indirect - go.mongodb.org/mongo-driver v1.15.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.etcd.io/bbolt v1.4.0 // indirect + go.mongodb.org/mongo-driver v1.17.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect - go.opentelemetry.io/otel v1.31.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 // indirect - go.opentelemetry.io/otel/log v0.6.0 // indirect - go.opentelemetry.io/otel/metric v1.31.0 // indirect - go.opentelemetry.io/otel/sdk v1.31.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.6.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.31.0 // indirect - go.opentelemetry.io/otel/trace v1.31.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.opentelemetry.io/otel v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 // indirect + go.opentelemetry.io/otel/log v0.10.0 // indirect + go.opentelemetry.io/otel/metric v1.34.0 // indirect + go.opentelemetry.io/otel/sdk v1.34.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.10.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect + go.opentelemetry.io/otel/trace v1.34.0 // indirect + go.opentelemetry.io/proto/otlp v1.5.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/ratelimit v0.3.1 // indirect golang.org/x/arch v0.11.0 // indirect - golang.org/x/crypto v0.32.0 // indirect - golang.org/x/mod v0.22.0 // indirect - golang.org/x/net v0.34.0 // indirect - golang.org/x/sys v0.29.0 // indirect - golang.org/x/term v0.28.0 // indirect - golang.org/x/text v0.21.0 // indirect - golang.org/x/time v0.7.0 // indirect - golang.org/x/tools v0.29.0 // indirect + golang.org/x/crypto v0.33.0 // indirect + golang.org/x/mod v0.23.0 // indirect + golang.org/x/net v0.35.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/term v0.29.0 // indirect + golang.org/x/text v0.22.0 // indirect + golang.org/x/time v0.10.0 // indirect + golang.org/x/tools v0.30.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect gonum.org/v1/gonum v0.15.1 // indirect - google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect @@ -451,7 +454,7 @@ require ( k8s.io/klog/v2 v2.130.1 // indirect k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f // indirect k8s.io/kubectl v0.31.2 // indirect - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect + k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 // indirect pgregory.net/rapid v1.1.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/controller-runtime v0.19.0 // indirect diff --git a/deployment/go.sum b/deployment/go.sum index ab451ad0e19..9953c5ba608 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -76,8 +76,8 @@ github.com/Khan/genqlient v0.7.0/go.mod h1:HNyy3wZvuYwmW3Y7mkoQLZsa/R5n5yIRajS1k github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= -github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NethermindEth/juno v0.3.1 h1:AW72LiAm9gqUeCVJWvepnZcTnpU4Vkl0KzPMxS+42FA= @@ -395,8 +395,8 @@ github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8 github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -406,8 +406,8 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= 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.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= @@ -447,8 +447,8 @@ github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3Bop github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 h1:ymLjT4f35nQbASLnvxEde4XOBL+Sn7rFuV+FOJqkljg= -github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0/go.mod h1:6daplAwHHGbUGib4990V3Il26O0OC4aRyvewaaAihaA= +github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa h1:Rpu6sKAzIeSWBkrFHD52g8yipagcPbY2Lmm70NL1Gzc= +github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa/go.mod h1:TiCD2a1pcmjd7YnhGH0f/zKNcCD06B029pHhzV23c2M= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -481,8 +481,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.24.0 h1:KHQckvo8G6hlWnrPX4NJJ+aBfWNAE/HH+qdL2cBpCmg= -github.com/go-playground/validator/v10 v10.24.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= +github.com/go-playground/validator/v10 v10.25.0 h1:5Dh7cjvzR7BRZadnsVOzPhWsrwUr0nmsZJxEAnFLNO8= +github.com/go-playground/validator/v10 v10.25.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= github.com/go-resty/resty/v2 v2.15.3 h1:bqff+hcqAflpiF591hhJzNdkRsFhlB96CYfBwSFvql8= github.com/go-resty/resty/v2 v2.15.3/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= @@ -492,14 +492,14 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg78 github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/go-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpGyP1XxdC/w= -github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-webauthn/webauthn v0.9.4 h1:YxvHSqgUyc5AK2pZbqkWWR55qKeDPhP8zLDr6lpIc2g= github.com/go-webauthn/webauthn v0.9.4/go.mod h1:LqupCtzSef38FcxzaklmOn7AykGKhAhr9xlRbdbgnTw= 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/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-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/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= @@ -517,8 +517,8 @@ github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= -github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.3 h1:oDTdz9f5VGVVNGu/Q7UXKWYsD0873HXLHdJUNBsSEKM= +github.com/golang/glog v1.2.3/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -560,8 +560,8 @@ github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXi github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU= @@ -622,10 +622,10 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY= @@ -646,12 +646,12 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaW github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0 h1:FbSCl+KggFl+Ocym490i/EyXF4lPgLoUtcSWquBM0Rs= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0/go.mod h1:qOchhhIlmRcqk/O9uCo/puJlyo07YINaIqdZfZG3Jkc= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= @@ -682,8 +682,8 @@ github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8Io github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-plugin v1.6.2 h1:zdGAEd0V1lCaU0u+MxWQhtSDQmahpkwOun8U8EiRVog= -github.com/hashicorp/go-plugin v1.6.2/go.mod h1:CkgLQ5CZqNmdL9U9JzM532t8ZiYQ35+pj3b1FD37R0Q= +github.com/hashicorp/go-plugin v1.6.3 h1:xgHB+ZUSYeuJi96WtxEjzi23uh7YQpznjGh0U0UUrwg= +github.com/hashicorp/go-plugin v1.6.3/go.mod h1:MRobyh+Wc/nYy1V4KAXUiYfzxoYhs7V1mlH1Z7iY2h0= github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= @@ -694,8 +694,8 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= -github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -704,8 +704,8 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= +github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= github.com/hasura/go-graphql-client v0.13.1 h1:kKbjhxhpwz58usVl+Xvgah/TDha5K2akNTRQdsEHN6U= github.com/hasura/go-graphql-client v0.13.1/go.mod h1:k7FF7h53C+hSNFRG3++DdVZWIuHdCaTbI7siTJ//zGQ= github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= @@ -730,8 +730,8 @@ github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+h github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= -github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= +github.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E= +github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -818,11 +818,11 @@ github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -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/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -866,8 +866,8 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f h1:tVvGiZQFjOXP+9YyGqSA6jE55x1XVxmoPYudncxrZ8U= github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f/go.mod h1:Z60vy0EZVSu0bOugCHdcN5ZxFMKSpjRgsnh0XKPFqqk= github.com/marcboeker/go-duckdb v1.8.3 h1:ZkYwiIZhbYsT6MmJsZ3UPTHrTZccDdM4ztoqSlEMXiQ= @@ -877,8 +877,9 @@ github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcncea github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -898,8 +899,8 @@ github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6B github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= -github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= +github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY= +github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= @@ -921,8 +922,8 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY= +github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= @@ -997,8 +998,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU= github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks= @@ -1016,8 +1017,8 @@ github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+v github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= -github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= @@ -1040,21 +1041,22 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pressly/goose/v3 v3.21.1 h1:5SSAKKWej8LVVzNLuT6KIvP1eFDuPvxa+B6H0w78buQ= github.com/pressly/goose/v3 v3.21.1/go.mod h1:sqthmzV8PitchEkjecFJII//l43dLOCzfWh8pHEe+vE= -github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= -github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ= -github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY= +github.com/prometheus/prometheus v0.302.0 h1:47EsaoBRroS2ekSyMSOPIjXwYnY/mxoFk0xt2dkFvfI= +github.com/prometheus/prometheus v0.302.0/go.mod h1:YcyCoTbUR/TM8rY3Aoeqr0AWTu/pu1Ehh+trpX3eRzg= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= @@ -1073,8 +1075,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= @@ -1140,8 +1142,8 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0/go.mod h1:YQuXIqQpmpAqstWV0LHaDTJ5nsSWuip5ivEM+Fisb+4= -github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= -github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= +github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e h1:QBG+Wn5rHAi4gjnBAq6x6CZj/GjWAahFjj81VhQEu6U= +github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e/go.mod h1:2yUpKW1/jFxpozO/Zkh3fKDzI0jthXoEcU2xuDq+vlo= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= @@ -1189,8 +1191,8 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= +github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= @@ -1202,8 +1204,9 @@ github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3k github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= @@ -1257,10 +1260,12 @@ github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= +github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -1319,13 +1324,13 @@ go.dedis.ch/kyber/v3 v3.1.0/go.mod h1:kXy7p3STAurkADD+/aZcsznZGKVHEqbtmdIzvPfrs1 go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= -go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= -go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= +go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk= +go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= -go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.mongodb.org/mongo-driver v1.17.0 h1:Hp4q2MCjvY19ViwimTs00wHi7G4yzxh4/2+nTx8r40k= +go.mongodb.org/mongo-driver v1.17.0/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1333,48 +1338,50 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0 h1:1f31+6grJmV3X4lxcEvUy13i5/kfDw1nJZwhd8mA4tg= go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0/go.mod h1:1P/02zM3OwkX9uki+Wmxw3a5GVb6KUXRsa7m7bOC9Fg= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= -go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= -go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 h1:UiRNKd1OgqsLbFwE+wkAWTdiAxXtCBqKIHeBIse4FUA= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9/go.mod h1:eqZlW3pJWhjyexnDPrdQxix1pn0wwhI4AO4GKpP/bMI= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 h1:QSKmLBzbFULSyHzOdO9JsN9lpE4zkrz1byYGmJecdVE= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0/go.mod h1:sTQ/NH8Yrirf0sJ5rWqVu+oT82i4zL9FaF6rWcqnptM= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0/go.mod h1:yeGZANgEcpdx/WK0IvvRFC+2oLiMS2u4L/0Rj2M2Qr0= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 h1:VrMAbeJz4gnVDg2zEzjHG4dEH86j4jO6VYB+NgtGD8s= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0/go.mod h1:qqN/uFdpeitTvm+JDqqnjm517pmQRYxTORbETHq5tOc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 h1:0MH3f8lZrflbUWXVxyBg/zviDFdGE062uKh5+fu8Vv0= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0/go.mod h1:Vh68vYiHY5mPdekTr0ox0sALsqjoVy0w3Os278yX5SQ= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 h1:BJee2iLkfRfl9lc7aFmBwkWxY/RI1RDdXepSF6y8TPE= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0/go.mod h1:DIzlHs3DRscCIBU3Y9YSzPfScwnYnzfnCd4g8zA7bZc= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= -go.opentelemetry.io/otel/log v0.6.0 h1:nH66tr+dmEgW5y+F9LanGJUBYPrRgP4g2EkmPE3LeK8= -go.opentelemetry.io/otel/log v0.6.0/go.mod h1:KdySypjQHhP069JX0z/t26VHwa8vSwzgaKmXtIB3fJM= -go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= -go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= -go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= -go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= -go.opentelemetry.io/otel/sdk/log v0.6.0 h1:4J8BwXY4EeDE9Mowg+CyhWVBhTSLXVXodiXxS/+PGqI= -go.opentelemetry.io/otel/sdk/log v0.6.0/go.mod h1:L1DN8RMAduKkrwRAFDEX3E3TLOq46+XMGSbUfHU/+vE= -go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= -go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= -go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= -go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 h1:5dTKu4I5Dn4P2hxyW3l3jTaZx9ACgg0ECos1eAVrheY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0/go.mod h1:P5HcUI8obLrCCmM3sbVBohZFH34iszk/+CPWuakZWL8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 h1:q/heq5Zh8xV1+7GoMGJpTxM2Lhq5+bFxB29tshuRuw0= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0/go.mod h1:leO2CSTg0Y+LyvmR7Wm4pUxE8KAmaM2GCVx7O+RATLA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 h1:ajl4QczuJVA2TU9W9AGw++86Xga/RKt//16z/yxPgdk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0/go.mod h1:Vn3/rlOJ3ntf/Q3zAI0V5lDnTbHGaUsNUeF6nZmm7pA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 h1:GKCEAZLEpEf78cUvudQdTg0aET2ObOZRB2HtXA0qPAI= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0/go.mod h1:9/zqSWLCmHT/9Jo6fYeUDRRogOLL60ABLsHWS99lF8s= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 h1:czJDQwFrMbOr9Kk+BPo1y8WZIIFIK58SA1kykuVeiOU= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0/go.mod h1:lT7bmsxOe58Tq+JIOkTQMCGXdu47oA+VJKLZHbaBKbs= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 h1:jBpDk4HAUsrnVO1FsfCfCOTEc/MkInJmvfCHYLFiT80= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0/go.mod h1:H9LUIM1daaeZaz91vZcfeM0fejXPmgCYE8ZhzqfJuiU= +go.opentelemetry.io/otel/log v0.10.0 h1:1CXmspaRITvFcjA4kyVszuG4HjA61fPDxMb7q3BuyF0= +go.opentelemetry.io/otel/log v0.10.0/go.mod h1:PbVdm9bXKku/gL0oFfUF4wwsQsOPlpo4VEqjvxih+FM= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= +go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/sdk/log v0.10.0 h1:lR4teQGWfeDVGoute6l0Ou+RpFqQ9vaPdrNJlST0bvw= +go.opentelemetry.io/otel/sdk/log v0.10.0/go.mod h1:A+V1UTWREhWAittaQEG4bYm4gAZa6xnvVu+xKrIRkzo= +go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= +go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= +go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1429,8 +1436,8 @@ golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98y golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1441,8 +1448,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc= -golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1471,8 +1478,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= -golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= +golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1525,8 +1532,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1539,8 +1546,8 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE= +golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1554,8 +1561,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1639,8 +1646,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1652,8 +1659,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= -golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1669,13 +1676,13 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= -golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= +golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -1738,8 +1745,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= -golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= +golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= +golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1826,12 +1833,12 @@ google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU= -google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 h1:Pw6WnI9W/LIdRxqK7T6XGugGbHIRl5Q7q3BssH6xk4s= +google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4/go.mod h1:qbZzneIOXSq+KFAFut9krLfRLZiFLzZL5u2t8SV83EE= +google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2 h1:35ZFtrCgaAjF7AFAK0+lRSf+4AyYnWRbH7og13p7rZ4= +google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:W9ynFDP/shebLB1Hl/ESTOap2jHd6pmLXPNZC7SVDbA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 h1:DMTIbak9GhdaSxEjvVzAeNZvyc03I61duqNbnm3SU0M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1852,8 +1859,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1866,8 +1873,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= -google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1930,8 +1937,8 @@ k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f h1:2sXuKesAYbRHxL3aE2PN6z k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f/go.mod h1:UxDHUPsUwTOOxSU+oXURfFBcAS6JwiRXTYqYwfuGowc= k8s.io/kubectl v0.31.2 h1:gTxbvRkMBwvTSAlobiTVqsH6S8Aa1aGyBcu5xYLsn8M= k8s.io/kubectl v0.31.2/go.mod h1:EyASYVU6PY+032RrTh5ahtSOMgoDRIux9V1JLKtG5xM= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 h1:jGnCPejIetjiy2gqaJ5V0NLwTpF4wbQ6cZIItJCSHno= +k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk= diff --git a/deployment/mocks/offchain_client_mock.go b/deployment/mocks/offchain_client_mock.go index f760cd1fda3..5339ec03824 100644 --- a/deployment/mocks/offchain_client_mock.go +++ b/deployment/mocks/offchain_client_mock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. +// Code generated by mockery v2.52.3. DO NOT EDIT. package deployment diff --git a/go.md b/go.md index 8bcff404215..46dd9e4ceb1 100644 --- a/go.md +++ b/go.md @@ -176,6 +176,7 @@ flowchart LR click chainlink-testing-framework/sentinel href "https://github.com/smartcontractkit/chainlink-testing-framework" chainlink-testing-framework/seth click chainlink-testing-framework/seth href "https://github.com/smartcontractkit/chainlink-testing-framework" + chainlink-testing-framework/wasp --> chainlink-testing-framework/lib chainlink-testing-framework/wasp --> chainlink-testing-framework/lib/grafana click chainlink-testing-framework/wasp href "https://github.com/smartcontractkit/chainlink-testing-framework" chainlink/core/scripts --> chainlink/deployment diff --git a/go.mod b/go.mod index fd764f67620..864c836b8b4 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,13 @@ module github.com/smartcontractkit/chainlink/v2 -go 1.23.3 +go 1.24 + +toolchain go1.24.0 require ( github.com/Depado/ginprom v1.8.0 - github.com/Masterminds/semver/v3 v3.3.0 - github.com/Masterminds/sprig/v3 v3.2.3 + github.com/Masterminds/semver/v3 v3.3.1 + github.com/Masterminds/sprig/v3 v3.3.0 github.com/NethermindEth/juno v0.3.1 github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb github.com/andybalholm/brotli v1.1.1 @@ -19,7 +21,7 @@ require ( github.com/doyensec/safeurl v0.2.1 github.com/esote/minmaxheap v1.0.0 github.com/ethereum/go-ethereum v1.15.0 - github.com/fatih/color v1.17.0 + github.com/fatih/color v1.18.0 github.com/fxamacker/cbor/v2 v2.7.0 github.com/gagliardetto/binary v0.8.0 github.com/gagliardetto/solana-go v1.12.0 @@ -30,7 +32,7 @@ require ( github.com/gin-contrib/size v0.0.0-20230212012657-e14a14094dc4 github.com/gin-gonic/gin v1.10.0 github.com/go-ldap/ldap/v3 v3.4.6 - github.com/go-viper/mapstructure/v2 v2.1.0 + github.com/go-viper/mapstructure/v2 v2.2.1 github.com/go-webauthn/webauthn v0.9.4 github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad github.com/google/uuid v1.6.0 @@ -42,7 +44,7 @@ require ( github.com/graph-gophers/graphql-go v1.5.0 github.com/hashicorp/consul/sdk v0.16.1 github.com/hashicorp/go-envparse v0.1.0 - github.com/hashicorp/go-plugin v1.6.2 + github.com/hashicorp/go-plugin v1.6.3 github.com/hashicorp/go-retryablehttp v0.7.7 github.com/hdevalence/ed25519consensus v0.1.0 github.com/imdario/mergo v0.3.16 @@ -64,10 +66,10 @@ require ( github.com/pelletier/go-toml/v2 v2.2.3 github.com/pkg/errors v0.9.1 github.com/pressly/goose/v3 v3.21.1 - github.com/prometheus/client_golang v1.20.5 + github.com/prometheus/client_golang v1.21.0 github.com/prometheus/client_model v0.6.1 - github.com/prometheus/common v0.60.1 - github.com/prometheus/prometheus v0.54.1 + github.com/prometheus/common v0.62.0 + github.com/prometheus/prometheus v0.302.0 github.com/robfig/cron/v3 v3.0.1 github.com/rogpeppe/go-internal v1.13.1 github.com/rs/zerolog v1.33.0 @@ -79,7 +81,7 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea - github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 + github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e github.com/smartcontractkit/chainlink-feeds v0.1.1 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb @@ -102,37 +104,41 @@ require ( go.dedis.ch/fixbuf v1.0.3 go.dedis.ch/kyber/v3 v3.1.0 go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0 - go.opentelemetry.io/otel v1.31.0 - go.opentelemetry.io/otel/metric v1.31.0 - go.opentelemetry.io/otel/sdk/metric v1.31.0 - go.opentelemetry.io/otel/trace v1.31.0 + go.opentelemetry.io/otel v1.34.0 + go.opentelemetry.io/otel/metric v1.34.0 + go.opentelemetry.io/otel/sdk/metric v1.34.0 + go.opentelemetry.io/otel/trace v1.34.0 go.uber.org/atomic v1.11.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.32.0 - golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c - golang.org/x/mod v0.22.0 - golang.org/x/sync v0.10.0 - golang.org/x/term v0.28.0 - golang.org/x/text v0.21.0 - golang.org/x/time v0.7.0 - golang.org/x/tools v0.29.0 + golang.org/x/crypto v0.33.0 + golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa + golang.org/x/mod v0.23.0 + golang.org/x/sync v0.11.0 + golang.org/x/term v0.29.0 + golang.org/x/text v0.22.0 + golang.org/x/time v0.10.0 + golang.org/x/tools v0.30.0 gonum.org/v1/gonum v0.15.1 - google.golang.org/grpc v1.67.1 - google.golang.org/protobuf v1.36.4 + google.golang.org/grpc v1.70.0 + google.golang.org/protobuf v1.36.5 gopkg.in/guregu/null.v4 v4.0.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 + k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 ) require ( + dario.cat/mergo v1.0.1 // indirect github.com/bytecodealliance/wasmtime-go/v28 v28.0.0 // indirect + github.com/gorilla/handlers v1.5.2 // indirect + github.com/gorilla/mux v1.8.1 // indirect github.com/pion/dtls/v2 v2.2.7 // indirect github.com/pion/logging v0.2.2 // indirect github.com/pion/stun/v2 v2.0.0 // indirect github.com/pion/transport/v2 v2.2.1 // indirect github.com/pion/transport/v3 v3.0.1 // indirect github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect ) require ( @@ -200,14 +206,14 @@ require ( github.com/dvsekhvalnov/jose2go v1.7.0 // indirect github.com/ethereum/c-kzg-4844 v1.0.3 // indirect github.com/ethereum/go-verkle v0.2.2 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/gabriel-vasile/mimetype v1.4.8 // indirect github.com/gagliardetto/treeout v0.1.4 // indirect github.com/gagliardetto/utilz v0.1.1 // indirect github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect - github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 // indirect + github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect @@ -216,19 +222,19 @@ require ( github.com/go-ole/go-ole v1.3.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.24.0 // indirect + github.com/go-playground/validator/v10 v10.25.0 // indirect github.com/go-webauthn/x v0.1.5 // indirect - github.com/goccy/go-json v0.10.3 // indirect + github.com/goccy/go-json v0.10.5 // 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 github.com/gogo/protobuf v1.3.3 // indirect github.com/golang-jwt/jwt/v4 v4.5.1 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect - github.com/golang/glog v1.2.2 // indirect + github.com/golang/glog v1.2.3 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/btree v1.1.2 // indirect + github.com/google/btree v1.1.3 // indirect github.com/google/flatbuffers v24.3.25+incompatible // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-tpm v0.9.0 // indirect @@ -236,9 +242,9 @@ require ( github.com/gorilla/context v1.1.1 // indirect github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect - github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect @@ -246,17 +252,17 @@ require ( github.com/hashicorp/go-bexpr v0.1.10 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect - github.com/hashicorp/golang-lru v0.6.0 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hashicorp/yamux v0.1.2 // indirect github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.3.2 // indirect - github.com/huandu/xstrings v1.4.0 // indirect + github.com/huandu/xstrings v1.5.0 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/invopop/jsonschema v0.12.0 // indirect + github.com/invopop/jsonschema v0.13.0 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect @@ -266,8 +272,8 @@ require ( github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.8 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect @@ -275,18 +281,18 @@ require ( github.com/linxGnu/grocksdb v1.7.16 // indirect github.com/logrusorgru/aurora v2.0.3+incompatible // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/mailru/easyjson v0.9.0 // indirect github.com/marcboeker/go-duckdb v1.8.3 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mfridman/interpolate v0.0.2 // indirect - github.com/miekg/dns v1.1.61 // indirect + github.com/miekg/dns v1.1.63 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect github.com/mitchellh/pointerstructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect @@ -298,14 +304,14 @@ require ( github.com/oklog/run v1.1.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opencontainers/runc v1.1.10 // indirect - github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect - github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/rs/cors v1.9.0 // indirect + github.com/rs/cors v1.11.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect @@ -318,9 +324,9 @@ require ( github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/afero v1.12.0 // indirect github.com/spf13/cobra v1.8.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/spf13/viper v1.19.0 // indirect github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 // indirect github.com/stretchr/objx v0.5.2 // indirect @@ -330,8 +336,8 @@ require ( github.com/tendermint/go-amino v0.16.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tklauser/go-sysconf v0.3.13 // indirect + github.com/tklauser/numcpus v0.7.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect github.com/umbracle/fastrlp v0.0.0-20220527094140-59d5dd30e722 // indirect @@ -344,31 +350,31 @@ require ( github.com/zondax/hid v0.9.2 // indirect github.com/zondax/ledger-go v0.14.3 // indirect go.dedis.ch/protobuf v1.0.11 // indirect - go.etcd.io/bbolt v1.3.9 // indirect - go.mongodb.org/mongo-driver v1.15.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 // indirect - go.opentelemetry.io/otel/log v0.6.0 // indirect - go.opentelemetry.io/otel/sdk v1.31.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.6.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.etcd.io/bbolt v1.4.0 // indirect + go.mongodb.org/mongo-driver v1.17.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 // indirect + go.opentelemetry.io/otel/log v0.10.0 // indirect + go.opentelemetry.io/otel/sdk v1.34.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.10.0 // indirect + go.opentelemetry.io/proto/otlp v1.5.0 // indirect go.uber.org/ratelimit v0.3.1 // indirect golang.org/x/arch v0.11.0 // indirect - golang.org/x/net v0.34.0 // indirect - golang.org/x/sys v0.29.0 // indirect + golang.org/x/net v0.35.0 // indirect + golang.org/x/sys v0.30.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect - google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 // indirect gopkg.in/guregu/null.v2 v2.1.2 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 469ecfc4b0f..21d315cb677 100644 --- a/go.sum +++ b/go.sum @@ -46,6 +46,8 @@ cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= cosmossdk.io/math v1.3.0 h1:RC+jryuKeytIiictDslBP9i1fhkVm6ZDmZEoNP316zE= cosmossdk.io/math v1.3.0/go.mod h1:vnRTxewy+M7BtXBNFybkuhSH4WfedVAAnERHgVFhp3k= +dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= +dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= @@ -71,11 +73,10 @@ github.com/Depado/ginprom v1.8.0/go.mod h1:XBaKzeNBqPF4vxJpNLincSQZeMDnZp1tIbU0F github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= -github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= -github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= -github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs= +github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NethermindEth/juno v0.3.1 h1:AW72LiAm9gqUeCVJWvepnZcTnpU4Vkl0KzPMxS+42FA= @@ -317,8 +318,8 @@ github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cn github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -328,8 +329,8 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= 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.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= @@ -372,8 +373,8 @@ github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3Bop github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 h1:ymLjT4f35nQbASLnvxEde4XOBL+Sn7rFuV+FOJqkljg= -github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0/go.mod h1:6daplAwHHGbUGib4990V3Il26O0OC4aRyvewaaAihaA= +github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa h1:Rpu6sKAzIeSWBkrFHD52g8yipagcPbY2Lmm70NL1Gzc= +github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa/go.mod h1:TiCD2a1pcmjd7YnhGH0f/zKNcCD06B029pHhzV23c2M= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -403,8 +404,8 @@ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl 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.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= -github.com/go-playground/validator/v10 v10.24.0 h1:KHQckvo8G6hlWnrPX4NJJ+aBfWNAE/HH+qdL2cBpCmg= -github.com/go-playground/validator/v10 v10.24.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= +github.com/go-playground/validator/v10 v10.25.0 h1:5Dh7cjvzR7BRZadnsVOzPhWsrwUr0nmsZJxEAnFLNO8= +github.com/go-playground/validator/v10 v10.25.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -412,15 +413,15 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8Wd github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/go-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpGyP1XxdC/w= -github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-webauthn/webauthn v0.9.4 h1:YxvHSqgUyc5AK2pZbqkWWR55qKeDPhP8zLDr6lpIc2g= github.com/go-webauthn/webauthn v0.9.4/go.mod h1:LqupCtzSef38FcxzaklmOn7AykGKhAhr9xlRbdbgnTw= 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/goccy/go-json v0.9.7/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-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/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= @@ -438,8 +439,8 @@ github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= -github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.3 h1:oDTdz9f5VGVVNGu/Q7UXKWYsD0873HXLHdJUNBsSEKM= +github.com/golang/glog v1.2.3/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -479,8 +480,8 @@ github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXi github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -524,7 +525,6 @@ github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/Z github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -535,10 +535,10 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY= @@ -558,12 +558,12 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaW github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0 h1:FbSCl+KggFl+Ocym490i/EyXF4lPgLoUtcSWquBM0Rs= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0/go.mod h1:qOchhhIlmRcqk/O9uCo/puJlyo07YINaIqdZfZG3Jkc= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= @@ -592,8 +592,8 @@ github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-plugin v1.6.2 h1:zdGAEd0V1lCaU0u+MxWQhtSDQmahpkwOun8U8EiRVog= -github.com/hashicorp/go-plugin v1.6.2/go.mod h1:CkgLQ5CZqNmdL9U9JzM532t8ZiYQ35+pj3b1FD37R0Q= +github.com/hashicorp/go-plugin v1.6.3 h1:xgHB+ZUSYeuJi96WtxEjzi23uh7YQpznjGh0U0UUrwg= +github.com/hashicorp/go-plugin v1.6.3/go.mod h1:MRobyh+Wc/nYy1V4KAXUiYfzxoYhs7V1mlH1Z7iY2h0= github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= @@ -604,8 +604,8 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= -github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -614,8 +614,8 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= +github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= @@ -627,23 +627,21 @@ github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXei github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= -github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= -github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= +github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= -github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= +github.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E= +github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -706,7 +704,6 @@ github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= @@ -724,11 +721,11 @@ github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -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/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -769,8 +766,8 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f h1:tVvGiZQFjOXP+9YyGqSA6jE55x1XVxmoPYudncxrZ8U= github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f/go.mod h1:Z60vy0EZVSu0bOugCHdcN5ZxFMKSpjRgsnh0XKPFqqk= github.com/marcboeker/go-duckdb v1.8.3 h1:ZkYwiIZhbYsT6MmJsZ3UPTHrTZccDdM4ztoqSlEMXiQ= @@ -780,8 +777,9 @@ github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcncea github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -801,8 +799,8 @@ github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6B github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= -github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= +github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY= +github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= @@ -811,7 +809,6 @@ github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcs github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -827,11 +824,10 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY= +github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= @@ -888,8 +884,9 @@ github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQ github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/runc v1.1.10 h1:EaL5WeO9lv9wmS6SASjszOeQdSctvpbu0DdBQBizE40= github.com/opencontainers/runc v1.1.10/go.mod h1:+/R6+KmDlh+hOO8NkjmgkG9Qzvypzk0yXxAPYYR65+M= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -904,8 +901,8 @@ github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNH github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= -github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= @@ -928,21 +925,22 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pressly/goose/v3 v3.21.1 h1:5SSAKKWej8LVVzNLuT6KIvP1eFDuPvxa+B6H0w78buQ= github.com/pressly/goose/v3 v3.21.1/go.mod h1:sqthmzV8PitchEkjecFJII//l43dLOCzfWh8pHEe+vE= -github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= -github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ= -github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY= +github.com/prometheus/prometheus v0.302.0 h1:47EsaoBRroS2ekSyMSOPIjXwYnY/mxoFk0xt2dkFvfI= +github.com/prometheus/prometheus v0.302.0/go.mod h1:YcyCoTbUR/TM8rY3Aoeqr0AWTu/pu1Ehh+trpX3eRzg= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= @@ -963,8 +961,8 @@ github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6po github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= -github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= -github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= @@ -1024,8 +1022,8 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= -github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= -github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= +github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e h1:QBG+Wn5rHAi4gjnBAq6x6CZj/GjWAahFjj81VhQEu6U= +github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e/go.mod h1:2yUpKW1/jFxpozO/Zkh3fKDzI0jthXoEcU2xuDq+vlo= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= @@ -1063,8 +1061,8 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= +github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= @@ -1076,8 +1074,9 @@ github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3k github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= @@ -1130,10 +1129,12 @@ github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= +github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= @@ -1192,13 +1193,13 @@ go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRL go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= go.dedis.ch/protobuf v1.0.11 h1:FTYVIEzY/bfl37lu3pR4lIj+F9Vp1jE8oh91VmxKgLo= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= -go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= -go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= +go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk= +go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= -go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.mongodb.org/mongo-driver v1.17.0 h1:Hp4q2MCjvY19ViwimTs00wHi7G4yzxh4/2+nTx8r40k= +go.mongodb.org/mongo-driver v1.17.0/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1206,50 +1207,52 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0 h1:1f31+6grJmV3X4lxcEvUy13i5/kfDw1nJZwhd8mA4tg= go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0/go.mod h1:1P/02zM3OwkX9uki+Wmxw3a5GVb6KUXRsa7m7bOC9Fg= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= go.opentelemetry.io/contrib/propagators/b3 v1.24.0 h1:n4xwCdTx3pZqZs2CjS/CUZAs03y3dZcGhC/FepKtEUY= go.opentelemetry.io/contrib/propagators/b3 v1.24.0/go.mod h1:k5wRxKRU2uXx2F8uNJ4TaonuEO/V7/5xoz7kdsDACT8= go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= -go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= -go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 h1:UiRNKd1OgqsLbFwE+wkAWTdiAxXtCBqKIHeBIse4FUA= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9/go.mod h1:eqZlW3pJWhjyexnDPrdQxix1pn0wwhI4AO4GKpP/bMI= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 h1:QSKmLBzbFULSyHzOdO9JsN9lpE4zkrz1byYGmJecdVE= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0/go.mod h1:sTQ/NH8Yrirf0sJ5rWqVu+oT82i4zL9FaF6rWcqnptM= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0/go.mod h1:yeGZANgEcpdx/WK0IvvRFC+2oLiMS2u4L/0Rj2M2Qr0= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 h1:VrMAbeJz4gnVDg2zEzjHG4dEH86j4jO6VYB+NgtGD8s= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0/go.mod h1:qqN/uFdpeitTvm+JDqqnjm517pmQRYxTORbETHq5tOc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 h1:0MH3f8lZrflbUWXVxyBg/zviDFdGE062uKh5+fu8Vv0= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0/go.mod h1:Vh68vYiHY5mPdekTr0ox0sALsqjoVy0w3Os278yX5SQ= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 h1:BJee2iLkfRfl9lc7aFmBwkWxY/RI1RDdXepSF6y8TPE= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0/go.mod h1:DIzlHs3DRscCIBU3Y9YSzPfScwnYnzfnCd4g8zA7bZc= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= -go.opentelemetry.io/otel/log v0.6.0 h1:nH66tr+dmEgW5y+F9LanGJUBYPrRgP4g2EkmPE3LeK8= -go.opentelemetry.io/otel/log v0.6.0/go.mod h1:KdySypjQHhP069JX0z/t26VHwa8vSwzgaKmXtIB3fJM= -go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= -go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= -go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= -go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= -go.opentelemetry.io/otel/sdk/log v0.6.0 h1:4J8BwXY4EeDE9Mowg+CyhWVBhTSLXVXodiXxS/+PGqI= -go.opentelemetry.io/otel/sdk/log v0.6.0/go.mod h1:L1DN8RMAduKkrwRAFDEX3E3TLOq46+XMGSbUfHU/+vE= -go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= -go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= +go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 h1:5dTKu4I5Dn4P2hxyW3l3jTaZx9ACgg0ECos1eAVrheY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0/go.mod h1:P5HcUI8obLrCCmM3sbVBohZFH34iszk/+CPWuakZWL8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 h1:q/heq5Zh8xV1+7GoMGJpTxM2Lhq5+bFxB29tshuRuw0= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0/go.mod h1:leO2CSTg0Y+LyvmR7Wm4pUxE8KAmaM2GCVx7O+RATLA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 h1:ajl4QczuJVA2TU9W9AGw++86Xga/RKt//16z/yxPgdk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0/go.mod h1:Vn3/rlOJ3ntf/Q3zAI0V5lDnTbHGaUsNUeF6nZmm7pA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 h1:GKCEAZLEpEf78cUvudQdTg0aET2ObOZRB2HtXA0qPAI= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0/go.mod h1:9/zqSWLCmHT/9Jo6fYeUDRRogOLL60ABLsHWS99lF8s= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 h1:czJDQwFrMbOr9Kk+BPo1y8WZIIFIK58SA1kykuVeiOU= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0/go.mod h1:lT7bmsxOe58Tq+JIOkTQMCGXdu47oA+VJKLZHbaBKbs= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 h1:jBpDk4HAUsrnVO1FsfCfCOTEc/MkInJmvfCHYLFiT80= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0/go.mod h1:H9LUIM1daaeZaz91vZcfeM0fejXPmgCYE8ZhzqfJuiU= +go.opentelemetry.io/otel/log v0.10.0 h1:1CXmspaRITvFcjA4kyVszuG4HjA61fPDxMb7q3BuyF0= +go.opentelemetry.io/otel/log v0.10.0/go.mod h1:PbVdm9bXKku/gL0oFfUF4wwsQsOPlpo4VEqjvxih+FM= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= +go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/sdk/log v0.10.0 h1:lR4teQGWfeDVGoute6l0Ou+RpFqQ9vaPdrNJlST0bvw= +go.opentelemetry.io/otel/sdk/log v0.10.0/go.mod h1:A+V1UTWREhWAittaQEG4bYm4gAZa6xnvVu+xKrIRkzo= +go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= +go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= -go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= -go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= +go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1297,14 +1300,13 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1315,8 +1317,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc= -golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1345,8 +1347,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= -golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= +golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1395,15 +1397,14 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1429,8 +1430,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1506,7 +1507,6 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1516,12 +1516,11 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= @@ -1529,8 +1528,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= -golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1540,20 +1539,19 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= -golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= +golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -1616,8 +1614,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= -golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= +golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= +golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1702,12 +1700,12 @@ google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU= -google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 h1:Pw6WnI9W/LIdRxqK7T6XGugGbHIRl5Q7q3BssH6xk4s= +google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4/go.mod h1:qbZzneIOXSq+KFAFut9krLfRLZiFLzZL5u2t8SV83EE= +google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2 h1:35ZFtrCgaAjF7AFAK0+lRSf+4AyYnWRbH7og13p7rZ4= +google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:W9ynFDP/shebLB1Hl/ESTOap2jHd6pmLXPNZC7SVDbA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 h1:DMTIbak9GhdaSxEjvVzAeNZvyc03I61duqNbnm3SU0M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1728,8 +1726,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1743,8 +1741,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= -google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1787,8 +1785,8 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 h1:jGnCPejIetjiy2gqaJ5V0NLwTpF4wbQ6cZIItJCSHno= +k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 238c5372217..92df196a65e 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -1,8 +1,8 @@ module github.com/smartcontractkit/chainlink/integration-tests -go 1.23.3 +go 1.24 -toolchain go1.23.4 +toolchain go1.24.0 // Make sure we're working with the latest chainlink libs replace github.com/smartcontractkit/chainlink/v2 => ../ @@ -19,7 +19,7 @@ require ( require ( dario.cat/mergo v1.0.1 github.com/AlekSi/pointer v1.1.0 - github.com/Masterminds/semver/v3 v3.3.0 + github.com/Masterminds/semver/v3 v3.3.1 github.com/avast/retry-go v3.0.0+incompatible github.com/avast/retry-go/v4 v4.6.0 github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df @@ -28,7 +28,7 @@ require ( github.com/deckarep/golang-set/v2 v2.6.0 github.com/ethereum/go-ethereum v1.15.0 github.com/fxamacker/cbor/v2 v2.7.0 - github.com/go-resty/resty/v2 v2.15.3 + github.com/go-resty/resty/v2 v2.16.3 github.com/google/go-cmp v0.6.0 github.com/google/uuid v1.6.0 github.com/jmoiron/sqlx v1.4.0 @@ -38,7 +38,7 @@ require ( github.com/onsi/gomega v1.36.2 github.com/pelletier/go-toml/v2 v2.2.3 github.com/pkg/errors v0.9.1 - github.com/prometheus/common v0.60.1 + github.com/prometheus/common v0.62.0 github.com/rs/zerolog v1.33.0 github.com/scylladb/go-reflectx v1.0.1 github.com/segmentio/ksuid v1.0.4 @@ -55,7 +55,7 @@ require ( github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 github.com/smartcontractkit/chainlink-testing-framework/sentinel v0.1.2 github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 - github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2 + github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.6-0.20250224181213-3514fc5f737a github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 github.com/spf13/cobra v1.8.1 github.com/stretchr/testify v1.10.0 @@ -65,39 +65,42 @@ require ( go.uber.org/atomic v1.11.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.32.0 - golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c - golang.org/x/sync v0.10.0 - golang.org/x/text v0.21.0 - google.golang.org/grpc v1.67.1 + golang.org/x/crypto v0.33.0 + golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa + golang.org/x/sync v0.11.0 + golang.org/x/text v0.22.0 + google.golang.org/grpc v1.70.0 gopkg.in/guregu/null.v4 v4.0.0 - k8s.io/apimachinery v0.31.2 + k8s.io/apimachinery v0.32.2 ) require ( + cloud.google.com/go/auth v0.14.1 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect + cloud.google.com/go/compute/metadata v0.6.0 // indirect cosmossdk.io/errors v1.0.1 // indirect cosmossdk.io/math v1.3.0 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 // indirect github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect github.com/DataDog/zstd v1.5.2 // indirect github.com/Khan/genqlient v0.7.0 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/sprig/v3 v3.2.3 // indirect + github.com/Masterminds/sprig/v3 v3.3.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/NethermindEth/juno v0.3.1 // indirect github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb // indirect github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/XSAM/otelsql v0.29.0 // indirect - github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 // indirect + github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect github.com/andybalholm/brotli v1.1.1 // indirect github.com/apache/arrow-go/v18 v18.0.0 // indirect github.com/aptos-labs/aptos-go-sdk v1.5.0 // indirect @@ -105,23 +108,23 @@ require ( github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c // indirect github.com/awalterschulze/gographviz v2.0.3+incompatible // indirect - github.com/aws/aws-sdk-go v1.54.19 // indirect - github.com/aws/aws-sdk-go-v2 v1.32.2 // indirect - github.com/aws/aws-sdk-go-v2/config v1.28.0 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.41 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.17 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21 // indirect + github.com/aws/aws-sdk-go v1.55.6 // indirect + github.com/aws/aws-sdk-go-v2 v1.32.7 // indirect + github.com/aws/aws-sdk-go-v2/config v1.28.6 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.47 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7 // indirect github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.24.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.32.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 // indirect github.com/aws/constructs-go/constructs/v10 v10.4.2 // indirect github.com/aws/jsii-runtime-go v1.104.0 // indirect - github.com/aws/smithy-go v1.22.0 // indirect + github.com/aws/smithy-go v1.22.1 // indirect github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 // indirect @@ -138,8 +141,7 @@ require ( github.com/bytecodealliance/wasmtime-go/v28 v28.0.0 // 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/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500 // indirect github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5 // indirect github.com/cenkalti/backoff v2.2.1+incompatible // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect @@ -185,15 +187,16 @@ require ( github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/distribution/reference v0.6.0 // indirect - github.com/docker/docker v27.3.1+incompatible // indirect + github.com/docker/docker v27.5.1+incompatible // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dominikbraun/graph v0.23.0 // indirect github.com/doyensec/safeurl v0.2.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.7.0 // indirect - github.com/edsrzf/mmap-go v1.1.0 // indirect + github.com/edsrzf/mmap-go v1.2.0 // indirect github.com/emicklei/go-restful/v3 v3.12.1 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.32.3 // indirect github.com/esote/minmaxheap v1.0.0 // indirect github.com/ethereum/c-kzg-4844 v1.0.3 // indirect github.com/ethereum/go-verkle v0.2.2 // indirect @@ -201,9 +204,9 @@ require ( github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb // indirect github.com/fatih/camelcase v1.0.0 // indirect - github.com/fatih/color v1.17.0 // indirect + github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/gabriel-vasile/mimetype v1.4.8 // indirect github.com/gagliardetto/binary v0.8.0 // indirect github.com/gagliardetto/solana-go v1.12.0 // indirect @@ -215,7 +218,7 @@ require ( github.com/gin-gonic/gin v1.10.0 // indirect github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect github.com/go-errors/errors v1.4.2 // indirect - github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 // indirect + github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-ldap/ldap/v3 v3.4.6 // indirect @@ -223,23 +226,23 @@ require ( github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-openapi/analysis v0.22.2 // indirect + github.com/go-openapi/analysis v0.23.0 // indirect github.com/go-openapi/errors v0.22.0 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect - github.com/go-openapi/loads v0.21.5 // indirect - github.com/go-openapi/spec v0.20.14 // indirect + github.com/go-openapi/loads v0.22.0 // indirect + github.com/go-openapi/spec v0.21.0 // indirect github.com/go-openapi/strfmt v0.23.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect - github.com/go-openapi/validate v0.23.0 // indirect + github.com/go-openapi/validate v0.24.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.24.0 // indirect - github.com/go-redis/redis/v8 v8.11.5 // indirect - github.com/go-viper/mapstructure/v2 v2.1.0 // indirect + github.com/go-playground/validator/v10 v10.25.0 // indirect + github.com/go-redsync/redsync/v4 v4.13.0 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // 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.3 // indirect + github.com/goccy/go-json v0.10.5 // 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 @@ -248,11 +251,10 @@ require ( github.com/gogo/status v1.1.1 // indirect github.com/golang-jwt/jwt/v4 v4.5.1 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect - github.com/golang/glog v1.2.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/glog v1.2.3 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/btree v1.1.2 // indirect + github.com/google/btree v1.1.3 // indirect github.com/google/flatbuffers v24.3.25+incompatible // indirect github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect github.com/google/go-github/v41 v41.0.0 // indirect @@ -260,30 +262,34 @@ require ( github.com/google/go-tpm v0.9.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect + github.com/google/s2a-go v0.1.9 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect + github.com/googleapis/gax-go/v2 v2.14.1 // indirect github.com/gorilla/context v1.1.1 // indirect - github.com/gorilla/mux v1.8.0 // indirect + github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/securecookie v1.1.2 // indirect github.com/gorilla/sessions v1.2.2 // indirect github.com/gorilla/websocket v1.5.3 // indirect - github.com/grafana/dskit v0.0.0-20231120170505-765e343eda4f // indirect - github.com/grafana/gomemcache v0.0.0-20231023152154-6947259a0586 // indirect + github.com/grafana/dskit v0.0.0-20241007172036-53283a0f6b41 // indirect + github.com/grafana/gomemcache v0.0.0-20240229205252-cd6a66d6fb56 // indirect github.com/grafana/grafana-foundation-sdk/go v0.0.0-20240326122733-6f96a993222b // indirect - github.com/grafana/loki v1.6.2-0.20231215164305-b51b7d7b5503 // indirect - github.com/grafana/loki/pkg/push v0.0.0-20231201111602-11ef833ed3e4 // indirect + github.com/grafana/jsonparser v0.0.0-20241004153430-023329977675 // indirect + github.com/grafana/loki/pkg/push v0.0.0-20240924133635-758364c7775f // indirect + github.com/grafana/loki/v3 v3.0.0-20250221202516-b37eefe24f82 // indirect github.com/grafana/pyroscope-go v1.1.2 // indirect github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect - github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 // indirect - github.com/hashicorp/consul/api v1.29.2 // indirect + github.com/hashicorp/consul/api v1.31.2 // indirect github.com/hashicorp/consul/sdk v0.16.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-bexpr v0.1.10 // indirect @@ -291,28 +297,29 @@ require ( github.com/hashicorp/go-envparse v0.1.0 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-msgpack v0.5.5 // indirect + github.com/hashicorp/go-metrics v0.5.4 // indirect + github.com/hashicorp/go-msgpack/v2 v2.1.1 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-plugin v1.6.2 // indirect + github.com/hashicorp/go-plugin v1.6.3 // indirect github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect - github.com/hashicorp/go-sockaddr v1.0.6 // indirect - github.com/hashicorp/golang-lru v0.6.0 // indirect + github.com/hashicorp/go-sockaddr v1.0.7 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/memberlist v0.5.0 // indirect + github.com/hashicorp/memberlist v0.5.2 // indirect github.com/hashicorp/serf v0.10.1 // indirect - github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hashicorp/yamux v0.1.2 // indirect github.com/hasura/go-graphql-client v0.13.1 // indirect github.com/hdevalence/ed25519consensus v0.2.0 // indirect github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.3.2 // indirect - github.com/huandu/xstrings v1.4.0 // indirect + github.com/huandu/xstrings v1.5.0 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/invopop/jsonschema v0.12.0 // indirect + github.com/invopop/jsonschema v0.13.0 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgconn v1.14.3 // indirect github.com/jackc/pgio v1.0.0 // indirect @@ -332,8 +339,8 @@ require ( github.com/julienschmidt/httprouter v1.3.0 // indirect github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52 // indirect github.com/kelseyhightower/envconfig v1.4.0 // indirect - github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.8 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // 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 @@ -343,27 +350,29 @@ require ( github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/linxGnu/grocksdb v1.7.16 // indirect github.com/logrusorgru/aurora v2.0.3+incompatible // indirect - github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/mailru/easyjson v0.9.0 // indirect github.com/marcboeker/go-duckdb v1.8.3 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mdlayher/socket v0.5.1 // indirect + github.com/mdlayher/vsock v1.2.1 // indirect github.com/mfridman/interpolate v0.0.2 // indirect - github.com/miekg/dns v1.1.61 // indirect + github.com/miekg/dns v1.1.63 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect github.com/mitchellh/pointerstructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/patternmatcher v0.6.0 // indirect - github.com/moby/spdystream v0.4.0 // indirect + github.com/moby/spdystream v0.5.0 // indirect github.com/moby/sys/sequential v0.6.0 // indirect github.com/moby/sys/user v0.3.0 // indirect github.com/moby/sys/userns v0.1.0 // indirect @@ -381,38 +390,42 @@ require ( github.com/oklog/run v1.1.0 // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor v0.116.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect - github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e // indirect - github.com/opentracing-contrib/go-stdlib v1.0.0 // indirect - github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/opentracing-contrib/go-grpc v0.1.1 // indirect + github.com/opentracing-contrib/go-stdlib v1.1.0 // indirect + github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect github.com/otiai10/copy v1.14.0 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible // indirect - github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect - github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pion/dtls/v2 v2.2.7 // indirect github.com/pion/logging v0.2.2 // indirect github.com/pion/stun/v2 v2.0.0 // indirect github.com/pion/transport/v2 v2.2.1 // indirect github.com/pion/transport/v3 v3.0.1 // indirect + github.com/pires/go-proxyproto v0.7.0 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/pressly/goose/v3 v3.21.1 // indirect - github.com/prometheus/alertmanager v0.27.0 // indirect - github.com/prometheus/client_golang v1.20.5 // indirect + github.com/prometheus/alertmanager v0.28.0 // indirect + github.com/prometheus/client_golang v1.21.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common/sigv4 v0.1.0 // indirect - github.com/prometheus/exporter-toolkit v0.11.0 // indirect + github.com/prometheus/exporter-toolkit v0.13.2 // indirect github.com/prometheus/procfs v0.15.1 // indirect - github.com/prometheus/prometheus v0.54.1 // indirect + github.com/prometheus/prometheus v0.302.0 // indirect + github.com/prometheus/sigv4 v0.1.1 // indirect + github.com/redis/go-redis/v9 v9.7.0 // 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 + github.com/rs/cors v1.11.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect @@ -429,7 +442,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect - github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect + github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb // indirect @@ -443,12 +456,11 @@ require ( github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de // indirect github.com/smartcontractkit/wsrpc v0.8.3 // indirect - github.com/soheilhy/cmux v0.1.5 // indirect - github.com/sony/gobreaker v0.5.0 // indirect + github.com/sony/gobreaker/v2 v2.1.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/afero v1.12.0 // indirect github.com/spf13/cast v1.7.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/spf13/viper v1.19.0 // indirect github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 // indirect github.com/stretchr/objx v0.5.2 // indirect @@ -459,8 +471,9 @@ require ( github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tjhop/slog-gokit v0.1.3 // indirect + github.com/tklauser/go-sysconf v0.3.13 // indirect + github.com/tklauser/numcpus v0.7.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect @@ -479,74 +492,82 @@ require ( github.com/zondax/ledger-go v0.14.3 // indirect go.dedis.ch/fixbuf v1.0.3 // indirect go.dedis.ch/kyber/v3 v3.1.0 // indirect - go.etcd.io/bbolt v1.3.9 // indirect + go.etcd.io/bbolt v1.4.0 // indirect go.etcd.io/etcd/api/v3 v3.5.14 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.14 // indirect go.etcd.io/etcd/client/v3 v3.5.14 // indirect - go.mongodb.org/mongo-driver v1.15.0 // indirect - go.opentelemetry.io/collector/pdata v1.12.0 // indirect - go.opentelemetry.io/collector/semconv v0.105.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect - go.opentelemetry.io/otel v1.31.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 // indirect - go.opentelemetry.io/otel/log v0.6.0 // indirect - go.opentelemetry.io/otel/metric v1.31.0 // indirect - go.opentelemetry.io/otel/sdk v1.31.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.6.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.31.0 // indirect - go.opentelemetry.io/otel/trace v1.31.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.mongodb.org/mongo-driver v1.17.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v0.118.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.118.0 // indirect + go.opentelemetry.io/collector/consumer v1.24.0 // indirect + go.opentelemetry.io/collector/pdata v1.26.0 // indirect + go.opentelemetry.io/collector/pipeline v0.118.0 // indirect + go.opentelemetry.io/collector/processor v0.118.0 // indirect + go.opentelemetry.io/collector/semconv v0.118.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.59.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect + go.opentelemetry.io/otel v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 // indirect + go.opentelemetry.io/otel/log v0.10.0 // indirect + go.opentelemetry.io/otel/metric v1.34.0 // indirect + go.opentelemetry.io/otel/sdk v1.34.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.10.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect + go.opentelemetry.io/otel/trace v1.34.0 // indirect + go.opentelemetry.io/proto/otlp v1.5.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect go.uber.org/goleak v1.3.0 // indirect go.uber.org/ratelimit v0.3.1 // indirect go4.org/netipx v0.0.0-20230125063823-8449b0a6169f // indirect golang.org/x/arch v0.11.0 // indirect - golang.org/x/mod v0.22.0 // indirect - golang.org/x/net v0.34.0 // indirect - golang.org/x/oauth2 v0.23.0 // indirect - golang.org/x/sys v0.29.0 // indirect - golang.org/x/term v0.28.0 // indirect - golang.org/x/time v0.7.0 // indirect - golang.org/x/tools v0.29.0 // indirect + golang.org/x/mod v0.23.0 // indirect + golang.org/x/net v0.35.0 // indirect + golang.org/x/oauth2 v0.26.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/term v0.29.0 // indirect + golang.org/x/time v0.10.0 // indirect + golang.org/x/tools v0.30.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect gonum.org/v1/gonum v0.15.1 // indirect - google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect - google.golang.org/protobuf v1.36.4 // indirect + google.golang.org/api v0.221.0 // indirect + google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 // indirect + google.golang.org/protobuf v1.36.5 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // 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 - k8s.io/api v0.31.2 // indirect + k8s.io/api v0.32.2 // indirect k8s.io/apiextensions-apiserver v0.31.0 // indirect k8s.io/cli-runtime v0.31.2 // indirect - k8s.io/client-go v0.31.2 // indirect + k8s.io/client-go v0.32.2 // indirect k8s.io/component-base v0.31.2 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f // indirect + k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect k8s.io/kubectl v0.31.2 // indirect - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect + k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 // indirect pgregory.net/rapid v1.1.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/controller-runtime v0.19.0 // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect sigs.k8s.io/kustomize/api v0.17.2 // indirect sigs.k8s.io/kustomize/kyaml v0.17.1 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect sigs.k8s.io/yaml v1.4.0 // indirect ) diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 078fcd98f4c..ee04958d3e7 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -18,12 +18,18 @@ cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmW cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go/auth v0.14.1 h1:AwoJbzUdxA/whv1qj3TLKwh3XX5sikny2fc40wUl+h0= +cloud.google.com/go/auth v0.14.1/go.mod h1:4JHUxlGXisL0AW8kXPtUF6ztuOksyfUQNFjfsOCXkPM= +cloud.google.com/go/auth/oauth2adapt v0.2.7 h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M= +cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= +cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= @@ -59,11 +65,12 @@ github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9 github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/AlekSi/pointer v1.1.0 h1:SSDMPcXD9jSl8FPy9cRzoRaMJtm9g9ggGTxecRUbQoI= github.com/AlekSi/pointer v1.1.0/go.mod h1:y7BvfRI3wXPWKXEBhU71nbnIEEZX0QTSB2Bj48UJIZE= -github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 h1:GJHeeA2N7xrG3q30L2UXDyuWRzDM900/65j70wcM4Ww= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0/go.mod h1:XCW7KnZet0Opnr7HccfUw1PLc4CjHqpcaxW8DHklNkQ= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1 h1:1mvYtZfWQAnwNah/C+Z+Jb9rQH95LPE2vlmMuWAHJk8= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1/go.mod h1:75I/mXtme1JyWFtz8GocPHVFyH421IBoZErnO16dd0k= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.1 h1:Bk5uOhSAenHyR5P61D/NzeQCv+4fEVV8mOkJ82NqpWw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.1/go.mod h1:QZ4pw3or1WPmRBxf0cHd1tknzrT54WPBOQoGutCPvSU= github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 h1:LkHbJbgF3YyvC53aqYGR+wWQDn2Rdp9AQdGndf9QvY4= @@ -74,8 +81,10 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25 github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8= github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= +github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= +github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 h1:kYRSnvJju5gYVyhkij+RTJ/VR6QIUaCfWeaFm2ycsjQ= +github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM= @@ -96,11 +105,10 @@ github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6 github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= -github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= -github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= -github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs= +github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NethermindEth/juno v0.3.1 h1:AW72LiAm9gqUeCVJWvepnZcTnpU4Vkl0KzPMxS+42FA= @@ -116,8 +124,8 @@ github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjC github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/Workiva/go-datastructures v1.1.0 h1:hu20UpgZneBhQ3ZvwiOGlqJSKIosin2Rd5wAKUHEO/k= -github.com/Workiva/go-datastructures v1.1.0/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= +github.com/Workiva/go-datastructures v1.1.5 h1:5YfhQ4ry7bZc2Mc7R0YZyYwpf5c6t1cEFvdAhd6Mkf4= +github.com/Workiva/go-datastructures v1.1.5/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= github.com/XSAM/otelsql v0.29.0 h1:pEw9YXXs8ZrGRYfDc0cmArIz9lci5b42gmP5+tA1Huc= github.com/XSAM/otelsql v0.29.0/go.mod h1:d3/0xGIGC5RVEE+Ld7KotwaLy6zDeaF3fLJHOPpdN2w= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -125,15 +133,15 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg= -github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= +github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0= +github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= -github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk= -github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= +github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 h1:uvdUDbHQHO85qeSydJtItA4T55Pw6BtAejd0APRJOCE= +github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= github.com/alicebob/miniredis v2.5.0+incompatible h1:yBHoLpsyjupjz3NL3MhKMVkR41j82Yjf3KFv7ApYzUI= -github.com/alicebob/miniredis/v2 v2.30.4 h1:8S4/o1/KoUArAGbGwPxcwf0krlzceva2XVOSchFS7Eo= -github.com/alicebob/miniredis/v2 v2.30.4/go.mod h1:b25qWj4fCEsBeAAR2mlb0ufImGC6uH3VlUfb/HS5zKg= +github.com/alicebob/miniredis/v2 v2.34.0 h1:mBFWMaJSNL9RwdGRyEDoAAv8OQc5UlEhLDQggTglU/0= +github.com/alicebob/miniredis/v2 v2.34.0/go.mod h1:kWShP4b58T1CW0Y5dViCd5ztzrDqRWqM3nksiyXk5s8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= @@ -167,41 +175,40 @@ github.com/avast/retry-go/v4 v4.6.0 h1:K9xNA+KeB8HHc2aWFuLb25Offp+0iVRXEvFx8IinR github.com/avast/retry-go/v4 v4.6.0/go.mod h1:gvWlPhBVsvBbLkVGDg/KwvBv0bEkCOLRRSHKIr2PyOE= github.com/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= github.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= -github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.54.19 h1:tyWV+07jagrNiCcGRzRhdtVjQs7Vy41NwsuOcl0IbVI= -github.com/aws/aws-sdk-go v1.54.19/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= -github.com/aws/aws-sdk-go-v2 v1.32.2 h1:AkNLZEyYMLnx/Q/mSKkcMqwNFXMAvFto9bNsHqcTduI= -github.com/aws/aws-sdk-go-v2 v1.32.2/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= -github.com/aws/aws-sdk-go-v2/config v1.28.0 h1:FosVYWcqEtWNxHn8gB/Vs6jOlNwSoyOCA/g/sxyySOQ= -github.com/aws/aws-sdk-go-v2/config v1.28.0/go.mod h1:pYhbtvg1siOOg8h5an77rXle9tVG8T+BWLWAo7cOukc= -github.com/aws/aws-sdk-go-v2/credentials v1.17.41 h1:7gXo+Axmp+R4Z+AK8YFQO0ZV3L0gizGINCOWxSLY9W8= -github.com/aws/aws-sdk-go-v2/credentials v1.17.41/go.mod h1:u4Eb8d3394YLubphT4jLEwN1rLNq2wFOlT6OuxFwPzU= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.17 h1:TMH3f/SCAWdNtXXVPPu5D6wrr4G5hI1rAxbcocKfC7Q= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.17/go.mod h1:1ZRXLdTpzdJb9fwTMXiLipENRxkGMTn1sfKexGllQCw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21 h1:UAsR3xA31QGf79WzpG/ixT9FZvQlh5HY1NRqSHBNOCk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21/go.mod h1:JNr43NFf5L9YaG3eKTm7HQzls9J+A9YYcGI5Quh1r2Y= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21 h1:6jZVETqmYCadGFvrYEQfC5fAQmlo80CeL5psbno6r0s= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21/go.mod h1:1SR0GbLlnN3QUmYaflZNiH1ql+1qrSiB2vwcJ+4UM60= +github.com/aws/aws-sdk-go v1.55.6 h1:cSg4pvZ3m8dgYcgqB97MrcdjUmZ1BeMYKUxMMB89IPk= +github.com/aws/aws-sdk-go v1.55.6/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v1.32.7 h1:ky5o35oENWi0JYWUZkB7WYvVPP+bcRF5/Iq7JWSb5Rw= +github.com/aws/aws-sdk-go-v2 v1.32.7/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= +github.com/aws/aws-sdk-go-v2/config v1.28.6 h1:D89IKtGrs/I3QXOLNTH93NJYtDhm8SYa9Q5CsPShmyo= +github.com/aws/aws-sdk-go-v2/config v1.28.6/go.mod h1:GDzxJ5wyyFSCoLkS+UhGB0dArhb9mI+Co4dHtoTxbko= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47 h1:48bA+3/fCdi2yAwVt+3COvmatZ6jUDNkDTIsqDiMUdw= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47/go.mod h1:+KdckOejLW3Ks3b0E3b5rHsr2f9yuORBum0WPnE5o5w= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 h1:AmoU1pziydclFT/xRV+xXE/Vb8fttJCLRPv8oAkprc0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21/go.mod h1:AjUdLYe4Tgs6kpH4Bv7uMZo7pottoyHMn4eTcIcneaY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 h1:I/5wmGMffY4happ8NOCuIUEWGUvvFp5NSeQcXl9RHcI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26/go.mod h1:FR8f4turZtNy6baO0KJ5FJUmXH/cSkI9fOngs0yl6mA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26 h1:zXFLuEuMMUOvEARXFUVJdfqZ4bvvSgdGRq/ATcrQxzM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26/go.mod h1:3o2Wpy0bogG1kyOPrgkXA8pgIfEEv0+m19O9D5+W8y8= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 h1:TToQNkvGguu209puTojY/ozlqy2d/SFNcoLIqTFi42g= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0/go.mod h1:0jp+ltwkf+SwG2fm/PKo8t4y8pJSgOCO4D8Lz3k0aHQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.2 h1:s7NA1SOw8q/5c0wr8477yOPp0z+uBaXBnLE0XYb0POA= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.2/go.mod h1:fnjjWyAW/Pj5HYOxl9LJqWtEwS7W2qgcRLWP+uWbss0= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7 h1:8eUsivBQzZHqe/3FE+cqwfH+0p5Jo8PFM/QYQSmeZ+M= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7/go.mod h1:kLPQvGUmxn/fqiCrDeohwG33bq2pQpGeY62yRO6Nrh0= github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.2 h1:Rrqru2wYkKQCS2IM5/JrgKUQIoNTqA6y/iuxkjzxC6M= github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.2/go.mod h1:QuCURO98Sqee2AXmqDNxKXYFm2OEDAVAPApMqO0Vqnc= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.2 h1:bSYXVyUzoTHoKalBmwaZxs97HU9DWWI3ehHSAMa7xOk= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.2/go.mod h1:skMqY7JElusiOUjMJMOv1jJsP7YUg7DrhgqZZWuzu1U= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.2 h1:AhmO1fHINP9vFYUE0LHzCWg/LfUWUF+zFPEcY9QXb7o= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.2/go.mod h1:o8aQygT2+MVP0NaV6kbdE1YnnIM8RRVQzoeUH45GOdI= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.2 h1:CiS7i0+FUe+/YY1GvIBLLrR/XNGZ4CtM1Ll0XavNuVo= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.2/go.mod h1:HtaiBI8CjYoNVde8arShXb94UbQQi9L4EMr6D+xGBwo= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 h1:rLnYAfXQ3YAccocshIH5mzNNwZBkBo+bP6EhIxak6Hw= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7/go.mod h1:ZHtuQJ6t9A/+YDuxOLnbryAmITtr8UysSny3qcyvJTc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 h1:JnhTZR3PiYDNKlXy50/pNeix9aGMo6lLpXwJ1mw8MD4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6/go.mod h1:URronUEGfXZN1VpdktPSD1EkAL9mfrV+2F4sjH38qOY= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 h1:s4074ZO1Hk8qv65GqNXqDjmkf4HSQqJukaLuuW0TpDA= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2/go.mod h1:mVggCnIWoM09jP71Wh+ea7+5gAp53q+49wDFs1SW5z8= github.com/aws/constructs-go/constructs/v10 v10.4.2 h1:+hDLTsFGLJmKIn0Dg20vWpKBrVnFrEWYgTEY5UiTEG8= github.com/aws/constructs-go/constructs/v10 v10.4.2/go.mod h1:cXsNCKDV+9eR9zYYfwy6QuE4uPFp6jsq6TtH1MwBx9w= github.com/aws/jsii-runtime-go v1.104.0 h1:651Sh6J2FtatfnVzlOQ3/Ye1WWPAseZ6E/tSQxEKdSI= 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/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= +github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 h1:WWB576BN5zNSZc/M9d/10pqEx5VHNhaQ/yOVAkmj5Yo= github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= @@ -231,6 +238,10 @@ github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHf github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= github.com/block-vision/sui-go-sdk v1.0.6 h1:FysCc4TJC8v4BEBbCjJPDR4iR5eKqJT1dxGwsT67etg= github.com/block-vision/sui-go-sdk v1.0.6/go.mod h1:FyK1vGE8lWm9QA1fdQpf1agfXQSMbPT8AV1BICgx6d8= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= @@ -253,10 +264,8 @@ github.com/bytedance/sonic v1.12.3/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKz 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= -github.com/c9s/goprocinfo v0.0.0-20210130143923-c95fcf8c64a8/go.mod h1:uEyr4WpAH4hio6LFriaPkL938XnrvLpNPmQHBdrmbIE= +github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500 h1:6lhrsTEnloDPXyeZBvSYvQf8u86jbKehZPVDDlkgDl4= +github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5 h1:rvc39Ol6z3MvaBzXkxFC6Nfsnixq/dRypushKDd7Nc0= github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5/go.mod h1:R/pdNYDYFQk+tuuOo7QES1kkv6OLmp5ze2XBZQIVffM= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= @@ -301,8 +310,8 @@ github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20 h1:N+3sFI5GUjRKBi+i0TxYVST9h4Ie192jJWpHvthBBgg= -github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20241223141626-cff3c89139a3 h1:boJj011Hh+874zpIySeApCX4GeOjPl9qhRF3QuIZq+Q= +github.com/cncf/xds/go v0.0.0-20241223141626-cff3c89139a3/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= @@ -415,12 +424,12 @@ github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WA github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/digitalocean/godo v1.118.0 h1:lkzGFQmACrVCp7UqH1sAi4JK/PWwlc5aaxubgorKmC4= -github.com/digitalocean/godo v1.118.0/go.mod h1:Vk0vpCot2HOAJwc5WE8wljZGtJ3ZtWIc8MQ8rF38sdo= +github.com/digitalocean/godo v1.132.0 h1:n0x6+ZkwbyQBtIU1wwBhv26EINqHg0wWQiBXlwYg/HQ= +github.com/digitalocean/godo v1.132.0/go.mod h1:PU8JB6I1XYkQIdHFop8lLAY9ojp6M0XcU0TWaQSxbrc= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= -github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.5.1+incompatible h1:4PYU5dnBYqRQi0294d1FBECqT9ECWeQAIfE8q4YnPY8= +github.com/docker/docker v27.5.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -434,8 +443,8 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= -github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= -github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= +github.com/edsrzf/mmap-go v1.2.0 h1:hXLYlkbaPzt1SaQk+anYwKSRNhufIDCchSPkUD6dD84= +github.com/edsrzf/mmap-go v1.2.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -444,11 +453,11 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.13.0 h1:HzkeUz1Knt+3bK+8LG1bxOO/jzWZmdxpwC51i202les= -github.com/envoyproxy/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8= +github.com/envoyproxy/go-control-plane/envoy v1.32.3 h1:hVEaommgvzTjTd4xCaFd+kEQ2iYBtGxP6luyLrx6uOk= +github.com/envoyproxy/go-control-plane/envoy v1.32.3/go.mod h1:F6hWupPfh75TBXGKA++MCT/CZHFq5r9/uwt/kQYkZfE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= -github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= +github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= +github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/esote/minmaxheap v1.0.0 h1:rgA7StnXXpZG6qlM0S7pUmEv1KpWe32rYT4x8J8ntaA= github.com/esote/minmaxheap v1.0.0/go.mod h1:Ln8+i7fS1k3PLgZI2JAo0iA1as95QnIYiGCrqSJ5FZk= github.com/ethereum/c-kzg-4844 v1.0.3 h1:IEnbOHwjixW2cTvKRUlAAUOeleV7nNM/umJR+qy4WDs= @@ -470,8 +479,8 @@ github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwo github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -481,8 +490,8 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= 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.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= @@ -522,8 +531,8 @@ github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3Bop github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 h1:ymLjT4f35nQbASLnvxEde4XOBL+Sn7rFuV+FOJqkljg= -github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0/go.mod h1:6daplAwHHGbUGib4990V3Il26O0OC4aRyvewaaAihaA= +github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa h1:Rpu6sKAzIeSWBkrFHD52g8yipagcPbY2Lmm70NL1Gzc= +github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa/go.mod h1:TiCD2a1pcmjd7YnhGH0f/zKNcCD06B029pHhzV23c2M= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= @@ -548,36 +557,42 @@ github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-openapi/analysis v0.22.2 h1:ZBmNoP2h5omLKr/srIC9bfqrUGzT6g6gNv03HE9Vpj0= -github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo= +github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU= +github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo= github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w= github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= -github.com/go-openapi/loads v0.21.5 h1:jDzF4dSoHw6ZFADCGltDb2lE4F6De7aWSpe+IcsRzT0= -github.com/go-openapi/loads v0.21.5/go.mod h1:PxTsnFBoBe+z89riT+wYt3prmSBP6GDAQh2l9H1Flz8= -github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= -github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= +github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco= +github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= -github.com/go-openapi/validate v0.23.0 h1:2l7PJLzCis4YUGEoW6eoQw3WhyM65WSIcjX6SQnlfDw= -github.com/go-openapi/validate v0.23.0/go.mod h1:EeiAZ5bmpSIOJV1WLfyYF9qp/B1ZgSaEpHTJHtN5cbE= +github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58= +github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= 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.24.0 h1:KHQckvo8G6hlWnrPX4NJJ+aBfWNAE/HH+qdL2cBpCmg= -github.com/go-playground/validator/v10 v10.24.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= +github.com/go-playground/validator/v10 v10.25.0 h1:5Dh7cjvzR7BRZadnsVOzPhWsrwUr0nmsZJxEAnFLNO8= +github.com/go-playground/validator/v10 v10.25.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= +github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis/v7 v7.4.1 h1:PASvf36gyUpr2zdOUS/9Zqc80GbM+9BDyiJSJDDOrTI= +github.com/go-redis/redis/v7 v7.4.1/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= 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= -github.com/go-resty/resty/v2 v2.15.3/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU= +github.com/go-redsync/redsync/v4 v4.13.0 h1:49X6GJfnbLGaIpBBREM/zA4uIMDXKAh1NDkvQ1EkZKA= +github.com/go-redsync/redsync/v4 v4.13.0/go.mod h1:HMW4Q224GZQz6x1Xc7040Yfgacukdzu7ifTDAKiyErQ= +github.com/go-resty/resty/v2 v2.16.3 h1:zacNT7lt4b8M/io2Ahj6yPypL7bqx9n1iprfQuodV+E= +github.com/go-resty/resty/v2 v2.16.3/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -587,16 +602,16 @@ github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1v github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-test/deep v1.0.4 h1:u2CU3YKy9I2pmu9pX0eq50wCgjfGIt539SqR7FbHiho= github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpGyP1XxdC/w= -github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-webauthn/webauthn v0.9.4 h1:YxvHSqgUyc5AK2pZbqkWWR55qKeDPhP8zLDr6lpIc2g= github.com/go-webauthn/webauthn v0.9.4/go.mod h1:LqupCtzSef38FcxzaklmOn7AykGKhAhr9xlRbdbgnTw= 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.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= -github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/go-zookeeper/zk v1.0.4 h1:DPzxraQx7OrPyXq2phlGlNSIyWEsAox0RJmjTseMV6I= +github.com/go-zookeeper/zk v1.0.4/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/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= @@ -617,13 +632,11 @@ github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= -github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.3 h1:oDTdz9f5VGVVNGu/Q7UXKWYsD0873HXLHdJUNBsSEKM= +github.com/golang/glog v1.2.3/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -658,10 +671,12 @@ github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0= +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU= @@ -710,26 +725,31 @@ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= +github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gophercloud/gophercloud v1.13.0 h1:8iY9d1DAbzMW6Vok1AxbbK5ZaUjzMp0tdyt4fX9IeJ0= -github.com/gophercloud/gophercloud v1.13.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= +github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= +github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= +github.com/gophercloud/gophercloud/v2 v2.4.0 h1:XhP5tVEH3ni66NSNK1+0iSO6kaGPH/6srtx6Cr+8eCg= +github.com/gophercloud/gophercloud/v2 v2.4.0/go.mod h1:uJWNpTgJPSl2gyzJqcU/pIAhFUWvIkp8eE8M15n9rs4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY= @@ -737,16 +757,18 @@ github.com/gorilla/sessions v1.2.2/go.mod h1:ePLdVu+jbEgHH+KWw8I1z2wqd0BAdAQh/8L github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grafana/dskit v0.0.0-20231120170505-765e343eda4f h1:gyojr97YeWZ70pKNakWv5/tKwBHuLy3icnIeCo9gQr4= -github.com/grafana/dskit v0.0.0-20231120170505-765e343eda4f/go.mod h1:8dsy5tQOkeNQyjXpm5mQsbCu3H5uzeBD35MzRQFznKU= -github.com/grafana/gomemcache v0.0.0-20231023152154-6947259a0586 h1:/of8Z8taCPftShATouOrBVy6GaTTjgQd/VfNiZp/VXQ= -github.com/grafana/gomemcache v0.0.0-20231023152154-6947259a0586/go.mod h1:PGk3RjYHpxMM8HFPhKKo+vve3DdlPUELZLSDEFehPuU= +github.com/grafana/dskit v0.0.0-20241007172036-53283a0f6b41 h1:a4O59OU3FJZ+EJUVnlvvNTvdAc4uRN1P6EaGwqL9CnA= +github.com/grafana/dskit v0.0.0-20241007172036-53283a0f6b41/go.mod h1:SPLNCARd4xdjCkue0O6hvuoveuS1dGJjDnfxYe405YQ= +github.com/grafana/gomemcache v0.0.0-20240229205252-cd6a66d6fb56 h1:X8IKQ0wu40wpvYcKfBcc5T4QnhdQjUhtUtB/1CY89lE= +github.com/grafana/gomemcache v0.0.0-20240229205252-cd6a66d6fb56/go.mod h1:PGk3RjYHpxMM8HFPhKKo+vve3DdlPUELZLSDEFehPuU= github.com/grafana/grafana-foundation-sdk/go v0.0.0-20240326122733-6f96a993222b h1:Msqs1nc2qWMxTriDCITKl58Td+7Md/RURmUmH7RXKns= github.com/grafana/grafana-foundation-sdk/go v0.0.0-20240326122733-6f96a993222b/go.mod h1:WtWosval1KCZP9BGa42b8aVoJmVXSg0EvQXi9LDSVZQ= -github.com/grafana/loki v1.6.2-0.20231215164305-b51b7d7b5503 h1:gdrsYbmk8822v6qvPwZO5DC6QjnAW7uKJ9YXnoUmV8c= -github.com/grafana/loki v1.6.2-0.20231215164305-b51b7d7b5503/go.mod h1:d8seWXCEXkL42mhuIJYcGi6DxfehzoIpLrMQWJojvOo= -github.com/grafana/loki/pkg/push v0.0.0-20231201111602-11ef833ed3e4 h1:wQ0FnSeebhJIBkgYOD06Mxk9HV2KhtEG0hp/7R+5RUQ= -github.com/grafana/loki/pkg/push v0.0.0-20231201111602-11ef833ed3e4/go.mod h1:f3JSoxBTPXX5ec4FxxeC19nTBSxoTz+cBgS3cYLMcr0= +github.com/grafana/jsonparser v0.0.0-20241004153430-023329977675 h1:U94jQ2TQr1m3HNyE8efSdyaBbDrdPaWImXyenuKZ/nw= +github.com/grafana/jsonparser v0.0.0-20241004153430-023329977675/go.mod h1:796sq+UcONnSlzA3RtlBZ+b/hrerkZXiEmO8oMjyRwY= +github.com/grafana/loki/pkg/push v0.0.0-20240924133635-758364c7775f h1:NcS5dQXH/BtoMpQtA1d0+ftwyzdwQk5/8SCj9eHl8w8= +github.com/grafana/loki/pkg/push v0.0.0-20240924133635-758364c7775f/go.mod h1:lJEF/Wh5MYlmBem6tOYAFObkLsuikfrEf8Iy9AdMPiQ= +github.com/grafana/loki/v3 v3.0.0-20250221202516-b37eefe24f82 h1:W0/mTT89fhcJmxneL/F6IE4rvCKEvdSxBj+o2hvBeNA= +github.com/grafana/loki/v3 v3.0.0-20250221202516-b37eefe24f82/go.mod h1:XbstssWTrGm9zVBlV/f7p+pYf0WOj6ay7+vsNx7pQHk= github.com/grafana/pyroscope-go v1.1.2 h1:7vCfdORYQMCxIzI3NlYAs3FcBP760+gWuYWOyiVyYx8= github.com/grafana/pyroscope-go v1.1.2/go.mod h1:HSSmHo2KRn6FasBA4vK7BMiQqyQq8KSuBKvrhkXxYPU= github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= @@ -763,13 +785,12 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaW github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0 h1:FbSCl+KggFl+Ocym490i/EyXF4lPgLoUtcSWquBM0Rs= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0/go.mod h1:qOchhhIlmRcqk/O9uCo/puJlyo07YINaIqdZfZG3Jkc= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= -github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= @@ -780,10 +801,8 @@ github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIv github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 h1:BpJ2o0OR5FV7vrkDYfXYVJQeMNWa8RhklZOpW2ITAIQ= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.29.2 h1:aYyRn8EdE2mSfG14S1+L9Qkjtz8RzmaWh6AcNGRNwPw= -github.com/hashicorp/consul/api v1.29.2/go.mod h1:0YObcaLNDSbtlgzIRtmRXI1ZkeuK0trCBxwZQ4MYnIk= -github.com/hashicorp/consul/proto-public v0.6.2 h1:+DA/3g/IiKlJZb88NBn0ZgXrxJp2NlvCZdEyl+qxvL0= -github.com/hashicorp/consul/proto-public v0.6.2/go.mod h1:cXXbOg74KBNGajC+o8RlA502Esf0R9prcoJgiOX/2Tg= +github.com/hashicorp/consul/api v1.31.2 h1:NicObVJHcCmyOIl7Z9iHPvvFrocgTYo9cITSGg0/7pw= +github.com/hashicorp/consul/api v1.31.2/go.mod h1:Z8YgY0eVPukT/17ejW+l+C7zJmKwgPHtjU1q16v/Y40= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.16.1 h1:V8TxTnImoPD5cj0U9Spl0TUxcytjcbbJeADFF07KdHg= github.com/hashicorp/consul/sdk v0.16.1/go.mod h1:fSXvwxB2hmh1FMZCNl6PwX0Q/1wdWtHJcZ7Ea5tns0s= @@ -807,15 +826,19 @@ github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8IoK3c= github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= +github.com/hashicorp/go-metrics v0.5.4 h1:8mmPiIJkTPPEbAiV97IxdAGNdRdaWwVap1BU6elejKY= +github.com/hashicorp/go-metrics v0.5.4/go.mod h1:CG5yz4NZ/AI/aQt9Ucm/vdBnbh7fvmv4lxZ350i+QQI= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack/v2 v2.1.1 h1:xQEY9yB2wnHitoSzk/B9UjXWRQ67QKu5AOm8aFp8N3I= +github.com/hashicorp/go-msgpack/v2 v2.1.1/go.mod h1:upybraOAblm4S7rx0+jeNy+CWWhzywQsSRV5033mMu4= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-plugin v1.6.2 h1:zdGAEd0V1lCaU0u+MxWQhtSDQmahpkwOun8U8EiRVog= -github.com/hashicorp/go-plugin v1.6.2/go.mod h1:CkgLQ5CZqNmdL9U9JzM532t8ZiYQ35+pj3b1FD37R0Q= +github.com/hashicorp/go-plugin v1.6.3 h1:xgHB+ZUSYeuJi96WtxEjzi23uh7YQpznjGh0U0UUrwg= +github.com/hashicorp/go-plugin v1.6.3/go.mod h1:MRobyh+Wc/nYy1V4KAXUiYfzxoYhs7V1mlH1Z7iY2h0= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= @@ -823,8 +846,8 @@ github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.6 h1:RSG8rKU28VTUTvEKghe5gIhIQpv8evvNpnDEyqO4u9I= -github.com/hashicorp/go-sockaddr v1.0.6/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3lyjsj6+CCykpaxI= +github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw= +github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -835,8 +858,8 @@ github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09 github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= -github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -845,23 +868,24 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3 h1:fgVfQ4AC1avVOnu2cfms8VAiD8lUq3vWI8mTocOXN/w= -github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= +github.com/hashicorp/memberlist v0.5.2 h1:rJoNPWZ0juJBgqn48gjy59K5H4rNgvUoM1kUD7bXiuI= +github.com/hashicorp/memberlist v0.5.2/go.mod h1:Ri9p/tRShbjYnpNf4FFPXG7wxEGY4Nrcn6E7jrVa//4= +github.com/hashicorp/nomad/api v0.0.0-20241218080744-e3ac00f30eec h1:+YBzb977VrmffaCX/OBm17dEVJUcWn5dW+eqs3aIJ/A= +github.com/hashicorp/nomad/api v0.0.0-20241218080744-e3ac00f30eec/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= +github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= github.com/hasura/go-graphql-client v0.13.1 h1:kKbjhxhpwz58usVl+Xvgah/TDha5K2akNTRQdsEHN6U= github.com/hasura/go-graphql-client v0.13.1/go.mod h1:k7FF7h53C+hSNFRG3++DdVZWIuHdCaTbI7siTJ//zGQ= github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/henvic/httpretty v0.0.6 h1:JdzGzKZBajBfnvlMALXXMVQWxWMF/ofTy8C3/OSUTxs= github.com/henvic/httpretty v0.0.6/go.mod h1:X38wLjWXHkXT7r2+uK8LjCMne9rsuNaBLJ+5cU2/Pmo= -github.com/hetznercloud/hcloud-go/v2 v2.10.2 h1:9gyTUPhfNbfbS40Spgij5mV5k37bOZgt8iHKCbfGs5I= -github.com/hetznercloud/hcloud-go/v2 v2.10.2/go.mod h1:xQ+8KhIS62W0D78Dpi57jsufWh844gUw1az5OUvaeq8= +github.com/hetznercloud/hcloud-go/v2 v2.18.0 h1:BemrVGeWI8Kn/pvaC1jBsHZxQMnRqOydS7Ju4BERB4Q= +github.com/hetznercloud/hcloud-go/v2 v2.18.0/go.mod h1:r5RTzv+qi8IbLcDIskTzxkFIji7Ovc8yNgepQR9M+UA= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= @@ -871,25 +895,23 @@ github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXei github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= -github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= -github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= +github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= -github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= -github.com/ionos-cloud/sdk-go/v6 v6.1.11 h1:J/uRN4UWO3wCyGOeDdMKv8LWRzKu6UIkLEaes38Kzh8= -github.com/ionos-cloud/sdk-go/v6 v6.1.11/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= +github.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E= +github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= +github.com/ionos-cloud/sdk-go/v6 v6.3.2 h1:2mUmrZZz6cPyT9IRX0T8fBLc/7XU/eTxP2Y5tS7/09k= +github.com/ionos-cloud/sdk-go/v6 v6.3.2/go.mod h1:SXrO9OGyWjd2rZhAhEpdYN6VUAODzzqRdqA9BCviQtI= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -976,17 +998,25 @@ github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52 h1:msKODTL1m0wigzta github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52/go.mod h1:qk1sX/IBgppQNcGCRoj90u6EGC056EBoIc1oEjCWla8= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs= +github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -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/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= 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= @@ -1022,8 +1052,8 @@ github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhn github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/linkedin/goavro/v2 v2.12.0 h1:rIQQSj8jdAUlKQh6DttK8wCRv4t4QO09g1C4aBWXslg= github.com/linkedin/goavro/v2 v2.12.0/go.mod h1:KXx+erlq+RPlGSPmLF7xGo6SAbh8sCQ53x064+ioxhk= -github.com/linode/linodego v1.37.0 h1:B/2Spzv9jYXzKA+p+GD8fVCNJ7Wuw6P91ZDD9eCkkso= -github.com/linode/linodego v1.37.0/go.mod h1:L7GXKFD3PoN2xSEtFc04wIXP5WK65O10jYQx0PQISWQ= +github.com/linode/linodego v1.46.0 h1:+uOG4SD2MIrhbrLrvOD5HrbdLN3D19Wgn3MgdUNQjeU= +github.com/linode/linodego v1.46.0/go.mod h1:vyklQRzZUWhFVBZdYx4dcYJU/gG9yKB9VUcUs6ub0Lk= github.com/linxGnu/grocksdb v1.7.16 h1:Q2co1xrpdkr5Hx3Fp+f+f7fRGhQFQhvi/+226dtLmA8= github.com/linxGnu/grocksdb v1.7.16/go.mod h1:JkS7pl5qWpGpuVb3bPqTz8nC12X3YtPZT+Xq7+QfQo4= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= @@ -1032,14 +1062,15 @@ github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczG github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a h1:3Bm7EwfUQUvhNeKIkUct/gl9eod1TcXuj8stxvi/GoI= +github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f h1:tVvGiZQFjOXP+9YyGqSA6jE55x1XVxmoPYudncxrZ8U= @@ -1052,8 +1083,9 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -1072,14 +1104,18 @@ github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxU 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= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos= +github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ= +github.com/mdlayher/vsock v1.2.1 h1:pC1mTJTvjo1r9n9fbm7S1j04rCgCzhCOS5DY0zqHlnQ= +github.com/mdlayher/vsock v1.2.1/go.mod h1:NRfCibel++DgeMD8z/hP+PPTjlNJsdPOmxcnENvE+SE= github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= -github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= +github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY= +github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= @@ -1089,7 +1125,6 @@ github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8D github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -1105,11 +1140,10 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY= +github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= @@ -1119,8 +1153,8 @@ github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3N github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= -github.com/moby/spdystream v0.4.0 h1:Vy79D6mHeJJjiPdFEL2yku1kl0chZpJfZcPpb16BRl8= -github.com/moby/spdystream v0.4.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= +github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU= +github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= github.com/moby/sys/user v0.3.0 h1:9ni5DlcW5an3SvRSx4MouotOygvzaXbaSrc/wGDFWPo= @@ -1187,19 +1221,27 @@ github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAl github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.116.0 h1:Kxk5Ral+Dc6VB9UmTketVjs+rbMZP8JxQ4SXDx4RivQ= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.116.0/go.mod h1:ctT6oQmGmWGGGgUIKyx2fDwqz77N9+04gqKkDyAzKCg= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 h1:RlEK9MbxWyBHbLel8EJ1L7DbYVLai9dZL6Ljl2cBgyA= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0/go.mod h1:AVUEyIjPb+0ARr7mhIkZkdNg3fd0ZcRhzAi53oZhl1Q= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 h1:jwnZYRBuPJnsKXE5H6ZvTEm91bXW5VP8+tLewzl54eg= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0/go.mod h1:NT3Ag+DdnIAZQfD7l7OHwlYqnaAJ19SoPZ0nhD9yx4s= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor v0.116.0 h1:ZBmLuipJv7BT9fho/2yAFsS8AtMsCOCe4ON8oqkX3n8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor v0.116.0/go.mod h1:f0GdYWGxUunyRZ088gHnoX78pc/gZc3dQlRtidiGXzg= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/runc v1.1.10 h1:EaL5WeO9lv9wmS6SASjszOeQdSctvpbu0DdBQBizE40= github.com/opencontainers/runc v1.1.10/go.mod h1:+/R6+KmDlh+hOO8NkjmgkG9Qzvypzk0yXxAPYYR65+M= -github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e h1:4cPxUYdgaGzZIT5/j0IfqOrrXmq6bG8AwvwisMXpdrg= -github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= -github.com/opentracing-contrib/go-stdlib v1.0.0 h1:TBS7YuVotp8myLon4Pv7BtCBzOTo1DeZCld0Z63mW2w= -github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing-contrib/go-grpc v0.1.1 h1:Ws7IN1zyiL1DFqKQPhRXuKe5pLYzMfdxnC1qtajE2PE= +github.com/opentracing-contrib/go-grpc v0.1.1/go.mod h1:Nu6sz+4zzgxXu8rvKfnwjBEmHsuhTigxRwV2RhELrS8= +github.com/opentracing-contrib/go-stdlib v1.1.0 h1:cZBWc4pA4e65tqTJddbflK435S0tDImj6c9BMvkdUH0= +github.com/opentracing-contrib/go-stdlib v1.1.0/go.mod h1:S0p+X9p6dcBkoMTL+Qq2VOvxKs9ys5PpYWXWqlCS0bQ= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= @@ -1213,8 +1255,6 @@ github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0Mw github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= @@ -1225,8 +1265,8 @@ github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+v github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= -github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= @@ -1239,6 +1279,8 @@ github.com/pion/transport/v2 v2.2.1 h1:7qYnCBlpgSJNYMbLCKuSY9KbQdBFoETvPNETv0y4N github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= github.com/pion/transport/v3 v3.0.1 h1:gDTlPJwROfSfz6QfSi0ZmeCSkFcnWWiiR9ES0ouANiM= github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= +github.com/pires/go-proxyproto v0.7.0 h1:IukmRewDQFWC7kfnb66CSomk2q/seBuilHBYFwyq0Hs= +github.com/pires/go-proxyproto v0.7.0/go.mod h1:Vz/1JPY/OACxWGQNIRY2BeyDmpoaWmEP40O9LbuiFR4= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -1255,19 +1297,20 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pressly/goose/v3 v3.21.1 h1:5SSAKKWej8LVVzNLuT6KIvP1eFDuPvxa+B6H0w78buQ= github.com/pressly/goose/v3 v3.21.1/go.mod h1:sqthmzV8PitchEkjecFJII//l43dLOCzfWh8pHEe+vE= -github.com/prometheus/alertmanager v0.27.0 h1:V6nTa2J5V4s8TG4C4HtrBP/WNSebCCTYGGv4qecA/+I= -github.com/prometheus/alertmanager v0.27.0/go.mod h1:8Ia/R3urPmbzJ8OsdvmZvIprDwvwmYCmUbwBL+jlPOE= +github.com/prometheus/alertmanager v0.28.0 h1:sLN+6HhZet8hrbmGHLAHWsTXgZSVCvq9Ix3U3wvivqc= +github.com/prometheus/alertmanager v0.28.0/go.mod h1:/okSnb2LlodbMlRoOWQEKtqI/coOo2NKZDm2Hu9QHLQ= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1278,13 +1321,10 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= -github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= -github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= -github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= -github.com/prometheus/exporter-toolkit v0.11.0 h1:yNTsuZ0aNCNFQ3aFTD2uhPOvr4iD7fdBvKPAEGkNf+g= -github.com/prometheus/exporter-toolkit v0.11.0/go.mod h1:BVnENhnNecpwoTLiABx7mrPB/OLRIgN74qlQbV+FK1Q= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/exporter-toolkit v0.13.2 h1:Z02fYtbqTMy2i/f+xZ+UK5jy/bl1Ex3ndzh06T/Q9DQ= +github.com/prometheus/exporter-toolkit v0.13.2/go.mod h1:tCqnfx21q6qN1KA4U3Bfb8uWzXfijIrJz3/kTIqMV7g= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= @@ -1292,10 +1332,16 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ= -github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY= +github.com/prometheus/prometheus v0.302.0 h1:47EsaoBRroS2ekSyMSOPIjXwYnY/mxoFk0xt2dkFvfI= +github.com/prometheus/prometheus v0.302.0/go.mod h1:YcyCoTbUR/TM8rY3Aoeqr0AWTu/pu1Ehh+trpX3eRzg= +github.com/prometheus/sigv4 v0.1.1 h1:UJxjOqVcXctZlwDjpUpZ2OiMWJdFijgSofwLzO1Xk0Q= +github.com/prometheus/sigv4 v0.1.1/go.mod h1:RAmWVKqx0bwi0Qm4lrKMXFM0nhpesBcenfCtz9qRyH8= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= +github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= +github.com/redis/rueidis v1.0.19 h1:s65oWtotzlIFN8eMPhyYwxlwLR1lUdhza2KtWprKYSo= +github.com/redis/rueidis v1.0.19/go.mod h1:8B+r5wdnjwK3lTFml5VtxjzGOQAC+5UmujoD12pDrEo= 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/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= @@ -1312,8 +1358,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= @@ -1338,8 +1384,8 @@ github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPO github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29 h1:BkTk4gynLjguayxrYxZoMZjBnAOh7ntQvUkOFmkMqPU= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30 h1:yoKAVkEVwAqbGbR8n87rHQ1dulL25rKloGadb3vm770= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30/go.mod h1:sH0u6fq6x4R5M7WxkoQFY/o7UaiItec0o1LinLCJNq8= github.com/scylladb/go-reflectx v1.0.1 h1:b917wZM7189pZdlND9PbIJ6NQxfDPfBvUaQ7cjj1iZQ= github.com/scylladb/go-reflectx v1.0.1/go.mod h1:rWnOfDIRWBGN0miMLIcoPt/Dhi2doCMZqwMCJ3KupFc= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= @@ -1390,8 +1436,8 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0/go.mod h1:YQuXIqQpmpAqstWV0LHaDTJ5nsSWuip5ivEM+Fisb+4= -github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= -github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= +github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e h1:QBG+Wn5rHAi4gjnBAq6x6CZj/GjWAahFjj81VhQEu6U= +github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e/go.mod h1:2yUpKW1/jFxpozO/Zkh3fKDzI0jthXoEcU2xuDq+vlo= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= @@ -1422,8 +1468,8 @@ github.com/smartcontractkit/chainlink-testing-framework/sentinel v0.1.2 h1:ihRlW github.com/smartcontractkit/chainlink-testing-framework/sentinel v0.1.2/go.mod h1:J1Za5EuI/vWDsQSIh6qbPXlVvuEhmHmnvLQBN0XVxqA= github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 h1:Yf+n3T/fnUWcYyfe7bsygV4sWAkNo0QhN58APJFIKIc= github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10/go.mod h1:05duR85P8YHuIfIkA7sn2bvrhKo/pDpFKV2rliYHNOo= -github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2 h1:7bCdbTUWzyczQg+kwHCxlx6y07zE8HNB8+ntTne6qd8= -github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2/go.mod h1:MltlNu3jcXm/DyLN98I5TFNtu/o1NNAcaPAFKMXWk70= +github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.6-0.20250224181213-3514fc5f737a h1:XRCVgs+3owPjWq35C58wxZyHxdAzSjq5V8BgLF3Ci5U= +github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.6-0.20250224181213-3514fc5f737a/go.mod h1:AfMr/qKm4WNDlyXjd7ElKYFmoj0u3HCXwI6/f5tqIrg= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 h1:PKiqnVOTChlH4a4ljJKL3OKGRgYfIpJS4YD1daAIKks= @@ -1440,10 +1486,8 @@ github.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60= -github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/sony/gobreaker v0.5.0 h1:dRCvqm0P490vZPmy7ppEk2qCnCieBooFJ+YoXGYB+yg= -github.com/sony/gobreaker v0.5.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sony/gobreaker/v2 v2.1.0 h1:av2BnjtRmVPWBvy5gSFPytm1J8BmN5AGhq875FfGKDM= +github.com/sony/gobreaker/v2 v2.1.0/go.mod h1:dO3Q/nCzxZj6ICjH6J/gM0r4oAwBMVLY8YAQf+NTtUg= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -1451,8 +1495,8 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= +github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= @@ -1464,8 +1508,9 @@ github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3k github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= @@ -1495,6 +1540,8 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203 h1:QVqDTf3h2WHt08YuiTGPZLls0Wq99X9bWd0Q5ZSBesM= +github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203/go.mod h1:oqN97ltKNihBbwlX8dLpwxCl3+HnXKV/R0e+sRLd9C8= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= @@ -1521,10 +1568,14 @@ github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tjhop/slog-gokit v0.1.3 h1:6SdexP3UIeg93KLFeiM1Wp1caRwdTLgsD/THxBUy1+o= +github.com/tjhop/slog-gokit v0.1.3/go.mod h1:Bbu5v2748qpAWH7k6gse/kw3076IJf6owJmh7yArmJs= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= +github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= @@ -1570,8 +1621,8 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE= -github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= +github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M= +github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= @@ -1592,8 +1643,8 @@ go.dedis.ch/kyber/v3 v3.1.0/go.mod h1:kXy7p3STAurkADD+/aZcsznZGKVHEqbtmdIzvPfrs1 go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= -go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= -go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= +go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk= +go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.14 h1:vHObSCxyB9zlF60w7qzAdTcGaglbJOpSj1Xj9+WGxq0= go.etcd.io/etcd/api/v3 v3.5.14/go.mod h1:BmtWcRlQvwa1h3G2jvKYwIQy4PkHlDej5t7uLMUdJUU= @@ -1603,8 +1654,8 @@ go.etcd.io/etcd/client/pkg/v3 v3.5.14/go.mod h1:8uMgAokyG1czCtIdsq+AGyYQMvpIKnSv go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v3 v3.5.14 h1:CWfRs4FDaDoSz81giL7zPpZH2Z35tbOrAJkkjMqOupg= go.etcd.io/etcd/client/v3 v3.5.14/go.mod h1:k3XfdV/VIHy/97rqWjoUzrj9tk7GgJGH9J8L4dNXmAk= -go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= -go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.mongodb.org/mongo-driver v1.17.0 h1:Hp4q2MCjvY19ViwimTs00wHi7G4yzxh4/2+nTx8r40k= +go.mongodb.org/mongo-driver v1.17.0/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1612,52 +1663,84 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/collector/pdata v1.12.0 h1:Xx5VK1p4VO0md8MWm2icwC1MnJ7f8EimKItMWw46BmA= -go.opentelemetry.io/collector/pdata v1.12.0/go.mod h1:MYeB0MmMAxeM0hstCFrCqWLzdyeYySim2dG6pDT6nYI= -go.opentelemetry.io/collector/semconv v0.105.0 h1:8p6dZ3JfxFTjbY38d8xlQGB1TQ3nPUvs+D0RERniZ1g= -go.opentelemetry.io/collector/semconv v0.105.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v0.118.0 h1:sSO/ObxJ+yH77Z4DmT1mlSuxhbgUmY1ztt7xCA1F/8w= +go.opentelemetry.io/collector/component v0.118.0/go.mod h1:LUJ3AL2b+tmFr3hZol3hzKzCMvNdqNq0M5CF3SWdv4M= +go.opentelemetry.io/collector/component/componentstatus v0.118.0 h1:1aCIdUjqz0noKNQr1v04P+lwF89Lkua5U7BhH9IAxkE= +go.opentelemetry.io/collector/component/componentstatus v0.118.0/go.mod h1:ynO1Nyj0t1h6x/djIMJy35bhnnWEc2mlQaFgDNUO504= +go.opentelemetry.io/collector/component/componenttest v0.118.0 h1:knEHckoiL2fEWSIc0iehg39zP4IXzi9sHa45O+oxKo8= +go.opentelemetry.io/collector/component/componenttest v0.118.0/go.mod h1:aHc7t7zVwCpbhrWIWY+GMuaMxMCUP8C8P7pJOt8r/vU= +go.opentelemetry.io/collector/config/configtelemetry v0.118.0 h1:UlN46EViG2X42odWtXgWaqY7Y01ZKpsnswSwXTWx5mM= +go.opentelemetry.io/collector/config/configtelemetry v0.118.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.24.0 h1:7DeyBm9qdr1EPuCfPjWyChPK16DbVc0wZeSa9LZprFU= +go.opentelemetry.io/collector/consumer v1.24.0/go.mod h1:0G6jvZprIp4dpKMD1ZxCjriiP9GdFvFMObsQEtTk71s= +go.opentelemetry.io/collector/consumer/consumertest v0.118.0 h1:8AAS9ejQapP1zqt0+cI6u+AUBheT3X0171N9WtXWsVY= +go.opentelemetry.io/collector/consumer/consumertest v0.118.0/go.mod h1:spRM2wyGr4QZzqMHlLmZnqRCxqXN4Wd0piogC4Qb5PQ= +go.opentelemetry.io/collector/consumer/xconsumer v0.118.0 h1:guWnzzRqgCInjnYlOQ1BPrimppNGIVvnknAjlIbWXuY= +go.opentelemetry.io/collector/consumer/xconsumer v0.118.0/go.mod h1:C5V2d6Ys/Fi6k3tzjBmbdZ9v3J/rZSAMlhx4KVcMIIg= +go.opentelemetry.io/collector/pdata v1.26.0 h1:o7nP0RTQOG0LXk55ZZjLrxwjX8x3wHF7Z7xPeOaskEA= +go.opentelemetry.io/collector/pdata v1.26.0/go.mod h1:18e8/xDZsqyj00h/5HM5GLdJgBzzG9Ei8g9SpNoiMtI= +go.opentelemetry.io/collector/pdata/pprofile v0.118.0 h1:VK/fr65VFOwEhsSGRPj5c3lCv0yIK1Kt0sZxv9WZBb8= +go.opentelemetry.io/collector/pdata/pprofile v0.118.0/go.mod h1:eJyP/vBm179EghV3dPSnamGAWQwLyd+4z/3yG54YFoQ= +go.opentelemetry.io/collector/pdata/testdata v0.118.0 h1:5N0w1SX9KIRkwvtkrpzQgXy9eGk3vfNG0ds6mhEPMIM= +go.opentelemetry.io/collector/pdata/testdata v0.118.0/go.mod h1:UY+GHV5bOC1BnFburOZ0wiHReJj1XbW12mi2Ogbc5Lw= +go.opentelemetry.io/collector/pipeline v0.118.0 h1:RI1DMe7L0+5hGkx0EDGxG00TaJoh96MEQppgOlGx1Oc= +go.opentelemetry.io/collector/pipeline v0.118.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/processor v0.118.0 h1:NlqWiTTpPP+EPbrqTcNP9nh/4O4/9U9RGWVB49xo4ws= +go.opentelemetry.io/collector/processor v0.118.0/go.mod h1:Y8OD7wk51oPuBqrbn1qXIK91AbprRHP76hlvEzC24U4= +go.opentelemetry.io/collector/processor/processortest v0.118.0 h1:VfTLHuIaJWGyUmrvAOvf63gPMf1vAW68/jtJClEsKtU= +go.opentelemetry.io/collector/processor/processortest v0.118.0/go.mod h1:ZFWxsSoafGNOEk83FtGz43M5ypUzAOvGnfT0aQTDHdU= +go.opentelemetry.io/collector/processor/xprocessor v0.118.0 h1:M/EMhPRbadHLpv7g99fBjfgyuYexBZmgQqb2vjTXjvM= +go.opentelemetry.io/collector/processor/xprocessor v0.118.0/go.mod h1:lkoQoCv2Cz+C0kf2VHgBUDYWDecZLLeaHEvHDXbBCXU= +go.opentelemetry.io/collector/semconv v0.118.0 h1:V4vlMIK7TIaemrrn2VawvQPwruIKpj7Xgw9P5+BL56w= +go.opentelemetry.io/collector/semconv v0.118.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0 h1:1f31+6grJmV3X4lxcEvUy13i5/kfDw1nJZwhd8mA4tg= go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0/go.mod h1:1P/02zM3OwkX9uki+Wmxw3a5GVb6KUXRsa7m7bOC9Fg= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= -go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= -go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 h1:UiRNKd1OgqsLbFwE+wkAWTdiAxXtCBqKIHeBIse4FUA= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9/go.mod h1:eqZlW3pJWhjyexnDPrdQxix1pn0wwhI4AO4GKpP/bMI= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 h1:QSKmLBzbFULSyHzOdO9JsN9lpE4zkrz1byYGmJecdVE= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0/go.mod h1:sTQ/NH8Yrirf0sJ5rWqVu+oT82i4zL9FaF6rWcqnptM= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0/go.mod h1:yeGZANgEcpdx/WK0IvvRFC+2oLiMS2u4L/0Rj2M2Qr0= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 h1:VrMAbeJz4gnVDg2zEzjHG4dEH86j4jO6VYB+NgtGD8s= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0/go.mod h1:qqN/uFdpeitTvm+JDqqnjm517pmQRYxTORbETHq5tOc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 h1:0MH3f8lZrflbUWXVxyBg/zviDFdGE062uKh5+fu8Vv0= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0/go.mod h1:Vh68vYiHY5mPdekTr0ox0sALsqjoVy0w3Os278yX5SQ= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 h1:BJee2iLkfRfl9lc7aFmBwkWxY/RI1RDdXepSF6y8TPE= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0/go.mod h1:DIzlHs3DRscCIBU3Y9YSzPfScwnYnzfnCd4g8zA7bZc= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= -go.opentelemetry.io/otel/log v0.6.0 h1:nH66tr+dmEgW5y+F9LanGJUBYPrRgP4g2EkmPE3LeK8= -go.opentelemetry.io/otel/log v0.6.0/go.mod h1:KdySypjQHhP069JX0z/t26VHwa8vSwzgaKmXtIB3fJM= -go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= -go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= -go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= -go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= -go.opentelemetry.io/otel/sdk/log v0.6.0 h1:4J8BwXY4EeDE9Mowg+CyhWVBhTSLXVXodiXxS/+PGqI= -go.opentelemetry.io/otel/sdk/log v0.6.0/go.mod h1:L1DN8RMAduKkrwRAFDEX3E3TLOq46+XMGSbUfHU/+vE= -go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= -go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= -go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= -go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.59.0 h1:iQZYNQ7WwIcYXzOPR46FQv9O0dS1PW16RjvR0TjDOe8= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.59.0/go.mod h1:54CaSNqYEXvpzDh8KPjiMVoWm60t5R0dZRt0leEPgAs= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= +go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 h1:5dTKu4I5Dn4P2hxyW3l3jTaZx9ACgg0ECos1eAVrheY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0/go.mod h1:P5HcUI8obLrCCmM3sbVBohZFH34iszk/+CPWuakZWL8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 h1:q/heq5Zh8xV1+7GoMGJpTxM2Lhq5+bFxB29tshuRuw0= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0/go.mod h1:leO2CSTg0Y+LyvmR7Wm4pUxE8KAmaM2GCVx7O+RATLA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 h1:ajl4QczuJVA2TU9W9AGw++86Xga/RKt//16z/yxPgdk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0/go.mod h1:Vn3/rlOJ3ntf/Q3zAI0V5lDnTbHGaUsNUeF6nZmm7pA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 h1:GKCEAZLEpEf78cUvudQdTg0aET2ObOZRB2HtXA0qPAI= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0/go.mod h1:9/zqSWLCmHT/9Jo6fYeUDRRogOLL60ABLsHWS99lF8s= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 h1:czJDQwFrMbOr9Kk+BPo1y8WZIIFIK58SA1kykuVeiOU= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0/go.mod h1:lT7bmsxOe58Tq+JIOkTQMCGXdu47oA+VJKLZHbaBKbs= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 h1:jBpDk4HAUsrnVO1FsfCfCOTEc/MkInJmvfCHYLFiT80= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0/go.mod h1:H9LUIM1daaeZaz91vZcfeM0fejXPmgCYE8ZhzqfJuiU= +go.opentelemetry.io/otel/log v0.10.0 h1:1CXmspaRITvFcjA4kyVszuG4HjA61fPDxMb7q3BuyF0= +go.opentelemetry.io/otel/log v0.10.0/go.mod h1:PbVdm9bXKku/gL0oFfUF4wwsQsOPlpo4VEqjvxih+FM= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= +go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/sdk/log v0.10.0 h1:lR4teQGWfeDVGoute6l0Ou+RpFqQ9vaPdrNJlST0bvw= +go.opentelemetry.io/otel/sdk/log v0.10.0/go.mod h1:A+V1UTWREhWAittaQEG4bYm4gAZa6xnvVu+xKrIRkzo= +go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= +go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= +go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1711,14 +1794,13 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1729,8 +1811,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc= -golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1759,8 +1841,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= -golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= +golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1779,7 +1861,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190921015927-1a5e07d1ff72/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1799,7 +1880,6 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -1808,20 +1888,18 @@ golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1834,9 +1912,8 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE= +golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1850,8 +1927,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1937,7 +2014,6 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1947,13 +2023,12 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= @@ -1961,8 +2036,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= -golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1972,20 +2047,19 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= -golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= +golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -2049,8 +2123,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= -golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= +golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= +golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2086,6 +2160,8 @@ google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjR google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.221.0 h1:qzaJfLhDsbMeFee8zBRdt/Nc+xmOuafD/dbdgGfutOU= +google.golang.org/api v0.221.0/go.mod h1:7sOU2+TL4TxUTdbi0gWgAIg7tH5qBXxoyhtL+9x3biQ= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2138,18 +2214,17 @@ google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU= -google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 h1:Pw6WnI9W/LIdRxqK7T6XGugGbHIRl5Q7q3BssH6xk4s= +google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4/go.mod h1:qbZzneIOXSq+KFAFut9krLfRLZiFLzZL5u2t8SV83EE= +google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2 h1:35ZFtrCgaAjF7AFAK0+lRSf+4AyYnWRbH7og13p7rZ4= +google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:W9ynFDP/shebLB1Hl/ESTOap2jHd6pmLXPNZC7SVDbA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 h1:DMTIbak9GhdaSxEjvVzAeNZvyc03I61duqNbnm3SU0M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -2166,8 +2241,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -2180,8 +2255,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= -google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2229,26 +2304,26 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -k8s.io/api v0.31.2 h1:3wLBbL5Uom/8Zy98GRPXpJ254nEFpl+hwndmk9RwmL0= -k8s.io/api v0.31.2/go.mod h1:bWmGvrGPssSK1ljmLzd3pwCQ9MgoTsRCuK35u6SygUk= +k8s.io/api v0.32.2 h1:bZrMLEkgizC24G9eViHGOPbW+aRo9duEISRIJKfdJuw= +k8s.io/api v0.32.2/go.mod h1:hKlhk4x1sJyYnHENsrdCWw31FEmCijNGPJO5WzHiJ6Y= k8s.io/apiextensions-apiserver v0.31.0 h1:fZgCVhGwsclj3qCw1buVXCV6khjRzKC5eCFt24kyLSk= k8s.io/apiextensions-apiserver v0.31.0/go.mod h1:b9aMDEYaEe5sdK+1T0KU78ApR/5ZVp4i56VacZYEHxk= -k8s.io/apimachinery v0.31.2 h1:i4vUt2hPK56W6mlT7Ry+AO8eEsyxMD1U44NR22CLTYw= -k8s.io/apimachinery v0.31.2/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/apimachinery v0.32.2 h1:yoQBR9ZGkA6Rgmhbp/yuT9/g+4lxtsGYwW6dR6BDPLQ= +k8s.io/apimachinery v0.32.2/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= k8s.io/cli-runtime v0.31.2 h1:7FQt4C4Xnqx8V1GJqymInK0FFsoC+fAZtbLqgXYVOLQ= k8s.io/cli-runtime v0.31.2/go.mod h1:XROyicf+G7rQ6FQJMbeDV9jqxzkWXTYD6Uxd15noe0Q= -k8s.io/client-go v0.31.2 h1:Y2F4dxU5d3AQj+ybwSMqQnpZH9F30//1ObxOKlTI9yc= -k8s.io/client-go v0.31.2/go.mod h1:NPa74jSVR/+eez2dFsEIHNa+3o09vtNaWwWwb1qSxSs= +k8s.io/client-go v0.32.2 h1:4dYCD4Nz+9RApM2b/3BtVvBHw54QjMFUl1OLcJG5yOA= +k8s.io/client-go v0.32.2/go.mod h1:fpZ4oJXclZ3r2nDOv+Ux3XcJutfrwjKTCHz2H3sww94= k8s.io/component-base v0.31.2 h1:Z1J1LIaC0AV+nzcPRFqfK09af6bZ4D1nAOpWsy9owlA= k8s.io/component-base v0.31.2/go.mod h1:9PeyyFN/drHjtJZMCTkSpQJS3U9OXORnHQqMLDz0sUQ= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f h1:2sXuKesAYbRHxL3aE2PN6zX/gcJr22cjrsej+W784Tc= -k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f/go.mod h1:UxDHUPsUwTOOxSU+oXURfFBcAS6JwiRXTYqYwfuGowc= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= k8s.io/kubectl v0.31.2 h1:gTxbvRkMBwvTSAlobiTVqsH6S8Aa1aGyBcu5xYLsn8M= k8s.io/kubectl v0.31.2/go.mod h1:EyASYVU6PY+032RrTh5ahtSOMgoDRIux9V1JLKtG5xM= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 h1:jGnCPejIetjiy2gqaJ5V0NLwTpF4wbQ6cZIItJCSHno= +k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk= @@ -2273,13 +2348,13 @@ rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sigs.k8s.io/controller-runtime v0.19.0 h1:nWVM7aq+Il2ABxwiCizrVDSlmDcshi9llbaFbC0ji/Q= sigs.k8s.io/controller-runtime v0.19.0/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= sigs.k8s.io/kustomize/api v0.17.2 h1:E7/Fjk7V5fboiuijoZHgs4aHuexi5Y2loXlVOAVAG5g= sigs.k8s.io/kustomize/api v0.17.2/go.mod h1:UWTz9Ct+MvoeQsHcJ5e+vziRRkwimm3HytpZgIYqye0= sigs.k8s.io/kustomize/kyaml v0.17.1 h1:TnxYQxFXzbmNG6gOINgGWQt09GghzgTP6mIurOgrLCQ= sigs.k8s.io/kustomize/kyaml v0.17.1/go.mod h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index aaabb09adb1..42d9cfcf831 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -1,8 +1,8 @@ module github.com/smartcontractkit/chainlink/load-tests -go 1.23.3 +go 1.24 -toolchain go1.23.4 +toolchain go1.24.0 // Make sure we're working with the latest chainlink libs replace github.com/smartcontractkit/chainlink/v2 => ../../ @@ -22,7 +22,7 @@ require ( require ( github.com/K-Phoen/grabana v0.22.2 github.com/ethereum/go-ethereum v1.15.0 - github.com/go-resty/resty/v2 v2.15.3 + github.com/go-resty/resty/v2 v2.16.3 github.com/pelletier/go-toml/v2 v2.2.3 github.com/pkg/errors v0.9.1 github.com/rs/zerolog v1.33.0 @@ -33,17 +33,20 @@ require ( github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 - github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2 + github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.6-0.20250224181213-3514fc5f737a github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de github.com/stretchr/testify v1.10.0 github.com/wiremock/go-wiremock v1.9.0 go.uber.org/atomic v1.11.0 go.uber.org/ratelimit v0.3.1 - golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c - golang.org/x/sync v0.10.0 + golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa + golang.org/x/sync v0.11.0 ) require ( + cloud.google.com/go/auth v0.14.1 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect + cloud.google.com/go/compute/metadata v0.6.0 // indirect cosmossdk.io/errors v1.0.1 // indirect cosmossdk.io/math v1.3.0 // indirect dario.cat/mergo v1.0.1 // indirect @@ -51,26 +54,26 @@ require ( github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect github.com/AlekSi/pointer v1.1.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 // indirect github.com/ChainSafe/go-schnorrkel v1.0.0 // indirect github.com/DataDog/zstd v1.5.2 // indirect github.com/K-Phoen/sdk v0.12.4 // indirect github.com/Khan/genqlient v0.7.0 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect - github.com/Masterminds/semver/v3 v3.3.0 // indirect - github.com/Masterminds/sprig/v3 v3.2.3 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Masterminds/sprig/v3 v3.3.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/NethermindEth/juno v0.3.1 // indirect github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb // indirect github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/XSAM/otelsql v0.29.0 // indirect - github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 // indirect + github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect github.com/andybalholm/brotli v1.1.1 // indirect github.com/apache/arrow-go/v18 v18.0.0 // indirect github.com/aptos-labs/aptos-go-sdk v1.5.0 // indirect @@ -80,23 +83,23 @@ require ( github.com/avast/retry-go v3.0.0+incompatible // indirect github.com/avast/retry-go/v4 v4.6.0 // indirect github.com/awalterschulze/gographviz v2.0.3+incompatible // indirect - github.com/aws/aws-sdk-go v1.54.19 // indirect - github.com/aws/aws-sdk-go-v2 v1.32.2 // indirect - github.com/aws/aws-sdk-go-v2/config v1.28.0 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.41 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.17 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21 // indirect + github.com/aws/aws-sdk-go v1.55.6 // indirect + github.com/aws/aws-sdk-go-v2 v1.32.7 // indirect + github.com/aws/aws-sdk-go-v2/config v1.28.6 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.47 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7 // indirect github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.24.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.2 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.32.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 // indirect github.com/aws/constructs-go/constructs/v10 v10.4.2 // indirect github.com/aws/jsii-runtime-go v1.104.0 // indirect - github.com/aws/smithy-go v1.22.0 // indirect + github.com/aws/smithy-go v1.22.1 // indirect github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df // indirect @@ -114,8 +117,7 @@ require ( github.com/bytecodealliance/wasmtime-go/v28 v28.0.0 // 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/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500 // indirect github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5 // indirect github.com/cenkalti/backoff v2.2.1+incompatible // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect @@ -161,15 +163,16 @@ require ( github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/distribution/reference v0.6.0 // indirect - github.com/docker/docker v27.3.1+incompatible // indirect + github.com/docker/docker v27.5.1+incompatible // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dominikbraun/graph v0.23.0 // indirect github.com/doyensec/safeurl v0.2.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/dvsekhvalnov/jose2go v1.7.0 // indirect - github.com/edsrzf/mmap-go v1.1.0 // indirect + github.com/edsrzf/mmap-go v1.2.0 // indirect github.com/emicklei/go-restful/v3 v3.12.1 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.32.3 // indirect github.com/esote/minmaxheap v1.0.0 // indirect github.com/ethereum/c-kzg-4844 v1.0.3 // indirect github.com/ethereum/go-verkle v0.2.2 // indirect @@ -177,9 +180,9 @@ require ( github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb // indirect github.com/fatih/camelcase v1.0.0 // indirect - github.com/fatih/color v1.17.0 // indirect + github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.8 // indirect github.com/gagliardetto/binary v0.8.0 // indirect @@ -192,7 +195,7 @@ require ( github.com/gin-gonic/gin v1.10.0 // indirect github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect github.com/go-errors/errors v1.4.2 // indirect - github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 // indirect + github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-ldap/ldap/v3 v3.4.6 // indirect @@ -200,23 +203,23 @@ require ( github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-openapi/analysis v0.22.2 // indirect + github.com/go-openapi/analysis v0.23.0 // indirect github.com/go-openapi/errors v0.22.0 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect - github.com/go-openapi/loads v0.21.5 // indirect - github.com/go-openapi/spec v0.20.14 // indirect + github.com/go-openapi/loads v0.22.0 // indirect + github.com/go-openapi/spec v0.21.0 // indirect github.com/go-openapi/strfmt v0.23.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect - github.com/go-openapi/validate v0.23.0 // indirect + github.com/go-openapi/validate v0.24.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.24.0 // indirect - github.com/go-redis/redis/v8 v8.11.5 // indirect - github.com/go-viper/mapstructure/v2 v2.1.0 // indirect + github.com/go-playground/validator/v10 v10.25.0 // indirect + github.com/go-redsync/redsync/v4 v4.13.0 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // 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.3 // indirect + github.com/goccy/go-json v0.10.5 // 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 @@ -225,11 +228,10 @@ require ( github.com/gogo/status v1.1.1 // indirect github.com/golang-jwt/jwt/v4 v4.5.1 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect - github.com/golang/glog v1.2.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/glog v1.2.3 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/btree v1.1.2 // indirect + github.com/google/btree v1.1.3 // indirect github.com/google/flatbuffers v24.3.25+incompatible // indirect github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect github.com/google/go-cmp v0.6.0 // indirect @@ -238,33 +240,37 @@ require ( github.com/google/go-tpm v0.9.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect + github.com/google/s2a-go v0.1.9 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect + github.com/googleapis/gax-go/v2 v2.14.1 // indirect github.com/gorilla/context v1.1.1 // indirect - github.com/gorilla/mux v1.8.0 // indirect + github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/securecookie v1.1.2 // indirect github.com/gorilla/sessions v1.2.2 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/gosimple/slug v1.13.1 // indirect github.com/gosimple/unidecode v1.0.1 // indirect - github.com/grafana/dskit v0.0.0-20231120170505-765e343eda4f // indirect - github.com/grafana/gomemcache v0.0.0-20231023152154-6947259a0586 // indirect + github.com/grafana/dskit v0.0.0-20241007172036-53283a0f6b41 // indirect + github.com/grafana/gomemcache v0.0.0-20240229205252-cd6a66d6fb56 // indirect github.com/grafana/grafana-foundation-sdk/go v0.0.0-20240326122733-6f96a993222b // indirect - github.com/grafana/loki v1.6.2-0.20231215164305-b51b7d7b5503 // indirect - github.com/grafana/loki/pkg/push v0.0.0-20231201111602-11ef833ed3e4 // indirect + github.com/grafana/jsonparser v0.0.0-20241004153430-023329977675 // indirect + github.com/grafana/loki/pkg/push v0.0.0-20240924133635-758364c7775f // indirect + github.com/grafana/loki/v3 v3.0.0-20250221202516-b37eefe24f82 // indirect github.com/grafana/pyroscope-go v1.1.2 // indirect github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect - github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 // indirect - github.com/hashicorp/consul/api v1.29.2 // indirect + github.com/hashicorp/consul/api v1.31.2 // indirect github.com/hashicorp/consul/sdk v0.16.1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-bexpr v0.1.10 // indirect @@ -272,28 +278,29 @@ require ( github.com/hashicorp/go-envparse v0.1.0 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-msgpack v0.5.5 // indirect + github.com/hashicorp/go-metrics v0.5.4 // indirect + github.com/hashicorp/go-msgpack/v2 v2.1.1 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-plugin v1.6.2 // indirect + github.com/hashicorp/go-plugin v1.6.3 // indirect github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect - github.com/hashicorp/go-sockaddr v1.0.6 // indirect - github.com/hashicorp/golang-lru v0.6.0 // indirect + github.com/hashicorp/go-sockaddr v1.0.7 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/memberlist v0.5.0 // indirect + github.com/hashicorp/memberlist v0.5.2 // indirect github.com/hashicorp/serf v0.10.1 // indirect - github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hashicorp/yamux v0.1.2 // indirect github.com/hasura/go-graphql-client v0.13.1 // indirect github.com/hdevalence/ed25519consensus v0.2.0 // indirect github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.3.2 // indirect - github.com/huandu/xstrings v1.4.0 // indirect + github.com/huandu/xstrings v1.5.0 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/invopop/jsonschema v0.12.0 // indirect + github.com/invopop/jsonschema v0.13.0 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgconn v1.14.3 // indirect github.com/jackc/pgio v1.0.0 // indirect @@ -314,8 +321,8 @@ require ( github.com/julienschmidt/httprouter v1.3.0 // indirect github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52 // indirect github.com/kelseyhightower/envconfig v1.4.0 // indirect - github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.8 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // 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 @@ -326,27 +333,29 @@ require ( github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/linxGnu/grocksdb v1.7.16 // indirect github.com/logrusorgru/aurora v2.0.3+incompatible // indirect - github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/mailru/easyjson v0.9.0 // indirect github.com/marcboeker/go-duckdb v1.8.3 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mdlayher/socket v0.5.1 // indirect + github.com/mdlayher/vsock v1.2.1 // indirect github.com/mfridman/interpolate v0.0.2 // indirect - github.com/miekg/dns v1.1.61 // indirect + github.com/miekg/dns v1.1.63 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect github.com/mitchellh/pointerstructure v1.2.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/patternmatcher v0.6.0 // indirect - github.com/moby/spdystream v0.4.0 // indirect + github.com/moby/spdystream v0.5.0 // indirect github.com/moby/sys/sequential v0.6.0 // indirect github.com/moby/sys/user v0.3.0 // indirect github.com/moby/sys/userns v0.1.0 // indirect @@ -365,39 +374,43 @@ require ( github.com/oklog/run v1.1.0 // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor v0.116.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect - github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e // indirect - github.com/opentracing-contrib/go-stdlib v1.0.0 // indirect - github.com/opentracing/opentracing-go v1.2.0 // indirect + github.com/opentracing-contrib/go-grpc v0.1.1 // indirect + github.com/opentracing-contrib/go-stdlib v1.1.0 // indirect + github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect github.com/otiai10/copy v1.14.0 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible // indirect - github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect - github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pion/dtls/v2 v2.2.7 // indirect github.com/pion/logging v0.2.2 // indirect github.com/pion/stun/v2 v2.0.0 // indirect github.com/pion/transport/v2 v2.2.1 // indirect github.com/pion/transport/v3 v3.0.1 // indirect + github.com/pires/go-proxyproto v0.7.0 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/pressly/goose/v3 v3.21.1 // indirect - github.com/prometheus/alertmanager v0.27.0 // indirect - github.com/prometheus/client_golang v1.20.5 // indirect + github.com/prometheus/alertmanager v0.28.0 // indirect + github.com/prometheus/client_golang v1.21.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.60.1 // indirect - github.com/prometheus/common/sigv4 v0.1.0 // indirect - github.com/prometheus/exporter-toolkit v0.11.0 // indirect + github.com/prometheus/common v0.62.0 // indirect + github.com/prometheus/exporter-toolkit v0.13.2 // indirect github.com/prometheus/procfs v0.15.1 // indirect - github.com/prometheus/prometheus v0.54.1 // indirect + github.com/prometheus/prometheus v0.302.0 // indirect + github.com/prometheus/sigv4 v0.1.1 // indirect + github.com/redis/go-redis/v9 v9.7.0 // 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 + github.com/rs/cors v1.11.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect @@ -419,7 +432,7 @@ require ( github.com/smartcontractkit/ccip-owner-contracts v0.1.0 // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect - github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect + github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb // indirect @@ -436,13 +449,12 @@ require ( github.com/smartcontractkit/mcms v0.10.0 // indirect github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect github.com/smartcontractkit/wsrpc v0.8.3 // indirect - github.com/soheilhy/cmux v0.1.5 // indirect - github.com/sony/gobreaker v0.5.0 // indirect + github.com/sony/gobreaker/v2 v2.1.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/afero v1.12.0 // indirect github.com/spf13/cast v1.7.1 // indirect github.com/spf13/cobra v1.8.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/spf13/viper v1.19.0 // indirect github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 // indirect github.com/stretchr/objx v0.5.2 // indirect @@ -455,8 +467,9 @@ require ( github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tjhop/slog-gokit v0.1.3 // indirect + github.com/tklauser/go-sysconf v0.3.13 // indirect + github.com/tklauser/numcpus v0.7.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect @@ -476,56 +489,64 @@ require ( github.com/zondax/ledger-go v0.14.3 // indirect go.dedis.ch/fixbuf v1.0.3 // indirect go.dedis.ch/kyber/v3 v3.1.0 // indirect - go.etcd.io/bbolt v1.3.9 // indirect + go.etcd.io/bbolt v1.4.0 // indirect go.etcd.io/etcd/api/v3 v3.5.14 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.14 // indirect go.etcd.io/etcd/client/v3 v3.5.14 // indirect - go.mongodb.org/mongo-driver v1.15.0 // indirect - go.opentelemetry.io/collector/pdata v1.12.0 // indirect - go.opentelemetry.io/collector/semconv v0.105.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect - go.opentelemetry.io/otel v1.31.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 // indirect - go.opentelemetry.io/otel/log v0.6.0 // indirect - go.opentelemetry.io/otel/metric v1.31.0 // indirect - go.opentelemetry.io/otel/sdk v1.31.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.6.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.31.0 // indirect - go.opentelemetry.io/otel/trace v1.31.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.mongodb.org/mongo-driver v1.17.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v0.118.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.118.0 // indirect + go.opentelemetry.io/collector/consumer v1.24.0 // indirect + go.opentelemetry.io/collector/pdata v1.26.0 // indirect + go.opentelemetry.io/collector/pipeline v0.118.0 // indirect + go.opentelemetry.io/collector/processor v0.118.0 // indirect + go.opentelemetry.io/collector/semconv v0.118.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.59.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect + go.opentelemetry.io/otel v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 // indirect + go.opentelemetry.io/otel/log v0.10.0 // indirect + go.opentelemetry.io/otel/metric v1.34.0 // indirect + go.opentelemetry.io/otel/sdk v1.34.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.10.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect + go.opentelemetry.io/otel/trace v1.34.0 // indirect + go.opentelemetry.io/proto/otlp v1.5.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect go.uber.org/goleak v1.3.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect go4.org/netipx v0.0.0-20230125063823-8449b0a6169f // indirect golang.org/x/arch v0.11.0 // indirect - golang.org/x/crypto v0.32.0 // indirect - golang.org/x/mod v0.22.0 // indirect - golang.org/x/net v0.34.0 // indirect - golang.org/x/oauth2 v0.23.0 // indirect - golang.org/x/sys v0.29.0 // indirect - golang.org/x/term v0.28.0 // indirect - golang.org/x/text v0.21.0 // indirect - golang.org/x/time v0.7.0 // indirect - golang.org/x/tools v0.29.0 // indirect + golang.org/x/crypto v0.33.0 // indirect + golang.org/x/mod v0.23.0 // indirect + golang.org/x/net v0.35.0 // indirect + golang.org/x/oauth2 v0.26.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/term v0.29.0 // indirect + golang.org/x/text v0.22.0 // indirect + golang.org/x/time v0.10.0 // indirect + golang.org/x/tools v0.30.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect gonum.org/v1/gonum v0.15.1 // indirect - google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect - google.golang.org/grpc v1.67.1 // indirect - google.golang.org/protobuf v1.36.4 // indirect + google.golang.org/api v0.221.0 // indirect + google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 // indirect + google.golang.org/grpc v1.70.0 // indirect + google.golang.org/protobuf v1.36.5 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/guregu/null.v4 v4.0.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect @@ -533,23 +554,23 @@ require ( 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 - k8s.io/api v0.31.2 // indirect + k8s.io/api v0.32.2 // indirect k8s.io/apiextensions-apiserver v0.31.0 // indirect - k8s.io/apimachinery v0.31.2 // indirect + k8s.io/apimachinery v0.32.2 // indirect k8s.io/cli-runtime v0.31.2 // indirect - k8s.io/client-go v0.31.2 // indirect + k8s.io/client-go v0.32.2 // indirect k8s.io/component-base v0.31.2 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f // indirect + k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect k8s.io/kubectl v0.31.2 // indirect - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect + k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 // indirect pgregory.net/rapid v1.1.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/controller-runtime v0.19.0 // indirect - sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect sigs.k8s.io/kustomize/api v0.17.2 // indirect sigs.k8s.io/kustomize/kyaml v0.17.1 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect sigs.k8s.io/yaml v1.4.0 // indirect ) diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index f1bb9cc14bd..eb923f4966d 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -18,12 +18,18 @@ cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmW cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go/auth v0.14.1 h1:AwoJbzUdxA/whv1qj3TLKwh3XX5sikny2fc40wUl+h0= +cloud.google.com/go/auth v0.14.1/go.mod h1:4JHUxlGXisL0AW8kXPtUF6ztuOksyfUQNFjfsOCXkPM= +cloud.google.com/go/auth/oauth2adapt v0.2.7 h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M= +cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= +cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= @@ -59,11 +65,12 @@ github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9 github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/AlekSi/pointer v1.1.0 h1:SSDMPcXD9jSl8FPy9cRzoRaMJtm9g9ggGTxecRUbQoI= github.com/AlekSi/pointer v1.1.0/go.mod h1:y7BvfRI3wXPWKXEBhU71nbnIEEZX0QTSB2Bj48UJIZE= -github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 h1:GJHeeA2N7xrG3q30L2UXDyuWRzDM900/65j70wcM4Ww= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0/go.mod h1:XCW7KnZet0Opnr7HccfUw1PLc4CjHqpcaxW8DHklNkQ= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1 h1:1mvYtZfWQAnwNah/C+Z+Jb9rQH95LPE2vlmMuWAHJk8= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1/go.mod h1:75I/mXtme1JyWFtz8GocPHVFyH421IBoZErnO16dd0k= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.1 h1:Bk5uOhSAenHyR5P61D/NzeQCv+4fEVV8mOkJ82NqpWw= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.1/go.mod h1:QZ4pw3or1WPmRBxf0cHd1tknzrT54WPBOQoGutCPvSU= github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 h1:LkHbJbgF3YyvC53aqYGR+wWQDn2Rdp9AQdGndf9QvY4= @@ -74,8 +81,10 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25 github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8= github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= -github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= +github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= +github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 h1:kYRSnvJju5gYVyhkij+RTJ/VR6QIUaCfWeaFm2ycsjQ= +github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ChainSafe/go-schnorrkel v1.0.0 h1:3aDA67lAykLaG1y3AOjs88dMxC88PgUuHRrLeDnvGIM= @@ -100,11 +109,10 @@ github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6 github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= -github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= -github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= -github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs= +github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NethermindEth/juno v0.3.1 h1:AW72LiAm9gqUeCVJWvepnZcTnpU4Vkl0KzPMxS+42FA= @@ -120,8 +128,8 @@ github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjC github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/Workiva/go-datastructures v1.1.0 h1:hu20UpgZneBhQ3ZvwiOGlqJSKIosin2Rd5wAKUHEO/k= -github.com/Workiva/go-datastructures v1.1.0/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= +github.com/Workiva/go-datastructures v1.1.5 h1:5YfhQ4ry7bZc2Mc7R0YZyYwpf5c6t1cEFvdAhd6Mkf4= +github.com/Workiva/go-datastructures v1.1.5/go.mod h1:1yZL+zfsztete+ePzZz/Zb1/t5BnDuE2Ya2MMGhzP6A= github.com/XSAM/otelsql v0.29.0 h1:pEw9YXXs8ZrGRYfDc0cmArIz9lci5b42gmP5+tA1Huc= github.com/XSAM/otelsql v0.29.0/go.mod h1:d3/0xGIGC5RVEE+Ld7KotwaLy6zDeaF3fLJHOPpdN2w= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -129,15 +137,15 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg= -github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= +github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0= +github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= -github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk= -github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= +github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 h1:uvdUDbHQHO85qeSydJtItA4T55Pw6BtAejd0APRJOCE= +github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= github.com/alicebob/miniredis v2.5.0+incompatible h1:yBHoLpsyjupjz3NL3MhKMVkR41j82Yjf3KFv7ApYzUI= -github.com/alicebob/miniredis/v2 v2.30.4 h1:8S4/o1/KoUArAGbGwPxcwf0krlzceva2XVOSchFS7Eo= -github.com/alicebob/miniredis/v2 v2.30.4/go.mod h1:b25qWj4fCEsBeAAR2mlb0ufImGC6uH3VlUfb/HS5zKg= +github.com/alicebob/miniredis/v2 v2.34.0 h1:mBFWMaJSNL9RwdGRyEDoAAv8OQc5UlEhLDQggTglU/0= +github.com/alicebob/miniredis/v2 v2.34.0/go.mod h1:kWShP4b58T1CW0Y5dViCd5ztzrDqRWqM3nksiyXk5s8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= @@ -171,41 +179,40 @@ github.com/avast/retry-go/v4 v4.6.0 h1:K9xNA+KeB8HHc2aWFuLb25Offp+0iVRXEvFx8IinR github.com/avast/retry-go/v4 v4.6.0/go.mod h1:gvWlPhBVsvBbLkVGDg/KwvBv0bEkCOLRRSHKIr2PyOE= github.com/awalterschulze/gographviz v2.0.3+incompatible h1:9sVEXJBJLwGX7EQVhLm2elIKCm7P2YHFC8v6096G09E= github.com/awalterschulze/gographviz v2.0.3+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs= -github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.54.19 h1:tyWV+07jagrNiCcGRzRhdtVjQs7Vy41NwsuOcl0IbVI= -github.com/aws/aws-sdk-go v1.54.19/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= -github.com/aws/aws-sdk-go-v2 v1.32.2 h1:AkNLZEyYMLnx/Q/mSKkcMqwNFXMAvFto9bNsHqcTduI= -github.com/aws/aws-sdk-go-v2 v1.32.2/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= -github.com/aws/aws-sdk-go-v2/config v1.28.0 h1:FosVYWcqEtWNxHn8gB/Vs6jOlNwSoyOCA/g/sxyySOQ= -github.com/aws/aws-sdk-go-v2/config v1.28.0/go.mod h1:pYhbtvg1siOOg8h5an77rXle9tVG8T+BWLWAo7cOukc= -github.com/aws/aws-sdk-go-v2/credentials v1.17.41 h1:7gXo+Axmp+R4Z+AK8YFQO0ZV3L0gizGINCOWxSLY9W8= -github.com/aws/aws-sdk-go-v2/credentials v1.17.41/go.mod h1:u4Eb8d3394YLubphT4jLEwN1rLNq2wFOlT6OuxFwPzU= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.17 h1:TMH3f/SCAWdNtXXVPPu5D6wrr4G5hI1rAxbcocKfC7Q= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.17/go.mod h1:1ZRXLdTpzdJb9fwTMXiLipENRxkGMTn1sfKexGllQCw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21 h1:UAsR3xA31QGf79WzpG/ixT9FZvQlh5HY1NRqSHBNOCk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21/go.mod h1:JNr43NFf5L9YaG3eKTm7HQzls9J+A9YYcGI5Quh1r2Y= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21 h1:6jZVETqmYCadGFvrYEQfC5fAQmlo80CeL5psbno6r0s= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21/go.mod h1:1SR0GbLlnN3QUmYaflZNiH1ql+1qrSiB2vwcJ+4UM60= +github.com/aws/aws-sdk-go v1.55.6 h1:cSg4pvZ3m8dgYcgqB97MrcdjUmZ1BeMYKUxMMB89IPk= +github.com/aws/aws-sdk-go v1.55.6/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v1.32.7 h1:ky5o35oENWi0JYWUZkB7WYvVPP+bcRF5/Iq7JWSb5Rw= +github.com/aws/aws-sdk-go-v2 v1.32.7/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= +github.com/aws/aws-sdk-go-v2/config v1.28.6 h1:D89IKtGrs/I3QXOLNTH93NJYtDhm8SYa9Q5CsPShmyo= +github.com/aws/aws-sdk-go-v2/config v1.28.6/go.mod h1:GDzxJ5wyyFSCoLkS+UhGB0dArhb9mI+Co4dHtoTxbko= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47 h1:48bA+3/fCdi2yAwVt+3COvmatZ6jUDNkDTIsqDiMUdw= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47/go.mod h1:+KdckOejLW3Ks3b0E3b5rHsr2f9yuORBum0WPnE5o5w= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 h1:AmoU1pziydclFT/xRV+xXE/Vb8fttJCLRPv8oAkprc0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21/go.mod h1:AjUdLYe4Tgs6kpH4Bv7uMZo7pottoyHMn4eTcIcneaY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 h1:I/5wmGMffY4happ8NOCuIUEWGUvvFp5NSeQcXl9RHcI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26/go.mod h1:FR8f4turZtNy6baO0KJ5FJUmXH/cSkI9fOngs0yl6mA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26 h1:zXFLuEuMMUOvEARXFUVJdfqZ4bvvSgdGRq/ATcrQxzM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26/go.mod h1:3o2Wpy0bogG1kyOPrgkXA8pgIfEEv0+m19O9D5+W8y8= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 h1:TToQNkvGguu209puTojY/ozlqy2d/SFNcoLIqTFi42g= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0/go.mod h1:0jp+ltwkf+SwG2fm/PKo8t4y8pJSgOCO4D8Lz3k0aHQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.2 h1:s7NA1SOw8q/5c0wr8477yOPp0z+uBaXBnLE0XYb0POA= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.2/go.mod h1:fnjjWyAW/Pj5HYOxl9LJqWtEwS7W2qgcRLWP+uWbss0= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7 h1:8eUsivBQzZHqe/3FE+cqwfH+0p5Jo8PFM/QYQSmeZ+M= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7/go.mod h1:kLPQvGUmxn/fqiCrDeohwG33bq2pQpGeY62yRO6Nrh0= github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.2 h1:Rrqru2wYkKQCS2IM5/JrgKUQIoNTqA6y/iuxkjzxC6M= github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.2/go.mod h1:QuCURO98Sqee2AXmqDNxKXYFm2OEDAVAPApMqO0Vqnc= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.2 h1:bSYXVyUzoTHoKalBmwaZxs97HU9DWWI3ehHSAMa7xOk= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.2/go.mod h1:skMqY7JElusiOUjMJMOv1jJsP7YUg7DrhgqZZWuzu1U= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.2 h1:AhmO1fHINP9vFYUE0LHzCWg/LfUWUF+zFPEcY9QXb7o= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.2/go.mod h1:o8aQygT2+MVP0NaV6kbdE1YnnIM8RRVQzoeUH45GOdI= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.2 h1:CiS7i0+FUe+/YY1GvIBLLrR/XNGZ4CtM1Ll0XavNuVo= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.2/go.mod h1:HtaiBI8CjYoNVde8arShXb94UbQQi9L4EMr6D+xGBwo= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 h1:rLnYAfXQ3YAccocshIH5mzNNwZBkBo+bP6EhIxak6Hw= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7/go.mod h1:ZHtuQJ6t9A/+YDuxOLnbryAmITtr8UysSny3qcyvJTc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 h1:JnhTZR3PiYDNKlXy50/pNeix9aGMo6lLpXwJ1mw8MD4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6/go.mod h1:URronUEGfXZN1VpdktPSD1EkAL9mfrV+2F4sjH38qOY= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 h1:s4074ZO1Hk8qv65GqNXqDjmkf4HSQqJukaLuuW0TpDA= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2/go.mod h1:mVggCnIWoM09jP71Wh+ea7+5gAp53q+49wDFs1SW5z8= github.com/aws/constructs-go/constructs/v10 v10.4.2 h1:+hDLTsFGLJmKIn0Dg20vWpKBrVnFrEWYgTEY5UiTEG8= github.com/aws/constructs-go/constructs/v10 v10.4.2/go.mod h1:cXsNCKDV+9eR9zYYfwy6QuE4uPFp6jsq6TtH1MwBx9w= github.com/aws/jsii-runtime-go v1.104.0 h1:651Sh6J2FtatfnVzlOQ3/Ye1WWPAseZ6E/tSQxEKdSI= 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/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= +github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 h1:WWB576BN5zNSZc/M9d/10pqEx5VHNhaQ/yOVAkmj5Yo= github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= @@ -233,6 +240,10 @@ github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHf github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= github.com/block-vision/sui-go-sdk v1.0.6 h1:FysCc4TJC8v4BEBbCjJPDR4iR5eKqJT1dxGwsT67etg= github.com/block-vision/sui-go-sdk v1.0.6/go.mod h1:FyK1vGE8lWm9QA1fdQpf1agfXQSMbPT8AV1BICgx6d8= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c= github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= @@ -255,10 +266,8 @@ github.com/bytedance/sonic v1.12.3/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKz 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= -github.com/c9s/goprocinfo v0.0.0-20210130143923-c95fcf8c64a8/go.mod h1:uEyr4WpAH4hio6LFriaPkL938XnrvLpNPmQHBdrmbIE= +github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500 h1:6lhrsTEnloDPXyeZBvSYvQf8u86jbKehZPVDDlkgDl4= +github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5 h1:rvc39Ol6z3MvaBzXkxFC6Nfsnixq/dRypushKDd7Nc0= github.com/cdk8s-team/cdk8s-core-go/cdk8s/v2 v2.7.5/go.mod h1:R/pdNYDYFQk+tuuOo7QES1kkv6OLmp5ze2XBZQIVffM= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= @@ -291,8 +300,8 @@ github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20 h1:N+3sFI5GUjRKBi+i0TxYVST9h4Ie192jJWpHvthBBgg= -github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20241223141626-cff3c89139a3 h1:boJj011Hh+874zpIySeApCX4GeOjPl9qhRF3QuIZq+Q= +github.com/cncf/xds/go v0.0.0-20241223141626-cff3c89139a3/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= @@ -405,12 +414,12 @@ github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WA github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/digitalocean/godo v1.118.0 h1:lkzGFQmACrVCp7UqH1sAi4JK/PWwlc5aaxubgorKmC4= -github.com/digitalocean/godo v1.118.0/go.mod h1:Vk0vpCot2HOAJwc5WE8wljZGtJ3ZtWIc8MQ8rF38sdo= +github.com/digitalocean/godo v1.132.0 h1:n0x6+ZkwbyQBtIU1wwBhv26EINqHg0wWQiBXlwYg/HQ= +github.com/digitalocean/godo v1.132.0/go.mod h1:PU8JB6I1XYkQIdHFop8lLAY9ojp6M0XcU0TWaQSxbrc= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= -github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.5.1+incompatible h1:4PYU5dnBYqRQi0294d1FBECqT9ECWeQAIfE8q4YnPY8= +github.com/docker/docker v27.5.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -424,8 +433,8 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= -github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= -github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= +github.com/edsrzf/mmap-go v1.2.0 h1:hXLYlkbaPzt1SaQk+anYwKSRNhufIDCchSPkUD6dD84= +github.com/edsrzf/mmap-go v1.2.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -434,11 +443,11 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.13.0 h1:HzkeUz1Knt+3bK+8LG1bxOO/jzWZmdxpwC51i202les= -github.com/envoyproxy/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8= +github.com/envoyproxy/go-control-plane/envoy v1.32.3 h1:hVEaommgvzTjTd4xCaFd+kEQ2iYBtGxP6luyLrx6uOk= +github.com/envoyproxy/go-control-plane/envoy v1.32.3/go.mod h1:F6hWupPfh75TBXGKA++MCT/CZHFq5r9/uwt/kQYkZfE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= -github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= +github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= +github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/esote/minmaxheap v1.0.0 h1:rgA7StnXXpZG6qlM0S7pUmEv1KpWe32rYT4x8J8ntaA= github.com/esote/minmaxheap v1.0.0/go.mod h1:Ln8+i7fS1k3PLgZI2JAo0iA1as95QnIYiGCrqSJ5FZk= github.com/ethereum/c-kzg-4844 v1.0.3 h1:IEnbOHwjixW2cTvKRUlAAUOeleV7nNM/umJR+qy4WDs= @@ -460,8 +469,8 @@ github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwo github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -471,8 +480,8 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= 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.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= @@ -512,8 +521,8 @@ github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3Bop github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 h1:ymLjT4f35nQbASLnvxEde4XOBL+Sn7rFuV+FOJqkljg= -github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0/go.mod h1:6daplAwHHGbUGib4990V3Il26O0OC4aRyvewaaAihaA= +github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa h1:Rpu6sKAzIeSWBkrFHD52g8yipagcPbY2Lmm70NL1Gzc= +github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa/go.mod h1:TiCD2a1pcmjd7YnhGH0f/zKNcCD06B029pHhzV23c2M= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= @@ -538,36 +547,42 @@ github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-openapi/analysis v0.22.2 h1:ZBmNoP2h5omLKr/srIC9bfqrUGzT6g6gNv03HE9Vpj0= -github.com/go-openapi/analysis v0.22.2/go.mod h1:pDF4UbZsQTo/oNuRfAWWd4dAh4yuYf//LYorPTjrpvo= +github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU= +github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo= github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w= github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= -github.com/go-openapi/loads v0.21.5 h1:jDzF4dSoHw6ZFADCGltDb2lE4F6De7aWSpe+IcsRzT0= -github.com/go-openapi/loads v0.21.5/go.mod h1:PxTsnFBoBe+z89riT+wYt3prmSBP6GDAQh2l9H1Flz8= -github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do= -github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw= +github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco= +github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= -github.com/go-openapi/validate v0.23.0 h1:2l7PJLzCis4YUGEoW6eoQw3WhyM65WSIcjX6SQnlfDw= -github.com/go-openapi/validate v0.23.0/go.mod h1:EeiAZ5bmpSIOJV1WLfyYF9qp/B1ZgSaEpHTJHtN5cbE= +github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58= +github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= 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.24.0 h1:KHQckvo8G6hlWnrPX4NJJ+aBfWNAE/HH+qdL2cBpCmg= -github.com/go-playground/validator/v10 v10.24.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= +github.com/go-playground/validator/v10 v10.25.0 h1:5Dh7cjvzR7BRZadnsVOzPhWsrwUr0nmsZJxEAnFLNO8= +github.com/go-playground/validator/v10 v10.25.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= +github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis/v7 v7.4.1 h1:PASvf36gyUpr2zdOUS/9Zqc80GbM+9BDyiJSJDDOrTI= +github.com/go-redis/redis/v7 v7.4.1/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= 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= -github.com/go-resty/resty/v2 v2.15.3/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU= +github.com/go-redsync/redsync/v4 v4.13.0 h1:49X6GJfnbLGaIpBBREM/zA4uIMDXKAh1NDkvQ1EkZKA= +github.com/go-redsync/redsync/v4 v4.13.0/go.mod h1:HMW4Q224GZQz6x1Xc7040Yfgacukdzu7ifTDAKiyErQ= +github.com/go-resty/resty/v2 v2.16.3 h1:zacNT7lt4b8M/io2Ahj6yPypL7bqx9n1iprfQuodV+E= +github.com/go-resty/resty/v2 v2.16.3/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -577,16 +592,16 @@ github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1v github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-test/deep v1.0.4 h1:u2CU3YKy9I2pmu9pX0eq50wCgjfGIt539SqR7FbHiho= github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpGyP1XxdC/w= -github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-webauthn/webauthn v0.9.4 h1:YxvHSqgUyc5AK2pZbqkWWR55qKeDPhP8zLDr6lpIc2g= github.com/go-webauthn/webauthn v0.9.4/go.mod h1:LqupCtzSef38FcxzaklmOn7AykGKhAhr9xlRbdbgnTw= 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.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= -github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/go-zookeeper/zk v1.0.4 h1:DPzxraQx7OrPyXq2phlGlNSIyWEsAox0RJmjTseMV6I= +github.com/go-zookeeper/zk v1.0.4/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/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= @@ -607,13 +622,11 @@ github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= -github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.3 h1:oDTdz9f5VGVVNGu/Q7UXKWYsD0873HXLHdJUNBsSEKM= +github.com/golang/glog v1.2.3/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -648,10 +661,12 @@ github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v2.0.0+incompatible h1:K/R+8tc58AaqLkqG2Ol3Qk+DR/TlNuhuh457pBFPtt0= +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU= @@ -700,26 +715,31 @@ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= +github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gophercloud/gophercloud v1.13.0 h1:8iY9d1DAbzMW6Vok1AxbbK5ZaUjzMp0tdyt4fX9IeJ0= -github.com/gophercloud/gophercloud v1.13.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= +github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= +github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= +github.com/gophercloud/gophercloud/v2 v2.4.0 h1:XhP5tVEH3ni66NSNK1+0iSO6kaGPH/6srtx6Cr+8eCg= +github.com/gophercloud/gophercloud/v2 v2.4.0/go.mod h1:uJWNpTgJPSl2gyzJqcU/pIAhFUWvIkp8eE8M15n9rs4= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY= @@ -731,16 +751,18 @@ github.com/gosimple/slug v1.13.1 h1:bQ+kpX9Qa6tHRaK+fZR0A0M2Kd7Pa5eHPPsb1JpHD+Q= github.com/gosimple/slug v1.13.1/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ= github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o= github.com/gosimple/unidecode v1.0.1/go.mod h1:CP0Cr1Y1kogOtx0bJblKzsVWrqYaqfNOnHzpgWw4Awc= -github.com/grafana/dskit v0.0.0-20231120170505-765e343eda4f h1:gyojr97YeWZ70pKNakWv5/tKwBHuLy3icnIeCo9gQr4= -github.com/grafana/dskit v0.0.0-20231120170505-765e343eda4f/go.mod h1:8dsy5tQOkeNQyjXpm5mQsbCu3H5uzeBD35MzRQFznKU= -github.com/grafana/gomemcache v0.0.0-20231023152154-6947259a0586 h1:/of8Z8taCPftShATouOrBVy6GaTTjgQd/VfNiZp/VXQ= -github.com/grafana/gomemcache v0.0.0-20231023152154-6947259a0586/go.mod h1:PGk3RjYHpxMM8HFPhKKo+vve3DdlPUELZLSDEFehPuU= +github.com/grafana/dskit v0.0.0-20241007172036-53283a0f6b41 h1:a4O59OU3FJZ+EJUVnlvvNTvdAc4uRN1P6EaGwqL9CnA= +github.com/grafana/dskit v0.0.0-20241007172036-53283a0f6b41/go.mod h1:SPLNCARd4xdjCkue0O6hvuoveuS1dGJjDnfxYe405YQ= +github.com/grafana/gomemcache v0.0.0-20240229205252-cd6a66d6fb56 h1:X8IKQ0wu40wpvYcKfBcc5T4QnhdQjUhtUtB/1CY89lE= +github.com/grafana/gomemcache v0.0.0-20240229205252-cd6a66d6fb56/go.mod h1:PGk3RjYHpxMM8HFPhKKo+vve3DdlPUELZLSDEFehPuU= github.com/grafana/grafana-foundation-sdk/go v0.0.0-20240326122733-6f96a993222b h1:Msqs1nc2qWMxTriDCITKl58Td+7Md/RURmUmH7RXKns= github.com/grafana/grafana-foundation-sdk/go v0.0.0-20240326122733-6f96a993222b/go.mod h1:WtWosval1KCZP9BGa42b8aVoJmVXSg0EvQXi9LDSVZQ= -github.com/grafana/loki v1.6.2-0.20231215164305-b51b7d7b5503 h1:gdrsYbmk8822v6qvPwZO5DC6QjnAW7uKJ9YXnoUmV8c= -github.com/grafana/loki v1.6.2-0.20231215164305-b51b7d7b5503/go.mod h1:d8seWXCEXkL42mhuIJYcGi6DxfehzoIpLrMQWJojvOo= -github.com/grafana/loki/pkg/push v0.0.0-20231201111602-11ef833ed3e4 h1:wQ0FnSeebhJIBkgYOD06Mxk9HV2KhtEG0hp/7R+5RUQ= -github.com/grafana/loki/pkg/push v0.0.0-20231201111602-11ef833ed3e4/go.mod h1:f3JSoxBTPXX5ec4FxxeC19nTBSxoTz+cBgS3cYLMcr0= +github.com/grafana/jsonparser v0.0.0-20241004153430-023329977675 h1:U94jQ2TQr1m3HNyE8efSdyaBbDrdPaWImXyenuKZ/nw= +github.com/grafana/jsonparser v0.0.0-20241004153430-023329977675/go.mod h1:796sq+UcONnSlzA3RtlBZ+b/hrerkZXiEmO8oMjyRwY= +github.com/grafana/loki/pkg/push v0.0.0-20240924133635-758364c7775f h1:NcS5dQXH/BtoMpQtA1d0+ftwyzdwQk5/8SCj9eHl8w8= +github.com/grafana/loki/pkg/push v0.0.0-20240924133635-758364c7775f/go.mod h1:lJEF/Wh5MYlmBem6tOYAFObkLsuikfrEf8Iy9AdMPiQ= +github.com/grafana/loki/v3 v3.0.0-20250221202516-b37eefe24f82 h1:W0/mTT89fhcJmxneL/F6IE4rvCKEvdSxBj+o2hvBeNA= +github.com/grafana/loki/v3 v3.0.0-20250221202516-b37eefe24f82/go.mod h1:XbstssWTrGm9zVBlV/f7p+pYf0WOj6ay7+vsNx7pQHk= github.com/grafana/pyroscope-go v1.1.2 h1:7vCfdORYQMCxIzI3NlYAs3FcBP760+gWuYWOyiVyYx8= github.com/grafana/pyroscope-go v1.1.2/go.mod h1:HSSmHo2KRn6FasBA4vK7BMiQqyQq8KSuBKvrhkXxYPU= github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= @@ -757,13 +779,12 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaW github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0 h1:FbSCl+KggFl+Ocym490i/EyXF4lPgLoUtcSWquBM0Rs= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0/go.mod h1:qOchhhIlmRcqk/O9uCo/puJlyo07YINaIqdZfZG3Jkc= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= -github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= @@ -774,10 +795,8 @@ github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIv github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 h1:BpJ2o0OR5FV7vrkDYfXYVJQeMNWa8RhklZOpW2ITAIQ= github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026/go.mod h1:5Scbynm8dF1XAPwIwkGPqzkM/shndPm79Jd1003hTjE= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.29.2 h1:aYyRn8EdE2mSfG14S1+L9Qkjtz8RzmaWh6AcNGRNwPw= -github.com/hashicorp/consul/api v1.29.2/go.mod h1:0YObcaLNDSbtlgzIRtmRXI1ZkeuK0trCBxwZQ4MYnIk= -github.com/hashicorp/consul/proto-public v0.6.2 h1:+DA/3g/IiKlJZb88NBn0ZgXrxJp2NlvCZdEyl+qxvL0= -github.com/hashicorp/consul/proto-public v0.6.2/go.mod h1:cXXbOg74KBNGajC+o8RlA502Esf0R9prcoJgiOX/2Tg= +github.com/hashicorp/consul/api v1.31.2 h1:NicObVJHcCmyOIl7Z9iHPvvFrocgTYo9cITSGg0/7pw= +github.com/hashicorp/consul/api v1.31.2/go.mod h1:Z8YgY0eVPukT/17ejW+l+C7zJmKwgPHtjU1q16v/Y40= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.16.1 h1:V8TxTnImoPD5cj0U9Spl0TUxcytjcbbJeADFF07KdHg= github.com/hashicorp/consul/sdk v0.16.1/go.mod h1:fSXvwxB2hmh1FMZCNl6PwX0Q/1wdWtHJcZ7Ea5tns0s= @@ -801,15 +820,19 @@ github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8IoK3c= github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= +github.com/hashicorp/go-metrics v0.5.4 h1:8mmPiIJkTPPEbAiV97IxdAGNdRdaWwVap1BU6elejKY= +github.com/hashicorp/go-metrics v0.5.4/go.mod h1:CG5yz4NZ/AI/aQt9Ucm/vdBnbh7fvmv4lxZ350i+QQI= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack/v2 v2.1.1 h1:xQEY9yB2wnHitoSzk/B9UjXWRQ67QKu5AOm8aFp8N3I= +github.com/hashicorp/go-msgpack/v2 v2.1.1/go.mod h1:upybraOAblm4S7rx0+jeNy+CWWhzywQsSRV5033mMu4= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-plugin v1.6.2 h1:zdGAEd0V1lCaU0u+MxWQhtSDQmahpkwOun8U8EiRVog= -github.com/hashicorp/go-plugin v1.6.2/go.mod h1:CkgLQ5CZqNmdL9U9JzM532t8ZiYQ35+pj3b1FD37R0Q= +github.com/hashicorp/go-plugin v1.6.3 h1:xgHB+ZUSYeuJi96WtxEjzi23uh7YQpznjGh0U0UUrwg= +github.com/hashicorp/go-plugin v1.6.3/go.mod h1:MRobyh+Wc/nYy1V4KAXUiYfzxoYhs7V1mlH1Z7iY2h0= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= @@ -817,8 +840,8 @@ github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.6 h1:RSG8rKU28VTUTvEKghe5gIhIQpv8evvNpnDEyqO4u9I= -github.com/hashicorp/go-sockaddr v1.0.6/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3lyjsj6+CCykpaxI= +github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw= +github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -829,8 +852,8 @@ github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09 github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= -github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -839,21 +862,22 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3 h1:fgVfQ4AC1avVOnu2cfms8VAiD8lUq3vWI8mTocOXN/w= -github.com/hashicorp/nomad/api v0.0.0-20240717122358-3d93bd3778f3/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= +github.com/hashicorp/memberlist v0.5.2 h1:rJoNPWZ0juJBgqn48gjy59K5H4rNgvUoM1kUD7bXiuI= +github.com/hashicorp/memberlist v0.5.2/go.mod h1:Ri9p/tRShbjYnpNf4FFPXG7wxEGY4Nrcn6E7jrVa//4= +github.com/hashicorp/nomad/api v0.0.0-20241218080744-e3ac00f30eec h1:+YBzb977VrmffaCX/OBm17dEVJUcWn5dW+eqs3aIJ/A= +github.com/hashicorp/nomad/api v0.0.0-20241218080744-e3ac00f30eec/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= +github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= github.com/hasura/go-graphql-client v0.13.1 h1:kKbjhxhpwz58usVl+Xvgah/TDha5K2akNTRQdsEHN6U= github.com/hasura/go-graphql-client v0.13.1/go.mod h1:k7FF7h53C+hSNFRG3++DdVZWIuHdCaTbI7siTJ//zGQ= github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= -github.com/hetznercloud/hcloud-go/v2 v2.10.2 h1:9gyTUPhfNbfbS40Spgij5mV5k37bOZgt8iHKCbfGs5I= -github.com/hetznercloud/hcloud-go/v2 v2.10.2/go.mod h1:xQ+8KhIS62W0D78Dpi57jsufWh844gUw1az5OUvaeq8= +github.com/hetznercloud/hcloud-go/v2 v2.18.0 h1:BemrVGeWI8Kn/pvaC1jBsHZxQMnRqOydS7Ju4BERB4Q= +github.com/hetznercloud/hcloud-go/v2 v2.18.0/go.mod h1:r5RTzv+qi8IbLcDIskTzxkFIji7Ovc8yNgepQR9M+UA= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= @@ -863,25 +887,23 @@ github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXei github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= -github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= -github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= +github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= -github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= -github.com/ionos-cloud/sdk-go/v6 v6.1.11 h1:J/uRN4UWO3wCyGOeDdMKv8LWRzKu6UIkLEaes38Kzh8= -github.com/ionos-cloud/sdk-go/v6 v6.1.11/go.mod h1:EzEgRIDxBELvfoa/uBN0kOQaqovLjUWEB7iW4/Q+t4k= +github.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E= +github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= +github.com/ionos-cloud/sdk-go/v6 v6.3.2 h1:2mUmrZZz6cPyT9IRX0T8fBLc/7XU/eTxP2Y5tS7/09k= +github.com/ionos-cloud/sdk-go/v6 v6.3.2/go.mod h1:SXrO9OGyWjd2rZhAhEpdYN6VUAODzzqRdqA9BCviQtI= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -968,17 +990,25 @@ github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52 h1:msKODTL1m0wigzta github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52/go.mod h1:qk1sX/IBgppQNcGCRoj90u6EGC056EBoIc1oEjCWla8= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs= +github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -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/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= 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= @@ -1014,22 +1044,23 @@ github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhn github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/linkedin/goavro/v2 v2.12.0 h1:rIQQSj8jdAUlKQh6DttK8wCRv4t4QO09g1C4aBWXslg= github.com/linkedin/goavro/v2 v2.12.0/go.mod h1:KXx+erlq+RPlGSPmLF7xGo6SAbh8sCQ53x064+ioxhk= -github.com/linode/linodego v1.37.0 h1:B/2Spzv9jYXzKA+p+GD8fVCNJ7Wuw6P91ZDD9eCkkso= -github.com/linode/linodego v1.37.0/go.mod h1:L7GXKFD3PoN2xSEtFc04wIXP5WK65O10jYQx0PQISWQ= +github.com/linode/linodego v1.46.0 h1:+uOG4SD2MIrhbrLrvOD5HrbdLN3D19Wgn3MgdUNQjeU= +github.com/linode/linodego v1.46.0/go.mod h1:vyklQRzZUWhFVBZdYx4dcYJU/gG9yKB9VUcUs6ub0Lk= github.com/linxGnu/grocksdb v1.7.16 h1:Q2co1xrpdkr5Hx3Fp+f+f7fRGhQFQhvi/+226dtLmA8= github.com/linxGnu/grocksdb v1.7.16/go.mod h1:JkS7pl5qWpGpuVb3bPqTz8nC12X3YtPZT+Xq7+QfQo4= github.com/lithammer/dedent v1.1.0 h1:VNzHMVCBNG1j0fh3OrsFRkVUwStdDArbgBWoPAffktY= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a h1:3Bm7EwfUQUvhNeKIkUct/gl9eod1TcXuj8stxvi/GoI= +github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f h1:tVvGiZQFjOXP+9YyGqSA6jE55x1XVxmoPYudncxrZ8U= github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f/go.mod h1:Z60vy0EZVSu0bOugCHdcN5ZxFMKSpjRgsnh0XKPFqqk= github.com/marcboeker/go-duckdb v1.8.3 h1:ZkYwiIZhbYsT6MmJsZ3UPTHrTZccDdM4ztoqSlEMXiQ= @@ -1040,8 +1071,9 @@ github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -1060,14 +1092,18 @@ github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxU 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= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos= +github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ= +github.com/mdlayher/vsock v1.2.1 h1:pC1mTJTvjo1r9n9fbm7S1j04rCgCzhCOS5DY0zqHlnQ= +github.com/mdlayher/vsock v1.2.1/go.mod h1:NRfCibel++DgeMD8z/hP+PPTjlNJsdPOmxcnENvE+SE= github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY= github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= -github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= +github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY= +github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= @@ -1077,7 +1113,6 @@ github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8D github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -1093,11 +1128,10 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY= +github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= @@ -1107,8 +1141,8 @@ github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3N github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= -github.com/moby/spdystream v0.4.0 h1:Vy79D6mHeJJjiPdFEL2yku1kl0chZpJfZcPpb16BRl8= -github.com/moby/spdystream v0.4.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= +github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU= +github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= github.com/moby/sys/user v0.3.0 h1:9ni5DlcW5an3SvRSx4MouotOygvzaXbaSrc/wGDFWPo= @@ -1163,27 +1197,35 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= -github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= +github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.116.0 h1:Kxk5Ral+Dc6VB9UmTketVjs+rbMZP8JxQ4SXDx4RivQ= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.116.0/go.mod h1:ctT6oQmGmWGGGgUIKyx2fDwqz77N9+04gqKkDyAzKCg= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0 h1:RlEK9MbxWyBHbLel8EJ1L7DbYVLai9dZL6Ljl2cBgyA= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.116.0/go.mod h1:AVUEyIjPb+0ARr7mhIkZkdNg3fd0ZcRhzAi53oZhl1Q= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0 h1:jwnZYRBuPJnsKXE5H6ZvTEm91bXW5VP8+tLewzl54eg= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.116.0/go.mod h1:NT3Ag+DdnIAZQfD7l7OHwlYqnaAJ19SoPZ0nhD9yx4s= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor v0.116.0 h1:ZBmLuipJv7BT9fho/2yAFsS8AtMsCOCe4ON8oqkX3n8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor v0.116.0/go.mod h1:f0GdYWGxUunyRZ088gHnoX78pc/gZc3dQlRtidiGXzg= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opencontainers/runc v1.1.10 h1:EaL5WeO9lv9wmS6SASjszOeQdSctvpbu0DdBQBizE40= github.com/opencontainers/runc v1.1.10/go.mod h1:+/R6+KmDlh+hOO8NkjmgkG9Qzvypzk0yXxAPYYR65+M= -github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e h1:4cPxUYdgaGzZIT5/j0IfqOrrXmq6bG8AwvwisMXpdrg= -github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= -github.com/opentracing-contrib/go-stdlib v1.0.0 h1:TBS7YuVotp8myLon4Pv7BtCBzOTo1DeZCld0Z63mW2w= -github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing-contrib/go-grpc v0.1.1 h1:Ws7IN1zyiL1DFqKQPhRXuKe5pLYzMfdxnC1qtajE2PE= +github.com/opentracing-contrib/go-grpc v0.1.1/go.mod h1:Nu6sz+4zzgxXu8rvKfnwjBEmHsuhTigxRwV2RhELrS8= +github.com/opentracing-contrib/go-stdlib v1.1.0 h1:cZBWc4pA4e65tqTJddbflK435S0tDImj6c9BMvkdUH0= +github.com/opentracing-contrib/go-stdlib v1.1.0/go.mod h1:S0p+X9p6dcBkoMTL+Qq2VOvxKs9ys5PpYWXWqlCS0bQ= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU= github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= @@ -1197,8 +1239,6 @@ github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0Mw github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= @@ -1209,8 +1249,8 @@ github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+v github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= -github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= @@ -1223,6 +1263,8 @@ github.com/pion/transport/v2 v2.2.1 h1:7qYnCBlpgSJNYMbLCKuSY9KbQdBFoETvPNETv0y4N github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= github.com/pion/transport/v3 v3.0.1 h1:gDTlPJwROfSfz6QfSi0ZmeCSkFcnWWiiR9ES0ouANiM= github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= +github.com/pires/go-proxyproto v0.7.0 h1:IukmRewDQFWC7kfnb66CSomk2q/seBuilHBYFwyq0Hs= +github.com/pires/go-proxyproto v0.7.0/go.mod h1:Vz/1JPY/OACxWGQNIRY2BeyDmpoaWmEP40O9LbuiFR4= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -1239,19 +1281,20 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pressly/goose/v3 v3.21.1 h1:5SSAKKWej8LVVzNLuT6KIvP1eFDuPvxa+B6H0w78buQ= github.com/pressly/goose/v3 v3.21.1/go.mod h1:sqthmzV8PitchEkjecFJII//l43dLOCzfWh8pHEe+vE= -github.com/prometheus/alertmanager v0.27.0 h1:V6nTa2J5V4s8TG4C4HtrBP/WNSebCCTYGGv4qecA/+I= -github.com/prometheus/alertmanager v0.27.0/go.mod h1:8Ia/R3urPmbzJ8OsdvmZvIprDwvwmYCmUbwBL+jlPOE= +github.com/prometheus/alertmanager v0.28.0 h1:sLN+6HhZet8hrbmGHLAHWsTXgZSVCvq9Ix3U3wvivqc= +github.com/prometheus/alertmanager v0.28.0/go.mod h1:/okSnb2LlodbMlRoOWQEKtqI/coOo2NKZDm2Hu9QHLQ= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1262,13 +1305,10 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= -github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= -github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= -github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= -github.com/prometheus/exporter-toolkit v0.11.0 h1:yNTsuZ0aNCNFQ3aFTD2uhPOvr4iD7fdBvKPAEGkNf+g= -github.com/prometheus/exporter-toolkit v0.11.0/go.mod h1:BVnENhnNecpwoTLiABx7mrPB/OLRIgN74qlQbV+FK1Q= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/exporter-toolkit v0.13.2 h1:Z02fYtbqTMy2i/f+xZ+UK5jy/bl1Ex3ndzh06T/Q9DQ= +github.com/prometheus/exporter-toolkit v0.13.2/go.mod h1:tCqnfx21q6qN1KA4U3Bfb8uWzXfijIrJz3/kTIqMV7g= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= @@ -1276,10 +1316,16 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ= -github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY= +github.com/prometheus/prometheus v0.302.0 h1:47EsaoBRroS2ekSyMSOPIjXwYnY/mxoFk0xt2dkFvfI= +github.com/prometheus/prometheus v0.302.0/go.mod h1:YcyCoTbUR/TM8rY3Aoeqr0AWTu/pu1Ehh+trpX3eRzg= +github.com/prometheus/sigv4 v0.1.1 h1:UJxjOqVcXctZlwDjpUpZ2OiMWJdFijgSofwLzO1Xk0Q= +github.com/prometheus/sigv4 v0.1.1/go.mod h1:RAmWVKqx0bwi0Qm4lrKMXFM0nhpesBcenfCtz9qRyH8= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= +github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw= +github.com/redis/rueidis v1.0.19 h1:s65oWtotzlIFN8eMPhyYwxlwLR1lUdhza2KtWprKYSo= +github.com/redis/rueidis v1.0.19/go.mod h1:8B+r5wdnjwK3lTFml5VtxjzGOQAC+5UmujoD12pDrEo= 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/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= @@ -1296,8 +1342,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= @@ -1322,8 +1368,8 @@ github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPO github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29 h1:BkTk4gynLjguayxrYxZoMZjBnAOh7ntQvUkOFmkMqPU= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.29/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30 h1:yoKAVkEVwAqbGbR8n87rHQ1dulL25rKloGadb3vm770= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30/go.mod h1:sH0u6fq6x4R5M7WxkoQFY/o7UaiItec0o1LinLCJNq8= github.com/scylladb/go-reflectx v1.0.1 h1:b917wZM7189pZdlND9PbIJ6NQxfDPfBvUaQ7cjj1iZQ= github.com/scylladb/go-reflectx v1.0.1/go.mod h1:rWnOfDIRWBGN0miMLIcoPt/Dhi2doCMZqwMCJ3KupFc= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= @@ -1375,8 +1421,8 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0/go.mod h1:YQuXIqQpmpAqstWV0LHaDTJ5nsSWuip5ivEM+Fisb+4= -github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= -github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= +github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e h1:QBG+Wn5rHAi4gjnBAq6x6CZj/GjWAahFjj81VhQEu6U= +github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e/go.mod h1:2yUpKW1/jFxpozO/Zkh3fKDzI0jthXoEcU2xuDq+vlo= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= @@ -1405,8 +1451,8 @@ github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 h1:V github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0/go.mod h1:lyAu+oMXdNUzEDScj2DXB2IueY+SDXPPfyl/kb63tMM= github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 h1:Yf+n3T/fnUWcYyfe7bsygV4sWAkNo0QhN58APJFIKIc= github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10/go.mod h1:05duR85P8YHuIfIkA7sn2bvrhKo/pDpFKV2rliYHNOo= -github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2 h1:7bCdbTUWzyczQg+kwHCxlx6y07zE8HNB8+ntTne6qd8= -github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2/go.mod h1:MltlNu3jcXm/DyLN98I5TFNtu/o1NNAcaPAFKMXWk70= +github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.6-0.20250224181213-3514fc5f737a h1:XRCVgs+3owPjWq35C58wxZyHxdAzSjq5V8BgLF3Ci5U= +github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.6-0.20250224181213-3514fc5f737a/go.mod h1:AfMr/qKm4WNDlyXjd7ElKYFmoj0u3HCXwI6/f5tqIrg= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= github.com/smartcontractkit/libocr v0.0.0-20250220133800-f3b940c4f298 h1:PKiqnVOTChlH4a4ljJKL3OKGRgYfIpJS4YD1daAIKks= @@ -1423,10 +1469,8 @@ github.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60= -github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/sony/gobreaker v0.5.0 h1:dRCvqm0P490vZPmy7ppEk2qCnCieBooFJ+YoXGYB+yg= -github.com/sony/gobreaker v0.5.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sony/gobreaker/v2 v2.1.0 h1:av2BnjtRmVPWBvy5gSFPytm1J8BmN5AGhq875FfGKDM= +github.com/sony/gobreaker/v2 v2.1.0/go.mod h1:dO3Q/nCzxZj6ICjH6J/gM0r4oAwBMVLY8YAQf+NTtUg= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -1434,8 +1478,8 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= +github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= @@ -1447,8 +1491,9 @@ github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3k github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= @@ -1478,6 +1523,8 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203 h1:QVqDTf3h2WHt08YuiTGPZLls0Wq99X9bWd0Q5ZSBesM= +github.com/stvp/tempredis v0.0.0-20181119212430-b82af8480203/go.mod h1:oqN97ltKNihBbwlX8dLpwxCl3+HnXKV/R0e+sRLd9C8= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= @@ -1502,10 +1549,14 @@ github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tjhop/slog-gokit v0.1.3 h1:6SdexP3UIeg93KLFeiM1Wp1caRwdTLgsD/THxBUy1+o= +github.com/tjhop/slog-gokit v0.1.3/go.mod h1:Bbu5v2748qpAWH7k6gse/kw3076IJf6owJmh7yArmJs= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= +github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= @@ -1553,8 +1604,8 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE= -github.com/yuin/gopher-lua v1.1.0/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= +github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M= +github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= @@ -1575,8 +1626,8 @@ go.dedis.ch/kyber/v3 v3.1.0/go.mod h1:kXy7p3STAurkADD+/aZcsznZGKVHEqbtmdIzvPfrs1 go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= -go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= -go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= +go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk= +go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.14 h1:vHObSCxyB9zlF60w7qzAdTcGaglbJOpSj1Xj9+WGxq0= go.etcd.io/etcd/api/v3 v3.5.14/go.mod h1:BmtWcRlQvwa1h3G2jvKYwIQy4PkHlDej5t7uLMUdJUU= @@ -1586,8 +1637,8 @@ go.etcd.io/etcd/client/pkg/v3 v3.5.14/go.mod h1:8uMgAokyG1czCtIdsq+AGyYQMvpIKnSv go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v3 v3.5.14 h1:CWfRs4FDaDoSz81giL7zPpZH2Z35tbOrAJkkjMqOupg= go.etcd.io/etcd/client/v3 v3.5.14/go.mod h1:k3XfdV/VIHy/97rqWjoUzrj9tk7GgJGH9J8L4dNXmAk= -go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= -go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.mongodb.org/mongo-driver v1.17.0 h1:Hp4q2MCjvY19ViwimTs00wHi7G4yzxh4/2+nTx8r40k= +go.mongodb.org/mongo-driver v1.17.0/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1595,52 +1646,84 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/collector/pdata v1.12.0 h1:Xx5VK1p4VO0md8MWm2icwC1MnJ7f8EimKItMWw46BmA= -go.opentelemetry.io/collector/pdata v1.12.0/go.mod h1:MYeB0MmMAxeM0hstCFrCqWLzdyeYySim2dG6pDT6nYI= -go.opentelemetry.io/collector/semconv v0.105.0 h1:8p6dZ3JfxFTjbY38d8xlQGB1TQ3nPUvs+D0RERniZ1g= -go.opentelemetry.io/collector/semconv v0.105.0/go.mod h1:yMVUCNoQPZVq/IPfrHrnntZTWsLf5YGZ7qwKulIl5hw= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v0.118.0 h1:sSO/ObxJ+yH77Z4DmT1mlSuxhbgUmY1ztt7xCA1F/8w= +go.opentelemetry.io/collector/component v0.118.0/go.mod h1:LUJ3AL2b+tmFr3hZol3hzKzCMvNdqNq0M5CF3SWdv4M= +go.opentelemetry.io/collector/component/componentstatus v0.118.0 h1:1aCIdUjqz0noKNQr1v04P+lwF89Lkua5U7BhH9IAxkE= +go.opentelemetry.io/collector/component/componentstatus v0.118.0/go.mod h1:ynO1Nyj0t1h6x/djIMJy35bhnnWEc2mlQaFgDNUO504= +go.opentelemetry.io/collector/component/componenttest v0.118.0 h1:knEHckoiL2fEWSIc0iehg39zP4IXzi9sHa45O+oxKo8= +go.opentelemetry.io/collector/component/componenttest v0.118.0/go.mod h1:aHc7t7zVwCpbhrWIWY+GMuaMxMCUP8C8P7pJOt8r/vU= +go.opentelemetry.io/collector/config/configtelemetry v0.118.0 h1:UlN46EViG2X42odWtXgWaqY7Y01ZKpsnswSwXTWx5mM= +go.opentelemetry.io/collector/config/configtelemetry v0.118.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/confmap v1.22.0 h1:ZKQzRuj5lKu+seKArAAZ1yPRroDPricaIVIREm/jr3w= +go.opentelemetry.io/collector/confmap v1.22.0/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec= +go.opentelemetry.io/collector/consumer v1.24.0 h1:7DeyBm9qdr1EPuCfPjWyChPK16DbVc0wZeSa9LZprFU= +go.opentelemetry.io/collector/consumer v1.24.0/go.mod h1:0G6jvZprIp4dpKMD1ZxCjriiP9GdFvFMObsQEtTk71s= +go.opentelemetry.io/collector/consumer/consumertest v0.118.0 h1:8AAS9ejQapP1zqt0+cI6u+AUBheT3X0171N9WtXWsVY= +go.opentelemetry.io/collector/consumer/consumertest v0.118.0/go.mod h1:spRM2wyGr4QZzqMHlLmZnqRCxqXN4Wd0piogC4Qb5PQ= +go.opentelemetry.io/collector/consumer/xconsumer v0.118.0 h1:guWnzzRqgCInjnYlOQ1BPrimppNGIVvnknAjlIbWXuY= +go.opentelemetry.io/collector/consumer/xconsumer v0.118.0/go.mod h1:C5V2d6Ys/Fi6k3tzjBmbdZ9v3J/rZSAMlhx4KVcMIIg= +go.opentelemetry.io/collector/pdata v1.26.0 h1:o7nP0RTQOG0LXk55ZZjLrxwjX8x3wHF7Z7xPeOaskEA= +go.opentelemetry.io/collector/pdata v1.26.0/go.mod h1:18e8/xDZsqyj00h/5HM5GLdJgBzzG9Ei8g9SpNoiMtI= +go.opentelemetry.io/collector/pdata/pprofile v0.118.0 h1:VK/fr65VFOwEhsSGRPj5c3lCv0yIK1Kt0sZxv9WZBb8= +go.opentelemetry.io/collector/pdata/pprofile v0.118.0/go.mod h1:eJyP/vBm179EghV3dPSnamGAWQwLyd+4z/3yG54YFoQ= +go.opentelemetry.io/collector/pdata/testdata v0.118.0 h1:5N0w1SX9KIRkwvtkrpzQgXy9eGk3vfNG0ds6mhEPMIM= +go.opentelemetry.io/collector/pdata/testdata v0.118.0/go.mod h1:UY+GHV5bOC1BnFburOZ0wiHReJj1XbW12mi2Ogbc5Lw= +go.opentelemetry.io/collector/pipeline v0.118.0 h1:RI1DMe7L0+5hGkx0EDGxG00TaJoh96MEQppgOlGx1Oc= +go.opentelemetry.io/collector/pipeline v0.118.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/processor v0.118.0 h1:NlqWiTTpPP+EPbrqTcNP9nh/4O4/9U9RGWVB49xo4ws= +go.opentelemetry.io/collector/processor v0.118.0/go.mod h1:Y8OD7wk51oPuBqrbn1qXIK91AbprRHP76hlvEzC24U4= +go.opentelemetry.io/collector/processor/processortest v0.118.0 h1:VfTLHuIaJWGyUmrvAOvf63gPMf1vAW68/jtJClEsKtU= +go.opentelemetry.io/collector/processor/processortest v0.118.0/go.mod h1:ZFWxsSoafGNOEk83FtGz43M5ypUzAOvGnfT0aQTDHdU= +go.opentelemetry.io/collector/processor/xprocessor v0.118.0 h1:M/EMhPRbadHLpv7g99fBjfgyuYexBZmgQqb2vjTXjvM= +go.opentelemetry.io/collector/processor/xprocessor v0.118.0/go.mod h1:lkoQoCv2Cz+C0kf2VHgBUDYWDecZLLeaHEvHDXbBCXU= +go.opentelemetry.io/collector/semconv v0.118.0 h1:V4vlMIK7TIaemrrn2VawvQPwruIKpj7Xgw9P5+BL56w= +go.opentelemetry.io/collector/semconv v0.118.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0 h1:1f31+6grJmV3X4lxcEvUy13i5/kfDw1nJZwhd8mA4tg= go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0/go.mod h1:1P/02zM3OwkX9uki+Wmxw3a5GVb6KUXRsa7m7bOC9Fg= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= -go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= -go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 h1:UiRNKd1OgqsLbFwE+wkAWTdiAxXtCBqKIHeBIse4FUA= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9/go.mod h1:eqZlW3pJWhjyexnDPrdQxix1pn0wwhI4AO4GKpP/bMI= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 h1:QSKmLBzbFULSyHzOdO9JsN9lpE4zkrz1byYGmJecdVE= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0/go.mod h1:sTQ/NH8Yrirf0sJ5rWqVu+oT82i4zL9FaF6rWcqnptM= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0/go.mod h1:yeGZANgEcpdx/WK0IvvRFC+2oLiMS2u4L/0Rj2M2Qr0= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 h1:VrMAbeJz4gnVDg2zEzjHG4dEH86j4jO6VYB+NgtGD8s= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0/go.mod h1:qqN/uFdpeitTvm+JDqqnjm517pmQRYxTORbETHq5tOc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 h1:0MH3f8lZrflbUWXVxyBg/zviDFdGE062uKh5+fu8Vv0= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0/go.mod h1:Vh68vYiHY5mPdekTr0ox0sALsqjoVy0w3Os278yX5SQ= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 h1:BJee2iLkfRfl9lc7aFmBwkWxY/RI1RDdXepSF6y8TPE= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0/go.mod h1:DIzlHs3DRscCIBU3Y9YSzPfScwnYnzfnCd4g8zA7bZc= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= -go.opentelemetry.io/otel/log v0.6.0 h1:nH66tr+dmEgW5y+F9LanGJUBYPrRgP4g2EkmPE3LeK8= -go.opentelemetry.io/otel/log v0.6.0/go.mod h1:KdySypjQHhP069JX0z/t26VHwa8vSwzgaKmXtIB3fJM= -go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= -go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= -go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= -go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= -go.opentelemetry.io/otel/sdk/log v0.6.0 h1:4J8BwXY4EeDE9Mowg+CyhWVBhTSLXVXodiXxS/+PGqI= -go.opentelemetry.io/otel/sdk/log v0.6.0/go.mod h1:L1DN8RMAduKkrwRAFDEX3E3TLOq46+XMGSbUfHU/+vE= -go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= -go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= -go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= -go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.59.0 h1:iQZYNQ7WwIcYXzOPR46FQv9O0dS1PW16RjvR0TjDOe8= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.59.0/go.mod h1:54CaSNqYEXvpzDh8KPjiMVoWm60t5R0dZRt0leEPgAs= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= +go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 h1:5dTKu4I5Dn4P2hxyW3l3jTaZx9ACgg0ECos1eAVrheY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0/go.mod h1:P5HcUI8obLrCCmM3sbVBohZFH34iszk/+CPWuakZWL8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 h1:q/heq5Zh8xV1+7GoMGJpTxM2Lhq5+bFxB29tshuRuw0= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0/go.mod h1:leO2CSTg0Y+LyvmR7Wm4pUxE8KAmaM2GCVx7O+RATLA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 h1:ajl4QczuJVA2TU9W9AGw++86Xga/RKt//16z/yxPgdk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0/go.mod h1:Vn3/rlOJ3ntf/Q3zAI0V5lDnTbHGaUsNUeF6nZmm7pA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 h1:GKCEAZLEpEf78cUvudQdTg0aET2ObOZRB2HtXA0qPAI= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0/go.mod h1:9/zqSWLCmHT/9Jo6fYeUDRRogOLL60ABLsHWS99lF8s= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 h1:czJDQwFrMbOr9Kk+BPo1y8WZIIFIK58SA1kykuVeiOU= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0/go.mod h1:lT7bmsxOe58Tq+JIOkTQMCGXdu47oA+VJKLZHbaBKbs= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 h1:jBpDk4HAUsrnVO1FsfCfCOTEc/MkInJmvfCHYLFiT80= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0/go.mod h1:H9LUIM1daaeZaz91vZcfeM0fejXPmgCYE8ZhzqfJuiU= +go.opentelemetry.io/otel/log v0.10.0 h1:1CXmspaRITvFcjA4kyVszuG4HjA61fPDxMb7q3BuyF0= +go.opentelemetry.io/otel/log v0.10.0/go.mod h1:PbVdm9bXKku/gL0oFfUF4wwsQsOPlpo4VEqjvxih+FM= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= +go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/sdk/log v0.10.0 h1:lR4teQGWfeDVGoute6l0Ou+RpFqQ9vaPdrNJlST0bvw= +go.opentelemetry.io/otel/sdk/log v0.10.0/go.mod h1:A+V1UTWREhWAittaQEG4bYm4gAZa6xnvVu+xKrIRkzo= +go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= +go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= +go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1694,14 +1777,13 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1712,8 +1794,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc= -golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1742,8 +1824,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= -golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= +golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1762,7 +1844,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190921015927-1a5e07d1ff72/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1782,7 +1863,6 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -1791,20 +1871,18 @@ golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1817,9 +1895,8 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE= +golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1833,8 +1910,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1918,7 +1995,6 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1928,13 +2004,12 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= @@ -1942,8 +2017,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= -golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1953,20 +2028,19 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= -golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= +golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -2030,8 +2104,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= -golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= +golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= +golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2067,6 +2141,8 @@ google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjR google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.221.0 h1:qzaJfLhDsbMeFee8zBRdt/Nc+xmOuafD/dbdgGfutOU= +google.golang.org/api v0.221.0/go.mod h1:7sOU2+TL4TxUTdbi0gWgAIg7tH5qBXxoyhtL+9x3biQ= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2119,18 +2195,17 @@ google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU= -google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 h1:Pw6WnI9W/LIdRxqK7T6XGugGbHIRl5Q7q3BssH6xk4s= +google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4/go.mod h1:qbZzneIOXSq+KFAFut9krLfRLZiFLzZL5u2t8SV83EE= +google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2 h1:35ZFtrCgaAjF7AFAK0+lRSf+4AyYnWRbH7og13p7rZ4= +google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:W9ynFDP/shebLB1Hl/ESTOap2jHd6pmLXPNZC7SVDbA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 h1:DMTIbak9GhdaSxEjvVzAeNZvyc03I61duqNbnm3SU0M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -2147,8 +2222,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -2161,8 +2236,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= -google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2210,26 +2285,26 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -k8s.io/api v0.31.2 h1:3wLBbL5Uom/8Zy98GRPXpJ254nEFpl+hwndmk9RwmL0= -k8s.io/api v0.31.2/go.mod h1:bWmGvrGPssSK1ljmLzd3pwCQ9MgoTsRCuK35u6SygUk= +k8s.io/api v0.32.2 h1:bZrMLEkgizC24G9eViHGOPbW+aRo9duEISRIJKfdJuw= +k8s.io/api v0.32.2/go.mod h1:hKlhk4x1sJyYnHENsrdCWw31FEmCijNGPJO5WzHiJ6Y= k8s.io/apiextensions-apiserver v0.31.0 h1:fZgCVhGwsclj3qCw1buVXCV6khjRzKC5eCFt24kyLSk= k8s.io/apiextensions-apiserver v0.31.0/go.mod h1:b9aMDEYaEe5sdK+1T0KU78ApR/5ZVp4i56VacZYEHxk= -k8s.io/apimachinery v0.31.2 h1:i4vUt2hPK56W6mlT7Ry+AO8eEsyxMD1U44NR22CLTYw= -k8s.io/apimachinery v0.31.2/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/apimachinery v0.32.2 h1:yoQBR9ZGkA6Rgmhbp/yuT9/g+4lxtsGYwW6dR6BDPLQ= +k8s.io/apimachinery v0.32.2/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= k8s.io/cli-runtime v0.31.2 h1:7FQt4C4Xnqx8V1GJqymInK0FFsoC+fAZtbLqgXYVOLQ= k8s.io/cli-runtime v0.31.2/go.mod h1:XROyicf+G7rQ6FQJMbeDV9jqxzkWXTYD6Uxd15noe0Q= -k8s.io/client-go v0.31.2 h1:Y2F4dxU5d3AQj+ybwSMqQnpZH9F30//1ObxOKlTI9yc= -k8s.io/client-go v0.31.2/go.mod h1:NPa74jSVR/+eez2dFsEIHNa+3o09vtNaWwWwb1qSxSs= +k8s.io/client-go v0.32.2 h1:4dYCD4Nz+9RApM2b/3BtVvBHw54QjMFUl1OLcJG5yOA= +k8s.io/client-go v0.32.2/go.mod h1:fpZ4oJXclZ3r2nDOv+Ux3XcJutfrwjKTCHz2H3sww94= k8s.io/component-base v0.31.2 h1:Z1J1LIaC0AV+nzcPRFqfK09af6bZ4D1nAOpWsy9owlA= k8s.io/component-base v0.31.2/go.mod h1:9PeyyFN/drHjtJZMCTkSpQJS3U9OXORnHQqMLDz0sUQ= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f h1:2sXuKesAYbRHxL3aE2PN6zX/gcJr22cjrsej+W784Tc= -k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f/go.mod h1:UxDHUPsUwTOOxSU+oXURfFBcAS6JwiRXTYqYwfuGowc= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= k8s.io/kubectl v0.31.2 h1:gTxbvRkMBwvTSAlobiTVqsH6S8Aa1aGyBcu5xYLsn8M= k8s.io/kubectl v0.31.2/go.mod h1:EyASYVU6PY+032RrTh5ahtSOMgoDRIux9V1JLKtG5xM= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 h1:jGnCPejIetjiy2gqaJ5V0NLwTpF4wbQ6cZIItJCSHno= +k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk= @@ -2254,13 +2329,13 @@ rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sigs.k8s.io/controller-runtime v0.19.0 h1:nWVM7aq+Il2ABxwiCizrVDSlmDcshi9llbaFbC0ji/Q= sigs.k8s.io/controller-runtime v0.19.0/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= -sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= sigs.k8s.io/kustomize/api v0.17.2 h1:E7/Fjk7V5fboiuijoZHgs4aHuexi5Y2loXlVOAVAG5g= sigs.k8s.io/kustomize/api v0.17.2/go.mod h1:UWTz9Ct+MvoeQsHcJ5e+vziRRkwimm3HytpZgIYqye0= sigs.k8s.io/kustomize/kyaml v0.17.1 h1:TnxYQxFXzbmNG6gOINgGWQt09GghzgTP6mIurOgrLCQ= sigs.k8s.io/kustomize/kyaml v0.17.1/go.mod h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= -sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/integration-tests/load/zcluster/cluster_entrypoint_test.go b/integration-tests/load/zcluster/cluster_entrypoint_test.go deleted file mode 100644 index 0f3ea5e4044..00000000000 --- a/integration-tests/load/zcluster/cluster_entrypoint_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package zcluster - -import ( - "testing" - - "github.com/stretchr/testify/require" - - "github.com/smartcontractkit/chainlink-testing-framework/wasp" - - tc "github.com/smartcontractkit/chainlink/integration-tests/testconfig" -) - -func TestClusterEntrypoint(t *testing.T) { - config, err := tc.GetConfig([]string{"Load"}, tc.OCR) - require.NoError(t, err) - cfgBase64, err := config.AsBase64() - require.NoError(t, err) - p, err := wasp.NewClusterProfile(&wasp.ClusterConfig{ - // you set up these only once, no need to configure through TOML - DockerCmdExecPath: "../../..", - BuildCtxPath: "integration-tests/load", - Namespace: *config.WaspConfig.Namespace, - KeepJobs: config.WaspConfig.KeepJobs, - UpdateImage: config.WaspConfig.UpdateImage, - HelmValues: map[string]string{ - "env.loki.url": *config.Logging.Loki.Endpoint, - "env.loki.tenant_id": *config.Logging.Loki.TenantId, - "image": *config.WaspConfig.RepoImageVersionURI, - "test.binaryName": *config.WaspConfig.TestBinaryName, - "test.name": *config.WaspConfig.TestName, - "test.timeout": *config.WaspConfig.TestTimeout, - "env.wasp.log_level": *config.WaspConfig.WaspLogLevel, - "jobs": *config.WaspConfig.WaspJobs, - // other test vars pass through - "test.BASE64_CONFIG_OVERRIDE": cfgBase64, - }, - }) - require.NoError(t, err) - err = p.Run() - require.NoError(t, err) -} diff --git a/plugins/chainlink.Dockerfile b/plugins/chainlink.Dockerfile index c5e8a6810dd..6d756b824d0 100644 --- a/plugins/chainlink.Dockerfile +++ b/plugins/chainlink.Dockerfile @@ -1,5 +1,5 @@ # Build image: Chainlink binary -FROM golang:1.23-bullseye as buildgo +FROM golang:1.24-bullseye as buildgo RUN go version WORKDIR /chainlink diff --git a/system-tests/lib/go.mod b/system-tests/lib/go.mod index 3146bd65a37..ab95c146d37 100644 --- a/system-tests/lib/go.mod +++ b/system-tests/lib/go.mod @@ -1,6 +1,8 @@ module github.com/smartcontractkit/chainlink/system-tests/lib -go 1.23.3 +go 1.24 + +toolchain go1.24.0 require ( github.com/smartcontractkit/chainlink/deployment v0.0.0-20250221182743-098d1b0a763a @@ -22,7 +24,7 @@ require ( github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.4 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.23 github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 - google.golang.org/grpc v1.67.1 + google.golang.org/grpc v1.70.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -39,7 +41,7 @@ require ( github.com/DataDog/zstd v1.5.2 // indirect github.com/Khan/genqlient v0.7.0 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect - github.com/Masterminds/semver/v3 v3.3.0 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/NethermindEth/juno v0.3.1 // indirect github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb // indirect @@ -141,9 +143,9 @@ require ( github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/fatih/camelcase v1.0.0 // indirect - github.com/fatih/color v1.17.0 // indirect + github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.8 // indirect github.com/gagliardetto/binary v0.8.0 // indirect @@ -156,7 +158,7 @@ require ( github.com/gin-gonic/gin v1.10.0 // indirect github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect github.com/go-errors/errors v1.4.2 // indirect - github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 // indirect + github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-ldap/ldap/v3 v3.4.6 // indirect @@ -169,23 +171,23 @@ require ( github.com/go-openapi/swag 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.24.0 // indirect + github.com/go-playground/validator/v10 v10.25.0 // indirect github.com/go-resty/resty/v2 v2.15.3 // indirect - github.com/go-viper/mapstructure/v2 v2.1.0 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // 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.3 // indirect + github.com/goccy/go-json v0.10.5 // 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 github.com/gogo/protobuf v1.3.3 // indirect github.com/golang-jwt/jwt/v4 v4.5.1 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect - github.com/golang/glog v1.2.2 // indirect + github.com/golang/glog v1.2.3 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/btree v1.1.2 // indirect + github.com/google/btree v1.1.3 // indirect github.com/google/flatbuffers v24.3.25+incompatible // indirect github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect github.com/google/go-cmp v0.6.0 // indirect @@ -203,9 +205,9 @@ require ( github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect - github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect @@ -215,11 +217,11 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-envparse v0.1.0 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect - github.com/hashicorp/go-plugin v1.6.2 // indirect + github.com/hashicorp/go-plugin v1.6.3 // indirect github.com/hashicorp/go-retryablehttp v0.7.7 // indirect - github.com/hashicorp/golang-lru v0.6.0 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hashicorp/yamux v0.1.2 // indirect github.com/hasura/go-graphql-client v0.13.1 // indirect github.com/hdevalence/ed25519consensus v0.2.0 // indirect github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect @@ -229,7 +231,7 @@ require ( github.com/iancoleman/strcase v0.3.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/invopop/jsonschema v0.12.0 // indirect + github.com/invopop/jsonschema v0.13.0 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgconn v1.14.3 // indirect github.com/jackc/pgio v1.0.0 // indirect @@ -249,8 +251,8 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52 // indirect github.com/kelseyhightower/envconfig v1.4.0 // indirect - github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.8 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // 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 @@ -263,18 +265,18 @@ require ( github.com/logrusorgru/aurora v2.0.3+incompatible // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/mailru/easyjson v0.9.0 // indirect github.com/marcboeker/go-duckdb v1.8.3 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mfridman/interpolate v0.0.2 // indirect - github.com/miekg/dns v1.1.61 // indirect + github.com/miekg/dns v1.1.63 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect github.com/mitchellh/pointerstructure v1.2.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect @@ -304,23 +306,23 @@ require ( github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect - github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pion/dtls/v2 v2.2.7 // indirect github.com/pion/logging v0.2.2 // indirect github.com/pion/stun/v2 v2.0.0 // indirect github.com/pion/transport/v2 v2.2.1 // indirect github.com/pion/transport/v3 v3.0.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/pressly/goose/v3 v3.21.1 // indirect - github.com/prometheus/client_golang v1.20.5 // indirect + github.com/prometheus/client_golang v1.21.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.60.1 // indirect + github.com/prometheus/common v0.62.0 // indirect github.com/prometheus/procfs v0.15.1 // 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 + github.com/rs/cors v1.11.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect @@ -340,7 +342,7 @@ require ( github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect - github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect + github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb // indirect @@ -356,10 +358,10 @@ require ( github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de // indirect github.com/smartcontractkit/wsrpc v0.8.3 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/afero v1.12.0 // indirect github.com/spf13/cast v1.7.1 // indirect github.com/spf13/cobra v1.8.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/spf13/viper v1.19.0 // indirect github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 // indirect github.com/stretchr/objx v0.5.2 // indirect @@ -373,8 +375,8 @@ require ( github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tklauser/go-sysconf v0.3.13 // indirect + github.com/tklauser/numcpus v0.7.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect github.com/urfave/cli/v2 v2.27.5 // indirect @@ -389,52 +391,53 @@ require ( github.com/zondax/ledger-go v0.14.3 // indirect go.dedis.ch/fixbuf v1.0.3 // indirect go.dedis.ch/kyber/v3 v3.1.0 // indirect - go.etcd.io/bbolt v1.3.9 // indirect - go.mongodb.org/mongo-driver v1.15.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.etcd.io/bbolt v1.4.0 // indirect + go.mongodb.org/mongo-driver v1.17.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect - go.opentelemetry.io/otel v1.31.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 // indirect - go.opentelemetry.io/otel/log v0.6.0 // indirect - go.opentelemetry.io/otel/metric v1.31.0 // indirect - go.opentelemetry.io/otel/sdk v1.31.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.6.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.31.0 // indirect - go.opentelemetry.io/otel/trace v1.31.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.opentelemetry.io/otel v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 // indirect + go.opentelemetry.io/otel/log v0.10.0 // indirect + go.opentelemetry.io/otel/metric v1.34.0 // indirect + go.opentelemetry.io/otel/sdk v1.34.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.10.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect + go.opentelemetry.io/otel/trace v1.34.0 // indirect + go.opentelemetry.io/proto/otlp v1.5.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/ratelimit v0.3.1 // indirect go.uber.org/zap v1.27.0 // indirect golang.org/x/arch v0.11.0 // indirect - golang.org/x/crypto v0.32.0 // indirect - golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c // indirect - golang.org/x/mod v0.22.0 // indirect - golang.org/x/net v0.34.0 // indirect - golang.org/x/oauth2 v0.23.0 // indirect - golang.org/x/sync v0.10.0 // indirect - golang.org/x/sys v0.29.0 // indirect - golang.org/x/term v0.28.0 // indirect - golang.org/x/text v0.21.0 // indirect - golang.org/x/time v0.7.0 // indirect - golang.org/x/tools v0.29.0 // indirect + golang.org/x/crypto v0.33.0 // indirect + golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa // indirect + golang.org/x/mod v0.23.0 // indirect + golang.org/x/net v0.35.0 // indirect + golang.org/x/oauth2 v0.26.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/term v0.29.0 // indirect + golang.org/x/text v0.22.0 // indirect + golang.org/x/time v0.10.0 // indirect + golang.org/x/tools v0.30.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect gonum.org/v1/gonum v0.15.1 // indirect - google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect - google.golang.org/protobuf v1.36.4 // indirect + google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 // indirect + google.golang.org/protobuf v1.36.5 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/guregu/null.v4 v4.0.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect @@ -450,7 +453,7 @@ require ( k8s.io/klog/v2 v2.130.1 // indirect k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f // indirect k8s.io/kubectl v0.31.2 // indirect - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect + k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 // indirect pgregory.net/rapid v1.1.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/controller-runtime v0.19.0 // indirect diff --git a/system-tests/lib/go.sum b/system-tests/lib/go.sum index 41a96a447f0..ee9533a8fdb 100644 --- a/system-tests/lib/go.sum +++ b/system-tests/lib/go.sum @@ -76,8 +76,8 @@ github.com/Khan/genqlient v0.7.0/go.mod h1:HNyy3wZvuYwmW3Y7mkoQLZsa/R5n5yIRajS1k github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= -github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NethermindEth/juno v0.3.1 h1:AW72LiAm9gqUeCVJWvepnZcTnpU4Vkl0KzPMxS+42FA= @@ -383,8 +383,8 @@ github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8 github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -394,8 +394,8 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= 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.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= @@ -435,8 +435,8 @@ github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3Bop github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 h1:ymLjT4f35nQbASLnvxEde4XOBL+Sn7rFuV+FOJqkljg= -github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0/go.mod h1:6daplAwHHGbUGib4990V3Il26O0OC4aRyvewaaAihaA= +github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa h1:Rpu6sKAzIeSWBkrFHD52g8yipagcPbY2Lmm70NL1Gzc= +github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa/go.mod h1:TiCD2a1pcmjd7YnhGH0f/zKNcCD06B029pHhzV23c2M= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -469,8 +469,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.24.0 h1:KHQckvo8G6hlWnrPX4NJJ+aBfWNAE/HH+qdL2cBpCmg= -github.com/go-playground/validator/v10 v10.24.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= +github.com/go-playground/validator/v10 v10.25.0 h1:5Dh7cjvzR7BRZadnsVOzPhWsrwUr0nmsZJxEAnFLNO8= +github.com/go-playground/validator/v10 v10.25.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= github.com/go-resty/resty/v2 v2.15.3 h1:bqff+hcqAflpiF591hhJzNdkRsFhlB96CYfBwSFvql8= github.com/go-resty/resty/v2 v2.15.3/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= @@ -480,14 +480,14 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg78 github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/go-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpGyP1XxdC/w= -github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-webauthn/webauthn v0.9.4 h1:YxvHSqgUyc5AK2pZbqkWWR55qKeDPhP8zLDr6lpIc2g= github.com/go-webauthn/webauthn v0.9.4/go.mod h1:LqupCtzSef38FcxzaklmOn7AykGKhAhr9xlRbdbgnTw= 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/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-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/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= @@ -505,8 +505,8 @@ github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= -github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.3 h1:oDTdz9f5VGVVNGu/Q7UXKWYsD0873HXLHdJUNBsSEKM= +github.com/golang/glog v1.2.3/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -548,8 +548,8 @@ github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXi github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU= @@ -610,10 +610,10 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY= @@ -634,12 +634,12 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaW github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0 h1:FbSCl+KggFl+Ocym490i/EyXF4lPgLoUtcSWquBM0Rs= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0/go.mod h1:qOchhhIlmRcqk/O9uCo/puJlyo07YINaIqdZfZG3Jkc= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= @@ -670,8 +670,8 @@ github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8Io github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-plugin v1.6.2 h1:zdGAEd0V1lCaU0u+MxWQhtSDQmahpkwOun8U8EiRVog= -github.com/hashicorp/go-plugin v1.6.2/go.mod h1:CkgLQ5CZqNmdL9U9JzM532t8ZiYQ35+pj3b1FD37R0Q= +github.com/hashicorp/go-plugin v1.6.3 h1:xgHB+ZUSYeuJi96WtxEjzi23uh7YQpznjGh0U0UUrwg= +github.com/hashicorp/go-plugin v1.6.3/go.mod h1:MRobyh+Wc/nYy1V4KAXUiYfzxoYhs7V1mlH1Z7iY2h0= github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= @@ -682,8 +682,8 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= -github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -692,8 +692,8 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= +github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= github.com/hasura/go-graphql-client v0.13.1 h1:kKbjhxhpwz58usVl+Xvgah/TDha5K2akNTRQdsEHN6U= github.com/hasura/go-graphql-client v0.13.1/go.mod h1:k7FF7h53C+hSNFRG3++DdVZWIuHdCaTbI7siTJ//zGQ= github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= @@ -718,8 +718,8 @@ github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+h github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= -github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= +github.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E= +github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -806,11 +806,11 @@ github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -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/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -854,8 +854,8 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f h1:tVvGiZQFjOXP+9YyGqSA6jE55x1XVxmoPYudncxrZ8U= github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f/go.mod h1:Z60vy0EZVSu0bOugCHdcN5ZxFMKSpjRgsnh0XKPFqqk= github.com/marcboeker/go-duckdb v1.8.3 h1:ZkYwiIZhbYsT6MmJsZ3UPTHrTZccDdM4ztoqSlEMXiQ= @@ -865,8 +865,9 @@ github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcncea github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -886,8 +887,8 @@ github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6B github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= -github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= +github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY= +github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= @@ -909,8 +910,8 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY= +github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= @@ -985,8 +986,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU= github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks= @@ -1004,8 +1005,8 @@ github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+v github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= -github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= @@ -1028,21 +1029,22 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pressly/goose/v3 v3.21.1 h1:5SSAKKWej8LVVzNLuT6KIvP1eFDuPvxa+B6H0w78buQ= github.com/pressly/goose/v3 v3.21.1/go.mod h1:sqthmzV8PitchEkjecFJII//l43dLOCzfWh8pHEe+vE= -github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= -github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ= -github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY= +github.com/prometheus/prometheus v0.302.0 h1:47EsaoBRroS2ekSyMSOPIjXwYnY/mxoFk0xt2dkFvfI= +github.com/prometheus/prometheus v0.302.0/go.mod h1:YcyCoTbUR/TM8rY3Aoeqr0AWTu/pu1Ehh+trpX3eRzg= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= @@ -1061,8 +1063,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= @@ -1128,8 +1130,8 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0/go.mod h1:YQuXIqQpmpAqstWV0LHaDTJ5nsSWuip5ivEM+Fisb+4= -github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= -github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= +github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e h1:QBG+Wn5rHAi4gjnBAq6x6CZj/GjWAahFjj81VhQEu6U= +github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e/go.mod h1:2yUpKW1/jFxpozO/Zkh3fKDzI0jthXoEcU2xuDq+vlo= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= @@ -1177,8 +1179,8 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= +github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= @@ -1190,8 +1192,9 @@ github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3k github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= @@ -1245,10 +1248,12 @@ github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= +github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -1307,13 +1312,13 @@ go.dedis.ch/kyber/v3 v3.1.0/go.mod h1:kXy7p3STAurkADD+/aZcsznZGKVHEqbtmdIzvPfrs1 go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= -go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= -go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= +go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk= +go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= -go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.mongodb.org/mongo-driver v1.17.0 h1:Hp4q2MCjvY19ViwimTs00wHi7G4yzxh4/2+nTx8r40k= +go.mongodb.org/mongo-driver v1.17.0/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1321,48 +1326,50 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0 h1:1f31+6grJmV3X4lxcEvUy13i5/kfDw1nJZwhd8mA4tg= go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0/go.mod h1:1P/02zM3OwkX9uki+Wmxw3a5GVb6KUXRsa7m7bOC9Fg= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= -go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= -go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 h1:UiRNKd1OgqsLbFwE+wkAWTdiAxXtCBqKIHeBIse4FUA= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9/go.mod h1:eqZlW3pJWhjyexnDPrdQxix1pn0wwhI4AO4GKpP/bMI= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 h1:QSKmLBzbFULSyHzOdO9JsN9lpE4zkrz1byYGmJecdVE= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0/go.mod h1:sTQ/NH8Yrirf0sJ5rWqVu+oT82i4zL9FaF6rWcqnptM= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0/go.mod h1:yeGZANgEcpdx/WK0IvvRFC+2oLiMS2u4L/0Rj2M2Qr0= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 h1:VrMAbeJz4gnVDg2zEzjHG4dEH86j4jO6VYB+NgtGD8s= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0/go.mod h1:qqN/uFdpeitTvm+JDqqnjm517pmQRYxTORbETHq5tOc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 h1:0MH3f8lZrflbUWXVxyBg/zviDFdGE062uKh5+fu8Vv0= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0/go.mod h1:Vh68vYiHY5mPdekTr0ox0sALsqjoVy0w3Os278yX5SQ= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 h1:BJee2iLkfRfl9lc7aFmBwkWxY/RI1RDdXepSF6y8TPE= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0/go.mod h1:DIzlHs3DRscCIBU3Y9YSzPfScwnYnzfnCd4g8zA7bZc= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= -go.opentelemetry.io/otel/log v0.6.0 h1:nH66tr+dmEgW5y+F9LanGJUBYPrRgP4g2EkmPE3LeK8= -go.opentelemetry.io/otel/log v0.6.0/go.mod h1:KdySypjQHhP069JX0z/t26VHwa8vSwzgaKmXtIB3fJM= -go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= -go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= -go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= -go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= -go.opentelemetry.io/otel/sdk/log v0.6.0 h1:4J8BwXY4EeDE9Mowg+CyhWVBhTSLXVXodiXxS/+PGqI= -go.opentelemetry.io/otel/sdk/log v0.6.0/go.mod h1:L1DN8RMAduKkrwRAFDEX3E3TLOq46+XMGSbUfHU/+vE= -go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= -go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= -go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= -go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 h1:5dTKu4I5Dn4P2hxyW3l3jTaZx9ACgg0ECos1eAVrheY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0/go.mod h1:P5HcUI8obLrCCmM3sbVBohZFH34iszk/+CPWuakZWL8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 h1:q/heq5Zh8xV1+7GoMGJpTxM2Lhq5+bFxB29tshuRuw0= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0/go.mod h1:leO2CSTg0Y+LyvmR7Wm4pUxE8KAmaM2GCVx7O+RATLA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 h1:ajl4QczuJVA2TU9W9AGw++86Xga/RKt//16z/yxPgdk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0/go.mod h1:Vn3/rlOJ3ntf/Q3zAI0V5lDnTbHGaUsNUeF6nZmm7pA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 h1:GKCEAZLEpEf78cUvudQdTg0aET2ObOZRB2HtXA0qPAI= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0/go.mod h1:9/zqSWLCmHT/9Jo6fYeUDRRogOLL60ABLsHWS99lF8s= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 h1:czJDQwFrMbOr9Kk+BPo1y8WZIIFIK58SA1kykuVeiOU= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0/go.mod h1:lT7bmsxOe58Tq+JIOkTQMCGXdu47oA+VJKLZHbaBKbs= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 h1:jBpDk4HAUsrnVO1FsfCfCOTEc/MkInJmvfCHYLFiT80= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0/go.mod h1:H9LUIM1daaeZaz91vZcfeM0fejXPmgCYE8ZhzqfJuiU= +go.opentelemetry.io/otel/log v0.10.0 h1:1CXmspaRITvFcjA4kyVszuG4HjA61fPDxMb7q3BuyF0= +go.opentelemetry.io/otel/log v0.10.0/go.mod h1:PbVdm9bXKku/gL0oFfUF4wwsQsOPlpo4VEqjvxih+FM= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= +go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/sdk/log v0.10.0 h1:lR4teQGWfeDVGoute6l0Ou+RpFqQ9vaPdrNJlST0bvw= +go.opentelemetry.io/otel/sdk/log v0.10.0/go.mod h1:A+V1UTWREhWAittaQEG4bYm4gAZa6xnvVu+xKrIRkzo= +go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= +go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= +go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1417,8 +1424,8 @@ golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98y golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1429,8 +1436,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc= -golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1459,8 +1466,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= -golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= +golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1513,8 +1520,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1527,8 +1534,8 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE= +golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1542,8 +1549,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1627,8 +1634,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1640,8 +1647,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= -golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1657,13 +1664,13 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= -golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= +golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -1726,8 +1733,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= -golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= +golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= +golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1814,12 +1821,12 @@ google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU= -google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 h1:Pw6WnI9W/LIdRxqK7T6XGugGbHIRl5Q7q3BssH6xk4s= +google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4/go.mod h1:qbZzneIOXSq+KFAFut9krLfRLZiFLzZL5u2t8SV83EE= +google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2 h1:35ZFtrCgaAjF7AFAK0+lRSf+4AyYnWRbH7og13p7rZ4= +google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:W9ynFDP/shebLB1Hl/ESTOap2jHd6pmLXPNZC7SVDbA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 h1:DMTIbak9GhdaSxEjvVzAeNZvyc03I61duqNbnm3SU0M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1840,8 +1847,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1854,8 +1861,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= -google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1918,8 +1925,8 @@ k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f h1:2sXuKesAYbRHxL3aE2PN6z k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f/go.mod h1:UxDHUPsUwTOOxSU+oXURfFBcAS6JwiRXTYqYwfuGowc= k8s.io/kubectl v0.31.2 h1:gTxbvRkMBwvTSAlobiTVqsH6S8Aa1aGyBcu5xYLsn8M= k8s.io/kubectl v0.31.2/go.mod h1:EyASYVU6PY+032RrTh5ahtSOMgoDRIux9V1JLKtG5xM= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 h1:jGnCPejIetjiy2gqaJ5V0NLwTpF4wbQ6cZIItJCSHno= +k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk= diff --git a/system-tests/tests/go.mod b/system-tests/tests/go.mod index 75bb1fefc3b..41cd23bb6bd 100644 --- a/system-tests/tests/go.mod +++ b/system-tests/tests/go.mod @@ -1,6 +1,8 @@ module github.com/smartcontractkit/chainlink/system-tests/tests -go 1.23.3 +go 1.24 + +toolchain go1.24.0 // Using a separate `require` here to avoid surrounding line changes // creating potential merge conflicts. @@ -44,7 +46,7 @@ require ( github.com/DataDog/zstd v1.5.2 // indirect github.com/Khan/genqlient v0.7.0 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect - github.com/Masterminds/semver/v3 v3.3.0 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/NethermindEth/juno v0.3.1 // indirect github.com/NethermindEth/starknet.go v0.7.1-0.20240401080518-34a506f3cfdb // indirect @@ -146,9 +148,9 @@ require ( github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/fatih/camelcase v1.0.0 // indirect - github.com/fatih/color v1.17.0 // indirect + github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.8 // indirect github.com/gagliardetto/binary v0.8.0 // indirect @@ -160,7 +162,7 @@ require ( github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect github.com/go-errors/errors v1.4.2 // indirect - github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 // indirect + github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-ldap/ldap/v3 v3.4.6 // indirect @@ -173,21 +175,21 @@ require ( github.com/go-openapi/swag v0.23.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-resty/resty/v2 v2.15.3 // indirect - github.com/go-viper/mapstructure/v2 v2.1.0 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // 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.3 // indirect + github.com/goccy/go-json v0.10.5 // 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 github.com/gogo/protobuf v1.3.3 // indirect github.com/golang-jwt/jwt/v4 v4.5.1 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect - github.com/golang/glog v1.2.2 // indirect + github.com/golang/glog v1.2.3 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/btree v1.1.2 // indirect + github.com/google/btree v1.1.3 // indirect github.com/google/flatbuffers v24.3.25+incompatible // indirect github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect github.com/google/go-cmp v0.6.0 // indirect @@ -206,9 +208,9 @@ require ( github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect - github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect @@ -218,11 +220,11 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-envparse v0.1.0 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect - github.com/hashicorp/go-plugin v1.6.2 // indirect + github.com/hashicorp/go-plugin v1.6.3 // indirect github.com/hashicorp/go-retryablehttp v0.7.7 // indirect - github.com/hashicorp/golang-lru v0.6.0 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hashicorp/yamux v0.1.2 // indirect github.com/hasura/go-graphql-client v0.13.1 // indirect github.com/hdevalence/ed25519consensus v0.2.0 // indirect github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect @@ -232,7 +234,7 @@ require ( github.com/iancoleman/strcase v0.3.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/invopop/jsonschema v0.12.0 // indirect + github.com/invopop/jsonschema v0.13.0 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgconn v1.14.3 // indirect github.com/jackc/pgio v1.0.0 // indirect @@ -252,8 +254,8 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/karalabe/hid v1.0.1-0.20240306101548-573246063e52 // indirect github.com/kelseyhightower/envconfig v1.4.0 // indirect - github.com/klauspost/compress v1.17.11 // indirect - github.com/klauspost/cpuid/v2 v2.2.8 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // 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 @@ -266,18 +268,18 @@ require ( github.com/logrusorgru/aurora v2.0.3+incompatible // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/mailru/easyjson v0.9.0 // indirect github.com/marcboeker/go-duckdb v1.8.3 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mfridman/interpolate v0.0.2 // indirect - github.com/miekg/dns v1.1.61 // indirect + github.com/miekg/dns v1.1.63 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect github.com/mitchellh/pointerstructure v1.2.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect @@ -308,23 +310,23 @@ require ( github.com/pelletier/go-toml/v2 v2.2.3 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect - github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pion/dtls/v2 v2.2.7 // indirect github.com/pion/logging v0.2.2 // indirect github.com/pion/stun/v2 v2.0.0 // indirect github.com/pion/transport/v2 v2.2.1 // indirect github.com/pion/transport/v3 v3.0.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/pressly/goose/v3 v3.21.1 // indirect - github.com/prometheus/client_golang v1.20.5 // indirect + github.com/prometheus/client_golang v1.21.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.60.1 // indirect + github.com/prometheus/common v0.62.0 // indirect github.com/prometheus/procfs v0.15.1 // 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 + github.com/rs/cors v1.11.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect @@ -344,7 +346,7 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.0.0-20250225130625-4a632b0b1e61 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 // indirect - github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect + github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb // indirect @@ -361,10 +363,10 @@ require ( github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de // indirect github.com/smartcontractkit/wsrpc v0.8.3 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/afero v1.12.0 // indirect github.com/spf13/cast v1.7.1 // indirect github.com/spf13/cobra v1.8.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/spf13/viper v1.19.0 // indirect github.com/streamingfast/logging v0.0.0-20230608130331-f22c91403091 // indirect github.com/stretchr/objx v0.5.2 // indirect @@ -377,8 +379,8 @@ require ( github.com/tidwall/gjson v1.18.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tklauser/go-sysconf v0.3.13 // indirect + github.com/tklauser/numcpus v0.7.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect github.com/urfave/cli/v2 v2.27.5 // indirect @@ -393,53 +395,54 @@ require ( github.com/zondax/ledger-go v0.14.3 // indirect go.dedis.ch/fixbuf v1.0.3 // indirect go.dedis.ch/kyber/v3 v3.1.0 // indirect - go.etcd.io/bbolt v1.3.9 // indirect - go.mongodb.org/mongo-driver v1.15.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 // indirect + go.etcd.io/bbolt v1.4.0 // indirect + go.mongodb.org/mongo-driver v1.17.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect - go.opentelemetry.io/otel v1.31.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 // indirect - go.opentelemetry.io/otel/log v0.6.0 // indirect - go.opentelemetry.io/otel/metric v1.31.0 // indirect - go.opentelemetry.io/otel/sdk v1.31.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.6.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.31.0 // indirect - go.opentelemetry.io/otel/trace v1.31.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.opentelemetry.io/otel v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 // indirect + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 // indirect + go.opentelemetry.io/otel/log v0.10.0 // indirect + go.opentelemetry.io/otel/metric v1.34.0 // indirect + go.opentelemetry.io/otel/sdk v1.34.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.10.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect + go.opentelemetry.io/otel/trace v1.34.0 // indirect + go.opentelemetry.io/proto/otlp v1.5.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/ratelimit v0.3.1 // indirect go.uber.org/zap v1.27.0 // indirect golang.org/x/arch v0.11.0 // indirect - golang.org/x/crypto v0.32.0 // indirect - golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c // indirect - golang.org/x/mod v0.22.0 // indirect - golang.org/x/net v0.34.0 // indirect - golang.org/x/oauth2 v0.23.0 // indirect - golang.org/x/sync v0.10.0 // indirect - golang.org/x/sys v0.29.0 // indirect - golang.org/x/term v0.28.0 // indirect - golang.org/x/text v0.21.0 // indirect - golang.org/x/time v0.7.0 // indirect - golang.org/x/tools v0.29.0 // indirect + golang.org/x/crypto v0.33.0 // indirect + golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa // indirect + golang.org/x/mod v0.23.0 // indirect + golang.org/x/net v0.35.0 // indirect + golang.org/x/oauth2 v0.26.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/term v0.29.0 // indirect + golang.org/x/text v0.22.0 // indirect + golang.org/x/time v0.10.0 // indirect + golang.org/x/tools v0.30.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect gonum.org/v1/gonum v0.15.1 // indirect - google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect - google.golang.org/grpc v1.67.1 // indirect - google.golang.org/protobuf v1.36.4 // indirect + google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 // indirect + google.golang.org/grpc v1.70.0 // indirect + google.golang.org/protobuf v1.36.5 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/guregu/null.v4 v4.0.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect @@ -456,7 +459,7 @@ require ( k8s.io/klog/v2 v2.130.1 // indirect k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f // indirect k8s.io/kubectl v0.31.2 // indirect - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect + k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 // indirect pgregory.net/rapid v1.1.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/controller-runtime v0.19.0 // indirect diff --git a/system-tests/tests/go.sum b/system-tests/tests/go.sum index 6e59888065f..79d3ba1ad86 100644 --- a/system-tests/tests/go.sum +++ b/system-tests/tests/go.sum @@ -76,8 +76,8 @@ github.com/Khan/genqlient v0.7.0/go.mod h1:HNyy3wZvuYwmW3Y7mkoQLZsa/R5n5yIRajS1k github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= -github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/NethermindEth/juno v0.3.1 h1:AW72LiAm9gqUeCVJWvepnZcTnpU4Vkl0KzPMxS+42FA= @@ -383,8 +383,8 @@ github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8 github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= -github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= @@ -394,8 +394,8 @@ github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7z github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= 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.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= @@ -435,8 +435,8 @@ github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3Bop github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 h1:ymLjT4f35nQbASLnvxEde4XOBL+Sn7rFuV+FOJqkljg= -github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0/go.mod h1:6daplAwHHGbUGib4990V3Il26O0OC4aRyvewaaAihaA= +github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa h1:Rpu6sKAzIeSWBkrFHD52g8yipagcPbY2Lmm70NL1Gzc= +github.com/go-json-experiment/json v0.0.0-20250213060926-925ba3f173fa/go.mod h1:TiCD2a1pcmjd7YnhGH0f/zKNcCD06B029pHhzV23c2M= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= @@ -480,14 +480,14 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg78 github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/go-viper/mapstructure/v2 v2.1.0 h1:gHnMa2Y/pIxElCH2GlZZ1lZSsn6XMtufpGyP1XxdC/w= -github.com/go-viper/mapstructure/v2 v2.1.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-webauthn/webauthn v0.9.4 h1:YxvHSqgUyc5AK2pZbqkWWR55qKeDPhP8zLDr6lpIc2g= github.com/go-webauthn/webauthn v0.9.4/go.mod h1:LqupCtzSef38FcxzaklmOn7AykGKhAhr9xlRbdbgnTw= 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/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-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/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= @@ -505,8 +505,8 @@ github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= -github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.3 h1:oDTdz9f5VGVVNGu/Q7UXKWYsD0873HXLHdJUNBsSEKM= +github.com/golang/glog v1.2.3/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -548,8 +548,8 @@ github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXi github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU= @@ -610,10 +610,10 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/sessions v1.2.2 h1:lqzMYz6bOfvn2WriPUjNByzeXIlVzURcPmgMczkmTjY= @@ -634,12 +634,12 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaW github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0 h1:FbSCl+KggFl+Ocym490i/EyXF4lPgLoUtcSWquBM0Rs= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0/go.mod h1:qOchhhIlmRcqk/O9uCo/puJlyo07YINaIqdZfZG3Jkc= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/gtank/merlin v0.1.1-0.20191105220539-8318aed1a79f/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/bIQ+s= @@ -670,8 +670,8 @@ github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8Io github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-plugin v1.6.2 h1:zdGAEd0V1lCaU0u+MxWQhtSDQmahpkwOun8U8EiRVog= -github.com/hashicorp/go-plugin v1.6.2/go.mod h1:CkgLQ5CZqNmdL9U9JzM532t8ZiYQ35+pj3b1FD37R0Q= +github.com/hashicorp/go-plugin v1.6.3 h1:xgHB+ZUSYeuJi96WtxEjzi23uh7YQpznjGh0U0UUrwg= +github.com/hashicorp/go-plugin v1.6.3/go.mod h1:MRobyh+Wc/nYy1V4KAXUiYfzxoYhs7V1mlH1Z7iY2h0= github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= @@ -682,8 +682,8 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= -github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -692,8 +692,8 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= +github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= github.com/hasura/go-graphql-client v0.13.1 h1:kKbjhxhpwz58usVl+Xvgah/TDha5K2akNTRQdsEHN6U= github.com/hasura/go-graphql-client v0.13.1/go.mod h1:k7FF7h53C+hSNFRG3++DdVZWIuHdCaTbI7siTJ//zGQ= github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= @@ -718,8 +718,8 @@ github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+h github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= -github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= +github.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E= +github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -806,11 +806,11 @@ github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= -github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -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/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -854,8 +854,8 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f h1:tVvGiZQFjOXP+9YyGqSA6jE55x1XVxmoPYudncxrZ8U= github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f/go.mod h1:Z60vy0EZVSu0bOugCHdcN5ZxFMKSpjRgsnh0XKPFqqk= github.com/marcboeker/go-duckdb v1.8.3 h1:ZkYwiIZhbYsT6MmJsZ3UPTHrTZccDdM4ztoqSlEMXiQ= @@ -865,8 +865,9 @@ github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcncea github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -886,8 +887,8 @@ github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6B github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.61 h1:nLxbwF3XxhwVSm8g9Dghm9MHPaUZuqhPiGL+675ZmEs= -github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= +github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY= +github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 h1:QRUSJEgZn2Snx0EmT/QLXibWjSUDjKWvXIT19NBVp94= github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= @@ -909,8 +910,8 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY= +github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= @@ -985,8 +986,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A= +github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU= github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks= @@ -1004,8 +1005,8 @@ github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+v github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= -github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= @@ -1028,21 +1029,22 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pressly/goose/v3 v3.21.1 h1:5SSAKKWej8LVVzNLuT6KIvP1eFDuPvxa+B6H0w78buQ= github.com/pressly/goose/v3 v3.21.1/go.mod h1:sqthmzV8PitchEkjecFJII//l43dLOCzfWh8pHEe+vE= -github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.21.0 h1:DIsaGmiaBkSangBgMtWdNfxbMNdku5IK6iNhrEqWvdA= +github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= -github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/prometheus/prometheus v0.54.1 h1:vKuwQNjnYN2/mDoWfHXDhAsz/68q/dQDb+YbcEqU7MQ= -github.com/prometheus/prometheus v0.54.1/go.mod h1:xlLByHhk2g3ycakQGrMaU8K7OySZx98BzeCR99991NY= +github.com/prometheus/prometheus v0.302.0 h1:47EsaoBRroS2ekSyMSOPIjXwYnY/mxoFk0xt2dkFvfI= +github.com/prometheus/prometheus v0.302.0/go.mod h1:YcyCoTbUR/TM8rY3Aoeqr0AWTu/pu1Ehh+trpX3eRzg= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= @@ -1061,8 +1063,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= -github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= -github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= @@ -1128,8 +1130,8 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0 h1:BTN2nQgFKBxgas6oqY3ym82O+wT++WlpP1+a6KzIfY0= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250221174903-e1e47fdb11b0/go.mod h1:YQuXIqQpmpAqstWV0LHaDTJ5nsSWuip5ivEM+Fisb+4= -github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= -github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= +github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e h1:QBG+Wn5rHAi4gjnBAq6x6CZj/GjWAahFjj81VhQEu6U= +github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250224190032-809e4b8cf29e/go.mod h1:2yUpKW1/jFxpozO/Zkh3fKDzI0jthXoEcU2xuDq+vlo= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= @@ -1177,8 +1179,8 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= +github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= @@ -1190,8 +1192,9 @@ github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3k github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= @@ -1245,10 +1248,12 @@ github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= +github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= @@ -1307,13 +1312,13 @@ go.dedis.ch/kyber/v3 v3.1.0/go.mod h1:kXy7p3STAurkADD+/aZcsznZGKVHEqbtmdIzvPfrs1 go.dedis.ch/protobuf v1.0.5/go.mod h1:eIV4wicvi6JK0q/QnfIEGeSFNG0ZeB24kzut5+HaRLo= go.dedis.ch/protobuf v1.0.7/go.mod h1:pv5ysfkDX/EawiPqcW3ikOxsL5t+BqnV6xHSmE79KI4= go.dedis.ch/protobuf v1.0.11/go.mod h1:97QR256dnkimeNdfmURz0wAMNVbd1VmLXhG1CrTYrJ4= -go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= -go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= +go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk= +go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= -go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.mongodb.org/mongo-driver v1.17.0 h1:Hp4q2MCjvY19ViwimTs00wHi7G4yzxh4/2+nTx8r40k= +go.mongodb.org/mongo-driver v1.17.0/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1321,48 +1326,50 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0 h1:1f31+6grJmV3X4lxcEvUy13i5/kfDw1nJZwhd8mA4tg= go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0/go.mod h1:1P/02zM3OwkX9uki+Wmxw3a5GVb6KUXRsa7m7bOC9Fg= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0 h1:yMkBS9yViCc7U7yeLzJPM2XizlfdVvBRSmsQDWu6qc0= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.56.0/go.mod h1:n8MR6/liuGB5EmTETUBeU5ZgqMOlqKRxUaqPQBOANZ8= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 h1:rgMkmiGfix9vFJDcDi1PK8WEQP4FLQwLDfhp5ZLpFeE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= -go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= -go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 h1:UiRNKd1OgqsLbFwE+wkAWTdiAxXtCBqKIHeBIse4FUA= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9/go.mod h1:eqZlW3pJWhjyexnDPrdQxix1pn0wwhI4AO4GKpP/bMI= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 h1:QSKmLBzbFULSyHzOdO9JsN9lpE4zkrz1byYGmJecdVE= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0/go.mod h1:sTQ/NH8Yrirf0sJ5rWqVu+oT82i4zL9FaF6rWcqnptM= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0/go.mod h1:yeGZANgEcpdx/WK0IvvRFC+2oLiMS2u4L/0Rj2M2Qr0= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 h1:VrMAbeJz4gnVDg2zEzjHG4dEH86j4jO6VYB+NgtGD8s= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0/go.mod h1:qqN/uFdpeitTvm+JDqqnjm517pmQRYxTORbETHq5tOc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 h1:0MH3f8lZrflbUWXVxyBg/zviDFdGE062uKh5+fu8Vv0= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0/go.mod h1:Vh68vYiHY5mPdekTr0ox0sALsqjoVy0w3Os278yX5SQ= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 h1:BJee2iLkfRfl9lc7aFmBwkWxY/RI1RDdXepSF6y8TPE= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0/go.mod h1:DIzlHs3DRscCIBU3Y9YSzPfScwnYnzfnCd4g8zA7bZc= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= -go.opentelemetry.io/otel/log v0.6.0 h1:nH66tr+dmEgW5y+F9LanGJUBYPrRgP4g2EkmPE3LeK8= -go.opentelemetry.io/otel/log v0.6.0/go.mod h1:KdySypjQHhP069JX0z/t26VHwa8vSwzgaKmXtIB3fJM= -go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= -go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= -go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= -go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= -go.opentelemetry.io/otel/sdk/log v0.6.0 h1:4J8BwXY4EeDE9Mowg+CyhWVBhTSLXVXodiXxS/+PGqI= -go.opentelemetry.io/otel/sdk/log v0.6.0/go.mod h1:L1DN8RMAduKkrwRAFDEX3E3TLOq46+XMGSbUfHU/+vE= -go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= -go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= -go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= -go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 h1:5dTKu4I5Dn4P2hxyW3l3jTaZx9ACgg0ECos1eAVrheY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0/go.mod h1:P5HcUI8obLrCCmM3sbVBohZFH34iszk/+CPWuakZWL8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 h1:q/heq5Zh8xV1+7GoMGJpTxM2Lhq5+bFxB29tshuRuw0= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0/go.mod h1:leO2CSTg0Y+LyvmR7Wm4pUxE8KAmaM2GCVx7O+RATLA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 h1:ajl4QczuJVA2TU9W9AGw++86Xga/RKt//16z/yxPgdk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0/go.mod h1:Vn3/rlOJ3ntf/Q3zAI0V5lDnTbHGaUsNUeF6nZmm7pA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 h1:GKCEAZLEpEf78cUvudQdTg0aET2ObOZRB2HtXA0qPAI= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0/go.mod h1:9/zqSWLCmHT/9Jo6fYeUDRRogOLL60ABLsHWS99lF8s= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 h1:czJDQwFrMbOr9Kk+BPo1y8WZIIFIK58SA1kykuVeiOU= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0/go.mod h1:lT7bmsxOe58Tq+JIOkTQMCGXdu47oA+VJKLZHbaBKbs= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 h1:jBpDk4HAUsrnVO1FsfCfCOTEc/MkInJmvfCHYLFiT80= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0/go.mod h1:H9LUIM1daaeZaz91vZcfeM0fejXPmgCYE8ZhzqfJuiU= +go.opentelemetry.io/otel/log v0.10.0 h1:1CXmspaRITvFcjA4kyVszuG4HjA61fPDxMb7q3BuyF0= +go.opentelemetry.io/otel/log v0.10.0/go.mod h1:PbVdm9bXKku/gL0oFfUF4wwsQsOPlpo4VEqjvxih+FM= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= +go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/sdk/log v0.10.0 h1:lR4teQGWfeDVGoute6l0Ou+RpFqQ9vaPdrNJlST0bvw= +go.opentelemetry.io/otel/sdk/log v0.10.0/go.mod h1:A+V1UTWREhWAittaQEG4bYm4gAZa6xnvVu+xKrIRkzo= +go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= +go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= +go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1417,8 +1424,8 @@ golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98y golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= -golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1429,8 +1436,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc= -golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1459,8 +1466,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= -golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= +golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1513,8 +1520,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1527,8 +1534,8 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE= +golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1542,8 +1549,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1627,8 +1634,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1640,8 +1647,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= -golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1657,13 +1664,13 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= -golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= +golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -1726,8 +1733,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= -golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= +golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= +golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1814,12 +1821,12 @@ google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU= -google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 h1:Pw6WnI9W/LIdRxqK7T6XGugGbHIRl5Q7q3BssH6xk4s= +google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4/go.mod h1:qbZzneIOXSq+KFAFut9krLfRLZiFLzZL5u2t8SV83EE= +google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2 h1:35ZFtrCgaAjF7AFAK0+lRSf+4AyYnWRbH7og13p7rZ4= +google.golang.org/genproto/googleapis/api v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:W9ynFDP/shebLB1Hl/ESTOap2jHd6pmLXPNZC7SVDbA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2 h1:DMTIbak9GhdaSxEjvVzAeNZvyc03I61duqNbnm3SU0M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1840,8 +1847,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1854,8 +1861,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= -google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1918,8 +1925,8 @@ k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f h1:2sXuKesAYbRHxL3aE2PN6z k8s.io/kube-openapi v0.0.0-20240709000822-3c01b740850f/go.mod h1:UxDHUPsUwTOOxSU+oXURfFBcAS6JwiRXTYqYwfuGowc= k8s.io/kubectl v0.31.2 h1:gTxbvRkMBwvTSAlobiTVqsH6S8Aa1aGyBcu5xYLsn8M= k8s.io/kubectl v0.31.2/go.mod h1:EyASYVU6PY+032RrTh5ahtSOMgoDRIux9V1JLKtG5xM= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 h1:jGnCPejIetjiy2gqaJ5V0NLwTpF4wbQ6cZIItJCSHno= +k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk= From 2e734edd53775aa9061743c6e13c6c0c8dadf234 Mon Sep 17 00:00:00 2001 From: tt-cll <141346969+tt-cll@users.noreply.github.com> Date: Tue, 25 Feb 2025 12:35:42 -0500 Subject: [PATCH 57/58] add update dest configs (#16532) * add timelock to remote chain * lint * re-add transfer * move to mcms helper * fix buffer bug * mcms validation * set authority * refactor * try to unify ci and local * lint * add update dest configs * add disable * cleanup * error message * v2 * fix test * add mcms to billing * refactor into helper * lint * test without mcms --- .../changeset/solana/cs_add_remote_chain.go | 265 +++++++------- .../ccip/changeset/solana/cs_billing.go | 184 +++++++--- .../ccip/changeset/solana/cs_build_solana.go | 2 +- .../changeset/solana/cs_chain_contracts.go | 10 + .../solana/cs_chain_contracts_test.go | 339 +++++++++++------- .../ccip/changeset/solana/cs_deploy_chain.go | 4 +- .../solana/cs_disable_remote_chain.go | 197 ++++++++++ deployment/ccip/changeset/solana/utils.go | 70 ++++ deployment/ccip/changeset/solana_state.go | 7 +- 9 files changed, 783 insertions(+), 295 deletions(-) create mode 100644 deployment/ccip/changeset/solana/cs_disable_remote_chain.go diff --git a/deployment/ccip/changeset/solana/cs_add_remote_chain.go b/deployment/ccip/changeset/solana/cs_add_remote_chain.go index e12d69badc0..93278ac0560 100644 --- a/deployment/ccip/changeset/solana/cs_add_remote_chain.go +++ b/deployment/ccip/changeset/solana/cs_add_remote_chain.go @@ -10,8 +10,6 @@ import ( "github.com/gagliardetto/solana-go" "github.com/smartcontractkit/mcms" - "github.com/smartcontractkit/mcms/sdk" - mcmsSolana "github.com/smartcontractkit/mcms/sdk/solana" mcmsTypes "github.com/smartcontractkit/mcms/types" solOffRamp "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" @@ -22,9 +20,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment" ccipChangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - - "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" - "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" ) // ADD REMOTE CHAIN @@ -34,12 +29,7 @@ type AddRemoteChainToSolanaConfig struct { UpdatesByChain map[uint64]RemoteChainConfigSolana // Disallow mixing MCMS/non-MCMS per chain for simplicity. // (can still be achieved by calling this function multiple times) - MCMS *ccipChangeset.MCMSConfig - // Public key of program authorities. Depending on when this changeset is called, some may be under - // the control of the deployer, and some may be under the control of the timelock. (e.g. during new offramp deploy) - RouterAuthority solana.PublicKey - FeeQuoterAuthority solana.PublicKey - OffRampAuthority solana.PublicKey + MCMSSolana *MCMSConfigSolana } type RemoteChainConfigSolana struct { @@ -48,6 +38,8 @@ type RemoteChainConfigSolana struct { // destination RouterDestinationConfig solRouter.DestChainConfig FeeQuoterDestinationConfig solFeeQuoter.DestChainConfig + // We have different instructions for add vs update, so we need to know which one to use + IsUpdate bool } func (cfg AddRemoteChainToSolanaConfig) Validate(e deployment.Environment) error { @@ -66,23 +58,23 @@ func (cfg AddRemoteChainToSolanaConfig) Validate(e deployment.Environment) error if err := validateOffRampConfig(chain, chainState); err != nil { return err } - if err := ValidateMCMSConfig(e, cfg.ChainSelector, cfg.MCMS); err != nil { + if err := ValidateMCMSConfigSolana(e, cfg.ChainSelector, cfg.MCMSSolana); err != nil { return err } - routerUsingMCMS := cfg.MCMS != nil && !cfg.RouterAuthority.IsZero() - feeQuoterUsingMCMS := cfg.MCMS != nil && !cfg.FeeQuoterAuthority.IsZero() - offRampUsingMCMS := cfg.MCMS != nil && !cfg.OffRampAuthority.IsZero() + routerUsingMCMS := cfg.MCMSSolana != nil && cfg.MCMSSolana.RouterOwnedByTimelock + feeQuoterUsingMCMS := cfg.MCMSSolana != nil && cfg.MCMSSolana.FeeQuoterOwnedByTimelock + offRampUsingMCMS := cfg.MCMSSolana != nil && cfg.MCMSSolana.OffRampOwnedByTimelock chain, ok := e.SolChains[cfg.ChainSelector] if !ok { return fmt.Errorf("chain %d not found in environment", cfg.ChainSelector) } - if err := ccipChangeset.ValidateOwnershipSolana(&e, chain, routerUsingMCMS, e.SolChains[cfg.ChainSelector].DeployerKey.PublicKey(), chainState.Router, ccipChangeset.Router); err != nil { + if err := ccipChangeset.ValidateOwnershipSolana(&e, chain, routerUsingMCMS, chainState.Router, ccipChangeset.Router); err != nil { return fmt.Errorf("failed to validate ownership: %w", err) } - if err := ccipChangeset.ValidateOwnershipSolana(&e, chain, feeQuoterUsingMCMS, e.SolChains[cfg.ChainSelector].DeployerKey.PublicKey(), chainState.FeeQuoter, ccipChangeset.FeeQuoter); err != nil { + if err := ccipChangeset.ValidateOwnershipSolana(&e, chain, feeQuoterUsingMCMS, chainState.FeeQuoter, ccipChangeset.FeeQuoter); err != nil { return fmt.Errorf("failed to validate ownership: %w", err) } - if err := ccipChangeset.ValidateOwnershipSolana(&e, chain, offRampUsingMCMS, e.SolChains[cfg.ChainSelector].DeployerKey.PublicKey(), chainState.OffRamp, ccipChangeset.OffRamp); err != nil { + if err := ccipChangeset.ValidateOwnershipSolana(&e, chain, offRampUsingMCMS, chainState.OffRamp, ccipChangeset.OffRamp); err != nil { return fmt.Errorf("failed to validate ownership: %w", err) } var routerConfigAccount solRouter.Config @@ -104,10 +96,12 @@ func (cfg AddRemoteChainToSolanaConfig) Validate(e deployment.Environment) error if err != nil { return fmt.Errorf("failed to find dest chain state pda for remote chain %d: %w", remote, err) } - var destChainStateAccount solRouter.DestChain - err = chain.GetAccountDataBorshInto(context.Background(), routerDestChainPDA, &destChainStateAccount) - if err == nil { - return fmt.Errorf("remote %d is already configured on solana chain %d", remote, cfg.ChainSelector) + if !cfg.UpdatesByChain[remote].IsUpdate { + var destChainStateAccount solRouter.DestChain + err = chain.GetAccountDataBorshInto(context.Background(), routerDestChainPDA, &destChainStateAccount) + if err == nil { + return fmt.Errorf("remote %d is already configured on solana chain %d", remote, cfg.ChainSelector) + } } } return nil @@ -132,32 +126,8 @@ func AddRemoteChainToSolana(e deployment.Environment, cfg AddRemoteChainToSolana // create proposals for ixns if len(txns) > 0 { - timelocks := map[uint64]string{} - proposers := map[uint64]string{} - inspectors := map[uint64]sdk.Inspector{} - batches := make([]mcmsTypes.BatchOperation, 0) - chain := e.SolChains[cfg.ChainSelector] - addresses, _ := e.ExistingAddresses.AddressesForChain(cfg.ChainSelector) - mcmState, _ := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) - - timelocks[cfg.ChainSelector] = mcmsSolana.ContractAddress( - mcmState.TimelockProgram, - mcmsSolana.PDASeed(mcmState.TimelockSeed), - ) - proposers[cfg.ChainSelector] = mcmsSolana.ContractAddress(mcmState.McmProgram, mcmsSolana.PDASeed(mcmState.ProposerMcmSeed)) - inspectors[cfg.ChainSelector] = mcmsSolana.NewInspector(chain.Client) - batches = append(batches, mcmsTypes.BatchOperation{ - ChainSelector: mcmsTypes.ChainSelector(cfg.ChainSelector), - Transactions: txns, - }) - proposal, err := proposalutils.BuildProposalFromBatchesV2( - e.GetContext(), - timelocks, - proposers, - inspectors, - batches, - "proposal to add remote chains to Solana", - cfg.MCMS.MinDelay) + proposal, err := BuildProposalsForTxns( + e, cfg.ChainSelector, "proposal to add remote chains to Solana", cfg.MCMSSolana.MCMS.MinDelay, txns) if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to build proposal: %w", err) } @@ -182,10 +152,14 @@ func doAddRemoteChainToSolana( ccipRouterID := s.SolChains[chainSel].Router feeQuoterID := s.SolChains[chainSel].FeeQuoter offRampID := s.SolChains[chainSel].OffRamp - routerUsingMCMS := cfg.MCMS != nil && !cfg.RouterAuthority.IsZero() - feeQuoterUsingMCMS := cfg.MCMS != nil && !cfg.FeeQuoterAuthority.IsZero() - offRampUsingMCMS := cfg.MCMS != nil && !cfg.OffRampAuthority.IsZero() + routerUsingMCMS := cfg.MCMSSolana != nil && cfg.MCMSSolana.RouterOwnedByTimelock + feeQuoterUsingMCMS := cfg.MCMSSolana != nil && cfg.MCMSSolana.FeeQuoterOwnedByTimelock + offRampUsingMCMS := cfg.MCMSSolana != nil && cfg.MCMSSolana.OffRampOwnedByTimelock lookUpTableEntries := make([]solana.PublicKey, 0) + timelockSigner, err := FetchTimelockSigner(e, chainSel) + if err != nil { + return txns, fmt.Errorf("failed to fetch timelock signer: %w", err) + } for remoteChainSel, update := range updates { var onRampBytes [64]byte @@ -200,27 +174,42 @@ func doAddRemoteChainToSolana( offRampRemoteStatePDA, _, _ := solState.FindOfframpSourceChainPDA(remoteChainSel, offRampID) allowedOffRampRemotePDA, _ := solState.FindAllowedOfframpPDA(remoteChainSel, offRampID, ccipRouterID) - lookUpTableEntries = append(lookUpTableEntries, - fqRemoteChainPDA, - routerRemoteStatePDA, - offRampRemoteStatePDA, - ) + if !update.IsUpdate { + lookUpTableEntries = append(lookUpTableEntries, + fqRemoteChainPDA, + routerRemoteStatePDA, + offRampRemoteStatePDA, + ) + } solRouter.SetProgramID(ccipRouterID) var authority solana.PublicKey if routerUsingMCMS { - authority = cfg.RouterAuthority + authority = timelockSigner } else { authority = chain.DeployerKey.PublicKey() } - routerIx, err := solRouter.NewAddChainSelectorInstruction( - remoteChainSel, - update.RouterDestinationConfig, - routerRemoteStatePDA, - s.SolChains[chainSel].RouterConfigPDA, - authority, - solana.SystemProgramID, - ).ValidateAndBuild() + var routerIx solana.Instruction + var err error + if update.IsUpdate { + routerIx, err = solRouter.NewUpdateDestChainConfigInstruction( + remoteChainSel, + update.RouterDestinationConfig, + routerRemoteStatePDA, + s.SolChains[chainSel].RouterConfigPDA, + authority, + solana.SystemProgramID, + ).ValidateAndBuild() + } else { + routerIx, err = solRouter.NewAddChainSelectorInstruction( + remoteChainSel, + update.RouterDestinationConfig, + routerRemoteStatePDA, + s.SolChains[chainSel].RouterConfigPDA, + authority, + solana.SystemProgramID, + ).ValidateAndBuild() + } if err != nil { return txns, fmt.Errorf("failed to generate instructions: %w", err) } @@ -234,41 +223,54 @@ func doAddRemoteChainToSolana( ixns = append(ixns, routerIx) } - routerOfframpIx, err := solRouter.NewAddOfframpInstruction( - remoteChainSel, - offRampID, - allowedOffRampRemotePDA, - s.SolChains[chainSel].RouterConfigPDA, - authority, - solana.SystemProgramID, - ).ValidateAndBuild() - if err != nil { - return txns, fmt.Errorf("failed to generate instructions: %w", err) - } - if routerUsingMCMS { - tx, err := BuildMCMSTxn(routerOfframpIx, ccipRouterID.String(), ccipChangeset.Router) + if !update.IsUpdate { + routerOfframpIx, err := solRouter.NewAddOfframpInstruction( + remoteChainSel, + offRampID, + allowedOffRampRemotePDA, + s.SolChains[chainSel].RouterConfigPDA, + authority, + solana.SystemProgramID, + ).ValidateAndBuild() if err != nil { - return txns, fmt.Errorf("failed to create transaction: %w", err) + return txns, fmt.Errorf("failed to generate instructions: %w", err) + } + if routerUsingMCMS { + tx, err := BuildMCMSTxn(routerOfframpIx, ccipRouterID.String(), ccipChangeset.Router) + if err != nil { + return txns, fmt.Errorf("failed to create transaction: %w", err) + } + txns = append(txns, *tx) + } else { + ixns = append(ixns, routerOfframpIx) } - txns = append(txns, *tx) - } else { - ixns = append(ixns, routerOfframpIx) } solFeeQuoter.SetProgramID(feeQuoterID) if feeQuoterUsingMCMS { - authority = cfg.RouterAuthority + authority = timelockSigner } else { authority = chain.DeployerKey.PublicKey() } - feeQuoterIx, err := solFeeQuoter.NewAddDestChainInstruction( - remoteChainSel, - update.FeeQuoterDestinationConfig, - s.SolChains[chainSel].FeeQuoterConfigPDA, - fqRemoteChainPDA, - authority, - solana.SystemProgramID, - ).ValidateAndBuild() + var feeQuoterIx solana.Instruction + if update.IsUpdate { + feeQuoterIx, err = solFeeQuoter.NewUpdateDestChainConfigInstruction( + remoteChainSel, + update.FeeQuoterDestinationConfig, + s.SolChains[chainSel].FeeQuoterConfigPDA, + fqRemoteChainPDA, + authority, + ).ValidateAndBuild() + } else { + feeQuoterIx, err = solFeeQuoter.NewAddDestChainInstruction( + remoteChainSel, + update.FeeQuoterDestinationConfig, + s.SolChains[chainSel].FeeQuoterConfigPDA, + fqRemoteChainPDA, + authority, + solana.SystemProgramID, + ).ValidateAndBuild() + } if err != nil { return txns, fmt.Errorf("failed to generate instructions: %w", err) } @@ -288,19 +290,29 @@ func doAddRemoteChainToSolana( IsEnabled: update.EnabledAsSource, } if offRampUsingMCMS { - authority = cfg.RouterAuthority + authority = timelockSigner } else { authority = chain.DeployerKey.PublicKey() } - offRampIx, err := solOffRamp.NewAddSourceChainInstruction( - remoteChainSel, - validSourceChainConfig, - offRampRemoteStatePDA, - s.SolChains[chainSel].OffRampConfigPDA, - authority, - solana.SystemProgramID, - ).ValidateAndBuild() - + var offRampIx solana.Instruction + if update.IsUpdate { + offRampIx, err = solOffRamp.NewUpdateSourceChainConfigInstruction( + remoteChainSel, + validSourceChainConfig, + offRampRemoteStatePDA, + s.SolChains[chainSel].OffRampConfigPDA, + authority, + ).ValidateAndBuild() + } else { + offRampIx, err = solOffRamp.NewAddSourceChainInstruction( + remoteChainSel, + validSourceChainConfig, + offRampRemoteStatePDA, + s.SolChains[chainSel].OffRampConfigPDA, + authority, + solana.SystemProgramID, + ).ValidateAndBuild() + } if err != nil { return txns, fmt.Errorf("failed to generate instructions: %w", err) } @@ -319,36 +331,39 @@ func doAddRemoteChainToSolana( return txns, fmt.Errorf("failed to confirm instructions: %w", err) } } + if !update.IsUpdate { + tv := deployment.NewTypeAndVersion(ccipChangeset.RemoteDest, deployment.Version1_0_0) + remoteChainSelStr := strconv.FormatUint(remoteChainSel, 10) + tv.AddLabel(remoteChainSelStr) + err = ab.Save(chainSel, routerRemoteStatePDA.String(), tv) + if err != nil { + return txns, fmt.Errorf("failed to save dest chain state to address book: %w", err) + } - tv := deployment.NewTypeAndVersion(ccipChangeset.RemoteDest, deployment.Version1_0_0) - remoteChainSelStr := strconv.FormatUint(remoteChainSel, 10) - tv.AddLabel(remoteChainSelStr) - err = ab.Save(chainSel, routerRemoteStatePDA.String(), tv) - if err != nil { - return txns, fmt.Errorf("failed to save dest chain state to address book: %w", err) + tv = deployment.NewTypeAndVersion(ccipChangeset.RemoteSource, deployment.Version1_0_0) + tv.AddLabel(remoteChainSelStr) + err = ab.Save(chainSel, offRampRemoteStatePDA.String(), tv) + if err != nil { + return txns, fmt.Errorf("failed to save source chain state to address book: %w", err) + } } + } - tv = deployment.NewTypeAndVersion(ccipChangeset.RemoteSource, deployment.Version1_0_0) - tv.AddLabel(remoteChainSelStr) - err = ab.Save(chainSel, allowedOffRampRemotePDA.String(), tv) + if len(lookUpTableEntries) > 0 { + addressLookupTable, err := ccipChangeset.FetchOfframpLookupTable(e.GetContext(), chain, offRampID) if err != nil { - return txns, fmt.Errorf("failed to save source chain state to address book: %w", err) + return txns, fmt.Errorf("failed to get offramp reference addresses: %w", err) } - } - - addressLookupTable, err := ccipChangeset.FetchOfframpLookupTable(e.GetContext(), chain, offRampID) - if err != nil { - return txns, fmt.Errorf("failed to get offramp reference addresses: %w", err) - } - if err := solCommonUtil.ExtendLookupTable( - e.GetContext(), - chain.Client, - addressLookupTable, - *chain.DeployerKey, - lookUpTableEntries, - ); err != nil { - return txns, fmt.Errorf("failed to extend lookup table: %w", err) + if err := solCommonUtil.ExtendLookupTable( + e.GetContext(), + chain.Client, + addressLookupTable, + *chain.DeployerKey, + lookUpTableEntries, + ); err != nil { + return txns, fmt.Errorf("failed to extend lookup table: %w", err) + } } return txns, nil diff --git a/deployment/ccip/changeset/solana/cs_billing.go b/deployment/ccip/changeset/solana/cs_billing.go index 5eeffde3e2f..bd7f375e0aa 100644 --- a/deployment/ccip/changeset/solana/cs_billing.go +++ b/deployment/ccip/changeset/solana/cs_billing.go @@ -6,6 +6,9 @@ import ( "github.com/gagliardetto/solana-go" + "github.com/smartcontractkit/mcms" + mcmsTypes "github.com/smartcontractkit/mcms/types" + solFeeQuoter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" solCommonUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" @@ -25,6 +28,9 @@ type BillingTokenConfig struct { ChainSelector uint64 TokenPubKey string Config solFeeQuoter.BillingTokenConfig + // We have different instructions for add vs update, so we need to know which one to use + IsUpdate bool + MCMSSolana *MCMSConfigSolana } func (cfg BillingTokenConfig) Validate(e deployment.Environment) error { @@ -42,14 +48,23 @@ func (cfg BillingTokenConfig) Validate(e deployment.Environment) error { if _, err := chainState.TokenToTokenProgram(tokenPubKey); err != nil { return err } + if err := ValidateMCMSConfigSolana(e, cfg.ChainSelector, cfg.MCMSSolana); err != nil { + return err + } + feeQuoterUsingMCMS := cfg.MCMSSolana != nil && cfg.MCMSSolana.FeeQuoterOwnedByTimelock + if err := ccipChangeset.ValidateOwnershipSolana(&e, chain, feeQuoterUsingMCMS, chainState.FeeQuoter, ccipChangeset.FeeQuoter); err != nil { + return fmt.Errorf("failed to validate ownership: %w", err) + } // check if already setup billingConfigPDA, _, err := solState.FindFqBillingTokenConfigPDA(tokenPubKey, chainState.FeeQuoter) if err != nil { return fmt.Errorf("failed to find billing token config pda (mint: %s, feeQuoter: %s): %w", tokenPubKey.String(), chainState.FeeQuoter.String(), err) } - var token0ConfigAccount solFeeQuoter.BillingTokenConfigWrapper - if err := chain.GetAccountDataBorshInto(context.Background(), billingConfigPDA, &token0ConfigAccount); err == nil { - return fmt.Errorf("billing token config already exists for (mint: %s, feeQuoter: %s)", tokenPubKey.String(), chainState.FeeQuoter.String()) + if !cfg.IsUpdate { + var token0ConfigAccount solFeeQuoter.BillingTokenConfigWrapper + if err := chain.GetAccountDataBorshInto(context.Background(), billingConfigPDA, &token0ConfigAccount); err == nil { + return fmt.Errorf("billing token config already exists for (mint: %s, feeQuoter: %s)", tokenPubKey.String(), chainState.FeeQuoter.String()) + } } return nil } @@ -58,34 +73,66 @@ func AddBillingToken( e deployment.Environment, chain deployment.SolChain, chainState ccipChangeset.SolCCIPChainState, - billingConfig solFeeQuoter.BillingTokenConfig, -) error { - tokenPubKey := solana.MustPublicKeyFromBase58(billingConfig.Mint.String()) + billingTokenConfig solFeeQuoter.BillingTokenConfig, + mcms *MCMSConfigSolana, + isUpdate bool, +) ([]mcmsTypes.Transaction, error) { + txns := make([]mcmsTypes.Transaction, 0) + tokenPubKey := solana.MustPublicKeyFromBase58(billingTokenConfig.Mint.String()) tokenBillingPDA, _, _ := solState.FindFqBillingTokenConfigPDA(tokenPubKey, chainState.FeeQuoter) billingSignerPDA, _, _ := solState.FindFeeBillingSignerPDA(chainState.Router) tokenProgramID, _ := chainState.TokenToTokenProgram(tokenPubKey) token2022Receiver, _, _ := solTokenUtil.FindAssociatedTokenAddress(tokenProgramID, tokenPubKey, billingSignerPDA) feeQuoterConfigPDA, _, _ := solState.FindFqConfigPDA(chainState.FeeQuoter) - ixConfig, cerr := solFeeQuoter.NewAddBillingTokenConfigInstruction( - billingConfig, - feeQuoterConfigPDA, - tokenBillingPDA, - tokenProgramID, - tokenPubKey, - token2022Receiver, - chain.DeployerKey.PublicKey(), // ccip admin - billingSignerPDA, - ata.ProgramID, - solana.SystemProgramID, - ).ValidateAndBuild() - if cerr != nil { - return fmt.Errorf("failed to generate instructions: %w", cerr) + feeQuoterUsingMCMS := mcms != nil && mcms.FeeQuoterOwnedByTimelock + timelockSigner, err := FetchTimelockSigner(e, chain.Selector) + if err != nil { + return txns, fmt.Errorf("failed to fetch timelock signer: %w", err) } - instructions := []solana.Instruction{ixConfig} - if err := chain.Confirm(instructions); err != nil { - return fmt.Errorf("failed to confirm instructions: %w", err) + var authority solana.PublicKey + if feeQuoterUsingMCMS { + authority = timelockSigner + } else { + authority = chain.DeployerKey.PublicKey() } - return nil + var ixConfig solana.Instruction + if isUpdate { + ixConfig, err = solFeeQuoter.NewUpdateBillingTokenConfigInstruction( + billingTokenConfig, + feeQuoterConfigPDA, + tokenBillingPDA, + authority, + ).ValidateAndBuild() + } else { + ixConfig, err = solFeeQuoter.NewAddBillingTokenConfigInstruction( + billingTokenConfig, + feeQuoterConfigPDA, + tokenBillingPDA, + tokenProgramID, + tokenPubKey, + token2022Receiver, + authority, // ccip admin + billingSignerPDA, + ata.ProgramID, + solana.SystemProgramID, + ).ValidateAndBuild() + } + if err != nil { + return txns, fmt.Errorf("failed to generate instructions: %w", err) + } + if feeQuoterUsingMCMS { + tx, err := BuildMCMSTxn(ixConfig, chainState.FeeQuoter.String(), ccipChangeset.FeeQuoter) + if err != nil { + return txns, fmt.Errorf("failed to create transaction: %w", err) + } + txns = append(txns, *tx) + } else { + if err := chain.Confirm([]solana.Instruction{ixConfig}); err != nil { + return txns, fmt.Errorf("failed to confirm instructions: %w", err) + } + } + + return txns, nil } func AddBillingTokenChangeset(e deployment.Environment, cfg BillingTokenConfig) (deployment.ChangesetOutput, error) { @@ -98,29 +145,44 @@ func AddBillingTokenChangeset(e deployment.Environment, cfg BillingTokenConfig) solFeeQuoter.SetProgramID(chainState.FeeQuoter) - if err := AddBillingToken(e, chain, chainState, cfg.Config); err != nil { + txns, err := AddBillingToken(e, chain, chainState, cfg.Config, cfg.MCMSSolana, cfg.IsUpdate) + if err != nil { return deployment.ChangesetOutput{}, err } - tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) - tokenBillingPDA, _, _ := solState.FindFqBillingTokenConfigPDA(tokenPubKey, chainState.FeeQuoter) + if !cfg.IsUpdate { + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + tokenBillingPDA, _, _ := solState.FindFqBillingTokenConfigPDA(tokenPubKey, chainState.FeeQuoter) - addressLookupTable, err := ccipChangeset.FetchOfframpLookupTable(e.GetContext(), chain, chainState.OffRamp) - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to get offramp reference addresses: %w", err) + addressLookupTable, err := ccipChangeset.FetchOfframpLookupTable(e.GetContext(), chain, chainState.OffRamp) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get offramp reference addresses: %w", err) + } + + if err := solCommonUtil.ExtendLookupTable( + e.GetContext(), + chain.Client, + addressLookupTable, + *chain.DeployerKey, + []solana.PublicKey{tokenBillingPDA}, + ); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to extend lookup table: %w", err) + } + e.Logger.Infow("Billing token added", "chainSelector", cfg.ChainSelector, "tokenPubKey", tokenPubKey.String()) } - if err := solCommonUtil.ExtendLookupTable( - e.GetContext(), - chain.Client, - addressLookupTable, - *chain.DeployerKey, - []solana.PublicKey{tokenBillingPDA}, - ); err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to extend lookup table: %w", err) + // create proposals for ixns + if len(txns) > 0 { + proposal, err := BuildProposalsForTxns( + e, cfg.ChainSelector, "proposal to add billing token to Solana", cfg.MCMSSolana.MCMS.MinDelay, txns) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to build proposal: %w", err) + } + return deployment.ChangesetOutput{ + MCMSTimelockProposals: []mcms.TimelockProposal{*proposal}, + }, nil } - e.Logger.Infow("Billing token added", "chainSelector", cfg.ChainSelector, "tokenPubKey", tokenPubKey.String()) return deployment.ChangesetOutput{}, nil } @@ -130,6 +192,7 @@ type BillingTokenForRemoteChainConfig struct { RemoteChainSelector uint64 Config solFeeQuoter.TokenTransferFeeConfig TokenPubKey string + MCMSSolana *MCMSConfigSolana } func (cfg BillingTokenForRemoteChainConfig) Validate(e deployment.Environment) error { @@ -166,21 +229,40 @@ func AddBillingTokenForRemoteChain(e deployment.Environment, cfg BillingTokenFor tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) remoteBillingPDA, _, _ := solState.FindFqPerChainPerTokenConfigPDA(cfg.RemoteChainSelector, tokenPubKey, chainState.FeeQuoter) + if err := ValidateMCMSConfigSolana(e, cfg.ChainSelector, cfg.MCMSSolana); err != nil { + return deployment.ChangesetOutput{}, err + } + feeQuoterUsingMCMS := cfg.MCMSSolana != nil && cfg.MCMSSolana.FeeQuoterOwnedByTimelock + if err := ccipChangeset.ValidateOwnershipSolana(&e, chain, feeQuoterUsingMCMS, chainState.FeeQuoter, ccipChangeset.FeeQuoter); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to validate ownership: %w", err) + } + timelockSigner, err := FetchTimelockSigner(e, chain.Selector) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to fetch timelock signer: %w", err) + } + + var authority solana.PublicKey + if feeQuoterUsingMCMS { + authority = timelockSigner + } else { + authority = chain.DeployerKey.PublicKey() + } ix, err := solFeeQuoter.NewSetTokenTransferFeeConfigInstruction( cfg.RemoteChainSelector, tokenPubKey, cfg.Config, chainState.FeeQuoterConfigPDA, remoteBillingPDA, - chain.DeployerKey.PublicKey(), + authority, solana.SystemProgramID, ).ValidateAndBuild() if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) } - instructions := []solana.Instruction{ix} - if err := chain.Confirm(instructions); err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) + if !feeQuoterUsingMCMS { + if err := chain.Confirm([]solana.Instruction{ix}); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) + } } addressLookupTable, err := ccipChangeset.FetchOfframpLookupTable(e.GetContext(), chain, chainState.OffRamp) @@ -199,5 +281,21 @@ func AddBillingTokenForRemoteChain(e deployment.Environment, cfg BillingTokenFor } e.Logger.Infow("Token billing set for remote chain", "chainSelector ", cfg.ChainSelector, "remoteChainSelector ", cfg.RemoteChainSelector, "tokenPubKey", tokenPubKey.String()) + + if feeQuoterUsingMCMS { + tx, err := BuildMCMSTxn(ix, chainState.FeeQuoter.String(), ccipChangeset.FeeQuoter) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to create transaction: %w", err) + } + proposal, err := BuildProposalsForTxns( + e, cfg.ChainSelector, "proposal to set billing token for remote chain to Solana", cfg.MCMSSolana.MCMS.MinDelay, []mcmsTypes.Transaction{*tx}) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to build proposal: %w", err) + } + return deployment.ChangesetOutput{ + MCMSTimelockProposals: []mcms.TimelockProposal{*proposal}, + }, nil + } + return deployment.ChangesetOutput{}, nil } diff --git a/deployment/ccip/changeset/solana/cs_build_solana.go b/deployment/ccip/changeset/solana/cs_build_solana.go index c8d2c6bdabc..fc011fcb39e 100644 --- a/deployment/ccip/changeset/solana/cs_build_solana.go +++ b/deployment/ccip/changeset/solana/cs_build_solana.go @@ -119,7 +119,7 @@ func replaceKeysForUpgrade(e deployment.Environment, keys map[deployment.Contrac if err != nil { return fmt.Errorf("failed to write updated keys to file %s: %w", fullPath, err) } - e.Logger.Debugw("Updated key for program %s in file %s\n", programStr, filePath) + e.Logger.Debugf("Updated key for program %s in file %s\n", programStr, filePath) } return nil } diff --git a/deployment/ccip/changeset/solana/cs_chain_contracts.go b/deployment/ccip/changeset/solana/cs_chain_contracts.go index db29b12642e..a4cc5c11d9f 100644 --- a/deployment/ccip/changeset/solana/cs_chain_contracts.go +++ b/deployment/ccip/changeset/solana/cs_chain_contracts.go @@ -18,6 +18,7 @@ import ( var _ deployment.ChangeSet[v1_6.SetOCR3OffRampConfig] = SetOCR3ConfigSolana var _ deployment.ChangeSet[AddRemoteChainToSolanaConfig] = AddRemoteChainToSolana +var _ deployment.ChangeSet[DisableRemoteChainConfig] = DisableRemoteChain var _ deployment.ChangeSet[BillingTokenConfig] = AddBillingTokenChangeset var _ deployment.ChangeSet[BillingTokenForRemoteChainConfig] = AddBillingTokenForRemoteChain var _ deployment.ChangeSet[RegisterTokenAdminRegistryConfig] = RegisterTokenAdminRegistry @@ -25,6 +26,15 @@ var _ deployment.ChangeSet[TransferAdminRoleTokenAdminRegistryConfig] = Transfer var _ deployment.ChangeSet[AcceptAdminRoleTokenAdminRegistryConfig] = AcceptAdminRoleTokenAdminRegistry var _ deployment.ChangeSet[SetFeeAggregatorConfig] = SetFeeAggregator +type MCMSConfigSolana struct { + MCMS *ccipChangeset.MCMSConfig + // Public key of program authorities. Depending on when this changeset is called, some may be under + // the control of the deployer, and some may be under the control of the timelock. (e.g. during new offramp deploy) + RouterOwnedByTimelock bool + FeeQuoterOwnedByTimelock bool + OffRampOwnedByTimelock bool +} + // HELPER FUNCTIONS // GetTokenProgramID returns the program ID for the given token program name func GetTokenProgramID(programName deployment.ContractType) (solana.PublicKey, error) { diff --git a/deployment/ccip/changeset/solana/cs_chain_contracts_test.go b/deployment/ccip/changeset/solana/cs_chain_contracts_test.go index b35f0aab139..8a4fc0579d8 100644 --- a/deployment/ccip/changeset/solana/cs_chain_contracts_test.go +++ b/deployment/ccip/changeset/solana/cs_chain_contracts_test.go @@ -9,6 +9,7 @@ import ( "github.com/stretchr/testify/require" solBaseTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/base_token_pool" + solOffRamp "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" solRouter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" solFeeQuoter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" solTestTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/test_token_pool" @@ -48,7 +49,6 @@ func deployToken(t *testing.T, tenv deployment.Environment, solChain uint64) (de func TestAddRemoteChain(t *testing.T) { t.Parallel() - ctx := testcontext.Get(t) // Default env just has 2 chains with all contracts // deployed but no lanes. tenv, _ := testhelpers.NewMemoryEnvironment(t, testhelpers.WithSolChains(1)) @@ -60,7 +60,25 @@ func TestAddRemoteChain(t *testing.T) { _, err := ccipChangeset.LoadOnchainStateSolana(tenv.Env) require.NoError(t, err) - tenv.Env, err = commonchangeset.Apply(t, tenv.Env, nil, + doTestAddRemoteChain(t, tenv.Env, evmChain, solChain, false) + doTestAddRemoteChain(t, tenv.Env, evmChain2, solChain, true) +} + +func doTestAddRemoteChain(t *testing.T, e deployment.Environment, evmChain uint64, solChain uint64, mcms bool) { + var mcmsConfig *ccipChangesetSolana.MCMSConfigSolana + var err error + if mcms { + _, _ = testhelpers.TransferOwnershipSolana(t, &e, solChain, true, true, true, true) + mcmsConfig = &ccipChangesetSolana.MCMSConfigSolana{ + MCMS: &ccipChangeset.MCMSConfig{ + MinDelay: 1 * time.Second, + }, + RouterOwnedByTimelock: true, + FeeQuoterOwnedByTimelock: true, + OffRampOwnedByTimelock: true, + } + } + e, err = commonchangeset.ApplyChangesetsV2(t, e, []commonchangeset.ConfiguredChangeSet{ commonchangeset.Configure( deployment.CreateLegacyChangeSet(v1_6.UpdateOnRampsDestsChangeset), v1_6.UpdateOnRampDestsConfig{ @@ -81,8 +99,10 @@ func TestAddRemoteChain(t *testing.T) { ChainSelector: solChain, UpdatesByChain: map[uint64]ccipChangesetSolana.RemoteChainConfigSolana{ evmChain: { - EnabledAsSource: true, - RouterDestinationConfig: solRouter.DestChainConfig{}, + EnabledAsSource: true, + RouterDestinationConfig: solRouter.DestChainConfig{ + AllowListEnabled: true, + }, FeeQuoterDestinationConfig: solFeeQuoter.DestChainConfig{ IsEnabled: true, DefaultTxGasLimit: 200000, @@ -90,97 +110,116 @@ func TestAddRemoteChain(t *testing.T) { MaxDataBytes: 30000, MaxNumberOfTokensPerMsg: 5, DefaultTokenDestGasOverhead: 5000, - // bytes4(keccak256("CCIP ChainFamilySelector EVM")) - // TODO: do a similar test for other chain families - // https://smartcontract-it.atlassian.net/browse/INTAUTO-438 - ChainFamilySelector: [4]uint8{40, 18, 213, 44}, + ChainFamilySelector: [4]uint8{40, 18, 213, 44}, }, }, }, + MCMSSolana: mcmsConfig, }, ), + }, ) require.NoError(t, err) - state, err := ccipChangeset.LoadOnchainStateSolana(tenv.Env) + state, err := ccipChangeset.LoadOnchainStateSolana(e) require.NoError(t, err) + var offRampSourceChain solOffRamp.SourceChain + offRampEvmSourceChainPDA, _, _ := solState.FindOfframpSourceChainPDA(evmChain, state.SolChains[solChain].OffRamp) + err = e.SolChains[solChain].GetAccountDataBorshInto(e.GetContext(), offRampEvmSourceChainPDA, &offRampSourceChain) + require.NoError(t, err) + require.True(t, offRampSourceChain.Config.IsEnabled) + var destChainStateAccount solRouter.DestChain evmDestChainStatePDA := state.SolChains[solChain].DestChainStatePDAs[evmChain] - err = tenv.Env.SolChains[solChain].GetAccountDataBorshInto(ctx, evmDestChainStatePDA, &destChainStateAccount) + err = e.SolChains[solChain].GetAccountDataBorshInto(e.GetContext(), evmDestChainStatePDA, &destChainStateAccount) + require.True(t, destChainStateAccount.Config.AllowListEnabled) require.NoError(t, err) var destChainFqAccount solFeeQuoter.DestChain fqEvmDestChainPDA, _, _ := solState.FindFqDestChainPDA(evmChain, state.SolChains[solChain].FeeQuoter) - err = tenv.Env.SolChains[solChain].GetAccountDataBorshInto(ctx, fqEvmDestChainPDA, &destChainFqAccount) + err = e.SolChains[solChain].GetAccountDataBorshInto(e.GetContext(), fqEvmDestChainPDA, &destChainFqAccount) require.NoError(t, err, "failed to get account info") require.Equal(t, solFeeQuoter.TimestampedPackedU224{}, destChainFqAccount.State.UsdPerUnitGas) require.True(t, destChainFqAccount.Config.IsEnabled) - timelockSignerPDA, _ := testhelpers.TransferOwnershipSolana(t, &tenv.Env, solChain, true, true, true, true) - - tenv.Env, err = commonchangeset.ApplyChangesetsV2(t, tenv.Env, - []commonchangeset.ConfiguredChangeSet{ - commonchangeset.Configure( - deployment.CreateLegacyChangeSet(v1_6.UpdateOnRampsDestsChangeset), - v1_6.UpdateOnRampDestsConfig{ - UpdatesByChain: map[uint64]map[uint64]v1_6.OnRampDestinationUpdate{ - evmChain2: { - solChain: { - IsEnabled: true, - TestRouter: false, - AllowListEnabled: false, - }, + // Disable the chain + + e, err = commonchangeset.ApplyChangesetsV2(t, e, []commonchangeset.ConfiguredChangeSet{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipChangesetSolana.DisableRemoteChain), + ccipChangesetSolana.DisableRemoteChainConfig{ + ChainSelector: solChain, + RemoteChains: []uint64{evmChain}, + MCMSSolana: mcmsConfig, + }, + ), + }, + ) + + require.NoError(t, err) + + state, err = ccipChangeset.LoadOnchainStateSolana(e) + require.NoError(t, err) + + err = e.SolChains[solChain].GetAccountDataBorshInto(e.GetContext(), offRampEvmSourceChainPDA, &offRampSourceChain) + require.NoError(t, err) + require.False(t, offRampSourceChain.Config.IsEnabled) + + err = e.SolChains[solChain].GetAccountDataBorshInto(e.GetContext(), evmDestChainStatePDA, &destChainStateAccount) + require.NoError(t, err) + require.True(t, destChainStateAccount.Config.AllowListEnabled) + + err = e.SolChains[solChain].GetAccountDataBorshInto(e.GetContext(), fqEvmDestChainPDA, &destChainFqAccount) + require.NoError(t, err, "failed to get account info") + require.False(t, destChainFqAccount.Config.IsEnabled) + + // Re-enable the chain + + e, err = commonchangeset.ApplyChangesetsV2(t, e, []commonchangeset.ConfiguredChangeSet{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipChangesetSolana.AddRemoteChainToSolana), + ccipChangesetSolana.AddRemoteChainToSolanaConfig{ + ChainSelector: solChain, + UpdatesByChain: map[uint64]ccipChangesetSolana.RemoteChainConfigSolana{ + evmChain: { + EnabledAsSource: true, + RouterDestinationConfig: solRouter.DestChainConfig{ + AllowListEnabled: false, }, - }, - }, - ), - commonchangeset.Configure( - deployment.CreateLegacyChangeSet(ccipChangesetSolana.AddRemoteChainToSolana), - ccipChangesetSolana.AddRemoteChainToSolanaConfig{ - ChainSelector: solChain, - UpdatesByChain: map[uint64]ccipChangesetSolana.RemoteChainConfigSolana{ - evmChain2: { - EnabledAsSource: true, - RouterDestinationConfig: solRouter.DestChainConfig{}, - FeeQuoterDestinationConfig: solFeeQuoter.DestChainConfig{ - IsEnabled: true, - DefaultTxGasLimit: 200000, - MaxPerMsgGasLimit: 3000000, - MaxDataBytes: 30000, - MaxNumberOfTokensPerMsg: 5, - DefaultTokenDestGasOverhead: 5000, - // bytes4(keccak256("CCIP ChainFamilySelector EVM")) - // TODO: do a similar test for other chain families - // https://smartcontract-it.atlassian.net/browse/INTAUTO-438 - ChainFamilySelector: [4]uint8{40, 18, 213, 44}, - }, + FeeQuoterDestinationConfig: solFeeQuoter.DestChainConfig{ + IsEnabled: true, + DefaultTxGasLimit: 30000, + MaxPerMsgGasLimit: 3000000, + MaxDataBytes: 30000, + MaxNumberOfTokensPerMsg: 5, + DefaultTokenDestGasOverhead: 5000, + ChainFamilySelector: [4]uint8{40, 18, 213, 44}, }, + IsUpdate: true, }, - MCMS: &ccipChangeset.MCMSConfig{ - MinDelay: 1 * time.Second, - }, - RouterAuthority: timelockSignerPDA, - FeeQuoterAuthority: timelockSignerPDA, - OffRampAuthority: timelockSignerPDA, }, - ), - }, + MCMSSolana: mcmsConfig, + }, + ), + }, ) require.NoError(t, err) - state, err = ccipChangeset.LoadOnchainStateSolana(tenv.Env) + state, err = ccipChangeset.LoadOnchainStateSolana(e) require.NoError(t, err) - evmDestChainStatePDA = state.SolChains[solChain].DestChainStatePDAs[evmChain2] - err = tenv.Env.SolChains[solChain].GetAccountDataBorshInto(ctx, evmDestChainStatePDA, &destChainStateAccount) + err = e.SolChains[solChain].GetAccountDataBorshInto(e.GetContext(), offRampEvmSourceChainPDA, &offRampSourceChain) require.NoError(t, err) + require.True(t, offRampSourceChain.Config.IsEnabled) - fqEvmDestChainPDA, _, _ = solState.FindFqDestChainPDA(evmChain2, state.SolChains[solChain].FeeQuoter) - err = tenv.Env.SolChains[solChain].GetAccountDataBorshInto(ctx, fqEvmDestChainPDA, &destChainFqAccount) + err = e.SolChains[solChain].GetAccountDataBorshInto(e.GetContext(), evmDestChainStatePDA, &destChainStateAccount) + require.NoError(t, err) + require.False(t, destChainStateAccount.Config.AllowListEnabled) + + err = e.SolChains[solChain].GetAccountDataBorshInto(e.GetContext(), fqEvmDestChainPDA, &destChainFqAccount) require.NoError(t, err, "failed to get account info") - require.Equal(t, solFeeQuoter.TimestampedPackedU224{}, destChainFqAccount.State.UsdPerUnitGas) require.True(t, destChainFqAccount.Config.IsEnabled) } @@ -281,70 +320,130 @@ func TestAddTokenPool(t *testing.T) { func TestBilling(t *testing.T) { t.Parallel() - ctx := testcontext.Get(t) - tenv, _ := testhelpers.NewMemoryEnvironment(t, testhelpers.WithSolChains(1)) + tests := []struct { + Msg string + Mcms bool + }{ + { + Msg: "TestBilling with mcms", + Mcms: true, + }, + { + Msg: "TestBilling without mcms", + Mcms: false, + }, + } - evmChain := tenv.Env.AllChainSelectors()[0] - solChain := tenv.Env.AllChainSelectorsSolana()[0] + for _, test := range tests { + t.Run(test.Msg, func(t *testing.T) { + tenv, _ := testhelpers.NewMemoryEnvironment(t, testhelpers.WithSolChains(1)) - e, tokenAddress, err := deployToken(t, tenv.Env, solChain) - require.NoError(t, err) - state, err := ccipChangeset.LoadOnchainStateSolana(e) - require.NoError(t, err) - validTimestamp := int64(100) - value := [28]uint8{} - bigNum, ok := new(big.Int).SetString("19816680000000000000", 10) - require.True(t, ok) - bigNum.FillBytes(value[:]) - e, err = commonchangeset.Apply(t, e, nil, - commonchangeset.Configure( - deployment.CreateLegacyChangeSet(ccipChangesetSolana.AddBillingTokenChangeset), - ccipChangesetSolana.BillingTokenConfig{ - ChainSelector: solChain, - TokenPubKey: tokenAddress.String(), - Config: solFeeQuoter.BillingTokenConfig{ - Enabled: true, - Mint: tokenAddress, - UsdPerToken: solFeeQuoter.TimestampedPackedU224{ - Timestamp: validTimestamp, - Value: value, + evmChain := tenv.Env.AllChainSelectors()[0] + solChain := tenv.Env.AllChainSelectorsSolana()[0] + + e, tokenAddress, err := deployToken(t, tenv.Env, solChain) + require.NoError(t, err) + state, err := ccipChangeset.LoadOnchainStateSolana(e) + require.NoError(t, err) + validTimestamp := int64(100) + value := [28]uint8{} + bigNum, ok := new(big.Int).SetString("19816680000000000000", 10) + require.True(t, ok) + bigNum.FillBytes(value[:]) + var mcmsConfig *ccipChangesetSolana.MCMSConfigSolana + if test.Mcms { + _, _ = testhelpers.TransferOwnershipSolana(t, &e, solChain, true, true, true, true) + mcmsConfig = &ccipChangesetSolana.MCMSConfigSolana{ + MCMS: &ccipChangeset.MCMSConfig{ + MinDelay: 1 * time.Second, }, - PremiumMultiplierWeiPerEth: 100, - }, - }, - ), - commonchangeset.Configure( - deployment.CreateLegacyChangeSet(ccipChangesetSolana.AddBillingTokenForRemoteChain), - ccipChangesetSolana.BillingTokenForRemoteChainConfig{ - ChainSelector: solChain, - RemoteChainSelector: evmChain, - TokenPubKey: tokenAddress.String(), - Config: solFeeQuoter.TokenTransferFeeConfig{ - MinFeeUsdcents: 800, - MaxFeeUsdcents: 1600, - DeciBps: 0, - DestGasOverhead: 100, - DestBytesOverhead: 100, - IsEnabled: true, - }, + RouterOwnedByTimelock: true, + FeeQuoterOwnedByTimelock: true, + OffRampOwnedByTimelock: true, + } + } + e, err = commonchangeset.ApplyChangesetsV2(t, e, []commonchangeset.ConfiguredChangeSet{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipChangesetSolana.AddBillingTokenChangeset), + ccipChangesetSolana.BillingTokenConfig{ + ChainSelector: solChain, + TokenPubKey: tokenAddress.String(), + Config: solFeeQuoter.BillingTokenConfig{ + Enabled: true, + Mint: tokenAddress, + UsdPerToken: solFeeQuoter.TimestampedPackedU224{ + Timestamp: validTimestamp, + Value: value, + }, + PremiumMultiplierWeiPerEth: 100, + }, + MCMSSolana: mcmsConfig, + }, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipChangesetSolana.AddBillingTokenForRemoteChain), + ccipChangesetSolana.BillingTokenForRemoteChainConfig{ + ChainSelector: solChain, + RemoteChainSelector: evmChain, + TokenPubKey: tokenAddress.String(), + Config: solFeeQuoter.TokenTransferFeeConfig{ + MinFeeUsdcents: 800, + MaxFeeUsdcents: 1600, + DeciBps: 0, + DestGasOverhead: 100, + DestBytesOverhead: 100, + IsEnabled: true, + }, + MCMSSolana: mcmsConfig, + }, + ), }, - ), - ) - require.NoError(t, err) + ) + require.NoError(t, err) - billingConfigPDA, _, _ := solState.FindFqBillingTokenConfigPDA(tokenAddress, state.SolChains[solChain].FeeQuoter) - var token0ConfigAccount solFeeQuoter.BillingTokenConfigWrapper - err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, billingConfigPDA, &token0ConfigAccount) - require.NoError(t, err) - require.True(t, token0ConfigAccount.Config.Enabled) - require.Equal(t, tokenAddress, token0ConfigAccount.Config.Mint) + billingConfigPDA, _, _ := solState.FindFqBillingTokenConfigPDA(tokenAddress, state.SolChains[solChain].FeeQuoter) + var token0ConfigAccount solFeeQuoter.BillingTokenConfigWrapper + err = e.SolChains[solChain].GetAccountDataBorshInto(e.GetContext(), billingConfigPDA, &token0ConfigAccount) + require.NoError(t, err) + require.True(t, token0ConfigAccount.Config.Enabled) + require.Equal(t, tokenAddress, token0ConfigAccount.Config.Mint) + require.Equal(t, uint64(100), token0ConfigAccount.Config.PremiumMultiplierWeiPerEth) + + remoteBillingPDA, _, _ := solState.FindFqPerChainPerTokenConfigPDA(evmChain, tokenAddress, state.SolChains[solChain].FeeQuoter) + var remoteBillingAccount solFeeQuoter.PerChainPerTokenConfig + err = e.SolChains[solChain].GetAccountDataBorshInto(e.GetContext(), remoteBillingPDA, &remoteBillingAccount) + require.NoError(t, err) + require.Equal(t, tokenAddress, remoteBillingAccount.Mint) + require.Equal(t, uint32(800), remoteBillingAccount.TokenTransferConfig.MinFeeUsdcents) + + e, err = commonchangeset.ApplyChangesetsV2(t, e, []commonchangeset.ConfiguredChangeSet{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipChangesetSolana.AddBillingTokenChangeset), + ccipChangesetSolana.BillingTokenConfig{ + ChainSelector: solChain, + TokenPubKey: tokenAddress.String(), + Config: solFeeQuoter.BillingTokenConfig{ + Enabled: true, + Mint: tokenAddress, + UsdPerToken: solFeeQuoter.TimestampedPackedU224{ + Timestamp: validTimestamp, + Value: value, + }, + PremiumMultiplierWeiPerEth: 200, + }, + MCMSSolana: mcmsConfig, + IsUpdate: true, + }, + ), + }, + ) + require.NoError(t, err) + err = e.SolChains[solChain].GetAccountDataBorshInto(e.GetContext(), billingConfigPDA, &token0ConfigAccount) + require.NoError(t, err) + require.Equal(t, uint64(200), token0ConfigAccount.Config.PremiumMultiplierWeiPerEth) + }) + } - remoteBillingPDA, _, _ := solState.FindFqPerChainPerTokenConfigPDA(evmChain, tokenAddress, state.SolChains[solChain].FeeQuoter) - var remoteBillingAccount solFeeQuoter.PerChainPerTokenConfig - err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, remoteBillingPDA, &remoteBillingAccount) - require.NoError(t, err) - require.Equal(t, tokenAddress, remoteBillingAccount.Mint) - require.Equal(t, uint32(800), remoteBillingAccount.TokenTransferConfig.MinFeeUsdcents) } func TestTokenAdminRegistry(t *testing.T) { diff --git a/deployment/ccip/changeset/solana/cs_deploy_chain.go b/deployment/ccip/changeset/solana/cs_deploy_chain.go index ffe4cb10c89..f9aefd5ef33 100644 --- a/deployment/ccip/changeset/solana/cs_deploy_chain.go +++ b/deployment/ccip/changeset/solana/cs_deploy_chain.go @@ -595,8 +595,8 @@ func deployChainContractsSolana( } for _, billingConfig := range params.FeeQuoterParams.BillingConfig { - if err := AddBillingToken( - e, chain, chainState, billingConfig, + if _, err := AddBillingToken( + e, chain, chainState, billingConfig, nil, false, ); err != nil { return txns, err } diff --git a/deployment/ccip/changeset/solana/cs_disable_remote_chain.go b/deployment/ccip/changeset/solana/cs_disable_remote_chain.go new file mode 100644 index 00000000000..17a9610ba08 --- /dev/null +++ b/deployment/ccip/changeset/solana/cs_disable_remote_chain.go @@ -0,0 +1,197 @@ +package solana + +import ( + "context" + + "fmt" + + "github.com/gagliardetto/solana-go" + + "github.com/smartcontractkit/mcms" + mcmsTypes "github.com/smartcontractkit/mcms/types" + + solOffRamp "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" + solRouter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" + solFeeQuoter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" + solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" + + "github.com/smartcontractkit/chainlink/deployment" + cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" +) + +type DisableRemoteChainConfig struct { + ChainSelector uint64 + RemoteChains []uint64 + MCMSSolana *MCMSConfigSolana +} + +func (cfg DisableRemoteChainConfig) Validate(e deployment.Environment) error { + state, err := cs.LoadOnchainState(e) + if err != nil { + return fmt.Errorf("failed to load onchain state: %w", err) + } + chainState := state.SolChains[cfg.ChainSelector] + chain := e.SolChains[cfg.ChainSelector] + if err := validateRouterConfig(chain, chainState); err != nil { + return err + } + if err := validateFeeQuoterConfig(chain, chainState); err != nil { + return err + } + if err := validateOffRampConfig(chain, chainState); err != nil { + return err + } + if err := ValidateMCMSConfigSolana(e, cfg.ChainSelector, cfg.MCMSSolana); err != nil { + return err + } + feeQuoterUsingMCMS := cfg.MCMSSolana != nil && cfg.MCMSSolana.FeeQuoterOwnedByTimelock + offRampUsingMCMS := cfg.MCMSSolana != nil && cfg.MCMSSolana.OffRampOwnedByTimelock + chain, ok := e.SolChains[cfg.ChainSelector] + if !ok { + return fmt.Errorf("chain %d not found in environment", cfg.ChainSelector) + } + if err := cs.ValidateOwnershipSolana(&e, chain, feeQuoterUsingMCMS, chainState.FeeQuoter, cs.FeeQuoter); err != nil { + return fmt.Errorf("failed to validate ownership: %w", err) + } + if err := cs.ValidateOwnershipSolana(&e, chain, offRampUsingMCMS, chainState.OffRamp, cs.OffRamp); err != nil { + return fmt.Errorf("failed to validate ownership: %w", err) + } + var routerConfigAccount solRouter.Config + // already validated that router config exists + _ = chain.GetAccountDataBorshInto(context.Background(), chainState.RouterConfigPDA, &routerConfigAccount) + + supportedChains := state.SupportedChains() + for _, remote := range cfg.RemoteChains { + if _, ok := supportedChains[remote]; !ok { + return fmt.Errorf("remote chain %d is not supported", remote) + } + if remote == routerConfigAccount.SvmChainSelector { + return fmt.Errorf("cannot disable remote chain %d with same chain selector as current chain %d", remote, cfg.ChainSelector) + } + if err := state.ValidateRamp(remote, cs.OnRamp); err != nil { + return err + } + routerDestChainPDA, err := solState.FindDestChainStatePDA(remote, chainState.Router) + if err != nil { + return fmt.Errorf("failed to find dest chain state pda for remote chain %d: %w", remote, err) + } + var destChainStateAccount solRouter.DestChain + err = chain.GetAccountDataBorshInto(context.Background(), routerDestChainPDA, &destChainStateAccount) + if err != nil { + return fmt.Errorf("remote %d is not configured on solana chain %d", remote, cfg.ChainSelector) + } + } + return nil +} + +func DisableRemoteChain(e deployment.Environment, cfg DisableRemoteChainConfig) (deployment.ChangesetOutput, error) { + if err := cfg.Validate(e); err != nil { + return deployment.ChangesetOutput{}, err + } + + s, err := cs.LoadOnchainState(e) + if err != nil { + return deployment.ChangesetOutput{}, err + } + + txns, err := doDisableRemoteChain(e, s, cfg) + if err != nil { + return deployment.ChangesetOutput{}, err + } + + // create proposals for ixns + if len(txns) > 0 { + proposal, err := BuildProposalsForTxns( + e, cfg.ChainSelector, "proposal to disable remote chains in Solana", cfg.MCMSSolana.MCMS.MinDelay, txns) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to build proposal: %w", err) + } + return deployment.ChangesetOutput{ + MCMSTimelockProposals: []mcms.TimelockProposal{*proposal}, + }, nil + } + return deployment.ChangesetOutput{}, nil +} + +func doDisableRemoteChain( + e deployment.Environment, + s cs.CCIPOnChainState, + cfg DisableRemoteChainConfig) ([]mcmsTypes.Transaction, error) { + txns := make([]mcmsTypes.Transaction, 0) + ixns := make([]solana.Instruction, 0) + chainSel := cfg.ChainSelector + chain := e.SolChains[chainSel] + feeQuoterID := s.SolChains[chainSel].FeeQuoter + offRampID := s.SolChains[chainSel].OffRamp + feeQuoterUsingMCMS := cfg.MCMSSolana != nil && cfg.MCMSSolana.FeeQuoterOwnedByTimelock + offRampUsingMCMS := cfg.MCMSSolana != nil && cfg.MCMSSolana.OffRampOwnedByTimelock + timelockSigner, err := FetchTimelockSigner(e, chainSel) + if err != nil { + return txns, fmt.Errorf("failed to fetch timelock signer: %w", err) + } + + for _, remoteChainSel := range cfg.RemoteChains { + // verified while loading state + fqDestChainPDA, _, _ := solState.FindFqDestChainPDA(remoteChainSel, feeQuoterID) + offRampSourceChainPDA, _, _ := solState.FindOfframpSourceChainPDA(remoteChainSel, s.SolChains[chainSel].OffRamp) + + solFeeQuoter.SetProgramID(feeQuoterID) + var authority solana.PublicKey + if feeQuoterUsingMCMS { + authority = timelockSigner + } else { + authority = chain.DeployerKey.PublicKey() + } + feeQuoterIx, err := solFeeQuoter.NewDisableDestChainInstruction( + remoteChainSel, + s.SolChains[chainSel].FeeQuoterConfigPDA, + fqDestChainPDA, + authority, + ).ValidateAndBuild() + if err != nil { + return txns, fmt.Errorf("failed to generate instructions: %w", err) + } + if feeQuoterUsingMCMS { + tx, err := BuildMCMSTxn(feeQuoterIx, feeQuoterID.String(), cs.FeeQuoter) + if err != nil { + return txns, fmt.Errorf("failed to create transaction: %w", err) + } + txns = append(txns, *tx) + } else { + ixns = append(ixns, feeQuoterIx) + } + + solOffRamp.SetProgramID(offRampID) + if offRampUsingMCMS { + authority = timelockSigner + } else { + authority = chain.DeployerKey.PublicKey() + } + offRampIx, err := solOffRamp.NewDisableSourceChainSelectorInstruction( + remoteChainSel, + offRampSourceChainPDA, + s.SolChains[chainSel].OffRampConfigPDA, + authority, + ).ValidateAndBuild() + if err != nil { + return txns, fmt.Errorf("failed to generate instructions: %w", err) + } + if offRampUsingMCMS { + tx, err := BuildMCMSTxn(offRampIx, offRampID.String(), cs.OffRamp) + if err != nil { + return txns, fmt.Errorf("failed to create transaction: %w", err) + } + txns = append(txns, *tx) + } else { + ixns = append(ixns, offRampIx) + } + if len(ixns) > 0 { + err = chain.Confirm(ixns) + if err != nil { + return txns, fmt.Errorf("failed to confirm instructions: %w", err) + } + } + } + + return txns, nil +} diff --git a/deployment/ccip/changeset/solana/utils.go b/deployment/ccip/changeset/solana/utils.go index 47107b7d11c..e79ee3e5f8f 100644 --- a/deployment/ccip/changeset/solana/utils.go +++ b/deployment/ccip/changeset/solana/utils.go @@ -1,18 +1,37 @@ package solana import ( + "errors" "fmt" "math/big" + "time" "github.com/gagliardetto/solana-go" + "github.com/smartcontractkit/mcms" + "github.com/smartcontractkit/mcms/sdk" mcmsSolana "github.com/smartcontractkit/mcms/sdk/solana" mcmsTypes "github.com/smartcontractkit/mcms/types" "github.com/smartcontractkit/chainlink/deployment" cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/common/types" ) +func ValidateMCMSConfigSolana(e deployment.Environment, chainSelector uint64, mcms *MCMSConfigSolana) error { + if mcms != nil { + if mcms.MCMS == nil { + return errors.New("MCMS config is nil") + } + if !mcms.FeeQuoterOwnedByTimelock && !mcms.RouterOwnedByTimelock && !mcms.OffRampOwnedByTimelock { + return errors.New("at least one of the MCMS components must be owned by the timelock") + } + return ValidateMCMSConfig(e, chainSelector, mcms.MCMS) + } + return nil +} + func ValidateMCMSConfig(e deployment.Environment, chainSelector uint64, mcms *cs.MCMSConfig) error { if mcms != nil { // If there is no timelock and mcms proposer on the chain, the transfer will fail. @@ -37,6 +56,44 @@ func ValidateMCMSConfig(e deployment.Environment, chainSelector uint64, mcms *cs return nil } +func BuildProposalsForTxns( + e deployment.Environment, + chainSelector uint64, + description string, + minDelay time.Duration, + txns []mcmsTypes.Transaction) (*mcms.TimelockProposal, error) { + timelocks := map[uint64]string{} + proposers := map[uint64]string{} + inspectors := map[uint64]sdk.Inspector{} + batches := make([]mcmsTypes.BatchOperation, 0) + chain := e.SolChains[chainSelector] + addresses, _ := e.ExistingAddresses.AddressesForChain(chainSelector) + mcmState, _ := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + + timelocks[chainSelector] = mcmsSolana.ContractAddress( + mcmState.TimelockProgram, + mcmsSolana.PDASeed(mcmState.TimelockSeed), + ) + proposers[chainSelector] = mcmsSolana.ContractAddress(mcmState.McmProgram, mcmsSolana.PDASeed(mcmState.ProposerMcmSeed)) + inspectors[chainSelector] = mcmsSolana.NewInspector(chain.Client) + batches = append(batches, mcmsTypes.BatchOperation{ + ChainSelector: mcmsTypes.ChainSelector(chainSelector), + Transactions: txns, + }) + proposal, err := proposalutils.BuildProposalFromBatchesV2( + e.GetContext(), + timelocks, + proposers, + inspectors, + batches, + description, + minDelay) + if err != nil { + return nil, fmt.Errorf("failed to build proposal: %w", err) + } + return proposal, nil +} + func BuildMCMSTxn(ixn solana.Instruction, programID string, contractType deployment.ContractType) (*mcmsTypes.Transaction, error) { data, err := ixn.Data() if err != nil { @@ -60,3 +117,16 @@ func BuildMCMSTxn(ixn solana.Instruction, programID string, contractType deploym } return &tx, nil } + +func FetchTimelockSigner(e deployment.Environment, chainSelector uint64) (solana.PublicKey, error) { + addresses, err := e.ExistingAddresses.AddressesForChain(chainSelector) + if err != nil { + return solana.PublicKey{}, fmt.Errorf("failed to load addresses for chain %d: %w", chainSelector, err) + } + mcmState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(e.SolChains[chainSelector], addresses) + if err != nil { + return solana.PublicKey{}, fmt.Errorf("failed to load mcm state: %w", err) + } + timelockSignerPDA := state.GetTimelockSignerPDA(mcmState.TimelockProgram, mcmState.TimelockSeed) + return timelockSignerPDA, nil +} diff --git a/deployment/ccip/changeset/solana_state.go b/deployment/ccip/changeset/solana_state.go index a5ed3a93671..6e66e8c090d 100644 --- a/deployment/ccip/changeset/solana_state.go +++ b/deployment/ccip/changeset/solana_state.go @@ -247,7 +247,6 @@ func ValidateOwnershipSolana( e *deployment.Environment, chain deployment.SolChain, mcms bool, - deployerKey solana.PublicKey, programID solana.PublicKey, contractType deployment.ContractType, ) error { @@ -271,7 +270,7 @@ func ValidateOwnershipSolana( if err != nil { return fmt.Errorf("failed to get account data: %w", err) } - if err := commoncs.ValidateOwnershipSolanaCommon(mcms, deployerKey, timelockSignerPDA, programData.Owner); err != nil { + if err := commoncs.ValidateOwnershipSolanaCommon(mcms, chain.DeployerKey.PublicKey(), timelockSignerPDA, programData.Owner); err != nil { return fmt.Errorf("failed to validate ownership for router: %w", err) } case OffRamp: @@ -280,7 +279,7 @@ func ValidateOwnershipSolana( if err != nil { return fmt.Errorf("failed to get account data: %w", err) } - if err := commoncs.ValidateOwnershipSolanaCommon(mcms, deployerKey, timelockSignerPDA, programData.Owner); err != nil { + if err := commoncs.ValidateOwnershipSolanaCommon(mcms, chain.DeployerKey.PublicKey(), timelockSignerPDA, programData.Owner); err != nil { return fmt.Errorf("failed to validate ownership for offramp: %w", err) } case FeeQuoter: @@ -289,7 +288,7 @@ func ValidateOwnershipSolana( if err != nil { return fmt.Errorf("failed to get account data: %w", err) } - if err := commoncs.ValidateOwnershipSolanaCommon(mcms, deployerKey, timelockSignerPDA, programData.Owner); err != nil { + if err := commoncs.ValidateOwnershipSolanaCommon(mcms, chain.DeployerKey.PublicKey(), timelockSignerPDA, programData.Owner); err != nil { return fmt.Errorf("failed to validate ownership for feequoter: %w", err) } default: From f638d606fd93f347db265c985e4ee628c2db2691 Mon Sep 17 00:00:00 2001 From: pavel-raykov <165708424+pavel-raykov@users.noreply.github.com> Date: Tue, 25 Feb 2025 19:18:56 +0100 Subject: [PATCH 58/58] Fix abigen compilation on Mac. (#16564) * Minor * Minor --- .changeset/olive-comics-wave.md | 5 +++++ tools/bin/build_abigen | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/olive-comics-wave.md diff --git a/.changeset/olive-comics-wave.md b/.changeset/olive-comics-wave.md new file mode 100644 index 00000000000..584d726ed01 --- /dev/null +++ b/.changeset/olive-comics-wave.md @@ -0,0 +1,5 @@ +--- +"chainlink": minor +--- + +#updated Fix abigen compilation on Mac. diff --git a/tools/bin/build_abigen b/tools/bin/build_abigen index f0087c7d800..5f0781ca782 100755 --- a/tools/bin/build_abigen +++ b/tools/bin/build_abigen @@ -34,7 +34,7 @@ pushd "$TMPDIR" git clone --depth=1 --single-branch --branch "$GETH_VERSION" "$GETH_REPO_URL" cd go-ethereum/cmd/abigen -go build +go build -ldflags="-s -w" # necessary on MacOS for code signing (see https://github.com/confluentinc/confluent-kafka-go/issues/1092#issuecomment-2373681430) rm -f "$THIS_DIR/abigen" # necessary on MacOS for code signing cp ./abigen "$THIS_DIR"