[API reference](https://evolu.dev/docs/api-reference) › [@evolu/common](https://evolu.dev/docs/api-reference/common) › [Type](https://evolu.dev/docs/api-reference/common/Type) › Ipv6Address

```ts
const Ipv6Address: brand(
  "Ipv6Address",
  String,
  (value: string) =>
    canonicalizeIpv6Address(value) === value
      ? ok()
      : err<Ipv6AddressError>({ type: "Ipv6Address", value }),
  formatIpv6AddressError,
);
```

Defined in: [packages/common/src/Type.ts:9362](https://github.com/evoluhq/evolu/blob/bc4578a260dd15d5bbf94b83765ca05984d194cb/packages/common/src/Type.ts#L9362)

IPv6 address in its canonical text form, as defined by [RFC
5952](https://www.rfc-editor.org/rfc/rfc5952).

RFC 4291 allows many spellings of one address: `2001:DB8::1`, `2001:0db8::1`,
and `2001:db8:0:0:0:0:0:1` all name `2001:db8::1`. Ipv6Address accepts only
the canonical spelling, so equal addresses are equal strings: lowercase
hexadecimal groups without leading zeros, with `::` replacing the longest run
of two or more zero groups, the first one on a tie. IPv4-mapped addresses use
the mixed notation of RFC 5952 section 5, such as `::ffff:1.2.3.4`, while
WHATWG URL hosts write them in hexadecimal, such as `[::ffff:102:304]`.

Ipv6Address does not normalize; use [Ipv6AddressFromString](https://evolu.dev/docs/api-reference/common/Type/variables/Ipv6AddressFromString) to convert
other spellings to the canonical one. Zone identifiers, such as `%eth0`, are
rejected, because they name a network interface of one device and mean
nothing on another. Brackets, prefix lengths, and whitespace are rejected
too; remove them before validating.

### Example

```ts
import { assertEqual, assertErr, assertOk, Ipv6Address } from "@evolu/common";

assertOk(Ipv6Address.fromUnknown("2001:db8::1"), "2001:db8::1");
assertOk(Ipv6Address.fromUnknown("::ffff:1.2.3.4"), "::ffff:1.2.3.4");

const invalid = Ipv6Address.fromUnknown("2001:DB8::1");
assertErr(invalid);
assertEqual(invalid.error, {
  type: "Ipv6Address",
  value: "2001:DB8::1",
});
```