[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) › Ipv4Address

```ts
const Ipv4Address: brand(
  "Ipv4Address",
  String,
  (value: string) =>
    ipv4AddressRegex.test(value)
      ? ok()
      : err<Ipv4AddressError>({ type: "Ipv4Address", value }),
  formatIpv4AddressError,
);
```

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

IPv4 address in dotted-decimal form, as the `IPv4address` rule of [RFC 3986
section 3.2.2](https://www.rfc-editor.org/rfc/rfc3986#section-3.2.2) defines
it.

Ipv4Address accepts four decimal numbers from 0 to 255 separated by dots,
such as `192.168.1.1`. Every address has exactly one Ipv4Address, so equal
addresses are equal strings.

Ipv4Address does not normalize. It rejects leading zeros, because some
parsers, including the WHATWG URL Standard, read `010` as octal 8 and others
as decimal 10. It also rejects the hexadecimal, integer, and shortened forms
that URL parsers accept, such as `0x7f.0.0.1`, `2130706433`, and `127.1`, as
well as prefix lengths and whitespace. Trim text from other sources before
validating it, but do not strip leading zeros, because their meaning depends
on the parser that wrote them.

### Example

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

assertOk(Ipv4Address.fromUnknown("192.168.1.1"), "192.168.1.1");

const invalid = Ipv4Address.fromUnknown("192.168.01.1");
assertErr(invalid);
assertEqual(invalid.error, {
  type: "Ipv4Address",
  value: "192.168.01.1",
});
```