Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 39 additions & 33 deletions Test/daml/OpenCapTable/TestConversionMechanisms.daml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import Fairmint.OpenCapTable.Types.Monetary (OcfMonetary(..))
import Fairmint.OpenCapTable.Types.Stock (OcfInitialSharesAuthorized(..), OcfQuantitySourceType(..), OcfRatio(..), OcfStockClassType(..))
import OpenCapTable.HelpersTriggers (ocfTriggerElectiveAtWill)
import OpenCapTable.Setup
import OpenCapTable.TestHelpers (addDefaultStakeholder)
import OpenCapTable.TestHelpers (addDefaultStakeholder, defaultStockClass)

testTime : Time
testTime = DT.time (DA.date 2024 Jan 1) 0 0 0
Expand Down Expand Up @@ -392,22 +392,25 @@ testConversionMechanismRights_AllValidVariantsCreate = script do
capTableCid <- addDefaultStakeholder issuer cap_table
result1 <- submit issuer do
exerciseCmd capTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateStockClass StockClassOcfData with
id = "SC_PREFERRED_ALL_CONVERSION_MECHANISMS"
name = "Preferred All Conversion Mechanisms"
class_type = OcfStockClassTypePreferred
default_id_prefix = "PAM-"
initial_shares_authorized = OcfInitialSharesNumeric 1_000_000.0
votes_per_share = 1.0
seniority = 2.0
board_approval_date = None
stockholder_approval_date = None
par_value = None
price_per_share = None
liquidation_preference_multiple = None
participation_cap_multiple = None
conversion_rights = validStockClassRights
comments = []]
creates =
[ CT.OcfCreateStockClass (defaultStockClass "SC_COMMON")
, CT.OcfCreateStockClass (StockClassOcfData with
id = "SC_PREFERRED_ALL_CONVERSION_MECHANISMS"
name = "Preferred All Conversion Mechanisms"
class_type = OcfStockClassTypePreferred
default_id_prefix = "PAM-"
initial_shares_authorized = OcfInitialSharesNumeric 1_000_000.0
votes_per_share = 1.0
seniority = 2.0
board_approval_date = None
stockholder_approval_date = None
par_value = None
price_per_share = None
liquidation_preference_multiple = None
participation_cap_multiple = None
conversion_rights = validStockClassRights
comments = [])
]
edits = []
deletes = []
result2 <- submit issuer do
Expand Down Expand Up @@ -460,22 +463,25 @@ testConversionMechanismRights_InvalidVariantsReject = script do
capTableCid <- addDefaultStakeholder issuer cap_table
stockControl <- submit issuer do
exerciseCmd capTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateStockClass StockClassOcfData with
id = "SC_VALID_CONVERSION_MECHANISM_CONTROL"
name = "Valid Conversion Mechanism Control"
class_type = OcfStockClassTypePreferred
default_id_prefix = "VCM-"
initial_shares_authorized = OcfInitialSharesNumeric 1_000_000.0
votes_per_share = 1.0
seniority = 2.0
board_approval_date = None
stockholder_approval_date = None
par_value = None
price_per_share = None
liquidation_preference_multiple = None
participation_cap_multiple = None
conversion_rights = [stockClassRightWith OcfConversionMechanismRatioConversion None None (Some validRatio) None None None None None]
comments = []]
creates =
[ CT.OcfCreateStockClass (defaultStockClass "SC_COMMON")
, CT.OcfCreateStockClass (StockClassOcfData with
id = "SC_VALID_CONVERSION_MECHANISM_CONTROL"
name = "Valid Conversion Mechanism Control"
class_type = OcfStockClassTypePreferred
default_id_prefix = "VCM-"
initial_shares_authorized = OcfInitialSharesNumeric 1_000_000.0
votes_per_share = 1.0
seniority = 2.0
board_approval_date = None
stockholder_approval_date = None
par_value = None
price_per_share = None
liquidation_preference_multiple = None
participation_cap_multiple = None
conversion_rights = [stockClassRightWith OcfConversionMechanismRatioConversion None None (Some validRatio) None None None None None]
comments = [])
]
edits = []
deletes = []
submitMustFail issuer do
Expand Down
140 changes: 76 additions & 64 deletions Test/daml/OpenCapTable/TestStockClass.daml
Original file line number Diff line number Diff line change
Expand Up @@ -11,25 +11,28 @@ import qualified DA.Date as DA
import DA.Date (Month(..))
import qualified DA.Time as DT

commonStockClassData : StockClassOcfData
commonStockClassData = StockClassOcfData with
id = "SC_COMMON"
name = "Common"
class_type = OcfStockClassTypeCommon
default_id_prefix = "CS-"
initial_shares_authorized = OcfInitialSharesNumeric 1_000_000.0
votes_per_share = 1.0
seniority = 1.0
board_approval_date = None
stockholder_approval_date = None
par_value = None
price_per_share = None
liquidation_preference_multiple = None
participation_cap_multiple = None
conversion_rights = []
comments = []

createStockClass issuer capTableCid =
submit issuer do
exerciseCmd capTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateStockClass StockClassOcfData with
id = "SC_COMMON"
name = "Common"
class_type = OcfStockClassTypeCommon
default_id_prefix = "CS-"
initial_shares_authorized = OcfInitialSharesNumeric 1_000_000.0
votes_per_share = 1.0
seniority = 1.0
board_approval_date = None
stockholder_approval_date = None
par_value = None
price_per_share = None
liquidation_preference_multiple = None
participation_cap_multiple = None
conversion_rights = []
comments = []]
creates = [CT.OcfCreateStockClass commonStockClassData]
edits = []
deletes = []

Expand Down Expand Up @@ -65,22 +68,25 @@ testCreateStockClass_OptionalsSome = script do
valuation_cap = None
_ <- submit issuer do
exerciseCmd cap_table CT.UpdateCapTable with
creates = [CT.OcfCreateStockClass StockClassOcfData with
id = "SC_PREFERRED"
name = "Preferred"
class_type = OcfStockClassTypePreferred
default_id_prefix = "PS-"
initial_shares_authorized = OcfInitialSharesNumeric 2_000_000.0
votes_per_share = 1.0
seniority = 2.0
board_approval_date = Some (DT.time (DA.date 2024 Jan 1) 0 0 0)
stockholder_approval_date = Some (DT.time (DA.date 2024 Jan 15) 0 0 0)
par_value = Some (OcfMonetary with amount = 0.0001, currency = "USD")
price_per_share = Some (OcfMonetary with amount = 1.0, currency = "USD")
liquidation_preference_multiple = Some 1.0
participation_cap_multiple = None
conversion_rights = [ convRight ]
comments = ["Preferred terms"]]
creates =
[ CT.OcfCreateStockClass commonStockClassData
, CT.OcfCreateStockClass (StockClassOcfData with
id = "SC_PREFERRED"
name = "Preferred"
class_type = OcfStockClassTypePreferred
default_id_prefix = "PS-"
initial_shares_authorized = OcfInitialSharesNumeric 2_000_000.0
votes_per_share = 1.0
seniority = 2.0
board_approval_date = Some (DT.time (DA.date 2024 Jan 1) 0 0 0)
stockholder_approval_date = Some (DT.time (DA.date 2024 Jan 15) 0 0 0)
par_value = Some (OcfMonetary with amount = 0.0001, currency = "USD")
price_per_share = Some (OcfMonetary with amount = 1.0, currency = "USD")
liquidation_preference_multiple = Some 1.0
participation_cap_multiple = None
conversion_rights = [ convRight ]
comments = ["Preferred terms"])
]
edits = []
deletes = []
pure ()
Expand All @@ -107,22 +113,25 @@ testCreateStockClass_PpsBasedConversion = script do
valuation_cap = None
_ <- submit issuer do
exerciseCmd cap_table CT.UpdateCapTable with
creates = [CT.OcfCreateStockClass StockClassOcfData with
id = "SC_PREFERRED_PPS"
name = "Preferred PPS"
class_type = OcfStockClassTypePreferred
default_id_prefix = "PP-"
initial_shares_authorized = OcfInitialSharesNumeric 1_000_000.0
votes_per_share = 1.0
seniority = 2.0
board_approval_date = None
stockholder_approval_date = None
par_value = None
price_per_share = None
liquidation_preference_multiple = None
participation_cap_multiple = None
conversion_rights = [ convRight ]
comments = []]
creates =
[ CT.OcfCreateStockClass commonStockClassData
, CT.OcfCreateStockClass (StockClassOcfData with
id = "SC_PREFERRED_PPS"
name = "Preferred PPS"
class_type = OcfStockClassTypePreferred
default_id_prefix = "PP-"
initial_shares_authorized = OcfInitialSharesNumeric 1_000_000.0
votes_per_share = 1.0
seniority = 2.0
board_approval_date = None
stockholder_approval_date = None
par_value = None
price_per_share = None
liquidation_preference_multiple = None
participation_cap_multiple = None
conversion_rights = [ convRight ]
comments = [])
]
edits = []
deletes = []
pure ()
Expand All @@ -148,22 +157,25 @@ testCreateStockClass_PpsBasedConversionFailsWithoutReferencePrice = script do
valuation_cap = None
submitMustFail issuer do
exerciseCmd cap_table CT.UpdateCapTable with
creates = [CT.OcfCreateStockClass StockClassOcfData with
id = "SC_PREFERRED_PPS_FAIL"
name = "Preferred PPS Fail"
class_type = OcfStockClassTypePreferred
default_id_prefix = "PF-"
initial_shares_authorized = OcfInitialSharesNumeric 1_000_000.0
votes_per_share = 1.0
seniority = 2.0
board_approval_date = None
stockholder_approval_date = None
par_value = None
price_per_share = None
liquidation_preference_multiple = None
participation_cap_multiple = None
conversion_rights = [ convRight ]
comments = []]
creates =
[ CT.OcfCreateStockClass commonStockClassData
, CT.OcfCreateStockClass (StockClassOcfData with
id = "SC_PREFERRED_PPS_FAIL"
name = "Preferred PPS Fail"
class_type = OcfStockClassTypePreferred
default_id_prefix = "PF-"
initial_shares_authorized = OcfInitialSharesNumeric 1_000_000.0
votes_per_share = 1.0
seniority = 2.0
board_approval_date = None
stockholder_approval_date = None
par_value = None
price_per_share = None
liquidation_preference_multiple = None
participation_cap_multiple = None
conversion_rights = [ convRight ]
comments = [])
]
edits = []
deletes = []
pure ()
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
module OpenCapTable.TestStockClassConversionRightReferences where

import Fairmint.OpenCapTable.OCF.StockClass
import Fairmint.OpenCapTable.Types.Conversion
import Fairmint.OpenCapTable.Types.Stock
import qualified Fairmint.OpenCapTable.CapTable as CT
import OpenCapTable.HelpersTriggers (ocfTriggerElectiveAtWill)
import OpenCapTable.Setup
import OpenCapTable.TestHelpers
import Daml.Script

stockClassConversionRightTo : Text -> OcfStockClassConversionRight
stockClassConversionRightTo stockClassId = OcfStockClassConversionRight with
ceiling_price_per_share = None
conversion_mechanism = OcfConversionMechanismRatioConversion
conversion_price = None
conversion_trigger = ocfTriggerElectiveAtWill
converts_to_future_round = None
converts_to_stock_class_id = stockClassId
custom_description = None
discount_rate = None
expires_at = None
floor_price_per_share = None
percent_of_capitalization = None
ratio = Some (OcfRatio with numerator = 1.0, denominator = 1.0)
reference_share_price = None
reference_valuation_price_per_share = None
type_ = "STOCK_CLASS_CONVERSION_RIGHT"
valuation_cap = None

preferredStockClassWithConversionRight : Text -> Text -> StockClassOcfData
preferredStockClassWithConversionRight stockClassId targetStockClassId =
(defaultStockClass stockClassId) with
name = "Preferred Stock"
class_type = OcfStockClassTypePreferred
default_id_prefix = "PS-"
seniority = 2.0
conversion_rights = [stockClassConversionRightTo targetStockClassId]

testStockClassConversionRightTargetCreatedInSameBatchSucceeds = script do
TestOcp{issuer, cap_table} <- setupTestOcp

_ <- submit issuer do
exerciseCmd cap_table CT.UpdateCapTable with
creates =
[ CT.OcfCreateStockClass (preferredStockClassWithConversionRight "SC_PREFERRED_CONVERTS" "SC_COMMON_TARGET")
, CT.OcfCreateStockClass (defaultStockClass "SC_COMMON_TARGET")
]
edits = []
deletes = []
pure ()

testStockClassConversionRightMissingTargetFails = script do
TestOcp{issuer, cap_table} <- setupTestOcp

submitMustFail issuer do
exerciseCmd cap_table CT.UpdateCapTable with
creates = [CT.OcfCreateStockClass (preferredStockClassWithConversionRight "SC_PREFERRED_MISSING_TARGET" "SC_MISSING_TARGET")]
edits = []
deletes = []

testStockClassConversionRightEditMissingTargetFails = script do
TestOcp{issuer, cap_table} <- setupTestOcp
result <- submit issuer do
exerciseCmd cap_table CT.UpdateCapTable with
creates = [CT.OcfCreateStockClass (defaultStockClass "SC_PREFERRED_EDIT_TARGET")]
edits = []
deletes = []

submitMustFail issuer do
exerciseCmd result.updatedCapTableCid CT.UpdateCapTable with
creates = []
edits = [CT.OcfEditStockClass (preferredStockClassWithConversionRight "SC_PREFERRED_EDIT_TARGET" "SC_MISSING_EDIT_TARGET")]
deletes = []

testStockClassConversionRightTargetDeleteCannotLeaveDanglingReference = script do
TestOcp{issuer, cap_table} <- setupTestOcp
result <- submit issuer do
exerciseCmd cap_table CT.UpdateCapTable with
creates =
[ CT.OcfCreateStockClass (preferredStockClassWithConversionRight "SC_PREFERRED_DANGLING_TARGET" "SC_COMMON_DELETE_TARGET")
, CT.OcfCreateStockClass (defaultStockClass "SC_COMMON_DELETE_TARGET")
]
edits = []
deletes = []

submitMustFail issuer do
exerciseCmd result.updatedCapTableCid CT.UpdateCapTable with
creates = []
edits = []
deletes = [CT.OcfDeleteStockClass "SC_COMMON_DELETE_TARGET"]
4 changes: 2 additions & 2 deletions dars/OpenCapTable-v34/0.0.2/OpenCapTable-v34.dar
Git LFS file not shown
4 changes: 2 additions & 2 deletions dars/dars.lock
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
]
},
"OpenCapTable-v34/0.0.2/OpenCapTable-v34.dar": {
"sha256": "5b3a2b94ae2958fd9bd75e7f3c7c8acbd2f2554e407a01111aae6224a9f06b07",
"size": 2496888,
"sha256": "734c726d6e7f12379e46981fb2299a35e30339765be4952a7b5684a27b98f35d",
"size": 2498339,
"sdkVersion": "3.4.10",
"uploadedAt": "2026-07-07T21:50:59.634Z",
"networks": []
Expand Down
Loading
Loading