From 5148bad82ee0b37f44f932f2ceb09e313a615cf9 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Thu, 20 May 2021 09:20:14 +0100 Subject: [PATCH] /crosschain/htlc APIs now take base58 encoded params instead of hex. This makes them more compatible with the output of the /crosschain/tradebot and /crosschain/trade/{ataddress} APIs which is likely where most people will be retrieving data from, rather than the database itself. --- .../api/resource/CrossChainHtlcResource.java | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/qortal/api/resource/CrossChainHtlcResource.java b/src/main/java/org/qortal/api/resource/CrossChainHtlcResource.java index 8bd2dc8b..47788b62 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainHtlcResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainHtlcResource.java @@ -26,6 +26,7 @@ import org.qortal.crosschain.Bitcoiny; import org.qortal.crosschain.ForeignBlockchainException; import org.qortal.crosschain.SupportedBlockchain; import org.qortal.crosschain.BitcoinyHTLC; +import org.qortal.utils.Base58; import org.qortal.utils.NTP; import com.google.common.hash.HashCode; @@ -41,7 +42,7 @@ public class CrossChainHtlcResource { @Path("/address/{blockchain}/{refundPKH}/{locktime}/{redeemPKH}/{hashOfSecret}") @Operation( summary = "Returns HTLC address based on trade info", - description = "Blockchain can be BITCOIN or LITECOIN. Public key hashes (PKH) and hash of secret should be 20 bytes (hex). Locktime is seconds since epoch.", + description = "Blockchain can be BITCOIN or LITECOIN. Public key hashes (PKH) and hash of secret should be 20 bytes (base58 encoded). Locktime is seconds since epoch.", responses = { @ApiResponse( content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "string")) @@ -50,21 +51,21 @@ public class CrossChainHtlcResource { ) @ApiErrors({ApiError.INVALID_PUBLIC_KEY, ApiError.INVALID_CRITERIA}) public String deriveHtlcAddress(@PathParam("blockchain") String blockchainName, - @PathParam("refundPKH") String refundHex, + @PathParam("refundPKH") String refundPKH, @PathParam("locktime") int lockTime, - @PathParam("redeemPKH") String redeemHex, - @PathParam("hashOfSecret") String hashOfSecretHex) { + @PathParam("redeemPKH") String redeemPKH, + @PathParam("hashOfSecret") String hashOfSecret) { SupportedBlockchain blockchain = SupportedBlockchain.valueOf(blockchainName); if (blockchain == null) throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); byte[] refunderPubKeyHash; byte[] redeemerPubKeyHash; - byte[] hashOfSecret; + byte[] decodedHashOfSecret; try { - refunderPubKeyHash = HashCode.fromString(refundHex).asBytes(); - redeemerPubKeyHash = HashCode.fromString(redeemHex).asBytes(); + refunderPubKeyHash = Base58.decode(refundPKH); + redeemerPubKeyHash = Base58.decode(redeemPKH); if (refunderPubKeyHash.length != 20 || redeemerPubKeyHash.length != 20) throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_PUBLIC_KEY); @@ -73,14 +74,14 @@ public class CrossChainHtlcResource { } try { - hashOfSecret = HashCode.fromString(hashOfSecretHex).asBytes(); - if (hashOfSecret.length != 20) + decodedHashOfSecret = Base58.decode(hashOfSecret); + if (decodedHashOfSecret.length != 20) throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); } catch (IllegalArgumentException e) { throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); } - byte[] redeemScript = BitcoinyHTLC.buildScript(refunderPubKeyHash, lockTime, redeemerPubKeyHash, hashOfSecret); + byte[] redeemScript = BitcoinyHTLC.buildScript(refunderPubKeyHash, lockTime, redeemerPubKeyHash, decodedHashOfSecret); Bitcoiny bitcoiny = (Bitcoiny) blockchain.getInstance(); @@ -91,7 +92,7 @@ public class CrossChainHtlcResource { @Path("/status/{blockchain}/{refundPKH}/{locktime}/{redeemPKH}/{hashOfSecret}") @Operation( summary = "Checks HTLC status", - description = "Blockchain can be BITCOIN or LITECOIN. Public key hashes (PKH) and hash of secret should be 20 bytes (hex). Locktime is seconds since epoch.", + description = "Blockchain can be BITCOIN or LITECOIN. Public key hashes (PKH) and hash of secret should be 20 bytes (base58 encoded). Locktime is seconds since epoch.", responses = { @ApiResponse( content = @Content(mediaType = MediaType.APPLICATION_JSON, schema = @Schema(implementation = CrossChainBitcoinyHTLCStatus.class)) @@ -100,10 +101,10 @@ public class CrossChainHtlcResource { ) @ApiErrors({ApiError.INVALID_CRITERIA, ApiError.INVALID_ADDRESS, ApiError.ADDRESS_UNKNOWN}) public CrossChainBitcoinyHTLCStatus checkHtlcStatus(@PathParam("blockchain") String blockchainName, - @PathParam("refundPKH") String refundHex, + @PathParam("refundPKH") String refundPKH, @PathParam("locktime") int lockTime, - @PathParam("redeemPKH") String redeemHex, - @PathParam("hashOfSecret") String hashOfSecretHex) { + @PathParam("redeemPKH") String redeemPKH, + @PathParam("hashOfSecret") String hashOfSecret) { Security.checkApiCallAllowed(request); SupportedBlockchain blockchain = SupportedBlockchain.valueOf(blockchainName); @@ -112,11 +113,11 @@ public class CrossChainHtlcResource { byte[] refunderPubKeyHash; byte[] redeemerPubKeyHash; - byte[] hashOfSecret; + byte[] decodedHashOfSecret; try { - refunderPubKeyHash = HashCode.fromString(refundHex).asBytes(); - redeemerPubKeyHash = HashCode.fromString(redeemHex).asBytes(); + refunderPubKeyHash = Base58.decode(refundPKH); + redeemerPubKeyHash = Base58.decode(redeemPKH); if (refunderPubKeyHash.length != 20 || redeemerPubKeyHash.length != 20) throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_PUBLIC_KEY); @@ -125,14 +126,14 @@ public class CrossChainHtlcResource { } try { - hashOfSecret = HashCode.fromString(hashOfSecretHex).asBytes(); - if (hashOfSecret.length != 20) + decodedHashOfSecret = Base58.decode(hashOfSecret); + if (decodedHashOfSecret.length != 20) throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); } catch (IllegalArgumentException e) { throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); } - byte[] redeemScript = BitcoinyHTLC.buildScript(refunderPubKeyHash, lockTime, redeemerPubKeyHash, hashOfSecret); + byte[] redeemScript = BitcoinyHTLC.buildScript(refunderPubKeyHash, lockTime, redeemerPubKeyHash, decodedHashOfSecret); Bitcoiny bitcoiny = (Bitcoiny) blockchain.getInstance();