Skip to content
This repository has been archived by the owner on Jun 7, 2023. It is now read-only.

Node Quorum #631

Merged
merged 33 commits into from
Dec 20, 2018
Merged

Conversation

laumair
Copy link
Contributor

@laumair laumair commented Nov 22, 2018

Description

Fixes # #453

Depends on iotaledger/iota.js#314

  • wereAddressesSpentFrom - Compute a quorum result from multiple nodes. Fallback to true if there is no consensus among results.
  • getInclusionStates - First compute a quorum result for latestSolidSubtangleMilestone, then compute a quorum for inclusion states by using the agreed latestSolidSubtangleMilestone as a tip. Fallback to false if there is no consensus among results.
  • getBalances - Similar to getInclusionStates. First compute a quorum result for latestSolidSubtangleMilestone, then compute a quorum for balances by using the agreed latestSolidSubtangleMilestone as a tip. Fallback to '0' if there is no consensus among results.
  • getTrytes - Compute a quorum result from multiple nodes. Fallback to null hash trytes if there is no consensus among results.
  • findTransactions - The strategy for determining a quorum result for this endpoint is different than the rest. Computing a quorum forfindTransactions simply prepare a set of unique hashes from multiple nodes.

Type of change

  • Enhancement

How Has This Been Tested?

TODO

Checklist:

Please delete items that are not relevant.

  • My code follows the style guidelines for this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes
  • For changes to mobile that include native code (including React Native modules): I have verified that both iOS and Android successfully build in both Debug and Release modes
  • For changes to shared: If applicable, I have verified that my changes are implemented correctly in desktop and mobile

@laumair laumair added T - Enhancement New feature or request C - Shared E - Security Epic - Security related L - WIP Lifecycle - Work in Progress E - Functional Epic - Relating to how a feature works labels Nov 22, 2018
@alon-e alon-e self-requested a review December 12, 2018 18:11
Copy link

@alon-e alon-e left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks great!
requested changes mostly b/c comment doesn't affect review count.

my main open question is if there is a timeout for unresponsive nodes (to mark invalid).

*
* @method determineQuorumResult
* @param {array} validResults
* @param {number} faultyResultCount
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this changed in the impl (to quorumSize), but not the JSDocs.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch. Fixed.

src/shared/libs/iota/quorum.js Show resolved Hide resolved
*
* @returns {function}
**/
const determineQuorumResult = (validResults, quorumSize = QUORUM_SIZE) => {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

how are valid results defined? (what is an invalid result, if someone did not answer?)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's correct. Invalid results are basically the results from unresponsive nodes.

If there's a network error, we explicitly mark the result as undefined here and later on filter these results.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To clarify that this is intentional (seems good to me)
the quorum is calculated only within the responsive nodes.
this should be mentioned somewhere - b/c it changes the strategy to attack the quorum.

for example:

N = 7
m = 3 (malicious)
scenario A:
all m vote No
all honest vote Yes
Result: 4/7= FailSafe

scenario B:
2 m vote "unresponsive"
1 m votes No
all honest vote Yes
Result: 3/4= Yes

so the best stratagy is to participate.
OTOH,
if the malicious nodes manage to kick off honest nodes (the will become uresponsive), they can pass bad elections:


scenario C:
3 m vote No
2 honest vote Yes
2 honest vote "unresponsive" due to malice
Result: 3/5= No
(well that's cutting it close, but you get the drift)

to give a full picture - anouther option would be to have "unresponsive" vote FailSafe.
but propbably needs some analysis as well.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the quorum is calculated only within the responsive nodes.

The quorum is not calculated within the responsive nodes. Unresponsive nodes would also be considered. Explicitly passing undefined as a result for unresponsive nodes is just to easily filter out invalid results.

Quorum calculation would always be out of N (N === quorumSize).

scenario B:
2 m vote "unresponsive"
1 m votes No
all honest vote Yes
Result: 3/4= Yes

In this case, result would be 3/N.

anouther option would be to have "unresponsive" vote FailSafe.

IIUC, then always calculating quorum out of N basically does the same?

Copy link

@alon-e alon-e Dec 14, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The quorum is not calculated within the responsive nodes. Unresponsive nodes would also be considered. Explicitly passing undefined as a result for unresponsive nodes is just to easily filter out invalid results.

oh, so that is confusing -

That's correct. Invalid results are basically the results from unresponsive nodes.

the param validResults sounds like it's only the.. well ... valid results. filtering the unresponsive nodes.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh, so quorumSize = QUORUM_SIZE is N, regardless of the size of validResults - 👍
maybe worth another pass to make it a bit clearer :)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh, so quorumSize = QUORUM_SIZE is N, regardless of the size of validResults

That's correct. I'll make another commit to make it clearer. Sorry about the confusion.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should improve the readability of the overall implementation.

const whitelistedNodes = filter(nodes, (node) => !includes(blacklistedNodes, node) && !includes(syncedNodes, node));

if (isEmpty(whitelistedNodes)) {
return Promise.reject(new Error(Errors.NOT_ENOUGH_HEALTHY_QUORUM_NODES));
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

could it be that case that syncedNodes is large enough -> |syncedNodes| = quorumSize, and this is the reason that isEmpty(whitelistedNodes) ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That was actually a minor bug. Thank you.

The only reason why this should reject is if there no whitelisted nodes and we still need to fill up synced nodes to reach the quorum size. Have fixed it here .

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also added test coverage for this.

*
* @returns {Promise}
**/
const getQuorumForWereAddressesSpentFrom = (payload, syncedNodes) => {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the following 4 (?) functions are duplicates except for the method name (which is used to invoke the API and get the safe default).

could this be done using the method as an argument? and have only 1 copy of this function, the reason being that this mechanism is new and might need to be tweaked, maintaining all the copies is a hassle and would lead to errors.

and later adding more methods to quorum would be easier as well.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great suggestion.

One reason why I avoided doing that in the first place is because some methods (e.g. getBalances, getNodeInfo) response is not a plain array of booleans like the rest of the methods (wereAddressesSpentFrom, getLatestInclusion). However, it's not a big problem. I agree that all four methods had duplication and maintaining all four would be a hassle.

Have simplified the implementation. Now, there's only a single function that serves all four endpoints and also a separate function for preparing results.

Reason why I decoupled preparation of results from #getQuorum is because it would be a lot easier to unit test both separately.


while (idx < requestPayloadSize) {
/* eslint-disable no-loop-func */
quorumResult.push(
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IIUC, if the request is for L addresses the Quorom is determined for each address separately, correct?
if so, that's great! (what I envisioned) but it should be clearly stated (in the JSDocs?)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's correct. Quorum is determined for each address separately.
Have added better code comments and also have updated JSDocs.

syncedNodes,
(provider) =>
new Promise((resolve) => {
new IOTA({ provider }).api.wereAddressesSpentFrom(
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does this have some type of timeout? so err (or valid response) is promised to be returned eventually?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It will eventually timeout (because of the addition here) and an error or a valid response is guaranteed.

*/
getLatestInclusion(hashes) {
return findSyncedNodesIfNecessary().then((newSyncedNodes) =>
getQuorumForLatestSolidSubtangleMilestone(newSyncedNodes).then((latestSolidSubtangleMilestone) =>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this addition is worth mentioning somewhere - in the JSDocs (same for getBalances)

Copy link
Contributor Author

@laumair laumair Dec 14, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you mean documentation for first getting quorum results for latestSolidSubtangleMilestone? Have updated JSDocs for this method also for getBalances.

const validResults = filter(results, (result) => !isUndefined(result));

// Get quorum result for latest solid subtangle milestone
const latestSolidSubtangleMilestone = determineQuorumResult(
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit-pick, but this should follow the structure of the code above, it makes maintenance harder (I understand that there is no payload and the response is a single value)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good suggestion. As mentioned here, the pattern is now consistent with these changes.

// If nodes cannot agree on the latestSolidSubtangleMilestone
// Then just throw an exception
if (latestSolidSubtangleMilestone === EMPTY_HASH_TRYTES) {
// TODO (laumair): Might need to replace the error message here.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good idea :)

- Update JSDoc typos
- Simplify quorum implementation (Remove duplications)
- Add a timeout for network request to each node
- Fix issues in findSyncedNodes implementation
- Update error messages
- Add coverage for #determineQuorumResult
- Add coverage for #fallbackToSafeResult
- Add coverage for #findSyncedNodes
@laumair
Copy link
Contributor Author

laumair commented Dec 14, 2018

@alon-e Thank you for your review.

my main open question is if there is a timeout for unresponsive nodes (to mark invalid).

This was indeed missing. Have fixed it here. getIotaInstance sets the default timeout.

Co-Authored-By: laumair <aquadestructor@icloud.com>
@laumair laumair changed the base branch from develop to mobile-alpha/quorum December 19, 2018 04:22
laumair and others added 6 commits December 19, 2018 14:36
…ndex) (iotaledger#824)

Object.keys(<object>) function does not always preseve the order, especially if the object key starts with a number. This causes an issue when Object.keys is used for iterating on account names. iotaledger#715 adds account indexes to state to make sure the order of accounts is always intact. However, some components in desktop use Object.keys directly on accounts object, which leads to certain issues of incorrect references to accounts. This commit fixes this issue by replacing Object.keys implementation on accounts with getAccountNamesFromState selector that guarantees the accounts order.

Fixes iotaledger#811

Note that the issues Object.keys create are not always noticeable. Steps to reproduce these issues are:

- Add account with name "M"
- Add another account with name "0"
- Notice account names order in sidebar (Instead of "0" being the second account, it becomes the first)
- Generate receive address from account "M" (Instead of generating receive address for account "M", it generates receive address for account "0")
* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Japanese)

* New translations translation.json (Spanish)
@cvarley100 cvarley100 changed the base branch from mobile-alpha/quorum to mobile-0.6.0-alpha-quorum December 20, 2018 12:57
@cvarley100 cvarley100 assigned cvarley100 and unassigned cvarley100 Dec 20, 2018
@cvarley100 cvarley100 self-requested a review December 20, 2018 16:30
@@ -44,3 +44,7 @@ export const NODE_REQUEST_TIMEOUT = 6000 * 2;
export const DEFAULT_RETRIES = 4;

export const IRI_API_VERSION = '1';

export const QUORUM_THRESHOLD = 67;
export const QUORUM_NODES_SIZE = 7;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can change the variable names here

Suggested change
export const QUORUM_NODES_SIZE = 7;
export const QUORUM_SIZE = 7;

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resolved here


export const QUORUM_THRESHOLD = 67;
export const QUORUM_NODES_SIZE = 7;
export const QUORUM_NODES_SYNC_CHECKS_INTERVAL = 120;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
export const QUORUM_NODES_SYNC_CHECKS_INTERVAL = 120;
export const QUORUM_SYNC_CHECK_INTERVAL = 120;

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resolved here

import {
QUORUM_THRESHOLD,
QUORUM_NODES_SIZE,
QUORUM_NODES_SYNC_CHECKS_INTERVAL,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
QUORUM_NODES_SYNC_CHECKS_INTERVAL,
QUORUM_SYNC_CHECK_INTERVAL,

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resolved here

import { isNodeHealthy, getIotaInstance } from './extendedApi';
import {
QUORUM_THRESHOLD,
QUORUM_NODES_SIZE,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
QUORUM_NODES_SIZE,
QUORUM_SIZE,

* @param {number} quorumSize
* @returns {Promise}
*/
const rejectIfNotEnoughSyncedNodes = (nodes, quorumSize = QUORUM_NODES_SIZE) => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
const rejectIfNotEnoughSyncedNodes = (nodes, quorumSize = QUORUM_NODES_SIZE) => {
const rejectIfNotEnoughSyncedNodes = (nodes, quorumSize = QUORUM_SIZE) => {

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resolved here

return isEmpty(addresses)
? Promise.resolve([])
: findSyncedNodesIfNecessary().then((newSyncedNodes) =>
getQuorum('wereAddressesSpentFrom', newSyncedNodes, addresses),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
getQuorum('wereAddressesSpentFrom', newSyncedNodes, addresses),
getQuorum('wereAddressesSpentFrom', syncedNodes, addresses),

getLatestInclusion(hashes) {
return isEmpty(hashes)
? Promise.resolve([])
: findSyncedNodesIfNecessary().then((newSyncedNodes) =>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
: findSyncedNodesIfNecessary().then((newSyncedNodes) =>
: findSyncedNodesIfNecessary().then((syncedNodes) =>

// No need to proceed further.
.then(rejectIfEmptyHashTrytes)
.then((latestSolidSubtangleMilestone) =>
getQuorum('getInclusionStates', newSyncedNodes, hashes, [latestSolidSubtangleMilestone]),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
getQuorum('getInclusionStates', newSyncedNodes, hashes, [latestSolidSubtangleMilestone]),
getQuorum('getInclusionStates', syncedNodes, hashes, [latestSolidSubtangleMilestone]),

return isEmpty(addresses)
? Promise.resolve([])
: findSyncedNodesIfNecessary().then((newSyncedNodes) =>
getQuorum('getNodeInfo:latestSolidSubtangleMilestone', newSyncedNodes)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
getQuorum('getNodeInfo:latestSolidSubtangleMilestone', newSyncedNodes)
getQuorum('getNodeInfo:latestSolidSubtangleMilestone', syncedNodes)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resolved here

// No need to proceed further.
.then(rejectIfEmptyHashTrytes)
.then((latestSolidSubtangleMilestone) =>
getQuorum('getBalances:balances', newSyncedNodes, addresses, threshold, [
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
getQuorum('getBalances:balances', newSyncedNodes, addresses, threshold, [
getQuorum('getBalances:balances', syncedNodes, addresses, threshold, [

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resolved here

@laumair laumair merged commit ed56029 into iotaledger:mobile-0.6.0-alpha-quorum Dec 20, 2018
cvarley100 added a commit that referenced this pull request Jan 15, 2019
* Mobile: Fix bar colours

* Mobile: Add new receive page UI

* Mobile: Clear timeouts on unmount

* Mobile: Adjust receive page animations

* Mobile: Rename component

* Mobile: Fix progress bar on fingerprint authentication

* Mobile: Fix topbar spacing

* Mobile: Fix topbar opacity when disabled

* Mobile: Fix Android alert padding when modal is open

* Shared: Localise strings

* Mobile: Update transaction history modal buttons

* Mobile: Adjust topbar scrollable

* Node Quorum (#631)

* Implement quorum for wereAddressesSpentFrom

* Simply #findSyncedNodes implementation

* Add quorum support for getBalances IRI endpoint

* Minor updates

- Add quorum support for getTrytes IRI endpoint
- Minor clean up in quorum methods

* Add quorum support for findTransactions IRI endpoint

* Rename quorum methods for better readability

* Integrate quorum methods with extended api

* Remove findTransactions & getTrytes endpoints from quorum

* Refactor quorum implementation and do minor fixes

- Update JSDoc typos
- Simplify quorum implementation (Remove duplications)
- Add a timeout for network request to each node
- Fix issues in findSyncedNodes implementation
- Update error messages

* Add coverage
- Add coverage for #determineQuorumResult
- Add coverage for #fallbackToSafeResult
- Add coverage for #findSyncedNodes

* Add empty payload checks in quorum methods

* Wrap percentage calculation in parentheses for clarity

Co-Authored-By: laumair <aquadestructor@icloud.com>

* Use develop branch of iota.lib.js

* Enforce quorum (by default) on supported methods

* Fix tests failing because of quorum enforcement

* Add code documentation and rename parameters & variables for clarity

- Related discussion #631 (comment)

* [Security] Bump cryptiles from 3.1.2 to 3.1.4 (#829)

* [Security] Bump nokogiri from 1.8.4 to 1.9.1 in /src/mobile/android (#828)

* Make sure accounts are always iterated in correct order (by account index) (#824)

Object.keys(<object>) function does not always preseve the order, especially if the object key starts with a number. This causes an issue when Object.keys is used for iterating on account names. #715 adds account indexes to state to make sure the order of accounts is always intact. However, some components in desktop use Object.keys directly on accounts object, which leads to certain issues of incorrect references to accounts. This commit fixes this issue by replacing Object.keys implementation on accounts with getAccountNamesFromState selector that guarantees the accounts order.

Fixes #811

Note that the issues Object.keys create are not always noticeable. Steps to reproduce these issues are:

- Add account with name "M"
- Add another account with name "0"
- Notice account names order in sidebar (Instead of "0" being the second account, it becomes the first)
- Generate receive address from account "M" (Instead of generating receive address for account "M", it generates receive address for account "0")

* New Crowdin translations [ci skip] (#826)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Japanese)

* New translations translation.json (Spanish)

* Mobile: Update findSyncedNodes

* Update quorum.js

* Improve parameters and variable names

* Include custom nodes in quorum nodes

* Reduce node request timeout for getNodeInfo api calls (in quorum)

* Mobile: Minor cleanup

* Mobile: Bump build numbers for release v0.6.0 (33) (#808)

* Mobile: Bump build no

* Mobile: Bump build numbers for release 0.6.0 (35) (#844)

* Mobile: Fix account name opacity during certain tasks

* Mobile: Adjust chart animations

* Mobile: Adjust chart timeframe order

* Mobile: Fix View Addresses scrollable area

* Fix failing tests (#879)

* Mobile: Fix issues with animations in settings (#881)

* Mobile: Fix settings animations issues

* Mobile: Fix settings animations issues

* Mobile: Fade out on logout

* Mobile: Fix login animation direction

* Mobile: Remove unused prop

* Mobile: Fix notification icon when modal is open

* Mobile: Fix retry text opacity during promotion

* Quorum refinements (#884)

* Remove unnecessary node sync checks

With quorum integration, some node sync checks are now unnecessary as quorum will ensure we always query synced nodes. This commit removes these checks.

* Use default timeout for getNodeInfo while checking node's health

* Disable quorum for getLatestInclusion (#900)

- Add node health checks for account sync utils because getLatestInclusion support for quorum is (temporarily) disabled.

* Mobile: Add request-specific timeouts to quorum

* Mobile: Add request-specific timeouts to quorum (#903)

* Mobile: Add request-specific timeouts to quorum

* Mobile: Update GET_NODE_INFO_REQUEST_TIMEOUT in config

* Alpha 0.6.0 (36) Release (#904)

* Mobile: Add request-specific timeouts to quorum

* Mobile: bump build no

* Fix findSyncedNodes implementation (#915)

findSyncedNodes wasn't filtering unsynced nodes from selected nodes in one case. This commit fixes the issue.

* Fix modal layout issues on Android and iPhone X (#916)

* Mobile: Add request-specific timeouts to quorum

* Mobile: Fix modal layout issues and refactor

* Update src/mobile/src/ui/components/ModalView.js

Co-Authored-By: cvarley100 <cvarley100@gmail.com>
@laumair laumair mentioned this pull request Jan 17, 2019
@laumair laumair deleted the feat/quorum branch February 15, 2019 10:12
cvarley100 added a commit that referenced this pull request Feb 26, 2019
* Mobile: Fix bar colours

* Mobile: Add new receive page UI

* Mobile: Clear timeouts on unmount

* Show desktop window only after persisted state has been restored

* Send payload only if provided

* Mobile: Adjust receive page animations

* Mobile: Rename component

* Mobile: Fix progress bar on fingerprint authentication

* Mobile: Fix topbar spacing

* Mobile: Fix topbar opacity when disabled

* Mobile: Fix Android alert padding when modal is open

* Shared: Localise strings

* Mobile: Update transaction history modal buttons

* Mobile: Adjust topbar scrollable

* Node Quorum (#631)

* Implement quorum for wereAddressesSpentFrom

* Simply #findSyncedNodes implementation

* Add quorum support for getBalances IRI endpoint

* Minor updates

- Add quorum support for getTrytes IRI endpoint
- Minor clean up in quorum methods

* Add quorum support for findTransactions IRI endpoint

* Rename quorum methods for better readability

* Integrate quorum methods with extended api

* Remove findTransactions & getTrytes endpoints from quorum

* Refactor quorum implementation and do minor fixes

- Update JSDoc typos
- Simplify quorum implementation (Remove duplications)
- Add a timeout for network request to each node
- Fix issues in findSyncedNodes implementation
- Update error messages

* Add coverage
- Add coverage for #determineQuorumResult
- Add coverage for #fallbackToSafeResult
- Add coverage for #findSyncedNodes

* Add empty payload checks in quorum methods

* Wrap percentage calculation in parentheses for clarity

Co-Authored-By: laumair <aquadestructor@icloud.com>

* Use develop branch of iota.lib.js

* Enforce quorum (by default) on supported methods

* Fix tests failing because of quorum enforcement

* Add code documentation and rename parameters & variables for clarity

- Related discussion #631 (comment)

* [Security] Bump cryptiles from 3.1.2 to 3.1.4 (#829)

* [Security] Bump nokogiri from 1.8.4 to 1.9.1 in /src/mobile/android (#828)

* Make sure accounts are always iterated in correct order (by account index) (#824)

Object.keys(<object>) function does not always preseve the order, especially if the object key starts with a number. This causes an issue when Object.keys is used for iterating on account names. #715 adds account indexes to state to make sure the order of accounts is always intact. However, some components in desktop use Object.keys directly on accounts object, which leads to certain issues of incorrect references to accounts. This commit fixes this issue by replacing Object.keys implementation on accounts with getAccountNamesFromState selector that guarantees the accounts order.

Fixes #811

Note that the issues Object.keys create are not always noticeable. Steps to reproduce these issues are:

- Add account with name "M"
- Add another account with name "0"
- Notice account names order in sidebar (Instead of "0" being the second account, it becomes the first)
- Generate receive address from account "M" (Instead of generating receive address for account "M", it generates receive address for account "0")

* New Crowdin translations [ci skip] (#826)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Japanese)

* New translations translation.json (Spanish)

* Mobile: Update findSyncedNodes

* Update quorum.js

* Improve parameters and variable names

* Include custom nodes in quorum nodes

* Reduce node request timeout for getNodeInfo api calls (in quorum)

* Mobile: Minor cleanup

* Mobile: Bump build numbers for release v0.6.0 (33) (#808)

* Mobile: Bump build no

* Mobile: Fix account name opacity during certain tasks

* Mobile: Adjust chart animations

* Mobile: Adjust chart timeframe order

* Shared: Rebuild realm after installing dependencies (#842)

* Remove undefined i18next translate function from progressSteps

* Mobile: Replace seed and password usage with global instance

* Mobile: Add ability to force GC on iOS

* Mobile: Work on forced garbage collection for Android

* Mobile: Link Android GarbageCollector

* Update prepateTransferArray implementation to accept addressData as an array instead of an object

* Minor fixes and updates

- Remove manual state rehydration from src/desktop/src/index.js
- Pass in theme object to UnitInfoModal
- Fix JSDocs for addCustomNodeSuccess action creator
- Fix notificationFn trigger in syncAccount
- Relocate mapNormalisedTransactions util

* Always find transaction hashes diff from transactions with own addresses

* Update UI for migration screen

* Assign index & meta to account object during migration

* Use buildNumber for detecting & triggering redux->realm migration

* Shared: Ignore chownr vulnerability in Snyk

* Desktop: Realm Database implementation Desktop fixes (#874)

* Desktop related fixes:
- Fix balance setting in `Balance` and `Sidebar` components
- Fix latest address retrieval
- Fix notification function
- Fix List component transaction list retrieval

* Remove `reverse` from account address list

* Mobile: Resolve lint errors

* Revert 5291972 and fix eslint config (see eslint/eslint#11231)

* Fix failing tests for libs/iota/accounts

* Fix checksum for latestAddressObject & add a separate constant for latestAddressBalance

* Fix attachAndFormatAddresses util implementation

* Mobile: Fix migration step strings

* Mobile: Update prop types

* Shared: Fix documentation for delete and addNodes

* Remove hash as a primary key from Transaction schema

* Add realm-object-server/ to gitignore

* Bump realm to v2.21.1

* Update Transaction schema

- Add attachmentTimestamp
- Add attachmentTimestampLowerBound
- Add attachmentTimestampUpperBound
- Add obsoleteTag

* Minor fixes

- Map correct persistence to normalised transactions
- Fix parameters for constructBundleFromTransactions util

* Minor fixes

- Make completedMigration a required prop in Login & Migration component
- Make sure missing properties like completedMigration are correctly mapped to redux store on entry

* Include version check on app entry

* Minor fixes and updates

- Update method description for realm Wallet class method updateLatest
- Rename setMigrationStatus action creator to setRealmMigrationStatus

* Desktop: Realm Database - remove redux persist settings dependency (#877)

* Update tray application state sync and initialisation

* Update Proxy settings to use separate electronSettings entry

* Shared: Fix periodically failing sortTransactionTrytesArray test (#878)

* Shared: Fix periodically failing sortTransactionTrytesArray test

* Shared: Make recommended changes

* Remove unnecessary assert statements

* Mobile: Use delete operator instead of nulling out secret references

* Mobile: Move seed storage to byte array, update secret handling, store seed against account name hash

* Mobile: Use secure method of inactivity logout

* Mobile: Fix password fields error

* Mobile: Remove password field from redux

* Mobile: Do not pass seed to redux when adding additional seed

* Fix skipped tests for #isNodeHealthy

* Fix skipped tests

* Update build number check realm migration detection

* Update build number to 40 for migration detection check

* Add missing getCustomNodesFromState state selector

* Pass nodes array in correct format to quorum methods

* Migrate accountIndex property for account from AsyncStorage to realm

* Remove primary key (address) from AddressSchema

* Fix invalid bundle construction for failed transactions

* Preserve local spend status before updating account data in realm

* Refactor #getFullAddressHistory tests

* Make sure we fetch persisted account indexes from realm

* Check for undefined addressData prop before updating address data in realm

* Realm data encryption (#1018)

* Add base setup for realm data encryption

* Pass #getEncryptionKeyPromise when storage is reinitialised

* Store realm encryption key in keychain

* Initialise realm instance with encryption key in tests

* Store realm encryption key in keychain

* Address comments

- Remove base64-js
- Perform Uint8Array to string conversions with vanilla JS

* Skip realm encryption key to be reset on password change

* Simplify #getEncryptionKey implementation

* Update build number to 41 for migration detection check

* Mobile: Fix notification icon touch radius

* Include isRetryingFailedTransaction in modalProps when modalProps are updated

* Move manual bundle construction implementation (for failed transactions) in constructBundlesFromTransactions

* Mobile: Fix iPhone X modal visual bug

* Mobile Release 0.4.1 (41) (#1029)

* Mobile: Bump build number to 41

* Mobile: Bump Realm migration versioning

* Shared: Only rebuild Realm on Debian

* Correctly assign new account name in realm storage (#1045)

* Update isFailedTransaction prop when modal props are updated (#1046)

* Mobile: Add retry button, error log and change node to Realm migration (#1041)

* Mobile: Add ability to change node and retry during migration

* Mobile: Address comments

* Mobile: Fix notification button import and padding

* Mobile: Disable iOS pop gesture

* Mobile Release 0.6.1 (42) (#1048)

* Mobile: Bump build no to 42

* Mobile: Update realm migration versioning

* Mobile: Add logout HOC. Full logout after 30 minutes inactivity

* Realm Database implementation desktop bugfixes (#1025)

* - Fix Realm storage path
- Add missing wallet reset triggers
- Fix address component prop use
- Remove failed bundle hash action

* Update Realm path for test environment

* - Remove Realm instance init from Tray application
- Keep Realm encryption key on keychain initialisation

* Focus wallet window after initial store update

* Add missing Windows required dependency

* Mobile: Add new Entangled trit methods and intergrate Android

* Mobile: Use correct bundle hash encoding for native signatures in Android

* Mobile: Remove unused imports

* Mobile: Update password/seed handling by text inputs

* Mobile: Update text input handling of secrets

* Mobile: Fix QR Scan

* Mobile: Fix text inputs and SeedVault

* Mobile: Fix view seed

* Mobile: Fix write seed down

* Desktop: Create Migration component to migrate data (#857)

* Desktop: Create Migration component to migrate data

* Desktop: Add 'history' to PropTypes

* Desktop: Document getAllStorageKeys

* - Fix Realm storage path
- Add missing wallet reset triggers
- Fix address component prop use
- Remove failed bundle hash action

* Update Realm path for test environment

* - Remove Realm instance init from Tray application
- Keep Realm encryption key on keychain initialisation

* Focus wallet window after initial store update

* Add missing Windows required dependency

* Move Migration to `ui/global`

* Migration bugfixes

* Desktop: Fix off-by-one mistake on Migration component

* Code review fixes

* Fix Wallet reset functionallity

* Mobile: SeedVault, ViewSeed and reentry fixes

* Mobile: Store seed as basic trit array

* Mobile/iOS: Rebuild Entangled with new bindings

Ref: rajivshah3/entangled@5a11ee1

* Mobile: Add seed storage migration and update hashing

* Mobile: Remove garbage collector

* Mobile: Remove gc comments and unnecessary null outs

* Mobile: Fix isUniqueSeed

* Mobile: Fix wallet reset

* Mobile: Fix empty text input issues

* Mobile: Fix prop warning

* Mobile: Fix seed reentry

* Batched proof-of-work (#1071)

* Rebuild entangled android

Commit used: iotaledger/entangled@84f7446
PR: iotaledger/entangled#810

* Add batched proof-of-work methods in EntangledAndroid native module

* Integrate entangled batched proof-of-work methods

* Fix failing tests

* Shared: Update comment

* Mobile: Clear reset timeout

* Mobile: Update gitignore

* Fix account duplication on account rename operation (#1077)

Related issue: #1066

* Mobile: Reorder seed storage check on login

* Mobile: Readd react-native-translucent-moddal (#1083)

* Mobile: Fix up migration

* Mobile/iOS: Rebuild Entangled with new bindings

* Mobile/iOS: Update EntangledIOS RCT_EXPORT_METHODS

* Shared: Update config

* Mobile: Fix migration

* Mobile: Add ios-specific hashing method

* Mobile: Fix seed migration detection

* Fix invalid address data issue (#1089)

Interrupting new account onboarding (on loading screen) leads wallet to throw continuous exceptions. The reason for exceptions was missing "completed" property in realm schema. This commit fixes the issue and also adds realm migration from schema version 0 to latest schema.

* Fix invalid bundle issue on zero value transaction with bundle size > 1 (#1093)

* Integrate native signing (android)

* Mobile: Link translucent modal

* Mobile: Link translucent modal library

* Mobile: Fix failing test

* Mobile: Fix transaction history account mismatch

* Update rn-nodeify

* Add @iota/signing to yarn resolutions

* Mobile: Fix promotion/retry

* Shared: Fix migration when app is first installed (#1098)

* Link @iota/signing iOS

* Mobile: Fix wallet reset crash

* Minor updates

* Use prepareTransfersAsync method in promoteTransaction

* Mobile/iOS: Fix code signing

* Update @iota/core

* Mobile/Android: Rebuild Entangled library (#1109)

Ref: iotaledger/entangled@e63422b

* Mobile: Fix bundle storage order (#1108)

* Desktop: Bump entangled-node to fix failing CI

* New translations translation.json (German)

* New translations translation.json (Polish)

* New translations translation.json (Polish)

* Mobile/iOS: Fix bugs in Entangled methods (#1100)

* Mobile/iOS: Fix multi-address generation

* Shared: Fix migration when app is first installed

* Mobile/iOS: Create trit array conversion utils, fix address gen bugs

* Mobile/iOS: Remove unnecessary printf statements

* Mobile/iOS: Fix memory leaks in multi-address generation

* Mobile/iOS: Fix signature generation bugs

* Mobile/iOS: Rebuild EntangledKit framework

Ref: rajivshah3/entangled@f894cd8

* Mobile/iOS: Fix single-address generation bugs

* Mobile/Android: Remove libc++_shared.so and libjsc.so

* Shared: Revert gitignore edits

* Mobile: Fix qr message input

* Mobile: Remove unnecessary deletes and add necessary deletes

* Resolve conflicts

* Mobile: Temporarily convert to trytes for checksum

* Mobile: Fix lockfile

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Slovak)

* New translations translation.json (Slovak)

* New translations translation.json (Slovak)

* New translations translation.json (Slovak)

* New translations translation.json (Slovak)

* New translations translation.json (Slovak)

* New translations translation.json (Chinese Simplified)

* Fix invalid mnemonic issue occurring on realm initialization (#1113)

* Mobile: Increase seed migration timeout to 7.5s

* Mobile: Fix empty password checks

* Mobile: Add additional seed reentry check

* Mobile: Bump versioning to 0.6.2

* Mobile/iOS: Fix code signing

* Shared, Mobile: Bump @iota/signing and other packages to 1.0.0-alpha.a09e7908

* Mobile: Patch Buffer.prototype.slice to prevent Android crash

* Mobile: Bump build numbers for alpha release 0.6.2 (45)

* Mobile/Android: Fix HTTP connection timeout

Ref: facebook/react-native@695784a

* Shared: Revert lockfile changes

* Bump build numbers for alpha release 0.6.2 (46)

* Mobile: Use Uint8 constructor in hashing

* Bump build numbers for alpha release 0.6.2 (47)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Lithuanian)

* Mobile: Replace QR lib (#1119)

* Fix invalid mnemonic issue occurring on realm initialization

* Resolve conflicts

* Update @iota/core to latest  (#1118)

* Fix invalid mnemonic issue occurring on realm initialization

* Update @iota/core to latest

* Update yarn.lock (#1120)

* Fix invalid mnemonic issue occurring on realm initialization

* Update yarn.lock file

* Mobile: Fix change password alert trigger

* Mobile: Bump build no to 48 (#1121)

* Mobile: Fix iOS QR codes

* Shared: Pass native signing function to prepareTransfers (#1123)

* Shared: Update prepareTransfers to accept native signature method

* Mobile: Unlink @iota/signing

* Shared: Update @iota/core

* Mobile: Fix main application

* Mobile: Fix function call

* Shared: Do not store invalid bundles constructed with local PoW (#1122)

* Shared: Delete bundles created with local PoW that fail validation checks

* Shared: Fix error message check

* Mobile: Bump build no to 49 (#1126)

* Shared, Mobile: Bump iota.lib.js to iotaledger/iota.js@eb27c18

* Mobile: Remove unused qrcode patch

* Mobile/Android: Rebuild Entangled libs with API level 19 (#1138)

* Mobile/Android: Rebuild Entangled libs with API level 19

* Remove unnecessary linker flags

* Desktop: Revert shrinkwrap changes

* Shared: Add null default param
cvarley100 added a commit that referenced this pull request Apr 8, 2019
* Shared: Localise strings

* Mobile: Update transaction history modal buttons

* Mobile: Adjust topbar scrollable

* Node Quorum (#631)

* Implement quorum for wereAddressesSpentFrom

* Simply #findSyncedNodes implementation

* Add quorum support for getBalances IRI endpoint

* Minor updates

- Add quorum support for getTrytes IRI endpoint
- Minor clean up in quorum methods

* Add quorum support for findTransactions IRI endpoint

* Rename quorum methods for better readability

* Integrate quorum methods with extended api

* Remove findTransactions & getTrytes endpoints from quorum

* Refactor quorum implementation and do minor fixes

- Update JSDoc typos
- Simplify quorum implementation (Remove duplications)
- Add a timeout for network request to each node
- Fix issues in findSyncedNodes implementation
- Update error messages

* Add coverage
- Add coverage for #determineQuorumResult
- Add coverage for #fallbackToSafeResult
- Add coverage for #findSyncedNodes

* Add empty payload checks in quorum methods

* Wrap percentage calculation in parentheses for clarity

Co-Authored-By: laumair <aquadestructor@icloud.com>

* Use develop branch of iota.lib.js

* Enforce quorum (by default) on supported methods

* Fix tests failing because of quorum enforcement

* Add code documentation and rename parameters & variables for clarity

- Related discussion #631 (comment)

* [Security] Bump cryptiles from 3.1.2 to 3.1.4 (#829)

* [Security] Bump nokogiri from 1.8.4 to 1.9.1 in /src/mobile/android (#828)

* Make sure accounts are always iterated in correct order (by account index) (#824)

Object.keys(<object>) function does not always preseve the order, especially if the object key starts with a number. This causes an issue when Object.keys is used for iterating on account names. #715 adds account indexes to state to make sure the order of accounts is always intact. However, some components in desktop use Object.keys directly on accounts object, which leads to certain issues of incorrect references to accounts. This commit fixes this issue by replacing Object.keys implementation on accounts with getAccountNamesFromState selector that guarantees the accounts order.

Fixes #811

Note that the issues Object.keys create are not always noticeable. Steps to reproduce these issues are:

- Add account with name "M"
- Add another account with name "0"
- Notice account names order in sidebar (Instead of "0" being the second account, it becomes the first)
- Generate receive address from account "M" (Instead of generating receive address for account "M", it generates receive address for account "0")

* New Crowdin translations [ci skip] (#826)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Japanese)

* New translations translation.json (Spanish)

* Mobile: Update findSyncedNodes

* Update quorum.js

* Improve parameters and variable names

* Include custom nodes in quorum nodes

* Reduce node request timeout for getNodeInfo api calls (in quorum)

* Mobile: Minor cleanup

* Mobile: Bump build numbers for release v0.6.0 (33) (#808)

* Mobile: Bump build no

* Mobile: Fix account name opacity during certain tasks

* Mobile: Adjust chart animations

* Mobile: Adjust chart timeframe order

* Shared: Rebuild realm after installing dependencies (#842)

* Remove undefined i18next translate function from progressSteps

* Mobile: Replace seed and password usage with global instance

* Mobile: Add ability to force GC on iOS

* Mobile: Work on forced garbage collection for Android

* Mobile: Link Android GarbageCollector

* Update prepateTransferArray implementation to accept addressData as an array instead of an object

* Minor fixes and updates

- Remove manual state rehydration from src/desktop/src/index.js
- Pass in theme object to UnitInfoModal
- Fix JSDocs for addCustomNodeSuccess action creator
- Fix notificationFn trigger in syncAccount
- Relocate mapNormalisedTransactions util

* Always find transaction hashes diff from transactions with own addresses

* Update UI for migration screen

* Assign index & meta to account object during migration

* Use buildNumber for detecting & triggering redux->realm migration

* Shared: Ignore chownr vulnerability in Snyk

* Desktop: Realm Database implementation Desktop fixes (#874)

* Desktop related fixes:
- Fix balance setting in `Balance` and `Sidebar` components
- Fix latest address retrieval
- Fix notification function
- Fix List component transaction list retrieval

* Remove `reverse` from account address list

* Mobile: Resolve lint errors

* Revert 5291972 and fix eslint config (see eslint/eslint#11231)

* Fix failing tests for libs/iota/accounts

* Fix checksum for latestAddressObject & add a separate constant for latestAddressBalance

* Fix attachAndFormatAddresses util implementation

* Mobile: Fix migration step strings

* Mobile: Update prop types

* Shared: Fix documentation for delete and addNodes

* Remove hash as a primary key from Transaction schema

* Add realm-object-server/ to gitignore

* Bump realm to v2.21.1

* Update Transaction schema

- Add attachmentTimestamp
- Add attachmentTimestampLowerBound
- Add attachmentTimestampUpperBound
- Add obsoleteTag

* Minor fixes

- Map correct persistence to normalised transactions
- Fix parameters for constructBundleFromTransactions util

* Minor fixes

- Make completedMigration a required prop in Login & Migration component
- Make sure missing properties like completedMigration are correctly mapped to redux store on entry

* Include version check on app entry

* Minor fixes and updates

- Update method description for realm Wallet class method updateLatest
- Rename setMigrationStatus action creator to setRealmMigrationStatus

* Desktop: Realm Database - remove redux persist settings dependency (#877)

* Update tray application state sync and initialisation

* Update Proxy settings to use separate electronSettings entry

* Shared: Fix periodically failing sortTransactionTrytesArray test (#878)

* Shared: Fix periodically failing sortTransactionTrytesArray test

* Shared: Make recommended changes

* Remove unnecessary assert statements

* Mobile: Use delete operator instead of nulling out secret references

* Mobile: Move seed storage to byte array, update secret handling, store seed against account name hash

* Mobile: Use secure method of inactivity logout

* Mobile: Fix password fields error

* Mobile: Remove password field from redux

* Mobile: Do not pass seed to redux when adding additional seed

* Fix skipped tests for #isNodeHealthy

* Fix skipped tests

* Update build number check realm migration detection

* Update build number to 40 for migration detection check

* Add missing getCustomNodesFromState state selector

* Pass nodes array in correct format to quorum methods

* Migrate accountIndex property for account from AsyncStorage to realm

* Remove primary key (address) from AddressSchema

* Fix invalid bundle construction for failed transactions

* Preserve local spend status before updating account data in realm

* Refactor #getFullAddressHistory tests

* Make sure we fetch persisted account indexes from realm

* Check for undefined addressData prop before updating address data in realm

* Realm data encryption (#1018)

* Add base setup for realm data encryption

* Pass #getEncryptionKeyPromise when storage is reinitialised

* Store realm encryption key in keychain

* Initialise realm instance with encryption key in tests

* Store realm encryption key in keychain

* Address comments

- Remove base64-js
- Perform Uint8Array to string conversions with vanilla JS

* Skip realm encryption key to be reset on password change

* Simplify #getEncryptionKey implementation

* Update build number to 41 for migration detection check

* Mobile: Fix notification icon touch radius

* Include isRetryingFailedTransaction in modalProps when modalProps are updated

* Move manual bundle construction implementation (for failed transactions) in constructBundlesFromTransactions

* Mobile: Fix iPhone X modal visual bug

* Mobile Release 0.4.1 (41) (#1029)

* Mobile: Bump build number to 41

* Mobile: Bump Realm migration versioning

* Shared: Only rebuild Realm on Debian

* Correctly assign new account name in realm storage (#1045)

* Update isFailedTransaction prop when modal props are updated (#1046)

* Mobile: Add retry button, error log and change node to Realm migration (#1041)

* Mobile: Add ability to change node and retry during migration

* Mobile: Address comments

* Mobile: Fix notification button import and padding

* Mobile: Disable iOS pop gesture

* Mobile Release 0.6.1 (42) (#1048)

* Mobile: Bump build no to 42

* Mobile: Update realm migration versioning

* Mobile: Add logout HOC. Full logout after 30 minutes inactivity

* Realm Database implementation desktop bugfixes (#1025)

* - Fix Realm storage path
- Add missing wallet reset triggers
- Fix address component prop use
- Remove failed bundle hash action

* Update Realm path for test environment

* - Remove Realm instance init from Tray application
- Keep Realm encryption key on keychain initialisation

* Focus wallet window after initial store update

* Add missing Windows required dependency

* Mobile: Add new Entangled trit methods and intergrate Android

* Mobile: Use correct bundle hash encoding for native signatures in Android

* Mobile: Remove unused imports

* Mobile: Update password/seed handling by text inputs

* Mobile: Update text input handling of secrets

* Mobile: Fix QR Scan

* Mobile: Fix text inputs and SeedVault

* Mobile: Fix view seed

* Mobile: Fix write seed down

* Desktop: Create Migration component to migrate data (#857)

* Desktop: Create Migration component to migrate data

* Desktop: Add 'history' to PropTypes

* Desktop: Document getAllStorageKeys

* - Fix Realm storage path
- Add missing wallet reset triggers
- Fix address component prop use
- Remove failed bundle hash action

* Update Realm path for test environment

* - Remove Realm instance init from Tray application
- Keep Realm encryption key on keychain initialisation

* Focus wallet window after initial store update

* Add missing Windows required dependency

* Move Migration to `ui/global`

* Migration bugfixes

* Desktop: Fix off-by-one mistake on Migration component

* Code review fixes

* Fix Wallet reset functionallity

* Mobile: SeedVault, ViewSeed and reentry fixes

* Mobile: Store seed as basic trit array

* Mobile/iOS: Rebuild Entangled with new bindings

Ref: rajivshah3/entangled@5a11ee1

* Mobile: Add seed storage migration and update hashing

* Mobile: Remove garbage collector

* Mobile: Remove gc comments and unnecessary null outs

* Mobile: Fix isUniqueSeed

* Mobile: Fix wallet reset

* Mobile: Fix empty text input issues

* Mobile: Fix prop warning

* Mobile: Fix seed reentry

* Batched proof-of-work (#1071)

* Rebuild entangled android

Commit used: iotaledger/entangled@84f7446
PR: iotaledger/entangled#810

* Add batched proof-of-work methods in EntangledAndroid native module

* Integrate entangled batched proof-of-work methods

* Fix failing tests

* Shared: Update comment

* Mobile: Clear reset timeout

* Mobile: Update gitignore

* Fix account duplication on account rename operation (#1077)

Related issue: #1066

* Mobile: Reorder seed storage check on login

* Mobile: Readd react-native-translucent-moddal (#1083)

* Mobile: Fix up migration

* Mobile/iOS: Rebuild Entangled with new bindings

* Mobile/iOS: Update EntangledIOS RCT_EXPORT_METHODS

* Shared: Update config

* Mobile: Fix migration

* Mobile: Add ios-specific hashing method

* Mobile: Fix seed migration detection

* Fix invalid address data issue (#1089)

Interrupting new account onboarding (on loading screen) leads wallet to throw continuous exceptions. The reason for exceptions was missing "completed" property in realm schema. This commit fixes the issue and also adds realm migration from schema version 0 to latest schema.

* Fix invalid bundle issue on zero value transaction with bundle size > 1 (#1093)

* Integrate native signing (android)

* Mobile: Link translucent modal

* Mobile: Link translucent modal library

* Mobile: Fix failing test

* Mobile: Fix transaction history account mismatch

* Update rn-nodeify

* Add @iota/signing to yarn resolutions

* Mobile: Fix promotion/retry

* Shared: Fix migration when app is first installed (#1098)

* Link @iota/signing iOS

* Mobile: Fix wallet reset crash

* Minor updates

* Use prepareTransfersAsync method in promoteTransaction

* Mobile/iOS: Fix code signing

* Update @iota/core

* Mobile/Android: Rebuild Entangled library (#1109)

Ref: iotaledger/entangled@e63422b

* Mobile: Fix bundle storage order (#1108)

* Desktop: Bump entangled-node to fix failing CI

* New translations translation.json (German)

* New translations translation.json (Polish)

* New translations translation.json (Polish)

* Mobile/iOS: Fix bugs in Entangled methods (#1100)

* Mobile/iOS: Fix multi-address generation

* Shared: Fix migration when app is first installed

* Mobile/iOS: Create trit array conversion utils, fix address gen bugs

* Mobile/iOS: Remove unnecessary printf statements

* Mobile/iOS: Fix memory leaks in multi-address generation

* Mobile/iOS: Fix signature generation bugs

* Mobile/iOS: Rebuild EntangledKit framework

Ref: rajivshah3/entangled@f894cd8

* Mobile/iOS: Fix single-address generation bugs

* Mobile/Android: Remove libc++_shared.so and libjsc.so

* Shared: Revert gitignore edits

* Mobile: Fix qr message input

* Mobile: Remove unnecessary deletes and add necessary deletes

* Resolve conflicts

* Mobile: Temporarily convert to trytes for checksum

* Mobile: Fix lockfile

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Slovak)

* New translations translation.json (Slovak)

* New translations translation.json (Slovak)

* New translations translation.json (Slovak)

* New translations translation.json (Slovak)

* New translations translation.json (Slovak)

* New translations translation.json (Chinese Simplified)

* Fix invalid mnemonic issue occurring on realm initialization (#1113)

* Mobile: Increase seed migration timeout to 7.5s

* Mobile: Fix empty password checks

* Mobile: Add additional seed reentry check

* Mobile: Bump versioning to 0.6.2

* Mobile/iOS: Fix code signing

* Shared, Mobile: Bump @iota/signing and other packages to 1.0.0-alpha.a09e7908

* Mobile: Patch Buffer.prototype.slice to prevent Android crash

* Mobile: Bump build numbers for alpha release 0.6.2 (45)

* Mobile/Android: Fix HTTP connection timeout

Ref: facebook/react-native@695784a

* Shared: Revert lockfile changes

* Bump build numbers for alpha release 0.6.2 (46)

* Mobile: Use Uint8 constructor in hashing

* Bump build numbers for alpha release 0.6.2 (47)

* New translations translation.json (Czech)

* New translations translation.json (Czech)

* New translations translation.json (Lithuanian)

* Mobile: Replace QR lib (#1119)

* Fix invalid mnemonic issue occurring on realm initialization

* Resolve conflicts

* Update @iota/core to latest  (#1118)

* Fix invalid mnemonic issue occurring on realm initialization

* Update @iota/core to latest

* Update yarn.lock (#1120)

* Fix invalid mnemonic issue occurring on realm initialization

* Update yarn.lock file

* Mobile: Fix change password alert trigger

* Mobile: Bump build no to 48 (#1121)

* Mobile: Fix iOS QR codes

* Shared: Pass native signing function to prepareTransfers (#1123)

* Shared: Update prepareTransfers to accept native signature method

* Mobile: Unlink @iota/signing

* Shared: Update @iota/core

* Mobile: Fix main application

* Mobile: Fix function call

* Shared: Do not store invalid bundles constructed with local PoW (#1122)

* Shared: Delete bundles created with local PoW that fail validation checks

* Shared: Fix error message check

* Mobile: Bump build no to 49 (#1126)

* Shared, Mobile: Bump iota.lib.js to iotaledger/iota.js@eb27c18

* Mobile: Remove unused qrcode patch

* Mobile/Android: Rebuild Entangled libs with API level 19 (#1138)

* Mobile/Android: Rebuild Entangled libs with API level 19

* Remove unnecessary linker flags

* Desktop: Revert shrinkwrap changes

* Shared: Add null default param

* Mobile: Reenable deep linking

* Mobile: Move deep linking to HOC

* Mobile: Remove unnecessary bind

* Shared: Rename deep link methods/vars

* Shared: Add deep linking setting

* Shared: Add ddeep linking settings and mobile UI

* Mobile: Clear previous deep link request if deep linking is not enabled

* Mobile: Update font weighting

* Shared: Revert shrinkwrap changes

* Update src/mobile/src/ui/views/wallet/DeepLinking.js

Co-Authored-By: cvarley100 <cvarley100@gmail.com>

* Mobile: Update deeplink HOC
@cvarley100 cvarley100 mentioned this pull request May 7, 2019
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
C - Shared E - Functional Epic - Relating to how a feature works E - Security Epic - Security related L - WIP Lifecycle - Work in Progress T - Enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants