Skip to content

Commit

Permalink
Test that rewards work with sovereign -> consumer changeovers
Browse files Browse the repository at this point in the history
  • Loading branch information
fastfadingviolets committed Oct 21, 2024
1 parent 47dc32d commit acc3788
Show file tree
Hide file tree
Showing 10 changed files with 321 additions and 110 deletions.
4 changes: 2 additions & 2 deletions tests/interchain/chainsuite/chain.go
Original file line number Diff line number Diff line change
Expand Up @@ -237,10 +237,10 @@ func (c *Chain) GetValidatorHex(ctx context.Context, val int) (string, error) {
}

func getValidatorWallets(ctx context.Context, chain *Chain) ([]ValidatorWallet, error) {
wallets := make([]ValidatorWallet, ValidatorCount)
wallets := make([]ValidatorWallet, len(chain.Validators))
lock := new(sync.Mutex)
eg := new(errgroup.Group)
for i := 0; i < ValidatorCount; i++ {
for i := range chain.Validators {
i := i
eg.Go(func() error {
// This moniker is hardcoded into the chain's genesis process.
Expand Down
128 changes: 29 additions & 99 deletions tests/interchain/chainsuite/chain_ics.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,20 @@ import (
type ConsumerBootstrapCb func(ctx context.Context, consumer *cosmos.CosmosChain)

type ConsumerConfig struct {
ChainName string
Version string
Denom string
ShouldCopyProviderKey [ValidatorCount]bool
TopN int
ValidatorSetCap int
ValidatorPowerCap int
AllowInactiveVals bool
MinStake uint64
Allowlist []string
Denylist []string
spec *interchaintest.ChainSpec
ChainName string
Version string
Denom string
ShouldCopyProviderKey [ValidatorCount]bool
TopN int
ValidatorSetCap int
ValidatorPowerCap int
AllowInactiveVals bool
MinStake uint64
Allowlist []string
Denylist []string
InitialHeight uint64
DistributionTransmissionChannel string
Spec *interchaintest.ChainSpec

DuringDepositPeriod ConsumerBootstrapCb
DuringVotingPeriod ConsumerBootstrapCb
Expand Down Expand Up @@ -124,15 +126,15 @@ func (p *Chain) AddConsumerChain(ctx context.Context, relayer *Relayer, config C
}
}

if config.spec == nil {
config.spec = p.DefaultConsumerChainSpec(ctx, chainID, config, spawnTime, proposalWaiter)
if config.Spec == nil {
config.Spec = p.DefaultConsumerChainSpec(ctx, chainID, config, spawnTime, proposalWaiter)
}
if semver.Compare(p.GetNode().ICSVersion(ctx), "v4.1.0") > 0 && config.spec.InterchainSecurityConfig.ProviderVerOverride == "" {
config.spec.InterchainSecurityConfig.ProviderVerOverride = "v4.1.0"
if semver.Compare(p.GetNode().ICSVersion(ctx), "v4.1.0") > 0 && config.Spec.InterchainSecurityConfig.ProviderVerOverride == "" {
config.Spec.InterchainSecurityConfig.ProviderVerOverride = "v4.1.0"
}
cf := interchaintest.NewBuiltinChainFactory(
GetLogger(ctx),
[]*interchaintest.ChainSpec{config.spec},
[]*interchaintest.ChainSpec{config.Spec},
)
chains, err := cf.Chains(p.GetNode().TestName)
if err != nil {
Expand Down Expand Up @@ -203,7 +205,7 @@ func (p *Chain) AddConsumerChain(ctx context.Context, relayer *Relayer, config C
if err := relayer.StartRelayer(ctx, rep); err != nil {
return nil, err
}
err = connectProviderConsumer(ctx, p, consumer, relayer)
err = relayer.ConnectProviderConsumer(ctx, p, consumer)
if err != nil {
return nil, err
}
Expand All @@ -212,17 +214,22 @@ func (p *Chain) AddConsumerChain(ctx context.Context, relayer *Relayer, config C
}

func (p *Chain) CreateConsumerPermissionless(ctx context.Context, chainID string, config ConsumerConfig, spawnTime time.Time) error {
revisionHeight := config.InitialHeight
if revisionHeight == 0 {
revisionHeight = 1
}
initParams := &providertypes.ConsumerInitializationParameters{
InitialHeight: clienttypes.Height{RevisionNumber: clienttypes.ParseChainID(chainID), RevisionHeight: 1},
InitialHeight: clienttypes.Height{RevisionNumber: clienttypes.ParseChainID(chainID), RevisionHeight: revisionHeight},
SpawnTime: spawnTime,
BlocksPerDistributionTransmission: 1000,
BlocksPerDistributionTransmission: BlocksPerDistribution,
CcvTimeoutPeriod: 2419200000000000,
TransferTimeoutPeriod: 3600000000000,
ConsumerRedistributionFraction: "0.75",
HistoricalEntries: 10000,
UnbondingPeriod: 1728000000000000,
GenesisHash: []byte("Z2VuX2hhc2g="),
BinaryHash: []byte("YmluX2hhc2g="),
DistributionTransmissionChannel: config.DistributionTransmissionChannel,
}
powerShapingParams := &providertypes.PowerShapingParameters{
Top_N: 0,
Expand Down Expand Up @@ -453,83 +460,6 @@ func (p *Chain) DefaultConsumerChainSpec(ctx context.Context, chainID string, co
}
}

func connectProviderConsumer(ctx context.Context, provider *Chain, consumer *Chain, relayer *Relayer) error {
icsPath := relayerICSPathFor(provider, consumer)
rep := GetRelayerExecReporter(ctx)
if err := relayer.GeneratePath(ctx, rep, consumer.Config().ChainID, provider.Config().ChainID, icsPath); err != nil {
return err
}

consumerClients, err := relayer.GetClients(ctx, rep, consumer.Config().ChainID)
if err != nil {
return err
}

var consumerClient *ibc.ClientOutput
for _, client := range consumerClients {
if client.ClientState.ChainID == provider.Config().ChainID {
consumerClient = client
break
}
}
if consumerClient == nil {
return fmt.Errorf("consumer chain %s does not have a client tracking the provider chain %s", consumer.Config().ChainID, provider.Config().ChainID)
}
consumerClientID := consumerClient.ClientID

providerClients, err := relayer.GetClients(ctx, rep, provider.Config().ChainID)
if err != nil {
return err
}

var providerClient *ibc.ClientOutput
for _, client := range providerClients {
if client.ClientState.ChainID == consumer.Config().ChainID {
providerClient = client
break
}
}
if providerClient == nil {
return fmt.Errorf("provider chain %s does not have a client tracking the consumer chain %s for path %s on relayer %s",
provider.Config().ChainID, consumer.Config().ChainID, icsPath, relayer)
}
providerClientID := providerClient.ClientID

if err := relayer.UpdatePath(ctx, rep, icsPath, ibc.PathUpdateOptions{
SrcClientID: &consumerClientID,
DstClientID: &providerClientID,
}); err != nil {
return err
}

if err := relayer.CreateConnections(ctx, rep, icsPath); err != nil {
return err
}

if err := relayer.CreateChannel(ctx, rep, icsPath, ibc.CreateChannelOptions{
SourcePortName: "consumer",
DestPortName: "provider",
Order: ibc.Ordered,
Version: "1",
}); err != nil {
return err
}

tCtx, tCancel := context.WithTimeout(ctx, 30*CommitTimeout)
defer tCancel()
for tCtx.Err() == nil {
var ch *ibc.ChannelOutput
ch, err = relayer.GetTransferChannel(ctx, provider, consumer)
if err == nil && ch != nil {
break
} else if err == nil {
err = fmt.Errorf("channel not found")
}
time.Sleep(CommitTimeout)
}
return err
}

func (p *Chain) SubmitConsumerAdditionProposal(ctx context.Context, chainID string, config ConsumerConfig, spawnTime time.Time) (*proposalWaiter, chan error, error) {
propWaiter := newProposalWaiter()
prop := p.buildConsumerAdditionJSON(chainID, config, spawnTime)
Expand Down Expand Up @@ -577,7 +507,7 @@ func (p *Chain) buildConsumerAdditionJSON(chainID string, config ConsumerConfig,
BinaryHash: []byte("bin_hash"),
SpawnTime: spawnTime,

BlocksPerDistributionTransmission: 1000,
BlocksPerDistributionTransmission: BlocksPerDistribution,
CcvTimeoutPeriod: 2419200000000000,
TransferTimeoutPeriod: 3600000000000,
ConsumerRedistributionFraction: "0.75",
Expand Down Expand Up @@ -646,7 +576,7 @@ func (p *Chain) CheckCCV(ctx context.Context, consumer *Chain, relayer *Relayer,
}
}

tCtx, tCancel := context.WithTimeout(ctx, 15*time.Minute)
tCtx, tCancel := context.WithTimeout(ctx, 5*time.Minute)
defer tCancel()
var retErr error
for tCtx.Err() == nil {
Expand Down
84 changes: 84 additions & 0 deletions tests/interchain/chainsuite/relayer.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"context"
"encoding/json"
"fmt"
"sort"
"time"

"github.com/strangelove-ventures/interchaintest/v8"
"github.com/strangelove-ventures/interchaintest/v8/ibc"
Expand Down Expand Up @@ -116,6 +118,88 @@ func (r *Relayer) ClearTransferChannel(ctx context.Context, chainA, chainB *Chai
return nil
}

func (r *Relayer) ConnectProviderConsumer(ctx context.Context, provider *Chain, consumer *Chain) error {
icsPath := relayerICSPathFor(provider, consumer)
rep := GetRelayerExecReporter(ctx)
if err := r.GeneratePath(ctx, rep, consumer.Config().ChainID, provider.Config().ChainID, icsPath); err != nil {
return err
}

consumerClients, err := r.GetClients(ctx, rep, consumer.Config().ChainID)
if err != nil {
return err
}
sort.Slice(consumerClients, func(i, j int) bool {
return consumerClients[i].ClientID > consumerClients[j].ClientID
})
var consumerClient *ibc.ClientOutput
for _, client := range consumerClients {
if client.ClientState.ChainID == provider.Config().ChainID {
consumerClient = client
break
}
}
if consumerClient == nil {
return fmt.Errorf("consumer chain %s does not have a client tracking the provider chain %s", consumer.Config().ChainID, provider.Config().ChainID)
}
consumerClientID := consumerClient.ClientID

providerClients, err := r.GetClients(ctx, rep, provider.Config().ChainID)
if err != nil {
return err
}
sort.Slice(providerClients, func(i, j int) bool {
return providerClients[i].ClientID > providerClients[j].ClientID
})

var providerClient *ibc.ClientOutput
for _, client := range providerClients {
if client.ClientState.ChainID == consumer.Config().ChainID {
providerClient = client
break
}
}
if providerClient == nil {
return fmt.Errorf("provider chain %s does not have a client tracking the consumer chain %s for path %s on relayer %s",
provider.Config().ChainID, consumer.Config().ChainID, icsPath, r)
}
providerClientID := providerClient.ClientID

if err := r.UpdatePath(ctx, rep, icsPath, ibc.PathUpdateOptions{
SrcClientID: &consumerClientID,
DstClientID: &providerClientID,
}); err != nil {
return err
}

if err := r.CreateConnections(ctx, rep, icsPath); err != nil {
return err
}

if err := r.CreateChannel(ctx, rep, icsPath, ibc.CreateChannelOptions{
SourcePortName: "consumer",
DestPortName: "provider",
Order: ibc.Ordered,
Version: "1",
}); err != nil {
return err
}

tCtx, tCancel := context.WithTimeout(ctx, 30*CommitTimeout)
defer tCancel()
for tCtx.Err() == nil {
var ch *ibc.ChannelOutput
ch, err = r.GetTransferChannel(ctx, provider, consumer)
if err == nil && ch != nil {
break
} else if err == nil {
err = fmt.Errorf("channel not found")
}
time.Sleep(CommitTimeout)
}
return err
}

func relayerICSPathFor(chainA, chainB *Chain) string {
return fmt.Sprintf("ics-%s-%s", chainA.Config().ChainID, chainB.Config().ChainID)
}
Expand Down
2 changes: 1 addition & 1 deletion tests/interchain/feemarket_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"testing"
"time"

"github.com/cosmos/gaia/v20/tests/interchain/chainsuite"
"github.com/cosmos/gaia/v21/tests/interchain/chainsuite"
"github.com/strangelove-ventures/interchaintest/v8"
"github.com/strangelove-ventures/interchaintest/v8/chain/cosmos"
"github.com/strangelove-ventures/interchaintest/v8/testutil"
Expand Down
4 changes: 2 additions & 2 deletions tests/interchain/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ require (
cosmossdk.io/math v1.3.0
github.com/cometbft/cometbft v0.38.11
github.com/cosmos/cosmos-sdk v0.50.9
github.com/cosmos/gogoproto v1.7.0
github.com/cosmos/ibc-go/v8 v8.5.0
github.com/cosmos/interchain-security/v5 v5.1.1
github.com/docker/docker v27.1.2+incompatible
Expand Down Expand Up @@ -95,7 +96,6 @@ require (
github.com/cosmos/cosmos-proto v1.0.0-beta.5 // indirect
github.com/cosmos/go-bip39 v1.0.0 // indirect
github.com/cosmos/gogogateway v1.2.0 // indirect
github.com/cosmos/gogoproto v1.7.0 // indirect
github.com/cosmos/iavl v1.3.0 // indirect
github.com/cosmos/ibc-go/modules/capability v1.0.1 // indirect
github.com/cosmos/ics23/go v0.11.0 // indirect
Expand Down Expand Up @@ -292,4 +292,4 @@ require (
sigs.k8s.io/yaml v1.4.0 // indirect
)

replace github.com/strangelove-ventures/interchaintest/v8 => github.com/hyphacoop/interchaintest/v8 v8.2.1-0.20240904201357-3a54d751e08d
replace github.com/strangelove-ventures/interchaintest/v8 => github.com/hyphacoop/interchaintest/v8 v8.2.1-0.20241007153747-ed0a63d6cc1c
4 changes: 2 additions & 2 deletions tests/interchain/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -773,8 +773,8 @@ github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXM
github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc=
github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8=
github.com/hyphacoop/interchaintest/v8 v8.2.1-0.20240904201357-3a54d751e08d h1:3LXY5EWY78Qxh2t4h2rtcm/XpJdryN7bML2Nb0VfUjc=
github.com/hyphacoop/interchaintest/v8 v8.2.1-0.20240904201357-3a54d751e08d/go.mod h1:/4eZW5g+Gm5E7fCJvNVyjSlEyFkAfMzap4i8E6iqyyU=
github.com/hyphacoop/interchaintest/v8 v8.2.1-0.20241007153747-ed0a63d6cc1c h1:zTsxQIsnbocbpjqA6yEpM7nYYrqlF7EjWWFgHUEQtCE=
github.com/hyphacoop/interchaintest/v8 v8.2.1-0.20241007153747-ed0a63d6cc1c/go.mod h1:/4eZW5g+Gm5E7fCJvNVyjSlEyFkAfMzap4i8E6iqyyU=
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=
Expand Down
2 changes: 1 addition & 1 deletion tests/interchain/ica_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
sdk "github.com/cosmos/cosmos-sdk/types"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
"github.com/cosmos/gaia/v20/tests/interchain/chainsuite"
"github.com/cosmos/gaia/v21/tests/interchain/chainsuite"
"github.com/cosmos/gogoproto/proto"
icatypes "github.com/cosmos/ibc-go/v8/modules/apps/27-interchain-accounts/types"
"github.com/strangelove-ventures/interchaintest/v8"
Expand Down
2 changes: 1 addition & 1 deletion tests/interchain/lsm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"time"

sdkmath "cosmossdk.io/math"
"github.com/cosmos/gaia/v20/tests/interchain/chainsuite"
"github.com/cosmos/gaia/v21/tests/interchain/chainsuite"
"github.com/strangelove-ventures/interchaintest/v8"
"github.com/strangelove-ventures/interchaintest/v8/ibc"
"github.com/strangelove-ventures/interchaintest/v8/testutil"
Expand Down
Loading

0 comments on commit acc3788

Please sign in to comment.