package io.emax.cosigner.bitcoin.cli; import io.emax.cosigner.api.currency.Wallet.Recipient; import io.emax.cosigner.bitcoin.BitcoinConfiguration; import io.emax.cosigner.bitcoin.BitcoinMonitor; import io.emax.cosigner.bitcoin.BitcoinWallet; import java.math.BigDecimal; import java.util.Arrays; import java.util.Collections; import java.util.LinkedList; /** * Command line option for running the library. * * @author Tom */ public class Application { /** * Command line interface that provides basic access to the library. * * @param args Command line arguments, leave blank to see usage. * @throws InterruptedException Some library interfaces require time to scan for data, sleep may * throw this exception. */ public static void main(String[] args) throws InterruptedException { if (args.length < 1) { System.out.println("Usage: <interfaceMethod> <argument> <argument> ..."); System.out.println("Available methods:"); System.out.println("\tgetNewAddress(String accountName)"); System.out.println("\tgetDeterministicAddresses(String accountName)"); System.out .println("\tgetMultiSigAddress(String address1, String address2, ..., accountName)"); System.out.println("\tgetBalance(String address)"); System.out.println("\tcreateTransaction(String fromAddress1, String fromAddress2," + " ..., String toAddress, Decimal amount)"); System.out.println("\tsignTransaction(String transaction, String address)"); System.out.println("\tsendTransaction(String transaction)"); System.out.println("\tgetSignersForTransaction(String transaction)"); System.out.println("\tmonitor(String address)"); System.out.println("\tlistTxs(String address, int resultSize, int skipNumber)"); System.out.println("\tgetTx(String tx-id)"); return; } BitcoinWallet wallet = new BitcoinWallet(new BitcoinConfiguration()); BitcoinMonitor monitor = new BitcoinMonitor(wallet); String accountName = ""; String address = ""; String transaction = ""; LinkedList<String> addressList = new LinkedList<>(); BigDecimal amount = BigDecimal.ZERO; int resultSize = 0; int skipNumber = 0; switch (args[0]) { case "getNewAddress": if (args.length >= 2) { accountName = args[1]; } System.out.println(wallet.createAddress(accountName)); break; case "getDeterministicAddresses": if (args.length >= 2) { accountName = args[1]; } wallet.getAddresses(accountName).forEach(System.out::println); break; case "getMultiSigAddress": if (args.length >= 2) { accountName = args[args.length - 1]; } addressList.addAll(Arrays.asList(args).subList(1, args.length - 1)); System.out.println(wallet.getMultiSigAddress(addressList, accountName)); break; case "getBalance": if (args.length >= 2) { accountName = args[1]; } System.out.println(wallet.getBalance(accountName)); break; case "createTransaction": if (args.length >= 2) { amount = new BigDecimal(args[args.length - 1]); } if (args.length >= 3) { accountName = args[args.length - 2]; } addressList.addAll(Arrays.asList(args).subList(1, args.length - 2)); Recipient recipient = new Recipient(); recipient.setAmount(amount); recipient.setRecipientAddress(accountName); System.out .println(wallet.createTransaction(addressList, Collections.singletonList(recipient))); break; case "signTransaction": if (args.length == 4) { accountName = args[3]; } if (args.length >= 3) { address = args[2]; } if (args.length >= 2) { transaction = args[1]; } if (args.length < 4) { System.out.println(wallet.signTransaction(transaction, address)); } else { System.out.println(wallet.signTransaction(transaction, address, accountName)); } break; case "signTransactionMatchSigners": if (args.length == 4) { accountName = args[3]; } if (args.length >= 3) { address = args[2]; } if (args.length >= 2) { transaction = args[1]; } if (args.length < 4) { System.out.println(wallet.signTransaction(transaction, address, null, "[\"onlyMatching\"]")); } else { System.out.println(wallet.signTransaction(transaction, address, accountName, "[\"onlyMatching\"]")); } break; case "getSignersForTransaction": if (args.length >= 2) { transaction = args[1]; } System.out.println(wallet.getSignersForTransaction(transaction)); break; case "sendTransaction": if (args.length >= 2) { transaction = args[1]; } System.out.println(wallet.sendTransaction(transaction)); break; case "monitor": if (args.length >= 2) { accountName = args[1]; } System.out.println("*This is a testing function*"); System.out.println("*It will pause for several minutes to evaluate the network," + " a full run can take 8+ minutes*"); System.out.println("Adding " + accountName + " to monitor..."); monitor.addAddresses(Collections.singletonList(accountName)); System.out.println("Initial values..."); monitor.getBalances().forEach( (balanceAddress, balance) -> System.out.println(balanceAddress + ": " + balance)); System.out.println("2 minute sleep to load..."); Thread.sleep(1000 * 120); monitor.getBalances().forEach( (balanceAddress, balance) -> System.out.println(balanceAddress + ": " + balance)); monitor.getObservableBalances().subscribe(balanceMap -> { System.out.println("Observable updated:"); balanceMap.forEach( (balanceAddress, balance) -> System.out.println(balanceAddress + ": " + balance)); }); System.out.println("60 second sleep..."); Thread.sleep(60 * 1000); System.out.println("60 second sleep..."); Thread.sleep(60 * 1000); System.out.println("60 second sleep..."); Thread.sleep(60 * 1000); System.out.println("60 second sleep..."); Thread.sleep(60 * 1000); System.out.println("60 second sleep..."); Thread.sleep(60 * 1000); System.out.println("60 second sleep..."); Thread.sleep(60 * 1000); break; case "listTxs": if (args.length >= 2) { accountName = args[1]; } if (args.length >= 3) { resultSize = Integer.parseInt(args[2]); } if (args.length >= 4) { skipNumber = Integer.parseInt(args[3]); } Arrays.asList(wallet.getTransactions(accountName, resultSize, skipNumber)) .forEach(System.out::println); break; case "getTx": if (args.length >= 2) { accountName = args[1]; } System.out.println(wallet.getTransaction(accountName)); break; default: System.out.println("Method not valid or not supported yet"); } } }