diff --git a/src/main/java/com/craigraw/drongo/Drongo.java b/src/main/java/com/craigraw/drongo/Drongo.java index e48f434..44bf563 100644 --- a/src/main/java/com/craigraw/drongo/Drongo.java +++ b/src/main/java/com/craigraw/drongo/Drongo.java @@ -66,4 +66,8 @@ public class Drongo { public BitcoinJSONRPCClient getBitcoinJSONRPCClient() { return bitcoinJSONRPCClient; } + + public List getWallets() { + return watchWallets; + } } diff --git a/src/main/java/com/craigraw/drongo/TransactionTask.java b/src/main/java/com/craigraw/drongo/TransactionTask.java index 1c15bbe..114ddf7 100644 --- a/src/main/java/com/craigraw/drongo/TransactionTask.java +++ b/src/main/java/com/craigraw/drongo/TransactionTask.java @@ -1,6 +1,7 @@ package com.craigraw.drongo; import com.craigraw.drongo.address.Address; +import com.craigraw.drongo.crypto.ChildNumber; import com.craigraw.drongo.protocol.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -74,6 +75,52 @@ public class TransactionTask implements Runnable { } builder.append(outputJoiner.toString()); - log.info(builder.toString() + " " + transaction.getAllAddresses()); + log.debug(builder.toString()); + + checkWallet(transaction); + } + + private void checkWallet(Transaction transaction) { + for(WatchWallet wallet : drongo.getWallets()) { + List
fromAddresses = new ArrayList<>(); + for(TransactionInput input : transaction.getInputs()) { + for(Address address : input.getOutpoint().getAddresses()) { + if(wallet.containsAddress(address)) { + fromAddresses.add(address); + } + } + } + + Map toAddresses = new HashMap<>(); + for(TransactionOutput output : transaction.getOutputs()) { + for(Address address : output.getAddresses()) { + if(wallet.containsAddress(address)) { + toAddresses.put(address, output.getValue()); + } + } + } + + if(!fromAddresses.isEmpty()) { + StringBuilder builder = new StringBuilder(); + builder.append("Wallet ").append(wallet.getName()).append(" sent from address").append(fromAddresses.size() == 1 ? " " : "es "); + StringJoiner fromJoiner = new StringJoiner(", ", "[", "]"); + for(Address address : fromAddresses) { + fromJoiner.add(address.toString() + " [" + Utils.formatHDPath(wallet.getAddressPath(address)) + "]"); + } + builder.append(fromJoiner.toString()).append(" in txid ").append(transaction.getTxId()); + log.info(builder.toString()); + } + + if(!toAddresses.isEmpty()) { + StringBuilder builder = new StringBuilder(); + builder.append("Wallet ").append(wallet.getName()).append(" received to address").append(toAddresses.size() == 1 ? " " : "es "); + StringJoiner toJoiner = new StringJoiner(", ", "[", "]"); + for(Address address : toAddresses.keySet()) { + toJoiner.add(address.toString() + " [" + Utils.formatHDPath(wallet.getAddressPath(address)) + "]" + " (" + toAddresses.get(address) + " sats)"); + } + builder.append(toJoiner.toString()).append(" in txid ").append(transaction.getTxId()); + log.info(builder.toString()); + } + } } } diff --git a/src/main/java/com/craigraw/drongo/WatchWallet.java b/src/main/java/com/craigraw/drongo/WatchWallet.java index 3e03002..661ee16 100644 --- a/src/main/java/com/craigraw/drongo/WatchWallet.java +++ b/src/main/java/com/craigraw/drongo/WatchWallet.java @@ -41,6 +41,10 @@ public class WatchWallet { } } + public String getName() { + return name; + } + public boolean containsAddress(Address address) { return addresses.containsKey(address); } diff --git a/src/main/java/com/craigraw/drongo/protocol/Transaction.java b/src/main/java/com/craigraw/drongo/protocol/Transaction.java index e563267..1076640 100644 --- a/src/main/java/com/craigraw/drongo/protocol/Transaction.java +++ b/src/main/java/com/craigraw/drongo/protocol/Transaction.java @@ -7,7 +7,6 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -178,19 +177,6 @@ public class Transaction extends TransactionPart { return Collections.unmodifiableList(outputs); } - public List
getAllAddresses() { - List
addresses = new ArrayList<>(); - for(TransactionInput input : getInputs()) { - addresses.addAll(Arrays.asList(input.getOutpoint().getAddresses())); - } - - for(TransactionOutput output : getOutputs()) { - addresses.addAll(Arrays.asList(output.getAddresses())); - } - - return addresses; - } - public static final void main(String[] args) { String hex = "0100000001e0ea4cd2f1307820d5f33e61aa6b636d8ff94fa7e3b1913f058fb1c8a765fde0340000006a47304402201aa0955638da2902ba972100816d21bde55d0415b98064b7fa511ffefa41397702203f9c93e27557b5b04187784e79f2c1eb74a3202a73085ddfb4509069b90cbbed0121023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ffffffff3510270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac10270000000000002321023cb3e593fb85c5659688528e9a4f1c4c7f19206edc7e517d20f794ba686fd6d6ac2a91a401000000001976a9141f924ac57c8e44cfbf860fbe0a3ea072b5fb8d0f88ac00000000"; byte[] transactionBytes = Utils.hexToBytes(hex);