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: Integrate Ojo oracle module #1102

Closed
wants to merge 18 commits into from
Closed
Changes from 1 commit
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
Prev Previous commit
Next Next commit
preblocker and pf flags
rbajollari committed Jan 9, 2025
commit 3db31bfb1bc31683884ee5086970697559ee407a
21 changes: 16 additions & 5 deletions app/app.go
Original file line number Diff line number Diff line change
@@ -54,6 +54,7 @@ import (
paramstypes "github.com/cosmos/cosmos-sdk/x/params/types"
ccvconsumertypes "github.com/cosmos/interchain-security/v6/x/ccv/consumer/types"
"github.com/elys-network/elys/app/ante"
oracleabci "github.com/ojo-network/ojo/x/oracle/abci"

// this line is used by starport scaffolding # stargate/app/moduleImport

@@ -289,6 +290,21 @@ func NewElysApp(
panic(fmt.Errorf("failed to create AnteHandler: %s", err))
}

proposalHandler := oracleabci.NewProposalHandler(
app.Logger(),
app.OracleKeeper,
app.StakingKeeper,
)
app.SetPrepareProposal(proposalHandler.PrepareProposalHandler())
app.SetProcessProposal(proposalHandler.ProcessProposalHandler())

voteExtensionsHandler := oracleabci.NewVoteExtensionHandler(
app.Logger(),
app.OracleKeeper,
)
app.SetExtendVoteHandler(voteExtensionsHandler.ExtendVoteHandler())
app.SetVerifyVoteExtensionHandler(voteExtensionsHandler.VerifyVoteExtensionHandler())

// set ante and post handlers
app.SetAnteHandler(anteHandler)
app.setPostHandler()
@@ -336,11 +352,6 @@ func (app *ElysApp) setPostHandler() {
// Name returns the name of the App
func (app *ElysApp) Name() string { return app.BaseApp.Name() }

// PreBlocker application updates every pre block
func (app *ElysApp) PreBlocker(ctx sdk.Context, _ *abci.RequestFinalizeBlock) (*sdk.ResponsePreBlock, error) {
return app.mm.PreBlock(ctx)
}

// BeginBlocker application updates every begin block
func (app *ElysApp) BeginBlocker(ctx sdk.Context) (sdk.BeginBlock, error) {
return app.mm.BeginBlock(ctx)
69 changes: 69 additions & 0 deletions app/preblocker.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package app

import (
"fmt"

"cosmossdk.io/core/appmodule"
cometabci "github.com/cometbft/cometbft/abci/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/ojo-network/ojo/x/oracle/abci"
"github.com/ojo-network/ojo/x/oracle/types"
)

// PreBlocker is run before finalize block to update the aggregrate exchange rate votes on the oracle module
// that were verified by the vote etension handler so that the exchange rate votes are available during the
// entire block execution (from BeginBlock). It will execute the preblockers of the other modules set in
// SetOrderPreBlockers as well.
func (app *ElysApp) PreBlocker(ctx sdk.Context, req *cometabci.RequestFinalizeBlock) (*sdk.ResponsePreBlock, error) {
if req == nil {
err := fmt.Errorf("preblocker received a nil request")
app.Logger().Error(err.Error())
return nil, err
}

// execute preblockers of modules in OrderPreBlockers first.
ctx = ctx.WithEventManager(sdk.NewEventManager())
paramsChanged := false
for _, moduleName := range app.mm.OrderPreBlockers {
if module, ok := app.mm.Modules[moduleName].(appmodule.HasPreBlocker); ok {
rsp, err := module.PreBlock(ctx)
if err != nil {
return nil, err
}
if rsp.IsConsensusParamsChanged() {
paramsChanged = true
}
}
}

res := &sdk.ResponsePreBlock{
ConsensusParamsChanged: paramsChanged,
}

if len(req.Txs) == 0 {
return res, nil
}
voteExtensionsEnabled := abci.VoteExtensionsEnabled(ctx)
if voteExtensionsEnabled {
var injectedVoteExtTx types.InjectedVoteExtensionTx
if err := injectedVoteExtTx.Unmarshal(req.Txs[0]); err != nil {
app.Logger().Error("failed to decode injected vote extension tx", "err", err)
return nil, err
}
for _, exchangeRateVote := range injectedVoteExtTx.ExchangeRateVotes {
valAddr, err := sdk.ValAddressFromBech32(exchangeRateVote.Voter)
if err != nil {
app.Logger().Error("failed to get voter address", "err", err)
continue
}
app.OracleKeeper.SetAggregateExchangeRateVote(ctx, valAddr, exchangeRateVote)
}
}

app.Logger().Info(
"preblocker executed",
"vote_extensions_enabled", voteExtensionsEnabled,
)

return res, nil
}
24 changes: 22 additions & 2 deletions cmd/elysd/cmd/root.go
Original file line number Diff line number Diff line change
@@ -48,6 +48,7 @@ import (

"github.com/elys-network/elys/app"
appparams "github.com/elys-network/elys/app/params"
"github.com/ojo-network/ojo/pricefeeder"
)

var tempDir = func() string {
@@ -206,6 +207,11 @@ func initRootCmd(rootCmd *cobra.Command,
txCommand(basicManager),
keys.Commands(),
)

// add price feeder flags
rootCmd.PersistentFlags().String(pricefeeder.FlagConfigPath, "", "Path to price feeder config file")
rootCmd.PersistentFlags().String(pricefeeder.FlagLogLevel, "", "Log level of price feeder process")
rootCmd.PersistentFlags().Bool(pricefeeder.FlagEnablePriceFeeder, false, "Enable the price feeder")
}

func addModuleInitFlags(startCmd *cobra.Command) {
@@ -311,7 +317,7 @@ func (a appCreator) newApp(
skipUpgradeHeights[int64(h)] = true
}

return app.NewElysApp(
app := app.NewElysApp(
logger,
db,
traceStore,
@@ -321,6 +327,15 @@ func (a appCreator) newApp(
appOpts,
baseappOptions...,
)

// load app config into oracle keeper price feeder
appConfig, err := pricefeeder.ReadConfigFromAppOpts(appOpts)
if err != nil {
panic(err)
}
app.OracleKeeper.PriceFeeder.AppConfig = appConfig

return app
}

// appExport creates a new simapp (optionally at a given height)
@@ -374,6 +389,7 @@ func initAppConfig() (string, interface{}) {

type CustomAppConfig struct {
serverconfig.Config
PriceFeeder pricefeeder.AppConfig `mapstructure:"pricefeeder"`
}

// Optionally allow the chain developer to overwrite the SDK's default
@@ -395,7 +411,11 @@ func initAppConfig() (string, interface{}) {
// srvCfg.BaseConfig.IAVLDisableFastNode = true // disable fastnode by default
customAppConfig := CustomAppConfig{
Config: *srvCfg,
PriceFeeder: pricefeeder.AppConfig{
ConfigPath: "",
LogLevel: "info",
},
}
customAppTemplate := serverconfig.DefaultConfigTemplate
customAppTemplate := serverconfig.DefaultConfigTemplate + pricefeeder.DefaultConfigTemplate
return customAppTemplate, customAppConfig
}
22 changes: 22 additions & 0 deletions cmd/elysd/price-feeder.example.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
gas_adjustment = 1
provider_timeout = "1000000s"

[server]
listen_addr = "0.0.0.0:7171"
read_timeout = "20s"
verbose_cors = true
write_timeout = "20s"

[rpc]
grpc_endpoint = "localhost:9090"
rpc_timeout = "100ms"
tmrpc_endpoint = "http://localhost:26657"

[telemetry]
enable-hostname = true
enable-hostname-label = true
enable-service-label = true
enabled = true
global-labels = [["chain_id", "elys-testnet"]]
service-name = "price-feeder"
prometheus-retention-time = 100