// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {IncrementalBinaryTree, IncrementalTreeData} from '@zk-kit/incremental-merkle-tree.sol/IncrementalBinaryTree.sol';
import {ReusableMerkleTree, ReusableTreeData} from '../libraries/ReusableMerkleTree.sol';
import {LazyMerkleTree, LazyTreeData} from '../libraries/LazyMerkleTree.sol';
/// @title IUnirep
/// @dev https://developer.unirep.io/docs/contracts-api/iunirep-sol
interface IUnirep {
event AttesterSignedUp(
uint160 indexed attesterId,
uint48 epochLength,
uint48 timestamp
);
event UserSignedUp(
uint48 indexed epoch,
uint256 indexed identityCommitment,
uint160 indexed attesterId,
uint256 leafIndex
);
event UserStateTransitioned(
uint48 indexed epoch,
uint160 indexed attesterId,
uint256 indexed leafIndex,
uint256 hashedLeaf,
uint256 nullifier
);
event Attestation(
uint48 indexed epoch,
uint256 indexed epochKey,
uint160 indexed attesterId,
uint256 fieldIndex,
uint256 change
);
event StateTreeLeaf(
uint48 indexed epoch,
uint160 indexed attesterId,
uint256 indexed index,
uint256 leaf
);
event EpochTreeLeaf(
uint48 indexed epoch,
uint160 indexed attesterId,
uint256 indexed index,
uint256 leaf
);
event HistoryTreeLeaf(uint160 indexed attesterId, uint256 leaf);
event EpochEnded(uint48 indexed epoch, uint160 indexed attesterId);
// error
error UserAlreadySignedUp(uint256 identityCommitment);
error AttesterAlreadySignUp(uint160 attester);
error AttesterNotSignUp(uint160 attester);
error AttesterInvalid();
error NullifierAlreadyUsed(uint256 nullilier);
error AttesterIdNotMatch(uint160 attesterId);
error OutOfRange();
error InvalidField();
error EpochKeyNotProcessed();
error InvalidSignature();
error InvalidEpochKey();
error EpochNotMatch();
error InvalidEpoch(uint256 epoch);
error ChainIdNotMatch(uint48 chainId);
error InvalidProof();
error InvalidHistoryTreeRoot(uint256 historyTreeRoot);
struct SignupSignals {
uint48 epoch;
uint48 chainId;
uint160 attesterId;
uint256 stateTreeLeaf;
uint256 identityCommitment;
}
struct UserStateTransitionSignals {
uint256 historyTreeRoot;
uint256 stateTreeLeaf;
uint48 toEpoch;
uint160 attesterId;
uint256[] epochKeys;
}
struct EpochKeyData {
uint40 leafIndex;
uint48 epoch;
uint256 leaf;
// use a constant because compile time variables are not supported
uint256[128] data;
}
struct AttesterData {
uint48 startTimestamp;
uint48 currentEpoch;
uint48 epochLength;
// epoch keyed to root keyed to whether it's valid
mapping(uint256 => mapping(uint256 => bool)) stateTreeRoots;
mapping(uint256 => bool) historyTreeRoots;
// epoch keyed to root
mapping(uint256 => uint256) epochTreeRoots;
mapping(uint256 => bool) identityCommitments;
IncrementalTreeData semaphoreGroup;
// epoch key management
mapping(uint256 => EpochKeyData) epkData;
IncrementalTreeData historyTree;
ReusableTreeData stateTree;
LazyTreeData epochTree;
}
struct Config {
// circuit config
uint8 stateTreeDepth;
uint8 epochTreeDepth;
uint8 historyTreeDepth;
uint8 fieldCount;
uint8 sumFieldCount;
uint8 numEpochKeyNoncePerEpoch;
uint8 replNonceBits;
uint8 replFieldBits;
}
}
|