diff --git a/web/cashtab/src/components/Common/Ticker.js b/web/cashtab/src/components/Common/Ticker.js --- a/web/cashtab/src/components/Common/Ticker.js +++ b/web/cashtab/src/components/Common/Ticker.js @@ -1,6 +1,6 @@ import mainLogo from '@assets/logo_primary.png'; import tokenLogo from '@assets/logo_secondary.png'; -import cashaddr from 'cashaddrjs'; +import cashaddr from 'ecashaddrjs'; import BigNumber from 'bignumber.js'; export const currency = { @@ -8,7 +8,7 @@ ticker: 'XEC', logo: mainLogo, legacyPrefix: 'bitcoincash', - prefixes: ['bitcoincash', 'ecash'], + prefixes: ['ecash'], coingeckoId: 'bitcoin-cash-abc-2', defaultFee: 2.01, dustSats: 550, @@ -20,7 +20,7 @@ tokenName: 'eToken', tokenTicker: 'eToken', tokenLogo: tokenLogo, - tokenPrefixes: ['simpleledger', 'etoken'], + tokenPrefixes: ['etoken'], tokenIconsUrl: '', //https://tokens.bitcoin.com/32 for BCH SLP useBlockchainWs: false, txHistoryCount: 5, @@ -131,7 +131,7 @@ return legacyAddress; } -export function parseAddress(BCH, addressString) { +export function parseAddress(BCH, addressString, isToken = false) { // Build return obj const addressInfo = { address: '', @@ -149,6 +149,16 @@ let isValidAddress; try { isValidAddress = BCH.Address.isCashAddress(cleanAddress); + // Only accept addresses with ecash: prefix + const { prefix } = cashaddr.decode(cleanAddress); + // If the address does not have a valid prefix or token prefix + if ( + (!isToken && !currency.prefixes.includes(prefix)) || + (isToken && !currency.tokenPrefixes.includes(prefix)) + ) { + // then it is not a valid destination address for XEC sends + isValidAddress = false; + } } catch (err) { isValidAddress = false; } diff --git a/web/cashtab/src/components/Common/__tests__/Ticker.test.js b/web/cashtab/src/components/Common/__tests__/Ticker.test.js --- a/web/cashtab/src/components/Common/__tests__/Ticker.test.js +++ b/web/cashtab/src/components/Common/__tests__/Ticker.test.js @@ -1,11 +1,11 @@ import { ValidationError } from 'cashaddrjs'; import { isValidCashPrefix, isValidTokenPrefix, toLegacy } from '../Ticker'; -test('Correctly validates cash address with bitcoincash: prefix', async () => { +test('Rejects cash address with bitcoincash: prefix', async () => { const result = isValidCashPrefix( 'bitcoincash:qqd3qn4zazjhygk5a2vzw2gvqgqwempr4gjykk3wa0', ); - expect(result).toStrictEqual(true); + expect(result).toStrictEqual(false); }); test('Correctly validates cash address with bitcoincash: checksum but no prefix', async () => { @@ -29,11 +29,11 @@ expect(result).toStrictEqual(true); }); -test('Correctly validates token address with simpleledger: prefix', async () => { +test('Rejects token address with simpleledger: prefix', async () => { const result = isValidTokenPrefix( 'simpleledger:qpmytrdsakt0axrrlswvaj069nat3p9s7c8w5tu8gm', ); - expect(result).toStrictEqual(true); + expect(result).toStrictEqual(false); }); test('Does not accept a valid token address without a prefix', async () => { @@ -85,15 +85,6 @@ ); }); -test('toLegacy() returns a valid bitcoincash: prefix address unchanged', async () => { - const result = toLegacy( - 'bitcoincash:qqd3qn4zazjhygk5a2vzw2gvqgqwempr4gjykk3wa0', - ); - expect(result).toStrictEqual( - 'bitcoincash:qqd3qn4zazjhygk5a2vzw2gvqgqwempr4gjykk3wa0', - ); -}); - test('toLegacy throws error if input address has invalid checksum', async () => { const result = toLegacy('ecash:qqd3qn4zazjhygk5a2vzw2gvqgqwempr4gtfza25m'); diff --git a/web/cashtab/src/components/Send/SendToken.js b/web/cashtab/src/components/Send/SendToken.js --- a/web/cashtab/src/components/Send/SendToken.js +++ b/web/cashtab/src/components/Send/SendToken.js @@ -196,8 +196,8 @@ let error = false; let addressString = value; - // parse address - const addressInfo = parseAddress(BCH, addressString); + + const addressInfo = parseAddress(BCH, addressString, true); /* Model @@ -218,7 +218,7 @@ // Is this valid address? if (!isValid) { - error = 'Address is not valid'; + error = 'Address is not a valid etoken: address'; // If valid address but token format } else if (!isValidTokenPrefix(address)) { error = `Cashtab only supports sending to ${currency.tokenPrefixes[0]} prefixed addresses`;