mirror of https://github.com/trezor/trezor-wallet
parent
666dae47c2
commit
c268c16649
@ -1,70 +0,0 @@
|
|||||||
/* @flow */
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
import Web3 from 'web3';
|
|
||||||
|
|
||||||
import { UI, DEVICE } from 'trezor-connect';
|
|
||||||
import * as ACTIONS from '../actions';
|
|
||||||
import * as STORAGE from '../actions/constants/LocalStorage';
|
|
||||||
import * as WEB3 from '../actions/constants/Web3';
|
|
||||||
|
|
||||||
type State = {
|
|
||||||
web3: Web3;
|
|
||||||
url: Array<string>;
|
|
||||||
customUrl: string;
|
|
||||||
tokens: JSON;
|
|
||||||
abi: JSON;
|
|
||||||
gasPrice: any;
|
|
||||||
latestBlock: any;
|
|
||||||
fiatRate: ?string;
|
|
||||||
}
|
|
||||||
|
|
||||||
const initialState: State = {
|
|
||||||
web3: null,
|
|
||||||
url: [
|
|
||||||
'https://ropsten.infura.io/QGyVKozSUEh2YhL4s2G4',
|
|
||||||
'https://api.myetherapi.com/rop',
|
|
||||||
'https://pyrus2.ubiqscan.io',
|
|
||||||
],
|
|
||||||
customUrl: 's',
|
|
||||||
gasPrice: 0,
|
|
||||||
latestBlock: 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default function web3(state: State = initialState, action: any): any {
|
|
||||||
|
|
||||||
switch (action.type) {
|
|
||||||
|
|
||||||
case 'rate__update' :
|
|
||||||
return {
|
|
||||||
...state,
|
|
||||||
fiatRate: action.rate.price_usd
|
|
||||||
}
|
|
||||||
|
|
||||||
case STORAGE.READY :
|
|
||||||
return {
|
|
||||||
...state,
|
|
||||||
tokens: action.tokens,
|
|
||||||
abi: action.abi
|
|
||||||
}
|
|
||||||
|
|
||||||
case WEB3.READY :
|
|
||||||
return {
|
|
||||||
...state,
|
|
||||||
web3: action.web3
|
|
||||||
}
|
|
||||||
case WEB3.BLOCK_UPDATED :
|
|
||||||
return {
|
|
||||||
...state,
|
|
||||||
latestBlock: action.blockHash
|
|
||||||
}
|
|
||||||
case WEB3.GAS_PRICE_UPDATED :
|
|
||||||
return {
|
|
||||||
...state,
|
|
||||||
gasPrice: action.gasPrice
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,219 +0,0 @@
|
|||||||
/* @flow */
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
import { LOCATION_CHANGE, push } from 'react-router-redux';
|
|
||||||
|
|
||||||
import TrezorConnect, { TRANSPORT, DEVICE_EVENT, UI_EVENT, UI, DEVICE } from 'trezor-connect';
|
|
||||||
import * as TrezorConnectActions from '../actions/TrezorConnectActions';
|
|
||||||
import * as ModalActions from '../actions/ModalActions';
|
|
||||||
import { init as initWeb3 } from '../actions/Web3Actions';
|
|
||||||
import * as WEB3 from '../actions/constants/Web3';
|
|
||||||
import * as STORAGE from '../actions/constants/LocalStorage';
|
|
||||||
import * as CONNECT from '../actions/constants/TrezorConnect';
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const initSelectedDevice = async (store: any, device: any): void => {
|
|
||||||
|
|
||||||
const { selectedDevice } = store.getState().connect;
|
|
||||||
|
|
||||||
console.log("WHATSUP?", device, selectedDevice)
|
|
||||||
|
|
||||||
// if we are in LandingPage view switch it to Wallet
|
|
||||||
if (selectedDevice && selectedDevice.path === device.path && selectedDevice.instance === device.instance) {
|
|
||||||
if (selectedDevice.unacquired || selectedDevice.isUsedElsewhere) {
|
|
||||||
store.dispatch( push(`/device/${ selectedDevice.path }/acquire`) );
|
|
||||||
} else {
|
|
||||||
if (device.features.bootloader_mode) {
|
|
||||||
store.dispatch( push(`/device/${ selectedDevice.path }/bootloader`) );
|
|
||||||
} else {
|
|
||||||
|
|
||||||
if (device.instance) {
|
|
||||||
store.dispatch( push(`/device/${ device.features.device_id }:${ device.instance }`) );
|
|
||||||
} else {
|
|
||||||
store.dispatch( push(`/device/${ device.features.device_id }`) );
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (!selectedDevice.initialized && selectedDevice.connected) {
|
|
||||||
// const response = await TrezorConnect.getPublicKey({
|
|
||||||
// selectedDevice: selectedDevice.path,
|
|
||||||
// instance: selectedDevice.instance,
|
|
||||||
// path: "m/1'/0'/0'",
|
|
||||||
// confirmation: false
|
|
||||||
// });
|
|
||||||
|
|
||||||
// if (response && response.success) {
|
|
||||||
// const xpub = response.payload.xpub;
|
|
||||||
// store.dispatch({
|
|
||||||
// type: CONNECT.AUTH_DEVICE,
|
|
||||||
// device: selectedDevice,
|
|
||||||
// xpub
|
|
||||||
// });
|
|
||||||
// } else {
|
|
||||||
// // TODO: error
|
|
||||||
// }
|
|
||||||
|
|
||||||
// console.log("INIT SELECTED!", device, response)
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//store.dispatch( push(`/device/${ device.features.device_id }/coin/eth/address/0/send`) );
|
|
||||||
//store.dispatch( push(`/device/${ device.features.device_id }/coin/eth/address/0`) );
|
|
||||||
// store.dispatch( push(`/device/${ device.features.device_id }`) );
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// store.dispatch( TrezorConnectActions.startDiscoveryProcess(device) );
|
|
||||||
|
|
||||||
// get xpub to force
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const TrezorConnectService = (store: any) => (next: any) => (action: any) => {
|
|
||||||
|
|
||||||
if (action.type === DEVICE.DISCONNECT) {
|
|
||||||
const previous = store.getState().connect.selectedDevice;
|
|
||||||
next(action);
|
|
||||||
if (previous && action.device.path === previous.path) {
|
|
||||||
|
|
||||||
if (previous.unacquired) {
|
|
||||||
|
|
||||||
} else if (previous.initialized) {
|
|
||||||
// interrupt discovery process
|
|
||||||
store.dispatch( TrezorConnectActions.stopDiscoveryProcess(previous) );
|
|
||||||
|
|
||||||
if (!previous.remember) {
|
|
||||||
store.dispatch(ModalActions.askForRemember(previous));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (action.type === DEVICE.ACQUIRED) {
|
|
||||||
const { selectedDevice } = store.getState().connect;
|
|
||||||
initSelectedDevice(store, selectedDevice);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (action.type === DEVICE.CHANGED) {
|
|
||||||
const previousSelectedDevice = store.getState().connect.selectedDevice;
|
|
||||||
// Pass actions BEFORE
|
|
||||||
next(action);
|
|
||||||
|
|
||||||
if (previousSelectedDevice && action.device.path === previousSelectedDevice.path) {
|
|
||||||
//console.warn("TODO: Handle device changed, interrupt running async action (like discovery)", action.device);
|
|
||||||
}
|
|
||||||
} else if (action.type === DEVICE.DISCONNECT || action.type === CONNECT.SELECT_DEVICE) {
|
|
||||||
const previousSelectedDevice = store.getState().connect.selectedDevice;
|
|
||||||
// Pass actions BEFORE
|
|
||||||
next(action);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const { devices, selectedDevice } = store.getState().connect;
|
|
||||||
if (!selectedDevice) {
|
|
||||||
store.dispatch( push('/') );
|
|
||||||
} else if (previousSelectedDevice.path !== selectedDevice.path || previousSelectedDevice.instance !== selectedDevice.instance) {
|
|
||||||
|
|
||||||
// interrupt discovery process
|
|
||||||
store.dispatch( TrezorConnectActions.stopDiscoveryProcess(previousSelectedDevice) );
|
|
||||||
|
|
||||||
initSelectedDevice(store, selectedDevice);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (action.type === TRANSPORT.ERROR) {
|
|
||||||
next(action);
|
|
||||||
store.dispatch( push('/') );
|
|
||||||
} else {
|
|
||||||
// Pass all actions through by default
|
|
||||||
next(action);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (action.type === STORAGE.READY) {
|
|
||||||
|
|
||||||
// TODO: check offline devices
|
|
||||||
|
|
||||||
// set listeners
|
|
||||||
|
|
||||||
TrezorConnect.on(DEVICE_EVENT, (event: DeviceMessage): void => {
|
|
||||||
// post event to TrezorConnectReducer
|
|
||||||
store.dispatch({
|
|
||||||
type: event.type,
|
|
||||||
device: event.payload
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const version: Object = TrezorConnect.getVersion();
|
|
||||||
if (version.type === 'library') {
|
|
||||||
// handle UI events only if TrezorConnect isn't using popup
|
|
||||||
TrezorConnect.on(UI_EVENT, (type: string, data: any): void => {
|
|
||||||
// post event to reducers
|
|
||||||
store.dispatch({
|
|
||||||
type,
|
|
||||||
data
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// init TrezorConnect library
|
|
||||||
|
|
||||||
TrezorConnect.init({
|
|
||||||
hostname: 'localhost', // TODO: controll it in Connect
|
|
||||||
transport_reconnect: false,
|
|
||||||
})
|
|
||||||
.then(() => {
|
|
||||||
// post action inited
|
|
||||||
//store.dispatch({ type: 'WEB3_START' });
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
store.dispatch( initWeb3() );
|
|
||||||
}, 2000)
|
|
||||||
|
|
||||||
})
|
|
||||||
.catch(error => {
|
|
||||||
store.dispatch({
|
|
||||||
type: CONNECT.INITIALIZATION_ERROR,
|
|
||||||
error
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
} else if (action.type === WEB3.READY) {
|
|
||||||
|
|
||||||
const handleDeviceConnect = (device) => {
|
|
||||||
initSelectedDevice(store, device);
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleDeviceDisconnect = (device) => {
|
|
||||||
// remove addresses and discovery from state
|
|
||||||
store.dispatch( TrezorConnectActions.remove(device) );
|
|
||||||
}
|
|
||||||
|
|
||||||
TrezorConnect.on(DEVICE.CONNECT, handleDeviceConnect);
|
|
||||||
TrezorConnect.on(DEVICE.CONNECT_UNACQUIRED, handleDeviceConnect);
|
|
||||||
|
|
||||||
TrezorConnect.on(DEVICE.DISCONNECT, handleDeviceDisconnect);
|
|
||||||
TrezorConnect.on(DEVICE.CONNECT_UNACQUIRED, handleDeviceDisconnect);
|
|
||||||
|
|
||||||
// solve possible race condition:
|
|
||||||
// device was connected before Web3 initialized so we need to force DEVICE.CONNECT event on them
|
|
||||||
const { devices } = store.getState().connect;
|
|
||||||
for (let d of devices) {
|
|
||||||
handleDeviceConnect(d);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
export default TrezorConnectService;
|
|
Loading…
Reference in new issue