From a58f1f162213a86fab9a0633156601b59d657545 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 8 Feb 2020 15:03:44 -0800 Subject: [PATCH 1/3] perf: use optimized base58 implementation (#66) per LedgerHQ CTO, the Base58 implementation in [Ledger App BTC](https://github.com/LedgerHQ/ledger-app-btc/blob/master/src/btchip_base58.c#L79 ) contains several performance optimizations and better bounds-checking. These changes implement the optimized Base58 version. --- CHANGELOG.md | 7 ++ LICENSE | 19 ++++ src/operations/transactions/ux/ipfs_ux.c | 9 +- src/utils/base58.c | 115 +++++++++++------------ src/utils/base58.h | 40 ++++---- 5 files changed, 105 insertions(+), 85 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abc3ab15..f1f9737a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Changed +- use optimized Base58 implementation from Ledger BTC app ([#66]) + ## [2.0.0] - 2020-02-05 ### Added @@ -32,3 +37,5 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. [#53]: https://github.com/ArkEcosystem/ledger/pull/53 [#55]: https://github.com/ArkEcosystem/ledger/pull/53 [2.0.0]: https://github.com/ArkEcosystem/ledger/compare/master...2.0.0 +[#66]: https://github.com/ArkEcosystem/ledger/pull/66 +[unreleased]: https://github.com/ArkEcosystem/ledger/compare/master...develop diff --git a/LICENSE b/LICENSE index f231bf83..87221124 100644 --- a/LICENSE +++ b/LICENSE @@ -237,3 +237,22 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + +----- + +Parts of this software are based on the Ledger Bitcoin Wallet App + + Ledger App - Bitcoin Wallet + (c) 2016-2019 Ledger + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/src/operations/transactions/ux/ipfs_ux.c b/src/operations/transactions/ux/ipfs_ux.c index c57f5ec7..bb3538e9 100644 --- a/src/operations/transactions/ux/ipfs_ux.c +++ b/src/operations/transactions/ux/ipfs_ux.c @@ -57,8 +57,9 @@ void displayIpfs(const Transaction *transaction) { TOKEN_NAME, TOKEN_NAME_SIZE, TOKEN_DECIMALS); // DAG - encodeBase58((uint8_t *)transaction->asset.ipfs.dag, - transaction->asset.ipfs.length, - (uint8_t *)displayCtx.extended_text, - MAX_TEXT_LEN); + size_t dagLen = MAX_TEXT_LEN; + btchip_encode_base58(transaction->asset.ipfs.dag, + transaction->asset.ipfs.length, + displayCtx.extended_text, + &dagLen); } diff --git a/src/utils/base58.c b/src/utils/base58.c index 45b1224d..3b50734b 100644 --- a/src/utils/base58.c +++ b/src/utils/base58.c @@ -25,21 +25,22 @@ * * ----- * - * Parts of this software are based on Ledger Nano SDK - * - * (c) 2017 Ledger + * Parts of this software are based on the Ledger Bitcoin Wallet App + * + * Ledger App - Bitcoin Wallet + * (c) 2016-2019 Ledger * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. ******************************************************************************/ #include "utils/base58.h" @@ -54,6 +55,9 @@ #include "utils/utils.h" +//////////////////////////////////////////////////////////////////////////////// +#define MAX_ENC_INPUT_SIZE 120 + //////////////////////////////////////////////////////////////////////////////// static const uint8_t BASE58ALPHABET[] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', @@ -63,71 +67,64 @@ static const uint8_t BASE58ALPHABET[] = { }; //////////////////////////////////////////////////////////////////////////////// -uint8_t encodeBase58(uint8_t *in, - size_t inSize, - uint8_t *out, - size_t maxOutSize) { - uint8_t tmp[164]; - uint8_t buffer[164]; - size_t j; - size_t startAt; +// src: https://github.com/LedgerHQ/ledger-app-btc/blob/master/src/btchip_base58.c#L79 +int btchip_encode_base58(const unsigned char *in, size_t length, + unsigned char *out, size_t *outlen) { + unsigned char buffer[MAX_ENC_INPUT_SIZE * 138 / 100 + 1] = {0}; + size_t i = 0, j; + size_t startAt, stopAt; size_t zeroCount = 0; + size_t outputSize; - if (inSize > sizeof(tmp)) { - return 0; + if (length > MAX_ENC_INPUT_SIZE) { + return -1; } - bytecpy(tmp, in, inSize); - while ((zeroCount < inSize) && (tmp[zeroCount] == 0U)) { + while ((zeroCount < length) && (in[zeroCount] == 0)) { ++zeroCount; } - j = 2 * inSize; - startAt = zeroCount; - while (startAt < inSize) { - size_t remainder = 0; - size_t divLoop; - - for (divLoop = startAt; divLoop < inSize; divLoop++) { - size_t digit256 = (size_t)(tmp[divLoop] & 0xff); - size_t tmpDiv = remainder * 256 + digit256; - tmp[divLoop] = (uint8_t)(tmpDiv / 58); - remainder = (tmpDiv % 58); + outputSize = (length - zeroCount) * 138 / 100 + 1; + stopAt = outputSize - 1; + for (startAt = zeroCount; startAt < length; startAt++) { + int carry = in[startAt]; + for (j = outputSize - 1; (int)j >= 0; j--) { + carry += 256 * buffer[j]; + buffer[j] = carry % 58; + carry /= 58; + + if (j <= stopAt - 1 && carry == 0) { + break; + } } - - if (tmp[startAt] == 0) { - ++startAt; - } - - buffer[--j] = (uint8_t)BASE58ALPHABET[remainder]; + stopAt = j; } - while ((j < (2 * inSize)) && (buffer[j] == BASE58ALPHABET[0])) { - ++j; + j = 0; + while (j < outputSize && buffer[j] == 0) { + j += 1; } - while (zeroCount-- > 0) { - buffer[--j] = BASE58ALPHABET[0]; + if (*outlen < zeroCount + outputSize - j) { + *outlen = zeroCount + outputSize - j; + return -1; } - inSize = 2 * inSize - j; - if (maxOutSize < inSize) { - explicit_bzero(out, sizeof(out)); - return 0; - } + os_memset(out, BASE58ALPHABET[0], zeroCount); - bytecpy(out, (buffer + j), inSize); + i = zeroCount; + while (j < outputSize) { + out[i++] = BASE58ALPHABET[buffer[j++]]; + } + *outlen = i; - return inSize; + return 0; } //////////////////////////////////////////////////////////////////////////////// -uint16_t encodeBase58PublicKey(uint8_t *in, - size_t inSize, - uint8_t *out, - size_t outSize, - uint16_t version, - uint8_t alreadyHashed) { +int encodeBase58PublicKey(uint8_t *in, size_t inSize, + uint8_t *out, size_t outSize, + uint16_t version, uint8_t alreadyHashed) { uint8_t temp[inSize + 4]; uint8_t checksum[HASH_32_LEN]; size_t versionSize = (version > 255U ? 2 : 1); @@ -153,5 +150,5 @@ uint16_t encodeBase58PublicKey(uint8_t *in, bytecpy(&temp[ripeLength], checksum, 4); - return encodeBase58(temp, ripeLength + 4, out, outSize); + return btchip_encode_base58(temp, ripeLength + 4, out, &outSize); } diff --git a/src/utils/base58.h b/src/utils/base58.h index 139419c7..0365816f 100644 --- a/src/utils/base58.h +++ b/src/utils/base58.h @@ -25,21 +25,22 @@ * * ----- * - * Parts of this software are based on Ledger Nano SDK + * Parts of this software are based on the Ledger Bitcoin Wallet App * - * (c) 2017 Ledger + * Ledger App - Bitcoin Wallet + * (c) 2016-2019 Ledger * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. ******************************************************************************/ #ifndef ARK_UTILS_BASE58_H @@ -49,16 +50,11 @@ #include //////////////////////////////////////////////////////////////////////////////// -uint8_t encodeBase58(uint8_t *in, - size_t inSize, - uint8_t *out, - size_t maxOutSize); +int btchip_encode_base58(const unsigned char *in, size_t length, + unsigned char *out, size_t *outlen); -uint16_t encodeBase58PublicKey(uint8_t *in, - size_t inSize, - uint8_t *out, - size_t outSize, - uint16_t version, - uint8_t alreadyHashed); +int encodeBase58PublicKey(uint8_t *in, size_t inSize, + uint8_t *out, size_t outSize, + uint16_t version, uint8_t alreadyHashed); -#endif // #ifndef ARK_UTILS_BASE58_H +#endif // ARK_UTILS_BASE58_H From 56239dfd3615444f8310165d04975cc8e95356a5 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 8 Feb 2020 15:04:10 -0800 Subject: [PATCH 2/3] docs: mv payloads.md -> PAYLOADS.md --- docs/PAYLOADS.md | 158 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 docs/PAYLOADS.md diff --git a/docs/PAYLOADS.md b/docs/PAYLOADS.md new file mode 100644 index 00000000..953113a2 --- /dev/null +++ b/docs/PAYLOADS.md @@ -0,0 +1,158 @@ + +# Payloads + +* [Legacy Transactions](#legacy) + * [Transfer (Type 0)](#legacy-transfer-type-0) + * [Transfer - No VendorField](#legacy-transfer-no-vendorfield) + * [Transfer - With VendorField](#legacy-transfer-with-vendorfield) + * [Vote (Type 3)](#legacy-vote-type-3) +* [v1 Transactions](#v1) + * [Transfer (Type 0)](#v1-transfer-type-0) + * [Transfer - No VendorField](#v1-transfer-no-vendorfield) + * [Transfer - With VendorField](#v1-transfer-with-vendorfield) + * [Vote (Type 3)](#legacy-vote-type-3) +* [v2 Transactions](#v2) + * [Transfer (Type 0)](#transfer-type-0) + * [Transfer - No VendorField](#transfer-no-vendorfield) + * [Transfer - With VendorField](#transfer-with-vendorfield) + * [Transfer - With VendorField - 137 length](#transfer-with-vendorfield---137-characters) + * [Transfer - With VendorField - 255 length](#transfer-with-vendorfield---255-characters) + * [Second Signature Registration (Type 1)](#second-signature-registration-type-1) + * [Vote (Type 3)](#vote-type-3) + * [Ipfs (Type 5)](#ipfs-type-5) + * [Htlc Lock (Type 8)](#htlc-lock-type-8) + * [Htlc Lock - No VendorField](#htlc-lock-no-vendorfield) + * [Htlc Lock - With VendorField](#htlc-lock-with-vendorfield) + * [Htlc Claim (Type 9)](#htlc-claim-type-9) + * [Htlc Refund (Type 10)](#htlc-refund-type-10) +* [Message](#message-signing) + * [55 Characters](#message-signing-55-characters) + * [90 Characters](#message-signing-90-characters) + * [137 Characters](#message-signing-137-characters) + * [255 Characters](#message-signing-255-characters) + +## Legacy + +### Legacy Transfer (Type 0) + +#### Legacy Transfer: No VendorField + +`python3 examples/example_helper.py --tx 0092ffd30002e012f0a7cac12a74bdc17d844cbc9f637177b470019c32a53cef94c7a56e2ea9178d4aa08afea30cfc61acd261306c67a87c3e1c2e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bac53949010000008096980000000000` + +#### Legacy Transfer: With VendorField + +`python3 examples/example_helper.py --tx 0092ffd30002e012f0a7cac12a74bdc17d844cbc9f637177b470019c32a53cef94c7a56e2ea9178d4aa08afea30cfc61acd261306c67a87c3e1c2e74686973206973206120746573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bac53949010000008096980000000000` + +### Legacy Vote (Type 3) + +`python3 examples/example_helper.py --tx 035706d400025f81956d5826bad7d30daed2b5c8c98e72046c1ec8323da336445476183fb7ca17af33b082a81e338a36d9fb9127597d4fb4e6ef6c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1f505000000002b303263393536353264313665316335653337326531613234313233396663643834666236643261393564313930333063653861616138613635343638313530656439` + +--- + +## V1 + +### v1 Transfer (Type 0) + +#### v1 Transfer: No VendorField + +`python3 examples/example_helper.py --tx ff011e0007627802034151a3ec46b5670a682b0a63394f863587d1bc97483b1b6c70eb58e7f0aed19280969800000000000000c2eb0b00000000000000001e0995750207ecaf0ccf251c1265b92ad84f553662` + +#### v1 Transfer: With VendorField + +`python3 examples/example_helper.py --tx ff011e0007627802034151a3ec46b5670a682b0a63394f863587d1bc97483b1b6c70eb58e7f0aed19280969800000000000b48656c6c6f20576f726c6400c2eb0b00000000000000001e0995750207ecaf0ccf251c1265b92ad84f553662` + +### v1 Vote (Type 3) + +`python3 examples/example_helper.py --tx ff011e0376b87502034151a3ec46b5670a682b0a63394f863587d1bc97483b1b6c70eb58e7f0aed19200e1f50500000000000101022cca9529ec97a772156c152a00aad155ee6708243e65c9d211a589cb5d43234d` + +--- + +## V2 + +### Transfer (Type 0) + +#### Transfer: No VendorField + +`python3 examples/example_helper.py --tx ff0217010000000000010000000000000003a02b9d5fdd1307c2ee4652ba54d492d1fd11a7d1bb3f3a44c4a05e79f19de933809698000000000000a08601000000000000000000171dfc69b54c7fe901e91d5a9ab78388645e2427ea` + +#### Transfer: With VendorField + +>"Hello World" + +`python3 examples/example_helper.py --tx ff02170100000000000300000000000000029f0ab8ab10258144332230178353fa24eb4274370345eaaf1594948a79c8939980969800000000000b48656c6c6f20576f726c64010000000000000000000000173cf7ea59e8d9690e858b7674885b9a4a2c4365d6` + +#### Transfer: With VendorField - 137 characters + +>"The scientists of today think deeply instead of clearly. One must be sane to think clearly, but one can think deeply and be quite insane." + +`python3 examples/example_helper.py --tx ff02170100000000000300000000000000029f0ab8ab10258144332230178353fa24eb4274370345eaaf1594948a79c8939980969800000000008954686520736369656e7469737473206f6620746f646179207468696e6b20646565706c7920696e7374656164206f6620636c6561726c792e204f6e65206d7573742062652073616e6520746f207468696e6b20636c6561726c792c20627574206f6e652063616e207468696e6b20646565706c7920616e6420626520717569746520696e73616e652e010000000000000000000000173cf7ea59e8d9690e858b7674885b9a4a2c4365d6` + +#### Transfer: With VendorField - 255 characters + +>"All parts should go together without forcing. You must remember that the parts you are reassembling were disassembled by you. Therefore, if you can't get them together again, there must be a reason. By all means, do not use a hammer. ~ IBM Manual - (1975)" + +`python3 examples/example_helper.py --tx ff02170100000000000300000000000000029f0ab8ab10258144332230178353fa24eb4274370345eaaf1594948a79c893998096980000000000ff416c6c2070617274732073686f756c6420676f20746f67657468657220776974686f757420666f7263696e672e20596f75206d7573742072656d656d62657220746861742074686520706172747320796f7520617265207265617373656d626c696e67207765726520646973617373656d626c656420627920796f752e205468657265666f72652c20696620796f752063616e277420676574207468656d20746f67657468657220616761696e2c207468657265206d757374206265206120726561736f6e2e20427920616c6c206d65616e732c20646f206e6f742075736520612068616d6d65722e207e2049424d204d616e75616c202d20283139373529010000000000000000000000173cf7ea59e8d9690e858b7674885b9a4a2c4365d6` + +### Second Signature Registration (Type 1) + +`python3 examples/example_helper.py --tx ff0217010000000100020000000000000002e0c063777427ac196af3c426fd648231ebc4ea06fff5edb1652b98f9c8420c690065cd1d000000000002877e4f35c76abaeb152b128670db0a7ae10b3999afcd28a42938b653fbf87ae9` + +### Vote (Type 3) + +`python3 examples/example_helper.py --tx ff0217010000000300020000000000000002555806bca6737eaeaff6434d5171bac8aeb72533ed9bafb280dd11b328a3822d00e1f5050000000000010102555806bca6737eaeaff6434d5171bac8aeb72533ed9bafb280dd11b328a3822d` + +### IPFS (Type 5) + +`python3 examples/example_helper.py --tx ff02170100000005000200000000000000038e000c902d4551065ac5705637c685d52e6ac4032e158ad0370c5ef2bbafae2c0065cd1d000000000012209608184d6cee2b9af8e6c2a46fc9318adf73329aeb8a86cf8472829fff5bb89e` + +### HTLC Lock (Type 8) + +#### HTLC Lock: No VendorField + +`python3 examples/example_helper.py --tx ff02170100000008000200000000000000020d272fab67c179a9e4df4d006344d3ca47fb531b4246b483373940f0603a9216809698000000000000010000000000000009b9a28393efd02fcd76a21b0f0f55ba2aad8f3640ff8cae86de033a9cfbd78c01537bb104177f2a95c7076ea278776d8fcecc5b18e588976da6` + +#### HTLC Lock: With VendorField + +`python3 examples/example_helper.py --tx ff02170100000008000000000000000000034151a3ec46b5670a682b0a63394f863587d1bc97483b1b6c70eb58e7f0aed19280969800000000000b48656c6c6f20576f726c64010000000000000009b9a28393efd02fcd76a21b0f0f55ba2aad8f3640ff8cae86de033a9cfbd78c017a81460517c18e4fdcd78bf9a9eac22e91d52edfeb04bc8e9e` + +### HTLC Claim (Type 9) + +`python3 examples/example_helper.py --tx ff02170100000009000300000000000000039d974aa6feff6a19fde69a8a8b25b991798e98252765a887118ba61218f473a2000000000000000000f84efeab77224af8959301a7185597a7cfbfbc9a4d99cb021af62f3714feb9d36635656138373761333131636564393063663435323463623438396539373266` + +### HTLC Refund (Type 10) + +`python3 examples/example_helper.py --tx ff0217010000000a000300000000000000037fc2e14f626586722a4f9e00dca2efbc4ac409c1ca63bc4309f56184265f95d5000000000000000000c62bd36c162dd0116a08bf8a75cd6d1f83b8f5f1e17e89c8231ebb7af595f64d` + +## Message Signing + +### Message Signing: 55 characters + +`python3 examples/example_helper.py --message 57686174207765206b6e6f7720697320612064726f702c207768617420776520646f6e2774206b6e6f7720697320616e206f6365616e2e` + +### Message Signing: 90 characters + +`python3 examples/example_helper.py --message 57652063616e206f6e6c792073656520612073686f72742064697374616e63652061686561642c206275742077652063616e2073656520706c656e74792074686572652074686174206e6565647320746f20626520646f6e652e` + +### Message Signing: 137 characters + +`python3 examples/example_helper.py --message 54686520736369656e7469737473206f6620746f646179207468696e6b20646565706c7920696e7374656164206f6620636c6561726c792e204f6e65206d7573742062652073616e6520746f207468696e6b20636c6561726c792c20627574206f6e652063616e207468696e6b20646565706c7920616e6420626520717569746520696e73616e652e` + +### Message Signing: 255 characters + +`python3 examples/example_helper.py --message 416c6c2070617274732073686f756c6420676f20746f67657468657220776974686f757420666f7263696e672e20596f75206d7573742072656d656d62657220746861742074686520706172747320796f7520617265207265617373656d626c696e67207765726520646973617373656d626c656420627920796f752e205468657265666f72652c20696620796f752063616e277420676574207468656d20746f67657468657220616761696e2c207468657265206d757374206265206120726561736f6e2e20427920616c6c206d65616e732c20646f206e6f742075736520612068616d6d65722e207e2049424d204d616e75616c202d20283139373529` + + + + + + + + From dce8a6d326c9fd541d551252516bffd0b698aacf Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 8 Feb 2020 15:16:33 -0800 Subject: [PATCH 3/3] release: ARK Ledger App v.2.0.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary 
While there are no breaking changes from a users perspective, this release includes a massive rewrite of the project.
 Specific objectives accomplished within this release:
 - Support ARK Core v2 Transactions. - Support Message Signing. - Merge changes from `LedgerHQ/ledger-app-ark`. - Update the ARK Ledger App to use Ledger Nano FW v.1.6.0. - Implement optimized Base58 from Ledger BTC App. - Improve overall project layout.
 - Add files to support development environment setup using Vagrant. - Update documentation.

 Significant changes can be found in the CHANGELOG, as well as the following pull requests:
 - added message signing features [#40](https://github.com/ArkEcosystem/ledger/pull/40) - implement v2 Transactions [#27](https://github.com/ArkEcosystem/ledger/pull/27) - added VendorField display support [#29](https://github.com/ArkEcosystem/ledger/pull/29) - added build options and documentation [#32](https://github.com/ArkEcosystem/ledger/pull/32) - merged updates from LedgerHQ/ledger-app-ark [#23](https://github.com/ArkEcosystem/ledger/pull/23) - cleaned up warnings and refactored implementation [#25](https://github.com/ArkEcosystem/ledger/pull/25) - upgraded `nanos-secure-sdk` version `1553` -> `160` [#46](https://github.com/ArkEcosystem/ledger/pull/46) - refactor transactions classes to decouple Ledger SDK code [#51](https://github.com/ArkEcosystem/ledger/pull/51) - unify Ledger NanoS and NanoX ux display flow [#53](https://github.com/ArkEcosystem/ledger/pull/53) - implement support for large text fields [#55](https://github.com/ArkEcosystem/ledger/pull/55) - use optimized Base58 implementation from Ledger BTC app [#66](https://github.com/ArkEcosystem/ledger/pull/66) ## Supported in v.2.0.0 ### Transaction Versions: - v0 - v1 (_added_) - v2 (_added_) ### Signing Algorithms: - Ecdsa ### Operation Types: - Get PublicKey - Get App Configuration - Sign Message (_added_) - Sign Transaction ### Transaction Types: - v0 - Transfer - Vote - v1 (_added_) - Transfer - Vote - v2 (_added_) - Transfer - Second Signature Registration - Vote - IPFS - Htlc Lock - Htlc Claim - Htlc Refund ## Checklist - [x] Documentation _(if necessary)_ - [x] Ready to be merged ## Additional Discussion This patch release adds #66 to #65 --- CHANGELOG.md | 4 ++-- Makefile | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1f9737a..b0e8f533 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [2.0.1] - 2020-02-08 ### Changed - use optimized Base58 implementation from Ledger BTC app ([#66]) @@ -38,4 +38,4 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. [#55]: https://github.com/ArkEcosystem/ledger/pull/53 [2.0.0]: https://github.com/ArkEcosystem/ledger/compare/master...2.0.0 [#66]: https://github.com/ArkEcosystem/ledger/pull/66 -[unreleased]: https://github.com/ArkEcosystem/ledger/compare/master...develop +[2.0.1]: https://github.com/ArkEcosystem/ledger/compare/master...2.0.1 diff --git a/Makefile b/Makefile index 8851ac45..c4928ad6 100644 --- a/Makefile +++ b/Makefile @@ -52,7 +52,7 @@ APP_LOAD_PARAMS=--appFlags 0x240 --curve secp256k1 --path "44'/111'" --path "44' APPVERSION_M=2 APPVERSION_N=0 -APPVERSION_P=0 +APPVERSION_P=1 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) ifeq ($(TARGET_NAME),TARGET_BLUE)