> ## Documentation Index
> Fetch the complete documentation index at: https://kleros-mintlify-6ebc7975.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Integration Guide

> Integrate Proof of Humanity V2 to verify unique humans, covering contract calls on Gnosis Chain and cross-chain state on Ethereum Mainnet.

# Proof of Humanity 2.0 Integration Guide

This guide shows how to integrate PoH V2 to verify that an address belongs to a real, verified human. PoH V2 runs on Gnosis Chain as the home chain, with cross-chain state synchronized to Ethereum Mainnet.

***

## Contract Addresses

<Tabs>
  <Tab title="Gnosis Chain">
    | Contract                  | Address                                      |
    | ------------------------- | -------------------------------------------- |
    | ProofOfHumanity           | `0xa4AC94C4fa65Bb352eFa30e3408e64F72aC857bc` |
    | CrossChainProofOfHumanity | `0x16044E1063C08670f8653055A786b7CC2034d2b0` |
    | AMB Bridge Gateway        | `0x6Ef5073d79c42531352d1bF5F584a7CBd270c6B1` |
  </Tab>

  <Tab title="Ethereum Mainnet">
    | Contract                  | Address                                      |
    | ------------------------- | -------------------------------------------- |
    | ProofOfHumanityExtended   | `0xbE9834097A4E97689d9B667441acafb456D0480A` |
    | CrossChainProofOfHumanity | `0xa478095886659168E8812154fB0DE39F103E74b2` |
    | AMB Bridge Gateway        | `0xddafACf8B4a5087Fc89950FF7155c76145376c1e` |
    | Fork Module               | `0x068a27Db9c3B8595D03be263d52c813cb2C99cCB` |
  </Tab>
</Tabs>

***

## Core Interface

The primary verification functions:

```solidity theme={null}
function isHuman(address _account) external view returns (bool);
function humanityOf(address _account) external view returns (bytes20);
function isClaimed(bytes20 _humanityId) external view returns (bool);
function boundTo(bytes20 _humanityId) external view returns (address);
function getHumanityInfo(bytes20 _humanityId) external view returns (
    bool vouching, bool pendingRevocation, uint48 nbPendingRequests,
    uint40 expirationTime, address owner, uint256 nbRequests
);
```

| Function                      | Purpose                                                          |
| ----------------------------- | ---------------------------------------------------------------- |
| `isHuman(address)`            | Returns true if the address belongs to a verified human          |
| `humanityOf(address)`         | Returns the `humanityId` bound to an address (zero if none)      |
| `isClaimed(humanityId)`       | Returns true if the humanity ID is actively claimed              |
| `boundTo(humanityId)`         | Returns the wallet address currently bound to a humanity ID      |
| `getHumanityInfo(humanityId)` | Full status: vouching state, pending requests, expiration, owner |

***

## Basic Integration Pattern

The simplest integration is a modifier that gates functions to verified humans:

```solidity theme={null}
interface IProofOfHumanity {
    function isHuman(address _account) external view returns (bool);
}

contract MyApp {
    IProofOfHumanity public poh;

    constructor(IProofOfHumanity _poh) {
        poh = _poh;
    }

    modifier onlyHuman() {
        require(poh.isHuman(msg.sender), "Must be verified human");
        _;
    }

    function humanOnlyAction() external onlyHuman {
        // Only verified humans reach this point
    }
}
```

***

## Soulbound Identity Design

PoH V2 follows the principle: **1 human → 1 humanity ID ↔ 1 wallet address**.

The `humanityId` is a soulbound identifier that persists across wallet transitions. If a user loses wallet access, they can re-register with a new address while keeping the same `humanityId`. Applications that key reputation, assets, or history by `humanityId` rather than by address preserve them across the user's wallet changes.

```
humanity.owner == lostAddress      // Lost access
humanity.owner == address(0)       // Removal requested
humanity.owner == newAddress       // Re-registered with new wallet
```

<Note>
  V1 users have a `humanityId` equal to their original registration address (`bytes20(address)`). V2 users receive a new unique `humanityId` at registration. The `isHuman()` call automatically covers V1 registrations through the Fork Module.
</Note>

***

## What's Next?

<CardGroup cols={2}>
  <Card title="PoH Overview" icon="fingerprint" href="/developers/products/poh/overview">
    Architecture and technical details
  </Card>

  <Card title="Smart Contracts" icon="file-contract" href="/developers/products/poh/smart-contracts">
    Core interfaces and data structures
  </Card>
</CardGroup>
