diff --git a/x/wasm/keeper/reflect_test.go b/x/wasm/keeper/reflect_test.go index 1336be7fee..0d61867a7b 100644 --- a/x/wasm/keeper/reflect_test.go +++ b/x/wasm/keeper/reflect_test.go @@ -542,6 +542,29 @@ func TestWasmRawQueryWithNil(t *testing.T) { require.Equal(t, []byte{}, reflectRawRes.Data) } +func TestRustPanicIsHandled(t *testing.T) { + ctx, keepers := CreateTestInput(t, false, ReflectFeatures) + keeper := keepers.ContractKeeper + + creator := keepers.Faucet.NewFundedRandomAccount(ctx, sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))...) + + // upload code + codeID, _, err := keeper.Create(ctx, creator, testdata.CyberpunkContractWasm(), nil) + require.NoError(t, err) + require.Equal(t, uint64(1), codeID) + + contractAddr, _, err := keeper.Instantiate(ctx, codeID, creator, nil, []byte("{}"), "cyberpunk contract", nil) + require.NoError(t, err) + require.NotEmpty(t, contractAddr) + + // when panic is triggered + msg := []byte(`{"panic":{}}`) + gotData, err := keeper.Execute(ctx, contractAddr, creator, msg, nil) + require.ErrorIs(t, err, types.ErrExecuteFailed) + assert.Contains(t, err.Error(), "panicked at 'This page intentionally faulted'") + assert.Nil(t, gotData) +} + func checkAccount(t *testing.T, ctx sdk.Context, accKeeper authkeeper.AccountKeeper, bankKeeper bankkeeper.Keeper, addr sdk.AccAddress, expected sdk.Coins) { acct := accKeeper.GetAccount(ctx, addr) if expected == nil { diff --git a/x/wasm/keeper/testdata/cyberpunk.wasm b/x/wasm/keeper/testdata/cyberpunk.wasm new file mode 100644 index 0000000000..355804ad13 Binary files /dev/null and b/x/wasm/keeper/testdata/cyberpunk.wasm differ diff --git a/x/wasm/keeper/testdata/download_releases.sh b/x/wasm/keeper/testdata/download_releases.sh index 2757613968..544cdd2e88 100755 --- a/x/wasm/keeper/testdata/download_releases.sh +++ b/x/wasm/keeper/testdata/download_releases.sh @@ -9,7 +9,7 @@ fi tag="$1" -for contract in burner hackatom ibc_reflect ibc_reflect_send reflect staking; do +for contract in burner hackatom ibc_reflect ibc_reflect_send reflect staking cyberpunk; do url="https://github.com/CosmWasm/cosmwasm/releases/download/$tag/${contract}.wasm" echo "Downloading $url ..." wget -O "${contract}.wasm" "$url" diff --git a/x/wasm/keeper/testdata/reflect.go b/x/wasm/keeper/testdata/reflect.go index 64fed6150a..2074ef96fd 100644 --- a/x/wasm/keeper/testdata/reflect.go +++ b/x/wasm/keeper/testdata/reflect.go @@ -13,6 +13,9 @@ var reflectContract []byte //go:embed reflect_1_1.wasm var migrateReflectContract []byte +//go:embed cyberpunk.wasm +var cyberpunkContract []byte + func ReflectContractWasm() []byte { return reflectContract } @@ -21,6 +24,10 @@ func MigrateReflectContractWasm() []byte { return migrateReflectContract } +func CyberpunkContractWasm() []byte { + return cyberpunkContract +} + // ReflectHandleMsg is used to encode handle messages type ReflectHandleMsg struct { Reflect *ReflectPayload `json:"reflect_msg,omitempty"`