Skip to content
Draft
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
21 changes: 20 additions & 1 deletion Test/daml/OpenCapTable/TestConvertibleCancellation.daml
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,31 @@ testConvertibleCancellation_Create = script do
deletes = []
pure ()

testConvertibleCancellation_PartialWithoutBalanceSecurityFails = script do
TestOcp{issuer, cap_table} <- setupTestOcp
capTableCid <- addDefaultStakeholder issuer cap_table
result <- createConvertibleIssuance issuer capTableCid "SEC-CONVERTIBLE-PARTIAL-NO-BALANCE" 100000.0

submitMustFail issuer do
exerciseCmd result.updatedCapTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateConvertibleCancellation ConvertibleCancellationOcfData with
id = "TX_CONVERTIBLE_CANCEL_PARTIAL_NO_BALANCE"
date = DT.time (DA.date 2022 Nov 03) 0 0 0
security_id = "SEC-CONVERTIBLE-PARTIAL-NO-BALANCE"
amount = OcfMonetary with amount = 40000.0, currency = "USD"
reason_text = "Invalid partial cancellation"
balance_security_id = None
comments = []]
edits = []
deletes = []

testConvertibleCancellation_PartialWithOptionals = script do
TestOcp{system_operator, issuer, ctx, cap_table} <- setupTestOcp
capTableCid <- addDefaultStakeholder issuer cap_table
result <- createConvertibleIssuance issuer capTableCid "SEC-2" 100000.0
balanceResult <- createConvertibleIssuance issuer result.updatedCapTableCid "SEC-CONV-PARTIAL-BAL" 75000.0
_ <- submit issuer do
exerciseCmd result.updatedCapTableCid CT.UpdateCapTable with
exerciseCmd balanceResult.updatedCapTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateConvertibleCancellation ConvertibleCancellationOcfData with
id = "TX_CONV_CANCEL_PARTIAL"
date = DT.time (DA.date 2024 Jun 15) 0 0 0
Expand Down
26 changes: 24 additions & 2 deletions Test/daml/OpenCapTable/TestConvertibleConversion.daml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ createConvertibleIssuance issuer capTableCid securityId amount =
submit issuer do
exerciseCmd capTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateConvertibleIssuance ConvertibleIssuanceOcfData with
id = "TX_CONV_ISS_1"
id = "TX_CONV_ISS_" <> securityId
date = DT.time (DA.date 2023 Mar 15) 0 0 0
security_id = securityId
custom_id = "SAFE-1"
Expand Down Expand Up @@ -112,8 +112,9 @@ testConvertibleConversion_PartialConversion = script do
capTableCid <- addDefaultStakeholder issuer cap_table
let securityId = "CONV-SEC-003"
result <- createConvertibleIssuance issuer capTableCid securityId 500000.0
balanceResult <- createConvertibleIssuance issuer result.updatedCapTableCid "CONV-SEC-003-REMAINDER" 200000.0
_ <- submit issuer do
exerciseCmd result.updatedCapTableCid CT.UpdateCapTable with
exerciseCmd balanceResult.updatedCapTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateConvertibleConversion ConvertibleConversionOcfData with
id = "TX_CONV_CONVERSION_3"
date = DT.time (DA.date 2025 Nov 15) 0 0 0
Expand All @@ -128,3 +129,24 @@ testConvertibleConversion_PartialConversion = script do
edits = []
deletes = []
pure ()

testConvertibleConversion_MissingBalanceSecurityFails = script do
TestOcp{issuer, cap_table} <- setupTestOcp
capTableCid <- addDefaultStakeholder issuer cap_table
let securityId = "CONV-SEC-MISSING-BALANCE"
result <- createConvertibleIssuance issuer capTableCid securityId 500000.0
submitMustFail issuer do
exerciseCmd result.updatedCapTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateConvertibleConversion ConvertibleConversionOcfData with
id = "TX_CONV_CONVERSION_MISSING_BALANCE"
date = DT.time (DA.date 2025 Nov 15) 0 0 0
security_id = securityId
trigger_id = "equity-financing-trigger"
reason_text = "Partial conversion"
resulting_security_ids = ["SSEC-PREFERRED-MISSING-BALANCE"]
comments = []
balance_security_id = Some "CONV-SEC-NOT-FOUND"
capitalization_definition = None
quantity_converted = Some 300000.0]
edits = []
deletes = []
5 changes: 3 additions & 2 deletions Test/daml/OpenCapTable/TestConvertibleTransfer.daml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ createConvertibleIssuance issuer capTableCid securityId amount =
submit issuer do
exerciseCmd capTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateConvertibleIssuance ConvertibleIssuanceOcfData with
id = "TX_CONVERTIBLE_ISS_1"
id = "TX_CONVERTIBLE_ISS_" <> securityId
date = DT.time (DA.date 2024 Mar 01) 0 0 0
security_id = securityId
custom_id = "SAFE-1"
Expand Down Expand Up @@ -64,8 +64,9 @@ testConvertibleTransfer_PartialSAFE = script do
capTableCid <- addDefaultStakeholder issuer cap_table
let securityId = "CSEC-SAFE-PARTIAL"
result <- createConvertibleIssuance issuer capTableCid securityId 500000.0
balanceResult <- createConvertibleIssuance issuer result.updatedCapTableCid "CSEC-SAFE-RETAINED" 300000.0
_ <- submit issuer do
exerciseCmd result.updatedCapTableCid CT.UpdateCapTable with
exerciseCmd balanceResult.updatedCapTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateConvertibleTransfer ConvertibleTransferOcfData with
id = "TX_CONVERTIBLE_TRANSFER_PARTIAL"
date = DT.time (DA.date 2025 Oct 15) 0 0 0
Expand Down
44 changes: 43 additions & 1 deletion Test/daml/OpenCapTable/TestEquityCompensationAcceptance.daml
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@ module OpenCapTable.TestEquityCompensationAcceptance where

import Fairmint.OpenCapTable.OCF.EquityCompensationIssuance
import Fairmint.OpenCapTable.OCF.EquityCompensationAcceptance
import Fairmint.OpenCapTable.OCF.EquityCompensationExercise
import Fairmint.OpenCapTable.OCF.StockClassSplit
import qualified Fairmint.OpenCapTable.CapTable as CT
import Fairmint.OpenCapTable.Types.Monetary (OcfMonetary(..))
import Fairmint.OpenCapTable.Types.Stock (OcfRatio(..))
import Fairmint.OpenCapTable.Types.Vesting (OcfCompensationType(..))
import OpenCapTable.Setup
import OpenCapTable.TestHelpers (addDefaultStakeholder)
import OpenCapTable.TestHelpers (addDefaultStakeholder, addPrerequisites)
import qualified DA.Date as DA
import DA.Date (Month(..))
import qualified DA.Time as DT
Expand Down Expand Up @@ -80,3 +83,42 @@ testEquityCompensationAcceptance_WithComments = script do
edits = []
deletes = []
pure ()

-- A split adjusts both the grant and earlier settlement quantities. Exercising
-- the grant's pre-split quantity therefore leaves an active post-split balance.
testEquityCompensationAcceptance_AfterPartialExerciseAndStockSplit = script do
TestOcp{system_operator, issuer, ctx, cap_table} <- setupTestOcp
capTableCid <- addPrerequisites issuer cap_table
issuanceResult <- createEquityCompensationIssuance issuer capTableCid
splitResult <- submit issuer do
exerciseCmd issuanceResult.updatedCapTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateStockClassSplit StockClassSplitOcfData with
id = "TX_EC_SPLIT_1"
date = DT.time (DA.date 2024 Feb 02) 0 0 0
stock_class_id = "SC_COMMON"
split_ratio = OcfRatio with numerator = 2.0, denominator = 1.0
comments = []]
edits = []
deletes = []
exerciseResult <- submit issuer do
exerciseCmd splitResult.updatedCapTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateEquityCompensationExercise EquityCompensationExerciseOcfData with
id = "TX_EC_EXERCISE_AFTER_SPLIT_1"
date = DT.time (DA.date 2024 Feb 03) 0 0 0
security_id = "SEC-OPTION-1"
quantity = 10000.0
consideration_text = None
resulting_security_ids = ["SEC-STOCK-RESULT-1"]
comments = []]
edits = []
deletes = []
_ <- submit issuer do
exerciseCmd exerciseResult.updatedCapTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateEquityCompensationAcceptance EquityCompensationAcceptanceOcfData with
id = "TX_EC_ACCEPT_AFTER_SPLIT_1"
date = DT.time (DA.date 2024 Feb 04) 0 0 0
security_id = "SEC-OPTION-1"
comments = []]
edits = []
deletes = []
pure ()
49 changes: 46 additions & 3 deletions Test/daml/OpenCapTable/TestEquityCompensationCancellation.daml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
module OpenCapTable.TestEquityCompensationCancellation where
import Fairmint.OpenCapTable.OCF.EquityCompensationIssuance
import Fairmint.OpenCapTable.OCF.EquityCompensationCancellation
import Fairmint.OpenCapTable.OCF.EquityCompensationExercise
import Fairmint.OpenCapTable.Types.Monetary (OcfMonetary(..))
import Fairmint.OpenCapTable.Types.Vesting (OcfCompensationType(..))
import qualified Fairmint.OpenCapTable.CapTable as CT
Expand All @@ -16,7 +17,7 @@ createEquityCompensationIssuance issuer capTableCid securityId quantity =
submit issuer do
exerciseCmd capTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateEquityCompensationIssuance EquityCompensationIssuanceOcfData with
id = "TX_EC_ISS_1"
id = "TX_EC_ISS_" <> securityId
date = DT.time (DA.date 2020 Jan 15) 0 0 0
security_id = securityId
custom_id = "GRANT-001"
Expand Down Expand Up @@ -62,9 +63,50 @@ testEquityCompensationCancellation_CreateAndArchiveByIssuer = script do
capTableCid <- addDefaultStakeholder issuer cap_table
let securityId = "db5a26d6-3912-4400-87b0-bda74de361af"
result <- createEquityCompensationIssuance issuer capTableCid securityId 250000.0
_ <- createEquityCompensationCancellation issuer result.updatedCapTableCid securityId 214200.0
exerciseResult <- submit issuer do
exerciseCmd result.updatedCapTableCid CT.UpdateCapTable with
creates =
[ CT.OcfCreateEquityCompensationExercise EquityCompensationExerciseOcfData with
id = "TX_EC_EXERCISE_BEFORE_CANCEL_1"
date = DT.time (DA.date 2021 Oct 01) 0 0 0
security_id = securityId
quantity = 20000.0
consideration_text = None
resulting_security_ids = ["STOCK-FROM-EC-EXERCISE-1"]
comments = []
, CT.OcfCreateEquityCompensationExercise EquityCompensationExerciseOcfData with
id = "TX_EC_EXERCISE_BEFORE_CANCEL_2"
date = DT.time (DA.date 2021 Nov 01) 0 0 0
security_id = securityId
quantity = 15800.0
consideration_text = None
resulting_security_ids = ["STOCK-FROM-EC-EXERCISE-2"]
comments = []
]
edits = []
deletes = []
_ <- createEquityCompensationCancellation issuer exerciseResult.updatedCapTableCid securityId 214200.0
pure ()

testEquityCompensationCancellation_PartialWithoutBalanceSecurityFails = script do
TestOcp{issuer, cap_table} <- setupTestOcp
capTableCid <- addDefaultStakeholder issuer cap_table
let securityId = "SEC-EC-PARTIAL-NO-BALANCE"
result <- createEquityCompensationIssuance issuer capTableCid securityId 100.0

submitMustFail issuer do
exerciseCmd result.updatedCapTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateEquityCompensationCancellation EquityCompensationCancellationOcfData with
id = "TX_EC_CANCEL_PARTIAL_NO_BALANCE"
date = DT.time (DA.date 2024 Mar 15) 0 0 0
security_id = securityId
quantity = 40.0
reason_text = "Invalid partial cancellation"
balance_security_id = None
comments = []]
edits = []
deletes = []

-- Archive with built-in choice (requires both signatories)
testEquityCompensationCancellation_CreateAndArchiveBuiltIn = script do
TestOcp{system_operator, issuer, ctx, cap_table} <- setupTestOcp
Expand All @@ -91,8 +133,9 @@ testEquityCompensationCancellation_PartialWithOptionals = script do
capTableCid <- addDefaultStakeholder issuer cap_table
let securityId = "SEC-EC-PARTIAL"
result <- createEquityCompensationIssuance issuer capTableCid securityId 500000.0
balanceResult <- createEquityCompensationIssuance issuer result.updatedCapTableCid "SEC-EC-PARTIAL-BAL" 350000.0
_ <- submit issuer do
exerciseCmd result.updatedCapTableCid CT.UpdateCapTable with
exerciseCmd balanceResult.updatedCapTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateEquityCompensationCancellation EquityCompensationCancellationOcfData with
id = "TX_EC_CANCEL_PARTIAL"
date = DT.time (DA.date 2024 Jun 30) 0 0 0
Expand Down
8 changes: 5 additions & 3 deletions Test/daml/OpenCapTable/TestEquityCompensationTransfer.daml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ createEquityCompensationIssuance issuer capTableCid securityId quantity =
submit issuer do
exerciseCmd capTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateEquityCompensationIssuance EquityCompensationIssuanceOcfData with
id = "TX_EQUITY_COMP_ISS_1"
id = "TX_EQUITY_COMP_ISS_" <> securityId
date = DT.time (DA.date 2022 Jan 15) 0 0 0
security_id = securityId
custom_id = "OPT-1"
Expand Down Expand Up @@ -49,8 +49,9 @@ testEquityCompensationTransfer_NSOToFamilyTrust = script do
capTableCid <- addDefaultStakeholder issuer cap_table
let securityId = "ESEC-NSO-001"
result <- createEquityCompensationIssuance issuer capTableCid securityId 10000.0
balanceResult <- createEquityCompensationIssuance issuer result.updatedCapTableCid "ESEC-NSO-REMAIN" 5000.0
_ <- submit issuer do
exerciseCmd result.updatedCapTableCid CT.UpdateCapTable with
exerciseCmd balanceResult.updatedCapTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateEquityCompensationTransfer EquityCompensationTransferOcfData with
id = "TX_EQUITY_COMP_TRANSFER_1"
date = DT.time (DA.date 2025 Jun 01) 0 0 0
Expand Down Expand Up @@ -91,8 +92,9 @@ testEquityCompensationTransfer_WithApprovalComments = script do
capTableCid <- addDefaultStakeholder issuer cap_table
let securityId = "ESEC-NSO-APPROVAL"
result <- createEquityCompensationIssuance issuer capTableCid securityId 15000.0
balanceResult <- createEquityCompensationIssuance issuer result.updatedCapTableCid "ESEC-NSO-REMAINING" 7000.0
_ <- submit issuer do
exerciseCmd result.updatedCapTableCid CT.UpdateCapTable with
exerciseCmd balanceResult.updatedCapTableCid CT.UpdateCapTable with
creates = [CT.OcfCreateEquityCompensationTransfer EquityCompensationTransferOcfData with
id = "TX_EQUITY_COMP_TRANSFER_APPROVED"
date = DT.time (DA.date 2025 Nov 01) 0 0 0
Expand Down
4 changes: 2 additions & 2 deletions Test/daml/OpenCapTable/TestSecurityIdValidation.daml
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ testStockTransfer_CorrectSecurityIdSucceeds = script do
id = "TX_TRANSFER_VALID"
date = DT.time (DA.date 2024 Jan 01) 0 0 0
security_id = "SEC-STOCK-1" -- Correct stock security_id
quantity = 50.0
quantity = 100.0
comments = []
resulting_security_ids = ["NEW-SEC-1"]
balance_security_id = None
Expand All @@ -244,7 +244,7 @@ testWarrantTransfer_CorrectSecurityIdSucceeds = script do
id = "TX_WARRANT_TRANSFER_VALID"
date = DT.time (DA.date 2024 Jan 01) 0 0 0
security_id = "SEC-WR-1" -- Correct warrant security_id
quantity = 25.0
quantity = 100.0
comments = []
resulting_security_ids = ["NEW-WARRANT-1"]
balance_security_id = None
Expand Down
Loading
Loading