From 0a253f3c6da690057255f371623a30f42dec1f5c Mon Sep 17 00:00:00 2001 From: Cian Hatton Date: Tue, 29 Aug 2023 14:42:33 +0000 Subject: [PATCH] feat(x/genutil): Allow creation of AppGenesis without a file lookup (#17571) Co-authored-by: Julien Robert --- CHANGELOG.md | 1 + x/genutil/types/genesis.go | 32 +++++++++++++++++++++++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a543132244d..2d91fe093134 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (client) [#17513](https://github.com/cosmos/cosmos-sdk/pull/17513) Allow overwritting `client.toml`. Use `client.CreateClientConfig` in place of `client.ReadFromClientConfig` and provide a custom template and a custom config. * (x/bank) [#14224](https://github.com/cosmos/cosmos-sdk/pull/14224) Allow injection of restrictions on transfers using `AppendSendRestriction` or `PrependSendRestriction`. +* (genutil) [#17571](https://github.com/cosmos/cosmos-sdk/pull/17571) Allow creation of `AppGenesis` without a file lookup. ### Improvements diff --git a/x/genutil/types/genesis.go b/x/genutil/types/genesis.go index 8cc486cd55b2..3c322fa086fd 100644 --- a/x/genutil/types/genesis.go +++ b/x/genutil/types/genesis.go @@ -1,11 +1,14 @@ package types import ( + "bufio" "bytes" "encoding/json" "errors" "fmt" + "io" "os" + "path/filepath" "time" cmtjson "github.com/cometbft/cometbft/libs/json" @@ -85,11 +88,11 @@ func (ag *AppGenesis) SaveAs(file string) error { return os.WriteFile(file, appGenesisBytes, 0o600) } -// AppGenesisFromFile reads the AppGenesis from the provided file. -func AppGenesisFromFile(genFile string) (*AppGenesis, error) { - jsonBlob, err := os.ReadFile(genFile) +// AppGenesisFromReader reads the AppGenesis from the reader. +func AppGenesisFromReader(reader io.Reader) (*AppGenesis, error) { + jsonBlob, err := io.ReadAll(reader) if err != nil { - return nil, fmt.Errorf("couldn't read AppGenesis file (%s): %w", genFile, err) + return nil, err } var appGenesis AppGenesis @@ -97,7 +100,7 @@ func AppGenesisFromFile(genFile string) (*AppGenesis, error) { // fallback to CometBFT genesis var ctmGenesis cmttypes.GenesisDoc if err2 := cmtjson.Unmarshal(jsonBlob, &ctmGenesis); err2 != nil { - return nil, fmt.Errorf("error unmarshalling AppGenesis at %s: %w\n failed fallback to CometBFT GenDoc: %w", genFile, err, err2) + return nil, fmt.Errorf("error unmarshalling AppGenesis: %w\n failed fallback to CometBFT GenDoc: %w", err, err2) } appGenesis = AppGenesis{ @@ -118,6 +121,25 @@ func AppGenesisFromFile(genFile string) (*AppGenesis, error) { return &appGenesis, nil } +// AppGenesisFromFile reads the AppGenesis from the provided file. +func AppGenesisFromFile(genFile string) (*AppGenesis, error) { + file, err := os.Open(filepath.Clean(genFile)) + if err != nil { + return nil, err + } + + appGenesis, err := AppGenesisFromReader(bufio.NewReader(file)) + if err != nil { + return nil, fmt.Errorf("failed to read genesis from file %s: %w", genFile, err) + } + + if err := file.Close(); err != nil { + return nil, err + } + + return appGenesis, nil +} + // -------------------------- // CometBFT Genesis Handling // --------------------------