mirror of
https://github.com/fluencelabs/examples
synced 2025-06-24 15:21:32 +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