SettleMint
ArchitectureSecurityCompliance Modules

Supply & Investor Limits

TokenSupplyLimit and InvestorCount modules — time-based and rolling supply caps with currency conversion, and unique holder limits with per-country granularity.

Purpose: Reference for supply and investor limit compliance modules.


Where these modules apply

ConcernTokenSupplyLimitInvestorCount
MintingEnforces cap (lifetime / fixed / rolling)Tracks new holders
TransfersTracks new holders
BurnsDecrements count
Forced transfersTracks new holders

TokenSupplyLimit

Enforces maximum token supply limits, with optional base-price conversion for EUR/USD-denominated caps.

Interface (capabilities)

CapabilityWho can callInputsOn-chain effectEmitsNotes
setModuleParametersToken admin (via compliance)maxSupply, limitType, period, useBasePriceStores supply-limit config; validateParameters reverts if maxSupply = 0Calling with maxSupply = 0 reverts; the cap must be a positive value
canTransfer (mint path)Compliance engineSender, recipient, amountChecks cumulative supply against limit (converts via price claim if useBasePrice)Only enforced on mints (from == address(0))

Supply limit types

TypeBehaviorUse case
LIFETIMETotal cap across the token's lifetimeMiCA EUR 8M asset-referenced token limit
FIXED_PERIODCap resets at the start of each periodQuarterly fundraising caps
ROLLING_PERIODSliding window of last N daysContinuous monitoring (rolling 12-month limits)

Base currency conversion

When useBasePrice is enabled, the module converts token amounts using on-chain price claims before checking against the supply limit. This enables EUR- or USD-denominated caps (e.g., MiCA 8M EUR lifetime limit) on tokens priced in native units.

Key invariants

  • Supply limit applies to minting operations only; transfers and burns are not checked
  • ROLLING_PERIOD uses a sliding window — older mints fall off as time passes
  • FIXED_PERIOD resets at the start of each new period, regardless of previous minting
  • Calling setModuleParameters with maxSupply = 0 reverts; the cap must be a positive value

Operational signals

No events emitted by this module. Monitor for ComplianceCheckFailed revert errors in failed transactions when minting exceeds the configured limit.

Failure modes & edge cases

  • Price feed stale or missing when useBasePrice is enabled — minting reverts until a valid price claim exists
  • ROLLING_PERIOD window boundary — mints near the window edge may succeed or fail depending on when older mints age out

InvestorCount

Restricts the number of unique token holders. The topicFilter determines which investors are counted, not which are blocked.

Interface (capabilities)

CapabilityWho can callInputsOn-chain effectEmitsNotes
setModuleParametersToken admin (via compliance)globalLimit, countryLimits[], topicFilter, global flagStores investor-count configtopicFilter uses the same RPN expression system as identity verification
canTransferCompliance engineSender, recipient, amountChecks if adding recipient would exceed global or country limitSkips burns (to == address(0)); applies to mints and transfers

How it works

Investor stateIdentity module resultInvestorCount resultTransfer outcome
No KYC/AML claimsBlocked by identity moduleN/A (never reaches count check)Transfer blocked
Has qualifying claims, count < limitAllowedCountedTransfer allowed
Has qualifying claims, count = limitAllowedBlocked (over limit)Transfer blocked

topicFilter and limits

The topicFilter is a claim expression (same RPN system as SMARTIdentityVerification) that determines which investors count toward the limit. InvestorCount can enforce a global limit across all investors and per-country limits for jurisdiction-specific restrictions (e.g., max 50 Singapore residents).

Key invariants

  • canTransfer skips burns (to == address(0)) but applies to both mints and transfers
  • The global tracker accumulates regardless of the global flag setting — the flag controls enforcement, not tracking
  • Per-country limits are checked independently of the global limit; both must pass
  • topicFilter determines who is counted, not who is blocked — blocking is handled by identity verification

Operational signals

No events emitted by this module. Monitor for ComplianceCheckFailed revert errors in failed transactions when investor count exceeds limits.

Failure modes & edge cases

  • Investor count may temporarily exceed the limit after forced transfers bypass the check
  • Country code missing from identity registry — investor is not counted toward per-country limits but may still be counted globally

See also

On this page