diff --git a/internal/api/lib.go b/internal/api/lib.go index 7b0f473c0..f6d9cedab 100644 --- a/internal/api/lib.go +++ b/internal/api/lib.go @@ -100,7 +100,7 @@ func StoreCodeUnchecked(cache Cache, wasm []byte) ([]byte, error) { w := makeView(wasm) defer runtime.KeepAlive(wasm) errmsg := uninitializedUnmanagedVector() - checksum, err := C.store_code(cache.ptr, w, cbool(true), cbool(true), &errmsg) + checksum, err := C.store_code(cache.ptr, w, cbool(false), cbool(true), &errmsg) if err != nil { return nil, errorWithMessage(err, errmsg) } diff --git a/internal/api/lib_test.go b/internal/api/lib_test.go index 4d9cbe4c0..a273e1b28 100644 --- a/internal/api/lib_test.go +++ b/internal/api/lib_test.go @@ -1,6 +1,7 @@ package api import ( + "bytes" "crypto/sha256" "encoding/hex" "encoding/json" @@ -185,6 +186,28 @@ func TestStoreCodeUnchecked(t *testing.T) { require.Equal(t, wasm, code) } +func TestStoreCodeUncheckedWorksWithInvalidWasm(t *testing.T) { + cache, cleanup := withCache(t) + defer cleanup() + + wasm, err := os.ReadFile("../../testdata/hackatom.wasm") + require.NoError(t, err) + + // Look for "interface_version_8" in the wasm file and replace it with "interface_version_9". + // This makes the wasm file invalid. + wasm = bytes.Replace(wasm, []byte("interface_version_8"), []byte("interface_version_9"), 1) + + // StoreCode should fail + _, err = StoreCode(cache, wasm, true) + require.ErrorContains(t, err, "Wasm contract has unknown interface_version_* marker export") + + // StoreCodeUnchecked should not fail + checksum, err := StoreCodeUnchecked(cache, wasm) + require.NoError(t, err) + expectedChecksum := sha256.Sum256(wasm) + assert.Equal(t, expectedChecksum[:], checksum) +} + func TestPin(t *testing.T) { cache, cleanup := withCache(t) defer cleanup()