* Start cosmos-sdk v0.47 integration (#1136) * Upgrade to sdk v0.47 branch * More integration work * SDK version upgrade; fixes * More fixes * Fixes * Deactivate failing tests * SDK + ibc-go version upgrades * limix gas fix (cherry picked from commit f7f841768e5051d96d243b42ce4f231a33020326) * with valset in bench (cherry picked from commit 35b2a8fd2c23d6160fca540771fd348913f7f143) * Revert staking query handler; fix tests * Minor cleanup * Rebased * Address linter issues * Set legacy router proper * Deactivate failing test. Race condition needs to handled in SDK * Address some code smells * Bump sdk version * Use gov v1 internally for votes * Activate test after sdk fix * Add group test * Add config template for wasm fields * Add Rust backtrace flag for more debug output on simulations * Set unique node folder for tests * Revert "Add Rust backtrace flag for more debug output on simulations" This reverts commit 218c3c6ce137dc02f7bc38391408d3460fb27e6f. * Simulations * Run also im/export + deterministic sims * Add package prefix to interfaces * Add signer annotation (https://github.com/cosmos/cosmos-sdk/issues/10933), minor cleanup * Bump sdk version * Review comments Co-authored-by: vuong <nguyenvuong1122000@gmail.com> * Bump bufbuild/buf-setup-action from 1.11.0 to 1.12.0 Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.11.0 to 1.12.0. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.11.0...v1.12.0) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> (cherry picked from commitf4905955b5) * Remove intertx for vanilla ICA * fix msg format in EVENTS.md (cherry picked from commit38d466adfd) * Better to sdk coin convertion (#1164) * Better to sdk coin convertion * Review feedback (cherry picked from commita925a9ed61) * Disallow only address permission (#1163) * Remove AccessTypeOnlyAddress for store msg * Remove AccessTypeOnlyAddress for update config msg * Review feedback Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> Co-authored-by: Simon Warta <2603011+webmaster128@users.noreply.github.com> (cherry picked from commit8991633de2) * Integrate wasmvm v1.2.0 (backport #1161) (#1175) * Integrate wasmvm v1.2.0 (#1161) * Bump wasmvm version * Bump wasm test contracts * Encode weighted votes * Encode instantiate2 * Handle code info query; better wasmvm errors * Fix readme * Make linter happy * add non cgo build * Review comments * Bump wasmvm to release version Co-authored-by: jhernandezb <contact@jhernandez.me> (cherry picked from commit957b38e0a5) # Conflicts: # x/wasm/keeper/handler_plugin_encoders.go # x/wasm/keeper/handler_plugin_encoders_test.go # x/wasm/keeper/keeper.go # x/wasm/keeper/keeper_test.go * Adress merge conflicts Co-authored-by: Alexander Peters <alpe@users.noreply.github.com> * Bump bufbuild/buf-setup-action from 1.12.0 to 1.13.0 Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.12.0 to 1.13.0. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.12.0...v1.13.0) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> (cherry picked from commitffa0e5e5e1) * Emit events for setContractAdmin + setAccessConfig (#1179) (cherry picked from commitc9e7830ac1) * Dependency upgrades (#1172) * Bump sdk version to lastest * Bump ibc-go version to lastest * Remove channel hack * Update to ibc-go v7 + protoVer=0.11.5 * Bump bufbuild/buf-setup-action from 1.13.0 to 1.13.1 Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.13.0 to 1.13.1. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.13.0...v1.13.1) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> (cherry picked from commitde27e7f82f) * Fix typos (backport #1185) (#1194) * Fix typos (cherry picked from commitc88b8194cb) # Conflicts: # proto/cosmwasm/wasm/v1/tx.proto * Fix merge conflict --------- Co-authored-by: Alex Peters <alpe@users.noreply.github.com> * Bump bufbuild/buf-setup-action from 1.13.1 to 1.14.0 (#1200) Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.13.1 to 1.14.0. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.13.1...v1.14.0) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> (cherry picked from commitf3fc31c386) * list-contract-by-code bugfix (cherry picked from commit2ccffed778) * fix: stargate querier does not reset the state (cherry picked from commitfd0323541d) * test: add unit test (cherry picked from commit6d8018ac59) * Add Windows client support (#1197) * Add Windows client support * Separate server and windows client --------- Co-authored-by: Alex Peters <alpe@users.noreply.github.com> (cherry picked from commit8a20779518) * Bump bufbuild/buf-setup-action from 1.14.0 to 1.15.0 Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.14.0 to 1.15.0. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.14.0...v1.15.0) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> (cherry picked from commite5fab3da5a) * Rename windows client binary (cherry picked from commitde09c7fe2b) * Return IBC packet sequence number (backport #1225) (#1233) * Return IBC packet sequence number (#1225) * Return IBC packet sequence number * Fix review feedbacks * Remove names to return values in DispatchMsg method * Fix comments (cherry picked from commit4f1c57fc12) # Conflicts: # x/wasm/keeper/handler_plugin.go * Fix merge conflict --------- Co-authored-by: pinosu <95283998+pinosu@users.noreply.github.com> Co-authored-by: Alex Peters <alpe@users.noreply.github.com> * Test rust panic for regression (cherry picked from commita52e604966) * Fix client checksum verification (#1234) * Fix client checksum verification * Review comments (cherry picked from commit1a8019b380) # Conflicts: # x/wasm/client/cli/gov_tx.go * Fix merge conflict * Fix linters * Configure sonarcloud analysis (cherry picked from commit85cf1614fb) * Bump bufbuild/buf-setup-action from 1.15.0 to 1.15.1 Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.15.0 to 1.15.1. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.15.0...v1.15.1) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> (cherry picked from commit730ea5a1cf) * Make `CaptureIbcEvents` in ibctesting public. Before this change, it wasn't possible to implement the `chain.SendMsgs` method without [copying](https://github.com/public-awesome/ics721/blob/main/e2e/suite_helpers.go#L81-L98) them over. (cherry picked from commitb64fa078a3) * Upgrade to wasmvm 1.2.1 (backport #1245) (#1254) * Upgrade to wasmvm 1.2.1 (#1245) * Use wasmvm store adapter * Bump wasmvm to v1.2.1 (cherry picked from commit850f901b2e) # Conflicts: # go.mod # go.sum # x/wasm/keeper/keeper.go * Resolve conflicts --------- Co-authored-by: Alexander Peters <alpe@users.noreply.github.com> * WIP All cometbft (#1244) * Dep upgrade; use CometBft * Remove duplicte message events * Add changelog for v0.31.0 (#1188) * Start changelog for v0.31.0 * Add ICA upgrade * Add proto version link to buf.build * Update changelog (#1239) * Update changelog * Update changelog with latest changes * Set release date --------- Co-authored-by: pinosu <95283998+pinosu@users.noreply.github.com> (cherry picked from commitbc0e817912) * Remove new message type event * Support msg update params gov proposal (#1247) * Add MsgUpdateParams support * Implement UpdateParams msg * Fix test UpdateParams * Add migration test * Fix * Fix lint issues * Revert changes according to review feedback * Remove more x/params dependencies * Remove x/params from genesis test * Formatting * Restore old changes * fix lint * Fix tests and restructure migrations * Rename alias for convention --------- Co-authored-by: Alex Peters <alpe@users.noreply.github.com> * Fix test data generator (#1263) * linting 47 pr (#1261) * lint cosmwasm for sdk 47 * fix * remove setGenesis * remove additional unused functions * pass tests * use SDK's errors module * unecessary conversions * unnecessary conversions * remove unneeded event manager * complete linting of tests for 47 * add test for reimportation * check errors * Update x/wasm/keeper/proposal_integration_test.go Co-authored-by: Alexander Peters <alpe@users.noreply.github.com> * apply suggestion * suggestions * lints * don't return error in when making new transactions * no todo's in the code * Fix test data generator * Update x/wasm/types/genesis_test.go Co-authored-by: Alexander Peters <alpe@users.noreply.github.com> * use the full string invalid address (2 words) always --------- Co-authored-by: Alexander Peters <alpe@users.noreply.github.com> * Regenerate from proto; remove dead code; polish code * Set SDK version to v0.47x.0 (#1262) * Set SDK version to v0.47x.0 * Set chainID * Minor updates * Set chainID for simulations * Buf mod update * Use sdk tag instead of hash in buf * Bump ibc-go to v7.0.0 * faddat/re merge main (#1274) undefined --------- Co-authored-by: vuong <nguyenvuong1122000@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: llllllluc <58892938+llllllluc@users.noreply.github.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> Co-authored-by: Gjermund Garaba <gjermund@garaba.net> Co-authored-by: Nikhil Suri <nikhilsuri@comcast.net> Co-authored-by: Paul <p22626262@gmail.com> Co-authored-by: pinosu <95283998+pinosu@users.noreply.github.com> Co-authored-by: ekez <zekemedley@gmail.com> Co-authored-by: Jacob Gadikian <jacobgadikian@gmail.com>
224 lines
7.7 KiB
Go
224 lines
7.7 KiB
Go
package keeper
|
|
|
|
import (
|
|
"fmt"
|
|
"sort"
|
|
"strings"
|
|
|
|
errorsmod "cosmossdk.io/errors"
|
|
wasmvmtypes "github.com/CosmWasm/wasmvm/types"
|
|
abci "github.com/cometbft/cometbft/abci/types"
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
|
|
|
"github.com/CosmWasm/wasmd/x/wasm/types"
|
|
)
|
|
|
|
// Messenger is an extension point for custom wasmd message handling
|
|
type Messenger interface {
|
|
// DispatchMsg encodes the wasmVM message and dispatches it.
|
|
DispatchMsg(ctx sdk.Context, contractAddr sdk.AccAddress, contractIBCPortID string, msg wasmvmtypes.CosmosMsg) (events []sdk.Event, data [][]byte, err error)
|
|
}
|
|
|
|
// replyer is a subset of keeper that can handle replies to submessages
|
|
type replyer interface {
|
|
reply(ctx sdk.Context, contractAddress sdk.AccAddress, reply wasmvmtypes.Reply) ([]byte, error)
|
|
}
|
|
|
|
// MessageDispatcher coordinates message sending and submessage reply/ state commits
|
|
type MessageDispatcher struct {
|
|
messenger Messenger
|
|
keeper replyer
|
|
}
|
|
|
|
// NewMessageDispatcher constructor
|
|
func NewMessageDispatcher(messenger Messenger, keeper replyer) *MessageDispatcher {
|
|
return &MessageDispatcher{messenger: messenger, keeper: keeper}
|
|
}
|
|
|
|
// DispatchMessages sends all messages.
|
|
func (d MessageDispatcher) DispatchMessages(ctx sdk.Context, contractAddr sdk.AccAddress, ibcPort string, msgs []wasmvmtypes.CosmosMsg) error {
|
|
for _, msg := range msgs {
|
|
events, _, err := d.messenger.DispatchMsg(ctx, contractAddr, ibcPort, msg)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
// redispatch all events, (type sdk.EventTypeMessage will be filtered out in the handler)
|
|
ctx.EventManager().EmitEvents(events)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// dispatchMsgWithGasLimit sends a message with gas limit applied
|
|
func (d MessageDispatcher) dispatchMsgWithGasLimit(ctx sdk.Context, contractAddr sdk.AccAddress, ibcPort string, msg wasmvmtypes.CosmosMsg, gasLimit uint64) (events []sdk.Event, data [][]byte, err error) {
|
|
limitedMeter := sdk.NewGasMeter(gasLimit)
|
|
subCtx := ctx.WithGasMeter(limitedMeter)
|
|
|
|
// catch out of gas panic and just charge the entire gas limit
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
// if it's not an OutOfGas error, raise it again
|
|
if _, ok := r.(sdk.ErrorOutOfGas); !ok {
|
|
// log it to get the original stack trace somewhere (as panic(r) keeps message but stacktrace to here
|
|
moduleLogger(ctx).Info("SubMsg rethrowing panic: %#v", r)
|
|
panic(r)
|
|
}
|
|
ctx.GasMeter().ConsumeGas(gasLimit, "Sub-Message OutOfGas panic")
|
|
err = errorsmod.Wrap(sdkerrors.ErrOutOfGas, "SubMsg hit gas limit")
|
|
}
|
|
}()
|
|
events, data, err = d.messenger.DispatchMsg(subCtx, contractAddr, ibcPort, msg)
|
|
|
|
// make sure we charge the parent what was spent
|
|
spent := subCtx.GasMeter().GasConsumed()
|
|
ctx.GasMeter().ConsumeGas(spent, "From limited Sub-Message")
|
|
|
|
return events, data, err
|
|
}
|
|
|
|
// DispatchSubmessages builds a sandbox to execute these messages and returns the execution result to the contract
|
|
// that dispatched them, both on success as well as failure
|
|
func (d MessageDispatcher) DispatchSubmessages(ctx sdk.Context, contractAddr sdk.AccAddress, ibcPort string, msgs []wasmvmtypes.SubMsg) ([]byte, error) {
|
|
var rsp []byte
|
|
for _, msg := range msgs {
|
|
switch msg.ReplyOn {
|
|
case wasmvmtypes.ReplySuccess, wasmvmtypes.ReplyError, wasmvmtypes.ReplyAlways, wasmvmtypes.ReplyNever:
|
|
default:
|
|
return nil, errorsmod.Wrap(types.ErrInvalid, "replyOn value")
|
|
}
|
|
// first, we build a sub-context which we can use inside the submessages
|
|
subCtx, commit := ctx.CacheContext()
|
|
em := sdk.NewEventManager()
|
|
subCtx = subCtx.WithEventManager(em)
|
|
|
|
// check how much gas left locally, optionally wrap the gas meter
|
|
gasRemaining := ctx.GasMeter().Limit() - ctx.GasMeter().GasConsumed()
|
|
limitGas := msg.GasLimit != nil && (*msg.GasLimit < gasRemaining)
|
|
|
|
var err error
|
|
var events []sdk.Event
|
|
var data [][]byte
|
|
if limitGas {
|
|
events, data, err = d.dispatchMsgWithGasLimit(subCtx, contractAddr, ibcPort, msg.Msg, *msg.GasLimit)
|
|
} else {
|
|
events, data, err = d.messenger.DispatchMsg(subCtx, contractAddr, ibcPort, msg.Msg)
|
|
}
|
|
|
|
// if it succeeds, commit state changes from submessage, and pass on events to Event Manager
|
|
var filteredEvents []sdk.Event
|
|
if err == nil {
|
|
commit()
|
|
filteredEvents = filterEvents(append(em.Events(), events...))
|
|
ctx.EventManager().EmitEvents(filteredEvents)
|
|
if msg.Msg.Wasm == nil {
|
|
filteredEvents = []sdk.Event{}
|
|
} else {
|
|
for _, e := range filteredEvents {
|
|
attributes := e.Attributes
|
|
sort.SliceStable(attributes, func(i, j int) bool {
|
|
return strings.Compare(attributes[i].Key, attributes[j].Key) < 0
|
|
})
|
|
}
|
|
}
|
|
} // on failure, revert state from sandbox, and ignore events (just skip doing the above)
|
|
|
|
// we only callback if requested. Short-circuit here the cases we don't want to
|
|
if (msg.ReplyOn == wasmvmtypes.ReplySuccess || msg.ReplyOn == wasmvmtypes.ReplyNever) && err != nil {
|
|
return nil, err
|
|
}
|
|
if msg.ReplyOn == wasmvmtypes.ReplyNever || (msg.ReplyOn == wasmvmtypes.ReplyError && err == nil) {
|
|
continue
|
|
}
|
|
|
|
// otherwise, we create a SubMsgResult and pass it into the calling contract
|
|
var result wasmvmtypes.SubMsgResult
|
|
if err == nil {
|
|
// just take the first one for now if there are multiple sub-sdk messages
|
|
// and safely return nothing if no data
|
|
var responseData []byte
|
|
if len(data) > 0 {
|
|
responseData = data[0]
|
|
}
|
|
result = wasmvmtypes.SubMsgResult{
|
|
Ok: &wasmvmtypes.SubMsgResponse{
|
|
Events: sdkEventsToWasmVMEvents(filteredEvents),
|
|
Data: responseData,
|
|
},
|
|
}
|
|
} else {
|
|
// Issue #759 - we don't return error string for worries of non-determinism
|
|
moduleLogger(ctx).Info("Redacting submessage error", "cause", err)
|
|
result = wasmvmtypes.SubMsgResult{
|
|
Err: redactError(err).Error(),
|
|
}
|
|
}
|
|
|
|
// now handle the reply, we use the parent context, and abort on error
|
|
reply := wasmvmtypes.Reply{
|
|
ID: msg.ID,
|
|
Result: result,
|
|
}
|
|
|
|
// we can ignore any result returned as there is nothing to do with the data
|
|
// and the events are already in the ctx.EventManager()
|
|
rspData, err := d.keeper.reply(ctx, contractAddr, reply)
|
|
switch {
|
|
case err != nil:
|
|
return nil, errorsmod.Wrap(err, "reply")
|
|
case rspData != nil:
|
|
rsp = rspData
|
|
}
|
|
}
|
|
return rsp, nil
|
|
}
|
|
|
|
// Issue #759 - we don't return error string for worries of non-determinism
|
|
func redactError(err error) error {
|
|
// Do not redact system errors
|
|
// SystemErrors must be created in x/wasm and we can ensure determinism
|
|
if wasmvmtypes.ToSystemError(err) != nil {
|
|
return err
|
|
}
|
|
|
|
// FIXME: do we want to hardcode some constant string mappings here as well?
|
|
// Or better document them? (SDK error string may change on a patch release to fix wording)
|
|
// sdk/11 is out of gas
|
|
// sdk/5 is insufficient funds (on bank send)
|
|
// (we can theoretically redact less in the future, but this is a first step to safety)
|
|
codespace, code, _ := errorsmod.ABCIInfo(err, false)
|
|
return fmt.Errorf("codespace: %s, code: %d", codespace, code)
|
|
}
|
|
|
|
func filterEvents(events []sdk.Event) []sdk.Event {
|
|
// pre-allocate space for efficiency
|
|
res := make([]sdk.Event, 0, len(events))
|
|
for _, ev := range events {
|
|
if ev.Type != "message" {
|
|
res = append(res, ev)
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
|
|
func sdkEventsToWasmVMEvents(events []sdk.Event) []wasmvmtypes.Event {
|
|
res := make([]wasmvmtypes.Event, len(events))
|
|
for i, ev := range events {
|
|
res[i] = wasmvmtypes.Event{
|
|
Type: ev.Type,
|
|
Attributes: sdkAttributesToWasmVMAttributes(ev.Attributes),
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
|
|
func sdkAttributesToWasmVMAttributes(attrs []abci.EventAttribute) []wasmvmtypes.EventAttribute {
|
|
res := make([]wasmvmtypes.EventAttribute, len(attrs))
|
|
for i, attr := range attrs {
|
|
res[i] = wasmvmtypes.EventAttribute{
|
|
Key: attr.Key,
|
|
Value: attr.Value,
|
|
}
|
|
}
|
|
return res
|
|
}
|