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(appchains): IBC packets #187

Closed
Closed
Show file tree
Hide file tree
Changes from 48 commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
53177cf
feat(appchain): scaffold coordinator
MaxMustermann2 Aug 25, 2024
8ee1253
feat(appchain): scaffold subscriber
MaxMustermann2 Aug 25, 2024
a1158d5
feat(epochs): create number + id structure
MaxMustermann2 Aug 26, 2024
7c1922a
feat(appchain): add coordinator params
MaxMustermann2 Aug 26, 2024
f1bca4d
fix(epochs): invalidate negative duration
MaxMustermann2 Aug 27, 2024
9f9e994
fix(avs): stateful validation of staking assets
MaxMustermann2 Aug 27, 2024
0e1cd06
refactor(dogfood): carve `sortByPower` out
MaxMustermann2 Aug 27, 2024
9073b71
fix(dogfood): avoid duplicate validation
MaxMustermann2 Aug 27, 2024
e06c529
fix(dogfood): replace with max unbonding duration
MaxMustermann2 Aug 27, 2024
04e0d67
doc(app): add comment about slashing frac storage
MaxMustermann2 Aug 27, 2024
2f594b7
feat(appchain): allow sub chain creation
MaxMustermann2 Aug 27, 2024
4bd8948
chore(lint)
MaxMustermann2 Aug 31, 2024
13e6a72
Merge `develop`
MaxMustermann2 Aug 31, 2024
571c65e
fix(test): make avs test pass
MaxMustermann2 Aug 31, 2024
6f4cfa0
fix(appchain): remove superfluous test
MaxMustermann2 Aug 31, 2024
19ce74a
fix(epochs): update expected test message
MaxMustermann2 Aug 31, 2024
0a0688c
chore(lint)
MaxMustermann2 Aug 31, 2024
6cb92fc
chore(lint): proto lint
MaxMustermann2 Aug 31, 2024
ca8b2ee
chore: run proto gen
MaxMustermann2 Aug 31, 2024
cfba037
fix(appchain): remove floating point arithmetic
MaxMustermann2 Aug 31, 2024
013f938
fix(appchain): remove wrong comment
MaxMustermann2 Aug 31, 2024
dc7915d
doc(appchain): add comment about params expect
MaxMustermann2 Aug 31, 2024
607e12e
fix(appchain): remove superfluous fmt
MaxMustermann2 Aug 31, 2024
4a275d3
feat(appchain): report invalid json
MaxMustermann2 Aug 31, 2024
e9d8fc0
fix(utils): remove SliceStable and use Slice
MaxMustermann2 Aug 31, 2024
3be6882
doc(appchain): add more logging
MaxMustermann2 Aug 31, 2024
4401e3f
chore(lint)
MaxMustermann2 Aug 31, 2024
47714fc
fix(ci): pin the golang lint version
MaxMustermann2 Aug 31, 2024
2904a40
chore(lint): remove unused timestamp proto
MaxMustermann2 Aug 31, 2024
8d0db6c
refactor(dogfood,operator): carve out wrapped key
MaxMustermann2 Sep 1, 2024
079953e
feat(subscriber): load genesis validators
MaxMustermann2 Sep 1, 2024
eb18ccb
fix: unnecessary parent code import
MaxMustermann2 Sep 1, 2024
f99dbca
fix: remove double proto warning
MaxMustermann2 Sep 1, 2024
79833d5
refactor(operator): carve out AppendMany
MaxMustermann2 Sep 2, 2024
b12b362
feat(appchain): load subscriber genesis, ibc
MaxMustermann2 Sep 2, 2024
e2b541d
part 2 commit including handling
MaxMustermann2 Sep 9, 2024
0d235bb
Merge develop
MaxMustermann2 Sep 9, 2024
9b21e48
fix build
MaxMustermann2 Sep 9, 2024
a8a8d1f
chore: lint the proto file
MaxMustermann2 Sep 9, 2024
05cee6d
attempt to fix tests
MaxMustermann2 Sep 9, 2024
bd43d6a
fix retry
MaxMustermann2 Sep 9, 2024
f080f54
Merge develop
MaxMustermann2 Sep 9, 2024
5acf528
Fix tests
MaxMustermann2 Sep 9, 2024
00c8707
chore: fix lint by removing duplicated imports
MaxMustermann2 Sep 9, 2024
5438d85
chore: proto lint
MaxMustermann2 Sep 9, 2024
617d774
feat(appchains): part 4 PR
MaxMustermann2 Sep 10, 2024
8262852
Merge develop
MaxMustermann2 Sep 10, 2024
075fccf
fix: golang lint
MaxMustermann2 Sep 10, 2024
7b7058a
Merge branch 'develop' into appchains-pt2
MaxMustermann2 Oct 13, 2024
985e606
fix: respond to AI comments
MaxMustermann2 Oct 13, 2024
b52b87a
chore(appchain): golang lint
MaxMustermann2 Oct 13, 2024
dd499d1
respond to more AI comments
MaxMustermann2 Oct 13, 2024
14d4cb8
Merge branch 'appchains-pt2' into appchains-pt3
MaxMustermann2 Oct 13, 2024
8e931aa
app: introduce coordinator module
MaxMustermann2 Oct 18, 2024
7ecbfbf
Merge `develop`
MaxMustermann2 Oct 18, 2024
c59c3e2
fix(app): add module correctly
MaxMustermann2 Oct 22, 2024
cfca848
refactor: rename function param for clarity
MaxMustermann2 Oct 28, 2024
0ca361d
refactor: rename object for clarity
MaxMustermann2 Oct 28, 2024
f9554f2
Merge `develop`
MaxMustermann2 Oct 28, 2024
e7a6165
Merge branch 'appchains-pt2' into appchains-pt3
MaxMustermann2 Oct 28, 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
2 changes: 2 additions & 0 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -585,6 +585,8 @@ func NewExocoreApp(
// the validator signature rate and informs the staking keeper to perform the requisite
// slashing. all its other operations are offloaded to Exocore keepers via the dogfood or
// the operator module.
// NOTE: the slashing keeper stores the parameters (slash rate) for the dogfood
// keeper, since all slashing (for this chain) begins within this keeper.
app.SlashingKeeper = slashingkeeper.NewKeeper(
appCodec, app.LegacyAmino(), keys[slashingtypes.StoreKey],
app.StakingKeeper, authAddrString,
Expand Down
6 changes: 3 additions & 3 deletions precompiles/avs/avs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ func (suite *AVSManagerPrecompileSuite) TestRegisterAVS() {
sdk.AccAddress(utiltx.GenerateAddress().Bytes()).String(),
sdk.AccAddress(utiltx.GenerateAddress().Bytes()).String(),
}
assetID := []string{"11", "22", "33"}
assetID := suite.AssetIDs
minStakeAmount, taskAddr := uint64(3), "0xDF907c29719154eb9872f021d21CAE6E5025d7aB"
avsUnbondingPeriod, minSelfDelegation := uint64(3), uint64(3)
epochIdentifier := epochstypes.DayEpochID
Expand Down Expand Up @@ -311,7 +311,7 @@ func (suite *AVSManagerPrecompileSuite) TestUpdateAVS() {
sdk.AccAddress(utiltx.GenerateAddress().Bytes()).String(),
sdk.AccAddress(utiltx.GenerateAddress().Bytes()).String(),
}
assetID := []string{"11", "22", "33"}
assetID := suite.AssetIDs
minStakeAmount, taskAddr := uint64(3), "0xDF907c29719154eb9872f021d21CAE6E5025d7aB"
avsUnbondingPeriod, minSelfDelegation := uint64(3), uint64(3)
epochIdentifier := epochstypes.DayEpochID
Expand Down Expand Up @@ -656,7 +656,7 @@ func (suite *AVSManagerPrecompileSuite) TestRunRegTaskInfo() {
"exo13h6xg79g82e2g2vhjwg7j4r2z2hlncelwutkjr",
"exo13h6xg79g82e2g2vhjwg7j4r2z2hlncelwutkj2",
}
assetID := []string{"11", "22", "33"}
assetID := suite.AssetIDs
avsInfo := &types.AVSInfo{
Name: avsName,
AvsAddress: utiltx.GenerateAddress().String(),
Expand Down
18 changes: 14 additions & 4 deletions proto/buf.lock
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ deps:
- remote: buf.build
owner: cosmos
repository: cosmos-proto
commit: 1935555c206d4afb9e94615dfd0fad31
digest: shake256:c74d91a3ac7ae07d579e90eee33abf9b29664047ac8816500cf22c081fec0d72d62c89ce0bebafc1f6fec7aa5315be72606717740ca95007248425102c365377
commit: 04467658e59e44bbb22fe568206e1f70
digest: shake256:73a640bd60e0c523b0f8237ff34eab67c45a38b64bbbde1d80224819d272dbf316ac183526bd245f994af6608b025f5130483d0133c5edd385531326b5990466
- remote: buf.build
owner: cosmos
repository: cosmos-sdk
Expand All @@ -16,8 +16,18 @@ deps:
repository: gogo-proto
commit: 88ef6483f90f478fb938c37dde52ece3
digest: shake256:89c45df2aa11e0cff97b0d695436713db3d993d76792e9f8dc1ae90e6ab9a9bec55503d48ceedd6b86069ab07d3041b32001b2bfe0227fa725dd515ff381e5ba
- remote: buf.build
owner: cosmos
repository: ibc
commit: fbb44f5ad3194450af479a615fa715d9
digest: shake256:3fbf41c96089017ebf3b5143f78de0d531f604cb11da1bc98b2104eb6dd295b8a49f5f35c60b8389ba50bfa08959da905109324099e75ece9afd8e4087b14019
- remote: buf.build
owner: cosmos
repository: ics23
commit: 55085f7c710a45f58fa09947208eb70b
digest: shake256:9bf0bc495b5a11c88d163d39ef521bc4b00bc1374a05758c91d82821bdc61f09e8c2c51dda8452529bf80137f34d852561eacbe9550a59015d51cecb0dacb628
- remote: buf.build
owner: googleapis
repository: googleapis
commit: e874a0be2bf140a5a4c7d4122c635823
digest: shake256:4fe3036b4d706f6ee2b13c730bd04777f021dfd02ed27e6e40480acfe664a7548238312ee0727fd77648a38d227e296d43f4a38a34cdd46068156211016d9657
commit: 8bc2c51e08c447cd8886cdea48a73e14
digest: shake256:a969155953a5cedc5b2df5b42c368f2bc66ff8ce1804bc96e0f14ff2ee8a893687963058909df844d1643cdbc98ff099d2daa6bc9f9f5b8886c49afdc60e19af
2 changes: 2 additions & 0 deletions proto/buf.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ version: v1
name: buf.build/evmos/evmos
deps:
- buf.build/cosmos/cosmos-sdk:v0.47.0
- buf.build/cosmos/ibc:fbb44f5ad3194450af479a615fa715d9
- buf.build/cosmos/cosmos-proto
- buf.build/cosmos/gogo-proto
- buf.build/cosmos/ics23:b1abd8678aab07165efd453c96796a179eb3131f
- buf.build/googleapis/googleapis
lint:
use:
Expand Down
125 changes: 125 additions & 0 deletions proto/exocore/appchain/common/v1/common.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
syntax = "proto3";

package exocore.appchain.common.v1;

import "amino/amino.proto";
import "cosmos_proto/cosmos.proto";
import "gogoproto/gogo.proto";
import "google/protobuf/any.proto";
import "google/protobuf/duration.proto";
import "ibc/lightclients/tendermint/v1/tendermint.proto";
import "tendermint/abci/types.proto";

option go_package = "github.com/ExocoreNetwork/exocore/x/appchain/common/types";

// This file contains all of the types shared within the coordinator module
// and each of the subscriber modules. These types (or parts thereof) are stored
// within the module states but not sent over the wire.

// Params defines the parameters for the subscriber module. TODO(mm): These must be deny listed
// for edits via governance on the subscriber chain to prevent the subcriber participants
// from unilaterally alterting parameters (like reward %) for their own benefit.
message SubscriberParams {
// Reward related params

// coordinator_fee_pool_addr_str is the address of the fee pool on the coordinator.
string coordinator_fee_pool_addr_str = 1;
// distribution_transmission_channel is the channel name used to transmit
// the rewards from the subscriber to the coordinator. It is used in the event
// that a channel between coordinator and subscriber exists prior to the
// provision of security from Exocore to the appchain. Until a changeover
// process is implemented, it is currently unused. (TODO)
string distribution_transmission_channel = 2;
// blocks_per_distribution_transmission is the number of blocks after which the minted
// reward is sent to the coordinator.
int64 blocks_per_distribution_transmission = 3;
// subscriber_redistribution_fraction is the %age of the rewards that the subscriber
// should send out. For example, "0.75" means 75% of the rewards are sent out.
string subscriber_redistribution_fraction = 4;
// reward_denom is the denomination of the reward. For now, this is not
// distributed but rather simply tracked.
string reward_denom = 5;

// IBC related params

// ibc_timeout_period is the timeout period used for IBC packets (excluding transfers)
// Such a timeout is enforced by IBC itself and not by either of the chains.
google.protobuf.Duration ibc_timeout_period = 6
[ (gogoproto.nullable) = false, (gogoproto.stdduration) = true,
(gogoproto.customname) = "IBCTimeoutPeriod" ];
// transfer_timeout_period is the timeout period used for IBC transfers.
google.protobuf.Duration transfer_timeout_period = 7
[ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ];

// Params relevant to chain operation
// unbonding_duration is the subscriber chain's unbonding duration. it should be less
// than the coordinator chain's unbonding duration.
// for now, we don't support the subscriber chain using x/epochs as a unit of time; however,
// when we do, this duration should be the best approximation of that mechanism, with
// 1 epoch added to account for the current epoch. (TODO)
google.protobuf.Duration unbonding_period = 8
[ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ];
// HistoricalEntries is the number of historical entries to persist in the
// historical stats module. It is the same as that defined in the staking module,
// however, we use the signed version so that negative values can be caught.
int64 historical_entries = 9;

// These are params related to the slashing module. Requests are received
// from the subscriber and slashed according to these params. Since signing
// can only be tracked by the subscriber chain, we do not have any parameters
// here that can be used to configure the signing window and the number of
// blocks that should be signed in it. Conversely, the subscriber chain
// does not do anything with these parameters (even though they are shared)
// since slashing is done by the coordinator chain.
// Operators should refer to the genesis file of the subscriber chain to
// check their comfort with these values before onboarding the chain.

// slash_fraction_downtime is the fraction of the stake that is slashed when a
// validator is found to be offline.
string slash_fraction_downtime = 15;
// downtime_jail_duration is the duration of the jail period for a validator
// after they have been found to be offline for too long.
google.protobuf.Duration downtime_jail_duration = 16
[(gogoproto.nullable) = false, (amino.dont_omitempty) = true, (gogoproto.stdduration) = true];
// slash_fraction_double_sign is the fraction of the stake that is slashed
// when a validator is found to have double signed.
string slash_fraction_double_sign = 17;
}

// SubscriberGenesisState is the genesis state of a subscriber at the time of
// it being provisioned by Exocore, as stored in the coordinator module.
message SubscriberGenesisState {
// params is the parameters of the subscriber module, as generated.
SubscriberParams params = 1 [(gogoproto.nullable) = false];
// coordinator is the coordinator information for the subscriber.
CoordinatorInfo coordinator = 2 [ (gogoproto.nullable) = false ];
}

// CoordinatorInfo is the information about the coordinator chain that is
// stored within the subscriber chain's subscriber module.
message CoordinatorInfo {
// client_state is the client state of the coordinator chain.
ibc.lightclients.tendermint.v1.ClientState client_state = 1;
// consensus_state is the consensus state of the coordinator chain.
ibc.lightclients.tendermint.v1.ConsensusState consensus_state = 2;
// initial_val_set is the initial validator set of the subscriber chain.
repeated .tendermint.abci.ValidatorUpdate initial_val_set = 3
[ (gogoproto.nullable) = false ];
}

// SubscriberValidator is a validator structure on the subscriber chain. It is stored
// within the subscriber module, indexed by a prefix + consensus address, and
// within the coordinator module, indexed by a prefix + chain id + consensus address.
message SubscriberValidator {
// address, as derived from the consensus key. No correlation with the operator
// address on Exocore.
bytes cons_address = 1;
// power is the vote power of the validator
int64 power = 2;
// pubkey is the consensus public key of the validator, as a Protobuf Any.
// this type is chosen to match the x/staking/validator type.
google.protobuf.Any pubkey = 3 [
(cosmos_proto.accepts_interface) = "cosmos.crypto.PubKey",
(gogoproto.moretags) = "yaml:\"consensus_pubkey\""
];
}
87 changes: 87 additions & 0 deletions proto/exocore/appchain/common/v1/wire.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
syntax = "proto3";

package exocore.appchain.common.v1;

import "cosmos/staking/v1beta1/staking.proto";
import "gogoproto/gogo.proto";
import "tendermint/abci/types.proto";

option go_package = "github.com/ExocoreNetwork/exocore/x/appchain/common/types";

// This file containts all of the information that is sent over the wire by either
// the coordinator or each of the subcribers.

message HandshakeMetadata {
// coordinator_fee_pool_addr is the address on the coordinator to which the
// subscriber chain will send the fees proportionally and periodically.
string coordinator_fee_pool_addr = 1;
// version is the version of the appchain protocol
string version = 2;
}

// SlashPacketData is sent from the subscriber chain to the coordinator chain
// to request the slashing of a validator as a result of an infraction committed
// on the subscriber chain.
message SlashPacketData {
// validator is the validator to be slashed
tendermint.abci.Validator validator = 1 [
(gogoproto.nullable) = false,
(gogoproto.moretags) = "yaml:\"validator\""
];
// valset_update_id is the id of the validator set change during which
// the infraction was committed
uint64 valset_update_id = 2 [ (gogoproto.customname) = "ValsetUpdateID" ];
// infraction refers to the type of infraction committed
cosmos.staking.v1beta1.Infraction infraction = 3;
}

// VscMaturedPacketData is sent from the subscriber chain to the coordinator chain
// to indicate that a VSC has matured and unbondings associated with that VSC
// can now be released.
message VscMaturedPacketData {
// valset_update_id is the id of the validator set change to mature.
uint64 valset_update_id = 1 [ (gogoproto.customname) = "ValsetUpdateID" ];
}

// SubscriberPacketData is the enum to identify the type of packet sent.
enum SubscriberPacketDataType {
option (gogoproto.goproto_enum_prefix) = false;
// SUBSCRIBER_PACKET_DATA_TYPE_UNSPECIFIED is the default value
SUBSCRIBER_PACKET_DATA_TYPE_UNSPECIFIED = 0 [ (gogoproto.enumvalue_customname) = "UnspecifiedPacket" ];
// SUBSCRIBER_PACKET_DATA_TYPE_SLASH is the type of packet sent when a subscriber
// chain wants to request the slashing of a validator on the coordinator chain.
SUBSCRIBER_PACKET_DATA_TYPE_SLASH = 1 [ (gogoproto.enumvalue_customname) = "SlashPacket" ];
// SUBSCRIBER_PACKET_DATA_TYPE_VSC_MATURED is the type of packet sent when a subscriber
// chain wants to indicate that a VSC has matured and unbondings associated with
// that VSC can now be released.
SUBSCRIBER_PACKET_DATA_TYPE_VSC_MATURED = 2 [ (gogoproto.enumvalue_customname) = "VscMaturedPacket" ];
}

// SubscriberPacketData is a wrapped message that contains the type of packet
// and the data associated with that packet.
message SubscriberPacketData {
// type is the type of packet sent
SubscriberPacketDataType type = 1;
// data is the data associated with the packet
oneof data {
// slash_packet_data is the data associated with a SlashPacket
SlashPacketData slash_packet_data = 2;
// vsc_matured_packet_data is the data associated with a VscMaturedPacket
VscMaturedPacketData vsc_matured_packet_data = 3;
}
}

// ValidatorSetChangePacketData is sent from the coordinator chain to the subscriber chain
// containing the new validator set and the id of the validator set change.
message ValidatorSetChangePacketData {
// validator_updates is the edits to the existing validator set
repeated .tendermint.abci.ValidatorUpdate validator_updates = 1 [
(gogoproto.nullable) = false,
(gogoproto.moretags) = "yaml:\"validator_updates\""
];
// valset_update_id is the id of the validator set change
uint64 valset_update_id = 2 [(gogoproto.customname) = "ValsetUpdateID"];
// slash_acks is the list of consensus addresses slashed on the coordinator chain,
// in response to such requests from the subscriber chain.
repeated bytes slash_acks = 3;
}
42 changes: 42 additions & 0 deletions proto/exocore/appchain/coordinator/v1/coordinator.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
syntax = "proto3";

package exocore.appchain.coordinator.v1;

import "exocore/appchain/common/v1/wire.proto";
import "exocore/appchain/coordinator/v1/tx.proto";
import "gogoproto/gogo.proto";

option go_package = "github.com/ExocoreNetwork/exocore/x/appchain/coordinator/types";

// PendingSubscriberChainRequests is a helper structure to store a list of
// subscriber chain requests that are pending activation.
message PendingSubscriberChainRequests {
// list is the list of subscriber chain requests that are pending activation.
repeated .exocore.appchain.coordinator.v1.RegisterSubscriberChainRequest list = 1
[(gogoproto.nullable) = false];
}

// ChainIDs is a helper structure to store a list of chain IDs.
message ChainIDs {
// list is the list of chain IDs.
repeated string list = 1;
}

// ConsensusAddresses is a list of consensus addresses.
message ConsensusAddresses {
// list is the list of consensus addresses.
repeated bytes list = 1;
}

// ValidatorSetChangePackets is a helper structure to store a list of packets
message ValidatorSetChangePackets {
// list is the list of packets to be sent to the subscriber chain.
repeated .exocore.appchain.common.v1.ValidatorSetChangePacketData list = 1
[(gogoproto.nullable) = false];
}

// UndelegationRecordKeys is a collection of undelegation record keys.
message UndelegationRecordKeys {
// list is the list of undelegation record keys.
repeated bytes list = 1;
}
14 changes: 14 additions & 0 deletions proto/exocore/appchain/coordinator/v1/genesis.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
syntax = "proto3";

package exocore.appchain.coordinator.v1;

import "exocore/appchain/coordinator/v1/params.proto";
import "gogoproto/gogo.proto";

option go_package = "github.com/ExocoreNetwork/exocore/x/appchain/coordinator/types";

// GenesisState is the genesis state for the appchain coordinator module.
message GenesisState {
// Params is the parameters for the appchain coordinator module.
Params params = 1 [(gogoproto.nullable) = false];
}
34 changes: 34 additions & 0 deletions proto/exocore/appchain/coordinator/v1/params.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
syntax = "proto3";

package exocore.appchain.coordinator.v1;

import "exocore/epochs/v1/epochs.proto";
import "gogoproto/gogo.proto";
import "google/protobuf/duration.proto";
import "ibc/lightclients/tendermint/v1/tendermint.proto";

option go_package = "github.com/ExocoreNetwork/exocore/x/appchain/coordinator/types";

// Params is the parameters for the appchain coordinator module.
message Params {
// template_client is the IBC template client.
ibc.lightclients.tendermint.v1.ClientState template_client = 1;
// trusting_period_fraction is the multiplier applied on the subscriber's
// unbonding duration to determine the IBC trusting period.
string trusting_period_fraction = 2;
// ibc_timeout_period is the timeout period for IBC packets. While our
// system is largely created with epochs as a unit of time (and not
// standard durations), this is an exception since it is used directly
// by the IBC codebase.
google.protobuf.Duration ibc_timeout_period = 3
[ (gogoproto.nullable) = false, (gogoproto.stdduration) = true,
(gogoproto.customname) = "IBCTimeoutPeriod" ];
// init_timeout_period is the period within which the subscriber chain
// must make a connection with the coordinator, after being spawned.
exocore.epochs.v1.Epoch init_timeout_period = 4
[ (gogoproto.nullable) = false ];
// vsc_timeout_period is the period within which the subscriber chain
// must respond to a VSC request, after it is sent.
exocore.epochs.v1.Epoch vsc_timeout_period = 5
[ (gogoproto.nullable) = false, (gogoproto.customname) = "VSCTimeoutPeriod" ];
}
Loading
Loading