1. Verifying Legacy proofs (World ID 3.0)
For v3 proofs, verify againstWorldIDRouter.verifyProof(...). Use the Router address for the chain you’re deploying to:
| Chain | WorldIDRouter Mainnet | WorldIDRouter Testnet |
|---|---|---|
| World Chain | 0x17B354dD…A278 | 0x57f92815…f611 |
| Ethereum | id.worldcoin.eth | 0x469449f2…2157 |
| Base | 0xBCC7e591…4163 | 0x42FF98C4…C02 |
| Optimism | optimism.id.worldcoin.eth | 0x11cA3127…4334 |
| Polygon | polygon.id.worldcoin.eth | — |
groupId = 1 (Orb-only on-chain path).
If your v3 proof arrives as ABI-encoded bytes, decode it to uint256[8] before
calling verifyProof:
2. Verifying Uniqueness proofs in WorldIDVerifier.sol (World ID 4.0)
WorldIDVerifier is deployed on World Chain Mainnet as an upgradeable proxy.
Use the proxy address for your environment:
| Environment | Chain | WorldIDVerifier proxy |
|---|---|---|
| Production | World Chain | 0x00000000009E00F9FE82CfeeBB4556686da094d7 |
| Staging | World Chain | 0x703a6316c975DEabF30b637c155edD53e24657DB |
verify(...) on the WorldIDVerifier proxy and
store used nullifiers to enforce one-human-one-action semantics in your
contract.
nullifier=responses[i].nullifieraction=keccak256(action)asuint256rpId= numericrp_idnonce= top-levelnoncesignalHash=responses[i].signal_hashexpiresAtMin=responses[i].expires_at_minissuerSchemaId=responses[i].issuer_schema_idcredentialGenesisIssuedAtMin=responses[i].credential_genesis_issued_at_min ?? 0proof=responses[i].proof(uint256[5])