Identity Verification
SMARTIdentityVerification module with full RPN expression system. Covers KYC/AML/ACCREDITED/CONTRACT claim topics, AND/OR/NOT operators, exemption support, and real-world expression examples.
Purpose: Reference for the SMARTIdentityVerification module and RPN expression system.
- Doc type: Reference
- What you'll find here:
- SMARTIdentityVerification — claim-based transfer verification
- Interface table showing on-chain capabilities
- Full RPN expression system with regulatory examples
- Key invariants, operational signals, and failure modes
- Related: Compliance Overview, Identity Lists, Supply & Investor Limits, Transfer Approval, TimeLock
SMARTIdentityVerification
The most expressive compliance module in DALP. Instead of simple allow/block lists, it evaluates logical expressions over identity claims to determine whether a transfer is permitted.
A claim is an on-chain attestation issued by a trusted issuer (KYC provider, compliance officer) and stored on the investor's OnchainID identity contract. The module checks whether the investor's identity holds valid (non-expired) claims matching the configured expression.
Interface (capabilities)
| Capability | Who can call | Inputs | On-chain effect | Emits | Notes |
|---|---|---|---|---|---|
setModuleParameters | Token admin (via compliance) | RPN expression (array of claim topics and operators) | Stores verification expression | — | Expression validated at configuration time |
canTransfer | Compliance engine | Sender, recipient, amount | Evaluates expression against recipient's identity claims | — | Checks both sender and recipient; claims must be non-expired |

Claim topics
Standard claim topics used across DALP compliance configurations:
| Topic | Meaning | Typical issuer |
|---|---|---|
| KYC | Know Your Customer identity verification completed | KYC provider |
| AML | Anti-Money Laundering screening passed | Compliance provider |
| ACCREDITED | Investor meets accredited investor criteria (e.g., Reg D) | Compliance officer |
| CONTRACT | Investor is a legal entity (not a natural person) | KYC provider |
| JURISDICTION | Investor is resident in a qualifying jurisdiction | KYC provider |
Custom claim topics can be defined by the compliance team and registered in the Topic Scheme Registry.
RPN expression system
The module evaluates expressions in Reverse Polish Notation (postfix). This allows arbitrary logical combinations of claim checks without parentheses.
Expression components
| Node type | Behavior |
|---|---|
| TOPIC | Push true if identity holds a valid claim for that topic; false otherwise |
| AND | Pop two values, push logical AND |
| OR | Pop two values, push logical OR |
| NOT | Pop one value, push logical inverse |
Expression examples
| Requirement | Postfix expression |
|---|---|
| KYC AND AML | [KYC, AML, AND] |
| ACCREDITED investors only | [ACCREDITED] |
| Corporate entities OR verified individuals | [CONTRACT, KYC, AML, AND, OR] |
| Full KYC stack | [ACCREDITED, KYC, AML, AND, JURISDICTION, AND, OR] |
| KYC but NOT sanctioned | [KYC, SANCTIONED, NOT, AND] |
Real-world regulatory configurations
| Regulation | Expression | Meaning |
|---|---|---|
| MiCA EU Standard | [KYC, AML, AND] | Both KYC and AML claims required |
| Reg D 506(b) | [ACCREDITED, KYC, AML, AND, OR] | Accredited investors OR (KYC AND AML) — allows up to 35 non-accredited sophisticated investors |
| Reg D 506(c) | [ACCREDITED] | Only accredited investors (strict) |
| Japan FSA | [CONTRACT, KYC, AML, AND, OR] | QII (corporate) or (KYC AND AML) — Qualified Institutional Investor exemption |
Exemption expressions
The same RPN system is used by other modules to configure exemptions — investors that bypass a module's restriction:
- TimeLock: investors matching the exemption expression skip the holding period
- TransferApproval: investors matching the exemption expression skip the pre-approval requirement
- InvestorCount: the
topicFilterexpression determines which investors are counted (not which are blocked)
This allows sophisticated exemption logic: e.g., "QII investors are exempt from the 180-day lock, but retail investors must hold for the full period."
Key invariants
- Both sender and recipient must hold valid claims matching the configured expression
- Claims are checked for expiry — expired claims fail verification even if the topic matches
- The expression is evaluated as a stack machine — malformed expressions revert at configuration time via
validateParameters - Trusted issuers are configured globally, not per-token — a claim from any registered trusted issuer is accepted
Operational signals
No events emitted by this module. Monitor for ComplianceCheckFailed revert errors in failed transactions when identity verification fails.
Failure modes & edge cases
- Investor's claim expires between verification check and transfer execution — transfer reverts
- Trusted issuer removed after claims were issued — existing claims from that issuer are no longer accepted
- Empty expression (no claim topics) — all transfers pass verification (effectively disables the module)
See also
- Compliance Overview — module architecture and regulatory templates
- Supply & Investor Limits — InvestorCount topicFilter uses the same expression system
- Transfer Approval — exemption expressions for transfer approval
- TimeLock — identity-based exemptions from holding periods
Identity Lists
IdentityAllowList, IdentityBlockList, and AddressBlockList modules for granular access control. Covers private placement whitelists, sanctions screening, and the distinction between identity-level and address-level blocking.
Supply & Investor Limits
TokenSupplyLimit and InvestorCount modules — time-based and rolling supply caps with currency conversion, and unique holder limits with per-country granularity.