package com.matthewmitchell.peercoinj.tools;
import com.matthewmitchell.peercoinj.core.*;
import com.matthewmitchell.peercoinj.kits.WalletAppKit;
import com.matthewmitchell.peercoinj.params.MainNetParams;
import com.matthewmitchell.peercoinj.utils.BriefLogFormatter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
/**
* A program that sends a transaction with the specified fee and measures how long it takes to confirm.
*/
public class TestFeeLevel {
private static Logger log = LoggerFactory.getLogger(TestFeeLevel.class);
public static final MainNetParams PARAMS = MainNetParams.get();
private static WalletAppKit kit;
public static void main(String[] args) throws Exception {
BriefLogFormatter.init();
if (args.length == 0) {
System.err.println("Specify the fee level to test in satoshis as the first argument.");
return;
}
Coin feeToTest = Coin.valueOf(Long.parseLong(args[0]));
kit = new WalletAppKit(PARAMS, new File("."), "testfeelevel");
kit.startAsync();
kit.awaitRunning();
try {
go(feeToTest);
} finally {
kit.stopAsync();
kit.awaitTerminated();
}
}
private static void go(Coin feeToTest) throws InterruptedException, java.util.concurrent.ExecutionException, InsufficientMoneyException {
kit.peerGroup().setMaxConnections(50);
final Address address = kit.wallet().currentReceiveKey().toAddress(PARAMS);
if (kit.wallet().getBalance().compareTo(feeToTest) < 0) {
log.info("Send some money to {}", address);
log.info("... and wait for it to confirm");
kit.wallet().getBalanceFuture(feeToTest, Wallet.BalanceType.AVAILABLE).get();
}
int heightAtStart = kit.chain().getBestChainHeight();
log.info("Height at start is {}", heightAtStart);
Wallet.SendRequest request = Wallet.SendRequest.to(address, kit.wallet().getBalance().subtract(feeToTest));
request.feePerKb = feeToTest;
kit.wallet().completeTx(request);
log.info("Fee paid is {}", request.fee);
log.info("TX is {}", request.tx);
kit.peerGroup().broadcastTransaction(request.tx).get();
log.info("Send complete, waiting for confirmation");
request.tx.getConfidence().getDepthFuture(1).get();
int heightNow = kit.chain().getBestChainHeight();
log.info("Height after confirmation is {}", heightNow);
log.info("Result: took {} blocks to confirm at this fee level", heightNow - heightAtStart);
}
}