Skip to content

Commit

Permalink
Merge pull request #32 from bze-alphateam/feature/epochs
Browse files Browse the repository at this point in the history
Added Epochs module
  • Loading branch information
faneaatiku authored Mar 13, 2024
2 parents 5b0df9e + 49cbead commit a21bbbf
Show file tree
Hide file tree
Showing 68 changed files with 19,743 additions and 58 deletions.
51 changes: 22 additions & 29 deletions app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ package app

import (
"github.com/bze-alphateam/bze/app/openapi"
v512 "github.com/bze-alphateam/bze/app/upgrades/v512"
v600 "github.com/bze-alphateam/bze/app/upgrades/v600"
v610 "github.com/bze-alphateam/bze/app/upgrades/v610"
v700 "github.com/bze-alphateam/bze/app/upgrades/v700"
"github.com/bze-alphateam/bze/x/epochs"
epochskeeper "github.com/bze-alphateam/bze/x/epochs/keeper"
epochstypes "github.com/bze-alphateam/bze/x/epochs/types"
"github.com/bze-alphateam/bze/x/tradebin"
tradebinkeeper "github.com/bze-alphateam/bze/x/tradebin/keeper"
tradebintypes "github.com/bze-alphateam/bze/x/tradebin/types"
Expand Down Expand Up @@ -177,6 +177,7 @@ var (
burnermodule.AppModuleBasic{},
tokenfactory.AppModuleBasic{},
tradebin.AppModuleBasic{},
epochs.AppModuleBasic{},
// this line is used by starport scaffolding # stargate/app/moduleBasic
)

Expand All @@ -194,6 +195,7 @@ var (
burnermoduletypes.ModuleName: {authtypes.Burner},
tokenfactorytypes.ModuleName: {authtypes.Minter, authtypes.Burner},
tradebintypes.ModuleName: nil,
epochstypes.ModuleName: nil,
// this line is used by starport scaffolding # stargate/app/maccPerms
}

Expand Down Expand Up @@ -261,6 +263,7 @@ type App struct {
BurnerKeeper burnermodulekeeper.Keeper
TokenFactoryKeeper tokenfactorykeeper.Keeper
TradebinKeeper tradebinkeeper.Keeper
EpochsKeeper epochskeeper.Keeper
// this line is used by starport scaffolding # stargate/app/keeperDeclaration

// the module manager
Expand Down Expand Up @@ -310,6 +313,7 @@ func New(
burnermoduletypes.StoreKey,
tokenfactorytypes.StoreKey,
tradebintypes.StoreKey,
epochstypes.StoreKey,
// this line is used by starport scaffolding # stargate/app/storeKey
)
tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey)
Expand Down Expand Up @@ -450,11 +454,19 @@ func New(
app.DistrKeeper,
)

app.EpochsKeeper = *epochskeeper.NewKeeper(
appCodec,
keys[epochstypes.StoreKey],
keys[epochstypes.MemStoreKey],
nil, //no hooks registered
)

scavengeModule := scavengemodule.NewAppModule(appCodec, app.ScavengeKeeper)
cointrunkModule := cointrunkmodule.NewAppModule(appCodec, app.CointrunkKeeper, app.AccountKeeper, app.BankKeeper, app.DistrKeeper)
burnerModule := burnermodule.NewAppModule(appCodec, app.BurnerKeeper, app.AccountKeeper, app.BankKeeper)
tokenfactoryModule := tokenfactory.NewAppModule(appCodec, app.TokenFactoryKeeper, app.AccountKeeper, app.BankKeeper)
tradebinModule := tradebin.NewAppModule(appCodec, app.TradebinKeeper, app.AccountKeeper, app.BankKeeper)
epochsModule := epochs.NewAppModule(appCodec, app.EpochsKeeper)
// this line is used by starport scaffolding # stargate/app/keeperDefinition

// register the proposal types
Expand Down Expand Up @@ -515,6 +527,7 @@ func New(
burnerModule,
tokenfactoryModule,
tradebinModule,
epochsModule,
// this line is used by starport scaffolding # stargate/app/appModule
)

Expand Down Expand Up @@ -546,6 +559,7 @@ func New(
burnermoduletypes.ModuleName,
tokenfactorytypes.ModuleName,
tradebintypes.ModuleName,
epochstypes.ModuleName,
)

app.mm.SetOrderEndBlockers(
Expand All @@ -572,6 +586,7 @@ func New(
burnermoduletypes.ModuleName,
tokenfactorytypes.ModuleName,
tradebintypes.ModuleName,
epochstypes.ModuleName,
)

// NOTE: The genutils module must occur after staking so that pools are
Expand Down Expand Up @@ -603,6 +618,7 @@ func New(
burnermoduletypes.ModuleName,
tokenfactorytypes.ModuleName,
tradebintypes.ModuleName,
epochstypes.ModuleName,
// this line is used by starport scaffolding # stargate/app/initGenesis
)

Expand Down Expand Up @@ -650,24 +666,10 @@ func New(
}

func (app *App) setupUpgradeHandlers() {
app.UpgradeKeeper.SetUpgradeHandler(
v512.UpgradeName,
v512.CreateUpgradeHandler(),
)

app.UpgradeKeeper.SetUpgradeHandler(
v600.UpgradeName,
v600.CreateUpgradeHandler(&app.CointrunkKeeper),
)

app.UpgradeKeeper.SetUpgradeHandler(
v610.UpgradeName,
v610.CreateUpgradeHandler(),
)

cfg := module.NewConfigurator(app.appCodec, app.MsgServiceRouter(), app.GRPCQueryRouter())
app.UpgradeKeeper.SetUpgradeHandler(
v700.UpgradeName,
v700.CreateUpgradeHandler(&app.TokenFactoryKeeper, &app.TradebinKeeper),
v700.CreateUpgradeHandler(cfg, app.mm),
)

upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk()
Expand All @@ -679,18 +681,9 @@ func (app *App) setupUpgradeHandlers() {
return
}

if upgradeInfo.Name == v600.UpgradeName {
storeUpgrades := storetypes.StoreUpgrades{
Added: []string{burnermoduletypes.StoreKey, cointrunkmoduletypes.StoreKey, authzkeeper.StoreKey},
}

// configure store loader that checks if version == upgradeHeight and applies store upgrades
app.SetStoreLoader(upgradetypes.UpgradeStoreLoader(upgradeInfo.Height, &storeUpgrades))
}

if upgradeInfo.Name == v700.UpgradeName {
storeUpgrades := storetypes.StoreUpgrades{
Added: []string{tokenfactorytypes.StoreKey, tradebintypes.StoreKey},
Added: []string{tokenfactorytypes.StoreKey, tradebintypes.StoreKey, epochstypes.StoreKey},
}

// configure store loader that checks if version == upgradeHeight and applies store upgrades
Expand Down
24 changes: 15 additions & 9 deletions app/upgrades/v700/upgrades.go
Original file line number Diff line number Diff line change
@@ -1,22 +1,28 @@
package v700

import (
tokenfactorykeeper "github.com/bze-alphateam/bze/x/tokenfactory/keeper"
tokenfactorytypes "github.com/bze-alphateam/bze/x/tokenfactory/types"
tradebinkeeper "github.com/bze-alphateam/bze/x/tradebin/keeper"
tradebintypes "github.com/bze-alphateam/bze/x/tradebin/types"
burnermodule "github.com/bze-alphateam/bze/x/burner"
burnermoduletypes "github.com/bze-alphateam/bze/x/burner/types"
cointrunkmodule "github.com/bze-alphateam/bze/x/cointrunk"
cointrunkmoduletypes "github.com/bze-alphateam/bze/x/cointrunk/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
)

const UpgradeName = "v7.0.0"

func CreateUpgradeHandler(factoryKeeper *tokenfactorykeeper.Keeper, tbinKeeper *tradebinkeeper.Keeper) upgradetypes.UpgradeHandler {
func CreateUpgradeHandler(
cfg module.Configurator,
mm *module.Manager,
) upgradetypes.UpgradeHandler {

return func(ctx sdk.Context, _plan upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) {
//set tokenfactory module default params
factoryKeeper.SetParams(ctx, tokenfactorytypes.DefaultParams())
tbinKeeper.SetParams(ctx, tradebintypes.DefaultParams())
return vm, nil
//add older modules not present in module_versions yet
vm[burnermoduletypes.ModuleName] = burnermodule.AppModule{}.ConsensusVersion()
vm[cointrunkmoduletypes.ModuleName] = cointrunkmodule.AppModule{}.ConsensusVersion()

//run default migrations in order to init new module's genesis and to have them in vm
return mm.RunMigrations(ctx, cfg, vm)
}
}
88 changes: 88 additions & 0 deletions bzeutils/safe_ctx_write.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package bzeutils

import (
"errors"
"fmt"
"runtime"
"runtime/debug"

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

// ApplyFuncIfNoError This function lets you run the function f, but if there's an error or panic
// drop the state machine change and log the error.
// If there is no error, proceeds as normal (but with some slowdown due to SDK store weirdness)
// Try to avoid usage of iterators in f.
//
// If its an out of gas panic, this function will also panic like in normal tx execution flow.
// This is still safe for beginblock / endblock code though, as they do not have out of gas panics.
func ApplyFuncIfNoError(ctx sdk.Context, f func(ctx sdk.Context) error) (err error) {
return applyFunc(ctx, f, ctx.Logger().Error)
}

// ApplyFuncIfNoErrorLogToDebug is the same as ApplyFuncIfNoError, but sends logs to debug instead of error if there is an error.
func ApplyFuncIfNoErrorLogToDebug(ctx sdk.Context, f func(ctx sdk.Context) error) (err error) {
return applyFunc(ctx, f, ctx.Logger().Debug)
}

func applyFunc(ctx sdk.Context, f func(ctx sdk.Context) error, logFunc func(string, ...interface{})) (err error) {
// Add a panic safeguard
defer func() {
if recoveryError := recover(); recoveryError != nil {
if isErr, _ := IsOutOfGasError(recoveryError); isErr {
// We panic with the same error, to replicate the normal tx execution flow.
panic(recoveryError)
} else {
PrintPanicRecoveryError(ctx, recoveryError)
err = errors.New("panic occurred during execution")
}
}
}()
// makes a new cache context, which all state changes get wrapped inside of.
cacheCtx, write := ctx.CacheContext()
err = f(cacheCtx)
if err != nil {
logFunc(err.Error())
} else {
// no error, write the output of f
write()
}
return err
}

// IsOutOfGasError Frustratingly, this has to return the error descriptor, not an actual error itself
// because the SDK errors here are not actually errors. (They don't implement error interface)
func IsOutOfGasError(err any) (bool, string) {
switch e := err.(type) {
case types.ErrorOutOfGas:
return true, e.Descriptor
case types.ErrorGasOverflow:
return true, e.Descriptor
default:
return false, ""
}
}

// PrintPanicRecoveryError error logs the recoveryError, along with the stacktrace, if it can be parsed.
// If not emits them to stdout.
func PrintPanicRecoveryError(ctx sdk.Context, recoveryError interface{}) {
errStackTrace := string(debug.Stack())
switch e := recoveryError.(type) {
case types.ErrorOutOfGas:
ctx.Logger().Debug("out of gas error inside panic recovery block: " + e.Descriptor)
return
case string:
ctx.Logger().Error("Recovering from (string) panic: " + e)
case runtime.Error:
ctx.Logger().Error("recovered (runtime.Error) panic: " + e.Error())
case error:
ctx.Logger().Error("recovered (error) panic: " + e.Error())
default:
ctx.Logger().Error("recovered (default) panic. Could not capture logs in ctx, see stdout")
fmt.Println("Recovering from panic ", recoveryError)
debug.PrintStack()
return
}
ctx.Logger().Error("stack trace: " + errStackTrace)
}
Loading

0 comments on commit a21bbbf

Please sign in to comment.