parseAttestationBytes.ts 2.26 KB
Newer Older
Will Cory's avatar
Will Cory committed
1 2
import { BigNumber } from 'ethers'
import { toUtf8String } from 'ethers/lib/utils.js'
Will Cory's avatar
Will Cory committed
3
import type { Address } from '@wagmi/core'
Will Cory's avatar
Will Cory committed
4 5 6

import type { DataTypeOption } from '../types/DataTypeOption'
import type { WagmiBytes } from '../types/WagmiBytes'
Will Cory's avatar
Will Cory committed
7
import { ParseBytesReturn } from '../types/ParseBytesReturn'
Will Cory's avatar
Will Cory committed
8

Will Cory's avatar
Will Cory committed
9 10 11 12
/**
 * Parses a string attestion
 */
export const parseString = (rawAttestation: WagmiBytes): string => {
Will Cory's avatar
Will Cory committed
13
  rawAttestation = rawAttestation === '0x0' ? '0x' : rawAttestation
Will Cory's avatar
Will Cory committed
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
  return rawAttestation ? toUtf8String(rawAttestation) : ''
}

/**
 * Parses a boolean attestion
 */
export const parseBool = (rawAttestation: WagmiBytes): boolean => {
  rawAttestation = rawAttestation === '0x' ? '0x0' : rawAttestation
  return rawAttestation ? BigNumber.from(rawAttestation).gt(0) : false
}

/**
 * Parses a number attestion
 */
export const parseNumber = (rawAttestation: WagmiBytes): BigNumber => {
  rawAttestation = rawAttestation === '0x' ? '0x0' : rawAttestation
  return rawAttestation ? BigNumber.from(rawAttestation) : BigNumber.from(0)
}

/**
 * Parses a address attestion
 */
export const parseAddress = (rawAttestation: WagmiBytes): Address => {
  rawAttestation = rawAttestation === '0x' ? '0x0' : rawAttestation
  return rawAttestation
    ? (BigNumber.from(rawAttestation).toHexString() as Address)
    : '0x0000000000000000000000000000000000000000'
}

/**
44 45 46
 * @deprecated use parseString, parseBool, parseNumber, or parseAddress instead
 * Will be removed in v1.0.0
 * @internal
Will Cory's avatar
Will Cory committed
47 48 49
 * Parses a raw attestation
 */
export const parseAttestationBytes = <TDataType extends DataTypeOption>(
Will Cory's avatar
Will Cory committed
50
  attestationBytes: WagmiBytes,
Will Cory's avatar
Will Cory committed
51 52
  dataType: TDataType
): ParseBytesReturn<TDataType> => {
Will Cory's avatar
Will Cory committed
53
  if (dataType === 'bytes') {
Will Cory's avatar
Will Cory committed
54
    return attestationBytes as ParseBytesReturn<TDataType>
Will Cory's avatar
Will Cory committed
55 56
  }
  if (dataType === 'number') {
Will Cory's avatar
Will Cory committed
57
    return parseNumber(attestationBytes) as ParseBytesReturn<TDataType>
Will Cory's avatar
Will Cory committed
58 59
  }
  if (dataType === 'address') {
Will Cory's avatar
Will Cory committed
60
    return parseAddress(attestationBytes) as ParseBytesReturn<TDataType>
Will Cory's avatar
Will Cory committed
61 62
  }
  if (dataType === 'bool') {
Will Cory's avatar
Will Cory committed
63
    return parseBool(attestationBytes) as ParseBytesReturn<TDataType>
Will Cory's avatar
Will Cory committed
64 65
  }
  if (dataType === 'string') {
Will Cory's avatar
Will Cory committed
66
    return parseString(attestationBytes) as ParseBytesReturn<TDataType>
Will Cory's avatar
Will Cory committed
67
  }
Will Cory's avatar
Will Cory committed
68
  console.warn(`unrecognized dataType ${dataType satisfies never}`)
Will Cory's avatar
Will Cory committed
69
  return attestationBytes as never
Will Cory's avatar
Will Cory committed
70
}