Skip to content

Commit

Permalink
[DDW-56, DDW-6, DDW-50, DDW-47] Bech32 adresses validation (#1902)
Browse files Browse the repository at this point in the history
* [DDW-56] Introduce Bech32 address validation

* [DDW-56] Add yarn.lock bech32 entry

* [DDW-56] Configure Legacy wallet send / receive tabs

* [DDW-56] Remove Legacy topbar notifications outside ITN

* [DDW-56] Code cleanup

* [DDW-56] Fix flow issues and run prettier

* [DDW-56] Remove bech32 byron address validation

* [DDW-56] Remove Network info sidebar label from mainnet

* [DDW-56] Code cleanup

* [DDW-56] Restore Byron wallet Receive screen with address creation

* [DDW-56] Add missing Byron receive screen translations

* [DDW-56] Code cleanup and improvements

* [DDW-56] Add address creation actions and faked api method

* [DDW-56] Update wallet receive storybook stories

* [DDW-56] Add byron address creation request and address types improvement

* [DDW-56] Update api methodes logging function

* [DDW-56] Add full staging iconset

* [DDW-56] Code and Flow improvements

* [DDW-56] Remove mainnet sidebar label rejection

* [DDW-56] Wallet settings change / create wallet password improvement

* [DDW-56] CHANGELOG update

* [DDW-56] Improve CHANGELOG

* [DDW-56] Remove unnecesarry isLegacy declaration and password encryption

* [DDW-56] Improve address validation

* [DDW-56] Create Byron wallet address request improvement due to api documentation update

* [DDW-56] Removing wallet specific from Navigation component

* [DDW-64] Code improvements

* [DDW-56] Adjustments

Co-authored-by: Nikola Glumac <niglumac@gmail.com>
Co-authored-by: Danilo Prates <daniloprates@gmail.com>
  • Loading branch information
3 people committed Mar 25, 2020
1 parent 164d984 commit eac236b
Show file tree
Hide file tree
Showing 84 changed files with 1,525 additions and 507 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ Changelog
- Added support for `cardano-node` "Selfnode" network ([PR 1897](https://github.com/input-output-hk/daedalus/pull/1897))
- Enabled Byron wallet creation for Haskell node builds ([PR 1895](https://github.com/input-output-hk/daedalus/pull/1895))
- Enabled all Mainnet Daedalus features for Byron wallets for Haskell node builds ([PR 1895](https://github.com/input-output-hk/daedalus/pull/1895))
- Enabled changing spending password in "Wallet settings" for Haskell node builds ([PR 1902](https://github.com/input-output-hk/daedalus/pull/1902))
- Enabled "Send" feature for Haskell node builds ([PR 1902](https://github.com/input-output-hk/daedalus/pull/1902))
- Disabled transfer funds notification for Haskell node builds ([PR 1902](https://github.com/input-output-hk/daedalus/pull/1902))
- Disabled Shelley wallets and delegation features for Haskell node builds ([PR 1895](https://github.com/input-output-hk/daedalus/pull/1895))
- Disabled "Data layer migration" notification for Haskell node builds ([PR 1895](https://github.com/input-output-hk/daedalus/pull/1895))
- Disabled "Paper wallet certificate" creation for Haskell node builds ([PR 1895](https://github.com/input-output-hk/daedalus/pull/1895))
Expand All @@ -23,6 +26,7 @@ Changelog

### Chores

- Updated Byron Haskell address validation ([PR 1902](https://github.com/input-output-hk/daedalus/pull/1902))
- Updated test configuration to cover Byron features only ([PR 1895](https://github.com/input-output-hk/daedalus/pull/1895))
- Optimized e2e tests ([PR 1874](https://github.com/input-output-hk/daedalus/pull/1874))
- Updated `react-polymorph` dependency ([PR 1882](https://github.com/input-output-hk/daedalus/pull/1882))
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified installers/icons/staging.iconset/icon_128x128.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified installers/icons/staging.iconset/icon_128x128@2x.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified installers/icons/staging.iconset/icon_16x16.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified installers/icons/staging.iconset/icon_16x16@2x.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added installers/icons/staging.iconset/icon_18x18.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added installers/icons/staging.iconset/icon_19x19.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added installers/icons/staging.iconset/icon_22x22.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified installers/icons/staging.iconset/icon_24x24.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified installers/icons/staging.iconset/icon_24x24@2x.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified installers/icons/staging.iconset/icon_256x256.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified installers/icons/staging.iconset/icon_256x256@2x.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified installers/icons/staging.iconset/icon_32x32.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified installers/icons/staging.iconset/icon_32x32@2x.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified installers/icons/staging.iconset/icon_40x40.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified installers/icons/staging.iconset/icon_40x40@2x.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified installers/icons/staging.iconset/icon_48x48.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified installers/icons/staging.iconset/icon_48x48@2x.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified installers/icons/staging.iconset/icon_512x512.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified installers/icons/staging.iconset/icon_512x512@2x.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified installers/icons/staging.iconset/icon_64x64.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified installers/icons/staging.iconset/icon_64x64@2x.png
Binary file modified installers/icons/staging/1024x1024.png
Binary file modified installers/icons/staging/128x128.ico
Binary file not shown.
Binary file modified installers/icons/staging/128x128.png
Binary file modified installers/icons/staging/16x16.ico
Binary file not shown.
Binary file modified installers/icons/staging/16x16.png
Binary file modified installers/icons/staging/18x18.ico
Binary file not shown.
Binary file modified installers/icons/staging/18x18.png
Binary file modified installers/icons/staging/19x19.ico
Binary file not shown.
Binary file modified installers/icons/staging/19x19.png
Binary file modified installers/icons/staging/22x22.ico
Binary file not shown.
Binary file modified installers/icons/staging/22x22.png
Binary file modified installers/icons/staging/24x24.ico
Binary file not shown.
Binary file modified installers/icons/staging/24x24.png
Binary file modified installers/icons/staging/256x256.ico
Binary file not shown.
Binary file modified installers/icons/staging/256x256.png
Binary file modified installers/icons/staging/32x32.ico
Binary file not shown.
Binary file modified installers/icons/staging/32x32.png
Binary file modified installers/icons/staging/40x40.ico
Binary file not shown.
Binary file modified installers/icons/staging/40x40.png
Binary file modified installers/icons/staging/48x48.ico
Binary file not shown.
Binary file modified installers/icons/staging/48x48.png
Binary file modified installers/icons/staging/512x512.png
Binary file modified installers/icons/staging/64x64.ico
Binary file not shown.
Binary file modified installers/icons/staging/64x64.png
Binary file modified installers/icons/staging/staging.ico
Binary file not shown.
12 changes: 12 additions & 0 deletions source/renderer/app/actions/addresses-actions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// @flow
import Action from './lib/Action';

// ======= ADDRESSES ACTIONS =======

export default class AddressesActions {
createByronWalletAddress: Action<{
walletId: string,
passphrase: string,
}> = new Action();
resetErrors: Action<any> = new Action();
}
3 changes: 3 additions & 0 deletions source/renderer/app/actions/index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// @flow
import AddressesActions from './addresses-actions';
import AppActions from './app-actions';
import DialogsActions from './dialogs-actions';
import NetworkStatusActions from './network-status-actions';
Expand All @@ -15,6 +16,7 @@ import WalletSettingsActions from './wallet-settings-actions';
import WindowActions from './window-actions';

export type ActionsMap = {
addresses: AddressesActions,
app: AppActions,
dialogs: DialogsActions,
networkStatus: NetworkStatusActions,
Expand All @@ -32,6 +34,7 @@ export type ActionsMap = {
};

const actionsMap: ActionsMap = {
addresses: new AddressesActions(),
app: new AppActions(),
dialogs: new DialogsActions(),
networkStatus: new NetworkStatusActions(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// @flow
import type { RequestConfig } from '../../common/types';
import type { Address } from '../types';
import { request } from '../../utils/request';
import { getRawWalletId } from '../../utils';

export type CreateAddressParams = {
walletId: string,
passphrase: string,
addressIndex?: number,
};

export const createByronWalletAddress = (
config: RequestConfig,
{ passphrase, addressIndex, walletId }: CreateAddressParams
): Promise<Address> => {
let data = { passphrase };
data = addressIndex ? { ...data, address_index: addressIndex } : data;
return request(
{
method: 'POST',
path: `/v2/byron-wallets/${getRawWalletId(walletId)}/addresses`,
...config,
},
{},
data
);
};
8 changes: 8 additions & 0 deletions source/renderer/app/api/addresses/types.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,11 @@ export type GetAddressesRequest = {
isLegacy: boolean,
queryParams?: GetAddressesRequestQueryParams,
};

// Byron related types

export type CreateByronWalletAddressRequest = {
walletId: string,
passphrase: string,
addressIndex?: number,
};
33 changes: 32 additions & 1 deletion source/renderer/app/api/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import WalletAddress from '../domains/WalletAddress';

// Addresses requests
import { getAddresses } from './addresses/requests/getAddresses';
import { createByronWalletAddress } from './addresses/requests/createByronWalletAddress';

// Network requests
import { getNetworkInfo } from './network/requests/getNetworkInfo';
Expand Down Expand Up @@ -103,7 +104,11 @@ import {
import { FORCED_WALLET_RESYNC_WAIT } from '../config/timingConfig';

// Addresses Types
import type { Address, GetAddressesRequest } from './addresses/types';
import type {
Address,
GetAddressesRequest,
CreateByronWalletAddressRequest,
} from './addresses/types';

// Common Types
import type { RequestConfig } from './common/types';
Expand Down Expand Up @@ -722,6 +727,31 @@ export default class AdaApi {
}
};

createAddress = async (
request: CreateByronWalletAddressRequest
): Promise<WalletAddress> => {
logger.debug('AdaApi::createAddress called', {
parameters: filterLogData(request),
});
const { addressIndex, walletId, passphrase: passwordString } = request;
const passphrase = passwordString || '';
try {
const address: Address = await createByronWalletAddress(this.config, {
passphrase,
walletId,
addressIndex,
});
logger.debug('AdaApi::createAddress success', { address });
return _createAddressFromServerData(address);
} catch (error) {
logger.error('AdaApi::createAddress error', { error });
if (error.message === 'CannotCreateAddress') {
throw new IncorrectSpendingPasswordError();
}
throw new GenericApiError();
}
};

deleteTransaction = async (
request: DeleteTransactionRequest
): Promise<void> => {
Expand Down Expand Up @@ -1753,6 +1783,7 @@ const _createWalletFromServerData = action(
reward: walletRewardAmount,
passwordUpdateDate:
passphraseLastUpdatedAt && new Date(passphraseLastUpdatedAt),
hasPassword: passphraseLastUpdatedAt !== null,
syncState,
isLegacy,
delegatedStakePoolId,
Expand Down
2 changes: 2 additions & 0 deletions source/renderer/app/components/layout/TopBar.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ export default class TopBar extends Component<Props> {
onWalletAdd,
onLearnMore,
} = this.props;
const { isIncentivizedTestnet } = global;

const topBarStyles = classNames([
styles.topBar,
Expand All @@ -44,6 +45,7 @@ export default class TopBar extends Component<Props> {
const hasLegacyNotification =
activeWallet &&
activeWallet.isLegacy &&
isIncentivizedTestnet &&
activeWallet.amount.gt(0) &&
!activeWallet.isRestoring &&
((hasRewardsWallets && onTransferFunds) || onWalletAdd);
Expand Down
7 changes: 1 addition & 6 deletions source/renderer/app/components/navigation/NavDropdown.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ type Props = {
options: Array<{
value: number | string,
label: string,
isLegacy?: boolean,
}>,
onChange: Function,
hasNotification?: boolean,
Expand All @@ -32,10 +31,6 @@ export default class NavDropdown extends Component<Props> {
activeItem,
hasNotification,
} = this.props;
let filteredOptions = options;
if (options) {
filteredOptions = options.filter(option => !option.isLegacy);
}
const componentStyles = classnames([
styles.component,
hasNotification ? styles.hasNotification : null,
Expand All @@ -58,7 +53,7 @@ export default class NavDropdown extends Component<Props> {
optionRenderer={o => (
<div className={styles.optionLabel}>{o.label}</div>
)}
items={filteredOptions}
items={options}
activeItem={options.find(o => o.value === activeItem)}
noArrow
optionHeight={32}
Expand Down
67 changes: 28 additions & 39 deletions source/renderer/app/components/navigation/Navigation.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,21 @@ export type NavButtonProps = {
id: string,
label: string,
icon?: string,
isLegacy?: boolean,
hasNotification?: boolean,
};

export type NavDropdownProps = {
...$Exact<NavButtonProps>,
type: 'dropdown',
options: Array<{ value: number | string, label: string, isLegacy?: boolean }>,
options: Array<{ value: number | string, label: string }>,
hasNotification?: boolean,
};

type Props = {
activeItem: string,
isActiveNavItem?: Function,
onNavItemClick: Function,
isLegacy?: boolean,
items: Array<NavButtonProps | NavDropdownProps>,
};

Expand All @@ -47,46 +47,35 @@ export default class Navigation extends Component<Props> {
onNavItemClick,
activeItem,
items,
isLegacy,
} = this.props;
const { isIncentivizedTestnet } = global;

return (
<div className={styles.component}>
{items.map(({ id, icon, label, isLegacy, hasNotification, ...item }) =>
item.type === 'dropdown'
? (!isLegacy && (
<NavDropdown
key={id}
label={label}
icon={icon}
isActive={isActiveNavItem(id, item)}
onChange={i => onNavItemClick(i)}
isLegacy={isLegacy}
activeItem={activeItem}
options={item.options}
hasNotification={hasNotification}
/>
)) ||
(isLegacy && (
<NavButton
key={id}
className={id}
label={label}
icon={icon}
isActive={isActiveNavItem(id, item)}
onClick={() => onNavItemClick(id)}
hasNotification={hasNotification}
/>
))
: !isLegacy && (
<NavButton
key={id}
className={id}
label={label}
icon={icon}
isActive={isActiveNavItem(id, item)}
onClick={() => onNavItemClick(id)}
hasNotification={hasNotification}
/>
)
{items.map(({ id, icon, label, hasNotification, ...item }) =>
item.type === 'dropdown' && !(isIncentivizedTestnet && isLegacy) ? (
<NavDropdown
key={id}
label={label}
icon={icon}
isActive={isActiveNavItem(id, item)}
onChange={i => onNavItemClick(i)}
activeItem={activeItem}
options={item.options}
hasNotification={hasNotification}
/>
) : (
<NavButton
key={id}
className={id}
label={label}
icon={icon}
isActive={isActiveNavItem(id, item)}
onClick={() => onNavItemClick(id)}
hasNotification={hasNotification}
/>
)
)}
</div>
);
Expand Down
Loading

0 comments on commit eac236b

Please sign in to comment.