/unver

Universal Signature Verification for ethers.js

Primary LanguageTypeScript

unver

Universal Signature Verification for ethers.js, with support for:

  • Externally Owned Accounts
  • Contract Accounts via ERC-1271
  • Predeployed Contract Accounts via ERC-6492
  • Predelegated Contract Accounts via ERC-8010

Table of Contents

Install

npm i unver

Usage

import * as ethers from 'ethers'
import { UnverProvider } from 'unver'

const provider = UnverProvider.wrap(
  new ethers.JsonRpcProvider('https://eth.merkle.io')
)

const address = '0x...'
const digest = '0x...'
const signature = '0x...'

const valid = await provider.verifyHash(address, digest, signature)

API Reference

UnverProvider.wrap

Wraps an ethers.AbstractProvider with the UnverProvider interface.

const provider = UnverProvider.wrap(
  new ethers.JsonRpcProvider('https://eth.merkle.io')
)

Interface

declare function wrap(provider: ethers.AbstractProvider): 
  Provider<ethers.AbstractProvider & UnverProvider> 

Signature.verifyHash

Verifies a signature for a given address and digest.

const address = '0x...'
const digest = '0x...'
const signature = '0x...'

// Provider usage
const valid = await provider.verifyHash(address, digest, signature)

// Function usage
import { Signature } from 'unver'
const valid = await Signature.verifyHash(provider, address, digest, signature)

Interface

declare function verifyHash(
  provider: ethers.AbstractProvider,
  address: string,
  digest: Uint8Array | string,
  signature: ethers.SignatureLike,
): Promise<boolean>

Signature.verifyMessage

Verifies a signature for a given address and message.

const address = '0x...'
const message = 'hello world'
const signature = '0x...'

// Provider usage
const valid = await provider.verifyMessage(address, message, signature)

// Function usage
import { Signature } from 'unver'
const valid = await Signature.verifyMessage(provider, address, message, signature)

Interface

declare function verifyMessage(
  provider: ethers.AbstractProvider,
  address: string,
  message: Uint8Array | string,
  signature: ethers.SignatureLike,
): Promise<boolean>

Signature.verifyTypedData

Verifies a signature for a given address and typedData.

const address = '0x...'
const domain = {
  name: 'My App',
  version: '1.0.0',
  chainId: 1,
  verifyingContract: '0x...'
}
const types = {
  Person: [
    { name: 'name', type: 'string' },
    { name: 'age', type: 'uint256' },
  ],
}
const value = {
  name: 'John Doe',
  age: 20,
}
const signature = '0x...'

// Provider usage
const valid = await provider.verifyTypedData(address, domain, types, value, signature)

// Function usage
import { Signature } from 'unver'
const valid = await Signature.verifyTypedData(provider, address, domain, types, value, signature)

Interface

declare function verifyTypedData(
  provider: ethers.AbstractProvider,
  address: string,
  domain: ethers.TypedDataDomain,
  types: Record<string, Array<ethers.TypedDataField>>,
  value: Record<string, unknown>,
  signature: ethers.SignatureLike,
): Promise<boolean>

Development

bun install  # Install dependencies
bun test     # Run tests

Community

Check out the following places for more content:

Support