Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 68 additions & 34 deletions contracts/contracts/IdentityVerificationHubImplV2.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import {CircuitConstantsV2} from "./constants/CircuitConstantsV2.sol";
import {Formatter} from "./libraries/Formatter.sol";

contract IdentityVerificationHubImplV2 is ImplRoot {

/// @custom:storage-location erc7201:self.storage.IdentityVerificationHub
struct IdentityVerificationHubStorage {
uint256 _circuitVersion;
Expand All @@ -29,15 +28,17 @@ contract IdentityVerificationHubImplV2 is ImplRoot {
/// @custom:storage-location erc7201:self.storage.IdentityVerificationHubV2
struct IdentityVerificationHubV2Storage {
mapping(bytes32 configId => SelfStructs.VerificationConfigV2) _v2VerificationConfigs;
// We should consider to add bridge address
// address bridgeAddress;
}
// We should consider to add bridge address
// address bridgeAddress;

/// @dev keccak256(abi.encode(uint256(keccak256("self.storage.IdentityVerificationHub")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant IDENTITYVERIFICATIONHUB_STORAGE_LOCATION = 0x2ade7eace21710c689ddef374add52ace9783e33bac626e58e73a9d190173d00;
bytes32 private constant IDENTITYVERIFICATIONHUB_STORAGE_LOCATION =
0x2ade7eace21710c689ddef374add52ace9783e33bac626e58e73a9d190173d00;

/// @dev keccak256(abi.encode(uint256(keccak256("self.storage.IdentityVerificationHubV2")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant IDENTITYVERIFICATIONHUBV2_STORAGE_LOCATION = 0xf9b5980dcec1a8b0609576a1f453bb2cad4732a0ea02bb89154d44b14a306c00;
bytes32 private constant IDENTITYVERIFICATIONHUBV2_STORAGE_LOCATION =
0xf9b5980dcec1a8b0609576a1f453bb2cad4732a0ea02bb89154d44b14a306c00;

/**
* @notice Returns the storage struct for the main IdentityVerificationHub.
Expand Down Expand Up @@ -260,7 +261,9 @@ contract IdentityVerificationHubImplV2 is ImplRoot {
* @param config The verification configuration
* @return configId The generated config ID
*/
function setVerificationConfigV2(SelfStructs.VerificationConfigV2 memory config) external virtual onlyProxy onlyOwner returns (bytes32 configId) {
function setVerificationConfigV2(
SelfStructs.VerificationConfigV2 memory config
) external virtual onlyProxy onlyOwner returns (bytes32 configId) {
configId = generateConfigId(config);
IdentityVerificationHubV2Storage storage $v2 = _getIdentityVerificationHubV2Storage();
$v2._v2VerificationConfigs[configId] = config;
Expand All @@ -275,14 +278,15 @@ contract IdentityVerificationHubImplV2 is ImplRoot {
* @param baseVerificationInput The base verification input containing header and proof data.
* @param userContextData The user context data containing config ID, destination chain ID, user identifier, and additional data.
*/
function verify(
bytes calldata baseVerificationInput,
bytes calldata userContextData
) external virtual onlyProxy {
function verify(bytes calldata baseVerificationInput, bytes calldata userContextData) external virtual onlyProxy {
(SelfStructs.HubInputHeader memory header, bytes calldata proofData) = _decodeInput(baseVerificationInput);

// Perform verification and get output along with user data
(bytes memory output, uint256 destChainId, bytes memory userDataToPass) = _executeVerificationFlow(header, proofData, userContextData);
(bytes memory output, uint256 destChainId, bytes memory userDataToPass) = _executeVerificationFlow(
header,
proofData,
userContextData
);

// Use destChainId and userDataToPass returned from _executeVerificationFlow
_handleVerificationResult(destChainId, output, userDataToPass);
Expand Down Expand Up @@ -415,7 +419,10 @@ contract IdentityVerificationHubImplV2 is ImplRoot {
* @param typeId The type ID to query.
* @return The register circuit verifier address associated with the attestation ID and type ID.
*/
function registerCircuitVerifiers(bytes32 attestationId, uint256 typeId) external view virtual onlyProxy returns (address) {
function registerCircuitVerifiers(
bytes32 attestationId,
uint256 typeId
) external view virtual onlyProxy returns (address) {
IdentityVerificationHubStorage storage $ = _getIdentityVerificationHubStorage();
return $._registerCircuitVerifiers[attestationId][typeId];
}
Expand All @@ -426,7 +433,10 @@ contract IdentityVerificationHubImplV2 is ImplRoot {
* @param typeId The type ID to query.
* @return The DSC circuit verifier address associated with the attestation ID and type ID.
*/
function dscCircuitVerifiers(bytes32 attestationId, uint256 typeId) external view virtual onlyProxy returns (address) {
function dscCircuitVerifiers(
bytes32 attestationId,
uint256 typeId
) external view virtual onlyProxy returns (address) {
IdentityVerificationHubStorage storage $ = _getIdentityVerificationHubStorage();
return $._dscCircuitVerifiers[attestationId][typeId];
}
Expand Down Expand Up @@ -523,7 +533,12 @@ contract IdentityVerificationHubImplV2 is ImplRoot {
{
bytes memory config = _getVerificationConfigById(configId);

bytes memory proofOutput = _basicVerification(header, _decodeVcAndDiscloseProof(proofData), userContextData, userIdentifier);
bytes memory proofOutput = _basicVerification(
header,
_decodeVcAndDiscloseProof(proofData),
userContextData,
userIdentifier
);

SelfStructs.GenericDiscloseOutputV2 memory genericDiscloseOutput = CustomVerifier.customVerify(
header.attestationId,
Expand Down Expand Up @@ -572,14 +587,18 @@ contract IdentityVerificationHubImplV2 is ImplRoot {
) internal returns (bytes memory output) {
// Scope 1: Basic checks (scope and user identifier)
{
CircuitConstantsV2.DiscloseIndices memory indices = CircuitConstantsV2.getDiscloseIndices(header.attestationId);
CircuitConstantsV2.DiscloseIndices memory indices = CircuitConstantsV2.getDiscloseIndices(
header.attestationId
);
_performScopeCheck(header.scope, vcAndDiscloseProof, indices);
_performUserIdentifierCheck(userContextData, vcAndDiscloseProof, header.attestationId, indices);
}

// Scope 2: Root and date checks
{
CircuitConstantsV2.DiscloseIndices memory indices = CircuitConstantsV2.getDiscloseIndices(header.attestationId);
CircuitConstantsV2.DiscloseIndices memory indices = CircuitConstantsV2.getDiscloseIndices(
header.attestationId
);
_performRootCheck(header.attestationId, vcAndDiscloseProof, indices);
_performCurrentDateCheck(vcAndDiscloseProof, indices);
}
Expand All @@ -589,7 +608,9 @@ contract IdentityVerificationHubImplV2 is ImplRoot {

// Scope 4: Create and return output
{
CircuitConstantsV2.DiscloseIndices memory indices = CircuitConstantsV2.getDiscloseIndices(header.attestationId);
CircuitConstantsV2.DiscloseIndices memory indices = CircuitConstantsV2.getDiscloseIndices(
header.attestationId
);
return _createVerificationOutput(header.attestationId, vcAndDiscloseProof, indices, userIdentifier);
}
}
Expand All @@ -603,7 +624,9 @@ contract IdentityVerificationHubImplV2 is ImplRoot {
* @param configId The configuration identifier
* @return The verification configuration
*/
function getVerificationConfigV2(bytes32 configId) internal view virtual onlyProxy returns (SelfStructs.VerificationConfigV2 memory) {
function getVerificationConfigV2(
bytes32 configId
) internal view virtual onlyProxy returns (SelfStructs.VerificationConfigV2 memory) {
IdentityVerificationHubV2Storage storage $v2 = _getIdentityVerificationHubV2Storage();
return $v2._v2VerificationConfigs[configId];
}
Expand Down Expand Up @@ -800,12 +823,14 @@ contract IdentityVerificationHubImplV2 is ImplRoot {
) internal view {
IdentityVerificationHubStorage storage $ = _getIdentityVerificationHubStorage();

if (!IVcAndDiscloseCircuitVerifier($._discloseVerifiers[attestationId]).verifyProof(
vcAndDiscloseProof.a,
vcAndDiscloseProof.b,
vcAndDiscloseProof.c,
vcAndDiscloseProof.pubSignals
)) {
if (
!IVcAndDiscloseCircuitVerifier($._discloseVerifiers[attestationId]).verifyProof(
vcAndDiscloseProof.a,
vcAndDiscloseProof.b,
vcAndDiscloseProof.c,
vcAndDiscloseProof.pubSignals
)
) {
revert InvalidVcAndDiscloseProof();
}
}
Expand All @@ -820,7 +845,9 @@ contract IdentityVerificationHubImplV2 is ImplRoot {
* @return header The header of the input data.
* @return proofData The proof data of the input data.
*/
function _decodeInput(bytes calldata baseVerificationInput) internal pure returns (SelfStructs.HubInputHeader memory header, bytes calldata proofData) {
function _decodeInput(
bytes calldata baseVerificationInput
) internal pure returns (SelfStructs.HubInputHeader memory header, bytes calldata proofData) {
if (baseVerificationInput.length < 97) {
revert InputTooShort();
}
Expand All @@ -838,12 +865,13 @@ contract IdentityVerificationHubImplV2 is ImplRoot {
* @return userIdentifier The user identifier
* @return remainingData The remaining data after the first 96 bytes
*/
function _decodeUserContextData(bytes calldata userContextData) internal pure returns (
bytes32 configId,
uint256 destChainId,
uint256 userIdentifier,
bytes calldata remainingData
) {
function _decodeUserContextData(
bytes calldata userContextData
)
internal
pure
returns (bytes32 configId, uint256 destChainId, uint256 userIdentifier, bytes calldata remainingData)
{
if (userContextData.length < 96) {
revert UserContextDataTooShort();
}
Expand Down Expand Up @@ -922,7 +950,9 @@ contract IdentityVerificationHubImplV2 is ImplRoot {

// Extract forbidden countries list
for (uint256 i = 0; i < 4; i++) {
passportOutput.forbiddenCountriesListPacked[i] = vcAndDiscloseProof.pubSignals[indices.forbiddenCountriesListPackedIndex + i];
passportOutput.forbiddenCountriesListPacked[i] = vcAndDiscloseProof.pubSignals[
indices.forbiddenCountriesListPackedIndex + i
];
}

return abi.encode(passportOutput);
Expand Down Expand Up @@ -957,7 +987,9 @@ contract IdentityVerificationHubImplV2 is ImplRoot {

// Extract forbidden countries list
for (uint256 i = 0; i < 4; i++) {
euIdOutput.forbiddenCountriesListPacked[i] = vcAndDiscloseProof.pubSignals[indices.forbiddenCountriesListPackedIndex + i];
euIdOutput.forbiddenCountriesListPacked[i] = vcAndDiscloseProof.pubSignals[
indices.forbiddenCountriesListPackedIndex + i
];
}

return abi.encode(euIdOutput);
Expand All @@ -969,7 +1001,9 @@ contract IdentityVerificationHubImplV2 is ImplRoot {
* @param data The encoded proof data.
* @return The decoded VcAndDiscloseProof struct.
*/
function _decodeVcAndDiscloseProof(bytes memory data) internal pure returns (IVcAndDiscloseCircuitVerifier.VcAndDiscloseProof memory) {
function _decodeVcAndDiscloseProof(
bytes memory data
) internal pure returns (IVcAndDiscloseCircuitVerifier.VcAndDiscloseProof memory) {
return abi.decode(data, (IVcAndDiscloseCircuitVerifier.VcAndDiscloseProof));
}

Expand Down
21 changes: 7 additions & 14 deletions contracts/contracts/abstract/SelfVerificationRoot.sol
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,7 @@ abstract contract SelfVerificationRoot is ISelfVerificationRoot {
* @param identityVerificationHubV2Address The address of the Identity Verification Hub V2
* @param scopeValue The expected proof scope for user registration
*/
constructor(
address identityVerificationHubV2Address,
uint256 scopeValue
) {
constructor(address identityVerificationHubV2Address, uint256 scopeValue) {
_identityVerificationHubV2 = IIdentityVerificationHubV2(identityVerificationHubV2Address);
_scope = scopeValue;
}
Expand Down Expand Up @@ -95,10 +92,7 @@ abstract contract SelfVerificationRoot is ISelfVerificationRoot {
* @custom:data-format userContextData = | 32 bytes configId | 32 bytes destChainId | 32 bytes userIdentifier | data |
* @custom:data-format hubData = | 1 bytes contract version | 31 bytes buffer | 32 bytes scope | 32 bytes attestationId | proofData |
*/
function verifySelfProof(
bytes calldata proofPayload,
bytes calldata userContextData
) public {
function verifySelfProof(bytes calldata proofPayload, bytes calldata userContextData) public {
// Minimum expected length for proofData: 32 bytes attestationId + proof data
if (proofPayload.length < 32) {
revert InvalidDataFormat();
Expand Down Expand Up @@ -141,16 +135,16 @@ abstract contract SelfVerificationRoot is ISelfVerificationRoot {
* @custom:security Only the authorized hub contract can call this function
* @custom:flow This function decodes the output and calls the customizable verification hook
*/
function onVerificationSuccess(
bytes memory output,
bytes memory userData
) public {
function onVerificationSuccess(bytes memory output, bytes memory userData) public {
// Only allow the identity verification hub V2 to call this function
if (msg.sender != address(_identityVerificationHubV2)) {
revert UnauthorizedCaller();
}

ISelfVerificationRoot.GenericDiscloseOutputV2 memory genericDiscloseOutput = abi.decode(output, (ISelfVerificationRoot.GenericDiscloseOutputV2));
ISelfVerificationRoot.GenericDiscloseOutputV2 memory genericDiscloseOutput = abi.decode(
output,
(ISelfVerificationRoot.GenericDiscloseOutputV2)
);

// Call the customizable verification hook
customVerificationHook(genericDiscloseOutput, userData);
Expand All @@ -170,5 +164,4 @@ abstract contract SelfVerificationRoot is ISelfVerificationRoot {
) internal virtual {
// Default implementation is empty - override in derived contracts to add custom logic
}

}
2 changes: 1 addition & 1 deletion contracts/contracts/example/Airdrop.sol
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// // SPDX-License-Identifier: MIT
// // SPDX-License-Identifier: MIT
// pragma solidity 0.8.28;

// import {IERC20, SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
Expand Down
2 changes: 1 addition & 1 deletion contracts/contracts/example/HappyBirthday.sol
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// // SPDX-License-Identifier: MIT
// // SPDX-License-Identifier: MIT
// pragma solidity 0.8.28;

// import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
Expand Down
2 changes: 1 addition & 1 deletion contracts/contracts/example/SelfPassportERC721.sol
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// // SPDX-License-Identifier: MIT
// // SPDX-License-Identifier: MIT
// pragma solidity 0.8.28;

// import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";
Expand Down
27 changes: 7 additions & 20 deletions contracts/contracts/interfaces/IIdentityVerificationHubV2.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import {SelfStructs} from "../libraries/SelfStructs.sol";
* @dev Defines all external and public functions from IdentityVerificationHubImplV2.
*/
interface IIdentityVerificationHubV2 {

// ====================================================
// External Functions
// ====================================================
Expand Down Expand Up @@ -48,17 +47,16 @@ interface IIdentityVerificationHubV2 {
* @param config The verification configuration
* @return configId The generated config ID
*/
function setVerificationConfigV2(SelfStructs.VerificationConfigV2 memory config) external returns (bytes32 configId);
function setVerificationConfigV2(
SelfStructs.VerificationConfigV2 memory config
) external returns (bytes32 configId);

/**
* @notice Main verification function with new structured input format
* @param baseVerificationInput The base verification input data
* @param userContextData The user context data
*/
function verify(
bytes calldata baseVerificationInput,
bytes calldata userContextData
) external;
function verify(bytes calldata baseVerificationInput, bytes calldata userContextData) external;

/**
* @notice Updates the registry address.
Expand All @@ -72,34 +70,23 @@ interface IIdentityVerificationHubV2 {
* @param attestationId The attestation ID.
* @param vcAndDiscloseCircuitVerifierAddress The new VC and Disclose circuit verifier address.
*/
function updateVcAndDiscloseCircuit(
bytes32 attestationId,
address vcAndDiscloseCircuitVerifierAddress
) external;
function updateVcAndDiscloseCircuit(bytes32 attestationId, address vcAndDiscloseCircuitVerifierAddress) external;

/**
* @notice Updates the register circuit verifier for a specific signature type.
* @param attestationId The attestation identifier.
* @param typeId The signature type identifier.
* @param verifierAddress The new register circuit verifier address.
*/
function updateRegisterCircuitVerifier(
bytes32 attestationId,
uint256 typeId,
address verifierAddress
) external;
function updateRegisterCircuitVerifier(bytes32 attestationId, uint256 typeId, address verifierAddress) external;

/**
* @notice Updates the DSC circuit verifier for a specific signature type.
* @param attestationId The attestation identifier.
* @param typeId The signature type identifier.
* @param verifierAddress The new DSC circuit verifier address.
*/
function updateDscVerifier(
bytes32 attestationId,
uint256 typeId,
address verifierAddress
) external;
function updateDscVerifier(bytes32 attestationId, uint256 typeId, address verifierAddress) external;

/**
* @notice Batch updates register circuit verifiers.
Expand Down
11 changes: 2 additions & 9 deletions contracts/contracts/interfaces/ISelfVerificationRoot.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ pragma solidity 0.8.28;
* @dev Provides base functionality for verifying and disclosing identity credentials
*/
interface ISelfVerificationRoot {

/**
* @notice Structure containing proof data for disclose circuits
* @dev Contains the proof elements required for zero-knowledge verification
Expand Down Expand Up @@ -62,19 +61,13 @@ interface ISelfVerificationRoot {
* @param proofPayload Packed data from relayer in format: | 32 bytes attestationId | proof data |
* @param userContextData User-defined data in format: | 32 bytes configId | 32 bytes destChainId | 32 bytes userIdentifier | data |
*/
function verifySelfProof(
bytes calldata proofPayload,
bytes calldata userContextData
) external;
function verifySelfProof(bytes calldata proofPayload, bytes calldata userContextData) external;

/**
* @notice Callback function called upon successful verification
* @dev Only the identity verification hub V2 contract should call this function
* @param output The verification output data containing disclosed identity information
* @param userData The user-defined data passed through the verification process
*/
function onVerificationSuccess(
bytes memory output,
bytes memory userData
) external;
function onVerificationSuccess(bytes memory output, bytes memory userData) external;
}
Loading