2016-12-11 19:31:31 +01:00
|
|
|
// Copyright 2015, 2016 Parity Technologies (UK) Ltd.
|
Initial new UI source code import (#2607)
* address -> name mappings
* expanding, loading all coin details
* send use only actual BasicCoin tokens registered (any reg)
* sending token & accounts
* form styling updates
* send form layout in place
* coin send working as expected
* api subscriptions on multiple addresses
* bring in events
* simplify
* basic events display in-place, functionally complete
* basic functionality in-place
* fix horrible event address issue
* rwork display of events slightly
* test TLA availability
* table for owner -> tokens
* fix signature lookup address
* fix signature lookup address
* basic overview styling
* txhash links
* page layout adjustments
* background import
* adjust colors
* no global registration, simplify color selection
* updated styling
* connection dialog for "busy connecting"
* initial token connection - WIP
* init token updates take place
* basic test for manual token
* rework connection display
* allow updates of the secure token
* first stab at making the build build
* update runner tags
* fix linting issues
* skip tests requiring network (should be e2e, TODO)
* re-enable javascript tag/runner
* release push does the trick
* push to any branch, CI name
* javscript-test runner as well
* swap dependencies build requires test
* revert stages swap
* retrieve images associated with tokens
* remove js build deps order
* null image when hash = 0x0
* 6x64 images (hashes for registries)
* don't pass tokens as prop to IdentityIcon
* check images against content hash pictures
* cleanup signer after connection changes
* fix naming typo
* display unknownImages for balances (not available as content hash)
* unknownImage for transfer dialog
* basic githubhint layout
* single input for commit/filename
* ethcore_hashContent call
* lookup hash
* registration in place
* fixes
* events is using a proper table
* pass value through as-is
* stop wrongly using main app IdentityIcon
* NEVER export class instance functions
* alignment back to normal
* typo in definition
* set & get images working (mostly)
* show content retrieval info
* set exitcode via ||
* use javascript:latest images
* disable npm progress bar
* rename phase I
* rename phase II
* only send build output to GitHub on major branches
* also run the build step as part of the test (until comprehensive)
* ci-specific build (no webpack progress)
* allow for account creation via recovery phrase
* display account uuid (where available), closes #2546
* connection dialog now shows up in dapps as well, closes #2538
* token images show up as expected
* IdentityName component added and deployed
* fix padding tests
* adjust tests to map to stricter 0x-prefixed hex
* render names via common component for the address -> name
* split lint into seperate script (early exit)
* test phases changed to lint, test & pack
* pack part of test phase
* remove files marked for deletion (cleanup)
* Signer cleanups, start moving in the direction of the rest
* add personal signer methods
* basic signer request subscription
* don't poll blockNumber when not connected
* missing return, creating massive ws queue backlogs
* ΞTH -> ETH
* fix failing tests
* registry uses setAddress to actually set addresses now
* bytes mapping operates on lowerCase hex strings
* sha3 ids for each application
* add dappreg to list of contracts
* adjust alignment of queries
* show gas estimation log
* abi with payable for register function
* add key as required
* image retrieval from dappreg
* use proper Image urls
* embed and link apps from Parity, retrieved via /api/apps
* filter apps that has been replaced
* proxy entry for parity-utils
* add basiccoin abi
* add support for fallback abi type
* capture constructor paramaters
* merge master into js
* move images to assets/images/
* add font assets
* import fonts as part of build
* don't inline woff files
* Revert "merge master into js"
This reverts commit cfcfa81bd26f1b3cbc748d3afa1eb5c670b363fe.
* remove unused npm packages
* information on gas estimates (like almost everywhere else)
* don't pass gas & gasPrice to estimation
* display account passwordhint when available
* signer subscriptions based on polling & function trapping
* pending requests retrieved via jsapi
* update signer middleware
* remove all web3 instances
* remove web3 package
* last web3 dependencies removed
* no need to toChecksumAddress - api takes care of it
* expand description for personal_confirmRequest
* Signer conversion from web3 -> parity.js completed
* explicit in no return
* green circle background
* remove generated background
* convert /api/* paths to localhost:8080/api/* paths (hard-coded, temporary)
* change dapps to load from localhost:8080/ui/*
* remove dangling web3 files
* update manager test for signer
* /api/ping -> /
* additional token images
* additional token images
* add missing styles.css for 8180 error pages
* cater for txhash returning null/empty object
* adjust output directories
* Release merge with origin with ours strategy
* additional token images
* cater for development server
* s/localhost/127.0.0.1/ (cater for origin)
* Fix address selection for contract deployment
* Adjust z-index for error overlay
* better text on unique background pattern
* fix signer rejections
* Don't allow gavcoin transfer with no balance
* fix txhash rendering in signer
* remove unnecessary ParityBackground
* script to update js-precompiled
* Redirect from :8080 to :8180
* Remove extra return
* Dapp logo images
2016-10-18 11:52:56 +02:00
|
|
|
// This file is part of Parity.
|
|
|
|
|
|
|
|
// Parity is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
|
|
|
|
// Parity is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
2016-11-25 16:46:35 +01:00
|
|
|
import { range, uniq, isEqual } from 'lodash';
|
2016-12-10 23:55:36 +01:00
|
|
|
import BigNumber from 'bignumber.js';
|
|
|
|
import { push } from 'react-router-redux';
|
2016-11-25 16:46:35 +01:00
|
|
|
|
|
|
|
import { hashToImageUrl } from './imagesReducer';
|
|
|
|
import { setAddressImage } from './imagesActions';
|
|
|
|
|
2016-12-05 11:47:13 +01:00
|
|
|
import * as ABIS from '~/contracts/abi';
|
2016-12-10 23:55:36 +01:00
|
|
|
import { notifyTransaction } from '~/util/notifications';
|
2016-11-25 16:46:35 +01:00
|
|
|
import imagesEthereum from '../../../assets/images/contracts/ethereum-black-64x64.png';
|
|
|
|
|
|
|
|
const ETH = {
|
|
|
|
name: 'Ethereum',
|
|
|
|
tag: 'ETH',
|
|
|
|
image: imagesEthereum
|
|
|
|
};
|
|
|
|
|
2016-12-10 23:55:36 +01:00
|
|
|
function setBalances (_balances) {
|
|
|
|
return (dispatch, getState) => {
|
|
|
|
const state = getState();
|
|
|
|
|
|
|
|
const accounts = state.personal.accounts;
|
|
|
|
const nextBalances = _balances;
|
|
|
|
const prevBalances = state.balances.balances;
|
|
|
|
const balances = { ...prevBalances };
|
|
|
|
|
|
|
|
Object.keys(nextBalances).forEach((address) => {
|
|
|
|
if (!balances[address]) {
|
|
|
|
balances[address] = Object.assign({}, nextBalances[address]);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const balance = Object.assign({}, balances[address]);
|
|
|
|
const { tokens, txCount = balance.txCount } = nextBalances[address];
|
2016-12-27 10:59:37 +01:00
|
|
|
const nextTokens = balance.tokens.slice();
|
2016-12-10 23:55:36 +01:00
|
|
|
|
|
|
|
tokens.forEach((t) => {
|
|
|
|
const { token, value } = t;
|
|
|
|
const { tag } = token;
|
|
|
|
|
|
|
|
const tokenIndex = nextTokens.findIndex((tok) => tok.token.tag === tag);
|
|
|
|
|
|
|
|
if (tokenIndex === -1) {
|
|
|
|
nextTokens.push({
|
|
|
|
token,
|
|
|
|
value
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
const oldValue = nextTokens[tokenIndex].value;
|
|
|
|
|
|
|
|
// If received a token/eth (old value < new value), notify
|
|
|
|
if (oldValue.lt(value) && accounts[address]) {
|
|
|
|
const account = accounts[address];
|
|
|
|
const txValue = value.minus(oldValue);
|
|
|
|
|
|
|
|
const redirectToAccount = () => {
|
|
|
|
const route = `/account/${account.address}`;
|
|
|
|
dispatch(push(route));
|
|
|
|
};
|
|
|
|
|
|
|
|
notifyTransaction(account, token, txValue, redirectToAccount);
|
|
|
|
}
|
|
|
|
|
|
|
|
nextTokens[tokenIndex] = { token, value };
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
balances[address] = { txCount: txCount || new BigNumber(0), tokens: nextTokens };
|
|
|
|
});
|
|
|
|
|
|
|
|
dispatch(_setBalances(balances));
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function _setBalances (balances) {
|
Initial new UI source code import (#2607)
* address -> name mappings
* expanding, loading all coin details
* send use only actual BasicCoin tokens registered (any reg)
* sending token & accounts
* form styling updates
* send form layout in place
* coin send working as expected
* api subscriptions on multiple addresses
* bring in events
* simplify
* basic events display in-place, functionally complete
* basic functionality in-place
* fix horrible event address issue
* rwork display of events slightly
* test TLA availability
* table for owner -> tokens
* fix signature lookup address
* fix signature lookup address
* basic overview styling
* txhash links
* page layout adjustments
* background import
* adjust colors
* no global registration, simplify color selection
* updated styling
* connection dialog for "busy connecting"
* initial token connection - WIP
* init token updates take place
* basic test for manual token
* rework connection display
* allow updates of the secure token
* first stab at making the build build
* update runner tags
* fix linting issues
* skip tests requiring network (should be e2e, TODO)
* re-enable javascript tag/runner
* release push does the trick
* push to any branch, CI name
* javscript-test runner as well
* swap dependencies build requires test
* revert stages swap
* retrieve images associated with tokens
* remove js build deps order
* null image when hash = 0x0
* 6x64 images (hashes for registries)
* don't pass tokens as prop to IdentityIcon
* check images against content hash pictures
* cleanup signer after connection changes
* fix naming typo
* display unknownImages for balances (not available as content hash)
* unknownImage for transfer dialog
* basic githubhint layout
* single input for commit/filename
* ethcore_hashContent call
* lookup hash
* registration in place
* fixes
* events is using a proper table
* pass value through as-is
* stop wrongly using main app IdentityIcon
* NEVER export class instance functions
* alignment back to normal
* typo in definition
* set & get images working (mostly)
* show content retrieval info
* set exitcode via ||
* use javascript:latest images
* disable npm progress bar
* rename phase I
* rename phase II
* only send build output to GitHub on major branches
* also run the build step as part of the test (until comprehensive)
* ci-specific build (no webpack progress)
* allow for account creation via recovery phrase
* display account uuid (where available), closes #2546
* connection dialog now shows up in dapps as well, closes #2538
* token images show up as expected
* IdentityName component added and deployed
* fix padding tests
* adjust tests to map to stricter 0x-prefixed hex
* render names via common component for the address -> name
* split lint into seperate script (early exit)
* test phases changed to lint, test & pack
* pack part of test phase
* remove files marked for deletion (cleanup)
* Signer cleanups, start moving in the direction of the rest
* add personal signer methods
* basic signer request subscription
* don't poll blockNumber when not connected
* missing return, creating massive ws queue backlogs
* ΞTH -> ETH
* fix failing tests
* registry uses setAddress to actually set addresses now
* bytes mapping operates on lowerCase hex strings
* sha3 ids for each application
* add dappreg to list of contracts
* adjust alignment of queries
* show gas estimation log
* abi with payable for register function
* add key as required
* image retrieval from dappreg
* use proper Image urls
* embed and link apps from Parity, retrieved via /api/apps
* filter apps that has been replaced
* proxy entry for parity-utils
* add basiccoin abi
* add support for fallback abi type
* capture constructor paramaters
* merge master into js
* move images to assets/images/
* add font assets
* import fonts as part of build
* don't inline woff files
* Revert "merge master into js"
This reverts commit cfcfa81bd26f1b3cbc748d3afa1eb5c670b363fe.
* remove unused npm packages
* information on gas estimates (like almost everywhere else)
* don't pass gas & gasPrice to estimation
* display account passwordhint when available
* signer subscriptions based on polling & function trapping
* pending requests retrieved via jsapi
* update signer middleware
* remove all web3 instances
* remove web3 package
* last web3 dependencies removed
* no need to toChecksumAddress - api takes care of it
* expand description for personal_confirmRequest
* Signer conversion from web3 -> parity.js completed
* explicit in no return
* green circle background
* remove generated background
* convert /api/* paths to localhost:8080/api/* paths (hard-coded, temporary)
* change dapps to load from localhost:8080/ui/*
* remove dangling web3 files
* update manager test for signer
* /api/ping -> /
* additional token images
* additional token images
* add missing styles.css for 8180 error pages
* cater for txhash returning null/empty object
* adjust output directories
* Release merge with origin with ours strategy
* additional token images
* cater for development server
* s/localhost/127.0.0.1/ (cater for origin)
* Fix address selection for contract deployment
* Adjust z-index for error overlay
* better text on unique background pattern
* fix signer rejections
* Don't allow gavcoin transfer with no balance
* fix txhash rendering in signer
* remove unnecessary ParityBackground
* script to update js-precompiled
* Redirect from :8080 to :8180
* Remove extra return
* Dapp logo images
2016-10-18 11:52:56 +02:00
|
|
|
return {
|
2016-11-25 16:46:35 +01:00
|
|
|
type: 'setBalances',
|
Initial new UI source code import (#2607)
* address -> name mappings
* expanding, loading all coin details
* send use only actual BasicCoin tokens registered (any reg)
* sending token & accounts
* form styling updates
* send form layout in place
* coin send working as expected
* api subscriptions on multiple addresses
* bring in events
* simplify
* basic events display in-place, functionally complete
* basic functionality in-place
* fix horrible event address issue
* rwork display of events slightly
* test TLA availability
* table for owner -> tokens
* fix signature lookup address
* fix signature lookup address
* basic overview styling
* txhash links
* page layout adjustments
* background import
* adjust colors
* no global registration, simplify color selection
* updated styling
* connection dialog for "busy connecting"
* initial token connection - WIP
* init token updates take place
* basic test for manual token
* rework connection display
* allow updates of the secure token
* first stab at making the build build
* update runner tags
* fix linting issues
* skip tests requiring network (should be e2e, TODO)
* re-enable javascript tag/runner
* release push does the trick
* push to any branch, CI name
* javscript-test runner as well
* swap dependencies build requires test
* revert stages swap
* retrieve images associated with tokens
* remove js build deps order
* null image when hash = 0x0
* 6x64 images (hashes for registries)
* don't pass tokens as prop to IdentityIcon
* check images against content hash pictures
* cleanup signer after connection changes
* fix naming typo
* display unknownImages for balances (not available as content hash)
* unknownImage for transfer dialog
* basic githubhint layout
* single input for commit/filename
* ethcore_hashContent call
* lookup hash
* registration in place
* fixes
* events is using a proper table
* pass value through as-is
* stop wrongly using main app IdentityIcon
* NEVER export class instance functions
* alignment back to normal
* typo in definition
* set & get images working (mostly)
* show content retrieval info
* set exitcode via ||
* use javascript:latest images
* disable npm progress bar
* rename phase I
* rename phase II
* only send build output to GitHub on major branches
* also run the build step as part of the test (until comprehensive)
* ci-specific build (no webpack progress)
* allow for account creation via recovery phrase
* display account uuid (where available), closes #2546
* connection dialog now shows up in dapps as well, closes #2538
* token images show up as expected
* IdentityName component added and deployed
* fix padding tests
* adjust tests to map to stricter 0x-prefixed hex
* render names via common component for the address -> name
* split lint into seperate script (early exit)
* test phases changed to lint, test & pack
* pack part of test phase
* remove files marked for deletion (cleanup)
* Signer cleanups, start moving in the direction of the rest
* add personal signer methods
* basic signer request subscription
* don't poll blockNumber when not connected
* missing return, creating massive ws queue backlogs
* ΞTH -> ETH
* fix failing tests
* registry uses setAddress to actually set addresses now
* bytes mapping operates on lowerCase hex strings
* sha3 ids for each application
* add dappreg to list of contracts
* adjust alignment of queries
* show gas estimation log
* abi with payable for register function
* add key as required
* image retrieval from dappreg
* use proper Image urls
* embed and link apps from Parity, retrieved via /api/apps
* filter apps that has been replaced
* proxy entry for parity-utils
* add basiccoin abi
* add support for fallback abi type
* capture constructor paramaters
* merge master into js
* move images to assets/images/
* add font assets
* import fonts as part of build
* don't inline woff files
* Revert "merge master into js"
This reverts commit cfcfa81bd26f1b3cbc748d3afa1eb5c670b363fe.
* remove unused npm packages
* information on gas estimates (like almost everywhere else)
* don't pass gas & gasPrice to estimation
* display account passwordhint when available
* signer subscriptions based on polling & function trapping
* pending requests retrieved via jsapi
* update signer middleware
* remove all web3 instances
* remove web3 package
* last web3 dependencies removed
* no need to toChecksumAddress - api takes care of it
* expand description for personal_confirmRequest
* Signer conversion from web3 -> parity.js completed
* explicit in no return
* green circle background
* remove generated background
* convert /api/* paths to localhost:8080/api/* paths (hard-coded, temporary)
* change dapps to load from localhost:8080/ui/*
* remove dangling web3 files
* update manager test for signer
* /api/ping -> /
* additional token images
* additional token images
* add missing styles.css for 8180 error pages
* cater for txhash returning null/empty object
* adjust output directories
* Release merge with origin with ours strategy
* additional token images
* cater for development server
* s/localhost/127.0.0.1/ (cater for origin)
* Fix address selection for contract deployment
* Adjust z-index for error overlay
* better text on unique background pattern
* fix signer rejections
* Don't allow gavcoin transfer with no balance
* fix txhash rendering in signer
* remove unnecessary ParityBackground
* script to update js-precompiled
* Redirect from :8080 to :8180
* Remove extra return
* Dapp logo images
2016-10-18 11:52:56 +02:00
|
|
|
balances
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2016-11-25 16:46:35 +01:00
|
|
|
export function setTokens (tokens) {
|
Initial new UI source code import (#2607)
* address -> name mappings
* expanding, loading all coin details
* send use only actual BasicCoin tokens registered (any reg)
* sending token & accounts
* form styling updates
* send form layout in place
* coin send working as expected
* api subscriptions on multiple addresses
* bring in events
* simplify
* basic events display in-place, functionally complete
* basic functionality in-place
* fix horrible event address issue
* rwork display of events slightly
* test TLA availability
* table for owner -> tokens
* fix signature lookup address
* fix signature lookup address
* basic overview styling
* txhash links
* page layout adjustments
* background import
* adjust colors
* no global registration, simplify color selection
* updated styling
* connection dialog for "busy connecting"
* initial token connection - WIP
* init token updates take place
* basic test for manual token
* rework connection display
* allow updates of the secure token
* first stab at making the build build
* update runner tags
* fix linting issues
* skip tests requiring network (should be e2e, TODO)
* re-enable javascript tag/runner
* release push does the trick
* push to any branch, CI name
* javscript-test runner as well
* swap dependencies build requires test
* revert stages swap
* retrieve images associated with tokens
* remove js build deps order
* null image when hash = 0x0
* 6x64 images (hashes for registries)
* don't pass tokens as prop to IdentityIcon
* check images against content hash pictures
* cleanup signer after connection changes
* fix naming typo
* display unknownImages for balances (not available as content hash)
* unknownImage for transfer dialog
* basic githubhint layout
* single input for commit/filename
* ethcore_hashContent call
* lookup hash
* registration in place
* fixes
* events is using a proper table
* pass value through as-is
* stop wrongly using main app IdentityIcon
* NEVER export class instance functions
* alignment back to normal
* typo in definition
* set & get images working (mostly)
* show content retrieval info
* set exitcode via ||
* use javascript:latest images
* disable npm progress bar
* rename phase I
* rename phase II
* only send build output to GitHub on major branches
* also run the build step as part of the test (until comprehensive)
* ci-specific build (no webpack progress)
* allow for account creation via recovery phrase
* display account uuid (where available), closes #2546
* connection dialog now shows up in dapps as well, closes #2538
* token images show up as expected
* IdentityName component added and deployed
* fix padding tests
* adjust tests to map to stricter 0x-prefixed hex
* render names via common component for the address -> name
* split lint into seperate script (early exit)
* test phases changed to lint, test & pack
* pack part of test phase
* remove files marked for deletion (cleanup)
* Signer cleanups, start moving in the direction of the rest
* add personal signer methods
* basic signer request subscription
* don't poll blockNumber when not connected
* missing return, creating massive ws queue backlogs
* ΞTH -> ETH
* fix failing tests
* registry uses setAddress to actually set addresses now
* bytes mapping operates on lowerCase hex strings
* sha3 ids for each application
* add dappreg to list of contracts
* adjust alignment of queries
* show gas estimation log
* abi with payable for register function
* add key as required
* image retrieval from dappreg
* use proper Image urls
* embed and link apps from Parity, retrieved via /api/apps
* filter apps that has been replaced
* proxy entry for parity-utils
* add basiccoin abi
* add support for fallback abi type
* capture constructor paramaters
* merge master into js
* move images to assets/images/
* add font assets
* import fonts as part of build
* don't inline woff files
* Revert "merge master into js"
This reverts commit cfcfa81bd26f1b3cbc748d3afa1eb5c670b363fe.
* remove unused npm packages
* information on gas estimates (like almost everywhere else)
* don't pass gas & gasPrice to estimation
* display account passwordhint when available
* signer subscriptions based on polling & function trapping
* pending requests retrieved via jsapi
* update signer middleware
* remove all web3 instances
* remove web3 package
* last web3 dependencies removed
* no need to toChecksumAddress - api takes care of it
* expand description for personal_confirmRequest
* Signer conversion from web3 -> parity.js completed
* explicit in no return
* green circle background
* remove generated background
* convert /api/* paths to localhost:8080/api/* paths (hard-coded, temporary)
* change dapps to load from localhost:8080/ui/*
* remove dangling web3 files
* update manager test for signer
* /api/ping -> /
* additional token images
* additional token images
* add missing styles.css for 8180 error pages
* cater for txhash returning null/empty object
* adjust output directories
* Release merge with origin with ours strategy
* additional token images
* cater for development server
* s/localhost/127.0.0.1/ (cater for origin)
* Fix address selection for contract deployment
* Adjust z-index for error overlay
* better text on unique background pattern
* fix signer rejections
* Don't allow gavcoin transfer with no balance
* fix txhash rendering in signer
* remove unnecessary ParityBackground
* script to update js-precompiled
* Redirect from :8080 to :8180
* Remove extra return
* Dapp logo images
2016-10-18 11:52:56 +02:00
|
|
|
return {
|
2016-11-25 16:46:35 +01:00
|
|
|
type: 'setTokens',
|
Initial new UI source code import (#2607)
* address -> name mappings
* expanding, loading all coin details
* send use only actual BasicCoin tokens registered (any reg)
* sending token & accounts
* form styling updates
* send form layout in place
* coin send working as expected
* api subscriptions on multiple addresses
* bring in events
* simplify
* basic events display in-place, functionally complete
* basic functionality in-place
* fix horrible event address issue
* rwork display of events slightly
* test TLA availability
* table for owner -> tokens
* fix signature lookup address
* fix signature lookup address
* basic overview styling
* txhash links
* page layout adjustments
* background import
* adjust colors
* no global registration, simplify color selection
* updated styling
* connection dialog for "busy connecting"
* initial token connection - WIP
* init token updates take place
* basic test for manual token
* rework connection display
* allow updates of the secure token
* first stab at making the build build
* update runner tags
* fix linting issues
* skip tests requiring network (should be e2e, TODO)
* re-enable javascript tag/runner
* release push does the trick
* push to any branch, CI name
* javscript-test runner as well
* swap dependencies build requires test
* revert stages swap
* retrieve images associated with tokens
* remove js build deps order
* null image when hash = 0x0
* 6x64 images (hashes for registries)
* don't pass tokens as prop to IdentityIcon
* check images against content hash pictures
* cleanup signer after connection changes
* fix naming typo
* display unknownImages for balances (not available as content hash)
* unknownImage for transfer dialog
* basic githubhint layout
* single input for commit/filename
* ethcore_hashContent call
* lookup hash
* registration in place
* fixes
* events is using a proper table
* pass value through as-is
* stop wrongly using main app IdentityIcon
* NEVER export class instance functions
* alignment back to normal
* typo in definition
* set & get images working (mostly)
* show content retrieval info
* set exitcode via ||
* use javascript:latest images
* disable npm progress bar
* rename phase I
* rename phase II
* only send build output to GitHub on major branches
* also run the build step as part of the test (until comprehensive)
* ci-specific build (no webpack progress)
* allow for account creation via recovery phrase
* display account uuid (where available), closes #2546
* connection dialog now shows up in dapps as well, closes #2538
* token images show up as expected
* IdentityName component added and deployed
* fix padding tests
* adjust tests to map to stricter 0x-prefixed hex
* render names via common component for the address -> name
* split lint into seperate script (early exit)
* test phases changed to lint, test & pack
* pack part of test phase
* remove files marked for deletion (cleanup)
* Signer cleanups, start moving in the direction of the rest
* add personal signer methods
* basic signer request subscription
* don't poll blockNumber when not connected
* missing return, creating massive ws queue backlogs
* ΞTH -> ETH
* fix failing tests
* registry uses setAddress to actually set addresses now
* bytes mapping operates on lowerCase hex strings
* sha3 ids for each application
* add dappreg to list of contracts
* adjust alignment of queries
* show gas estimation log
* abi with payable for register function
* add key as required
* image retrieval from dappreg
* use proper Image urls
* embed and link apps from Parity, retrieved via /api/apps
* filter apps that has been replaced
* proxy entry for parity-utils
* add basiccoin abi
* add support for fallback abi type
* capture constructor paramaters
* merge master into js
* move images to assets/images/
* add font assets
* import fonts as part of build
* don't inline woff files
* Revert "merge master into js"
This reverts commit cfcfa81bd26f1b3cbc748d3afa1eb5c670b363fe.
* remove unused npm packages
* information on gas estimates (like almost everywhere else)
* don't pass gas & gasPrice to estimation
* display account passwordhint when available
* signer subscriptions based on polling & function trapping
* pending requests retrieved via jsapi
* update signer middleware
* remove all web3 instances
* remove web3 package
* last web3 dependencies removed
* no need to toChecksumAddress - api takes care of it
* expand description for personal_confirmRequest
* Signer conversion from web3 -> parity.js completed
* explicit in no return
* green circle background
* remove generated background
* convert /api/* paths to localhost:8080/api/* paths (hard-coded, temporary)
* change dapps to load from localhost:8080/ui/*
* remove dangling web3 files
* update manager test for signer
* /api/ping -> /
* additional token images
* additional token images
* add missing styles.css for 8180 error pages
* cater for txhash returning null/empty object
* adjust output directories
* Release merge with origin with ours strategy
* additional token images
* cater for development server
* s/localhost/127.0.0.1/ (cater for origin)
* Fix address selection for contract deployment
* Adjust z-index for error overlay
* better text on unique background pattern
* fix signer rejections
* Don't allow gavcoin transfer with no balance
* fix txhash rendering in signer
* remove unnecessary ParityBackground
* script to update js-precompiled
* Redirect from :8080 to :8180
* Remove extra return
* Dapp logo images
2016-10-18 11:52:56 +02:00
|
|
|
tokens
|
|
|
|
};
|
|
|
|
}
|
2016-11-25 16:46:35 +01:00
|
|
|
|
|
|
|
export function setTokenReg (tokenreg) {
|
|
|
|
return {
|
|
|
|
type: 'setTokenReg',
|
|
|
|
tokenreg
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
export function setTokensFilter (tokensFilter) {
|
|
|
|
return {
|
|
|
|
type: 'setTokensFilter',
|
|
|
|
tokensFilter
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
export function setTokenImage (tokenAddress, image) {
|
|
|
|
return {
|
|
|
|
type: 'setTokenImage',
|
|
|
|
tokenAddress, image
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
export function loadTokens () {
|
|
|
|
return (dispatch, getState) => {
|
|
|
|
const { tokenreg } = getState().balances;
|
|
|
|
|
|
|
|
return tokenreg.instance.tokenCount
|
|
|
|
.call()
|
|
|
|
.then((numTokens) => {
|
|
|
|
const tokenIds = range(numTokens.toNumber());
|
|
|
|
dispatch(fetchTokens(tokenIds));
|
|
|
|
})
|
|
|
|
.catch((error) => {
|
|
|
|
console.warn('balances::loadTokens', error);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
export function fetchTokens (_tokenIds) {
|
|
|
|
const tokenIds = uniq(_tokenIds || []);
|
|
|
|
return (dispatch, getState) => {
|
|
|
|
const { api, images, balances } = getState();
|
|
|
|
const { tokenreg } = balances;
|
|
|
|
|
|
|
|
return Promise
|
|
|
|
.all(tokenIds.map((id) => fetchTokenInfo(tokenreg, id, api)))
|
|
|
|
.then((tokens) => {
|
|
|
|
// dispatch only the changed images
|
|
|
|
tokens
|
|
|
|
.forEach((token) => {
|
|
|
|
const { image, address } = token;
|
|
|
|
|
|
|
|
if (images[address] === image) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
dispatch(setTokenImage(address, image));
|
|
|
|
dispatch(setAddressImage(address, image, true));
|
|
|
|
});
|
|
|
|
|
|
|
|
dispatch(setTokens(tokens));
|
|
|
|
dispatch(fetchBalances());
|
|
|
|
})
|
|
|
|
.catch((error) => {
|
|
|
|
console.warn('balances::fetchTokens', error);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
export function fetchBalances (_addresses) {
|
|
|
|
return (dispatch, getState) => {
|
|
|
|
const { api, personal } = getState();
|
2016-12-07 12:47:44 +01:00
|
|
|
const { visibleAccounts, accounts } = personal;
|
2016-11-25 16:46:35 +01:00
|
|
|
|
2016-12-30 12:28:12 +01:00
|
|
|
const addresses = uniq((_addresses || visibleAccounts || []).concat(Object.keys(accounts)));
|
2016-11-25 16:46:35 +01:00
|
|
|
|
|
|
|
if (addresses.length === 0) {
|
|
|
|
return Promise.resolve();
|
|
|
|
}
|
|
|
|
|
|
|
|
const fullFetch = addresses.length === 1;
|
|
|
|
|
2016-12-30 12:28:12 +01:00
|
|
|
const addressesToFetch = uniq(addresses);
|
2016-12-07 12:47:44 +01:00
|
|
|
|
2016-11-25 16:46:35 +01:00
|
|
|
return Promise
|
2016-12-10 23:55:36 +01:00
|
|
|
.all(addressesToFetch.map((addr) => fetchAccount(addr, api, fullFetch)))
|
2016-11-25 16:46:35 +01:00
|
|
|
.then((accountsBalances) => {
|
|
|
|
const balances = {};
|
|
|
|
|
2016-12-10 23:55:36 +01:00
|
|
|
addressesToFetch.forEach((addr, idx) => {
|
2016-11-25 16:46:35 +01:00
|
|
|
balances[addr] = accountsBalances[idx];
|
|
|
|
});
|
|
|
|
|
|
|
|
dispatch(setBalances(balances));
|
|
|
|
updateTokensFilter(addresses)(dispatch, getState);
|
|
|
|
})
|
|
|
|
.catch((error) => {
|
|
|
|
console.warn('balances::fetchBalances', error);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
export function updateTokensFilter (_addresses, _tokens) {
|
|
|
|
return (dispatch, getState) => {
|
|
|
|
const { api, balances, personal } = getState();
|
2016-12-10 23:55:36 +01:00
|
|
|
const { visibleAccounts, accounts } = personal;
|
2016-11-25 16:46:35 +01:00
|
|
|
const { tokensFilter } = balances;
|
|
|
|
|
2016-12-10 23:55:36 +01:00
|
|
|
const addressesToFetch = uniq(visibleAccounts.concat(Object.keys(accounts)));
|
|
|
|
const addresses = uniq(_addresses || addressesToFetch || []).sort();
|
|
|
|
|
2016-11-25 16:46:35 +01:00
|
|
|
const tokens = _tokens || Object.values(balances.tokens) || [];
|
|
|
|
const tokenAddresses = tokens.map((t) => t.address).sort();
|
|
|
|
|
|
|
|
if (tokensFilter.filterFromId || tokensFilter.filterToId) {
|
|
|
|
const sameTokens = isEqual(tokenAddresses, tokensFilter.tokenAddresses);
|
|
|
|
const sameAddresses = isEqual(addresses, tokensFilter.addresses);
|
|
|
|
|
|
|
|
if (sameTokens && sameAddresses) {
|
|
|
|
return queryTokensFilter(tokensFilter)(dispatch, getState);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let promise = Promise.resolve();
|
|
|
|
|
|
|
|
if (tokensFilter.filterFromId) {
|
|
|
|
promise = promise.then(() => api.eth.uninstallFilter(tokensFilter.filterFromId));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (tokensFilter.filterToId) {
|
|
|
|
promise = promise.then(() => api.eth.uninstallFilter(tokensFilter.filterToId));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (tokenAddresses.length === 0 || addresses.length === 0) {
|
|
|
|
return promise;
|
|
|
|
}
|
|
|
|
|
|
|
|
const TRANSFER_SIGNATURE = api.util.sha3('Transfer(address,address,uint256)');
|
|
|
|
const topicsFrom = [ TRANSFER_SIGNATURE, addresses, null ];
|
|
|
|
const topicsTo = [ TRANSFER_SIGNATURE, null, addresses ];
|
|
|
|
|
|
|
|
const options = {
|
|
|
|
fromBlock: 0,
|
|
|
|
toBlock: 'pending',
|
|
|
|
address: tokenAddresses
|
|
|
|
};
|
|
|
|
|
|
|
|
const optionsFrom = {
|
|
|
|
...options,
|
|
|
|
topics: topicsFrom
|
|
|
|
};
|
|
|
|
|
|
|
|
const optionsTo = {
|
|
|
|
...options,
|
|
|
|
topics: topicsTo
|
|
|
|
};
|
|
|
|
|
|
|
|
const newFilters = Promise.all([
|
|
|
|
api.eth.newFilter(optionsFrom),
|
|
|
|
api.eth.newFilter(optionsTo)
|
|
|
|
]);
|
|
|
|
|
|
|
|
promise
|
|
|
|
.then(() => newFilters)
|
|
|
|
.then(([ filterFromId, filterToId ]) => {
|
|
|
|
const nextTokensFilter = {
|
|
|
|
filterFromId, filterToId,
|
|
|
|
addresses, tokenAddresses
|
|
|
|
};
|
|
|
|
|
|
|
|
dispatch(setTokensFilter(nextTokensFilter));
|
|
|
|
fetchTokensBalances(addresses, tokens)(dispatch, getState);
|
|
|
|
})
|
|
|
|
.catch((error) => {
|
|
|
|
console.warn('balances::updateTokensFilter', error);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
export function queryTokensFilter (tokensFilter) {
|
|
|
|
return (dispatch, getState) => {
|
|
|
|
const { api, personal, balances } = getState();
|
2016-12-10 23:55:36 +01:00
|
|
|
const { visibleAccounts, accounts } = personal;
|
|
|
|
|
2016-11-25 16:46:35 +01:00
|
|
|
const visibleAddresses = visibleAccounts.map((a) => a.toLowerCase());
|
2016-12-10 23:55:36 +01:00
|
|
|
const addressesToFetch = uniq(visibleAddresses.concat(Object.keys(accounts)));
|
2016-11-25 16:46:35 +01:00
|
|
|
|
|
|
|
Promise
|
|
|
|
.all([
|
|
|
|
api.eth.getFilterChanges(tokensFilter.filterFromId),
|
|
|
|
api.eth.getFilterChanges(tokensFilter.filterToId)
|
|
|
|
])
|
|
|
|
.then(([ logsFrom, logsTo ]) => {
|
|
|
|
const addresses = [];
|
|
|
|
const tokenAddresses = [];
|
|
|
|
|
|
|
|
logsFrom
|
|
|
|
.concat(logsTo)
|
|
|
|
.forEach((log) => {
|
|
|
|
const tokenAddress = log.address;
|
2016-12-10 23:55:36 +01:00
|
|
|
|
2016-11-25 16:46:35 +01:00
|
|
|
const fromAddress = '0x' + log.topics[1].slice(-40);
|
|
|
|
const toAddress = '0x' + log.topics[2].slice(-40);
|
|
|
|
|
2016-12-10 23:55:36 +01:00
|
|
|
if (addressesToFetch.includes(fromAddress)) {
|
|
|
|
addresses.push(fromAddress);
|
2016-11-25 16:46:35 +01:00
|
|
|
}
|
|
|
|
|
2016-12-10 23:55:36 +01:00
|
|
|
if (addressesToFetch.includes(toAddress)) {
|
|
|
|
addresses.push(toAddress);
|
2016-11-25 16:46:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
tokenAddresses.push(tokenAddress);
|
|
|
|
});
|
|
|
|
|
|
|
|
if (addresses.length === 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-12-02 15:21:01 +01:00
|
|
|
const tokens = Object.values(balances.tokens)
|
|
|
|
.filter((t) => tokenAddresses.includes(t.address));
|
2016-11-25 16:46:35 +01:00
|
|
|
|
|
|
|
fetchTokensBalances(uniq(addresses), tokens)(dispatch, getState);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
export function fetchTokensBalances (_addresses = null, _tokens = null) {
|
|
|
|
return (dispatch, getState) => {
|
|
|
|
const { api, personal, balances } = getState();
|
2016-12-10 23:55:36 +01:00
|
|
|
const { visibleAccounts, accounts } = personal;
|
2016-11-25 16:46:35 +01:00
|
|
|
|
2016-12-10 23:55:36 +01:00
|
|
|
const addressesToFetch = uniq(visibleAccounts.concat(Object.keys(accounts)));
|
|
|
|
const addresses = _addresses || addressesToFetch;
|
2016-11-25 16:46:35 +01:00
|
|
|
const tokens = _tokens || Object.values(balances.tokens);
|
|
|
|
|
|
|
|
if (addresses.length === 0) {
|
|
|
|
return Promise.resolve();
|
|
|
|
}
|
|
|
|
|
|
|
|
return Promise
|
|
|
|
.all(addresses.map((addr) => fetchTokensBalance(addr, tokens, api)))
|
|
|
|
.then((tokensBalances) => {
|
|
|
|
const balances = {};
|
|
|
|
|
|
|
|
addresses.forEach((addr, idx) => {
|
|
|
|
balances[addr] = tokensBalances[idx];
|
|
|
|
});
|
|
|
|
|
|
|
|
dispatch(setBalances(balances));
|
|
|
|
})
|
|
|
|
.catch((error) => {
|
|
|
|
console.warn('balances::fetchTokensBalances', error);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function fetchAccount (address, api, full = false) {
|
|
|
|
const promises = [ api.eth.getBalance(address) ];
|
|
|
|
|
|
|
|
if (full) {
|
|
|
|
promises.push(api.eth.getTransactionCount(address));
|
|
|
|
}
|
|
|
|
|
|
|
|
return Promise
|
|
|
|
.all(promises)
|
|
|
|
.then(([ ethBalance, txCount ]) => {
|
|
|
|
const tokens = [ { token: ETH, value: ethBalance } ];
|
|
|
|
const balance = { tokens };
|
|
|
|
|
|
|
|
if (full) {
|
|
|
|
balance.txCount = txCount;
|
|
|
|
}
|
|
|
|
|
|
|
|
return balance;
|
|
|
|
})
|
|
|
|
.catch((error) => {
|
|
|
|
console.warn('balances::fetchAccountBalance', `couldn't fetch balance for account #${address}`, error);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function fetchTokensBalance (address, _tokens, api) {
|
|
|
|
const tokensPromises = _tokens
|
|
|
|
.map((token) => {
|
|
|
|
return token.contract.instance.balanceOf.call({}, [ address ]);
|
|
|
|
});
|
|
|
|
|
|
|
|
return Promise
|
|
|
|
.all(tokensPromises)
|
|
|
|
.then((tokensBalance) => {
|
|
|
|
const tokens = _tokens
|
|
|
|
.map((token, index) => ({
|
|
|
|
token,
|
|
|
|
value: tokensBalance[index]
|
|
|
|
}));
|
|
|
|
|
|
|
|
const balance = { tokens };
|
|
|
|
return balance;
|
|
|
|
})
|
|
|
|
.catch((error) => {
|
|
|
|
console.warn('balances::fetchTokensBalance', `couldn't fetch tokens balance for account #${address}`, error);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function fetchTokenInfo (tokenreg, tokenId, api, dispatch) {
|
|
|
|
return Promise
|
|
|
|
.all([
|
|
|
|
tokenreg.instance.token.call({}, [tokenId]),
|
|
|
|
tokenreg.instance.meta.call({}, [tokenId, 'IMG'])
|
|
|
|
])
|
|
|
|
.then(([ tokenData, image ]) => {
|
|
|
|
const [ address, tag, format, name ] = tokenData;
|
|
|
|
const contract = api.newContract(ABIS.eip20, address);
|
|
|
|
|
|
|
|
const token = {
|
|
|
|
format: format.toString(),
|
|
|
|
id: tokenId,
|
|
|
|
image: hashToImageUrl(image),
|
|
|
|
address,
|
|
|
|
tag,
|
|
|
|
name,
|
|
|
|
contract
|
|
|
|
};
|
|
|
|
|
|
|
|
return token;
|
|
|
|
})
|
|
|
|
.catch((error) => {
|
|
|
|
console.warn('balances::fetchTokenInfo', `couldn't fetch token #${tokenId}`, error);
|
|
|
|
});
|
|
|
|
}
|