Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
87737fa
Enforce stock plan reserved share ceilings
HardlyDifficult Jul 9, 2026
852f2b0
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity' i…
HardlyDifficult Jul 9, 2026
b7debe1
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity' i…
HardlyDifficult Jul 9, 2026
4cb7f2c
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity' i…
HardlyDifficult Jul 9, 2026
283256c
Restack stock plan ceiling on reference integrity
HardlyDifficult Jul 9, 2026
7c3ed35
Restack stock plan ceiling on indexed share ceilings
HardlyDifficult Jul 9, 2026
ecd2422
Optimize stock plan pool ceiling validation indexes
Copilot Jul 9, 2026
73ad3fc
Refine map aggregation helpers for stock plan checks
Copilot Jul 9, 2026
5fa7204
Simplify stock plan net allocation map merging
Copilot Jul 9, 2026
9fb27ae
Polish stock plan allocation variable naming
Copilot Jul 9, 2026
12e7a41
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity' i…
HardlyDifficult Jul 9, 2026
43c394f
Restack stock plan ceiling on reference fixes
HardlyDifficult Jul 9, 2026
318ce32
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity' i…
HardlyDifficult Jul 9, 2026
771f7b8
Refresh stock plan DAR after reference restack
HardlyDifficult Jul 9, 2026
e64b2f4
Enforce unique security arrays
HardlyDifficult Jul 9, 2026
f4b9bf2
Enforce document location oneOf
HardlyDifficult Jul 9, 2026
dac0764
Enforce stock class ratio conversion rights
HardlyDifficult Jul 9, 2026
1a7bb5b
Enforce convertible conversion mechanism domain
HardlyDifficult Jul 9, 2026
e7291bd
Document unsupported convertible mechanisms
HardlyDifficult Jul 9, 2026
633c147
Enforce PPS discount oneOf
HardlyDifficult Jul 9, 2026
440b3ac
Enforce valuation conversion oneOf
HardlyDifficult Jul 9, 2026
c21a636
Merge reference integrity base into stock plan ceiling
HardlyDifficult Jul 9, 2026
6fd314b
Merge stock plan ceiling base into unique security arrays
HardlyDifficult Jul 9, 2026
fb77a30
Merge unique security arrays base into document location oneOf
HardlyDifficult Jul 9, 2026
721947f
Merge document oneOf base into stock class ratio conversion rights
HardlyDifficult Jul 9, 2026
6b530f6
Merge stock class ratio base into convertible mechanism domain
HardlyDifficult Jul 9, 2026
e9a90b5
Merge convertible mechanism base into PPS discount oneOf
HardlyDifficult Jul 9, 2026
7956e47
Merge PPS discount base into valuation oneOf
HardlyDifficult Jul 9, 2026
a48f2e0
Enforce conversion trigger variant fields
HardlyDifficult Jul 9, 2026
d45f3a1
Enforce currency code pattern
HardlyDifficult Jul 9, 2026
031377a
Enforce OCF phone number pattern
HardlyDifficult Jul 9, 2026
245e68e
Enforce OCF country subdivision codes
HardlyDifficult Jul 9, 2026
1a071c4
Enforce stock issuance share number ranges
HardlyDifficult Jul 9, 2026
cb9f372
Merge reference integrity category into schema constraints
HardlyDifficult Jul 9, 2026
c925f25
Address schema constraint review edge cases
HardlyDifficult Jul 9, 2026
eb33805
Address schema constraint review comments
HardlyDifficult Jul 9, 2026
cc66765
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity-ca…
HardlyDifficult Jul 9, 2026
540664d
Address schema constraints review feedback
HardlyDifficult Jul 9, 2026
3520434
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity-ca…
HardlyDifficult Jul 9, 2026
707c798
Update schema constraints DAR backup
HardlyDifficult Jul 9, 2026
6bb45d5
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity-ca…
HardlyDifficult Jul 9, 2026
28728c5
Handle inactive stock share number ranges
HardlyDifficult Jul 9, 2026
abaec64
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity-ca…
HardlyDifficult Jul 9, 2026
9b06f8f
Refresh schema constraints DAR after ceiling update
HardlyDifficult Jul 9, 2026
7832814
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity-ca…
HardlyDifficult Jul 9, 2026
ca1c6c9
Address schema constraint review feedback
HardlyDifficult Jul 9, 2026
0435ab7
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity-ca…
HardlyDifficult Jul 9, 2026
cd3581a
Refresh schema constraints after reference update
HardlyDifficult Jul 9, 2026
bb5b091
Address schema constraint review feedback
HardlyDifficult Jul 9, 2026
21a3641
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity-ca…
HardlyDifficult Jul 9, 2026
ad7e87b
Refresh schema constraints after reference fix
HardlyDifficult Jul 9, 2026
7e10a9b
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity-ca…
HardlyDifficult Jul 9, 2026
13c6027
Refresh schema constraints DAR after reference fold
HardlyDifficult Jul 9, 2026
cfdd6fb
Address conversion schema review feedback
HardlyDifficult Jul 9, 2026
451a53b
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity-ca…
HardlyDifficult Jul 9, 2026
09492e0
Refresh schema constraints DAR after reference updates
HardlyDifficult Jul 9, 2026
aaaf885
Align conversion validation with OCF schemas
HardlyDifficult Jul 9, 2026
36f4c75
fix: preserve numbered share lineage
HardlyDifficult Jul 10, 2026
066c649
fix: align conversion schema edge cases
HardlyDifficult Jul 10, 2026
2b4b22d
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity-ca…
HardlyDifficult Jul 10, 2026
104fb4e
fix: handle terminal share number events
HardlyDifficult Jul 10, 2026
25ba406
Merge branch 'codex/ocf-reference-integrity-category' into codex/ocf-…
HardlyDifficult Jul 10, 2026
8568030
Merge branch 'codex/ocf-reference-integrity-category' into codex/ocf-…
HardlyDifficult Jul 10, 2026
e63e9ac
chore: refresh schema constraints DAR
HardlyDifficult Jul 10, 2026
dbcea4d
fix: preserve balance share-number lineage
HardlyDifficult Jul 10, 2026
becb908
fix: preserve canonical conversion and share lineage
HardlyDifficult Jul 10, 2026
178798c
chore: refresh schema constraints DAR
HardlyDifficult Jul 10, 2026
323c207
Merge branch 'codex/ocf-reference-integrity-category' into codex/ocf-…
HardlyDifficult Jul 10, 2026
c9fa379
Merge commit '48ee919' into codex/ocf-schema-constraints-category
HardlyDifficult Jul 10, 2026
f183dec
test: align ceiling fixtures with schema constraints
HardlyDifficult Jul 10, 2026
234891a
Merge commit '67fe05a' into codex/ocf-schema-constraints-category
HardlyDifficult Jul 10, 2026
9b78ffb
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity-ca…
HardlyDifficult Jul 10, 2026
e724cdf
fix: match OCF result array cardinality
HardlyDifficult Jul 10, 2026
f753c55
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity-ca…
HardlyDifficult Jul 11, 2026
e3320f4
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity-ca…
HardlyDifficult Jul 11, 2026
c70d96f
chore: refresh deterministic schema constraints DAR
HardlyDifficult Jul 11, 2026
6f6f0a4
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity-ca…
HardlyDifficult Jul 11, 2026
1e3105a
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity-ca…
HardlyDifficult Jul 11, 2026
01d8cc5
fix: preserve successor share number lineage
HardlyDifficult Jul 11, 2026
76ec07c
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity-ca…
HardlyDifficult Jul 11, 2026
39d9d29
fix: align ceiling tests with schema constraints
HardlyDifficult Jul 11, 2026
2dd0751
Merge remote-tracking branch 'origin/codex/ocf-reference-integrity-ca…
HardlyDifficult Jul 11, 2026
5384e42
chore: refresh schema constraints DAR after parent fix
HardlyDifficult Jul 11, 2026
b283bd8
fix: reject duplicate successor security ids
HardlyDifficult Jul 11, 2026
e387336
fix: preserve conversion result cardinality
HardlyDifficult Jul 11, 2026
66c1b9b
fix: preserve stock lifecycle continuity
HardlyDifficult Jul 11, 2026
e9c512b
fix: validate optional monetary issuance fields
HardlyDifficult Jul 11, 2026
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
2 changes: 1 addition & 1 deletion OpenCapTable-v34/daml.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
sdk-version: 3.4.10
name: OpenCapTable-v34
source: daml
version: 0.0.6
version: 0.0.11
build-options:
- -Wno-crypto-text-is-alpha
- --typecheck-upgrades=no
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module Fairmint.OpenCapTable.OCF.ConvertibleConversion where
-- OCF: https://raw.githubusercontent.com/Open-Cap-Table-Coalition/Open-Cap-Format-OCF/main/schema/objects/transactions/conversion/ConvertibleConversion.schema.json

import Fairmint.OpenCapTable.Types.Core (Context)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray, validateUniqueStringsArray)
import Fairmint.OpenCapTable.Types.Conversion (OcfCapitalizationDefinition, validateOcfCapitalizationDefinition)
import Fairmint.Shared.TypeHelpers (validateOptionalText, validateOptionalDecimal)

Expand Down Expand Up @@ -75,4 +75,4 @@ validateConvertibleConversionOcfData d =
-- Arrays element validation (resulting_security_ids required per Conversion base schema)
validateNonEmptyStringsArray d.comments &&
validateNonEmptyStringsArray d.resulting_security_ids &&
not (null d.resulting_security_ids)
validateUniqueStringsArray d.resulting_security_ids
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import Fairmint.OpenCapTable.Types.Core (Context)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray)
import Fairmint.OpenCapTable.Types.Monetary (OcfMonetary, validateOcfMonetary)
import Fairmint.OpenCapTable.Types.Stock (OcfSecurityExemption, validateOcfSecurityExemption)
import Fairmint.OpenCapTable.Types.Conversion (OcfConvertibleType, OcfConversionTriggerType(..), OcfConvertibleConversionRight(..), validateOcfConvertibleConversionRight)
import Fairmint.OpenCapTable.Types.Conversion (OcfConvertibleType, OcfConversionTriggerType(..), OcfConvertibleConversionRight(..), validateOcfConvertibleConversionRight, validateOcfConversionTriggerFields)
import Fairmint.Shared.TypeHelpers (validateOptionalText)


Expand Down Expand Up @@ -124,17 +124,8 @@ data OcfConvertibleConversionTrigger = OcfConvertibleConversionTrigger

validateOcfConvertibleConversionTrigger : OcfConvertibleConversionTrigger -> Bool
validateOcfConvertibleConversionTrigger t =
let hasDate = case t.trigger_date of Some _ -> True; None -> False
hasCond = case t.trigger_condition of Some c -> c /= ""; None -> False
in t.trigger_id /= "" &&
t.trigger_id /= "" &&
validateOptionalText t.nickname &&
validateOptionalText t.trigger_description &&
validateOptionalText t.trigger_condition &&
validateOcfConvertibleConversionRight t.conversion_right &&
case t.type_ of
OcfTriggerTypeTypeAutomaticOnDate -> hasDate
OcfTriggerTypeTypeAutomaticOnCondition -> hasCond
OcfTriggerTypeTypeElectiveOnCondition -> hasCond
OcfTriggerTypeTypeElectiveInRange -> True
OcfTriggerTypeTypeElectiveAtWill -> True
OcfTriggerTypeTypeUnspecified -> True
validateOcfConversionTriggerFields t.type_ t.start_date t.end_date t.trigger_condition t.trigger_date
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module Fairmint.OpenCapTable.OCF.ConvertibleTransfer where
-- OCF: https://raw.githubusercontent.com/Open-Cap-Table-Coalition/Open-Cap-Format-OCF/main/schema/objects/transactions/transfer/ConvertibleTransfer.schema.json

import Fairmint.OpenCapTable.Types.Core (Context)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray, validateNonEmptyUniqueStringsArray)
import Fairmint.OpenCapTable.Types.Monetary (OcfMonetary, validateOcfMonetary)
import Fairmint.Shared.TypeHelpers (validateOptionalText)

Expand Down Expand Up @@ -64,9 +64,7 @@ validateConvertibleTransferOcfData d =
-- Consistent with: StockTransfer (quantity > 0), WarrantTransfer (quantity > 0),
-- EquityCompensationTransfer (quantity > 0), and ConvertibleCancellation (amount > 0)
d.amount.amount > 0.0 &&
not (null d.resulting_security_ids) &&
validateNonEmptyStringsArray d.resulting_security_ids &&
validateNonEmptyUniqueStringsArray d.resulting_security_ids &&
validateNonEmptyStringsArray d.comments &&
validateOptionalText d.balance_security_id &&
validateOptionalText d.consideration_text

9 changes: 4 additions & 5 deletions OpenCapTable-v34/daml/Fairmint/OpenCapTable/OCF/Document.daml
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,10 @@ validateOcfDocument d =
validateOcfMd5 d.md5 &&
validateOptionalText d.path &&
validateOptionalText d.uri &&
((case (d.path, d.uri) of
(Some _, _) -> True
(_, Some _) -> True
_ -> False)) &&
(case (d.path, d.uri) of
(Some _, None) -> True
(None, Some _) -> True
_ -> False) &&
validateNonEmptyStringsArray d.comments &&
all validateOcfObjectReference d.related_objects

Expand Down Expand Up @@ -95,4 +95,3 @@ data OcfObjectType =
| OcfObjTxWarrantAcceptance | OcfObjTxWarrantCancellation | OcfObjTxWarrantExercise | OcfObjTxWarrantIssuance | OcfObjTxWarrantRetraction | OcfObjTxWarrantTransfer
| OcfObjTxVestingAcceleration | OcfObjTxVestingStart | OcfObjTxVestingEvent
deriving (Eq, Show)

Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
module Fairmint.OpenCapTable.OCF.EquityCompensationExercise where

import Fairmint.OpenCapTable.Types.Core (Context)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray, validateUniqueStringsArray)
import Fairmint.Shared.TypeHelpers (validateOptionalText)


Expand Down Expand Up @@ -59,6 +59,7 @@ validateOcfEquityCompensationExerciseData d =
-- Required numbers may be zero unless schema specifies otherwise
-- Optional Text values, if present, must be non-empty
validateOptionalText d.consideration_text &&
-- Arrays element validation (allow empty arrays where schema does not require minItems)
-- Arrays element validation
validateNonEmptyStringsArray d.comments &&
validateNonEmptyStringsArray d.resulting_security_ids
validateNonEmptyStringsArray d.resulting_security_ids &&
validateUniqueStringsArray d.resulting_security_ids
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
module Fairmint.OpenCapTable.OCF.EquityCompensationRelease where

import Fairmint.OpenCapTable.Types.Core (Context)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray, validateUniqueStringsArray)
import Fairmint.OpenCapTable.Types.Monetary (OcfMonetary, validateOcfMonetary)
import Fairmint.Shared.TypeHelpers (validateOptionalText)

Expand Down Expand Up @@ -62,7 +62,7 @@ validateEquityCompensationReleaseOcfData d =
d.security_id /= "" &&
d.quantity > 0.0 &&
validateOcfMonetary d.release_price &&
not (null d.resulting_security_ids) &&
validateNonEmptyStringsArray d.comments &&
validateNonEmptyStringsArray d.resulting_security_ids &&
validateUniqueStringsArray d.resulting_security_ids &&
validateOptionalText d.consideration_text
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module Fairmint.OpenCapTable.OCF.EquityCompensationTransfer where
-- OCF: https://raw.githubusercontent.com/Open-Cap-Table-Coalition/Open-Cap-Format-OCF/main/schema/objects/transactions/transfer/EquityCompensationTransfer.schema.json

import Fairmint.OpenCapTable.Types.Core (Context)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray, validateNonEmptyUniqueStringsArray)
import Fairmint.Shared.TypeHelpers (validateOptionalText)


Expand Down Expand Up @@ -59,9 +59,7 @@ validateEquityCompensationTransferOcfData d =
d.id /= "" &&
d.security_id /= "" &&
d.quantity > 0.0 &&
not (null d.resulting_security_ids) &&
validateNonEmptyStringsArray d.resulting_security_ids &&
validateNonEmptyUniqueStringsArray d.resulting_security_ids &&
validateNonEmptyStringsArray d.comments &&
validateOptionalText d.balance_security_id &&
validateOptionalText d.consideration_text

9 changes: 1 addition & 8 deletions OpenCapTable-v34/daml/Fairmint/OpenCapTable/OCF/Issuer.daml
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,11 @@ module Fairmint.OpenCapTable.OCF.Issuer where
-- OCF: https://raw.githubusercontent.com/Open-Cap-Table-Coalition/Open-Cap-Format-OCF/main/schema/objects/Issuer.schema.json

import Fairmint.OpenCapTable.Types.Core (Context)
import Fairmint.OpenCapTable.Types.Validation (validateOcfCountryCode, validateNonEmptyStringsArray)
import Fairmint.OpenCapTable.Types.Validation (validateOcfCountryCode, validateOcfCountrySubdivisionCode, validateNonEmptyStringsArray)
import Fairmint.OpenCapTable.Types.Contact (OcfEmail, OcfPhone, validateOcfEmail, validateOcfPhone)
import Fairmint.OpenCapTable.Types.Monetary (OcfAddress, OcfTaxID, validateOcfAddress, validateOcfTaxID)
import Fairmint.OpenCapTable.Types.Stock (OcfInitialSharesAuthorized(..))
import Fairmint.Shared.TypeHelpers (validateOptionalText)
import qualified DA.Text as Text

template Issuer
with
Expand Down Expand Up @@ -65,12 +64,6 @@ data IssuerOcfData = IssuerOcfData
phone: Optional OcfPhone
deriving (Eq, Show)

validateOcfCountrySubdivisionCode : Text -> Bool
validateOcfCountrySubdivisionCode subdivisionCode =
subdivisionCode /= "" &&
Text.length subdivisionCode >= 1 &&
Text.length subdivisionCode <= 3

validateOcfLegalName : Text -> Bool
validateOcfLegalName name =
name /= ""
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module Fairmint.OpenCapTable.OCF.StockConsolidation where
-- OCF: https://raw.githubusercontent.com/Open-Cap-Table-Coalition/Open-Cap-Format-OCF/main/schema/objects/transactions/consolidation/StockConsolidation.schema.json

import Fairmint.OpenCapTable.Types.Core (Context)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray, validateUniqueStringsArray)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray, validateNonEmptyUniqueStringsArray)
import Fairmint.Shared.TypeHelpers (validateOptionalText)


Expand Down Expand Up @@ -61,6 +61,5 @@ validateStockConsolidationOcfData d =
validateOptionalText d.reason_text &&
-- Arrays element validation (security_ids required per Consolidation base schema)
validateNonEmptyStringsArray d.comments &&
validateNonEmptyStringsArray d.security_ids &&
validateUniqueStringsArray d.security_ids &&
validateNonEmptyUniqueStringsArray d.security_ids &&
not (null d.security_ids)
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module Fairmint.OpenCapTable.OCF.StockConversion where
-- OCF: https://raw.githubusercontent.com/Open-Cap-Table-Coalition/Open-Cap-Format-OCF/main/schema/objects/transactions/conversion/StockConversion.schema.json

import Fairmint.OpenCapTable.Types.Core (Context)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray, validateUniqueStringsArray)
import Fairmint.Shared.TypeHelpers (validateOptionalText)


Expand Down Expand Up @@ -63,4 +63,4 @@ validateStockConversionOcfData d =
-- Arrays element validation (resulting_security_ids required per Conversion base schema)
validateNonEmptyStringsArray d.comments &&
validateNonEmptyStringsArray d.resulting_security_ids &&
not (null d.resulting_security_ids)
validateUniqueStringsArray d.resulting_security_ids
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ module Fairmint.OpenCapTable.OCF.StockIssuance where
import Fairmint.OpenCapTable.Types.Core (Context)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray)
import Fairmint.OpenCapTable.Types.Monetary (OcfMonetary, validateOcfMonetary)
import Fairmint.OpenCapTable.Types.Stock (OcfSecurityExemption, OcfShareNumberRange, validateOcfSecurityExemption, validateOcfShareNumberRange)
import Fairmint.OpenCapTable.Types.Stock (OcfSecurityExemption, OcfShareNumberRange, validateOcfSecurityExemption, validateOcfShareNumberRangesForQuantity)
import Fairmint.OpenCapTable.Types.Vesting (OcfVesting, validateOcfVesting)
import Fairmint.Shared.TypeHelpers (validateOptionalText)

Expand Down Expand Up @@ -90,13 +90,14 @@ validateOcfStockIssuanceData d =
d.stock_class_id /= "" &&
-- Arrays element validation (allow empty arrays where schema does not require minItems)
all validateOcfSecurityExemption d.security_law_exemptions &&
all validateOcfShareNumberRange d.share_numbers_issued &&
validateOcfShareNumberRangesForQuantity d.quantity d.share_numbers_issued &&
all validateOcfVesting d.vestings &&
validateNonEmptyStringsArray d.comments &&
-- Arrays per schema: schema requires at least 1 legend, but we allow empty
validateNonEmptyStringsArray d.stock_legend_ids &&
-- Required amounts
validateOcfMonetary d.share_price &&
optional True validateOcfMonetary d.cost_basis &&
d.quantity > (0.0) &&
-- Optional Text values, if present, must be non-empty
validateOptionalText d.consideration_text &&
Expand All @@ -108,5 +109,3 @@ validateOcfStockIssuanceData d =
-- OCF: https://raw.githubusercontent.com/Open-Cap-Table-Coalition/Open-Cap-Format-OCF/main/schema/enums/StockIssuanceType.schema.json
data OcfStockIssuanceType = OcfStockIssuanceRSA | OcfStockIssuanceFounders
deriving (Eq, Show)


Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module Fairmint.OpenCapTable.OCF.StockReissuance where
-- OCF: https://raw.githubusercontent.com/Open-Cap-Table-Coalition/Open-Cap-Format-OCF/main/schema/objects/transactions/reissuance/StockReissuance.schema.json

import Fairmint.OpenCapTable.Types.Core (Context)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray, validateUniqueStringsArray)
import Fairmint.Shared.TypeHelpers (validateOptionalText)


Expand Down Expand Up @@ -63,4 +63,4 @@ validateStockReissuanceOcfData d =
-- Arrays element validation (resulting_security_ids required per Reissuance base schema)
validateNonEmptyStringsArray d.comments &&
validateNonEmptyStringsArray d.resulting_security_ids &&
not (null d.resulting_security_ids)
validateUniqueStringsArray d.resulting_security_ids
Comment thread
HardlyDifficult marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module Fairmint.OpenCapTable.OCF.StockTransfer where
-- OCF: https://raw.githubusercontent.com/Open-Cap-Table-Coalition/Open-Cap-Format-OCF/main/schema/objects/transactions/transfer/StockTransfer.schema.json

import Fairmint.OpenCapTable.Types.Core (Context)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray, validateNonEmptyUniqueStringsArray)
import Fairmint.Shared.TypeHelpers (validateOptionalText)


Expand Down Expand Up @@ -59,9 +59,7 @@ validateStockTransferOcfData d =
d.id /= "" &&
d.security_id /= "" &&
d.quantity > 0.0 &&
not (null d.resulting_security_ids) &&
validateNonEmptyStringsArray d.resulting_security_ids &&
validateNonEmptyUniqueStringsArray d.resulting_security_ids &&
validateNonEmptyStringsArray d.comments &&
validateOptionalText d.balance_security_id &&
validateOptionalText d.consideration_text

Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module Fairmint.OpenCapTable.OCF.WarrantExercise where
-- OCF: https://raw.githubusercontent.com/Open-Cap-Table-Coalition/Open-Cap-Format-OCF/main/schema/objects/transactions/exercise/WarrantExercise.schema.json

import Fairmint.OpenCapTable.Types.Core (Context)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray, validateUniqueStringsArray)
import Fairmint.Shared.TypeHelpers (validateOptionalText, validateOptionalDecimal)


Expand Down Expand Up @@ -67,4 +67,4 @@ validateWarrantExerciseOcfData d =
-- Arrays element validation (resulting_security_ids required per Exercise base schema)
validateNonEmptyStringsArray d.comments &&
validateNonEmptyStringsArray d.resulting_security_ids &&
not (null d.resulting_security_ids)
validateUniqueStringsArray d.resulting_security_ids
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ validateOcfWarrantIssuanceDataTx d =
-- Required amounts and lists
-- quantity is optional per schema; exercise_price is optional per schema
validateOcfMonetary d.purchase_price &&
optional True validateOcfMonetary d.exercise_price &&
validateOptionalText d.consideration_text &&
-- exercise_triggers: OCF schema requires array but no minItems, so empty array is valid
all validateOcfConversionTrigger d.exercise_triggers &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ module Fairmint.OpenCapTable.OCF.WarrantTransfer where
-- OCF: https://raw.githubusercontent.com/Open-Cap-Table-Coalition/Open-Cap-Format-OCF/main/schema/objects/transactions/transfer/WarrantTransfer.schema.json

import Fairmint.OpenCapTable.Types.Core (Context)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray)
import Fairmint.OpenCapTable.Types.Validation (validateNonEmptyStringsArray, validateNonEmptyUniqueStringsArray)
import Fairmint.Shared.TypeHelpers (validateOptionalText)


Expand Down Expand Up @@ -59,9 +59,7 @@ validateWarrantTransferOcfData d =
d.id /= "" &&
d.security_id /= "" &&
d.quantity > 0.0 &&
not (null d.resulting_security_ids) &&
validateNonEmptyStringsArray d.resulting_security_ids &&
validateNonEmptyUniqueStringsArray d.resulting_security_ids &&
validateNonEmptyStringsArray d.comments &&
validateOptionalText d.balance_security_id &&
validateOptionalText d.consideration_text

37 changes: 36 additions & 1 deletion OpenCapTable-v34/daml/Fairmint/OpenCapTable/Types/Contact.daml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,42 @@ data OcfPhone = OcfPhone
deriving (Eq, Show)

validateOcfPhone : OcfPhone -> Bool
validateOcfPhone phone = validateRequiredText phone.phone_number
validateOcfPhone phone = validateOcfPhoneNumber phone.phone_number

validDigitsBetween : Int -> Int -> Text -> Bool
validDigitsBetween minLength maxLength digits =
let n = Text.length digits in
n >= minLength && n <= maxLength && all Text.isDigit (Text.explode digits)

validDigitsAtLeast : Int -> Text -> Bool
validDigitsAtLeast minLength digits =
Text.length digits >= minLength && all Text.isDigit (Text.explode digits)

validPhoneCountryCode : Text -> Bool
validPhoneCountryCode country =
case Text.stripPrefix "+" country of
Some digits -> validDigitsBetween 1 3 digits
None -> False

validateOcfPhoneNumberParts : [Text] -> Bool
validateOcfPhoneNumberParts parts =
case parts of
[country, area, exchange, line] ->
validPhoneCountryCode country &&
validDigitsBetween 2 3 area &&
validDigitsBetween 2 3 exchange &&
validDigitsBetween 4 4 line
[country, area, exchange, line, extensionMarker, extension] ->
validateOcfPhoneNumberParts [country, area, exchange, line] &&
(extensionMarker == "ext." || extensionMarker == "extension") &&
validDigitsAtLeast 1 extension
-- Empty parts from consecutive spaces are intentionally rejected here.
_ -> False
Comment thread
coderabbitai[bot] marked this conversation as resolved.

validateOcfPhoneNumber : Text -> Bool
validateOcfPhoneNumber phoneNumber =
validateRequiredText phoneNumber &&
validateOcfPhoneNumberParts (Text.splitOn " " phoneNumber)

-- Enum - Email Type
-- Type of e-mail address
Expand Down
Loading
Loading