Create a Module
Create a custom module when the standard library does not cover your validation logic.
If a standard-library module already fits your need, you can skip this page and just register or reuse that module.
Contract base
Custom modules inherit AbstractModuleV2:
import { AbstractModuleV2 } from "@verax-attestation-registry/verax-contracts/contracts/abstracts/AbstractModuleV2.sol";
Then implement:
function run(
AttestationPayload calldata attestationPayload,
bytes calldata validationPayload,
address initialCaller,
uint256 value,
address attester,
address portal,
OperationType operationType
) public virtual;
run(...) should revert when validation fails.
Minimal example
// SPDX-License-Identifier: MIT
pragma solidity 0.8.21;
import { AbstractModuleV2 } from "@verax-attestation-registry/verax-contracts/contracts/abstracts/AbstractModuleV2.sol";
import { AttestationPayload } from "@verax-attestation-registry/verax-contracts/contracts/types/Structs.sol";
import { OperationType } from "@verax-attestation-registry/verax-contracts/contracts/types/Enums.sol";
contract ExampleModule is AbstractModuleV2 {
error InsufficientFee();
function run(
AttestationPayload calldata,
bytes calldata,
address,
uint256 value,
address,
address,
OperationType
) public pure override {
if (value < 0.001 ether) revert InsufficientFee();
}
}
Important implementation notes
- Inheriting
AbstractModuleV2already gives you ERC-165 support for registration checks. validationPayloadis where you pass signatures, proofs, or any module-specific data.operationTypelets you distinguish attest vs bulk attest vs replace vs bulk replace.- If you rely on
msg.value, remember that only one module in a chain should interpret it. - Bulk module execution currently passes
0as value inModuleRegistry.bulkRunModulesV2(...).
warning
If your module depends on fees or any other payable behavior, remember that bulk module execution currently passes 0
as value.
Next step
Once deployed, register the module in ModuleRegistry.
See Register a Module.