From 1f6d12d1cea3617296f3b5d5058da593eb838bee Mon Sep 17 00:00:00 2001 From: Nicolas Gotchac Date: Tue, 13 Aug 2024 11:04:31 +0200 Subject: [PATCH] Export the rust version to WASM + Use it in a Go library --- Cargo.toml | 1 + Makefile | 4 ++ evmole.wasm | Bin 0 -> 1505034 bytes go/evmole.go | 78 +++++++++++++++++++++++++++++++++ go/evmole.wasm | Bin 0 -> 88448 bytes go/evmole_test.go | 98 ++++++++++++++++++++++++++++++++++++++++++ go/go.mod | 5 +++ go/go.sum | 2 + src/interface_wasm.rs | 30 +++++++++++++ src/lib.rs | 3 ++ 10 files changed, 221 insertions(+) create mode 100644 Makefile create mode 100755 evmole.wasm create mode 100644 go/evmole.go create mode 100755 go/evmole.wasm create mode 100644 go/evmole_test.go create mode 100644 go/go.mod create mode 100644 go/go.sum create mode 100644 src/interface_wasm.rs diff --git a/Cargo.toml b/Cargo.toml index dac7f3d..3e57c9c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ wasm-bindgen = { version = "0.2", optional = true } [features] python = ["dep:pyo3"] javascript = ["dep:wasm-bindgen"] +wasm = [] # for dev trace = [] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..76b26e3 --- /dev/null +++ b/Makefile @@ -0,0 +1,4 @@ +.PHONY: wasm +wasm: + cargo build --target wasm32-unknown-unknown --features wasm --release + cp target/wasm32-unknown-unknown/release/evmole.wasm go/evmole.wasm diff --git a/evmole.wasm b/evmole.wasm new file mode 100755 index 0000000000000000000000000000000000000000..fd4d31c08c989e6337cd965567dfb0033b20bc47 GIT binary patch literal 1505034 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