OraclePriceFacetStorage
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 are set by an Oracle and may vary 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.
InvalidZeroAddress
Thrown when the zero address is provided as input.
OnlyOracleCaller
Thrown when the caller is not the oracle address.
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 oracle address cappable to set the price of a fraction, in terms of funding packets, for a campaign.
_Defines the oracle address as the address that is allowed to set the price of a fraction in an associated campaign.
Emits a {OracleAddressConfigured} event._
Parameters
Name | Type | Description |
---|---|---|
l | struct OraclePriceFacetStorage.Layout | A reference to the Layout struct in storage. |
postFractionPriceData | bytes | The ABI-encoded data containing the following: - oracleAddress : The address of the oracle that will set the price of a fraction in an associated campaign. |
Return Values
Name | Type | Description |
---|---|---|
[0] | address | address The oracle address. |
setPrice
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.
This function is callable only by the oracle address set in setAndCheckPriceFacet()
.
Emits a {CampaignPriceConfigured} event.
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 OraclePriceFacetStorage.Layout | A reference to the Layout struct in storage. |
campaignId | uint256 | The unique identifier of the targeted campaign. |
price | uint256 | The price (in terms of funding packets) required to purchase a single fraction. |
getCurrentPrice
Retrieves the price of a single fraction within a specified campaign.
Parameters
Name | Type | Description |
---|---|---|
l | struct OraclePriceFacetStorage.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 . |