diff --git a/baseapp/abci.go b/baseapp/abci.go index 345c17ccb8..6dc7d404fb 100644 --- a/baseapp/abci.go +++ b/baseapp/abci.go @@ -881,13 +881,16 @@ func handleQueryStore(app *BaseApp, path []string, req abci.RequestQuery) *abci. ), app.trace) } - // TODO: Update Query interface method accept a pointer to RequestQuery. - // - // Ref: https://github.com/cosmos/cosmos-sdk/issues/12272 - resp := queryable.Query(&req) + sdkReq := storetypes.RequestQuery(req) + resp, err := queryable.Query(&sdkReq) + if err != nil { + return sdkerrors.QueryResult(err, app.trace) + } resp.Height = req.Height - return resp + abciResp := abci.ResponseQuery(*resp) + + return &abciResp } func handleQueryP2P(app *BaseApp, path []string) *abci.ResponseQuery { diff --git a/go.mod b/go.mod index 292efbf6b9..89adced18a 100644 --- a/go.mod +++ b/go.mod @@ -162,6 +162,7 @@ replace ( // TODO: remove me after collections 0.2. is released. cosmossdk.io/collections => ./collections cosmossdk.io/core => ./core + cosmossdk.io/store => ./store // TODO: remove after 0.7.0 release cosmossdk.io/x/tx => ./x/tx ) diff --git a/go.sum b/go.sum index fdd4e9c38b..cf31d5b6c3 100644 --- a/go.sum +++ b/go.sum @@ -45,8 +45,6 @@ cosmossdk.io/log v1.1.0 h1:v0ogPHYeTzPcBTcPR1A3j1hkei4pZama8kz8LKlCMv0= cosmossdk.io/log v1.1.0/go.mod h1:6zjroETlcDs+mm62gd8Ig7mZ+N+fVOZS91V17H+M4N4= cosmossdk.io/math v1.0.1 h1:Qx3ifyOPaMLNH/89WeZFH268yCvU4xEcnPLu3sJqPPg= cosmossdk.io/math v1.0.1/go.mod h1:Ygz4wBHrgc7g0N+8+MrnTfS9LLn9aaTGa9hKopuym5k= -cosmossdk.io/store v0.1.0-alpha.1.0.20230524212735-6cabb6aa5741 h1:FkLRZDiqtcb9OSbNQULnB93W4W44zwbW1fRYZiJwGVM= -cosmossdk.io/store v0.1.0-alpha.1.0.20230524212735-6cabb6aa5741/go.mod h1:hGr2ujwG6vkDTxzwWEBU3CC38HHP9G5LPSrtHae9VR8= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= diff --git a/store/CHANGELOG.md b/store/CHANGELOG.md index c5d108783c..0d0bfc2b74 100644 --- a/store/CHANGELOG.md +++ b/store/CHANGELOG.md @@ -27,11 +27,16 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Features -- [#15712](https://github.com/cosmos/cosmos-sdk/pull/15712) Add `WorkingHash` function to the store interface to get the current app hash before commit. +* [#15712](https://github.com/cosmos/cosmos-sdk/pull/15712) Add `WorkingHash` function to the store interface to get the current app hash before commit. + * [#14645](https://github.com/cosmos/cosmos-sdk/pull/14645) Add limit to the length of key and value. * [#15683](https://github.com/cosmos/cosmos-sdk/pull/15683) `rootmulti.Store.CacheMultiStoreWithVersion` now can handle loading archival states that don't persist any of the module stores the current state has. * [#16060](https://github.com/cosmos/cosmos-sdk/pull/16060) Support saving restoring snapshot locally. +### Api Breaking Changes + +* [#16321](https://github.com/cosmos/cosmos-sdk/pull/16321) QueryInterface defines its own request and response types instead of relying on comet/abci & returns an error + ## [v0.1.0-alpha.1](https://github.com/cosmos/cosmos-sdk/releases/tag/store%2Fv0.1.0-alpha.1) - 2023-03-17 ### Features diff --git a/store/iavl/store.go b/store/iavl/store.go index 37ef8d96ee..8d5f7ede50 100644 --- a/store/iavl/store.go +++ b/store/iavl/store.go @@ -5,7 +5,6 @@ import ( "fmt" "io" - abci "github.com/cometbft/cometbft/abci/types" cmtprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" dbm "github.com/cosmos/cosmos-db" "github.com/cosmos/iavl" @@ -304,7 +303,7 @@ func (st *Store) Import(version int64) (*iavl.Importer, error) { } // Handle gatest the latest height, if height is 0 -func getHeight(tree Tree, req *abci.RequestQuery) int64 { +func getHeight(tree Tree, req *types.RequestQuery) int64 { height := req.Height if height == 0 { latest := tree.Version() @@ -324,18 +323,18 @@ func getHeight(tree Tree, req *abci.RequestQuery) int64 { // If latest-1 is not present, use latest (which must be present) // if you care to have the latest data to see a tx results, you must // explicitly set the height you want to see -func (st *Store) Query(req *abci.RequestQuery) (res *abci.ResponseQuery) { +func (st *Store) Query(req *types.RequestQuery) (res *types.ResponseQuery, err error) { defer st.metrics.MeasureSince("store", "iavl", "query") if len(req.Data) == 0 { - return types.QueryResult(errorsmod.Wrap(types.ErrTxDecode, "query cannot be zero length"), false) + return &types.ResponseQuery{}, errorsmod.Wrap(types.ErrTxDecode, "query cannot be zero length") } tree := st.tree // store the height we chose in the response, with 0 being changed to the // latest height - res = &abci.ResponseQuery{ + res = &types.ResponseQuery{ Height: getHeight(tree, req), } @@ -395,10 +394,10 @@ func (st *Store) Query(req *abci.RequestQuery) (res *abci.ResponseQuery) { res.Value = bz default: - return types.QueryResult(errorsmod.Wrapf(types.ErrUnknownRequest, "unexpected query path: %v", req.Path), false) + return &types.ResponseQuery{}, errorsmod.Wrapf(types.ErrUnknownRequest, "unexpected query path: %v", req.Path) } - return res + return res, err } // TraverseStateChanges traverses the state changes between two versions and calls the given function. diff --git a/store/iavl/store_test.go b/store/iavl/store_test.go index d7f542aa17..3d9fd94824 100644 --- a/store/iavl/store_test.go +++ b/store/iavl/store_test.go @@ -6,7 +6,6 @@ import ( "testing" "cosmossdk.io/log" - abci "github.com/cometbft/cometbft/abci/types" dbm "github.com/cosmos/cosmos-db" "github.com/cosmos/iavl" "github.com/stretchr/testify/require" @@ -138,7 +137,8 @@ func TestGetImmutable(t *testing.T) { require.NoError(t, err) require.Equal(t, newStore.Get([]byte("hello")), []byte("adios")) - res := newStore.Query(&abci.RequestQuery{Data: []byte("hello"), Height: cID.Version, Path: "/key", Prove: true}) + res, err := newStore.Query(&types.RequestQuery{Data: []byte("hello"), Height: cID.Version, Path: "/key", Prove: true}) + require.NoError(t, err) require.Equal(t, res.Value, []byte("adios")) require.NotNil(t, res.ProofOps) @@ -501,11 +501,12 @@ func TestIAVLStoreQuery(t *testing.T) { cid := iavlStore.Commit() ver := cid.Version - query := abci.RequestQuery{Path: "/key", Data: k1, Height: ver} - querySub := abci.RequestQuery{Path: "/subspace", Data: ksub, Height: ver} + query := types.RequestQuery{Path: "/key", Data: k1, Height: ver} + querySub := types.RequestQuery{Path: "/subspace", Data: ksub, Height: ver} // query subspace before anything set - qres := iavlStore.Query(&querySub) + qres, err := iavlStore.Query(&querySub) + require.NoError(t, err) require.Equal(t, uint32(0), qres.Code) require.Equal(t, valExpSubEmpty, qres.Value) @@ -514,24 +515,28 @@ func TestIAVLStoreQuery(t *testing.T) { iavlStore.Set(k2, v2) // set data without commit, doesn't show up - qres = iavlStore.Query(&query) + qres, err = iavlStore.Query(&query) + require.NoError(t, err) require.Equal(t, uint32(0), qres.Code) require.Nil(t, qres.Value) // commit it, but still don't see on old version cid = iavlStore.Commit() - qres = iavlStore.Query(&query) + qres, err = iavlStore.Query(&query) + require.NoError(t, err) require.Equal(t, uint32(0), qres.Code) require.Nil(t, qres.Value) // but yes on the new version query.Height = cid.Version - qres = iavlStore.Query(&query) + qres, err = iavlStore.Query(&query) + require.NoError(t, err) require.Equal(t, uint32(0), qres.Code) require.Equal(t, v1, qres.Value) // and for the subspace - qres = iavlStore.Query(&querySub) + qres, err = iavlStore.Query(&querySub) + require.NoError(t, err) require.Equal(t, uint32(0), qres.Code) require.Equal(t, valExpSub1, qres.Value) @@ -540,28 +545,33 @@ func TestIAVLStoreQuery(t *testing.T) { cid = iavlStore.Commit() // query will return old values, as height is fixed - qres = iavlStore.Query(&query) + qres, err = iavlStore.Query(&query) + require.NoError(t, err) require.Equal(t, uint32(0), qres.Code) require.Equal(t, v1, qres.Value) // update to latest in the query and we are happy query.Height = cid.Version - qres = iavlStore.Query(&query) + qres, err = iavlStore.Query(&query) + require.NoError(t, err) require.Equal(t, uint32(0), qres.Code) require.Equal(t, v3, qres.Value) - query2 := abci.RequestQuery{Path: "/key", Data: k2, Height: cid.Version} + query2 := types.RequestQuery{Path: "/key", Data: k2, Height: cid.Version} - qres = iavlStore.Query(&query2) + qres, err = iavlStore.Query(&query2) + require.NoError(t, err) require.Equal(t, uint32(0), qres.Code) require.Equal(t, v2, qres.Value) // and for the subspace - qres = iavlStore.Query(&querySub) + qres, err = iavlStore.Query(&querySub) + require.NoError(t, err) require.Equal(t, uint32(0), qres.Code) require.Equal(t, valExpSub2, qres.Value) // default (height 0) will show latest -1 - query0 := abci.RequestQuery{Path: "/key", Data: k1} - qres = iavlStore.Query(&query0) + query0 := types.RequestQuery{Path: "/key", Data: k1} + qres, err = iavlStore.Query(&query0) + require.NoError(t, err) require.Equal(t, uint32(0), qres.Code) require.Equal(t, v1, qres.Value) } diff --git a/store/internal/maps/maps.go b/store/internal/maps/maps.go index eaf0c58c89..2ee7d09b59 100644 --- a/store/internal/maps/maps.go +++ b/store/internal/maps/maps.go @@ -8,6 +8,7 @@ import ( cmtprotocrypto "github.com/cometbft/cometbft/proto/tendermint/crypto" "cosmossdk.io/store/internal/kv" + "cosmossdk.io/store/internal/tree" ) // merkleMap defines a merkle-ized tree from a map. Leave values are treated as @@ -66,7 +67,7 @@ func hashKVPairs(kvs kv.Pairs) []byte { kvsH[i] = KVPair(kvp).Bytes() } - return merkle.HashFromByteSlices(kvsH) + return tree.HashFromByteSlices(kvsH) } // --------------------------------------------- diff --git a/store/internal/tree/hash.go b/store/internal/tree/hash.go new file mode 100644 index 0000000000..a4facd93e9 --- /dev/null +++ b/store/internal/tree/hash.go @@ -0,0 +1,68 @@ +package tree + +import ( + "crypto/sha256" + "hash" + "math/bits" +) + +var ( + leafPrefix = []byte{0} + innerPrefix = []byte{1} +) + +// HashFromByteSlices computes a Merkle tree where the leaves are the byte slice, +// in the provided order. It follows RFC-6962. +func HashFromByteSlices(items [][]byte) []byte { + return hashFromByteSlices(sha256.New(), items) +} + +func hashFromByteSlices(sha hash.Hash, items [][]byte) []byte { + switch len(items) { + case 0: + return emptyHash() + case 1: + return leafHashOpt(sha, items[0]) + default: + k := getSplitPoint(int64(len(items))) + left := hashFromByteSlices(sha, items[:k]) + right := hashFromByteSlices(sha, items[k:]) + return innerHashOpt(sha, left, right) + } +} + +// returns tmhash(0x00 || leaf) +func leafHashOpt(s hash.Hash, leaf []byte) []byte { + s.Reset() + s.Write(leafPrefix) + s.Write(leaf) + return s.Sum(nil) +} + +func innerHashOpt(s hash.Hash, left, right []byte) []byte { + s.Reset() + s.Write(innerPrefix) + s.Write(left) + s.Write(right) + return s.Sum(nil) +} + +// returns tmhash() +func emptyHash() []byte { + h := sha256.Sum256([]byte{}) + return h[:] +} + +// getSplitPoint returns the largest power of 2 less than length +func getSplitPoint(length int64) int64 { + if length < 1 { + panic("Trying to split a tree with size < 1") + } + uLength := uint(length) + bitlen := bits.Len(uLength) + k := int64(1 << uint(bitlen-1)) + if k == length { + k >>= 1 + } + return k +} diff --git a/store/rootmulti/proof_test.go b/store/rootmulti/proof_test.go index 40588c89ae..2f8b08cd6f 100644 --- a/store/rootmulti/proof_test.go +++ b/store/rootmulti/proof_test.go @@ -4,13 +4,11 @@ import ( "testing" "cosmossdk.io/log" - abci "github.com/cometbft/cometbft/abci/types" - dbm "github.com/cosmos/cosmos-db" - "github.com/stretchr/testify/require" - "cosmossdk.io/store/iavl" "cosmossdk.io/store/metrics" "cosmossdk.io/store/types" + dbm "github.com/cosmos/cosmos-db" + "github.com/stretchr/testify/require" ) func TestVerifyIAVLStoreQueryProof(t *testing.T) { @@ -23,11 +21,12 @@ func TestVerifyIAVLStoreQueryProof(t *testing.T) { cid := store.Commit() // Get Proof - res := store.Query(&abci.RequestQuery{ + res, err := store.Query(&types.RequestQuery{ Path: "/key", // required path to get key/value+proof Data: []byte("MYKEY"), Prove: true, }) + require.NoError(t, err) require.NotNil(t, res.ProofOps) // Verify proof. @@ -70,16 +69,17 @@ func TestVerifyMultiStoreQueryProof(t *testing.T) { cid := store.Commit() // Get Proof - res := store.Query(&abci.RequestQuery{ + res, err := store.Query(&types.RequestQuery{ Path: "/iavlStoreKey/key", // required path to get key/value+proof Data: []byte("MYKEY"), Prove: true, }) + require.NoError(t, err) require.NotNil(t, res.ProofOps) // Verify proof. prt := DefaultProofRuntime() - err := prt.VerifyValue(res.ProofOps, cid.Hash, "/iavlStoreKey/MYKEY", []byte("MYVALUE")) + err = prt.VerifyValue(res.ProofOps, cid.Hash, "/iavlStoreKey/MYKEY", []byte("MYVALUE")) require.Nil(t, err) // Verify proof. @@ -126,11 +126,12 @@ func TestVerifyMultiStoreQueryProofAbsence(t *testing.T) { cid := store.Commit() // Commit with empty iavl store. // Get Proof - res := store.Query(&abci.RequestQuery{ + res, err := store.Query(&types.RequestQuery{ Path: "/iavlStoreKey/key", // required path to get key/value+proof Data: []byte("MYABSENTKEY"), Prove: true, }) + require.NoError(t, err) require.NotNil(t, res.ProofOps) // Verify proof. diff --git a/store/rootmulti/store.go b/store/rootmulti/store.go index 7f9665aafc..5d8add723f 100644 --- a/store/rootmulti/store.go +++ b/store/rootmulti/store.go @@ -10,7 +10,6 @@ import ( "sync" "cosmossdk.io/log" - abci "github.com/cometbft/cometbft/abci/types" cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" dbm "github.com/cosmos/cosmos-db" protoio "github.com/cosmos/gogoproto/io" @@ -726,33 +725,33 @@ func (rs *Store) GetStoreByName(name string) types.Store { // modified to remove the substore prefix. // Ie. `req.Path` here is `//`, and trimmed to `/` for the substore. // TODO: add proof for `multistore -> substore`. -func (rs *Store) Query(req *abci.RequestQuery) *abci.ResponseQuery { +func (rs *Store) Query(req *types.RequestQuery) (*types.ResponseQuery, error) { path := req.Path storeName, subpath, err := parsePath(path) if err != nil { - return types.QueryResult(err, false) + return &types.ResponseQuery{}, err } store := rs.GetStoreByName(storeName) if store == nil { - return types.QueryResult(errorsmod.Wrapf(types.ErrUnknownRequest, "no such store: %s", storeName), false) + return &types.ResponseQuery{}, errorsmod.Wrapf(types.ErrUnknownRequest, "no such store: %s", storeName) } queryable, ok := store.(types.Queryable) if !ok { - return types.QueryResult(errorsmod.Wrapf(types.ErrUnknownRequest, "store %s (type %T) doesn't support queries", storeName, store), false) + return &types.ResponseQuery{}, errorsmod.Wrapf(types.ErrUnknownRequest, "store %s (type %T) doesn't support queries", storeName, store) } // trim the path and make the query req.Path = subpath - res := queryable.Query(req) + res, err := queryable.Query(req) if !req.Prove || !RequireProof(subpath) { - return res + return res, err } if res.ProofOps == nil || len(res.ProofOps.Ops) == 0 { - return types.QueryResult(errorsmod.Wrap(types.ErrInvalidRequest, "proof is unexpectedly empty; ensure height has not been pruned"), false) + return &types.ResponseQuery{}, errorsmod.Wrap(types.ErrInvalidRequest, "proof is unexpectedly empty; ensure height has not been pruned") } // If the request's height is the latest height we've committed, then utilize @@ -765,14 +764,14 @@ func (rs *Store) Query(req *abci.RequestQuery) *abci.ResponseQuery { } else { commitInfo, err = rs.GetCommitInfo(res.Height) if err != nil { - return types.QueryResult(err, false) + return &types.ResponseQuery{}, err } } // Restore origin path and append proof op. res.ProofOps.Ops = append(res.ProofOps.Ops, commitInfo.ProofOp(storeName)) - return res + return res, nil } // SetInitialVersion sets the initial version of the IAVL tree. It is used when diff --git a/store/rootmulti/store_test.go b/store/rootmulti/store_test.go index 3511a4f3dc..f4429993d8 100644 --- a/store/rootmulti/store_test.go +++ b/store/rootmulti/store_test.go @@ -6,8 +6,8 @@ import ( "testing" "time" + "cosmossdk.io/errors" "cosmossdk.io/log" - abci "github.com/cometbft/cometbft/abci/types" dbm "github.com/cosmos/cosmos-db" "github.com/stretchr/testify/require" @@ -456,41 +456,44 @@ func TestMultiStoreQuery(t *testing.T) { require.Nil(t, err) // Test bad path. - query := abci.RequestQuery{Path: "/key", Data: k, Height: ver} - qres := multi.Query(&query) - require.EqualValues(t, types.ErrUnknownRequest.ABCICode(), qres.Code) - require.EqualValues(t, types.ErrUnknownRequest.Codespace(), qres.Codespace) + query := types.RequestQuery{Path: "/key", Data: k, Height: ver} + _, err = multi.Query(&query) + codespace, code, _ := errors.ABCIInfo(err, false) + require.EqualValues(t, types.ErrUnknownRequest.ABCICode(), code) + require.EqualValues(t, types.ErrUnknownRequest.Codespace(), codespace) query.Path = "h897fy32890rf63296r92" - qres = multi.Query(&query) - require.EqualValues(t, types.ErrUnknownRequest.ABCICode(), qres.Code) - require.EqualValues(t, types.ErrUnknownRequest.Codespace(), qres.Codespace) + _, err = multi.Query(&query) + codespace, code, _ = errors.ABCIInfo(err, false) + require.EqualValues(t, types.ErrUnknownRequest.ABCICode(), code) + require.EqualValues(t, types.ErrUnknownRequest.Codespace(), codespace) // Test invalid store name. query.Path = "/garbage/key" - qres = multi.Query(&query) - require.EqualValues(t, types.ErrUnknownRequest.ABCICode(), qres.Code) - require.EqualValues(t, types.ErrUnknownRequest.Codespace(), qres.Codespace) + _, err = multi.Query(&query) + codespace, code, _ = errors.ABCIInfo(err, false) + require.EqualValues(t, types.ErrUnknownRequest.ABCICode(), code) + require.EqualValues(t, types.ErrUnknownRequest.Codespace(), codespace) // Test valid query with data. query.Path = "/store1/key" - qres = multi.Query(&query) - require.EqualValues(t, 0, qres.Code) + qres, err := multi.Query(&query) + require.NoError(t, err) require.Equal(t, v, qres.Value) // Test valid but empty query. query.Path = "/store2/key" query.Prove = true - qres = multi.Query(&query) - require.EqualValues(t, 0, qres.Code) + qres, err = multi.Query(&query) + require.NoError(t, err) require.Nil(t, qres.Value) // Test store2 data. // Since we are using the request as a reference, the path will be modified. query.Data = k2 query.Path = "/store2/key" - qres = multi.Query(&query) - require.EqualValues(t, 0, qres.Code) + qres, err = multi.Query(&query) + require.NoError(t, err) require.Equal(t, v2, qres.Value) } diff --git a/store/types/context.go b/store/types/context.go index 37f18d31a7..2daccef912 100644 --- a/store/types/context.go +++ b/store/types/context.go @@ -2,13 +2,11 @@ package types import ( "cosmossdk.io/log" - tmproto "github.com/cometbft/cometbft/proto/tendermint/types" ) // Context is an interface used by an App to pass context information // needed to process store streaming requests. type Context interface { - BlockHeader() tmproto.Header BlockHeight() int64 Logger() log.Logger StreamingManager() StreamingManager diff --git a/store/types/errors.go b/store/types/errors.go index 6876b2b1d3..db86a3cc65 100644 --- a/store/types/errors.go +++ b/store/types/errors.go @@ -2,7 +2,6 @@ package types import ( "cosmossdk.io/errors" - abci "github.com/cometbft/cometbft/abci/types" ) const StoreCodespace = "store" @@ -27,16 +26,3 @@ var ( // invalid data. ErrInvalidRequest = errors.Register(StoreCodespace, 7, "invalid request") ) - -// ABCI QueryResult - -// QueryResult returns a ResponseQuery from an error. It will try to parse ABCI -// info from the error. -func QueryResult(err error, debug bool) *abci.ResponseQuery { - space, code, log := errors.ABCIInfo(err, debug) - return &abci.ResponseQuery{ - Codespace: space, - Code: code, - Log: log, - } -} diff --git a/store/types/store.go b/store/types/store.go index 65f552e532..0ac87db0c2 100644 --- a/store/types/store.go +++ b/store/types/store.go @@ -4,7 +4,7 @@ import ( "fmt" "io" - abci "github.com/cometbft/cometbft/abci/types" + "github.com/cometbft/cometbft/proto/tendermint/crypto" dbm "github.com/cosmos/cosmos-db" "cosmossdk.io/store/metrics" @@ -40,7 +40,26 @@ type CommitStore interface { // // This is an optional, but useful extension to any CommitStore type Queryable interface { - Query(*abci.RequestQuery) *abci.ResponseQuery + Query(*RequestQuery) (*ResponseQuery, error) +} + +type RequestQuery struct { + Data []byte + Path string + Height int64 + Prove bool +} + +type ResponseQuery struct { + Code uint32 + Log string + Info string + Index int64 + Key []byte + Value []byte + ProofOps *crypto.ProofOps + Height int64 + Codespace string } //---------------------------------------- diff --git a/tools/confix/go.mod b/tools/confix/go.mod index a6e6f1abbc..2a44147ce6 100644 --- a/tools/confix/go.mod +++ b/tools/confix/go.mod @@ -160,5 +160,6 @@ replace ( cosmossdk.io/collections => ../../collections cosmossdk.io/core => ../../core cosmossdk.io/x/tx => ../../x/tx + cosmossdk.io/store => ../../store github.com/cosmos/cosmos-sdk => ../../ ) diff --git a/tools/rosetta/go.mod b/tools/rosetta/go.mod index 0fcbf25b3f..86952169d0 100644 --- a/tools/rosetta/go.mod +++ b/tools/rosetta/go.mod @@ -151,5 +151,6 @@ replace ( cosmossdk.io/collections => ../../collections // TODO: remove me after collections v0.2.0 is released cosmossdk.io/core => ../../core cosmossdk.io/x/tx => ../../x/tx + cosmossdk.io/store => ../../store github.com/cosmos/cosmos-sdk => ../.. ) diff --git a/x/circuit/go.mod b/x/circuit/go.mod index 93e4cfcd64..c7ef73eb97 100644 --- a/x/circuit/go.mod +++ b/x/circuit/go.mod @@ -153,5 +153,6 @@ replace ( cosmossdk.io/collections => ../../collections cosmossdk.io/core => ../../core cosmossdk.io/x/tx => ../tx + cosmossdk.io/store => ../../store github.com/cosmos/cosmos-sdk => ../../. ) diff --git a/x/evidence/go.mod b/x/evidence/go.mod index 7fd2a747ac..bf08727e64 100644 --- a/x/evidence/go.mod +++ b/x/evidence/go.mod @@ -156,6 +156,7 @@ replace ( cosmossdk.io/collections => ../../collections cosmossdk.io/core => ../../core cosmossdk.io/x/tx => ../tx + cosmossdk.io/store => ../../store github.com/cosmos/cosmos-sdk => ../../ ) diff --git a/x/feegrant/go.mod b/x/feegrant/go.mod index 6e2c06d68f..140df73de9 100644 --- a/x/feegrant/go.mod +++ b/x/feegrant/go.mod @@ -156,5 +156,6 @@ replace ( cosmossdk.io/collections => ../../collections cosmossdk.io/core => ../../core cosmossdk.io/x/tx => ../tx + cosmossdk.io/store => ../../store github.com/cosmos/cosmos-sdk => ../../ ) diff --git a/x/nft/go.mod b/x/nft/go.mod index b30075e36a..063db40dbf 100644 --- a/x/nft/go.mod +++ b/x/nft/go.mod @@ -155,6 +155,7 @@ replace ( // TODO: remove me after collections 0.2. is released. cosmossdk.io/collections => ../../collections cosmossdk.io/core => ../../core + cosmossdk.io/store => ../../store // TODO remove once https://github.com/cosmos/cosmos-sdk/pull/16155 is merged github.com/cosmos/cosmos-sdk => ../.. github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.9.0 diff --git a/x/upgrade/go.mod b/x/upgrade/go.mod index d2aba479cc..f8e523ab35 100644 --- a/x/upgrade/go.mod +++ b/x/upgrade/go.mod @@ -182,5 +182,6 @@ replace ( cosmossdk.io/collections => ../../collections cosmossdk.io/core => ../../core cosmossdk.io/x/tx => ../tx + cosmossdk.io/store => ../../store github.com/cosmos/cosmos-sdk => ../../ )