SettleMint
ArchitectureSecurityCompliance Modules

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

ConcernCapitalRaiseLimit
MintingEnforces gross raised fiat cap in the active window
TransfersPass through; transfers do not change the tracker
BurnsPass through; burns do not release capacity
PricingConverts 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").
}
FieldClient supplied?Mutable after install?Notes
maxSupplyYesNoMaximum gross raised fiat in the window, stored as 18-decimal fiat.
periodLengthYesNoWindow length in days. The module rejects 0 and values above 730.
rollingYesNoChooses rolling-window or fixed-window accounting.
priceResolverNoNoResolved and injected by the DALP API from the indexed PriceResolver addon.
priceTopicIdNoNoResolved 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.

ModeTrackerRollover behavior
FixedSingle current-period total with periodStart.When the period elapses, the current raised fiat reads as 0; the next mint starts a fresh period.
Rolling730-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.

On this page