-
Notifications
You must be signed in to change notification settings - Fork 28
Open
Description
The Cosmos-SDK's empty sdk.Dec (e.g. sdk.Dec{}) string form is represented as "<nil>" (proof below).
However, FPDecimals' from_str method won't be able to convert this value.
cw-injective/packages/injective-math/src/fp_decimal/from_str.rs
Lines 10 to 45 in 09b1925
| /// Converts the decimal string to a FPDecimal | |
| /// Possible inputs: "1.23", "1", "000012", "1.123000000" | |
| /// Disallowed: "", ".23" | |
| /// | |
| /// This never performs any kind of rounding. | |
| /// More than 18 fractional digits, even zeros, result in an error. | |
| fn from_str(input: &str) -> Result<Self, Self::Err> { | |
| let sign = if input.starts_with('-') { 0 } else { 1 }; | |
| let parts: Vec<&str> = input.trim_start_matches('-').split('.').collect(); | |
| match parts.len() { | |
| 1 => { | |
| let integer = U256::from_dec_str(parts[0]).map_err(|_| StdError::generic_err("Error parsing integer"))?; | |
| Ok(FPDecimal { | |
| num: integer * FPDecimal::ONE.num, | |
| sign, | |
| }) | |
| } | |
| 2 => { | |
| let integer = U256::from_dec_str(parts[0]).map_err(|_| StdError::generic_err("Error parsing integer"))?; | |
| let fraction = U256::from_dec_str(parts[1]).map_err(|_| StdError::generic_err("Error parsing fraction"))?; | |
| let exp = FPDecimal::DIGITS | |
| .checked_sub(parts[1].len()) | |
| .ok_or_else(|| StdError::generic_err(format!("Cannot parse more than {} fractional digits", FPDecimal::DIGITS)))?; | |
| Ok(FPDecimal { | |
| num: integer * FPDecimal::ONE.num + fraction * U256::exp10(exp), | |
| sign, | |
| }) | |
| } | |
| _ => Err(StdError::generic_err("Unexpected number of dots")), | |
| } | |
| //Ok(FPDecimal {num: num * FPDecimal::ONE.num, sign: sign}) | |
| } | |
| } | |
Should we handle this case? If so, how? @DrunkRandomWalker @gorgos
Proof:
type Dec struct {
i *big.Int
}
func (d Dec) String() string {
if d.i == nil {
return d.i.String()
}
...
}and big.Int's String method is simply
// String returns the decimal representation of x as generated by
// x.Text(10).
func (x *Int) String() string {
return x.Text(10)
}
// Text returns the string representation of x in the given base.
// Base must be between 2 and 62, inclusive. The result uses the
// lower-case letters 'a' to 'z' for digit values 10 to 35, and
// the upper-case letters 'A' to 'Z' for digit values 36 to 61.
// No prefix (such as "0x") is added to the string. If x is a nil
// pointer it returns "<nil>".
func (x *Int) Text(base int) string {
if x == nil {
return "<nil>"
}
return string(x.abs.itoa(x.neg, base))
}Metadata
Metadata
Assignees
Labels
No labels