UNPKG

@ixily/activ

Version:

Alpha Capture Trade Idea Verification. Blockchain ownership proven trade ideas and strategies.

92 lines (79 loc) 2.47 kB
import { default as CryptoJs } from 'crypto-js' import { ethers } from 'ethers' import { CONTRACT_INTERFACES } from '../..' export { CryptoJs } export const randomKeyWithLength = (length: number): string => CryptoJs.lib.WordArray.random(length).toString() export const id = (): string => { return randomKeyWithLength(24) } export const uInt8ArrayFromHexString = (hexString: string): Uint8Array => Uint8Array.from( hexString.match(/.{1,2}/g)!.map((byte) => parseInt(byte, 16)), ) export const uInt8ArrayFromString = (str: string): Uint8Array => { let utf8Encode = new TextEncoder() return utf8Encode.encode(str) } const hashString = (valueStr: string) => { return ethers.utils.keccak256(ethers.utils.toUtf8Bytes(valueStr)) } export const getHashedMessage = ( originalMessage: string, ): CONTRACT_INTERFACES.IHashedMessage => { const hashedMessage = hashString(originalMessage) return { originalMessage, hashedMessage, } } export const splitSignature = ( signature: string, ): { r: string s: string v: number } => { const r = signature.slice(0, 66) const s = '0x' + signature.slice(66, 130) const v = parseInt(signature.slice(130, 132), 16) return { r, s, v } } export const getSignedMessage = async ( hashedMessage: CONTRACT_INTERFACES.IHashedMessage, signer: ethers.Signer, ): Promise<CONTRACT_INTERFACES.IHashedSignedMessage> => { const signature = await signer.signMessage(hashedMessage.hashedMessage) return { ...hashedMessage, signature, ...splitSignature(signature), } } export const getHashedSignedMessage = ( originalMessage: string, signer: ethers.Signer, ): Promise<CONTRACT_INTERFACES.IHashedSignedMessage> => { return getSignedMessage(getHashedMessage(originalMessage), signer) } export const validateHashedSignedMessage = async ( hashedSignedMessage: CONTRACT_INTERFACES.IHashedSignedMessage, expectedAddress?: string, ): Promise<string> => { const probeHashed = getHashedMessage(hashedSignedMessage.originalMessage) if (probeHashed.originalMessage !== hashedSignedMessage.originalMessage) { throw new Error('The hashed message does not match original message') } const signerAddr = await ethers.utils.verifyMessage( hashedSignedMessage.hashedMessage, hashedSignedMessage.signature, ) if (expectedAddress !== undefined) { if (signerAddr !== expectedAddress) { throw new Error( `Signature address mismatch. Expected ${expectedAddress}, got ${signerAddr}`, ) } } return signerAddr }