dzmitry-lahoda eb9470f23a fixed issues
2021-05-30 14:46:12 +03:00

107 lines
3.0 KiB
Rust

//! 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();
}
"InputNonAU256Number".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();
}
"InputNonAU256Number".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();
}
"InputNonAU256Number".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();
}
"InputNonAU256Number".to_string()
}
#[cfg(test)]
mod tests {
use fluence_test::marine_test;
#[marine_test(config_path = "../Config.toml", modules_dir = "../artifacts/")]
fn add_u256() {
assert_eq!(
super::add_u256(
"100000000000000000000000000000000".to_string(),
"100000000000000000000000000000000".to_string()
),
"200000000000000000000000000000000"
);
}
}