Capital Raise Limit
CapitalRaiseLimit module for fiat-denominated gross capital raise caps, fixed or rolling accounting windows, and PriceResolver-backed mint valuation.
The CapitalRaiseLimit module caps the gross fiat value raised through minting during a configured accounting window. DALP converts each minted amount through the installed PriceResolver addon before it checks the cap.
Related compliance references:
Where this module applies
| Concern | CapitalRaiseLimit |
|---|---|
| Minting | Enforces gross raised fiat cap in the active window |
| Transfers | Pass through; transfers do not change the tracker |
| Burns | Pass through; burns do not release capacity |
| Pricing | Converts mint amount through the installed PriceResolver addon |
When to use this module
Use capital-raise-limit when a token needs a periodic fundraising cap expressed in fiat value instead of token units. The module measures gross capital raised through issuance in a fixed or rolling window.
It is not:
- A token-unit issuance quota. Use Issuance volume limit.
- An absolute outstanding-supply cap. Use Supply cap.
- A net-outstanding-value control; burns do not release capacity.
Configuration
struct RaiseLimitConfig {
uint256 maxSupply; // Maximum gross raised fiat in the window, normalized to 18 decimals.
uint256 periodLength; // Window length in days. Must be 1..730.
bool rolling; // true = rolling window, false = fixed window.
address priceResolver; // Injected by dapi from the installed PriceResolver addon.
uint256 priceTopicId; // Injected by dapi; defaults to keccak256("basePrice").
}| Field | Client supplied? | Mutable after install? | Notes |
|---|---|---|---|
maxSupply | Yes | No | Maximum gross raised fiat in the window, stored as 18-decimal fiat. |
periodLength | Yes | No | Window length in days. The module rejects 0 and values above 730. |
rolling | Yes | No | Chooses rolling-window or fixed-window accounting. |
priceResolver | No | No | Resolved and injected by the DALP API from the indexed PriceResolver addon. |
priceTopicId | No | No | Resolved and injected by the DALP API, defaulting to the basePrice topic. |
Installed configuration is immutable. The dapp disables the form once the module is enabled and shows a notice that a different configuration requires deploying a new module instance.
PriceResolver prerequisite
capital-raise-limit requires a PriceResolver addon on the same system. The dapp checks the addon factory list for typeId: "price-resolver" and shows a warning only when the lookup succeeds and confirms the addon is missing.
Clients do not provide a resolver address. During current compliance install flows, the DALP API resolves the PriceResolver addon address for the token's system. It then merges the address into the compliance parameters and injects the default price topic ID keccak256("basePrice") before ABI encoding.
If the DALP API cannot find a PriceResolver addon for the system, the install request fails with TOKEN_COMPLIANCE_PRICE_RESOLVER_ADDON_NOT_INSTALLED (DALP-0474). The error maps to HTTP 409 (CONFLICT) and gives SDK and frontend clients a stable typed error to branch on. This prevents deployment with an absent resolver. The contract also rejects zero priceResolver and zero priceTopicId during config validation.
Accounting
The module enforces only on mints (from == address(0)). For each mint, it calls PriceResolver.getBasePrice(token, priceTopicId) and converts the raw token amount into 18-decimal fiat using the token decimals. The mint is allowed only when the active-window gross total plus the new fiat amount stays within maxSupply.
| Mode | Tracker | Rollover behavior |
|---|---|---|
| Fixed | Single current-period total with periodStart. | When the period elapses, the current raised fiat reads as 0; the next mint starts a fresh period. |
| Rolling | 730-slot circular daily buffer keyed by day, summed over the configured window. | Daily slots age out as time advances. |
Burns and regular transfers do not change the raised-fiat tracker. A burn therefore cannot make room for additional issuance in the same window.
Failure behavior
The module fails closed when pricing is not usable. A mint check fails if the resolver address is zero, if the resolver returns a zero or negative price, or if the resolver call itself reverts. A mint that would exceed the configured raise cap reverts with the module's raise-limit compliance reason.
Supply & Investor Limits
TokenSupplyLimit and InvestorCount modules — time-based and rolling supply caps with currency conversion, and unique holder limits with per-country granularity.
Issuance Volume Limit
IssuanceVolumeLimit module for periodic token-unit issuance quotas, newest-first burn attribution, and period-mode immutability.