3
0
mirror of https://github.com/Qortal/qortal.git synced 2025-02-12 10:15:49 +00:00

Fixed another ElectrumX issue found in unit tests.

Peers that were thought to be missing output address data may actually have just been using a different key - "address" instead of "addresses". Now reading the addresses from both keys, which may remove the need for the previously added checks.
This commit is contained in:
CalDescent 2022-02-24 20:01:56 +00:00
parent d5521068b0
commit 53c4fe9e80

View File

@ -401,17 +401,29 @@ public class ElectrumX extends BitcoinyBlockchainProvider {
String scriptPubKey = (String) ((JSONObject) outputJson.get("scriptPubKey")).get("hex"); String scriptPubKey = (String) ((JSONObject) outputJson.get("scriptPubKey")).get("hex");
long value = BigDecimal.valueOf((Double) outputJson.get("value")).setScale(8).unscaledValue().longValue(); long value = BigDecimal.valueOf((Double) outputJson.get("value")).setScale(8).unscaledValue().longValue();
// address too, if present // address too, if present in the "addresses" array
List<String> addresses = null; List<String> addresses = null;
Object addressesObj = ((JSONObject) outputJson.get("scriptPubKey")).get("addresses"); Object addressesObj = ((JSONObject) outputJson.get("scriptPubKey")).get("addresses");
if (addressesObj instanceof JSONArray) { if (addressesObj instanceof JSONArray) {
addresses = new ArrayList<>(); addresses = new ArrayList<>();
for (Object addressObj : (JSONArray) addressesObj) for (Object addressObj : (JSONArray) addressesObj) {
addresses.add((String) addressObj); addresses.add((String) addressObj);
}
}
// some peers return a single "address" string
Object addressObj = ((JSONObject) outputJson.get("scriptPubKey")).get("address");
if (addressObj instanceof String) {
if (addresses == null) {
addresses = new ArrayList<>();
}
addresses.add((String) addressObj);
} }
// For the purposes of Qortal we require all outputs to contain addresses // For the purposes of Qortal we require all outputs to contain addresses
// Some servers omit this info, causing problems down the line with balance calculations // Some servers omit this info, causing problems down the line with balance calculations
// Update: it turns out that they were just using a different key - "address" instead of "addresses"
// The code below can remain in place, just in case a peer returns a missing address in the future
if (addresses == null || addresses.isEmpty()) { if (addresses == null || addresses.isEmpty()) {
if (this.currentServer != null) { if (this.currentServer != null) {
this.uselessServers.add(this.currentServer); this.uselessServers.add(this.currentServer);