mirror of
https://github.com/fluencelabs/examples
synced 2025-06-24 07:11:35 +00:00
math module initial
This commit is contained in:
7
multi-service/math/.gitignore
vendored
Normal file
7
multi-service/math/.gitignore
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
.DS_Store
|
||||
.repl_history
|
||||
/target
|
||||
**/**.bak
|
||||
**/**.bk
|
||||
/artifacts
|
||||
keypair.json
|
16
multi-service/math/Cargo.toml
Normal file
16
multi-service/math/Cargo.toml
Normal file
@ -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"
|
6
multi-service/math/Config.toml
Normal file
6
multi-service/math/Config.toml
Normal file
@ -0,0 +1,6 @@
|
||||
modules_dir = "artifacts/"
|
||||
|
||||
[[module]]
|
||||
name = "math"
|
||||
mem_pages_count = 1
|
||||
logger_enabled = false
|
5
multi-service/math/README.md
Normal file
5
multi-service/math/README.md
Normal file
@ -0,0 +1,5 @@
|
||||
|
||||
|
||||
```
|
||||
fldist upload --path artifacts/math.wasm --env testnet --name math
|
||||
```
|
10
multi-service/math/build.sh
Normal file
10
multi-service/math/build.sh
Normal file
@ -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/
|
105
multi-service/math/src/main.rs
Normal file
105
multi-service/math/src/main.rs
Normal file
@ -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::<u256>();
|
||||
let number_2 = number_2.parse::<u256>();
|
||||
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::<u256>();
|
||||
let number_2 = number_2.parse::<u256>();
|
||||
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::<u256>();
|
||||
let number_2 = number_2.parse::<u256>();
|
||||
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::<u256>();
|
||||
let number_2 = number_2.parse::<u256>();
|
||||
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"
|
||||
);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user