solana_native_token/
lib.rs1#![allow(clippy::arithmetic_side_effects)]
4
5pub const LAMPORTS_PER_SOL: u64 = 1_000_000_000;
7const SOL_DECIMALS: usize = 9;
8
9pub fn sol_str_to_lamports(sol_str: &str) -> Option<u64> {
11 if sol_str == "." {
12 None
13 } else {
14 let (sol, lamports) = sol_str.split_once('.').unwrap_or((sol_str, ""));
15 let sol = if sol.is_empty() {
16 0
17 } else {
18 sol.parse::<u64>().ok()?
19 };
20 let lamports = if lamports.is_empty() {
21 0
22 } else {
23 format!("{lamports:0<9}")[..SOL_DECIMALS].parse().ok()?
24 };
25 LAMPORTS_PER_SOL
26 .checked_mul(sol)
27 .and_then(|x| x.checked_add(lamports))
28 }
29}
30
31use std::fmt::{Debug, Display, Formatter, Result};
32pub struct Sol(pub u64);
33
34impl Sol {
35 fn write_in_sol(&self, f: &mut Formatter) -> Result {
36 write!(
37 f,
38 "◎{}.{:09}",
39 self.0 / LAMPORTS_PER_SOL,
40 self.0 % LAMPORTS_PER_SOL
41 )
42 }
43}
44
45impl Display for Sol {
46 fn fmt(&self, f: &mut Formatter) -> Result {
47 self.write_in_sol(f)
48 }
49}
50
51impl Debug for Sol {
52 fn fmt(&self, f: &mut Formatter) -> Result {
53 self.write_in_sol(f)
54 }
55}
56
57#[cfg(test)]
58mod tests {
59 use super::*;
60
61 #[test]
62 fn test_sol_str_to_lamports() {
63 assert_eq!(0, sol_str_to_lamports("0.0").unwrap());
64 assert_eq!(1, sol_str_to_lamports("0.000000001").unwrap());
65 assert_eq!(10, sol_str_to_lamports("0.00000001").unwrap());
66 assert_eq!(100, sol_str_to_lamports("0.0000001").unwrap());
67 assert_eq!(1000, sol_str_to_lamports("0.000001").unwrap());
68 assert_eq!(10000, sol_str_to_lamports("0.00001").unwrap());
69 assert_eq!(100000, sol_str_to_lamports("0.0001").unwrap());
70 assert_eq!(1000000, sol_str_to_lamports("0.001").unwrap());
71 assert_eq!(10000000, sol_str_to_lamports("0.01").unwrap());
72 assert_eq!(100000000, sol_str_to_lamports("0.1").unwrap());
73 assert_eq!(1000000000, sol_str_to_lamports("1").unwrap());
74 assert_eq!(4_100_000_000, sol_str_to_lamports("4.1").unwrap());
75 assert_eq!(8_200_000_000, sol_str_to_lamports("8.2").unwrap());
76 assert_eq!(8_502_282_880, sol_str_to_lamports("8.50228288").unwrap());
77
78 assert_eq!(
79 u64::MAX,
80 sol_str_to_lamports("18446744073.709551615").unwrap()
81 );
82 assert_eq!(None, sol_str_to_lamports("18446744073.709551616"));
84 assert_eq!(None, sol_str_to_lamports("-0.000000001"));
86 assert_eq!(None, sol_str_to_lamports("-9223372036.854775808"));
88 }
89}