Browse Source

get and store fee rate histogram

bwt
Craig Raw 4 years ago
parent
commit
43bf6ab265
  1. 8
      src/main/java/com/sparrowwallet/sparrow/AppController.java
  2. 4
      src/main/java/com/sparrowwallet/sparrow/event/ConnectionEvent.java
  3. 8
      src/main/java/com/sparrowwallet/sparrow/event/FeeRatesUpdatedEvent.java
  4. 19
      src/main/java/com/sparrowwallet/sparrow/net/BatchedElectrumServerRpc.java
  5. 10
      src/main/java/com/sparrowwallet/sparrow/net/ElectrumServer.java
  6. 2
      src/main/java/com/sparrowwallet/sparrow/net/ElectrumServerRpc.java
  7. 18
      src/main/java/com/sparrowwallet/sparrow/net/SimpleElectrumServerRpc.java

8
src/main/java/com/sparrowwallet/sparrow/AppController.java

@ -143,6 +143,8 @@ public class AppController implements Initializable {
private static Map<Integer, Double> targetBlockFeeRates;
private static Map<Long, Long> feeRateHistogram;
private static Double minimumRelayFeeRate;
private static CurrencyRate fiatCurrencyExchangeRate;
@ -650,6 +652,10 @@ public class AppController implements Initializable {
return targetBlockFeeRates;
}
public static Map<Long, Long> getFeeRateHistogram() {
return feeRateHistogram;
}
public static Double getMinimumRelayFeeRate() {
return minimumRelayFeeRate == null ? Transaction.DEFAULT_MIN_RELAY_FEE : minimumRelayFeeRate;
}
@ -1429,6 +1435,7 @@ public class AppController implements Initializable {
public void newConnection(ConnectionEvent event) {
currentBlockHeight = event.getBlockHeight();
targetBlockFeeRates = event.getTargetBlockFeeRates();
feeRateHistogram = event.getFeeRateHistogram();
minimumRelayFeeRate = event.getMinimumRelayFeeRate();
String banner = event.getServerBanner();
String status = "Connected to " + Config.get().getElectrumServer() + " at height " + event.getBlockHeight();
@ -1453,6 +1460,7 @@ public class AppController implements Initializable {
@Subscribe
public void feesUpdated(FeeRatesUpdatedEvent event) {
targetBlockFeeRates = event.getTargetBlockFeeRates();
feeRateHistogram = event.getFeeRateHistogram();
}
@Subscribe

4
src/main/java/com/sparrowwallet/sparrow/event/ConnectionEvent.java

@ -12,8 +12,8 @@ public class ConnectionEvent extends FeeRatesUpdatedEvent {
private final BlockHeader blockHeader;
private final Double minimumRelayFeeRate;
public ConnectionEvent(List<String> serverVersion, String serverBanner, int blockHeight, BlockHeader blockHeader, Map<Integer, Double> targetBlockFeeRates, Double minimumRelayFeeRate) {
super(targetBlockFeeRates);
public ConnectionEvent(List<String> serverVersion, String serverBanner, int blockHeight, BlockHeader blockHeader, Map<Integer, Double> targetBlockFeeRates, Map<Long, Long> feeRateHistogram, Double minimumRelayFeeRate) {
super(targetBlockFeeRates, feeRateHistogram);
this.serverVersion = serverVersion;
this.serverBanner = serverBanner;
this.blockHeight = blockHeight;

8
src/main/java/com/sparrowwallet/sparrow/event/FeeRatesUpdatedEvent.java

@ -4,12 +4,18 @@ import java.util.Map;
public class FeeRatesUpdatedEvent {
private final Map<Integer, Double> targetBlockFeeRates;
private final Map<Long, Long> feeRateHistogram;
public FeeRatesUpdatedEvent(Map<Integer, Double> targetBlockFeeRates) {
public FeeRatesUpdatedEvent(Map<Integer, Double> targetBlockFeeRates, Map<Long, Long> feeRateHistogram) {
this.targetBlockFeeRates = targetBlockFeeRates;
this.feeRateHistogram = feeRateHistogram;
}
public Map<Integer, Double> getTargetBlockFeeRates() {
return targetBlockFeeRates;
}
public Map<Long, Long> getFeeRateHistogram() {
return feeRateHistogram;
}
}

19
src/main/java/com/sparrowwallet/sparrow/net/BatchedElectrumServerRpc.java

@ -15,6 +15,7 @@ import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.concurrent.atomic.AtomicLong;
public class BatchedElectrumServerRpc implements ElectrumServerRpc {
@ -229,6 +230,24 @@ public class BatchedElectrumServerRpc implements ElectrumServerRpc {
}
}
@Override
public Map<Long, Long> getFeeRateHistogram(Transport transport) {
try {
JsonRpcClient client = new JsonRpcClient(transport);
Long[][] feesArray = new RetryLogic<Long[][]>(MAX_RETRIES, RETRY_DELAY, IllegalStateException.class).getResult(() ->
client.createRequest().returnAs(Long[][].class).method("mempool.get_fee_histogram").id(idCounter.incrementAndGet()).execute());
Map<Long, Long> feeRateHistogram = new TreeMap<>();
for(Long[] feePair : feesArray) {
feeRateHistogram.put(feePair[0], feePair[1]);
}
return feeRateHistogram;
} catch(Exception e) {
throw new ElectrumServerRpcException("Error getting fee rate histogram", e);
}
}
@Override
public Double getMinimumRelayFee(Transport transport) {
try {

10
src/main/java/com/sparrowwallet/sparrow/net/ElectrumServer.java

@ -610,6 +610,10 @@ public class ElectrumServer {
}
}
public Map<Long, Long> getFeeRateHistogram() throws ServerException {
return electrumServerRpc.getFeeRateHistogram(getTransport());
}
public Double getMinimumRelayFee() throws ServerException {
Double minFeeRateBtcKb = electrumServerRpc.getMinimumRelayFee(getTransport());
if(minFeeRateBtcKb != null) {
@ -760,6 +764,7 @@ public class ElectrumServer {
String banner = electrumServer.getServerBanner();
Map<Integer, Double> blockTargetFeeRates = electrumServer.getFeeEstimates(SendController.TARGET_BLOCKS_RANGE);
Map<Long, Long> feeRateHistogram = electrumServer.getFeeRateHistogram();
feeRatesRetrievedAt = System.currentTimeMillis();
Double minimumRelayFeeRate = electrumServer.getMinimumRelayFee();
@ -767,7 +772,7 @@ public class ElectrumServer {
blockTargetFeeRates.computeIfPresent(blockTarget, (blocks, feeRate) -> feeRate < minimumRelayFeeRate ? minimumRelayFeeRate : feeRate);
}
return new ConnectionEvent(serverVersion, banner, tip.height, tip.getBlockHeader(), blockTargetFeeRates, minimumRelayFeeRate);
return new ConnectionEvent(serverVersion, banner, tip.height, tip.getBlockHeader(), blockTargetFeeRates, feeRateHistogram, minimumRelayFeeRate);
} else {
if(reader.isAlive()) {
electrumServer.ping();
@ -775,8 +780,9 @@ public class ElectrumServer {
long elapsed = System.currentTimeMillis() - feeRatesRetrievedAt;
if(elapsed > FEE_RATES_PERIOD) {
Map<Integer, Double> blockTargetFeeRates = electrumServer.getFeeEstimates(SendController.TARGET_BLOCKS_RANGE);
Map<Long, Long> feeRateHistogram = electrumServer.getFeeRateHistogram();
feeRatesRetrievedAt = System.currentTimeMillis();
return new FeeRatesUpdatedEvent(blockTargetFeeRates);
return new FeeRatesUpdatedEvent(blockTargetFeeRates, feeRateHistogram);
}
} else {
resetConnection();

2
src/main/java/com/sparrowwallet/sparrow/net/ElectrumServerRpc.java

@ -30,6 +30,8 @@ public interface ElectrumServerRpc {
Map<Integer, Double> getFeeEstimates(Transport transport, List<Integer> targetBlocks);
Map<Long, Long> getFeeRateHistogram(Transport transport);
Double getMinimumRelayFee(Transport transport);
String broadcastTransaction(Transport transport, String txHex);

18
src/main/java/com/sparrowwallet/sparrow/net/SimpleElectrumServerRpc.java

@ -246,6 +246,24 @@ public class SimpleElectrumServerRpc implements ElectrumServerRpc {
return result;
}
@Override
public Map<Long, Long> getFeeRateHistogram(Transport transport) {
try {
JsonRpcClient client = new JsonRpcClient(transport);
Long[][] feesArray = new RetryLogic<Long[][]>(MAX_RETRIES, RETRY_DELAY, IllegalStateException.class).getResult(() ->
client.createRequest().returnAs(Long[][].class).method("mempool.get_fee_histogram").id(idCounter.incrementAndGet()).execute());
Map<Long, Long> feeRateHistogram = new TreeMap<>();
for(Long[] feePair : feesArray) {
feeRateHistogram.put(feePair[0], feePair[1]);
}
return feeRateHistogram;
} catch(Exception e) {
throw new ElectrumServerRpcException("Error getting fee rate histogram", e);
}
}
@Override
public Double getMinimumRelayFee(Transport transport) {
try {

Loading…
Cancel
Save