StablePriceFacetStorage
This library manages the storage and logic for the configuration of fraction pricing in terms of funding packets (a.k.a input packets) within fractionalization campaigns.
_This implementation is designed for use in campaigns where the price of fractions remains stable throughout the campaign lifecycle. Each campaign is configured separately.
IMPORTANT:
- Extra care should be taken when setting the price of a fraction in a campaign (see
setAndCheckPriceFacet()
) as it is closely tied to the configuration of the campaign's funding packet (see FundingPackets facets)._
InvalidPriceZero
Thrown when attempting to set price as zero.
STORAGE_SLOT
Unique identifier for the storage slot where the Layout struct is stored. Derived from the ERC7201 formula. STORAGE_SLOT: TO_DO
Layout
layout
Retrieves a reference to the Layout struct stored at a specified storage slot
setAndCheckPriceFacet
Sets the price of a fraction, in terms of funding packets, for a campaign.
_Defines the price as the number of funding packets required to purchase a single fraction in an associated campaign.
IMPORTANT:
There are two ways to configure price
and funding packets at the API level, depending on
the decimal precision of tokens in the campaign's funding packet:
-
Uniform Decimal Precision (All funding tokens have the same decimal precision—no mixed ERCs allowed):
- Either:
- Set the funding packet's
tokenAmount
values (seeFundingPackets Facets
) in whole units (e.g.,2 wei
). - Set
price
scaled by the token’s decimal precision (e.g., for 6 decimals,price = 10 * 10^6
).
- Set the funding packet's
- Or:
- Set
tokenAmount
values already scaled by the decimal precision (e.g.,2 * 10^6
). - Set
price
in whole units (e.g.,price = 10
).
- Set
- Either:
-
Mixed Decimal Precision (Funding tokens have different decimal precision-mixed ERCs allowed):
- The
tokenAmount
values in the funding packet must always be scaled to the respective decimal precision. - The
price
must be set in whole units.
- The
Discount & Interest Mechanisms:
-
If discount & interest mechanisms are configured, the
tokenAmount(s)
of funding packet must be defined in whole units (e.g.,2 wei
), andprice
must always be scaled according to the funding token decimal precision (e.g., for 6 decimals,price = 10 * 10^6
). This requirement should be enforced at the API level and within front-end applications. -
To prevent truncation,
price
should be scaled by at least 1e6, considering that percentages are 1e6 scaled. -
This ensures that percentage-based discount & interest mechanisms (e.g.,
BurnFungibleForDiscount
) can correctly compute discounted and interest-adjusted prices without truncation. Percentages are based on10^6
, meaning10^6 == 100%
.
Example:
- If the campaign's funding packet has been configured (see
FundingPackets Facets
) as 2 wei of $TOKEN (suppose $TOKEN has 18 decimals), andprice == 1 * 10^18
, then to purchase a single fraction, investors will need to provide 10^18 funding packets which corresponds to 2 $TOKEN per fraction (2 wei * 10^18 == 2 * 10^18)._
Parameters
Name | Type | Description |
---|---|---|
l | struct StablePriceFacetStorage.Layout | A reference to the Layout struct in storage. |
postFractionPriceData | bytes | The ABI-encoded data containing the following: - price : The price (in terms of funding packets) required to purchase a single fraction. |
Return Values
Name | Type | Description |
---|---|---|
[0] | uint256 | uint256 The ID of the campaign for which the price is configured. |
[1] | uint256 | uint256 The price set. |
getCurrentPrice
Retrieves the price of a single fraction within a specified campaign.
Parameters
Name | Type | Description |
---|---|---|
l | struct StablePriceFacetStorage.Layout | A reference to the Layout struct in storage. |
campaignId | uint256 | The unique identifier of the targeted campaign. |
Return Values
Name | Type | Description |
---|---|---|
[0] | uint256 | uint256 The amount of funding packets required to purchase a single fraction in campaignId . |