on master help sign in
add trezor support to auth token
89094feLiam Fitzgerald
src/lib/authToken.js+4
@@ -2,6 +2,7 @@ import * as secp256k1 from 'secp256k1';
2
2
3import { keccak256, WALLET_TYPES } from './wallet';
3import { keccak256, WALLET_TYPES } from './wallet';
4import { ledgerSignMessage } from './ledger';
4import { ledgerSignMessage } from './ledger';
5+import { trezorSignMessage } from './trezor';
5
6
6const MESSAGE = 'Bridge Authentication Token';
7const MESSAGE = 'Bridge Authentication Token';
7
8
@@ -41,6 +42,9 @@ export const getAuthToken = async ({
41 const { v, r, s } = await ledgerSignMessage(MESSAGE, walletHdPath);
42 const { v, r, s } = await ledgerSignMessage(MESSAGE, walletHdPath);
42 return signatureToHex(v, r, s);
43 return signatureToHex(v, r, s);
43 }
44 }
45+ if (walletType === WALLET_TYPES.TREZOR) {
46+ return trezorSignMessage(MESSAGE, walletHdPath);
47+ }
44
48
45 const signature = signMessage(wallet.privateKey);
49 const signature = signMessage(wallet.privateKey);
46
50
src/lib/trezor.js+15
@@ -36,4 +36,19 @@ const trezorSignTransaction = async (txn, hdpath) => {
36 return txn;
36 return txn;
37};
37};
38
38
39+export const trezorSignMessage = async (message, hdPath) => {
40+ const sig = await TrezorConnect.ethereumSignTransaction({
41+ path: hdPath,
42+ message,
43+ });
44+
45+ if (!sig.success) {
46+ throw new Error(sig.payload.error);
47+ }
48+
49+ const { signature } = sig.payload;
50+
51+ return signature;
52+};
53+
39export { TREZOR_PATH, trezorSignTransaction };
54export { TREZOR_PATH, trezorSignTransaction };
src/views/Login/Trezor.js+11−3
@@ -8,9 +8,10 @@ import { Text, Grid, H5, CheckboxInput, SelectInput } from 'indigo-react';
8
8
9import { useWallet } from 'store/wallet';
9import { useWallet } from 'store/wallet';
10
10
11−import { TREZOR_PATH } from 'lib/trezor';
11+import { TREZOR_PATH, trezorSignMessage } from 'lib/trezor';
12import { WALLET_TYPES } from 'lib/wallet';
12import { WALLET_TYPES } from 'lib/wallet';
13import useLoginView from 'lib/useLoginView';
13import useLoginView from 'lib/useLoginView';
14+import { getAuthToken } from 'lib/authToken';
14
15
15import {
16import {
16 composeValidator,
17 composeValidator,
@@ -35,7 +36,7 @@ const ACCOUNT_OPTIONS = times(20, i => ({
35export default function Trezor({ className, goHome }) {
36export default function Trezor({ className, goHome }) {
36 useLoginView(WALLET_TYPES.TREZOR);
37 useLoginView(WALLET_TYPES.TREZOR);
37
38
38− const { setWallet, setWalletHdPath } = useWallet();
39+ const { setWallet, setWalletHdPath, setAuthToken } = useWallet();
39
40
40 const validate = useMemo(
41 const validate = useMemo(
41 () =>
42 () =>
@@ -67,10 +68,17 @@ export default function Trezor({ className, goHome }) {
67 const pub = secp256k1.publicKeyConvert(publicKey, true);
68 const pub = secp256k1.publicKeyConvert(publicKey, true);
68 const hd = bip32.fromPublicKey(pub, chainCode);
69 const hd = bip32.fromPublicKey(pub, chainCode);
69
70
71+ const authToken = await getAuthToken({
72+ wallet: hd,
73+ walletType: WALLET_TYPES.TREZOR,
74+ walletHdPath: values.hdPath,
75+ });
76+
77+ setAuthToken(authToken);
70 setWallet(Just(hd));
78 setWallet(Just(hd));
71 setWalletHdPath(values.hdPath);
79 setWalletHdPath(values.hdPath);
72 },
80 },
73− [setWallet, setWalletHdPath]
81+ [setAuthToken, setWallet, setWalletHdPath]
74 );
82 );
75
83
76 const onValues = useCallback(({ valid, values, form }) => {
84 const onValues = useCallback(({ valid, values, form }) => {