interface IWorldIDVerifierSession {
function verifySession(
uint64 rpId,
uint256 nonce,
uint256 signalHash,
uint64 expiresAtMin,
uint64 issuerSchemaId,
uint256 credentialGenesisIssuedAtMin,
uint256 sessionId,
uint256[2] calldata sessionNullifier,
uint256[5] calldata zeroKnowledgeProof
) external view;
}
contract VerifySessionV4 {
IWorldIDVerifierSession public immutable verifier;
mapping(bytes32 => bool) public sessionReplayGuard;
error SessionReplay();
constructor(IWorldIDVerifierSession _verifier) {
verifier = _verifier;
}
function verifySessionProof(
uint64 rpId,
uint256 nonce,
uint256 signalHash,
uint64 expiresAtMin,
uint64 issuerSchemaId,
uint256 credentialGenesisIssuedAtMin,
uint256 sessionId,
uint256[2] calldata sessionNullifier,
uint256[5] calldata proof
) external {
// Optional replay protection for one-time session actions.
bytes32 replayKey = keccak256(
abi.encodePacked(sessionId, sessionNullifier[0], nonce)
);
if (sessionReplayGuard[replayKey]) revert SessionReplay();
verifier.verifySession(
rpId,
nonce,
signalHash,
expiresAtMin,
issuerSchemaId,
credentialGenesisIssuedAtMin,
sessionId,
sessionNullifier,
proof
);
sessionReplayGuard[replayKey] = true;
// Execute protected business logic here.
}
}