# PublicKey

Utility functions for working with ECDSA public keys.

## Examples

Below are some examples demonstrating common usages of the `PublicKey` module:

* [Serializing Public Keys](#serializing-public-keys)

* [Deserializing Public Keys](#deserializing-public-keys)

### Serializing Public Keys

Public Keys can be serialized to Hex or Bytes using [`PublicKey.toHex`](/api/PublicKey/toHex):

```ts twoslash
import { PublicKey } from 'ox'

const publicKey = PublicKey.from({
  prefix: 4,
  x: '0x8318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed75',
  y: '0x3547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5'
})

const serialized = PublicKey.toHex(publicKey) // [!code focus]
// @log: '0x048318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5'
```

### Deserializing Public Keys

Public Keys can be deserialized from Hex or Bytes using [`PublicKey.fromHex`](/api/PublicKey/fromHex):

```ts twoslash
import { PublicKey } from 'ox'

const publicKey = PublicKey.fromHex(
  '0x8318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5'
)
// @log: {
// @log:   prefix: 4,
// @log:   x: '0x8318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed75',
// @log:   y: '0x3547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5',
// @log: }
```

## Functions

| Name                | Description                         |
| ------------------- | ----------------------------------- |
| [`PublicKey.assert`](/api/PublicKey/assert) | Asserts that a [`PublicKey.PublicKey`](/api/PublicKey/types#publickey) is valid. |
| [`PublicKey.compress`](/api/PublicKey/compress) | Compresses a [`PublicKey.PublicKey`](/api/PublicKey/types#publickey). |
| [`PublicKey.from`](/api/PublicKey/from) | Instantiates a typed [`PublicKey.PublicKey`](/api/PublicKey/types#publickey) object from a [`PublicKey.PublicKey`](/api/PublicKey/types#publickey), [`Bytes.Bytes`](/api/Bytes/types#bytes), or [`Hex.Hex`](/api/Hex/types#hex). |
| [`PublicKey.fromBytes`](/api/PublicKey/fromBytes) | Deserializes a [`PublicKey.PublicKey`](/api/PublicKey/types#publickey) from a [`Bytes.Bytes`](/api/Bytes/types#bytes) value. |
| [`PublicKey.fromHex`](/api/PublicKey/fromHex) | Deserializes a [`PublicKey.PublicKey`](/api/PublicKey/types#publickey) from a [`Hex.Hex`](/api/Hex/types#hex) value. |
| [`PublicKey.toBytes`](/api/PublicKey/toBytes) | Serializes a [`PublicKey.PublicKey`](/api/PublicKey/types#publickey) to [`Bytes.Bytes`](/api/Bytes/types#bytes). |
| [`PublicKey.toHex`](/api/PublicKey/toHex) | Serializes a [`PublicKey.PublicKey`](/api/PublicKey/types#publickey) to [`Hex.Hex`](/api/Hex/types#hex). |
| [`PublicKey.validate`](/api/PublicKey/validate) | Validates a [`PublicKey.PublicKey`](/api/PublicKey/types#publickey). Returns `true` if valid, `false` otherwise. |

## Errors

| Name                | Description                         |
| ------------------- | ----------------------------------- |
| [`PublicKey.InvalidCompressedPrefixError`](/api/PublicKey/errors#publickeyinvalidcompressedprefixerror) | Thrown when the public key has an invalid prefix for a compressed public key. |
| [`PublicKey.InvalidError`](/api/PublicKey/errors#publickeyinvaliderror) | Thrown when a public key is invalid. |
| [`PublicKey.InvalidPrefixError`](/api/PublicKey/errors#publickeyinvalidprefixerror) | Thrown when a public key has an invalid prefix. |
| [`PublicKey.InvalidSerializedSizeError`](/api/PublicKey/errors#publickeyinvalidserializedsizeerror) | Thrown when the public key has an invalid serialized size. |
| [`PublicKey.InvalidUncompressedPrefixError`](/api/PublicKey/errors#publickeyinvaliduncompressedprefixerror) | Thrown when the public key has an invalid prefix for an uncompressed public key. |

## Types

| Name                | Description                         |
| ------------------- | ----------------------------------- |
| [`PublicKey.PublicKey`](/api/PublicKey/types#publickeypublickey) | Root type for an ECDSA Public Key. |
