Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: don't use submit-legacy-proposal for consumer additions #1236

Draft
wants to merge 5 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 56 additions & 15 deletions chain/cosmos/chain_node.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,16 @@ import (
volumetypes "github.com/docker/docker/api/types/volume"
dockerclient "github.com/docker/docker/client"
"github.com/docker/go-connections/nat"
"github.com/tidwall/sjson"
"go.uber.org/zap"
"golang.org/x/mod/semver"
"golang.org/x/sync/errgroup"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"

icatypes "github.com/cosmos/ibc-go/v8/modules/apps/27-interchain-accounts/types"
ccvclient "github.com/cosmos/interchain-security/v5/x/ccv/provider/client"
ccvclient "github.com/cosmos/interchain-security/v6/x/ccv/provider/client"
providertypes "github.com/cosmos/interchain-security/v6/x/ccv/provider/types"
"github.com/strangelove-ventures/interchaintest/v8/blockdb"
"github.com/strangelove-ventures/interchaintest/v8/dockerutil"
"github.com/strangelove-ventures/interchaintest/v8/ibc"
Expand Down Expand Up @@ -883,24 +885,63 @@ func (tn *ChainNode) SendIBCTransfer(
}

func (tn *ChainNode) ConsumerAdditionProposal(ctx context.Context, keyName string, prop ccvclient.ConsumerAdditionProposalJSON) (string, error) {
propBz, err := json.Marshal(prop)
if err != nil {
return "", err
}
cosmosChain := (tn.Chain).(*CosmosChain)
if !tn.HasCommand(ctx, "tx", "gov", "submit-legacy-proposal", "consumer-addition") {
authority, err := cosmosChain.GetGovernanceAddress(ctx)
if err != nil {
return "", err
}
ccvProp := &providertypes.MsgConsumerAddition{
ChainId: prop.ChainId,
InitialHeight: prop.InitialHeight,
GenesisHash: prop.GenesisHash,
BinaryHash: prop.BinaryHash,
SpawnTime: prop.SpawnTime,
UnbondingPeriod: prop.UnbondingPeriod,
CcvTimeoutPeriod: prop.CcvTimeoutPeriod,
TransferTimeoutPeriod: prop.TransferTimeoutPeriod,
ConsumerRedistributionFraction: prop.ConsumerRedistributionFraction,
BlocksPerDistributionTransmission: prop.BlocksPerDistributionTransmission,
HistoricalEntries: prop.HistoricalEntries,
DistributionTransmissionChannel: prop.DistributionTransmissionChannel,
Top_N: prop.TopN,
ValidatorsPowerCap: prop.ValidatorsPowerCap,
ValidatorSetCap: prop.ValidatorSetCap,
Allowlist: prop.Allowlist,
Denylist: prop.Denylist,
Authority: authority,
AllowInactiveVals: prop.AllowInactiveVals,
MinStake: prop.MinStake,
}
propObj, err := cosmosChain.BuildProposal([]ProtoMessage{ccvProp}, prop.Title, prop.Summary, "ipfs://CID", prop.Deposit, "", false)
if err != nil {
return "", err
}
return tn.SubmitProposal(ctx, keyName, propObj)
} else {
propBz, err := json.Marshal(prop)
if err != nil {
return "", err
}
propBz, err = sjson.SetBytes(propBz, "metadata", "ipfs://CID")
if err != nil {
return "", err
}

fileName := "proposal_" + dockerutil.RandLowerCaseLetterString(4) + ".json"
fileName := "proposal_" + dockerutil.RandLowerCaseLetterString(4) + ".json"

fw := dockerutil.NewFileWriter(tn.logger(), tn.DockerClient, tn.TestName)
if err := fw.WriteFile(ctx, tn.VolumeName, fileName, propBz); err != nil {
return "", fmt.Errorf("failure writing proposal json: %w", err)
}
fw := dockerutil.NewFileWriter(tn.logger(), tn.DockerClient, tn.TestName)
if err := fw.WriteFile(ctx, tn.VolumeName, fileName, propBz); err != nil {
return "", fmt.Errorf("failure writing proposal json: %w", err)
}

filePath := filepath.Join(tn.HomeDir(), fileName)
filePath := filepath.Join(tn.HomeDir(), fileName)

return tn.ExecTx(ctx, keyName,
"gov", "submit-legacy-proposal", "consumer-addition", filePath,
"--gas", "auto",
)
return tn.ExecTx(ctx, keyName,
"gov", "submit-legacy-proposal", "consumer-addition", filePath,
"--gas", "auto",
)
}
}

func (tn *ChainNode) GetTransaction(clientCtx client.Context, txHash string) (*sdk.TxResponse, error) {
Expand Down
2 changes: 1 addition & 1 deletion chain/cosmos/codec.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import (
transfer "github.com/cosmos/ibc-go/v8/modules/apps/transfer"
ibccore "github.com/cosmos/ibc-go/v8/modules/core"
ibctm "github.com/cosmos/ibc-go/v8/modules/light-clients/07-tendermint"
ccvprovider "github.com/cosmos/interchain-security/v5/x/ccv/provider"
ccvprovider "github.com/cosmos/interchain-security/v6/x/ccv/provider"
ibcwasm "github.com/strangelove-ventures/interchaintest/v8/chain/cosmos/08-wasm-types"
)

Expand Down
6 changes: 5 additions & 1 deletion chain/cosmos/cosmos_chain.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import (
paramsutils "github.com/cosmos/cosmos-sdk/x/params/client/utils"
clienttypes "github.com/cosmos/ibc-go/v8/modules/core/02-client/types" // nolint:staticcheck
chanTypes "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types"
ccvclient "github.com/cosmos/interchain-security/v5/x/ccv/provider/client"
ccvclient "github.com/cosmos/interchain-security/v6/x/ccv/provider/client"
dockertypes "github.com/docker/docker/api/types"
volumetypes "github.com/docker/docker/api/types/volume"
"github.com/docker/docker/client"
Expand Down Expand Up @@ -600,6 +600,10 @@ func (c *CosmosChain) GetGasFeesInNativeDenom(gasPaid int64) int64 {
return int64(math.Ceil(fees))
}

func (c *CosmosChain) ChangeBinary(ctx context.Context, binary string) {
c.cfg.Bin = binary
}

func (c *CosmosChain) UpgradeVersion(ctx context.Context, cli *client.Client, containerRepo, version string) {
c.cfg.Images[0].Version = version
for _, n := range c.Validators {
Expand Down
58 changes: 50 additions & 8 deletions chain/cosmos/ics.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import (
"github.com/cosmos/cosmos-sdk/types"
govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
clienttypes "github.com/cosmos/ibc-go/v8/modules/core/02-client/types" // nolint:staticcheck
ccvclient "github.com/cosmos/interchain-security/v5/x/ccv/provider/client"
ccvclient "github.com/cosmos/interchain-security/v6/x/ccv/provider/client"
"github.com/icza/dyno"
"github.com/strangelove-ventures/interchaintest/v8/dockerutil"
"github.com/strangelove-ventures/interchaintest/v8/ibc"
Expand All @@ -32,6 +32,8 @@ import (
const (
icsVer330 = "v3.3.0"
icsVer400 = "v4.0.0"
icsVer450 = "v4.5.0"
icsVer640 = "v6.4.0"
)

// FinishICSProviderSetup sets up the base of an ICS connection with respect to the relayer, provider actions, and flushing of packets.
Expand Down Expand Up @@ -245,6 +247,16 @@ func (c *CosmosChain) StartConsumer(testName string, ctx context.Context, additi
return err
}

consumerID := c.cfg.ChainID
consumerChains, _, err := c.Provider.GetNode().ExecQuery(ctx, "provider", "list-consumer-chains")
if err != nil {
return err
}
consumerChain := gjson.GetBytes(consumerChains, fmt.Sprintf("chains.#(chain_id=%q)", c.cfg.ChainID))
if consumerChain.Get("consumer_id").Exists() {
consumerID = consumerChain.Get("consumer_id").String()
}

// Copy provider priv val keys to these nodes
for i, val := range c.Provider.Validators {
i := i
Expand All @@ -265,7 +277,7 @@ func (c *CosmosChain) StartConsumer(testName string, ctx context.Context, additi
return fmt.Errorf("failed to get consumer validator pubkey: %w", err)
}
keyStr := strings.TrimSpace(string(key))
_, err = c.Provider.Validators[i].ExecTx(ctx, valKey, "provider", "assign-consensus-key", c.cfg.ChainID, keyStr)
_, err = c.Provider.Validators[i].ExecTx(ctx, valKey, "provider", "assign-consensus-key", consumerID, keyStr)
if err != nil {
return fmt.Errorf("failed to assign consumer validator pubkey: %w", err)
}
Expand All @@ -289,7 +301,11 @@ func (c *CosmosChain) StartConsumer(testName string, ctx context.Context, additi
if err != nil {
return fmt.Errorf("failed to query proposed chains: %w", err)
}
spawnTime := gjson.GetBytes(proposals, fmt.Sprintf("proposals.#(messages.0.content.chain_id==%q).messages.0.content.spawn_time", c.cfg.ChainID)).Time()
msgContent := gjson.GetBytes(proposals, fmt.Sprintf("proposals.#(messages.0.content.chain_id==%q).messages.0.content", c.cfg.ChainID))
if !msgContent.Exists() {
msgContent = gjson.GetBytes(proposals, fmt.Sprintf("proposals.#(messages.0.value.chain_id==%q).messages.0.value", c.cfg.ChainID))
}
spawnTime := msgContent.Get("spawn_time").Time()
c.log.Info("Waiting for chain to spawn", zap.Time("spawn_time", spawnTime), zap.String("chain_id", c.cfg.ChainID))
time.Sleep(time.Until(spawnTime))
if err := testutil.WaitForBlocks(ctx, 2, c.Provider); err != nil {
Expand All @@ -309,7 +325,7 @@ func (c *CosmosChain) StartConsumer(testName string, ctx context.Context, additi
return err
}

ccvStateMarshaled, _, err := c.Provider.GetNode().ExecQuery(ctx, "provider", "consumer-genesis", c.cfg.ChainID)
ccvStateMarshaled, _, err := c.Provider.GetNode().ExecQuery(ctx, "provider", "consumer-genesis", consumerID)
if err != nil {
return fmt.Errorf("failed to query provider for ccv state: %w", err)
}
Expand Down Expand Up @@ -433,9 +449,31 @@ func (c *CosmosChain) transformCCVState(ctx context.Context, ccvState []byte, co
if semver.Compare(providerVersion, icsVer400) > 0 {
imageVersion = providerVersion
}
toVersion = semver.Major(consumerVersion)
if toVersion == "v3" {
toVersion = semver.MajorMinor(consumerVersion)
if (semver.Major(providerVersion) == "v4" && semver.Compare(semver.MajorMinor(providerVersion), icsVer450) >= 0) ||
(semver.Major(providerVersion) == "v6" && semver.Compare(semver.MajorMinor(providerVersion), icsVer640) >= 0) {
switch semver.Major(consumerVersion) {
case "v4":
if semver.Compare("v4.5.0", consumerVersion) >= 0 {
toVersion = "v4.5"
} else {
toVersion = "<v4.5"
}
case "v5":
toVersion = "v5"
case "v6":
toVersion = "<v6.4"
}
} else {
switch semver.Major(consumerVersion) {
case "v5":
toVersion = "v5"
case "v4":
toVersion = "v4"
case "v3":
toVersion = semver.MajorMinor(consumerVersion)
case "v2":
toVersion = "v2"
}
}
} else {
imageVersion = consumerVersion
Expand All @@ -447,8 +485,12 @@ func (c *CosmosChain) transformCCVState(ctx context.Context, ccvState []byte, co
if err != nil {
return nil, fmt.Errorf("failed to write ccv state to file: %w", err)
}
repo := icsCfg.ICSImageRepo
if repo == "" {
repo = "ghcr.io/strangelove-ventures/heighliner/ics"
}
job := dockerutil.NewImage(c.log, c.GetNode().DockerClient, c.GetNode().NetworkID,
c.GetNode().TestName, "ghcr.io/strangelove-ventures/heighliner/ics", imageVersion,
c.GetNode().TestName, repo, imageVersion,
)
cmd := []string{"interchain-security-cd", "genesis", "transform"}
if toVersion != "" {
Expand Down
2 changes: 1 addition & 1 deletion chain/cosmos/module_gov.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ func (tn *ChainNode) UpgradeProposal(ctx context.Context, keyName string, prop S
},
}

proposal, err := cosmosChain.BuildProposal([]ProtoMessage{&msg}, prop.Title, prop.Description, "", prop.Deposit, prop.Proposer, prop.Expedited)
proposal, err := cosmosChain.BuildProposal([]ProtoMessage{&msg}, prop.Title, prop.Description, "ipfs://CID", prop.Deposit, prop.Proposer, prop.Expedited)
if err != nil {
return "", err
}
Expand Down
5 changes: 3 additions & 2 deletions examples/ibc/ics_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,11 @@ import (
"github.com/strangelove-ventures/interchaintest/v8/testreporter"
"github.com/stretchr/testify/require"
"go.uber.org/zap/zaptest"
"golang.org/x/mod/semver"
)

var (
icsVersions = []string{"v3.1.0", "v3.3.0", "v4.0.0"}
icsVersions = []string{"v3.1.0", "v3.3.0", "v4.0.0", "v5.0.0"}
vals = 2
fNodes = 0
providerChainID = "provider-1"
Expand Down Expand Up @@ -60,7 +61,7 @@ func icsTest(t *testing.T, version string, rly ibc.RelayerImplementation) {
ctx := context.Background()

consumerBechPrefix := "cosmos"
if version == "v4.0.0" {
if semver.Compare(version, "v4.0.0") >= 0 {
consumerBechPrefix = "consumer"
}

Expand Down
Loading
Loading