diff --git a/package.json b/package.json index a52095d..01d9ce4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cyano-wallet", - "version": "0.7.6", + "version": "0.7.7", "private": true, "scripts": { "lint": "tslint -p .", diff --git a/public/manifest.json b/public/manifest.json index fb3521d..94d4cc4 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -4,7 +4,7 @@ "name": "Cyano wallet", "author": "Matus Zamborsky ", "description": "Cyano wallet - an Ontology wallet", - "version": "0.7.6", + "version": "0.7.7", "browser_action": { "default_title": "Open the wallet" diff --git a/src/api/utils.ts b/src/api/utils.ts new file mode 100644 index 0000000..d6b260a --- /dev/null +++ b/src/api/utils.ts @@ -0,0 +1,9 @@ +export function isHexadecimal(str: string) { + const regexp = /^[0-9a-fA-F]+$/; + + if (regexp.test(str)) { + return str.length % 2 === 0; + } else { + return false; + } +} diff --git a/src/background/api/tokenApi.ts b/src/background/api/tokenApi.ts index 835a746..cb464ea 100644 --- a/src/background/api/tokenApi.ts +++ b/src/background/api/tokenApi.ts @@ -10,8 +10,12 @@ import { getStore } from '../redux'; import Address = Crypto.Address; import Oep4TxBuilder = Oep4.Oep4TxBuilder; +import { isHexadecimal } from 'src/api/utils'; export async function getOEP4Token(contract: string): Promise { + if (!isHexadecimal(contract)) { + throw new Error('Contract is not hexadecimal string'); + } contract = utils.reverseHex(contract); const builder = new Oep4TxBuilder(new Address(contract)); diff --git a/src/popup/pages/tokenSettingsAdd/tokenSettingsAdd.tsx b/src/popup/pages/tokenSettingsAdd/tokenSettingsAdd.tsx index 7f71620..3c0083d 100644 --- a/src/popup/pages/tokenSettingsAdd/tokenSettingsAdd.tsx +++ b/src/popup/pages/tokenSettingsAdd/tokenSettingsAdd.tsx @@ -34,7 +34,7 @@ const mapDispatchToProps = (dispatch: Dispatch) => { addToken: Actions.settings.addToken, finishLoading: Actions.loader.finishLoading, - startLoading: Actions.loader.startLoading + startLoading: Actions.loader.startLoading, }, dispatch, ); @@ -48,17 +48,28 @@ const enhancer = (Component: React.ComponentType) => (props: RouteCompone }, handleConfirm: async (values: object) => { const contract: string = get(values, 'contract'); - + await actions.startLoading(); - const manager = getBackgroundManager(); - const token = await manager.getOEP4Token(contract); - - // todo: proper spec - await actions.addToken(contract, token.name, token.symbol, token.decimals, 'OEP-4'); - await actions.finishLoading(); + try { + const manager = getBackgroundManager(); + const token = await manager.getOEP4Token(contract); + + // todo: proper spec + await actions.addToken(contract, token.name, token.symbol, token.decimals, 'OEP-4'); + + await actions.finishLoading(); + + props.history.push('/settings/token'); + + return {}; + } catch (e) { + await actions.finishLoading(); - props.history.push('/settings/token'); + return { + contract: 'Invalid contract', + }; + } }, loading: reduxProps.loading, }, diff --git a/src/popup/pages/tokenSettingsAdd/tokenSettingsAddView.tsx b/src/popup/pages/tokenSettingsAdd/tokenSettingsAddView.tsx index 31a1f11..a4bacad 100644 --- a/src/popup/pages/tokenSettingsAdd/tokenSettingsAddView.tsx +++ b/src/popup/pages/tokenSettingsAdd/tokenSettingsAddView.tsx @@ -19,11 +19,11 @@ import * as React from 'react'; import { Field, Form } from 'react-final-form'; import { Button, Form as SemanticForm } from 'semantic-ui-react'; import { AccountLogoHeader, Filler, Spacer, StatusBar, View } from '../../components'; -import { required } from '../../utils/validate'; +import { tokenValid } from '../../utils/validate'; export interface Props { loading: boolean; - handleConfirm: (values: object) => Promise; + handleConfirm: (values: object) => Promise; handleCancel: () => void; } @@ -46,7 +46,7 @@ export const TokenSettingsAddView: React.SFC = (props) => ( ( = (props) => ( - + )} diff --git a/src/popup/utils/validate.ts b/src/popup/utils/validate.ts index 9858c1c..ae0f0d0 100644 --- a/src/popup/utils/validate.ts +++ b/src/popup/utils/validate.ts @@ -15,8 +15,9 @@ * You should have received a copy of the GNU Lesser General Public License * along with The Ontology Wallet&ID. If not, see . */ -import { get } from 'lodash'; +import { get } from 'lodash'; import { utils } from 'ontology-ts-sdk'; +import { isHexadecimal } from 'src/api/utils'; export function validMnemonics(value: string) { try { utils.parseMnemonic(value); @@ -24,7 +25,7 @@ export function validMnemonics(value: string) { } catch (e) { return true; } -}; +} export function samePassword(values: object) { const password = get(values, 'password', ''); @@ -32,46 +33,50 @@ export function samePassword(values: object) { if (password !== passwordAgain) { return { - passwordAgain: "Password does not match" - } + passwordAgain: 'Password does not match', + }; } return {}; } -export function required(value: string){ - return (value === undefined || value.trim().length === 0); +export function tokenValid(value: string) { + return required(value) || !isHexadecimal(value) || value.length !== 40; } -export function range(from: number, to: number){ - return function rangeCheck(value: string){ +export function required(value: string) { + return value === undefined || value.trim().length === 0; +} + +export function range(from: number, to: number) { + return function rangeCheck(value: string) { if (value === undefined) { return true; - } + } const val = Number(value); - return (val <= from || val > to); - } + return val <= from || val > to; + }; } -export function gt(than: number){ - return function gtCheck(value: string){ +export function gt(than: number) { + return function gtCheck(value: string) { if (value === undefined) { return true; - } + } const val = Number(value); - return (val <= than); - } + return val <= than; + }; } -export function gte(than: number){ - return function gtCheck(value: string){ +export function gte(than: number) { + return function gtCheck(value: string) { if (value === undefined) { return true; - } + } const val = Number(value); - return (val < than); - } + return val < than; + }; }