/** * @param plainAmount A String denominated in BTC (e.g. "0.0015") * * @return The satoshi value (e.g. 150 000) */ public static Coin fromPlainAmount(String plainAmount) { Preconditions.checkNotNull(plainAmount, "'plainAmount' must be present"); return Coin.parseCoin(plainAmount); }
/** * @param plainAmount A big decimal denominated in BTC (e.g. 0.0015) * * @return The satoshi value (e.g. 150 000) */ public static Coin fromPlainAmount(BigDecimal plainAmount) { Preconditions.checkNotNull(plainAmount, "'plainAmount' must be present"); return Coin.parseCoin(plainAmount.toPlainString()); }
/** * @param localAmount A monetary amount denominated in the local currency * @param exchangeRate The exchange rate in terms of the local currency (e.g. "1000" means 1000 local = 1 bitcoin) * * @return The satoshi value (e.g. 150000) */ public static Coin fromLocalAmount(BigDecimal localAmount, BigDecimal exchangeRate) { Preconditions.checkNotNull(localAmount, "'localAmount' must be present"); Preconditions.checkNotNull(exchangeRate, "'exchangeRate' must be present"); // Truncate to 8 dp to ensure conversion to coins can take place BigDecimal bitcoinAmount = localAmount .setScale(BITCOIN_SCALE) .divide(exchangeRate, BITCOIN_SCALE, RoundingMode.HALF_EVEN) .setScale(8, RoundingMode.HALF_EVEN); return Coin.parseCoin(bitcoinAmount.toPlainString()); }
public String pay(String paymentToBTCAddress, BigDecimal amount) throws InterruptedException, ExecutionException, InsufficientMoneyException { LOG.debug("BTC: Sending funds to {}, amount {}.", paymentToBTCAddress, amount.toPlainString()); Address targetAddress = Address.fromBase58(this.bitcoinNetworkParameters, paymentToBTCAddress); Wallet.SendResult result = this.bitcoinWallet.sendCoins(peerGroup, targetAddress, Coin.parseCoin(amount.toPlainString())); // Wait for the transaction to propagate across the P2P network, indicating acceptance. result.broadcastComplete.get(); return result.tx.getHashAsString(); }
public OutputSpec(String spec) throws IllegalArgumentException { String[] parts = spec.split(":"); if (parts.length != 2) { throw new IllegalArgumentException("Malformed output specification, must have two parts separated by :"); } String destination = parts[0]; if ("ALL".equalsIgnoreCase(parts[1])) value = wallet.getBalance(BalanceType.ESTIMATED); else value = parseCoin(parts[1]); if (destination.startsWith("0")) { // Treat as a raw public key. byte[] pubKey = new BigInteger(destination, 16).toByteArray(); key = ECKey.fromPublicOnly(pubKey); addr = null; } else { // Treat as an address. addr = Address.fromBase58(params, destination); key = null; } }
@Test(expected = IllegalArgumentException.class) public void testParseCoinOverprecise() { parseCoin("0.000000011"); }
public boolean matchBitcoins(Coin comparison) { try { Coin units = parseCoin(value); switch (type) { case LT: return comparison.compareTo(units) < 0; case GT: return comparison.compareTo(units) > 0; case EQUAL: return comparison.compareTo(units) == 0; case LTE: return comparison.compareTo(units) <= 0; case GTE: return comparison.compareTo(units) >= 0; default: throw new RuntimeException("Unreachable"); } } catch (NumberFormatException e) { System.err.println("Could not parse value from condition string: " + value); System.exit(1); return false; } } }
@Test public void testGrouping() throws Exception { assertEquals("0.1", format(Coin.parseCoin("0.1"), 0, 1, 2, 3)); assertEquals("0.010", format(Coin.parseCoin("0.01"), 0, 1, 2, 3)); assertEquals("0.001", format(Coin.parseCoin("0.001"), 0, 1, 2, 3)); assertEquals("0.000100", format(Coin.parseCoin("0.0001"), 0, 1, 2, 3)); assertEquals("0.000010", format(Coin.parseCoin("0.00001"), 0, 1, 2, 3)); assertEquals("0.000001", format(Coin.parseCoin("0.000001"), 0, 1, 2, 3)); }
@Test public void testParseCoin() { // String version assertEquals(CENT, parseCoin("0.01")); assertEquals(CENT, parseCoin("1E-2")); assertEquals(COIN.add(CENT), parseCoin("1.01")); assertEquals(COIN.negate(), parseCoin("-1")); try { parseCoin("2E-20"); org.junit.Assert.fail("should not have accepted fractional satoshis"); } catch (IllegalArgumentException expected) { } catch (Exception e) { org.junit.Assert.fail("should throw IllegalArgumentException"); } assertEquals(1, parseCoin("0.00000001").value); assertEquals(1, parseCoin("0.000000010").value); }
@Test public void testGrouping() throws Exception { assertEquals("0.1", format(Coin.parseCoin("0.1"), 0, 1, 2, 3)); assertEquals("0.010", format(Coin.parseCoin("0.01"), 0, 1, 2, 3)); assertEquals("0.001", format(Coin.parseCoin("0.001"), 0, 1, 2, 3)); assertEquals("0.000100", format(Coin.parseCoin("0.0001"), 0, 1, 2, 3)); assertEquals("0.000010", format(Coin.parseCoin("0.00001"), 0, 1, 2, 3)); assertEquals("0.000001", format(Coin.parseCoin("0.000001"), 0, 1, 2, 3)); }
@Test public void testGrouping() throws Exception { assertEquals("0.1", format(Coin.parseCoin("0.1"), 0, 1, 2, 3)); assertEquals("0.010", format(Coin.parseCoin("0.01"), 0, 1, 2, 3)); assertEquals("0.001", format(Coin.parseCoin("0.001"), 0, 1, 2, 3)); assertEquals("0.000100", format(Coin.parseCoin("0.0001"), 0, 1, 2, 3)); assertEquals("0.000010", format(Coin.parseCoin("0.00001"), 0, 1, 2, 3)); assertEquals("0.000001", format(Coin.parseCoin("0.000001"), 0, 1, 2, 3)); }
/** * Test the bitcoinValueToPlainString amount formatter */ @Test public void testToPlainString() { assertEquals("0.0015", Coin.valueOf(150000).toPlainString()); assertEquals("1.23", parseCoin("1.23").toPlainString()); assertEquals("0.1", parseCoin("0.1").toPlainString()); assertEquals("1.1", parseCoin("1.1").toPlainString()); assertEquals("21.12", parseCoin("21.12").toPlainString()); assertEquals("321.123", parseCoin("321.123").toPlainString()); assertEquals("4321.1234", parseCoin("4321.1234").toPlainString()); assertEquals("54321.12345", parseCoin("54321.12345").toPlainString()); assertEquals("654321.123456", parseCoin("654321.123456").toPlainString()); assertEquals("7654321.1234567", parseCoin("7654321.1234567").toPlainString()); assertEquals("87654321.12345678", parseCoin("87654321.12345678").toPlainString()); // check there are no trailing zeros assertEquals("1", parseCoin("1.0").toPlainString()); assertEquals("2", parseCoin("2.00").toPlainString()); assertEquals("3", parseCoin("3.000").toPlainString()); assertEquals("4", parseCoin("4.0000").toPlainString()); assertEquals("5", parseCoin("5.00000").toPlainString()); assertEquals("6", parseCoin("6.000000").toPlainString()); assertEquals("7", parseCoin("7.0000000").toPlainString()); assertEquals("8", parseCoin("8.00000000").toPlainString()); } }
@Test public void makeTransaction() throws Exception { /* 8 available Payment. [80200,70000,60000,50000,40000,30000,20000,10000] */ UnspentOutputs unspentOutputs = new UnspentOutputs().fromJson(UnspentTestData.apiResponseString); Payment payment = new Payment(); long spendAmount = 80200L + 70000L + 60000L + 50000L + 40000L + 30000L + 20000L + 10000L - Payment.DUST.longValue(); int inputs = 8;//coins int outputs = 1;//no change long feeManual = calculateFee(outputs, inputs, BigInteger.valueOf(30000L)); SpendableUnspentOutputs paymentBundle = payment .getSpendableCoins(unspentOutputs, BigInteger.valueOf(spendAmount - feeManual), BigInteger.valueOf(30000L)); List<ECKey> keys = new ArrayList<>(); String toAddress = "1GYkgRtJmEp355xUtVFfHSFjFdbqjiwKmb"; String changeAddress = "1GiEQZt9aX2XfDcj14tCC4xAWEJtq9EXW7"; BigInteger bigIntFee = BigInteger.ZERO; BigInteger bigIntAmount = BigInteger.valueOf( Coin.parseCoin("0.0001").longValue()); final HashMap<String, BigInteger> receivers = new HashMap<String, BigInteger>(); receivers.put(toAddress, bigIntAmount); Transaction tx = payment.makeTransaction( paymentBundle.getSpendableOutputs(), receivers, bigIntFee, changeAddress); assertEquals("5ee5cb75b364c13fc3c6457be1fd90f58f0b7b2e4f37fcfbd652b90669686420", tx.getHash().toString()); }
@Test public void millicoinScaleTest() throws Exception { BtcFormat coinFormat = BtcFormat.getMilliInstance(Locale.US); assertEquals("1,000.00", coinFormat.format(Coin.COIN)); assertEquals("-1,000.00", coinFormat.format(Coin.COIN.negate())); assertEquals(Coin.parseCoin("0.001"), coinFormat.parseObject("1.00")); assertEquals(valueOf(1000), coinFormat.parseObject("0.01")); assertEquals(Coin.parseCoin("1"), coinFormat.parseObject("1,000.00")); assertEquals(Coin.parseCoin("1"), coinFormat.parseObject("1000")); }
@Test public void coinScaleTest() throws Exception { BtcFormat coinFormat = BtcFormat.getCoinInstance(Locale.US); assertEquals("1.00", coinFormat.format(Coin.COIN)); assertEquals("-1.00", coinFormat.format(Coin.COIN.negate())); assertEquals(Coin.parseCoin("1"), coinFormat.parseObject("1.00")); assertEquals(valueOf(1000000), coinFormat.parseObject("0.01")); assertEquals(Coin.parseCoin("1000"), coinFormat.parseObject("1,000.00")); assertEquals(Coin.parseCoin("1000"), coinFormat.parseObject("1000")); }
@Test public void testGrouping() throws Exception { BtcFormat usCoin = BtcFormat.getInstance(0, Locale.US, 1, 2, 3); assertEquals("0.1", usCoin.format(Coin.parseCoin("0.1"))); assertEquals("0.010", usCoin.format(Coin.parseCoin("0.01"))); assertEquals("0.001", usCoin.format(Coin.parseCoin("0.001"))); assertEquals("0.000100", usCoin.format(Coin.parseCoin("0.0001"))); assertEquals("0.000010", usCoin.format(Coin.parseCoin("0.00001"))); assertEquals("0.000001", usCoin.format(Coin.parseCoin("0.000001"))); // no more than two fractional decimal places for the default coin-denomination assertEquals("0.01", BtcFormat.getCoinInstance(Locale.US).format(Coin.parseCoin("0.005"))); BtcFormat usMilli = BtcFormat.getInstance(3, Locale.US, 1, 2, 3); assertEquals("0.1", usMilli.format(Coin.parseCoin("0.0001"))); assertEquals("0.010", usMilli.format(Coin.parseCoin("0.00001"))); assertEquals("0.001", usMilli.format(Coin.parseCoin("0.000001"))); // even though last group is 3, that would result in fractional satoshis, which we don't do assertEquals("0.00010", usMilli.format(Coin.valueOf(10))); assertEquals("0.00001", usMilli.format(Coin.valueOf(1))); BtcFormat usMicro = BtcFormat.getInstance(6, Locale.US, 1, 2, 3); assertEquals("0.1", usMicro.format(Coin.valueOf(10))); // even though second group is 2, that would result in fractional satoshis, which we don't do assertEquals("0.01", usMicro.format(Coin.valueOf(1))); }
@Test public void microcoinScaleTest() throws Exception { BtcFormat coinFormat = BtcFormat.getMicroInstance(Locale.US); assertEquals("1,000,000.00", coinFormat.format(Coin.COIN)); assertEquals("-1,000,000.00", coinFormat.format(Coin.COIN.negate())); assertEquals("1,000,000.10", coinFormat.format(Coin.COIN.add(valueOf(10)))); assertEquals(Coin.parseCoin("0.000001"), coinFormat.parseObject("1.00")); assertEquals(valueOf(1), coinFormat.parseObject("0.01")); assertEquals(Coin.parseCoin("0.001"), coinFormat.parseObject("1,000.00")); assertEquals(Coin.parseCoin("0.001"), coinFormat.parseObject("1000")); }
@Test public void columnAlignmentTest() { BtcFormat germany = BtcFormat.getCoinInstance(2,BtcFixedFormat.REPEATING_PLACES); char separator = germany.symbols().getDecimalSeparator(); Coin[] rows = {MAX_MONEY, MAX_MONEY.subtract(SATOSHI), Coin.parseCoin("1234"), COIN, COIN.add(SATOSHI), COIN.subtract(SATOSHI), COIN.divide(1000).add(SATOSHI), COIN.divide(1000), COIN.divide(1000).subtract(SATOSHI), valueOf(100), valueOf(1000), valueOf(10000), SATOSHI}; FieldPosition fp = new FieldPosition(DECIMAL_SEPARATOR); String[] output = new String[rows.length]; int[] indexes = new int[rows.length]; int maxIndex = 0; for (int i = 0; i < rows.length; i++) { output[i] = germany.format(rows[i], new StringBuffer(), fp).toString(); indexes[i] = fp.getBeginIndex(); if (indexes[i] > maxIndex) maxIndex = indexes[i]; } for (int i = 0; i < output.length; i++) { // uncomment to watch printout // System.out.println(repeat(" ", (maxIndex - indexes[i])) + output[i]); assertEquals(output[i].indexOf(separator), indexes[i]); } }
@Test public void bigRate() throws Exception { ExchangeRate rate = new ExchangeRate(Coin.parseCoin("0.0001"), Fiat.parseFiat("BYR", "5320387.3")); assertEquals("53203873000", rate.coinToFiat(Coin.COIN).toPlainString()); assertEquals("0", rate.fiatToCoin(Fiat.parseFiat("BYR", "1")).toPlainString()); // Tiny value! }
@Test public void smallRate() throws Exception { ExchangeRate rate = new ExchangeRate(Coin.parseCoin("1000"), Fiat.parseFiat("XXX", "0.0001")); assertEquals("0", rate.coinToFiat(Coin.COIN).toPlainString()); // Tiny value! assertEquals("10000000", rate.fiatToCoin(Fiat.parseFiat("XXX", "1")).toPlainString()); }