From 9fd52c76cb2fc08878963820e6d668332ee22967 Mon Sep 17 00:00:00 2001 From: Jiri Date: Wed, 24 Jul 2024 13:29:14 +0200 Subject: [PATCH 1/2] Cudos upgrade handler --- app/app.go | 66 ++++++++++++++++++++++------------- app/cudos_merge.go | 24 +++++++++++++ cmd/fetchd/cmd/cudos_merge.go | 12 +++++++ cmd/fetchd/cmd/root.go | 9 +++++ 4 files changed, 87 insertions(+), 24 deletions(-) create mode 100644 app/cudos_merge.go create mode 100644 cmd/fetchd/cmd/cudos_merge.go diff --git a/app/app.go b/app/app.go index 2154bcc0e..6fad3ba98 100644 --- a/app/app.go +++ b/app/app.go @@ -216,6 +216,7 @@ type App struct { interfaceRegistry types.InterfaceRegistry invCheckPeriod uint + cudosPath string // keys to access the substores keys map[string]*sdk.KVStoreKey @@ -256,7 +257,7 @@ type App struct { // NewSimApp returns a reference to an initialized SimApp. func New( logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, - skipUpgradeHeights map[int64]bool, homePath string, invCheckPeriod uint, encodingConfig appparams.EncodingConfig, enabledProposals []wasm.ProposalType, + skipUpgradeHeights map[int64]bool, homePath string, invCheckPeriod uint, cudosPath string, encodingConfig appparams.EncodingConfig, enabledProposals []wasm.ProposalType, appOpts servertypes.AppOptions, wasmOpts []wasm.Option, baseAppOptions ...func(*baseapp.BaseApp), ) *App { @@ -285,6 +286,7 @@ func New( appCodec: appCodec, interfaceRegistry: interfaceRegistry, invCheckPeriod: invCheckPeriod, + cudosPath: cudosPath, keys: keys, tkeys: tkeys, memKeys: memKeys, @@ -369,7 +371,7 @@ func New( app.GovKeeper = *govKeeper.SetHooks( govtypes.NewMultiGovHooks( - // register the governance hooks + // register the governance hooks ), ) @@ -718,41 +720,57 @@ func (app *App) GetSubspace(moduleName string) paramstypes.Subspace { return subspace } +func (app *App) PerformASIUpgradeTasks(ctx sdk.Context, networkInfo *NetworkConfig, manifest *UpgradeManifest) error { + err := app.DeleteContractStates(ctx, networkInfo, manifest) + if err != nil { + return err + } + + // Call the separate function to handle the admin upgrade + err = app.UpgradeContractAdmins(ctx, networkInfo, manifest) + if err != nil { + return err + } + + err = app.ProcessReconciliation(ctx, networkInfo, manifest) + if err != nil { + return err + } + + err = app.ChangeContractLabels(ctx, networkInfo, manifest) + if err != nil { + return err + } + + err = app.ChangeContractVersions(ctx, networkInfo, manifest) + if err != nil { + return err + } + + return nil +} + func (app *App) RegisterUpgradeHandlers(cfg module.Configurator) { app.UpgradeKeeper.SetUpgradeHandler("v0.11.3", func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { return app.mm.RunMigrations(ctx, cfg, fromVM) }) app.UpgradeKeeper.SetUpgradeHandler("v0.11.4", func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { - manifest := NewUpgradeManifest() - - networkInfo, ok := NetworkInfos[ctx.ChainID()] - if !ok { - panic("Network info not found for chain id: " + ctx.ChainID()) - } - - err := app.DeleteContractStates(ctx, &networkInfo, manifest) - if err != nil { - return nil, err - } - - // Call the separate function to handle the admin upgrade - err = app.UpgradeContractAdmins(ctx, &networkInfo, manifest) + genesis, err := ReadGenesisFile(app.cudosPath) if err != nil { return nil, err } + print(genesis) - err = app.ProcessReconciliation(ctx, &networkInfo, manifest) - if err != nil { - return nil, err - } + manifest := NewUpgradeManifest() - err = app.ChangeContractLabels(ctx, &networkInfo, manifest) - if err != nil { - return nil, err + networkInfo, ok := NetworkInfos[ctx.ChainID()] + if !ok { + panic("Network info not found for chain id: " + ctx.ChainID()) } - err = app.ChangeContractVersions(ctx, &networkInfo, manifest) + // Perform ASI upgrade tasks + err = app.PerformASIUpgradeTasks(ctx, &networkInfo, manifest) if err != nil { return nil, err } diff --git a/app/cudos_merge.go b/app/cudos_merge.go new file mode 100644 index 000000000..ef1ac42c0 --- /dev/null +++ b/app/cudos_merge.go @@ -0,0 +1,24 @@ +package app + +import ( + "encoding/json" + "fmt" + "os" +) + +func ReadGenesisFile(filePath string) (*GenesisState, error) { + // Read the file into a byte slice + fileData, err := os.ReadFile(filePath) + if err != nil { + return nil, fmt.Errorf("error reading genesis file: %v", err) + } + + // Parse the JSON data + var genesisState GenesisState + err = json.Unmarshal(fileData, &genesisState) + if err != nil { + return nil, fmt.Errorf("error unmarshalling genesis file: %v", err) + } + + return &genesisState, nil +} diff --git a/cmd/fetchd/cmd/cudos_merge.go b/cmd/fetchd/cmd/cudos_merge.go new file mode 100644 index 000000000..c8aad42e5 --- /dev/null +++ b/cmd/fetchd/cmd/cudos_merge.go @@ -0,0 +1,12 @@ +package cmd + +import "github.com/spf13/cobra" + +// Module init related flags +const ( + FlagCudosPath = "cudos-path" +) + +func AddCudosFlags(startCmd *cobra.Command) { + startCmd.Flags().String(FlagCudosPath, "", "Cudos genesis path") +} diff --git a/cmd/fetchd/cmd/root.go b/cmd/fetchd/cmd/root.go index 4aab53882..3a63db8bf 100644 --- a/cmd/fetchd/cmd/root.go +++ b/cmd/fetchd/cmd/root.go @@ -153,6 +153,7 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig params.EncodingConfig) { func addModuleInitFlags(startCmd *cobra.Command) { crisis.AddModuleInitFlags(startCmd) wasm.AddModuleInitFlags(startCmd) + AddCudosFlags(startCmd) } func queryCommand() *cobra.Command { @@ -247,6 +248,7 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a logger, db, traceStore, true, skipUpgradeHeights, cast.ToString(appOpts.Get(flags.FlagHome)), cast.ToUint(appOpts.Get(server.FlagInvCheckPeriod)), + cast.ToString(appOpts.Get(FlagCudosPath)), a.encCfg, app.GetEnabledProposals(), appOpts, @@ -277,6 +279,11 @@ func (a appCreator) appExport( return servertypes.ExportedApp{}, errors.New("application home not set") } + cudosPath, ok := appOpts.Get(FlagCudosPath).(string) + if !ok || cudosPath == "" { + return servertypes.ExportedApp{}, errors.New("cudos path not set") + } + var emptyWasmOpts []wasm.Option if height != -1 { anApp = app.New( @@ -287,6 +294,7 @@ func (a appCreator) appExport( map[int64]bool{}, homePath, uint(1), + cudosPath, a.encCfg, app.GetEnabledProposals(), appOpts, @@ -305,6 +313,7 @@ func (a appCreator) appExport( map[int64]bool{}, homePath, uint(1), + cudosPath, a.encCfg, app.GetEnabledProposals(), appOpts, From c2aec5543f3a534e52915274205ae2c91e2daf92 Mon Sep 17 00:00:00 2001 From: Jiri Date: Wed, 24 Jul 2024 16:16:32 +0200 Subject: [PATCH 2/2] balances --- app/app.go | 13 ++++++- app/cudos_merge.go | 85 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 87 insertions(+), 11 deletions(-) diff --git a/app/app.go b/app/app.go index 6fad3ba98..98fcdae06 100644 --- a/app/app.go +++ b/app/app.go @@ -756,11 +756,22 @@ func (app *App) RegisterUpgradeHandlers(cfg module.Configurator) { }) app.UpgradeKeeper.SetUpgradeHandler("v0.11.4", func(ctx sdk.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + // "fetchd-v0.11.3-8-g929563a" genesis, err := ReadGenesisFile(app.cudosPath) if err != nil { return nil, err } - print(genesis) + + // Create the map to store balances by address + balanceMap, _ := GetBankBalances(genesis) + + // Print the balance map + for addr, coins := range balanceMap { + fmt.Printf("Address: %s\n", addr) + for _, coin := range coins { + fmt.Printf(" Coin: %s, Amount: %s\n", coin.Denom, coin.Amount.String()) + } + } manifest := NewUpgradeManifest() diff --git a/app/cudos_merge.go b/app/cudos_merge.go index ef1ac42c0..b5d074cbc 100644 --- a/app/cudos_merge.go +++ b/app/cudos_merge.go @@ -2,23 +2,88 @@ package app import ( "encoding/json" - "fmt" + sdk "github.com/cosmos/cosmos-sdk/types" + "io/ioutil" + "log" "os" ) -func ReadGenesisFile(filePath string) (*GenesisState, error) { - // Read the file into a byte slice - fileData, err := os.ReadFile(filePath) +// ParseJSON recursively parses JSON data into a map. +func ParseJSON(data []byte) (map[string]interface{}, error) { + var result map[string]interface{} + err := json.Unmarshal(data, &result) if err != nil { - return nil, fmt.Errorf("error reading genesis file: %v", err) + return nil, err + } + return result, nil +} + +// ReadJSONFile reads a JSON file and returns its content as a byte slice. +func ReadJSONFile(filePath string) ([]byte, error) { + file, err := os.Open(filePath) + if err != nil { + return nil, err + } + defer file.Close() + + byteValue, err := ioutil.ReadAll(file) + if err != nil { + return nil, err + } + + return byteValue, nil +} + +func ReadGenesisFile(filePath string) (map[string]interface{}, error) { + jsonData, err := ReadJSONFile(filePath) + if err != nil { + log.Fatalf("Failed to read JSON file: %v", err) } - // Parse the JSON data - var genesisState GenesisState - err = json.Unmarshal(fileData, &genesisState) + parsedData, err := ParseJSON(jsonData) if err != nil { - return nil, fmt.Errorf("error unmarshalling genesis file: %v", err) + log.Fatalf("Failed to parse JSON data: %v", err) + } + + return parsedData, nil +} + +func GetBankBalances(genesis map[string]interface{}) (map[string][]sdk.Coin, error) { + + // Create the map to store balances by address + balanceMap := make(map[string][]sdk.Coin) + + // Unsafe way to access and iterate over app_state -> bank -> balances + appState := genesis["app_state"].(map[string]interface{}) + bank := appState["bank"].(map[string]interface{}) + balances := bank["balances"].([]interface{}) + + for _, res := range balances { + address := res.(map[string]interface{})["address"].(string) + balance := res.(map[string]interface{})["coins"] + + // Create a list to store coins for this address + var coins []sdk.Coin + + for _, coinsRes := range balance.([]interface{}) { + denom := coinsRes.(map[string]interface{})["denom"].(string) + amount := coinsRes.(map[string]interface{})["amount"].(string) + // Convert amount to sdk.Int + amountInt, ok := sdk.NewIntFromString(amount) + if !ok { + panic("Failed to convert amount to sdk.Int: %s" + amount) + } + // Append coin to the list + coin := sdk.Coin{ + Denom: denom, + Amount: amountInt, + } + coins = append(coins, coin) + } + + // Store the list of coins in the map + balanceMap[address] = coins } - return &genesisState, nil + return balanceMap, nil }