Prove·sync · inline

secp256r1 / Passkey

WebAuthn / Face ID

Verify P-256 signatures. Powers TxPasskey (0x77) — no seed phrases.

0x0000000000000000000000000000000000000100Explorer
65 bytes · 0x04 || X || Y
32-byte hash
64 bytes · R || S
to: 0x0000000000000000000000000000000000000100chainId 1979 · sync
Output
Click Verify to call the precompile.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

contract PasskeyVerifier {
    address constant P256 = address(0x100);

    /// @notice Verify a P-256 (WebAuthn / Passkey) signature.
    /// @param pubkey   65 bytes: 0x04 || X || Y
    /// @param message  32 bytes message hash
    /// @param sig      64 bytes: R || S
    function verify(bytes memory pubkey, bytes32 message, bytes memory sig)
        external view returns (bool)
    {
        bytes memory input = abi.encodePacked(pubkey, message, sig);
        (bool ok, bytes memory result) = P256.staticcall(input);
        require(ok && result.length > 0, "p256 call failed");
        return abi.decode(result, (uint256)) == 1;
    }
}