All files / src UniversalSigner.ts

100% Statements 14/14
100% Branches 0/0
100% Functions 5/5
100% Lines 14/14

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46  3x                   3x   5x 5x 5x       2x 2x 2x 2x       2x 2x 2x             1x             1x      
import { Signer, Wallet } from "ethers";
import {
  SigningKey,
  computeAddress,
  joinSignature,
  keccak256,
  recoverPublicKey,
  toUtf8Bytes,
  verifyMessage,
} from "ethers/lib/utils";
 
export class UniversalSigner {
  static getDigestForData(data: unknown) {
    const message = JSON.stringify(data);
    const digest = keccak256(toUtf8Bytes(message));
    return digest;
  }
 
  static signStringifiableData(data: unknown, privateKey: string): string {
    const digest = UniversalSigner.getDigestForData(data);
    const signingKey = new SigningKey(privateKey);
    const fullSignature = signingKey.signDigest(digest);
    return joinSignature(fullSignature);
  }
 
  static recoverSigner(data: unknown, signature: string) {
    const digest = UniversalSigner.getDigestForData(data);
    const publicKey = recoverPublicKey(digest, signature);
    return computeAddress(publicKey);
  }
 
  static signWithEthereumHashMessage(
    signerOrWallet: Signer | Wallet,
    message: string
  ): Promise<string> {
    return signerOrWallet.signMessage(message);
  }
 
  static recoverAddressFromEthereumHashMessage(
    message: string,
    signature: string
  ): string {
    return verifyMessage(message, signature);
  }
}