zcash-grant-system/frontend/client/utils/wallet.ts

80 lines
2.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import HDKey from 'hdkey';
import { pubToAddress, toChecksumAddress } from 'ethereumjs-util';
interface DeriveAddressesParams {
chainCode: string;
publicKey: string;
index: number;
numAddresses: number;
}
export function deriveAddressesFromPubKey(params: DeriveAddressesParams): string[] {
const addresses = [];
const hdkey = new HDKey();
hdkey.chainCode = new Buffer(params.chainCode, 'hex');
hdkey.publicKey = new Buffer(params.publicKey, 'hex');
for (let i = params.index; i < params.index + params.numAddresses; i++) {
const dkey = hdkey.derive(`m/${i}`);
const address = (pubToAddress(dkey.publicKey, true) as Buffer).toString('hex');
addresses.push(toChecksumAddress(address));
}
return addresses;
}
// Ledger throws a few types of errors
interface U2FError {
metaData: {
type: string;
code: number;
};
}
interface ErrorWithId {
id: string;
message: string;
name: string;
stack: string;
}
type LedgerError = U2FError | ErrorWithId | Error | string;
const isU2FError = (err: LedgerError): err is U2FError =>
!!err && !!(err as U2FError).metaData;
const isStringError = (err: LedgerError): err is string => typeof err === 'string';
const isErrorWithId = (err: LedgerError): err is ErrorWithId =>
err.hasOwnProperty('id') && err.hasOwnProperty('message');
export function parseLedgerError(err: LedgerError): string {
// https://developers.yubico.com/U2F/Libraries/Client_error_codes.html
if (isU2FError(err)) {
// Timeout
if (err.metaData.code === 5) {
return 'The request timed out';
}
return err.metaData.type;
}
if (isStringError(err)) {
// Wrong app logged into
if (err.includes('6804')) {
return 'Wrong application selected on your ledger device. Make sure youve selected the ETH app.';
}
// Ledger locked
if (err.includes('6801')) {
return 'Your Ledger device is locked';
}
return err;
}
if (isErrorWithId(err)) {
// Browser doesn't support U2F
if (err.message.includes('U2F not supported')) {
return 'Your browser doesnt support Ledger. Please try updating it, or using a different one.';
}
}
// Other
return err.message || err.toString();
}