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

feat(hard-fork): Implement rollapp hard fork #1354

Merged
merged 76 commits into from
Nov 14, 2024
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
c658ec5
initial renames according to adr
mtsitrin Oct 22, 2024
777dc32
reverting states
mtsitrin Oct 22, 2024
b713df3
removed frozen notation. added revision number in rollapp object
mtsitrin Oct 22, 2024
c3a08a5
Merge branch 'main' into mtsitrin/937-rollapp-hard-fork-hub-side
mtsitrin Oct 27, 2024
4d7ca18
cleanup
mtsitrin Oct 27, 2024
fffe076
UT compiles
mtsitrin Oct 27, 2024
e61d2af
fixed state deletion on fraud
mtsitrin Oct 27, 2024
654b069
UT pass
mtsitrin Oct 27, 2024
6782578
fixed StateInfoByHeight UT
mtsitrin Oct 28, 2024
c4d25ac
chainId revision check moved back to create rollapp. as it mess up dy…
mtsitrin Oct 28, 2024
3e06f20
PR comments
mtsitrin Oct 30, 2024
411f4c5
fixed basic sequencer logic to unbond all
mtsitrin Oct 30, 2024
b08a106
feat(hard_fork): part2 (Delyayed ack callback) (#1355)
mtsitrin Oct 31, 2024
617fa63
feat(hard_fork): Lightclient rollback (#1363)
mtsitrin Oct 31, 2024
076136a
feat(hard_fork): DRS and stateUpdate (#1369)
mtsitrin Oct 31, 2024
fe49c1c
feat(hard_fork): rollapp fraud proposal (#1371)
mtsitrin Nov 3, 2024
209f91e
feat(hard_fork): revision start height (#1373)
mtsitrin Nov 3, 2024
8e943b8
cleanup
mtsitrin Nov 3, 2024
31d5d25
Merge branch 'main' into mtsitrin/937-rollapp-hard-fork-hub-side
mtsitrin Nov 3, 2024
9f298af
lightClient doesn't trigger hard fork
mtsitrin Nov 3, 2024
67ec46a
clearing consesnsus state in descending order
mtsitrin Nov 3, 2024
3fda55a
fix UT
mtsitrin Nov 3, 2024
612a673
fraud proposal validates genesis bridge completed
mtsitrin Nov 3, 2024
4078e39
validate revision in header.Header.Version.App
mtsitrin Nov 3, 2024
e57988a
linter
mtsitrin Nov 3, 2024
13a56a5
linter
mtsitrin Nov 3, 2024
e6122d1
feat(hard_fork): delayed ack should create commitment after rolling b…
mtsitrin Nov 3, 2024
ef4afb1
register proposal handler
mtsitrin Nov 4, 2024
d2f8152
updating next proposer on state infos
mtsitrin Nov 4, 2024
d5933ff
feat(hard_fork): update hard fork to support new `x/sequencer` update…
mtsitrin Nov 6, 2024
1ca02de
Merge branch 'main' into mtsitrin/937-rollapp-hard-fork-hub-side
mtsitrin Nov 6, 2024
99e00ac
linter
mtsitrin Nov 6, 2024
10186d4
UT fix
mtsitrin Nov 6, 2024
839b3f3
minor update to fraud proposal
mtsitrin Nov 6, 2024
5a25e6d
delete pendingPacketsByAddress on the delayedAck
mtsitrin Nov 6, 2024
3639156
fixed seqeucner heoght pruning
mtsitrin Nov 6, 2024
c656859
fraud proposal supports future heights
mtsitrin Nov 6, 2024
204de23
fork hook doesn't return error
mtsitrin Nov 6, 2024
e318180
rotation doesn't go through sentinel proposer
mtsitrin Nov 6, 2024
5ec9170
simplified k.UpdateRollappPacketWithStatus interface
mtsitrin Nov 6, 2024
7c40f53
minor
mtsitrin Nov 6, 2024
5a3f9b5
minor log
mtsitrin Nov 6, 2024
6fc604a
Merge branch 'main' into mtsitrin/937-rollapp-hard-fork-hub-side
mtsitrin Nov 7, 2024
6914afb
fixed lightclient when setting canonical channel
mtsitrin Nov 7, 2024
47be8d3
feat(migrations): renamed vulnerable rollapps to obsolete (#1436)
keruch Nov 8, 2024
4f5c5bd
Danwt/mtsitrin 937 rollapp hard fork hub side rewardee (#1441)
danwt Nov 8, 2024
c4b48a7
Danwt/fix upgrade conflicts (#1442)
danwt Nov 8, 2024
5c42bf8
fix frozen
danwt Nov 8, 2024
569ff8f
Merge branch 'main' into mtsitrin/937-rollapp-hard-fork-hub-side
mtsitrin Nov 9, 2024
94f52ec
refactored to use Finalaization queue by rollappId
mtsitrin Nov 9, 2024
40b3557
fixed pruning of finalization queue
mtsitrin Nov 10, 2024
29bd020
cleared unused expected methods
mtsitrin Nov 10, 2024
44eccc4
linter
mtsitrin Nov 10, 2024
f44f36c
more cleanup
mtsitrin Nov 10, 2024
9c43639
comments
mtsitrin Nov 10, 2024
e3570f5
fixed packet commitment and lightclient comments
mtsitrin Nov 10, 2024
9cbc795
return err on HardFork hooks
mtsitrin Nov 10, 2024
44b14e2
not forking on state update with obsolete DRS
mtsitrin Nov 10, 2024
7e51835
linter
mtsitrin Nov 10, 2024
9743b8b
Merge branch 'main' into mtsitrin/937-rollapp-hard-fork-hub-side
mtsitrin Nov 10, 2024
5f6c7f6
renamed fraudHeight
mtsitrin Nov 10, 2024
9a482ba
add error to kickProposer flow
mtsitrin Nov 10, 2024
c25d2bc
fixed UT
mtsitrin Nov 10, 2024
3a876f4
deleteBySender moved to DeletePacket
mtsitrin Nov 10, 2024
5f69b7f
fixed surprise linter
mtsitrin Nov 10, 2024
861a25d
Merge branch 'main' into mtsitrin/937-rollapp-hard-fork-hub-side
mtsitrin Nov 10, 2024
73636ee
DRY pruneSigners code
mtsitrin Nov 11, 2024
93a59c8
feat(sequencer): hardforking when rotating to sentinel (#1455)
mtsitrin Nov 12, 2024
5fceea4
Merge branch 'main' into mtsitrin/937-rollapp-hard-fork-hub-side
mtsitrin Nov 12, 2024
14a5e85
PR comments
mtsitrin Nov 12, 2024
9f8b3ce
AfterRecoveryFromHalt hook cleanup
mtsitrin Nov 12, 2024
d0fb6c8
fixed missing setConsensusMetadata. fixed kicked proposer unbond
mtsitrin Nov 13, 2024
4918834
fixed unbond store
mtsitrin Nov 13, 2024
b4547dd
func renames for clarity
mtsitrin Nov 13, 2024
7bad2d0
inc case of future height fork, allow finalized last state
mtsitrin Nov 13, 2024
6b75606
feat(lightclient): export hard fork keys to genesis (#1470)
zale144 Nov 14, 2024
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
1 change: 1 addition & 0 deletions app/keepers/keepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,7 @@ func (a *AppKeepers) InitKeepers(
a.DelayedAckKeeper = *delayedackkeeper.NewKeeper(
appCodec,
a.keys[delayedacktypes.StoreKey],
a.keys[ibcexported.StoreKey],
a.GetSubspace(delayedacktypes.ModuleName),
a.RollappKeeper,
a.IBCKeeper.ChannelKeeper,
Expand Down
2 changes: 1 addition & 1 deletion app/upgrades/v4/upgrade.go
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,6 @@ func ConvertOldRollappToNew(oldRollapp rollapptypes.Rollapp) rollapptypes.Rollap
Owner: oldRollapp.Owner,
GenesisState: oldRollapp.GenesisState,
ChannelId: oldRollapp.ChannelId,
Frozen: oldRollapp.Frozen,
// TODO: regarding missing data - https://github.com/dymensionxyz/dymension/issues/986
VmType: rollapptypes.Rollapp_EVM, // placeholder data
Metadata: &rollapptypes.RollappMetadata{
Expand All @@ -248,6 +247,7 @@ func ConvertOldRollappToNew(oldRollapp rollapptypes.Rollapp) rollapptypes.Rollap
},
InitialSequencer: "*",
Launched: true,
RevisionNumber: 0,
}
}

Expand Down
2 changes: 2 additions & 0 deletions ibctesting/delayed_ack_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -235,3 +235,5 @@ func (s *delayedAckSuite) TestHubToRollappTimeout() {
postFinalizeBalance := bankKeeper.GetBalance(s.hubCtx(), senderAccount, sdk.DefaultBondDenom)
s.Require().Equal(preSendBalance.Amount, postFinalizeBalance.Amount)
}

// FIXME: test refunds due to hard fork + receipt deletion
134 changes: 131 additions & 3 deletions ibctesting/light_client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
errorsmod "cosmossdk.io/errors"
sdk "github.com/cosmos/cosmos-sdk/types"
clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
ibctm "github.com/cosmos/ibc-go/v7/modules/light-clients/07-tendermint"
"github.com/cosmos/ibc-go/v7/testing/simapp"

"github.com/dymensionxyz/dymension/v3/x/lightclient/types"
Expand Down Expand Up @@ -342,10 +343,137 @@ func (s *lightClientSuite) TestAfterUpdateState_OptimisticUpdateExists_NotCompat
)
_, err = s.rollappMsgServer().UpdateState(s.hubCtx(), msgUpdateState)
s.Error(err)

// Assert that hard fork was triggered
rollapp, _ := s.hubApp().RollappKeeper.GetRollapp(s.hubCtx(), s.rollappChain().ChainID)
s.Equal(uint64(1), rollapp.RevisionNumber)

// The optimistic update valhash should be removed as part of fraud handling
_, found = s.hubApp().LightClientKeeper.GetConsensusStateValHash(s.hubCtx(), s.path.EndpointA.ClientID, uint64(header.Header.Height))
s.False(found)
// Ensuring that the rollapp is now frozen as part of fraud handling
rollapp, _ := s.hubApp().RollappKeeper.GetRollapp(s.hubCtx(), s.rollappChain().ChainID)
s.True(rollapp.Frozen)
}

// Test the rollback flow for a light client
// - do some client updates
// - trigger rollback
// - validate rollback:
// - check if the client is frozen
// - validate IsHardForkingInProgress returns true
// - validate client updates are blocked
// - validate future consensus states are cleared
//
// - resolve hard fork
// - validate client is unfrozen and hard fork is resolved
// - validate the client is updated
// - validate the client is not in hard forking state
//
// - validate client updates are allowed
func (s *lightClientSuite) TestAfterUpdateState_Rollback() {
s.createRollapp(false, nil)
s.registerSequencer()
s.path = s.newTransferPath(s.hubChain(), s.rollappChain())
s.coordinator.SetupConnections(s.path)
s.hubApp().LightClientKeeper.SetCanonicalClient(s.hubCtx(), s.rollappChain().ChainID, s.path.EndpointA.ClientID)
s.coordinator.CreateChannels(s.path)

bds := rollapptypes.BlockDescriptors{}

for i := 0; i < 20; i++ {
s.coordinator.CommitBlock(s.hubChain(), s.rollappChain())

lastHeader := s.rollappChain().LastHeader
bd := rollapptypes.BlockDescriptor{Height: uint64(lastHeader.Header.Height), StateRoot: lastHeader.Header.AppHash, Timestamp: lastHeader.Header.Time}
bds.BD = append(bds.BD, bd)

if i%5 == 0 {
header, err := s.path.EndpointA.Chain.ConstructUpdateTMClientHeader(s.path.EndpointA.Counterparty.Chain, s.path.EndpointA.ClientID)
s.NoError(err)
msg, err := clienttypes.NewMsgUpdateClient(
s.path.EndpointA.ClientID, header,
s.path.EndpointA.Chain.SenderAccount.GetAddress().String(),
)
s.NoError(err)
_, err = s.path.EndpointA.Chain.SendMsgs(msg)
s.NoError(err)
}

}

// get number of consensus states before rollback
csBeforeRollback := s.hubApp().IBCKeeper.ClientKeeper.GetAllConsensusStates(s.hubCtx())[0].ConsensusStates

// Trigger rollback
rollbackHeight := uint64(s.rollappChain().LastHeader.Header.Height) - 5
s.hubApp().LightClientKeeper.RollbackCanonicalClient(s.hubCtx(), s.rollappChain().ChainID, rollbackHeight)

clientState, found := s.hubApp().IBCKeeper.ClientKeeper.GetClientState(s.hubCtx(), s.path.EndpointA.ClientID)
s.True(found)
tmClientState, ok := clientState.(*ibctm.ClientState)
s.True(ok)

// Check if the client is frozen
s.True(!tmClientState.FrozenHeight.IsZero(), "Client should be frozen after rollback")

// Check if IsHardForkingInProgress returns true
s.True(s.hubApp().LightClientKeeper.IsHardForkingInProgress(s.hubCtx(), s.rollappChain().ChainID), "Rollapp should be in hard forking state")

// Validate future consensus states are cleared
csAfterRollback := s.hubApp().IBCKeeper.ClientKeeper.GetAllConsensusStates(s.hubCtx())[0].ConsensusStates
s.Require().Less(len(csAfterRollback), len(csBeforeRollback), "Consensus states should be cleared after rollback")
for height := uint64(0); height <= uint64(s.rollappChain().LastHeader.Header.Height); height++ {
_, found := s.hubApp().IBCKeeper.ClientKeeper.GetClientConsensusState(s.hubCtx(), s.path.EndpointA.ClientID, clienttypes.NewHeight(1, height))
if height > rollbackHeight {
s.False(found, "Consensus state should be cleared for height %d", height)
}
}

// Validate client updates are blocked
header, err := s.path.EndpointA.Chain.ConstructUpdateTMClientHeader(s.path.EndpointA.Counterparty.Chain, s.path.EndpointA.ClientID)
s.NoError(err)
msg, err := clienttypes.NewMsgUpdateClient(
s.path.EndpointA.ClientID, header,
s.path.EndpointA.Chain.SenderAccount.GetAddress().String(),
)
s.NoError(err)
_, _, err = simapp.SignAndDeliver(
s.path.EndpointA.Chain.T,
s.path.EndpointA.Chain.TxConfig,
s.path.EndpointA.Chain.App.GetBaseApp(),
s.path.EndpointA.Chain.GetContext().BlockHeader(),
[]sdk.Msg{msg},
s.path.EndpointA.Chain.ChainID,
[]uint64{s.path.EndpointA.Chain.SenderAccount.GetAccountNumber()},
[]uint64{s.path.EndpointA.Chain.SenderAccount.GetSequence()},
true, false, s.path.EndpointA.Chain.SenderPrivKey,
)
s.ErrorIs(err, types.ErrorHardForkInProgress)

// submit a state info update to resolve the hard fork
blockDescriptors := &rollapptypes.BlockDescriptors{BD: bds.BD}
msgUpdateState := rollapptypes.NewMsgUpdateState(
s.hubChain().SenderAccount.GetAddress().String(),
rollappChainID(),
"mock-da-path",
bds.BD[0].Height,
uint64(len(bds.BD)),
blockDescriptors,
)
_, err = s.rollappMsgServer().UpdateState(s.hubCtx(), msgUpdateState)
s.Require().NoError(err)

// Test resolve hard fork
clientState, found = s.hubApp().IBCKeeper.ClientKeeper.GetClientState(s.hubCtx(), s.path.EndpointA.ClientID)
s.True(found)
// Verify that the client is unfrozen and hard fork is resolved
s.True(clientState.(*ibctm.ClientState).FrozenHeight.IsZero(), "Client should be unfrozen after hard fork resolution")
// Verify that the client is not in hard forking state
s.False(s.hubApp().LightClientKeeper.IsHardForkingInProgress(s.hubCtx(), s.rollappChain().ChainID), "Rollapp should not be in hard forking state")
// Verify that the client is updated with the height of the last block descriptor
s.Require().Equal(bds.BD[len(bds.BD)-1].Height, clientState.GetLatestHeight().GetRevisionHeight())
_, ok = s.hubApp().IBCKeeper.ClientKeeper.GetLatestClientConsensusState(s.hubCtx(), s.path.EndpointA.ClientID)
s.True(ok)

// validate client updates are no longer blocked
s.coordinator.CommitBlock(s.rollappChain())
s.NoError(s.path.EndpointA.UpdateClient())
}
1 change: 0 additions & 1 deletion proto/dymensionxyz/dymension/common/status.proto
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,4 @@ option go_package = "github.com/dymensionxyz/dymension/v3/x/common/types";
enum Status {
PENDING = 0;
FINALIZED = 1;
REVERTED = 3;
danwt marked this conversation as resolved.
Show resolved Hide resolved
}
2 changes: 1 addition & 1 deletion proto/dymensionxyz/dymension/rollapp/genesis.proto
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,5 @@ message GenesisState {

message RollappRegisteredDenoms {
string rollapp_id = 1;
repeated string denoms = 2 [(gogoproto.nullable) = false];
repeated string denoms = 2;
}
7 changes: 5 additions & 2 deletions proto/dymensionxyz/dymension/rollapp/rollapp.proto
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,10 @@ message Rollapp {
RollappGenesisState genesis_state = 7 [ (gogoproto.nullable) = false ];
// channel_id will be set to the canonical IBC channel of the rollapp.
string channel_id = 8;
// frozen is a boolean that indicates if the rollapp is frozen.
bool frozen = 9;

reserved 9;
reserved 10;

// metadata is the rollapp metadata
RollappMetadata metadata = 11;
// genesis_info keeps immutable rollapp fields
Expand Down Expand Up @@ -75,6 +75,9 @@ message Rollapp {
// The LastStateUpdateHeight HUB height when the last state update was
// received
int64 last_state_update_height = 18;

// The revision number of the rollapp. starts always with 0 revision
uint64 revision_number = 19;
mtsitrin marked this conversation as resolved.
Show resolved Hide resolved
}

// Rollapp summary is a compact representation of Rollapp
Expand Down
2 changes: 2 additions & 0 deletions proto/dymensionxyz/dymension/rollapp/tx.proto
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ message MsgUpdateState {
BlockDescriptors BDs = 7 [(gogoproto.nullable) = false];
// last is true if this is the last batch of the sequencer
bool last = 8;
// rollapp_revision is the revision of the rollapp chain
uint64 rollapp_revision = 9;
mtsitrin marked this conversation as resolved.
Show resolved Hide resolved
}

message MsgUpdateStateResponse {
Expand Down
6 changes: 6 additions & 0 deletions testutil/keeper/delayedack.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ import (

type ChannelKeeperStub struct{}

// SetPacketReceipt implements types.ChannelKeeper.
func (c ChannelKeeperStub) SetPacketReceipt(ctx sdk.Context, portID string, channelID string, sequence uint64) {
return
}

func (ChannelKeeperStub) LookupModuleByChannel(ctx sdk.Context, portID, channelID string) (string, *capabilitytypes.Capability, error) {
return "", nil, nil
}
Expand Down Expand Up @@ -137,6 +142,7 @@ func DelayedackKeeper(t testing.TB) (*keeper.Keeper, sdk.Context) {

k := keeper.NewKeeper(cdc,
storeKey,
nil,
paramsSubspace,
RollappKeeperStub{},
ICS4WrapperStub{},
Expand Down
21 changes: 20 additions & 1 deletion testutil/keeper/lightclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,11 @@ type MockIBCCLientKeeper struct {
clientStates map[string]exported.ClientState
}

// ClientStore implements types.IBCClientKeeperExpected.
func (m *MockIBCCLientKeeper) ClientStore(ctx sdk.Context, clientID string) storetypes.KVStore {
panic("unimplemented")
}

func NewMockIBCClientKeeper(
clientCS map[string]map[uint64]exported.ConsensusState,
genesisClients map[string]exported.ClientState,
Expand Down Expand Up @@ -136,6 +141,11 @@ type MockSequencerKeeper struct {
sequencers map[string]sequencertypes.Sequencer
}

// GetProposer implements types.SequencerKeeperExpected.
func (m *MockSequencerKeeper) GetProposer(ctx sdk.Context, rollappId string) (val sequencertypes.Sequencer, found bool) {
panic("unimplemented")
}

func (m *MockSequencerKeeper) UnbondingTime(ctx sdk.Context) (res time.Duration) {
return types.DefaultExpectedCanonicalClientParams().UnbondingPeriod
}
Expand All @@ -159,8 +169,17 @@ func (m *MockSequencerKeeper) GetSequencersByRollapp(ctx sdk.Context, rollappId
return seqs
}

func (m *MockSequencerKeeper) JailSequencerOnFraud(ctx sdk.Context, seqAddr string) error {
return nil
}

type MockRollappKeeper struct{}

// GetLatestStateInfo implements types.RollappKeeperExpected.
func (m *MockRollappKeeper) GetLatestStateInfo(ctx sdk.Context, rollappId string) (rollapptypes.StateInfo, bool) {
panic("unimplemented")
}

func NewMockRollappKeeper() *MockRollappKeeper {
return &MockRollappKeeper{}
}
Expand All @@ -180,6 +199,6 @@ func (m *MockRollappKeeper) GetStateInfo(ctx sdk.Context, rollappId string, inde
func (m *MockRollappKeeper) SetRollapp(ctx sdk.Context, rollapp rollapptypes.Rollapp) {
}

func (m *MockRollappKeeper) HandleFraud(ctx sdk.Context, rollappID, clientId string, fraudHeight uint64, seqAddr string) error {
func (m *MockRollappKeeper) HardFork(ctx sdk.Context, rollappID string, fraudHeight uint64) error {
return nil
}
4 changes: 0 additions & 4 deletions x/common/types/key_rollapp_packet.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ var (
PendingRollappPacketKeyPrefix = []byte{0x00, 0x01}
// FinalizedRollappPacketKeyPrefix is the prefix for finalized rollapp packets
FinalizedRollappPacketKeyPrefix = []byte{0x00, 0x02}
// RevertedRollappPacketKeyPrefix is the prefix for reverted rollapp packets
RevertedRollappPacketKeyPrefix = []byte{0x00, 0x03}
mtsitrin marked this conversation as resolved.
Show resolved Hide resolved
// keySeparatorBytes is used to separate the rollapp packet key parts
keySeparatorBytes = []byte("/")
)
Expand Down Expand Up @@ -100,8 +98,6 @@ func MustGetStatusBytes(status Status) []byte {
return PendingRollappPacketKeyPrefix
case Status_FINALIZED:
return FinalizedRollappPacketKeyPrefix
case Status_REVERTED:
return RevertedRollappPacketKeyPrefix
default:
panic(fmt.Sprintf("invalid packet status: %s", status))
}
Expand Down
18 changes: 7 additions & 11 deletions x/common/types/status.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions x/delayedack/client/cli/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ func CmdGetPacketsByRollapp() *cobra.Command {
cmd := &cobra.Command{
Use: "packets-by-rollapp rollapp-id [status] [type]",
Short: "Get packets by rollapp-id",
Long: `Get packets by rollapp-id. Can filter by status (pending/finalized/reverted) and by type (recv/ack/timeout)
Long: `Get packets by rollapp-id. Can filter by status (pending/finalized) and by type (recv/ack/timeout)
Example:
packets rollapp1
packets rollapp1 PENDING
Expand Down Expand Up @@ -124,7 +124,7 @@ func CmdGetPacketsByStatus() *cobra.Command {
cmd := &cobra.Command{
Use: "packets-by-status status [type]",
Short: "Get packets by status",
Long: `Get packets by status (pending/finalized/reverted). Can filter by type (recv/ack/timeout)
Long: `Get packets by status (pending/finalized). Can filter by type (recv/ack/timeout)
Example:
packets-by-status pending
packets-by-status finalized recv`,
Expand Down
Loading