@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix qudt: <http://qudt.org/schema/qudt/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

qudt:DigitalCurrencyUnit a rdfs:Class,
        owl:Class,
        sh:NodeShape ;
    rdfs:label "Digital Currency Unit"@en ;
    dcterms:description "A currency-like unit for cryptographic or tokenized assets. Instances should reference an ISO 24165 Digital Token Identifier (DTI) when available."@en ;
    qudt:informativeReference <https://dtif.org/>,
        <https://www.iso.org/standard/79891.html> ;
    rdfs:comment "A currency-like unit for cryptographic or tokenized assets. Instances should reference an ISO 24165 Digital Token Identifier (DTI) when available."@en ;
    rdfs:isDefinedBy <http://qudt.org/3.2.1/schema/qudt>,
        <http://qudt.org/3.2.1/schema/shacl/qudt> ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:allValuesFrom xsd:string ;
            owl:onProperty qudt:blockchainNetwork ],
        [ a owl:Restriction ;
            owl:allValuesFrom xsd:string ;
            owl:onProperty qudt:currencyCode ],
        [ a owl:Restriction ;
            owl:maxCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onProperty qudt:blockchainNetwork ],
        [ a owl:Restriction ;
            owl:maxCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onProperty qudt:hasDTICode ],
        [ a owl:Restriction ;
            owl:maxCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onProperty qudt:currencyExponent ],
        [ a owl:Restriction ;
            owl:allValuesFrom xsd:string ;
            owl:onProperty qudt:hasDTICode ],
        [ a owl:Restriction ;
            owl:allValuesFrom xsd:integer ;
            owl:onProperty qudt:currencyExponent ],
        [ a owl:Restriction ;
            owl:maxCardinality "1"^^xsd:nonNegativeInteger ;
            owl:onProperty qudt:currencyCode ],
        qudt:CurrencyUnit ;
    sh:property [ sh:datatype xsd:integer ;
            sh:maxCount 1 ;
            sh:maxInclusive 30 ;
            sh:message "currencyExponent must be a single integer between 0 and 30 (e.g., BTC = 8, ETH = 18)."@en ;
            sh:minInclusive 0 ;
            sh:path qudt:currencyExponent ],
        [ sh:datatype xsd:string ;
            sh:maxCount 1 ;
            sh:message "hasDTICode, if provided, must be a 12-character ISO 24165 DTI (A–Z, 0–9)."@en ;
            sh:path qudt:hasDTICode ;
            sh:pattern "^[A-Z0-9]{12}$" ],
        [ sh:datatype xsd:string ;
            sh:maxCount 1 ;
            sh:message "currencyCode must be a single 2–10 character uppercase alphanumeric mnemonic (e.g., 'BTC', 'USDT')."@en ;
            sh:path qudt:currencyCode ;
            sh:pattern "^[A-Z0-9]{2,10}$" ],
        [ sh:datatype xsd:string ;
            sh:maxCount 1 ;
            sh:message "blockchainNetwork, if provided, must be a single string (e.g., 'Bitcoin Mainnet')."@en ;
            sh:path qudt:blockchainNetwork ] .

