From d0889ab9dee263494bcf50dc6c5a25a249c8ffe1 Mon Sep 17 00:00:00 2001 From: yamada Date: Wed, 17 Apr 2019 00:02:00 +0900 Subject: [PATCH] add SLP Token Type https://github.com/simpleledger/slp-specifications/blob/master/slp-token-type-1.md --- src/js/bchaddrjs-0.2.1.js | 53 +++++++++++++++++++++++++++++++-------- src/js/index.js | 16 +++++++++++- tests/spec/tests.js | 9 +++++++ 3 files changed, 66 insertions(+), 12 deletions(-) diff --git a/src/js/bchaddrjs-0.2.1.js b/src/js/bchaddrjs-0.2.1.js index 8356f10..28f67e9 100644 --- a/src/js/bchaddrjs-0.2.1.js +++ b/src/js/bchaddrjs-0.2.1.js @@ -3356,7 +3356,7 @@ var validate = validation.validate; /** * Encodes a hash from a given type into a Bitcoin Cash address with the given prefix. - * + * * @static * @param {string} prefix Network prefix. E.g.: 'bitcoincash'. * @param {string} type Type of address to generate. Either 'P2PKH' or 'P2SH'. @@ -3378,7 +3378,7 @@ function encode(prefix, type, hash) { /** * Decodes the given address into its constituting prefix, type and hash. See [#encode()]{@link encode}. - * + * * @static * @param {string} address Address to decode. E.g.: 'bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a'. * @returns {object} @@ -3416,14 +3416,14 @@ var ValidationError = validation.ValidationError; * * @private */ -var VALID_PREFIXES = ['bitcoincash', 'bchtest', 'bchreg']; +var VALID_PREFIXES = ['bitcoincash', 'bchtest', 'bchreg', 'simpleledger', 'slptest']; /** * Checks whether a string is a valid prefix; ie., it has a single letter case - * and is one of 'bitcoincash', 'bchtest', or 'bchreg'. + * and is one of 'bitcoincash', 'bchtest', or 'bchreg', 'simpleledger' or 'slptest'. * * @private - * @param {string} prefix + * @param {string} prefix * @returns {boolean} */ function isValidPrefix(prefix) { @@ -3435,7 +3435,7 @@ function isValidPrefix(prefix) { * of the address' checksum. * * @private - * @param {string} prefix Network prefix. E.g.: 'bitcoincash'. + * @param {string} prefix Network prefix. E.g.: 'bitcoincash'. * @returns {Uint8Array} */ function prefixToUint5Array(prefix) { @@ -3594,8 +3594,8 @@ function fromUint5Array(data) { * Returns the concatenation a and b. * * @private - * @param {Uint8Array} a - * @param {Uint8Array} b + * @param {Uint8Array} a + * @param {Uint8Array} b * @returns {Uint8Array} * @throws {ValidationError} */ @@ -3633,7 +3633,7 @@ function polymod(data) { /** * Verify that the payload has not been corrupted by checking that the * checksum is valid. - * + * * @private * @param {string} prefix Network prefix. E.g.: 'bitcoincash'. * @param {Uint8Array} payload Array of 5-bit integers containing the address' payload. @@ -9011,6 +9011,21 @@ function toCashAddress (address) { return encodeAsCashaddr(decoded) } +/** + * Translates the given address into SLP format. + * @static + * @param {string} address - A valid SLP address in any format. + * @return {string} + * @throws {InvalidAddressError} + */ +function toSlpAddress (address) { + var decoded = decodeAddress(address) + return encodeAsSlpaddr(decoded) +} + + + + /** * Version byte table for base58 formats. * @private @@ -9125,7 +9140,7 @@ function decodeCashAddress (address) { } catch (error) { } } else { - var prefixes = ['bitcoincash', 'bchtest', 'regtest'] + var prefixes = ['bitcoincash', 'bchtest', 'regtest', 'simpleledger', 'slptest'] for (var i = 0; i < prefixes.length; ++i) { try { var prefix = prefixes[i] @@ -9151,6 +9166,7 @@ function decodeCashAddressWithPrefix (address) { var type = decoded.type === 'P2PKH' ? Type.P2PKH : Type.P2SH switch (decoded.prefix) { case 'bitcoincash': + case 'simpleledger': return { hash: hash, format: Format.Cashaddr, @@ -9158,6 +9174,7 @@ function decodeCashAddressWithPrefix (address) { type: type } case 'bchtest': + case 'slptest': case 'regtest': return { hash: hash, @@ -9212,6 +9229,19 @@ function encodeAsCashaddr (decoded) { return cashaddr.encode(prefix, type, hash) } + /** + * Encodes the given decoded address into slp addr format. + * @private + * @param {object} decoded + * @returns {string} + */ + function encodeAsSlpaddr (decoded) { + var prefix = decoded.network === Network.Mainnet ? 'simpleledger' : 'slptest' + var type = decoded.type === Type.P2PKH ? 'P2PKH' : 'P2SH' + var hash = Uint8Array.from(decoded.hash) + return cashaddr.encode(prefix, type, hash) + } + /** * Returns a boolean indicating whether the address is in legacy format. * @static @@ -9313,6 +9343,7 @@ module.exports = { toLegacyAddress: toLegacyAddress, toBitpayAddress: toBitpayAddress, toCashAddress: toCashAddress, + toSlpAddress: toSlpAddress, isLegacyAddress: isLegacyAddress, isBitpayAddress: isBitpayAddress, isCashAddress: isCashAddress, @@ -9325,4 +9356,4 @@ module.exports = { }).call(this,require("buffer").Buffer) },{"bs58check":7,"buffer":8,"cashaddrjs":10}]},{},[52])(52) -}); \ No newline at end of file +}); diff --git a/src/js/index.js b/src/js/index.js index 8c23e61..057d709 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -952,6 +952,13 @@ address = bchaddr.toBitpayAddress(address); } } + // Bitcoin Cash address format may vary + if (networks[DOM.network.val()].name == "SLP - Simple Ledger Protocol") { + var bchAddrType = DOM.bitcoinCashAddressType.filter(":checked").val(); + if (bchAddrType == "cashaddr") { + address = bchaddr.toSlpAddress(address); + } + } // Segwit addresses are different if (isSegwit) { if (!segwitAvailable) { @@ -1718,7 +1725,7 @@ network = bitcoinjs.bitcoin.networks.blocknode; setHdCoin(2941); }, - }, + }, { name: "tBND - Blocknode Testnet", onSelect: function() { @@ -2486,6 +2493,13 @@ setHdCoin(111); }, }, + { + name: "SLP - Simple Ledger Protocol", + onSelect: function() { + DOM.bitcoinCashAddressTypeContainer.removeClass("hidden"); + setHdCoin(245); + }, + }, { name: "SLR - Solarcoin", onSelect: function() { diff --git a/tests/spec/tests.js b/tests/spec/tests.js index 364349c..d71a61c 100644 --- a/tests/spec/tests.js +++ b/tests/spec/tests.js @@ -564,6 +564,15 @@ it('Allows selection of bitcoin cash', function(done) { }; testNetwork(done, params); }); + +it('Allows selection of simpleledger(SLP)', function(done) { + var params = { + selectText: "SLP - Simple Ledger Protocol", + firstAddress: "simpleledger:qrtffz6ajfsn74gpur7y3epjquz42pvww5acewqmre", + }; + testNetwork(done, params); +}); + it('Allows selection of myriadcoin', function(done) { var params = { selectText: "XMY - Myriadcoin", -- 2.41.0