Skip to content
Merged
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
18 changes: 18 additions & 0 deletions client/app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (

"github.com/piplabs/story/client/app/keepers"
"github.com/piplabs/story/client/comet"
evmenginekeeper "github.com/piplabs/story/client/x/evmengine/keeper"
evmstakingkeeper "github.com/piplabs/story/client/x/evmstaking/keeper"
mintkeeper "github.com/piplabs/story/client/x/mint/keeper"
"github.com/piplabs/story/lib/errors"
Expand Down Expand Up @@ -159,6 +160,19 @@ func (a *App) PreBlocker(ctx sdk.Context, _ *abci.RequestFinalizeBlock) (*sdk.Re
// All forks should be executed at their planned upgrade heights before any modules.
a.scheduleForkUpgrade(ctx)

shouldUpgrade, plan := a.Keepers.EVMEngKeeper.ShouldUpgrade(ctx)
if shouldUpgrade {
a.BaseApp.Logger().Info("upgrading app", "upgrade_name", plan.Name, "upgrade_height", plan.Height)

if err := a.Keepers.UpgradeKeeper.ScheduleUpgrade(ctx, plan); err != nil {
return nil, errors.Wrap(err, "failed to schedule upgrade")
}

if err := a.Keepers.EVMEngKeeper.ResetPendingUpgrade(ctx); err != nil {
return nil, errors.Wrap(err, "failed to reset pending upgrade")
}
}

res, err := a.ModuleManager.PreBlock(ctx)
if err != nil {
return nil, errors.Wrap(err, "module manager preblocker")
Expand All @@ -184,6 +198,10 @@ func (a App) SetCometAPI(api comet.API) {
a.Keepers.EVMEngKeeper.SetCometAPI(api)
}

func (a App) GetEVMEngineKeeper() *evmenginekeeper.Keeper {
return a.Keepers.EVMEngKeeper
}

func (a App) GetEvmStakingKeeper() *evmstakingkeeper.Keeper {
return a.Keepers.EvmStakingKeeper
}
Expand Down
41 changes: 34 additions & 7 deletions client/app/upgrades.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,19 @@ package app
import (
"fmt"

storetypes "cosmossdk.io/store/types"
upgradetypes "cosmossdk.io/x/upgrade/types"

"github.com/cosmos/cosmos-sdk/baseapp"
sdk "github.com/cosmos/cosmos-sdk/types"

"github.com/piplabs/story/client/app/upgrades"
"github.com/piplabs/story/client/app/upgrades/polybius"
"github.com/piplabs/story/client/app/upgrades/singularity/virgil"
"github.com/piplabs/story/client/app/upgrades/v140"
"github.com/piplabs/story/client/app/upgrades/v_1_2_0"
"github.com/piplabs/story/lib/errors"
"github.com/piplabs/story/lib/netconf"
)

var (
Expand All @@ -20,15 +25,19 @@ var (
virgil.Upgrade,
v_1_2_0.Upgrade,
polybius.Upgrade,
v140.Upgrade,
}
// Forks are for hard forks that breaks backward compatibility.
Forks = []upgrades.Fork{
virgil.Fork,
v_1_2_0.Fork,
polybius.Fork,
v140.Fork,
}
)

type StoreUpgradesMap map[int64]storetypes.StoreUpgrades

func (a *App) setupUpgradeHandlers() {
for _, upgrade := range Upgrades {
a.Keepers.UpgradeKeeper.SetUpgradeHandler(
Expand All @@ -40,19 +49,37 @@ func (a *App) setupUpgradeHandlers() {

// setUpgradeStoreLoaders sets custom store loaders to customize the rootMultiStore initialization for software upgrades.
func (a *App) setupUpgradeStoreLoaders() {
upgradeInfo, err := a.Keepers.UpgradeKeeper.ReadUpgradeInfoFromDisk()
upgradeHistory, err := netconf.GetUpgradeHistory(a.ChainID())
if err != nil {
panic(fmt.Sprintf("failed to read upgrade info from disk %s", err))
panic(errors.Wrap(err, "failed to get upgrade history"))
}

if a.Keepers.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) {
return
storeUpgradesMap := make(StoreUpgradesMap)
for name, height := range upgradeHistory {
if a.Keepers.UpgradeKeeper.IsSkipHeight(height) {
return
}

for _, upgrade := range Upgrades {
if name == upgrade.UpgradeName {
storeUpgradesMap[height] = upgrade.StoreUpgrades
}
}
}

for _, upgrade := range Upgrades {
if upgradeInfo.Name == upgrade.UpgradeName {
a.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &upgrade.StoreUpgrades))
a.SetStoreLoader(UpgradeStoreLoader(storeUpgradesMap))
}

// UpgradeStoreLoader returns store loader including all upgrades.
func UpgradeStoreLoader(storeUpgradesMap StoreUpgradesMap) baseapp.StoreLoader {
return func(ms storetypes.CommitMultiStore) error {
if storeUpgrades, ok := storeUpgradesMap[ms.LastCommitID().Version+1]; ok {
if len(storeUpgrades.Renamed) > 0 || len(storeUpgrades.Deleted) > 0 || len(storeUpgrades.Added) > 0 {
return ms.LoadLatestVersionAndUpgrade(&storeUpgrades)
}
}

return baseapp.DefaultStoreLoader(ms)
}
}

Expand Down
6 changes: 0 additions & 6 deletions client/app/upgrades/chains.go

This file was deleted.

3 changes: 2 additions & 1 deletion client/app/upgrades/polybius/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

"github.com/piplabs/story/client/app/keepers"
"github.com/piplabs/story/client/app/upgrades"
"github.com/piplabs/story/lib/netconf"
)

const (
Expand All @@ -33,7 +34,7 @@ var Fork = upgrades.Fork{

func GetUpgradeHeight(chainID string) (int64, bool) {
switch chainID {
case upgrades.AeneidChainID:
case netconf.AeneidChainID:
return AeneidUpgradeHeight, true
default:
return 0, false
Expand Down
7 changes: 4 additions & 3 deletions client/app/upgrades/singularity/virgil/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (

"github.com/piplabs/story/client/app/keepers"
"github.com/piplabs/story/client/app/upgrades"
"github.com/piplabs/story/lib/netconf"
)

const (
Expand Down Expand Up @@ -41,9 +42,9 @@ type RewardsMultipliers struct {

func GetUpgradeHeight(chainID string) (int64, bool) {
switch chainID {
case upgrades.AeneidChainID:
case netconf.AeneidChainID:
return AeneidUpgradeHeight, true
case upgrades.StoryChainID:
case netconf.StoryChainID:
return StoryUpgradeHeight, true
default:
return 0, false
Expand All @@ -58,7 +59,7 @@ var DefaultRewardsMultiplier = RewardsMultipliers{

func GetRewardsMultipliers(chainID string) RewardsMultipliers {
switch chainID {
case upgrades.StoryChainID:
case netconf.StoryChainID:
return RewardsMultipliers{
Short: math.LegacyNewDecWithPrec(11, 1), // 1.1
Medium: math.LegacyNewDecWithPrec(15, 1), // 1.5
Expand Down
24 changes: 24 additions & 0 deletions client/app/upgrades/v140/constants.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package v140

import (
storetypes "cosmossdk.io/store/types"

sdk "github.com/cosmos/cosmos-sdk/types"

"github.com/piplabs/story/client/app/keepers"
"github.com/piplabs/story/client/app/upgrades"
"github.com/piplabs/story/lib/netconf"
)

var Upgrade = upgrades.Upgrade{
UpgradeName: netconf.V140,
CreateUpgradeHandler: CreateUpgradeHandler,
StoreUpgrades: storetypes.StoreUpgrades{},
}

var Fork = upgrades.Fork{
UpgradeName: netconf.V140,
UpgradeInfo: "v140 upgrade",
BeginForkLogic: func(_ sdk.Context, _ *keepers.Keepers) {},
UpgradeHeight: 100000000, // TODO: set fork height depend on the network
}
24 changes: 24 additions & 0 deletions client/app/upgrades/v140/upgrades.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package v140

import (
"context"

upgradetypes "cosmossdk.io/x/upgrade/types"

"github.com/cosmos/cosmos-sdk/types/module"

"github.com/piplabs/story/client/app/keepers"
"github.com/piplabs/story/lib/log"
)

func CreateUpgradeHandler(
_ *module.Manager,
_ module.Configurator,
_ *keepers.Keepers,
) upgradetypes.UpgradeHandler {
return func(ctx context.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) {
log.Info(ctx, "The upgrade to v1.4.0")

return vm, nil
}
}
5 changes: 3 additions & 2 deletions client/app/upgrades/v_1_2_0/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (

"github.com/piplabs/story/client/app/keepers"
"github.com/piplabs/story/client/app/upgrades"
"github.com/piplabs/story/lib/netconf"
)

const (
Expand Down Expand Up @@ -37,9 +38,9 @@ var Fork = upgrades.Fork{

func GetUpgradeHeight(chainID string) (int64, bool) {
switch chainID {
case upgrades.AeneidChainID:
case netconf.AeneidChainID:
return AeneidUpgradeHeight, true
case upgrades.StoryChainID:
case netconf.StoryChainID:
return StoryUpgradeHeight, true
default:
return 0, false
Expand Down
26 changes: 26 additions & 0 deletions client/server/evmengine.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package server

import (
"net/http"

"github.com/piplabs/story/client/server/utils"
evmenginetypes "github.com/piplabs/story/client/x/evmengine/types"
)

func (s *Server) initEVMEngineRoute() {
s.httpMux.HandleFunc("/evmengine/pending_upgrade", utils.SimpleWrap(s.aminoCodec, s.GetPendingUpgrade))
}

func (s *Server) GetPendingUpgrade(r *http.Request) (resp any, err error) {
queryContext, err := s.createQueryContextByHeader(r)
if err != nil {
return nil, err
}

queryResp, err := s.store.GetEVMEngineKeeper().GetPendingUpgrade(queryContext, &evmenginetypes.QueryGetPendingUpgradeRequest{})
if err != nil {
return nil, err
}

return queryResp, nil
}
3 changes: 3 additions & 0 deletions client/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,14 @@ import (
"github.com/gorilla/handlers"
"github.com/gorilla/mux"

evmenginekeeper "github.com/piplabs/story/client/x/evmengine/keeper"
evmstakingkeeper "github.com/piplabs/story/client/x/evmstaking/keeper"
mintkeeper "github.com/piplabs/story/client/x/mint/keeper"
)

type Store interface {
CreateQueryContext(height int64, prove bool) (sdk.Context, error)
GetEVMEngineKeeper() *evmenginekeeper.Keeper
GetEvmStakingKeeper() *evmstakingkeeper.Keeper
GetStakingKeeper() *stakingkeeper.Keeper
GetSlashingKeeper() slashingkeeper.Keeper
Expand Down Expand Up @@ -120,6 +122,7 @@ func (s *Server) registerHandle() {
s.initBankRoute()
s.initDistributionRoute()
s.initEvmStakingRoute()
s.initEVMEngineRoute()
s.initSlashingRoute()
s.initStakingRoute()
s.initUpgradeRoute()
Expand Down
27 changes: 27 additions & 0 deletions client/x/evmengine/keeper/grpc_query.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package keeper

import (
"context"

"github.com/piplabs/story/client/x/evmengine/types"

"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)

var _ types.QueryServer = &Keeper{}

func (k *Keeper) GetPendingUpgrade(ctx context.Context, request *types.QueryGetPendingUpgradeRequest) (*types.QueryGetPendingUpgradeResponse, error) {
if request == nil {
return nil, status.Error(codes.InvalidArgument, "empty request")
}

pendingUpgrade, err := k.PendingUpgrade(ctx)
if err != nil {
return nil, err
}

return &types.QueryGetPendingUpgradeResponse{
Plan: pendingUpgrade,
}, nil
}
Loading
Loading