#numbers #javascript

bn-rs

bn.js and ethers.js BigNumber bindings for Rust & WebAssembly

7 releases

0.2.4 Nov 21, 2022
0.2.3 Feb 20, 2022
0.2.2 Nov 5, 2021
0.1.2 Nov 3, 2021

#359 in WebAssembly

Download history 45/week @ 2024-03-11 7/week @ 2024-03-18 48/week @ 2024-03-25 34/week @ 2024-04-01 6/week @ 2024-04-08 63/week @ 2024-04-15 16/week @ 2024-04-22 106/week @ 2024-05-06 9/week @ 2024-05-13 5/week @ 2024-05-20 78/week @ 2024-05-27 46/week @ 2024-06-03 246/week @ 2024-06-10 3/week @ 2024-06-17 8/week @ 2024-06-24

305 downloads per month
Used in 2 crates

MIT/Apache

23KB
532 lines

bn.rs

bn.js and ethers.js BigNumber bindings for Rust & WebAssembly with primitive-types support


Write Rust code that uses bn.js and ethers.js BigNumber numbers

use primitive_types::{H160, U128};
use wasm_bindgen::prelude::*;

use bn_rs::{BigNumber, BN};

#[wasm_bindgen]
pub fn sum(a: BigNumber, b: BN) -> Result<BigNumber, JsValue> {
    // `BigNumberError` and `BNError` implement `Into<JsValue>`, so we can use `?` here

    let a = i128::try_from(a)?; // std uints are supported
    let b: U128 = b.try_into()?; // primitive-types uints supported too

    let result = a + b.as_u128() as i128;

    Ok(result.into())
}

#[wasm_bindgen]
pub fn is_dead(target_hash: BN, dead_hash: BigNumber) -> Result<bool, JsValue> {
    // primitive-types hashes supported too
    let hash = H160::try_from(target_hash)?;
    let dead = H160::try_from(dead_hash)?;

    Ok(hash == dead)
}

Call it from JavaScript

import {sum, is_dead} from './pkg'
import BN from 'bn.js'
import {BigNumber} from "@ethersproject/bignumber"

// Initialize bn.js and ethers.js BigNumber numbers
const a = BigNumber.from(2 ** 26)
const b = new BN(2 ** 26, 10)
const hash = new BN('dead', 'hex')
const dead = BigNumber.from('0xdead')

// Call Rust code with both BN and BigNumber passed and returned
console.log(sum(a, b)) // == BigNumber.from(4)
console.log(is_dead(hash, dead)) // == true

Run example

$ cd example
$ yarn
$ yarn start

Dependencies

~1.2–2.2MB
~40K SLoC