add oxt.me as fee rates source

This commit is contained in:
Craig Raw 2023-11-16 10:12:41 +02:00
parent 9e5a6e83d1
commit aec26d512b
2 changed files with 33 additions and 9 deletions

View file

@ -19,14 +19,14 @@ public enum FeeRatesSource {
@Override @Override
public Map<Integer, Double> getBlockTargetFeeRates(Map<Integer, Double> defaultblockTargetFeeRates) { public Map<Integer, Double> getBlockTargetFeeRates(Map<Integer, Double> defaultblockTargetFeeRates) {
String url = AppServices.isUsingProxy() ? "http://mempoolhqx4isw62xs7abwphsq7ldayuidyx2v2oethdhhj6mlo2r6ad.onion/api/v1/fees/recommended" : "https://mempool.space/api/v1/fees/recommended"; String url = AppServices.isUsingProxy() ? "http://mempoolhqx4isw62xs7abwphsq7ldayuidyx2v2oethdhhj6mlo2r6ad.onion/api/v1/fees/recommended" : "https://mempool.space/api/v1/fees/recommended";
return getThreeTierFeeRates(defaultblockTargetFeeRates, url); return getThreeTierFeeRates(this, defaultblockTargetFeeRates, url);
} }
}, },
BITCOINFEES_EARN_COM("bitcoinfees.earn.com") { BITCOINFEES_EARN_COM("bitcoinfees.earn.com") {
@Override @Override
public Map<Integer, Double> getBlockTargetFeeRates(Map<Integer, Double> defaultblockTargetFeeRates) { public Map<Integer, Double> getBlockTargetFeeRates(Map<Integer, Double> defaultblockTargetFeeRates) {
String url = "https://bitcoinfees.earn.com/api/v1/fees/recommended"; String url = "https://bitcoinfees.earn.com/api/v1/fees/recommended";
return getThreeTierFeeRates(defaultblockTargetFeeRates, url); return getThreeTierFeeRates(this, defaultblockTargetFeeRates, url);
} }
}, },
MINIMUM("Minimum (1 sat/vB)") { MINIMUM("Minimum (1 sat/vB)") {
@ -39,6 +39,22 @@ public enum FeeRatesSource {
return blockTargetFeeRates; return blockTargetFeeRates;
} }
},
OXT_ME("oxt.me") {
@Override
public Map<Integer, Double> getBlockTargetFeeRates(Map<Integer, Double> defaultblockTargetFeeRates) {
String url = AppServices.isUsingProxy() ? "http://oxtwshnfyktikbflierkwcxxksbonl6v73l5so5zky7ur72w52tktkid.onion/stats/global/mempool" : "https://api.oxt.me/stats/global/mempool";
return getThreeTierFeeRates(this, defaultblockTargetFeeRates, url);
}
@Override
protected ThreeTierRates getThreeTierRates(String url, HttpClientService httpClientService) throws Exception {
OxtRates oxtRates = httpClientService.requestJson(url, OxtRates.class, null);
if(oxtRates.data == null || oxtRates.data.length < 1) {
throw new Exception("Invalid response from " + url);
}
return oxtRates.data[0].getThreeTierRates();
}
}; };
private static final Logger log = LoggerFactory.getLogger(FeeRatesSource.class); private static final Logger log = LoggerFactory.getLogger(FeeRatesSource.class);
@ -58,7 +74,7 @@ public enum FeeRatesSource {
return name; return name;
} }
private static Map<Integer, Double> getThreeTierFeeRates(Map<Integer, Double> defaultblockTargetFeeRates, String url) { private static Map<Integer, Double> getThreeTierFeeRates(FeeRatesSource feeRatesSource, Map<Integer, Double> defaultblockTargetFeeRates, String url) {
if(log.isInfoEnabled()) { if(log.isInfoEnabled()) {
log.info("Requesting fee rates from " + url); log.info("Requesting fee rates from " + url);
} }
@ -66,7 +82,7 @@ public enum FeeRatesSource {
Map<Integer, Double> blockTargetFeeRates = new LinkedHashMap<>(); Map<Integer, Double> blockTargetFeeRates = new LinkedHashMap<>();
HttpClientService httpClientService = AppServices.getHttpClientService(); HttpClientService httpClientService = AppServices.getHttpClientService();
try { try {
ThreeTierRates threeTierRates = httpClientService.requestJson(url, ThreeTierRates.class, null); ThreeTierRates threeTierRates = feeRatesSource.getThreeTierRates(url, httpClientService);
Double lastRate = null; Double lastRate = null;
for(Integer blockTarget : defaultblockTargetFeeRates.keySet()) { for(Integer blockTarget : defaultblockTargetFeeRates.keySet()) {
if(blockTarget < BLOCKS_IN_HALF_HOUR) { if(blockTarget < BLOCKS_IN_HALF_HOUR) {
@ -101,15 +117,22 @@ public enum FeeRatesSource {
return blockTargetFeeRates; return blockTargetFeeRates;
} }
protected ThreeTierRates getThreeTierRates(String url, HttpClientService httpClientService) throws Exception {
return httpClientService.requestJson(url, ThreeTierRates.class, null);
}
@Override @Override
public String toString() { public String toString() {
return name; return name;
} }
private static class ThreeTierRates { private record ThreeTierRates(Double fastestFee, Double halfHourFee, Double hourFee, Double minimumFee) {}
public Double fastestFee;
public Double halfHourFee; private record OxtRates(OxtRatesData[] data) {}
public Double hourFee;
public Double minimumFee; private record OxtRatesData(Double recommended_fee_099, Double recommended_fee_090, Double recommended_fee_050) {
public ThreeTierRates getThreeTierRates() {
return new ThreeTierRates(recommended_fee_099/1000, recommended_fee_090/1000, recommended_fee_050/1000, null);
}
} }
} }

View file

@ -36,6 +36,7 @@
<FXCollections fx:factory="observableArrayList"> <FXCollections fx:factory="observableArrayList">
<FeeRatesSource fx:constant="ELECTRUM_SERVER" /> <FeeRatesSource fx:constant="ELECTRUM_SERVER" />
<FeeRatesSource fx:constant="MEMPOOL_SPACE" /> <FeeRatesSource fx:constant="MEMPOOL_SPACE" />
<FeeRatesSource fx:constant="OXT_ME" />
<FeeRatesSource fx:constant="MINIMUM" /> <FeeRatesSource fx:constant="MINIMUM" />
</FXCollections> </FXCollections>
</items> </items>