Search in sources :

Example 1 with FeeResponse

use of net.osmand.bitcoinsender.model.FeeResponse in project OsmAnd-tools by osmandapp.

the class CoinSenderMain method main.

public static void main(String[] args) throws IOException {
    if (args.length <= 0) {
        System.out.println("Usage: --prepare | --send");
        return;
    }
    Scanner in = new Scanner(System.in);
    System.out.print(String.format("Enter your API key (default %s): ", DEFAULT_KEY));
    guid = in.nextLine();
    if (guid.trim().length() == 0) {
        guid = DEFAULT_KEY;
    }
    System.out.print("Enter your PIN: ");
    pass = in.nextLine();
    System.out.print(String.format("Enter your part size (default %d): ", PART_SIZE));
    String ll = in.nextLine();
    if (ll.trim().length() > 0) {
        PART_SIZE = Integer.parseInt(ll);
    }
    System.out.print("Enter satoshi per byte price (default " + FEE_BYTE_SATOSHI + "): ");
    ll = in.nextLine();
    if (ll.trim().length() > 0) {
        FEE_BYTE_SATOSHI = Double.parseDouble(ll);
    }
    double MIN_PAY = getMinPayInBTC();
    System.out.println(String.format("Minimal payment in mBTC: %.4f", MIN_PAY * 1000));
    if (guid.equals("") || pass.equals("")) {
        System.out.println("You forgot to enter Client_ID or Secret. Exiting...");
        return;
    }
    BlockIO api = new BlockIO(guid);
    System.out.println();
    AccountBalance balance = null;
    try {
        balance = api.getAccountBalance();
    } catch (BlockIOException e) {
        e.printStackTrace();
        System.out.println("Incorrect API key. Exiting...");
        return;
    }
    System.out.println("Balance for account " + balance.network + ": Confirmed: " + balance.availableBalance + " Pending: " + balance.getPendingReceivedBalance());
    System.out.println();
    URL ur = new URL(URL_TO_PAY);
    Map<String, Double> payments = convertPaymentsToMap(getPayments(new InputStreamReader(ur.openConnection().getInputStream())), MIN_PAY);
    double allMoney = calculateTotalSum(payments);
    List<Map> splitPayment = splitResults(payments);
    for (Map<String, Double> map : splitPayment) {
        payments.putAll(map);
    }
    if (args.length > 0) {
        if (args[0].equals("--prepare")) {
            String totalSum = String.format("%.12f", (allMoney));
            System.out.println("Number of chunks: " + splitPayment.size());
            System.out.println("Total sum in BTC: " + totalSum);
        } else if (args[0].equals("--send")) {
            boolean done = false;
            List<Integer> paidChunks = new ArrayList<Integer>();
            while (!done) {
                System.out.println("Number of chunks: " + splitPayment.size());
                System.out.println("You have already paid for these chunks: " + paidChunks.toString());
                String chunkString = "Chunks: ";
                for (int i = 0; i < splitPayment.size(); i++) {
                    chunkString += (i + 1) + ". " + (i * PART_SIZE + 1) + "-" + ((i + 1) * PART_SIZE) + ", ";
                }
                System.out.println(chunkString);
                System.out.print("Enter the number of chunk you want to pay for ('-1' to exit): ");
                int chunk = in.nextInt() - 1;
                if (chunk == -2) {
                    break;
                }
                while (chunk < 0 || chunk >= splitPayment.size()) {
                    System.out.print("Please enter a number between 1 and " + splitPayment.size() + ": ");
                    chunk = in.nextInt() - 1;
                    if (chunk == -2) {
                        break;
                    }
                }
                if (paidChunks.contains(chunk + 1)) {
                    System.out.println("You've already paid for this chunk!");
                    continue;
                }
                Map<String, Double> paymentToPay = splitPayment.get(chunk);
                Map<String, Double> currentPayment = new LinkedHashMap<>();
                System.out.println("All payments: ");
                double total = 0l;
                int id = 0;
                for (String key : paymentToPay.keySet()) {
                    id++;
                    Double toPay = paymentToPay.get(key);
                    String currentPaymentString = String.format("%.12f", toPay);
                    int addId = chunk * PART_SIZE + id;
                    if (toPay >= MIN_PAY) {
                        total += toPay;
                        currentPayment.put(key, toPay);
                    } else {
                        currentPaymentString += " [NOT PAID - less than minimal] ";
                    }
                    System.out.println(addId + ". Address: " + key + ", BTC: " + currentPaymentString);
                }
                Scanner scanner = new Scanner(System.in);
                String totalString = String.format("%.10f", total);
                System.out.println("Total: " + totalString);
                System.out.println();
                System.out.println();
                int chunkUI = (chunk + 1);
                System.out.println("Prepare to pay for chunk " + chunkUI + " (" + (chunk * PART_SIZE + 1) + "-" + ((chunk + 1) * PART_SIZE) + ") ...");
                int numberOfInputs = 1;
                int txSize = currentPayment.size() * 34 + numberOfInputs * 180 + 10 + 40;
                float calculatedFee = (float) (((float) txSize * FEE_BYTE_SATOSHI) / BITCOIN_SATOSHI);
                api.printFeeForTransaction(currentPayment);
                System.out.println(String.format("!!! Estimated fee should be around : %.10f BTC !!!", calculatedFee));
                FeeResponse feeForTransaction = api.getFeeForTransaction(currentPayment);
                String pm = String.format("Actual fee to pay %.1f satoshi per byte (total %s BTC) - set as %.1f satoshi per byte", Double.parseDouble(feeForTransaction.fee) / calculatedFee * FEE_BYTE_SATOSHI, feeForTransaction.fee, FEE_BYTE_SATOSHI);
                if (Double.parseDouble(feeForTransaction.fee) > FACTOR_MULT_ALLOWED_FEE * calculatedFee) {
                    System.out.println("Payment won't proceed: " + pm);
                    continue;
                }
                System.out.println(pm);
                System.out.print("Are you sure you want to pay " + totalString + " BTC? [y/n]: ");
                String answer = scanner.nextLine();
                if (!answer.toLowerCase().equals("y")) {
                    continue;
                }
                System.out.println("Paying for chunk " + chunkUI + " (" + (chunk * PART_SIZE + 1) + "-" + ((chunk + 1) * PART_SIZE) + ") ...");
                Withdrawal withdrawal = null;
                try {
                    withdrawal = api.withdraw(null, null, currentPayment, BlockIO.ParamType.ADDRS, pass);
                    paidChunks.add(chunkUI);
                } catch (BlockIOException e) {
                    e.printStackTrace();
                    System.out.println("Unable to pay fo this chunk");
                    continue;
                }
                System.out.println("Withdrawal done. Transaction ID: " + withdrawal.txid + " Amount withdrawn: " + withdrawal.amountWithdrawn + " Amount sent: " + withdrawal.amountSent + " Network fee: " + withdrawal.networkFee + " Block.io fee: " + withdrawal.blockIOFee);
                System.out.println("Transaction url: https://chain.so/tx/BTC/" + withdrawal.txid);
                if (splitPayment.size() == paidChunks.size()) {
                    System.out.println("You've successfully paid for all chunks!");
                    System.out.println("Exiting...");
                    break;
                }
            }
        }
    }
}
Also used : Scanner(java.util.Scanner) InputStreamReader(java.io.InputStreamReader) Withdrawal(net.osmand.bitcoinsender.model.Withdrawal) URL(java.net.URL) FeeResponse(net.osmand.bitcoinsender.model.FeeResponse) AccountBalance(net.osmand.bitcoinsender.model.AccountBalance) BlockIOException(net.osmand.bitcoinsender.utils.BlockIOException) ArrayList(java.util.ArrayList) List(java.util.List) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map) LinkedTreeMap(com.google.gson.internal.LinkedTreeMap)

Aggregations

LinkedTreeMap (com.google.gson.internal.LinkedTreeMap)1 InputStreamReader (java.io.InputStreamReader)1 URL (java.net.URL)1 ArrayList (java.util.ArrayList)1 LinkedHashMap (java.util.LinkedHashMap)1 List (java.util.List)1 Map (java.util.Map)1 Scanner (java.util.Scanner)1 AccountBalance (net.osmand.bitcoinsender.model.AccountBalance)1 FeeResponse (net.osmand.bitcoinsender.model.FeeResponse)1 Withdrawal (net.osmand.bitcoinsender.model.Withdrawal)1 BlockIOException (net.osmand.bitcoinsender.utils.BlockIOException)1