diff --git a/cmd/relayer/setup/setup.go b/cmd/relayer/setup/setup.go index e7bb786d9..0194caff2 100644 --- a/cmd/relayer/setup/setup.go +++ b/cmd/relayer/setup/setup.go @@ -17,7 +17,6 @@ import ( "github.com/dymensionxyz/roller/utils/errorhandling" "github.com/dymensionxyz/roller/utils/filesystem" firebaseutils "github.com/dymensionxyz/roller/utils/firebase" - "github.com/dymensionxyz/roller/utils/genesis" "github.com/dymensionxyz/roller/utils/logging" relayerutils "github.com/dymensionxyz/roller/utils/relayer" "github.com/dymensionxyz/roller/utils/rollapp" @@ -74,7 +73,7 @@ func Cmd() *cobra.Command { } pterm.Info.Println("rollapp chain data validation passed") - err = installRelayerDependencies(home, rly.Rollapp.ID, *hd) + err = installRelayerDependencies(rly.Rollapp.ID, *hd) if err != nil { pterm.Error.Println("failed to install relayer dependencies: ", err) return @@ -278,7 +277,6 @@ func getPreRunInfo(home string) (*consts.RollappData, *consts.HubData, string, e } func installRelayerDependencies( - home string, raID string, hd consts.HubData, ) error { @@ -287,9 +285,9 @@ func installRelayerDependencies( return err } - drsVersion, err := genesis.GetDrsVersionFromGenesis(home, raResp) + drsVersion, err := rollapp.GetDrsVersionFromChain(raID, hd) if err != nil { - pterm.Error.Println("failed to get drs version from genesis: ", err) + pterm.Error.Println("failed to get drs version from rollapp: ", err) return err } diff --git a/cmd/rollapp/init/init.go b/cmd/rollapp/init/init.go index ed1571687..72af81dcf 100644 --- a/cmd/rollapp/init/init.go +++ b/cmd/rollapp/init/init.go @@ -225,7 +225,7 @@ func Cmd() *cobra.Command { } if !shouldSkipBinaryInstallation { - _, _, err = dependencies.InstallBinaries(true, raRespMock, env) + _, _, err = dependencies.InstallBinaries(true, raRespMock, hd, env) if err != nil { pterm.Error.Println("failed to install binaries: ", err) return @@ -308,7 +308,7 @@ func Cmd() *cobra.Command { } start := time.Now() - builtDeps, _, err := dependencies.InstallBinaries(false, *raResponse, env) + builtDeps, _, err := dependencies.InstallBinaries(false, *raResponse, hd, env) if err != nil { pterm.Error.Println("failed to install binaries: ", err) return diff --git a/cmd/rollapp/setup/setup.go b/cmd/rollapp/setup/setup.go index 4d4d047f3..286f47bc1 100644 --- a/cmd/rollapp/setup/setup.go +++ b/cmd/rollapp/setup/setup.go @@ -1029,14 +1029,14 @@ func Cmd() *cobra.Command { _ = tomlconfig.UpdateFieldInFile( dymintConfigPath, "da_layer", - getDaLayer(home, raResponse, damanager.DaType), + getDaLayer(rollappConfig.RollappID, rollappConfig.HubData, raResponse, damanager.DaType), ) if !skipDA { _ = tomlconfig.UpdateFieldInFile( dymintConfigPath, "da_config", - getDaConfig(damanager.DataLayer, nodeType, home, raResponse, rollappConfig), + getDaConfig(damanager.DataLayer, nodeType, raResponse, rollappConfig), ) } @@ -1361,10 +1361,10 @@ func displayRegularDenom(coin cosmossdktypes.Coin, decimals int) string { return formattedAmount } -func getDaLayer(home string, raResponse *rollapp.ShowRollappResponse, daType consts.DAType) any { - drsVersion, err := genesis.GetDrsVersionFromGenesis(home, raResponse) +func getDaLayer(raID string, hd consts.HubData, raResponse *rollapp.ShowRollappResponse, daType consts.DAType) any { + drsVersion, err := rollapp.GetDrsVersionFromChain(raID, hd) if err != nil { - pterm.Error.Println("failed to get drs version from genesis: ", err) + pterm.Error.Println("failed to get drs version from rollapp: ", err) return nil } @@ -1378,15 +1378,14 @@ func getDaLayer(home string, raResponse *rollapp.ShowRollappResponse, daType con func getDaConfig( dataLayer datalayer.DataLayer, nodeType string, - home string, raResponse *rollapp.ShowRollappResponse, rollappConfig *roller.RollappConfig, ) any { daConfig := dataLayer.GetSequencerDAConfig(nodeType) - drsVersion, err := genesis.GetDrsVersionFromGenesis(home, raResponse) + drsVersion, err := rollapp.GetDrsVersionFromChain(rollappConfig.RollappID, rollappConfig.HubData) if err != nil { - pterm.Error.Println("failed to get drs version from genesis: ", err) + pterm.Error.Println("failed to get drs version from rollapp: ", err) return nil } diff --git a/utils/dependencies/dependencies.go b/utils/dependencies/dependencies.go index 87e954440..ab50a6e29 100644 --- a/utils/dependencies/dependencies.go +++ b/utils/dependencies/dependencies.go @@ -9,7 +9,6 @@ import ( "os/exec" "path/filepath" "runtime" - "strconv" "strings" "github.com/pterm/pterm" @@ -27,7 +26,7 @@ import ( "github.com/dymensionxyz/roller/utils/rollapp" ) -func InstallBinaries(withMockDA bool, raResp rollapp.ShowRollappResponse, env string) ( +func InstallBinaries(withMockDA bool, raResp rollapp.ShowRollappResponse, hd consts.HubData, env string) ( map[string]types.Dependency, map[string]types.Dependency, error, @@ -66,8 +65,13 @@ func InstallBinaries(withMockDA bool, raResp rollapp.ShowRollappResponse, env st } da = as.RollappParams.Params.Da - drsVersion = strconv.Itoa(as.RollappParams.Params.DrsVersion) - pterm.Info.Println("RollApp drs version from the genesis file : ", drsVersion) + + drsVersion, err = rollapp.GetDrsVersionFromChain(raResp.Rollapp.RollappId, hd) + if err != nil { + return nil, nil, fmt.Errorf("failed to retrieve rollapp drs version from chain: %w", err) + } + pterm.Info.Println("RollApp drs version fetched from chain: ", drsVersion) + drsInfo, err := firebaseutils.GetLatestDrsVersionCommit(drsVersion, env) if err != nil { return nil, nil, err diff --git a/utils/genesis/genesis.go b/utils/genesis/genesis.go index ec34794d4..a43f483b2 100644 --- a/utils/genesis/genesis.go +++ b/utils/genesis/genesis.go @@ -13,7 +13,6 @@ import ( "os/exec" "path/filepath" "sort" - "strconv" "strings" comettypes "github.com/cometbft/cometbft/types" @@ -462,23 +461,3 @@ func ValidateGenesis(raCfg roller.RollappConfig, raID string, hd consts.HubData) return nil } - -func GetDrsVersionFromGenesis( - home string, - raResp *rollapp.ShowRollappResponse, -) (string, error) { - err := DownloadGenesis(home, raResp.Rollapp.Metadata.GenesisUrl) - if err != nil { - return "", err - } - - as, err := GetAppStateFromGenesisFile(home) - if err != nil { - pterm.Error.Println("failed to get genesis app state: ", err) - return "", err - } - drsVersion := strconv.Itoa(as.RollappParams.Params.DrsVersion) - - pterm.Info.Println("DRS version: ", drsVersion) - return drsVersion, nil -} diff --git a/utils/rollapp/rollapp.go b/utils/rollapp/rollapp.go index 674df89ba..2f684f982 100644 --- a/utils/rollapp/rollapp.go +++ b/utils/rollapp/rollapp.go @@ -7,6 +7,7 @@ import ( "os" "os/exec" "path/filepath" + "strconv" "strings" cosmossdktypes "github.com/cosmos/cosmos-sdk/types" @@ -17,6 +18,7 @@ import ( datalayer "github.com/dymensionxyz/roller/data_layer" "github.com/dymensionxyz/roller/utils/bash" bashutils "github.com/dymensionxyz/roller/utils/bash" + "github.com/dymensionxyz/roller/utils/config" "github.com/dymensionxyz/roller/utils/filesystem" "github.com/dymensionxyz/roller/utils/keys" "github.com/dymensionxyz/roller/utils/roller" @@ -374,6 +376,99 @@ func GetRollappParams(hd consts.HubData) (*RaParams, error) { return &resp, nil } +func GetDrsVersionFromChain(rollappID string, hd consts.HubData) (string, error) { + rpc, err := fetchRollappRpcFromChain(rollappID, hd) + if err != nil { + return "", err + } + + params, err := getRollappParamsFromNode(rpc, rollappID) + if err != nil { + return "", err + } + if params == nil { + return "", errors.New("rollapp params response is nil") + } + return strconv.Itoa(params.DrsVersion), nil +} + +type RollappDaemonParams struct { + Da string `json:"da"` + DrsVersion int `json:"drs_version"` + MinGasPrices cosmossdktypes.DecCoins `json:"min_gas_prices"` +} + +func getRollappParamsFromNode(rpcEndpoint, chainID string) (*RollappDaemonParams, error) { + rpc := strings.TrimSpace(rpcEndpoint) + if rpc == "" { + rpc = consts.DefaultRollappRPC + } + args := []string{"q", "rollappparams", "params", "--node", rpc, "-o", "json"} + if chainID != "" { + args = append(args, "--chain-id", chainID) + } + + cmd := exec.Command(consts.Executables.RollappEVM, args...) + out, err := bash.ExecCommandWithStdout(cmd) + if err != nil { + return nil, err + } + var resp RollappDaemonParams + if err := json.Unmarshal(out.Bytes(), &resp); err != nil { + return nil, err + } + return &resp, nil +} + +func fetchRollappRpcFromChain(raID string, hd consts.HubData) (string, error) { + proposer, err := GetCurrentProposer(raID, hd) + if err != nil { + return "", err + } + if proposer == "" { + return "", errors.New("no proposer found for rollapp") + } + + cmd := exec.Command( + consts.Executables.Dymension, + "q", "sequencer", "show-sequencer", + proposer, "-o", "json", "--node", hd.RpcUrl, "--chain-id", hd.ID, + ) + + out, err := bash.ExecCommandWithStdout(cmd) + if err != nil { + return "", err + } + + var resp struct { + Sequencer struct { + Metadata struct { + Rpcs []string `json:"rpcs"` + } `json:"metadata"` + } `json:"sequencer"` + } + + if err := json.Unmarshal(out.Bytes(), &resp); err != nil { + return "", err + } + + if len(resp.Sequencer.Metadata.Rpcs) == 0 { + return "", errors.New("no rpc endpoints found in sequencer metadata") + } + + rpc := strings.TrimSpace(resp.Sequencer.Metadata.Rpcs[0]) + if rpc == "" { + return "", errors.New("empty rpc endpoint in sequencer metadata") + } + + if !strings.HasPrefix(rpc, "http://") && !strings.HasPrefix(rpc, "https://") { + rpc = "https://" + rpc + } + rpc = config.AddHttpsPortIfNeeded(rpc) + + return rpc, nil +} + func getGenesisFilePath(root string) string { return filepath.Join( RollappConfigDir(root),