package com.msgilligan.bitcoinj.json.conversion; import org.bitcoinj.core.Coin; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; /** * Utilities for Bitcoin Math */ public class BitcoinMath { public static final MathContext DEFAULT_CONTEXT = new MathContext(0, RoundingMode.UNNECESSARY); public static final int DEFAULT_SCALE = Coin.SMALLEST_UNIT_EXPONENT; public static final BigDecimal satoshiPerCoinDecimal = new BigDecimal(Coin.COIN.value, DEFAULT_CONTEXT); /** * Convert from BTC `BigDecimal` value to satoshi `long`. * * @param btc Bitcoin amount in BTC units * @return number of satoshi (long) */ public static long btcToSatoshi(final BigDecimal btc) { BigDecimal satoshisDecimal = btc.multiply(satoshiPerCoinDecimal); return satoshisDecimal.longValueExact(); } /** * Convert from satoshi `long` to BTC `BigDecimal`. * * @param satoshi number of satoshi (long) * @return Bitcoin amount in BTC units */ public static BigDecimal satoshiToBtc(final long satoshi) { BigDecimal bdSatoshi = new BigDecimal(satoshi, BitcoinMath.DEFAULT_CONTEXT); return bdSatoshi.divide(satoshiPerCoinDecimal, DEFAULT_SCALE, RoundingMode.UNNECESSARY); } /** * Convert from BTC `BigDecimal` value to `Coin` type. * * @param btc Bitcoin amount in BTC units * @return bitcoinj `Coin` type (uses satoshi unit internally) */ public static Coin btcToCoin(final BigDecimal btc) { return Coin.valueOf(btcToSatoshi(btc)); } /** * Convert from `Coin` type to BTC `BigDecimal` value . * * @param coin Coin value to convert to BTC * @return Bitcoin amount in BTC units */ public static BigDecimal coinToBTC(final Coin coin) { return satoshiToBtc(coin.value); } }