on ffffc3c help sign in
bridge/src/lib/authToken.ts
114 lines 3.1 kB history raw
1import { crypto } from 'bitcoinjs-lib';
2import { ecdsaSign } from 'secp256k1';
3import Web3 from 'web3';
4import WalletConnect from '@walletconnect/client';
6import { WALLET_TYPES } from './constants';
7import { ledgerSignMessage } from './ledger';
8import { trezorSignMessage } from './trezor';
9import BridgeWallet from './types/BridgeWallet';
11const MESSAGE = 'Bridge Authentication Token';
13function signMessage(privateKey: Buffer) {
14 const msg = '\x19Ethereum Signed Message:\n' + MESSAGE.length + MESSAGE;
15 // #ecdsaSign requires a 32-byte buffer, hence sha256
16 const hashed = crypto.sha256(Buffer.from(msg));
17 const { signature } = ecdsaSign(Buffer.from(hashed), privateKey);
19 // add key recovery parameter
20 const ethSignature = new Uint8Array(65);
21 ethSignature.set(signature);
22 const v = (ethSignature[32] & 1) + 27;
23 ethSignature[64] = v;
25 return ethSignature;
28type MetamaskAuthTokenArgs = {
29 address: string;
30 web3: Web3;
31 walletType: symbol;
32};
34type LedgerAuthTokenArgs = {
35 walletHdPath: string;
36 walletType: symbol;
37};
39type TrezorAuthTokenArgs = LedgerAuthTokenArgs;
41type WalletConnectAuthTokenArgs = {
42 address: string;
43 connector: WalletConnect;
44 walletType: symbol;
45};
47type DefaultAuthTokenArgs = {
48 wallet: BridgeWallet;
49 walletType?: symbol;
50};
52type GetAuthTokenArgs =
53 | MetamaskAuthTokenArgs
54 | LedgerAuthTokenArgs
55 | TrezorAuthTokenArgs
56 | WalletConnectAuthTokenArgs
57 | DefaultAuthTokenArgs;
59const getMetamaskAuthToken = ({ address, web3 }: MetamaskAuthTokenArgs) => {
60 if (window.ethereum) {
61 //NOTE this doesn't _seem_ to be affected by #596,
62 // but web3.eth.personal.sign hits it semi-reliably?
63 // no idea what's going on, we should figure it out,
64 // but we apply this bandaid to hopefully stop the bleeding.
65 return window.ethereum.request({
66 method: 'personal_sign',
67 params: [MESSAGE, address],
68 from: address,
69 });
70 } else {
71 return web3.eth.personal.sign(MESSAGE, address, '');
72 }
73};
75const getLedgerAuthToken = ({ walletHdPath }: LedgerAuthTokenArgs) => {
76 return ledgerSignMessage(MESSAGE, walletHdPath);
77};
79const getTrezorAuthToken = ({ walletHdPath }: TrezorAuthTokenArgs) => {
80 return trezorSignMessage(MESSAGE, walletHdPath);
81};
83const getWalletConnectAuthToken = ({
84 address,
85 connector,
86}: WalletConnectAuthTokenArgs) => {
87 return connector.signPersonalMessage([MESSAGE, address]);
88};
90const getDefaultAuthToken = ({ wallet }: DefaultAuthTokenArgs) => {
91 const signature = signMessage(wallet.privateKey);
93 const token = `0x${Buffer.from(signature).toString('hex')}`;
95 return token;
96};
98export const getAuthToken = async ({
99 walletType,
100 ...args
101}: GetAuthTokenArgs) => {
102 switch (walletType) {
103 case WALLET_TYPES.METAMASK:
104 return getMetamaskAuthToken(args);
105 case WALLET_TYPES.LEDGER:
106 return getLedgerAuthToken(args);
107 case WALLET_TYPES.TREZOR:
108 return getTrezorAuthToken(args);
109 case WALLET_TYPES.WALLET_CONNECT:
110 return getWalletConnectAuthToken(args);
111 default:
112 return getDefaultAuthToken(args);
113 }
114};