diff --git a/common/badBrowserCheckA.js b/common/badBrowserCheckA.js new file mode 100644 index 00000000..ec2a1658 --- /dev/null +++ b/common/badBrowserCheckA.js @@ -0,0 +1,9 @@ + +// use dates as vars so they're not stripped out by minification +let letCheck = new Date(); +const constCheck = new Date(); +const arrowCheck = (() => new Date())(); + +if (letCheck && constCheck && arrowCheck) { + window.localStorage.setItem('goodBrowser', 'true'); +} diff --git a/common/badBrowserCheckB.js b/common/badBrowserCheckB.js new file mode 100644 index 00000000..51a82334 --- /dev/null +++ b/common/badBrowserCheckB.js @@ -0,0 +1,33 @@ +var badBrowser = false; + +try { + // Local storage + window.localStorage.setItem('test', 'test'); + window.localStorage.removeItem('test'); + + // Flexbox + var elTest = document.createElement('div'); + elTest.style.display = 'flex'; + if (elTest.style.display !== 'flex') { + badBrowser = true; + } + + // const and let check from badBrowserCheckA.js + if (window.localStorage.goodBrowser !== 'true') { + badBrowser = true; + } + window.localStorage.removeItem('goodBrowser'); + +} catch (err) { + badBrowser = true; +} + +if (badBrowser) { + var el = document.getElementsByClassName('BadBrowser')[0]; + el.className += ' is-open'; + // Dumb check for known mobile OS's. Not important to catch all, just + // displays more appropriate information. + if (/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)) { + el.className += ' is-mobile'; + } +} diff --git a/common/config/contracts/rsk_testnet.json b/common/config/contracts/rsk_testnet.json new file mode 100644 index 00000000..cf8d3c9f --- /dev/null +++ b/common/config/contracts/rsk_testnet.json @@ -0,0 +1,8 @@ +[ + { + "name": "Bridge", + "address": "0x0000000000000000000000000000000001000006", + "abi": + "[{ \"name\": \"getFederationAddress\", \"type\": \"function\", \"constant\": true, \"inputs\": [], \"outputs\": [{ \"name\": \"\", \"type\": \"string\" }] }]" + } +] diff --git a/common/config/dpaths.ts b/common/config/dpaths.ts index 1449c582..5af627f2 100644 --- a/common/config/dpaths.ts +++ b/common/config/dpaths.ts @@ -83,6 +83,11 @@ export const RSK_TESTNET: DPath = { value: "m/44'/37310'/0'/0" }; +export const RSK_MAINNET: DPath = { + label: 'Mainnet (RSK)', + value: "m/44'/137'/0'/0" +}; + export const GO_DEFAULT: DPath = { label: 'Default (GO)', value: "m/44'/6060'/0'/0" @@ -114,6 +119,7 @@ export const DPaths: DPath[] = [ ETSC_DEFAULT, EGEM_DEFAULT, CLO_DEFAULT, + RSK_MAINNET, RSK_TESTNET, GO_DEFAULT, EOSC_DEFAULT, diff --git a/common/config/tokens/rsk.json b/common/config/tokens/rsk.json index fe51488c..0637a088 100644 --- a/common/config/tokens/rsk.json +++ b/common/config/tokens/rsk.json @@ -1 +1 @@ -[] +[] \ No newline at end of file diff --git a/common/config/tokens/rsk_testnet.json b/common/config/tokens/rsk_testnet.json new file mode 100644 index 00000000..fe51488c --- /dev/null +++ b/common/config/tokens/rsk_testnet.json @@ -0,0 +1 @@ +[] diff --git a/common/features/config/networks/static/reducer.ts b/common/features/config/networks/static/reducer.ts index cab27ae8..3f1f2846 100644 --- a/common/features/config/networks/static/reducer.ts +++ b/common/features/config/networks/static/reducer.ts @@ -21,6 +21,7 @@ import { ETSC_DEFAULT, EGEM_DEFAULT, CLO_DEFAULT, + RSK_MAINNET, RSK_TESTNET, GO_DEFAULT, EOSC_DEFAULT, @@ -369,6 +370,32 @@ export const STATIC_NETWORKS_INITIAL_STATE: StaticNetworksState = { } }, + RSK: { + id: 'RSK', + name: 'RSK', + unit: 'SBTC', + chainId: 30, + color: '#58A052', + isCustom: false, + blockExplorer: makeExplorer({ + name: 'RSK Explorer', + origin: 'https://explorer.rsk.co' + }), + tokens: require('config/tokens/rsk.json'), + contracts: require('config/contracts/rsk.json'), + isTestnet: false, + dPathFormats: { + [SecureWalletName.TREZOR]: RSK_MAINNET, + [SecureWalletName.LEDGER_NANO_S]: RSK_MAINNET, + [InsecureWalletName.MNEMONIC_PHRASE]: RSK_MAINNET + }, + gasPriceSettings: { + min: 0.183, + max: 1.5, + initial: 0.183 + } + }, + RSK_TESTNET: { id: 'RSK_TESTNET', name: 'RSK', @@ -380,8 +407,8 @@ export const STATIC_NETWORKS_INITIAL_STATE: StaticNetworksState = { name: 'RSK Testnet Explorer', origin: 'https://explorer.testnet.rsk.co' }), - tokens: require('config/tokens/rsk.json'), - contracts: require('config/contracts/rsk.json'), + tokens: require('config/tokens/rsk_testnet.json'), + contracts: require('config/contracts/rsk_testnet.json'), isTestnet: true, dPathFormats: { [SecureWalletName.TREZOR]: RSK_TESTNET, diff --git a/common/index.html b/common/index.html index 0b00eab7..cac71d94 100644 --- a/common/index.html +++ b/common/index.html @@ -71,40 +71,6 @@ - diff --git a/common/libs/nodes/configs.ts b/common/libs/nodes/configs.ts index a660f08c..951a5483 100644 --- a/common/libs/nodes/configs.ts +++ b/common/libs/nodes/configs.ts @@ -168,6 +168,15 @@ export const NODE_CONFIGS: { [key in StaticNetworkIds]: RawNodeConfig[] } = { } ], + RSK: [ + { + name: makeNodeName('RSK', 'rsk_mainnet'), + type: 'rpc', + service: 'mycrypto.rsk.co', + url: 'https://mycrypto.rsk.co/' + } + ], + RSK_TESTNET: [ { name: makeNodeName('RSK_TESTNET', 'rsk_testnet'), diff --git a/shared/types/network.d.ts b/shared/types/network.d.ts index 5913b900..8a7a8554 100644 --- a/shared/types/network.d.ts +++ b/shared/types/network.d.ts @@ -13,6 +13,7 @@ type StaticNetworkIds = | 'ETSC' | 'EGEM' | 'CLO' + | 'RSK' | 'RSK_TESTNET' | 'GO' | 'EOSC' diff --git a/spec/libs/validators.spec.ts b/spec/libs/validators.spec.ts index 342f6ed9..8dc74a3f 100644 --- a/spec/libs/validators.spec.ts +++ b/spec/libs/validators.spec.ts @@ -16,6 +16,7 @@ configuredStore.getState(); const VALID_BTC_ADDRESS = '1MEWT2SGbqtz6mPCgFcnea8XmWV5Z4Wc6'; const VALID_ETH_ADDRESS = '0x7cB57B5A97eAbe94205C07890BE4c1aD31E486A8'; const VALID_RSK_TESTNET_ADDRESS = '0x5aAeb6053F3e94c9b9A09F33669435E7EF1BEaEd'; +const VALID_RSK_MAINNET_ADDRESS = '0x5aaEB6053f3e94c9b9a09f33669435E7ef1bEAeD'; const VALID_ETH_PRIVATE_KEY = '3f4fd89ea4970cc77bfd2d07a95786575ea62e183857afe6301578e1a3c5c782'; const INVALID_ETH_PRIVATE_KEY = '3f4fd89ea4970cc77bfd2d07a95786575ea62e183857afe6301578e1a3c5ZZZZ'; const VALID_ETH_PRIVATE_BUFFER = Buffer.from(VALID_ETH_PRIVATE_KEY, 'hex'); @@ -50,6 +51,12 @@ describe('Validator', () => { it('should validate correct RSK address in RSK mainnet network as false', () => { expect(isValidAddress(VALID_RSK_TESTNET_ADDRESS, RSK_MAINNET_CHAIN_ID)).toBeFalsy(); }); + it('should validate correct RSK address in RSK mainnet network as true', () => { + expect(isValidAddress(VALID_RSK_MAINNET_ADDRESS, RSK_MAINNET_CHAIN_ID)).toBeTruthy(); + }); + it('should validate correct RSK mainnet address in RSK testnet network as false', () => { + expect(isValidAddress(VALID_RSK_MAINNET_ADDRESS, RSK_TESTNET_CHAIN_ID)).toBeFalsy(); + }); it('should validate an incorrect DPath as false', () => { expect(isValidPath('m/44/60/0/0')).toBeFalsy(); }); diff --git a/webpack_config/makeConfig.js b/webpack_config/makeConfig.js index 365c2b09..d9304990 100644 --- a/webpack_config/makeConfig.js +++ b/webpack_config/makeConfig.js @@ -32,6 +32,8 @@ module.exports = function(opts = {}) { // ====== Entry ======= // ==================== const entry = { + badBrowserCheckA: './common/badBrowserCheckA.js', + badBrowserCheckB: './common/badBrowserCheckB.js', client: './common/index.tsx' };