From 3f52dcd6b813e23fd066646a5ace090d5bf0746d Mon Sep 17 00:00:00 2001 From: Paul Bouchon Date: Tue, 7 Aug 2018 10:33:18 -0400 Subject: [PATCH] InpageBridge and BackgroundBridge (#26) --- .gitignore | 7 +- .prettierignore | 8 +- app/components/App/index.js | 4 +- app/components/Browser/index.js | 20 +- app/components/BrowserScreen/index.js | 10 +- app/core/BackgroundBridge.js | 45 ++ app/core/BackgroundBridge.test.js | 66 ++ app/core/Engine.test.js | 18 + app/core/InpageBridge.js | 92 +++ app/core/InpageBridge.test.js | 115 ++++ app/entry-web3.node.js | 3 - app/entry.node.js | 2 - app/util/setProvider.js | 2 + ios/MetaMask.xcodeproj/project.pbxproj | 87 ++- package-lock.json | 868 ++++--------------------- package.json | 12 +- scripts/copy-android-assets.sh | 4 +- 17 files changed, 545 insertions(+), 818 deletions(-) create mode 100644 app/core/BackgroundBridge.js create mode 100644 app/core/BackgroundBridge.test.js create mode 100644 app/core/Engine.test.js create mode 100644 app/core/InpageBridge.js create mode 100644 app/core/InpageBridge.test.js delete mode 100644 app/entry-web3.node.js delete mode 100644 app/entry.node.js create mode 100644 app/util/setProvider.js diff --git a/.gitignore b/.gitignore index a2d06ff28a0..bf01c765d8e 100644 --- a/.gitignore +++ b/.gitignore @@ -49,8 +49,7 @@ buck-out/ coverage # app-specific -/android/app/src/main/assets/entry-web3.js -/android/app/src/main/assets/entry.js -/app/entry-web3.js -/app/entry.js +/android/app/src/main/assets/InpageBridge.js +/android/app/src/main/assets/InpageBridgeWeb3.js +/app/core/InpageBridgeWeb3.js /shim.js diff --git a/.prettierignore b/.prettierignore index 5833f809555..569d0b9b55d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,8 +1,6 @@ -/app/entry.js -/app/entry-web3.js -/android/app/src/main/assets/entry.js -/android/app/src/main/assets/entry-web3.js -/app/entry.js +/android/app/src/main/assets/InpageBridge.js +/android/app/src/main/assets/InpageBridgeWeb3.js +/app/core/InpageBridgeWeb3.js /shim.js /shim.js __snapshots__ diff --git a/app/components/App/index.js b/app/components/App/index.js index ccc892860de..4b06f0c392c 100644 --- a/app/components/App/index.js +++ b/app/components/App/index.js @@ -19,7 +19,9 @@ const engine = new Engine(); export default createBottomTabNavigator( { Home: { - screen: BrowserScreen, + screen: function Home() { + return ; + }, navigationOptions: () => ({ title: 'ÐApps', tabBarIcon: ico => // eslint-disable-line react/display-name diff --git a/app/components/Browser/index.js b/app/components/Browser/index.js index 46e77e13de0..757706fb0eb 100644 --- a/app/components/Browser/index.js +++ b/app/components/Browser/index.js @@ -5,6 +5,7 @@ import RNFS from 'react-native-fs'; import CustomWebview from '../CustomWebview'; // eslint-disable-line import/no-unresolved import { Alert, Platform, StyleSheet, TextInput, View } from 'react-native'; import { colors, baseStyles } from '../../styles/common'; +import BackgroundBridge from '../../core/BackgroundBridge'; const styles = StyleSheet.create({ urlBar: { @@ -50,7 +51,11 @@ export default class Browser extends Component { /** * Initial URL to load in the WebView */ - defaultURL: PropTypes.string.isRequired + defaultURL: PropTypes.string.isRequired, + /** + * Instance of a core engine object + */ + engine: PropTypes.object.isRequired }; state = { @@ -70,16 +75,18 @@ export default class Browser extends Component { webview = React.createRef(); async componentDidMount() { + this.backgroundBridge = new BackgroundBridge(this.props.engine, this.webview); + // TODO: The presence of these async statement breaks Jest code coverage const entryScript = Platform.OS === 'ios' - ? await RNFS.readFile(`${RNFS.MainBundlePath}/entry.js`, 'utf8') - : await RNFS.readFileAssets(`entry.js`); + ? await RNFS.readFile(`${RNFS.MainBundlePath}/InpageBridge.js`, 'utf8') + : await RNFS.readFileAssets(`InpageBridge.js`); const entryScriptWeb3 = Platform.OS === 'ios' - ? await RNFS.readFile(`${RNFS.MainBundlePath}/entry-web3.js`, 'utf8') - : await RNFS.readFileAssets(`entry-web3.js`); + ? await RNFS.readFile(`${RNFS.MainBundlePath}/InpageBridgeWeb3.js`, 'utf8') + : await RNFS.readFileAssets(`InpageBridgeWeb3.js`); this.injection = { ...this.injection, entryScript, entryScriptWeb3 }; } @@ -129,6 +136,9 @@ export default class Browser extends Component { this.injection.includeWeb3 = !!data.web3; this.handleProviderRequest(); break; + case 'INPAGE_REQUEST': + this.backgroundBridge.onMessage(data); + break; } }; diff --git a/app/components/BrowserScreen/index.js b/app/components/BrowserScreen/index.js index 501373bd41b..b17ffd2e66a 100644 --- a/app/components/BrowserScreen/index.js +++ b/app/components/BrowserScreen/index.js @@ -1,4 +1,5 @@ import React, { Component } from 'react'; +import PropTypes from 'prop-types'; import Browser from '../Browser'; import Screen from '../Screen'; @@ -6,10 +7,17 @@ import Screen from '../Screen'; * Main view component for the browser screen */ export default class BrowserScreen extends Component { + static propTypes = { + /** + * Instance of a core engine object + */ + engine: PropTypes.object.isRequired + }; + render() { return ( - + ); } diff --git a/app/core/BackgroundBridge.js b/app/core/BackgroundBridge.js new file mode 100644 index 00000000000..6882b9267c4 --- /dev/null +++ b/app/core/BackgroundBridge.js @@ -0,0 +1,45 @@ +export class InpageBridge { + _engine; + _webview; + + _onInpageRequest(payload) { + const { current } = this._webview; + const { provider } = this._engine.api.network; + provider.sendAsync(payload, (error, response) => { + current && + current.postMessage( + JSON.stringify({ + type: 'INPAGE_RESPONSE', + payload: { error, response, __mmID: payload.__mmID } + }) + ); + }); + } + + _sendStateUpdate = () => { + const { current } = this._webview; + const { network, selectedAddress } = this._engine.datamodel.flatState; + current && + current.postMessage({ + type: 'STATE_UPDATE', + payload: { network, selectedAddress } + }); + }; + + constructor(engine, webview) { + this._engine = engine; + this._webview = webview; + engine.api.network.subscribe(this._sendStateUpdate); + engine.api.preferences.subscribe(this._sendStateUpdate); + } + + onMessage({ type, payload }) { + switch (type) { + case 'INPAGE_REQUEST': + this._onInpageRequest(payload); + break; + } + } +} + +export default InpageBridge; diff --git a/app/core/BackgroundBridge.test.js b/app/core/BackgroundBridge.test.js new file mode 100644 index 00000000000..8bc8fd1ab38 --- /dev/null +++ b/app/core/BackgroundBridge.test.js @@ -0,0 +1,66 @@ +import BackgroundBridge from './BackgroundBridge'; + +const MOCK_ENGINE = { + datamodel: { + flatState: { + selectedAddress: 'foo', + network: 'bar' + } + }, + api: { + network: { + provider: { + sendAsync(payload, callback) { + callback(undefined, true); + } + }, + subscribe(callback) { + callback(true); + } + }, + preferences: { + subscribe(callback) { + callback(true); + } + } + } +}; + +const MOCK_WEBVIEW = { + current: { + postMessage() { + /* eslint-disable-line no-empty */ + } + } +}; + +describe('BackgroundBridge', () => { + it('should subscribe to network store', () => { + const { network, preferences } = MOCK_ENGINE.api; + const stub1 = spyOn(network, 'subscribe'); + const stub2 = spyOn(preferences, 'subscribe'); + new BackgroundBridge(MOCK_ENGINE); + expect(stub1).toBeCalled(); + expect(stub2).toBeCalled(); + }); + + it('should relay response from provider', () => { + const bridge = new BackgroundBridge(MOCK_ENGINE, MOCK_WEBVIEW); + bridge.onMessage({ type: 'FOO' }); + const stub = spyOn(MOCK_WEBVIEW.current, 'postMessage'); + bridge.onMessage({ type: 'INPAGE_REQUEST', payload: { method: 'net_version' } }); + expect(stub).toBeCalledWith(JSON.stringify({ type: 'INPAGE_RESPONSE', payload: { response: true } })); + }); + + it('should emit state update', () => { + const stub = spyOn(MOCK_WEBVIEW.current, 'postMessage'); + new BackgroundBridge(MOCK_ENGINE, MOCK_WEBVIEW); + expect(stub).toBeCalledWith({ + payload: { + network: 'bar', + selectedAddress: 'foo' + }, + type: 'STATE_UPDATE' + }); + }); +}); diff --git a/app/core/Engine.test.js b/app/core/Engine.test.js new file mode 100644 index 00000000000..e642a6b590b --- /dev/null +++ b/app/core/Engine.test.js @@ -0,0 +1,18 @@ +import Engine from './Engine'; + +describe('Engine', () => { + it('should expose an API', () => { + const engine = new Engine(); + expect(engine.api).toHaveProperty('accountTracker'); + expect(engine.api).toHaveProperty('addressBook'); + expect(engine.api).toHaveProperty('blockHistory'); + expect(engine.api).toHaveProperty('currencyRate'); + expect(engine.api).toHaveProperty('keyring'); + expect(engine.api).toHaveProperty('network'); + expect(engine.api).toHaveProperty('networkStatus'); + expect(engine.api).toHaveProperty('phishing'); + expect(engine.api).toHaveProperty('preferences'); + expect(engine.api).toHaveProperty('shapeShift'); + expect(engine.api).toHaveProperty('tokenRates'); + }); +}); diff --git a/app/core/InpageBridge.js b/app/core/InpageBridge.js new file mode 100644 index 00000000000..988738d3709 --- /dev/null +++ b/app/core/InpageBridge.js @@ -0,0 +1,92 @@ +class InpageBridge { + _onMessage(data) { + try { + const { payload, type } = JSON.parse(data); + switch (type) { + case 'STATE_UPDATE': + this._onStateUpdate(payload); + break; + + case 'INPAGE_RESPONSE': + this._onBackgroundResponse(payload); + break; + } + } catch (error) { + /* eslint-disable-line no-empty */ + } + } + + _onBackgroundResponse({ __mmID, error, response }) { + const callback = this._pending[__mmID]; + callback && callback(error, response); + delete this._pending[__mmID]; + } + + _onStateUpdate(state) { + this._selectedAddress = state.selectedAddress; + this._network = state.network; + } + + constructor() { + this._pending = {}; + this.isMetamask = true; + document.addEventListener('message', ({ data }) => { + this._onMessage(data); + }); + } + + isConnected() { + return true; + } + + send(payload) { + let result; + + switch (payload.method) { + case 'eth_accounts': + result = this._selectedAddress ? [this._selectedAddress] : []; + break; + + case 'eth_coinbase': + result = this._selectedAddress; + break; + + case 'eth_uninstallFilter': + this.sendAsync(payload); + break; + + case 'net_version': + result = this._network; + break; + + default: + throw new Error( + `This provider requires a callback to be passed when executing methods like ${ + payload.method + }. This is because all methods are always executed asynchonously. See https://git.io/fNi6S for more information.` + ); + } + + return { + id: payload.id, + jsonrpc: payload.jsonrpc, + result + }; + } + + sendAsync(payload, callback) { + payload = { ...payload, ...{ __mmID: Date.now() } }; + this._pending[payload.__mmID] = callback; + window.postMessage( + { + payload, + type: 'INPAGE_REQUEST' + }, + '*' + ); + } +} + +window.ethereum = new InpageBridge(); + +window.originalPostMessage({ type: 'ETHEREUM_PROVIDER_SUCCESS' }, '*'); diff --git a/app/core/InpageBridge.test.js b/app/core/InpageBridge.test.js new file mode 100644 index 00000000000..03d7872d993 --- /dev/null +++ b/app/core/InpageBridge.test.js @@ -0,0 +1,115 @@ +let INSTANCE; +let LISTENER; + +describe('InpageBridge', () => { + beforeAll(() => { + global.window = { + postMessage: jest.fn(), + originalPostMessage: jest.fn() + }; + + global.document = { + addEventListener(type, callback) { + LISTENER = callback; + } + }; + + Object.defineProperty(window, 'ethereum', { + set(instance) { + expect(instance).toBeDefined(); + INSTANCE = instance; + } + }); + require('./InpageBridge'); + }); + + it('should return connection status', () => { + expect(INSTANCE.isConnected()).toBe(true); + }); + + it('should set internal state', () => { + LISTENER({ + data: JSON.stringify({ + type: 'STATE_UPDATE', + payload: { + selectedAddress: 'foo', + network: 'bar' + } + }) + }); + expect(INSTANCE.send({ method: 'eth_coinbase' }).result).toBe('foo'); + }); + + it('should return current account', () => { + LISTENER({ + data: JSON.stringify({ + type: 'STATE_UPDATE', + payload: { + selectedAddress: undefined, + network: 'bar' + } + }) + }); + expect(INSTANCE.send({ method: 'eth_accounts' }).result).toEqual([]); + LISTENER({ + data: JSON.stringify({ + type: 'STATE_UPDATE', + payload: { + selectedAddress: 'foo', + network: 'bar' + } + }) + }); + expect(INSTANCE.send({ method: 'eth_accounts' }).result).toEqual(['foo']); + }); + + it('should return current network', () => { + LISTENER({ + data: JSON.stringify({ + type: 'STATE_UPDATE', + payload: { + selectedAddress: 'foo', + network: 'bar' + } + }) + }); + expect(INSTANCE.send({ method: 'net_version' }).result).toBe('bar'); + }); + + it('should throw for unrecognized synchronous method', () => { + expect(() => { + INSTANCE.send({ method: 'foo' }); + }).toThrow(); + }); + + it('should forward asynchronous RPC request', () => { + const stub = spyOn(global.window, 'postMessage'); + INSTANCE.sendAsync({ method: 'foo' }, () => { + /* eslint-disable-line no-empty */ + }); + expect(stub).toBeCalled(); + }); + + it('should return current network', () => { + const stub = spyOn(INSTANCE, 'sendAsync'); + INSTANCE.send({ method: 'eth_uninstallFilter' }); + expect(stub).toBeCalled(); + }); + + it('should call listener from background message', () => { + const mock = jest.fn(); + INSTANCE.sendAsync({ method: 'foo' }, mock); + const pendingKeys = Object.keys(INSTANCE._pending); + LISTENER({ + data: JSON.stringify({ + type: 'INPAGE_RESPONSE', + payload: { + __mmID: pendingKeys[pendingKeys.length - 1], + error: 'error', + response: 'response' + } + }) + }); + expect(mock).toBeCalled(); + }); +}); diff --git a/app/entry-web3.node.js b/app/entry-web3.node.js deleted file mode 100644 index 19c7d3b8e26..00000000000 --- a/app/entry-web3.node.js +++ /dev/null @@ -1,3 +0,0 @@ -window.ethereum = true; -window.web3 = true; -window.alert('party on web3'); diff --git a/app/entry.node.js b/app/entry.node.js deleted file mode 100644 index 98a4b85e3da..00000000000 --- a/app/entry.node.js +++ /dev/null @@ -1,2 +0,0 @@ -window.ethereum = true; -window.alert('party on'); diff --git a/app/util/setProvider.js b/app/util/setProvider.js new file mode 100644 index 00000000000..1c95c73ae69 --- /dev/null +++ b/app/util/setProvider.js @@ -0,0 +1,2 @@ +/* globals Web3 */ +window.web3 = new Web3(window.ethereum); diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index 18d00a1c8b5..780b9ace89f 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -5,6 +5,7 @@ }; objectVersion = 46; objects = { + /* Begin PBXBuildFile section */ 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; @@ -13,6 +14,7 @@ 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; 00E356F31AD99517003FC87E /* MetaMaskTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* MetaMaskTests.m */; }; 123752B9768C469A85058888 /* Feather.ttf in Resources */ = {isa = PBXBuildFile; fileRef = E9629905BA1940ADA4189921 /* Feather.ttf */; }; + 131AA188550F45659821D213 /* libRNOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E8CFB912C597432783D2F954 /* libRNOS.a */; }; 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; @@ -45,8 +47,8 @@ 657046E69A8E4E9CBC092A88 /* Entypo.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A498EA4CD2F8488DB666B94C /* Entypo.ttf */; }; 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; 900DAC87A8AB4C8092EA3682 /* libRNRandomBytes.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8ABF9E3C7C334558A19A8C88 /* libRNRandomBytes.a */; }; - A02FF29C210FCEBB0057412D /* entry-web3.js in Resources */ = {isa = PBXBuildFile; fileRef = A02FF29B210FCEBB0057412D /* entry-web3.js */; }; - A0E2F0B8210276220084ABC0 /* entry.js in Resources */ = {isa = PBXBuildFile; fileRef = A0E2F08E210276210084ABC0 /* entry.js */; }; + A08668322114F68B0067EAF1 /* InpageBridge.js in Resources */ = {isa = PBXBuildFile; fileRef = A08668302114F68A0067EAF1 /* InpageBridge.js */; }; + A08668332114F68B0067EAF1 /* InpageBridgeWeb3.js in Resources */ = {isa = PBXBuildFile; fileRef = A08668312114F68B0067EAF1 /* InpageBridgeWeb3.js */; }; AAACFD03192C40F8A1B38A8A /* libRCTWKWebView.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 893E46C6BCE84DC19E928BBD /* libRCTWKWebView.a */; }; ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; }; C5AD5D88262D40E8AD14096C /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 5E32A09A7BDC431FA403BA73 /* FontAwesome.ttf */; }; @@ -56,7 +58,6 @@ F5C5F10C32974C2D94FEA3F3 /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = BF485CDA047B4D52852B87F5 /* EvilIcons.ttf */; }; F719B7ED64E3484FB94EE77B /* Foundation.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 42C6DDE3B80F47AFA9C9D4F5 /* Foundation.ttf */; }; FD9BDCD5059C483EAE9C0160 /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 70BCC86172F14AB2BF4DDA97 /* libRNVectorIcons.a */; }; - 131AA188550F45659821D213 /* libRNOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E8CFB912C597432783D2F954 /* libRNOS.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -151,20 +152,6 @@ remoteGlobalIDString = 0974579A1D2A440A000D9368; remoteInfo = RCTWKWebView; }; - 15D1586B210BAAFF006982B5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 500343D7D81046209C481A89 /* RNRandomBytes.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 73EEC9391BFE4B1D00D468EB; - remoteInfo = RNRandomBytes; - }; - 15D1586D210BAAFF006982B5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 500343D7D81046209C481A89 /* RNRandomBytes.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 163CDE4E2087CAD3001065FB; - remoteInfo = "RNRandomBytes-tvOS"; - }; 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; @@ -382,6 +369,13 @@ remoteGlobalIDString = 163CDE4E2087CAD3001065FB; remoteInfo = "RNRandomBytes-tvOS"; }; + A086682E2114F66B0067EAF1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8EC0E414ED1C46238F2F10E4 /* RNOS.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RNOS; + }; ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; @@ -432,17 +426,17 @@ 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; 893E46C6BCE84DC19E928BBD /* libRCTWKWebView.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTWKWebView.a; sourceTree = ""; }; 8ABF9E3C7C334558A19A8C88 /* libRNRandomBytes.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNRandomBytes.a; sourceTree = ""; }; - A02FF29B210FCEBB0057412D /* entry-web3.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = "entry-web3.js"; path = "../app/entry-web3.js"; sourceTree = ""; }; - A0E2F08E210276210084ABC0 /* entry.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = entry.js; path = ../app/entry.js; sourceTree = ""; }; + 8EC0E414ED1C46238F2F10E4 /* RNOS.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNOS.xcodeproj; path = "../node_modules/react-native-os/ios/RNOS.xcodeproj"; sourceTree = ""; }; + A08668302114F68A0067EAF1 /* InpageBridge.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = InpageBridge.js; path = ../app/core/InpageBridge.js; sourceTree = ""; }; + A08668312114F68B0067EAF1 /* InpageBridgeWeb3.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = InpageBridgeWeb3.js; path = ../app/core/InpageBridgeWeb3.js; sourceTree = ""; }; A498EA4CD2F8488DB666B94C /* Entypo.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Entypo.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Entypo.ttf"; sourceTree = ""; }; ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTBlob.xcodeproj; path = "../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj"; sourceTree = ""; }; BF485CDA047B4D52852B87F5 /* EvilIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = EvilIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/EvilIcons.ttf"; sourceTree = ""; }; CF0899B651A847EDB227BE12 /* libRNFS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFS.a; sourceTree = ""; }; E34F71B40BF74968A8800F3A /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = ""; }; + E8CFB912C597432783D2F954 /* libRNOS.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNOS.a; sourceTree = ""; }; E9629905BA1940ADA4189921 /* Feather.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Feather.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Feather.ttf"; sourceTree = ""; }; F562CA6B28AA4A67AA29B61C /* MaterialIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialIcons.ttf"; sourceTree = ""; }; - 8EC0E414ED1C46238F2F10E4 /* RNOS.xcodeproj */ = {isa = PBXFileReference; name = "RNOS.xcodeproj"; path = "../node_modules/react-native-os/ios/RNOS.xcodeproj"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; }; - E8CFB912C597432783D2F954 /* libRNOS.a */ = {isa = PBXFileReference; name = "libRNOS.a"; path = "libRNOS.a"; sourceTree = ""; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -588,8 +582,8 @@ 13B07FAE1A68108700A75B9A /* MetaMask */ = { isa = PBXGroup; children = ( - A0E2F08E210276210084ABC0 /* entry.js */, - A02FF29B210FCEBB0057412D /* entry-web3.js */, + A08668302114F68A0067EAF1 /* InpageBridge.js */, + A08668312114F68B0067EAF1 /* InpageBridgeWeb3.js */, 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 13B07FB01A68108700A75B9A /* AppDelegate.m */, @@ -632,6 +626,7 @@ 893E46C6BCE84DC19E928BBD /* libRCTWKWebView.a */, 8ABF9E3C7C334558A19A8C88 /* libRNRandomBytes.a */, 14E7DBD0B81B4F6087628BA0 /* libRNRandomBytes-tvOS.a */, + E8CFB912C597432783D2F954 /* libRNOS.a */, ); name = "Recovered References"; sourceTree = ""; @@ -661,15 +656,6 @@ name = Products; sourceTree = ""; }; - 15D1583F210BAAFF006982B5 /* Products */ = { - isa = PBXGroup; - children = ( - 15D1586C210BAAFF006982B5 /* libRNRandomBytes.a */, - 15D1586E210BAAFF006982B5 /* libRNRandomBytes-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { isa = PBXGroup; children = ( @@ -784,6 +770,14 @@ name = Products; sourceTree = ""; }; + A086682B2114F66B0067EAF1 /* Products */ = { + isa = PBXGroup; + children = ( + A086682F2114F66B0067EAF1 /* libRNOS.a */, + ); + name = Products; + sourceTree = ""; + }; ADBDB9201DFEBF0600ED6528 /* Products */ = { isa = PBXGroup; children = ( @@ -960,6 +954,10 @@ ProductGroup = 15A2E6172100077700A1F331 /* Products */; ProjectRef = 6EFAC8C8B451455A999A0F09 /* RNFS.xcodeproj */; }, + { + ProductGroup = A086682B2114F66B0067EAF1 /* Products */; + ProjectRef = 8EC0E414ED1C46238F2F10E4 /* RNOS.xcodeproj */; + }, { ProductGroup = A02FF293210FCE6F0057412D /* Products */; ProjectRef = 500343D7D81046209C481A89 /* RNRandomBytes.xcodeproj */; @@ -1064,20 +1062,6 @@ remoteRef = 15C1F6A12100D07200DEA29E /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - 15D1586C210BAAFF006982B5 /* libRNRandomBytes.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRNRandomBytes.a; - remoteRef = 15D1586B210BAAFF006982B5 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 15D1586E210BAAFF006982B5 /* libRNRandomBytes-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRNRandomBytes-tvOS.a"; - remoteRef = 15D1586D210BAAFF006982B5 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; 2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -1288,6 +1272,13 @@ remoteRef = A02FF299210FCE720057412D /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + A086682F2114F66B0067EAF1 /* libRNOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNOS.a; + remoteRef = A086682E2114F66B0067EAF1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -1309,17 +1300,17 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + A08668332114F68B0067EAF1 /* InpageBridgeWeb3.js in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, 657046E69A8E4E9CBC092A88 /* Entypo.ttf in Resources */, F5C5F10C32974C2D94FEA3F3 /* EvilIcons.ttf in Resources */, - A02FF29C210FCEBB0057412D /* entry-web3.js in Resources */, 123752B9768C469A85058888 /* Feather.ttf in Resources */, C5AD5D88262D40E8AD14096C /* FontAwesome.ttf in Resources */, F719B7ED64E3484FB94EE77B /* Foundation.ttf in Resources */, 4EC316415D2D4557B2DFB781 /* Ionicons.ttf in Resources */, + A08668322114F68B0067EAF1 /* InpageBridge.js in Resources */, 3EA7CE27B8AB49009E49CFE6 /* MaterialCommunityIcons.ttf in Resources */, - A0E2F0B8210276220084ABC0 /* entry.js in Resources */, F0C672CC75F549ABBA1CF52A /* MaterialIcons.ttf in Resources */, 5992255DBD134582AE0C5AA5 /* Octicons.ttf in Resources */, 15D158ED210BD912006982B5 /* Metamask.ttf in Resources */, diff --git a/package-lock.json b/package-lock.json index 444cbb2922f..104f89b3fd7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -760,16 +760,6 @@ "integrity": "sha512-MqJ00WXw89ga0rK6GZkdmmgv3bAsxpJixyTthjcix73O44pBqotyU2BejBkLuIsaOBI6SEu77vAnSyLe5iIHkw==", "dev": true }, - "JSONStream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.3.tgz", - "integrity": "sha512-3Sp6WZZ/lXl+nTDoGpGWHEpTnnC6X5fnkolYZR6nwIfzbxxvA8utPWe1gCt7i0m9uVGsSz2IS8K8mJ7HmlduMg==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, "abab": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", @@ -804,15 +794,6 @@ "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", "dev": true }, - "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", - "dev": true, - "requires": { - "acorn": "^5.0.0" - } - }, "acorn-globals": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", @@ -831,17 +812,6 @@ "acorn": "^5.0.3" } }, - "acorn-node": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.5.2.tgz", - "integrity": "sha512-krFKvw/d1F17AN3XZbybIUzEY4YEPNiGo05AfP3dBlfVKrMHETKpgjpuZkSF8qDNt9UkQcqj7am8yJLseklCMg==", - "dev": true, - "requires": { - "acorn": "^5.7.1", - "acorn-dynamic-import": "^3.0.0", - "xtend": "^4.0.1" - } - }, "aes-js": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-0.2.4.tgz", @@ -1379,9 +1349,12 @@ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } }, "asn1.js": { "version": "4.10.1", @@ -1400,23 +1373,6 @@ "dev": true, "requires": { "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } } }, "assert-plus": { @@ -2642,6 +2598,11 @@ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.34.tgz", "integrity": "sha512-+w6B0Uo0ZvTSzDkXjoBCTNK0oe+aVL+yPi7kwGZm8hd8+Nj1AFPoxoq1Bl/mEu/G/ivOkUc1LRqVR0XeWFUzuA==" }, + "bignumber.js": { + "version": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", + "from": "git+https://github.com/frozeman/bignumber.js-nolookahead.git", + "dev": true + }, "bindings": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", @@ -2754,20 +2715,6 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, - "browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - } - }, "browser-passworder": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/browser-passworder/-/browser-passworder-2.0.3.tgz", @@ -2799,117 +2746,6 @@ } } }, - "browserify": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.2.tgz", - "integrity": "sha512-fMES05wq1Oukts6ksGUU2TMVHHp06LyQt0SIwbXIHm7waSrQmNBZePsU0iM/4f94zbvb/wHma+D1YrdzWYnF/A==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^1.11.0", - "browserify-zlib": "~0.2.0", - "buffer": "^5.0.2", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^2.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "labeled-stream-splicer": "^2.0.0", - "mkdirp": "^0.5.0", - "module-deps": "^6.0.0", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^2.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.0.tgz", - "integrity": "sha512-nUJyfChH7PMJy75eRDCCKtszSEFokUNXC1hNVSe+o+VdcgvDPLs20k3v8UXI8ruRYAJiYtyRea8mYyqPxoHWDw==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "events": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", - "dev": true - } - } - }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -2980,15 +2816,6 @@ "resolved": "https://registry.npmjs.org/browserify-unibabel/-/browserify-unibabel-3.0.0.tgz", "integrity": "sha1-WmuPD3BM44jTkn30czfiWDD3Hdo=" }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, "browserslist": { "version": "3.2.8", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", @@ -3048,12 +2875,6 @@ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -3082,12 +2903,6 @@ } } }, - "cached-path-relative": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", - "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=", - "dev": true - }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -3109,9 +2924,9 @@ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" }, "caniuse-lite": { - "version": "1.0.30000865", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz", - "integrity": "sha512-vs79o1mOSKRGv/1pSkp4EXgl4ZviWeYReXw60XfacPU64uQWZwJT6vZNmxRF9O+6zu71sJwMxLK5JXxbzuVrLw==" + "version": "1.0.30000874", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000874.tgz", + "integrity": "sha512-29nr1EPiHwrJTAHHsEmTt2h+55L8j2GNFdAcYPlRy2NX6iFz7ZZiepVI7kP/QqlnHLq3KvfWpbmGa0d063U09w==" }, "capture-exit": { "version": "1.2.0", @@ -3344,26 +3159,6 @@ "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", "dev": true }, - "combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "dev": true, - "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - }, - "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true - } - } - }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", @@ -3415,6 +3210,55 @@ "vary": "~1.1.2" } }, + "concat": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/concat/-/concat-1.0.3.tgz", + "integrity": "sha1-QPM1MInWVGdpXLGIa0Xt1jfYzKg=", + "dev": true, + "requires": { + "commander": "^2.9.0" + } + }, + "concat-cli": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/concat-cli/-/concat-cli-4.0.0.tgz", + "integrity": "sha1-pzoPsNGLJYBOvnA7zDWSIyTb900=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "concat": "^1.0.0", + "yargs": "^3.30.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "dev": true, + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + } + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3458,21 +3302,6 @@ "utils-merge": "1.0.1" } }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, "contains-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", @@ -3484,6 +3313,12 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -3594,24 +3429,11 @@ "which": "^1.2.9" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } + "crypto-js": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.8.tgz", + "integrity": "sha1-cV8HC/YBTyrpkqmLOSkli3E/CNU=", + "dev": true }, "css-select": { "version": "1.2.0", @@ -3679,12 +3501,6 @@ "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", "dev": true }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -3841,18 +3657,6 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, - "deps-sort": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", - "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "shasum": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - } - }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", @@ -3880,25 +3684,6 @@ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" }, - "detective": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz", - "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==", - "dev": true, - "requires": { - "acorn-node": "^1.3.0", - "defined": "^1.0.0", - "minimist": "^1.1.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -3953,12 +3738,6 @@ "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, "domelementtype": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", @@ -4003,32 +3782,6 @@ "create-hmac": "^1.1.4" } }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } - } - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -6402,12 +6155,6 @@ "lodash.padstart": "^4.1.0" } }, - "get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", - "dev": true - }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -6777,12 +6524,6 @@ "whatwg-encoding": "^1.0.1" } }, - "htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", - "dev": true - }, "htmlparser2": { "version": "3.9.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", @@ -6842,12 +6583,6 @@ "sshpk": "^1.7.0" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, "husky": { "version": "1.0.0-rc.13", "resolved": "https://registry.npmjs.org/husky/-/husky-1.0.0-rc.13.tgz", @@ -7046,15 +6781,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dev": true, - "requires": { - "source-map": "~0.5.3" - } - }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", @@ -7131,32 +6857,6 @@ } } }, - "insert-module-globals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", - "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - }, - "dependencies": { - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - } - } - }, "invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -9086,12 +8786,6 @@ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -9151,25 +8845,6 @@ "integrity": "sha512-Zq/jyANIJ2uX8UZjWlqLwbyhcxSXJtT/Y89lClyeZd3l++3ztL1I5SSCYrbcbwSunTjC88N3WuMk0kRDQD6gzA==", "dev": true }, - "labeled-stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz", - "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "isarray": "^2.0.4", - "stream-splicer": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", - "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==", - "dev": true - } - } - }, "lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", @@ -10002,12 +9677,6 @@ "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", - "dev": true - }, "lodash.pad": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", @@ -10775,46 +10444,6 @@ "minimist": "0.0.8" } }, - "module-deps": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.1.0.tgz", - "integrity": "sha512-NPs5N511VD1rrVJihSso/LiBShRbJALYBKzDW91uZYy7BpjnO4bGnZL3HjZ9yKcFdZUWwaYjDz9zxbuP7vKMuQ==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "browser-resolve": "^1.7.0", - "cached-path-relative": "^1.0.0", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.0.2", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } - } - }, "moo": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", @@ -11326,12 +10955,6 @@ } } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -11382,21 +11005,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", - "dev": true - }, - "parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", - "dev": true, - "requires": { - "path-platform": "~0.11.15" - } - }, "parse-asn1": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", @@ -11456,12 +11064,6 @@ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", @@ -11491,12 +11093,6 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" }, - "path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", - "dev": true - }, "path-to-regexp": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", @@ -11774,18 +11370,6 @@ "strict-uri-encode": "^2.0.0" } }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, "raf": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", @@ -11841,16 +11425,6 @@ "safe-buffer": "^5.1.0" } }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", @@ -12479,9 +12053,9 @@ } }, "react-navigation": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/react-navigation/-/react-navigation-2.9.3.tgz", - "integrity": "sha512-yKR7yYMwVrpEe1sPA1agGCmv+MdUuNX4xC2ZOLpx+wkhXF1GE3j0FD+l9t4YMwJb+fS0/nih/WAg5NL3eIZkeQ==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/react-navigation/-/react-navigation-2.10.0.tgz", + "integrity": "sha512-+Jt2PrJ3H+mYfexBySgvrEfXxJ0AAMZVYJNh8wXInHXGqrZKaSSd73z4yGcOkQQfsNE9sHjZk5yvE101KZJ+Ew==", "requires": { "clamp": "^1.0.1", "create-react-context": "^0.2.1", @@ -12491,8 +12065,8 @@ "react-lifecycles-compat": "^3", "react-native-safe-area-view": "^0.8.0", "react-navigation-deprecated-tab-navigator": "1.3.0", - "react-navigation-drawer": "0.4.3", - "react-navigation-tabs": "0.5.1" + "react-navigation-drawer": "0.5.0", + "react-navigation-tabs": "0.6.0" } }, "react-navigation-deprecated-tab-navigator": { @@ -12504,17 +12078,17 @@ } }, "react-navigation-drawer": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/react-navigation-drawer/-/react-navigation-drawer-0.4.3.tgz", - "integrity": "sha512-ShPAnq2a7gfNl7O4SAPhP54Z6QNbd9KJ+NQgk5Q1llZFcrsQZ886iUb9KieGestft34c5VOVLrrPDjo8+hCJPQ==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/react-navigation-drawer/-/react-navigation-drawer-0.5.0.tgz", + "integrity": "sha512-F1y593uC6pqBMGH+Omz75oNODEbxB/s0EGO8QtYwu1NmOOEUuuLA+c14zm+pgMsI4HlDabiHxPkWqsgGz25xVQ==", "requires": { "react-native-drawer-layout-polyfill": "^1.3.2" } }, "react-navigation-tabs": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/react-navigation-tabs/-/react-navigation-tabs-0.5.1.tgz", - "integrity": "sha512-VwStdeQm5OcAW0n94CxL7qL0zgmnyBCXcgdBRf5hYpw4tWcVUIedgRF+rAWa1v3ftY6H0CXbnT2OKdbod5QJXA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-navigation-tabs/-/react-navigation-tabs-0.6.0.tgz", + "integrity": "sha512-Ax1rujJ51R1Jrz7b5bHUAIgsYC1VrFws+d3hxlPy5dXG84iJdV5dnDFRvdQMDDfDZc+NDx2a223lAYsc3p2+XA==", "requires": { "hoist-non-react-statics": "^2.5.0", "prop-types": "^15.6.1", @@ -12588,32 +12162,6 @@ "react-proxy": "^1.1.7" } }, - "read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } - } - }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", @@ -13527,27 +13075,6 @@ "nan": "2.10.0" } }, - "shasum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", - "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", - "dev": true, - "requires": { - "json-stable-stringify": "~0.0.0", - "sha.js": "~2.4.4" - }, - "dependencies": { - "json-stable-stringify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", - "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - } - } - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -13582,12 +13109,6 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", - "dev": true - }, "simple-plist": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-0.2.1.tgz", @@ -13953,90 +13474,6 @@ "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=" }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } - } - }, - "stream-splicer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", - "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - } - } - }, "strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", @@ -14167,23 +13604,6 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "requires": { - "minimist": "^1.1.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -14201,15 +13621,6 @@ "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", "dev": true }, - "syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", - "dev": true, - "requires": { - "acorn-node": "^1.2.0" - } - }, "table": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", @@ -14709,23 +14120,6 @@ "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" }, - "timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "dev": true, - "requires": { - "process": "~0.11.0" - }, - "dependencies": { - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - } - } - }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -14739,12 +14133,6 @@ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", @@ -14871,12 +14259,6 @@ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", "dev": true }, - "tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -14943,24 +14325,6 @@ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" }, - "umd": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", - "dev": true - }, - "undeclared-identifiers": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz", - "integrity": "sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ==", - "dev": true, - "requires": { - "acorn-node": "^1.3.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" - } - }, "underscore": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", @@ -15101,24 +14465,6 @@ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -15130,12 +14476,20 @@ "integrity": "sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY=" }, "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } } }, "util-deprecate": { @@ -15228,6 +14582,19 @@ } } }, + "web3": { + "version": "0.20.7", + "resolved": "https://registry.npmjs.org/web3/-/web3-0.20.7.tgz", + "integrity": "sha512-VU6/DSUX93d1fCzBz7WP/SGCQizO1rKZi4Px9j/3yRyfssHyFcZamMw2/sj4E8TlfMXONvZLoforR8B4bRoyTQ==", + "dev": true, + "requires": { + "bignumber.js": "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934", + "crypto-js": "^3.1.4", + "utf8": "^2.1.1", + "xhr2-cookies": "^1.1.0", + "xmlhttprequest": "*" + } + }, "web3-provider-engine": { "version": "14.0.6", "resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-14.0.6.tgz", @@ -15409,6 +14776,15 @@ "xtend": "^4.0.0" } }, + "xhr2-cookies": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz", + "integrity": "sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg=", + "dev": true, + "requires": { + "cookiejar": "^2.1.1" + } + }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", @@ -15433,6 +14809,12 @@ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", + "dev": true + }, "xpipe": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/xpipe/-/xpipe-1.0.5.tgz", diff --git a/package.json b/package.json index eba8f2810ea..4756419bb6c 100644 --- a/package.json +++ b/package.json @@ -8,12 +8,12 @@ "lint": "eslint '**/*.js' --ignore-path=.prettierignore", "lint:fix": "eslint '**/*.js' --fix --ignore-path=.prettierignore", "format": "prettier '**/*.{js,json}' --write", - "build": "browserify app/entry.node.js -o app/entry.js && browserify app/entry-web3.node.js -o app/entry-web3.js && ./scripts/copy-android-assets.sh", + "build": "concat-cli -f app/core/InpageBridge.js node_modules/web3/dist/web3.min.js app/util/setProvider.js -o app/core/InpageBridgeWeb3.js && ./scripts/copy-android-assets.sh", "start:ios": "npm run build && react-native run-ios", "start:android": "npm run build && react-native run-android", "test": "jest", "test:update": "jest -u", - "postinstall": "./scripts/postinstall.sh npm run build" + "postinstall": "./scripts/postinstall.sh && npm run build" }, "prettier": { "printWidth": 120, @@ -60,9 +60,10 @@ "vm-browserify": "0.0.4" }, "devDependencies": { + "assert": "^1.4.1", "babel-jest": "23.4.0", "babel-preset-react-native": "5.0.2", - "browserify": "^16.2.2", + "concat-cli": "^4.0.0", "enzyme": "^3.0.0", "enzyme-adapter-react-16": "^1.1.1", "enzyme-to-json": "^3.3.4", @@ -73,7 +74,8 @@ "lint-staged": "^7.2.0", "prettier": "1.13.7", "react-dom": "^16.4.1", - "rn-nodeify": "github:tradle/rn-nodeify" + "rn-nodeify": "github:tradle/rn-nodeify", + "web3": "^0.20.7" }, "babel": { "presets": [ @@ -86,6 +88,7 @@ "react-native" ], "globals": { + "beforeAll": true, "describe": true, "expect": true, "it": true, @@ -97,6 +100,7 @@ "eol-last": 1, "import/no-named-as-default": 0, "no-invalid-this": 0, + "no-new": 0, "react/jsx-handler-names": 0, "react/no-did-mount-set-state": 0, "react/prefer-stateless-function": 0 diff --git a/scripts/copy-android-assets.sh b/scripts/copy-android-assets.sh index 849560310da..88f0be042a3 100755 --- a/scripts/copy-android-assets.sh +++ b/scripts/copy-android-assets.sh @@ -1,5 +1,5 @@ # Copy JS files for injection -yes | cp -rf app/entry.js android/app/src/main/assets/. -yes | cp -rf app/entry-web3.js android/app/src/main/assets/. +yes | cp -rf app/core/InpageBridge.js android/app/src/main/assets/. +yes | cp -rf app/core/InpageBridgeWeb3.js android/app/src/main/assets/. # Copy fonts with iconset yes | cp -rf ./app/fonts/metamask.ttf ./android/app/src/main/assets/fonts/metamask.ttf