## Description We decided to remove middlewares, and revert to antehandlers (exactly like in v045) for this release. A better middleware solution will be implemented after v046. ref: #11955 Because this refactor is big, so I decided to cut it into two. This PR is part 1 of 2: - part 1: Revert baseapp and middlewares to v0.45.4 - part 2: Add posthandler, tips, priority --- Suggestion for reviewers: This PR might still be hard to review though. I think it's easier to actually review the diff between v0.45.4 and this PR: - `git difftool -d v0.45.4..am/revert-045-baseapp baseapp` - most important parts to review: runTx, runMsgs - `git difftool -d v0.45.4..am/revert-045-baseapp x/auth/ante` - only cosmetic changes - `git difftool -d v0.45.4..am/revert-045-baseapp simapp` --- ### Author Checklist *All items are required. Please add a note to the item if the item is not applicable and please add links to any relevant follow up issues.* I have... - [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] added `!` to the type prefix if API or client breaking change - [ ] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/main/CONTRIBUTING.md#pr-targeting)) - [ ] provided a link to the relevant issue or specification - [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/main/docs/building-modules) - [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/main/CONTRIBUTING.md#testing) - [ ] added a changelog entry to `CHANGELOG.md` - [ ] included comments for [documenting Go code](https://blog.golang.org/godoc) - [ ] updated the relevant documentation or specification - [ ] reviewed "Files changed" and left comments if necessary - [ ] confirmed all CI checks have passed ### Reviewers Checklist *All items are required. Please add a note if the item is not applicable and please add your handle next to the items reviewed if you only reviewed selected items.* I have... - [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] confirmed `!` in the type prefix if API or client breaking change - [ ] confirmed all author checklist items have been addressed - [ ] reviewed state machine logic - [ ] reviewed API design and naming - [ ] reviewed documentation is accurate - [ ] reviewed tests and test coverage - [ ] manually tested (if applicable)
128 lines
3.3 KiB
Go
128 lines
3.3 KiB
Go
package mock
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"path/filepath"
|
|
|
|
"github.com/tendermint/tendermint/types"
|
|
|
|
abci "github.com/tendermint/tendermint/abci/types"
|
|
"github.com/tendermint/tendermint/libs/log"
|
|
|
|
bam "github.com/cosmos/cosmos-sdk/baseapp"
|
|
"github.com/cosmos/cosmos-sdk/codec"
|
|
storetypes "github.com/cosmos/cosmos-sdk/store/types"
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
)
|
|
|
|
// NewApp creates a simple mock kvstore app for testing. It should work
|
|
// similar to a real app. Make sure rootDir is empty before running the test,
|
|
// in order to guarantee consistent results
|
|
func NewApp(rootDir string, logger log.Logger) (abci.Application, error) {
|
|
db, err := sdk.NewLevelDB("mock", filepath.Join(rootDir, "data"))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Capabilities key to access the main KVStore.
|
|
capKeyMainStore := sdk.NewKVStoreKey("main")
|
|
|
|
// Create BaseApp.
|
|
baseApp := bam.NewBaseApp("kvstore", logger, db, decodeTx)
|
|
|
|
// Set mounts for BaseApp's MultiStore.
|
|
baseApp.MountStores(capKeyMainStore)
|
|
|
|
baseApp.SetInitChainer(InitChainer(capKeyMainStore))
|
|
|
|
// Set a Route.
|
|
baseApp.Router().AddRoute(sdk.NewRoute("kvstore", KVStoreHandler(capKeyMainStore)))
|
|
|
|
// Load latest version.
|
|
if err := baseApp.LoadLatestVersion(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return baseApp, nil
|
|
}
|
|
|
|
// KVStoreHandler is a simple handler that takes kvstoreTx and writes
|
|
// them to the db
|
|
func KVStoreHandler(storeKey storetypes.StoreKey) sdk.Handler {
|
|
return func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
|
|
dTx, ok := msg.(kvstoreTx)
|
|
if !ok {
|
|
return nil, errors.New("KVStoreHandler should only receive kvstoreTx")
|
|
}
|
|
|
|
// tx is already unmarshalled
|
|
key := dTx.key
|
|
value := dTx.value
|
|
|
|
store := ctx.KVStore(storeKey)
|
|
store.Set(key, value)
|
|
|
|
return &sdk.Result{
|
|
Log: fmt.Sprintf("set %s=%s", key, value),
|
|
}, nil
|
|
}
|
|
}
|
|
|
|
// basic KV structure
|
|
type KV struct {
|
|
Key string `json:"key"`
|
|
Value string `json:"value"`
|
|
}
|
|
|
|
// What Genesis JSON is formatted as
|
|
type GenesisJSON struct {
|
|
Values []KV `json:"values"`
|
|
}
|
|
|
|
// InitChainer returns a function that can initialize the chain
|
|
// with key/value pairs
|
|
func InitChainer(key storetypes.StoreKey) func(sdk.Context, abci.RequestInitChain) abci.ResponseInitChain {
|
|
return func(ctx sdk.Context, req abci.RequestInitChain) abci.ResponseInitChain {
|
|
stateJSON := req.AppStateBytes
|
|
|
|
genesisState := new(GenesisJSON)
|
|
err := json.Unmarshal(stateJSON, genesisState)
|
|
if err != nil {
|
|
panic(err) // TODO https://github.com/cosmos/cosmos-sdk/issues/468
|
|
// return sdk.ErrGenesisParse("").TraceCause(err, "")
|
|
}
|
|
|
|
for _, val := range genesisState.Values {
|
|
store := ctx.KVStore(key)
|
|
store.Set([]byte(val.Key), []byte(val.Value))
|
|
}
|
|
return abci.ResponseInitChain{}
|
|
}
|
|
}
|
|
|
|
// AppGenState can be passed into InitCmd, returns a static string of a few
|
|
// key-values that can be parsed by InitChainer
|
|
func AppGenState(_ *codec.LegacyAmino, _ types.GenesisDoc, _ []json.RawMessage) (appState json.RawMessage, err error) {
|
|
appState = json.RawMessage(`{
|
|
"values": [
|
|
{
|
|
"key": "hello",
|
|
"value": "goodbye"
|
|
},
|
|
{
|
|
"key": "foo",
|
|
"value": "bar"
|
|
}
|
|
]
|
|
}`)
|
|
return
|
|
}
|
|
|
|
// AppGenStateEmpty returns an empty transaction state for mocking.
|
|
func AppGenStateEmpty(_ *codec.LegacyAmino, _ types.GenesisDoc, _ []json.RawMessage) (appState json.RawMessage, err error) {
|
|
appState = json.RawMessage(``)
|
|
return
|
|
}
|