intrepidshape/elm-web3/3.0.0

Web3.Units

ETH / ERC-20 unit conversion -- pure Elm, no JS required.

parseEther "1.5" == Just <1500000000000000000>

Build wei values with BigInt.fromString, never BigInt.fromInt. An Elm Int is a JS double, so a literal above 2^53 is already corrupt before it reaches this module: BigInt.fromInt 1500000000000000000 yields 999996861446400000000. Every realistic 18-decimal amount is past that bound.

Negative values format with a single leading sign, and parseUnits rejects a malformed fraction rather than returning a plausible wrong number.

formatEther : BigInt -> String

Convert Wei to a human-readable ETH string with up to 18 significant decimal places. Trailing zeros are trimmed.

formatEther zero         == "0"
formatEther (10^18 wei)  == "1"
formatEther (1.5x10^18)  == "1.5"
formatEther (10^15 wei)  == "0.001"
parseEther : String -> Maybe BigInt

Parse a human-readable ETH string to Wei. Returns Nothing for invalid input, non-numeric strings, or negative values.

parseEther "1"                       == Just <10^18>
parseEther "1.5"                     == Just <1.5x10^18>
parseEther "0.000000000000000001"    == Just (BigInt.fromInt 1)
parseEther "not-a-number"            == Nothing
parseEther "-1"                      == Nothing
formatUnits : Int -> BigInt -> String

Convert a token amount (in its smallest unit) to a human-readable string for a token with the given number of decimal places. Trailing zeros are trimmed.

formatUnits 6 (BigInt.fromInt 1500000)  == "1.5"   -- USDC
formatUnits 8 (BigInt.fromInt 100000000) == "1"    -- WBTC
parseUnits : Int -> String -> Maybe BigInt

Parse a human-readable token amount to its smallest unit, given the token's decimal count. Returns Nothing for invalid or negative input.

parseUnits 6 "1.5"  == Just (BigInt.fromInt 1500000)   -- USDC
parseUnits 6 "0"    == Just BigInt.zero
parseUnits 6 "-1"   == Nothing