diff --git a/multi-service/math/.gitignore b/multi-service/math/.gitignore new file mode 100644 index 0000000..10ceb5d --- /dev/null +++ b/multi-service/math/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +.repl_history +/target +**/**.bak +**/**.bk +/artifacts +keypair.json diff --git a/multi-service/math/Cargo.toml b/multi-service/math/Cargo.toml new file mode 100644 index 0000000..4a8c25b --- /dev/null +++ b/multi-service/math/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "wasm-math" +version = "0.1.0" +authors = ["Fluence Labs"] +description = "The math module for the Fluence network" +repository = "https://github.com/fluencelabs/fce/tree/master/examples/multi-service/math" +edition = "2018" +publish = false + +[[bin]] +name = "math" +path = "src/main.rs" + +[dependencies] +fluence = "0.6.2" +ethnum = "1.0.3" diff --git a/multi-service/math/Config.toml b/multi-service/math/Config.toml new file mode 100644 index 0000000..1631a33 --- /dev/null +++ b/multi-service/math/Config.toml @@ -0,0 +1,6 @@ +modules_dir = "artifacts/" + +[[module]] + name = "math" + mem_pages_count = 1 + logger_enabled = false diff --git a/multi-service/math/README.md b/multi-service/math/README.md new file mode 100644 index 0000000..457adfa --- /dev/null +++ b/multi-service/math/README.md @@ -0,0 +1,5 @@ + + +``` +fldist upload --path artifacts/math.wasm --env testnet --name math +``` \ No newline at end of file diff --git a/multi-service/math/build.sh b/multi-service/math/build.sh new file mode 100644 index 0000000..43af14e --- /dev/null +++ b/multi-service/math/build.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +set -o errexit -o nounset -o pipefail + +# This script builds all subprojects and puts all created Wasm modules in one dir +cargo update +marine build --release + +rm -f -r artifacts/* +mkdir artifacts +cp target/wasm32-wasi/release/math.wasm artifacts/ diff --git a/multi-service/math/src/main.rs b/multi-service/math/src/main.rs new file mode 100644 index 0000000..d0aa959 --- /dev/null +++ b/multi-service/math/src/main.rs @@ -0,0 +1,105 @@ +//! ETH compatible u256 math. + +/* + * Copyright 2020 Fluence Labs Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +use ethnum::*; +use fluence::marine; +use fluence::module_manifest; + +module_manifest!(); + +pub fn main() {} + +/// adds 2 256 bits integers (ETH compatible) +/// return number or error (failed to parse input or overflow of output) +#[marine] +pub fn add_u256(number_1: String, number_2: String) -> String { + let number_1 = number_1.parse::(); + let number_2 = number_2.parse::(); + if let (Ok(number_1), Ok(number_2)) = (number_1, number_2) { + let number = number_1.checked_add(number_2); + if let Some(number) = number { + return number.to_string(); + } + + return "Overflow".to_string(); + } + + "InputNonANumber".to_string() +} + +#[marine] +pub fn sub_u256(number_1: String, number_2: String) -> String { + let number_1 = number_1.parse::(); + let number_2 = number_2.parse::(); + if let (Ok(number_1), Ok(number_2)) = (number_1, number_2) { + let number = number_1.checked_sub(number_2); + if let Some(number) = number { + return number.to_string(); + } + + return "Underflow".to_string(); + } + + "InputNonANumber".to_string() +} + +#[marine] +pub fn mul_u256(number_1: String, number_2: String) -> String { + let number_1 = number_1.parse::(); + let number_2 = number_2.parse::(); + if let (Ok(number_1), Ok(number_2)) = (number_1, number_2) { + let number = number_1.checked_mul(number_2); + if let Some(number) = number { + return number.to_string(); + } + + return "Overflow".to_string(); + } + + "InputNonANumber".to_string() +} + +#[marine] +pub fn div_u256(number_1: String, number_2: String) -> String { + let number_1 = number_1.parse::(); + let number_2 = number_2.parse::(); + if let (Ok(number_1), Ok(number_2)) = (number_1, number_2) { + let number = number_1.checked_div(number_2); + if let Some(number) = number { + return number.to_string(); + } + + return "DivisionByZero".to_string(); + } + + "InputNonANumber".to_string() +} + +#[cfg(test)] +mod tests { + #[test] + fn add_u256() { + assert_eq!( + super::add_u256( + "100000000000000000000000000000000".to_string(), + "100000000000000000000000000000000".to_string() + ), + "200000000000000000000000000000000" + ); + } +}