feat(epochs): backport (#23815)

Co-authored-by: Tyler <48813565+technicallyty@users.noreply.github.com>
This commit is contained in:
Alex | Interchain Labs
2025-02-26 16:10:00 -05:00
committed by GitHub
co-authored by Tyler
parent 4ed61468a2
commit ff779eca8d
43 changed files with 10362 additions and 796 deletions
@@ -0,0 +1,13 @@
// Since: cosmos-sdk 0.53
syntax = "proto3";
package cosmos.epochs.module.v1;
import "cosmos/app/v1alpha1/module.proto";
// Module is the config object of the epochs module.
message Module {
option (cosmos.app.v1alpha1.module) = {
go_import: "github.com/cosmos/cosmos-sdk/x/epochs"
};
}
+17
View File
@@ -0,0 +1,17 @@
// Since: cosmos-sdk 0.53
syntax = "proto3";
package cosmos.epochs.v1beta1;
option go_package = "github.com/cosmos/cosmos-sdk/x/epochs/types";
// EventEpochEnd is an event emitted when an epoch end.
message EventEpochEnd {
int64 epoch_number = 1;
}
// EventEpochStart is an event emitted when an epoch start.
message EventEpochStart {
int64 epoch_number = 1;
int64 epoch_start_time = 2;
}
+61
View File
@@ -0,0 +1,61 @@
// Since: cosmos-sdk 0.53
syntax = "proto3";
package cosmos.epochs.v1beta1;
import "gogoproto/gogo.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/timestamp.proto";
option go_package = "github.com/cosmos/cosmos-sdk/x/epochs/types";
// EpochInfo is a struct that describes the data going into
// a timer defined by the x/epochs module.
message EpochInfo {
// identifier is a unique reference to this particular timer.
string identifier = 1;
// start_time is the time at which the timer first ever ticks.
// If start_time is in the future, the epoch will not begin until the start
// time.
google.protobuf.Timestamp start_time = 2 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false];
// duration is the time in between epoch ticks.
// In order for intended behavior to be met, duration should
// be greater than the chains expected block time.
// Duration must be non-zero.
google.protobuf.Duration duration = 3
[(gogoproto.nullable) = false, (gogoproto.stdduration) = true, (gogoproto.jsontag) = "duration,omitempty"];
// current_epoch is the current epoch number, or in other words,
// how many times has the timer 'ticked'.
// The first tick (current_epoch=1) is defined as
// the first block whose blocktime is greater than the EpochInfo start_time.
int64 current_epoch = 4;
// current_epoch_start_time describes the start time of the current timer
// interval. The interval is (current_epoch_start_time,
// current_epoch_start_time + duration] When the timer ticks, this is set to
// current_epoch_start_time = last_epoch_start_time + duration only one timer
// tick for a given identifier can occur per block.
//
// NOTE! The current_epoch_start_time may diverge significantly from the
// wall-clock time the epoch began at. Wall-clock time of epoch start may be
// >> current_epoch_start_time. Suppose current_epoch_start_time = 10,
// duration = 5. Suppose the chain goes offline at t=14, and comes back online
// at t=30, and produces blocks at every successive time. (t=31, 32, etc.)
// * The t=30 block will start the epoch for (10, 15]
// * The t=31 block will start the epoch for (15, 20]
// * The t=32 block will start the epoch for (20, 25]
// * The t=33 block will start the epoch for (25, 30]
// * The t=34 block will start the epoch for (30, 35]
// * The **t=36** block will start the epoch for (35, 40]
google.protobuf.Timestamp current_epoch_start_time = 5 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false];
// epoch_counting_started is a boolean, that indicates whether this
// epoch timer has began yet.
bool epoch_counting_started = 6;
reserved 7;
// current_epoch_start_height is the block height at which the current epoch
// started. (The block height at which the timer last ticked)
int64 current_epoch_start_height = 8;
}
// GenesisState defines the epochs module's genesis state.
message GenesisState {
repeated EpochInfo epochs = 1 [(gogoproto.nullable) = false];
}
+43
View File
@@ -0,0 +1,43 @@
// Since: cosmos-sdk 0.53
syntax = "proto3";
package cosmos.epochs.v1beta1;
import "gogoproto/gogo.proto";
import "google/api/annotations.proto";
import "cosmos/epochs/v1beta1/genesis.proto";
option go_package = "github.com/cosmos/cosmos-sdk/x/epochs/types";
// Query defines the gRPC querier service.
service Query {
// EpochInfos provide running epochInfos
rpc EpochInfos(QueryEpochInfosRequest) returns (QueryEpochInfosResponse) {
option (google.api.http).get = "/cosmos/epochs/v1beta1/epochs";
}
// CurrentEpoch provide current epoch of specified identifier
rpc CurrentEpoch(QueryCurrentEpochRequest) returns (QueryCurrentEpochResponse) {
option (google.api.http).get = "/cosmos/epochs/v1beta1/current_epoch";
}
}
// QueryEpochInfosRequest defines the gRPC request structure for
// querying all epoch info.
message QueryEpochInfosRequest {}
// QueryEpochInfosRequest defines the gRPC response structure for
// querying all epoch info.
message QueryEpochInfosResponse {
repeated EpochInfo epochs = 1 [(gogoproto.nullable) = false];
}
// QueryCurrentEpochRequest defines the gRPC request structure for
// querying an epoch by its identifier.
message QueryCurrentEpochRequest {
string identifier = 1;
}
// QueryCurrentEpochResponse defines the gRPC response structure for
// querying an epoch by its identifier.
message QueryCurrentEpochResponse {
int64 current_epoch = 1;
}