diff --git a/.github/workflows/schema_validation.yml b/.github/workflows/schema_validation.yml new file mode 100644 index 0000000..d1f5b56 --- /dev/null +++ b/.github/workflows/schema_validation.yml @@ -0,0 +1,28 @@ +name: Schema Validation + +on: + pull_request: + paths: + - "EVES/**/example/*.json" + - "EVES/**/*-schemas/*.json" + - "package.json" + +jobs: + validate: + name: Validate Examples Against Schemas + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Setup Node + uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 + with: + node-version: "22" + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Validate schemas + run: npm run validate:schemas diff --git a/.github/workflows/shacl_validation.yml b/.github/workflows/shacl_validation.yml new file mode 100644 index 0000000..ac0ecbf --- /dev/null +++ b/.github/workflows/shacl_validation.yml @@ -0,0 +1,32 @@ +name: SHACL Validation + +on: + pull_request: + paths: + - "EVES/**/example/*.json" + - ".github/workflows/shacl_validation.yml" + +jobs: + validate: + name: Validate JSON-LD against SHACL + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Setup Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: "3.12" + + - name: Install ontology-management-base + run: pip install "ontology-management-base @ git+https://github.com/ASCS-eV/ontology-management-base.git@main" + + # Only envited-x_manifest.json is validated β€” input_manifest.json is a + # partial Stage 1 input format that intentionally omits hasManifestReference + # and other computed fields, so it does not conform to the full ManifestShape. + - name: Validate EVES-003 manifest + run: > + python -m src.tools.validators.validation_suite + --remote + --data-paths EVES/EVES-003/example/envited-x_manifest.json diff --git a/.prettierignore b/.prettierignore index 9014560..56f8652 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,5 @@ node_modules/ EVES/EVES-003/example/ -EVES/EVES-003/tzip21-schemas/ +EVES/EVES-003/erc721-schemas/ .github/styles/ *.zip diff --git a/EVES/EVES-003/tzip21-schemas/tzip21_token_metadata-schema.json b/EVES/EVES-003/erc721-schemas/erc721_token_metadata-schema.json similarity index 59% rename from EVES/EVES-003/tzip21-schemas/tzip21_token_metadata-schema.json rename to EVES/EVES-003/erc721-schemas/erc721_token_metadata-schema.json index c432f41..94fd6eb 100644 --- a/EVES/EVES-003/tzip21-schemas/tzip21_token_metadata-schema.json +++ b/EVES/EVES-003/erc721-schemas/erc721_token_metadata-schema.json @@ -1,20 +1,48 @@ { "$schema": "http://json-schema.org/draft-07/schema#", + "$comment": "EVES-003 profile of ERC-721 token metadata. Base fields (name, description, image) from the ERC-721 Metadata JSON Schema (EIP-721). Display fields (animation_url, external_url, background_color, attributes) from OpenSea Metadata Standards (de facto, no upstream schema). EVES extension fields (minter, creators, contributors, publishers, date, type, language, rights, rights_uri, identifier, formats) follow Dublin Core naming conventions.", "$ref": "#/definitions/asset", - "title": "Rich Metadata", "definitions": { "asset": { + "title": "ERC-721 Token Metadata (EVES-003 Profile)", "type": "object", "additionalProperties": true, + "required": [ + "name", + "image" + ], "properties": { + "name": { + "type": "string", + "description": "Identifies the asset that this NFT represents." + }, "description": { "type": "string", - "description": "General notes, abstracts, or summaries about the contents of an asset." + "description": "Describes the asset that this NFT represents." + }, + "image": { + "type": "string", + "format": "uri-reference", + "description": "A URI pointing to a resource with mime type image/* representing the asset." + }, + "animation_url": { + "type": "string", + "format": "uri-reference", + "description": "A URI pointing to the actual asset content (for example, asset.zip download URL)." + }, + "external_url": { + "type": "string", + "format": "uri-reference", + "description": "A URI pointing to an external page with additional information about the asset (for example, domain metadata on IPFS)." + }, + "background_color": { + "type": "string", + "pattern": "^[0-9a-fA-F]{6}$", + "description": "Background color of the item on OpenSea. Must be a six-character hexadecimal without a pre-pended #." }, "minter": { "type": "string", - "format": "tzaddress", - "description": "The tz address responsible for minting the asset." + "description": "The DID of the LegalEntity (OrganizationParticipant) responsible for minting the asset, as defined in EVES-008 (for example, did:ethr::
). EVES extension." }, "creators": { "type": "array", @@ -45,83 +73,26 @@ "format": "date-time", "description": "A date associated with the creation or availability of the asset." }, - "blockLevel": { - "type": "integer", - "description": "Chain block level associated with the creation or availability of the asset." - }, "type": { "type": "string", "description": "A broad definition of the type of content of the asset." }, - "tags": { - "type": "array", - "description": "A list of tags that describe the subject or content of the asset.", - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "genres": { - "type": "array", - "description": "A list of genres that describe the subject or content of the asset.", - "uniqueItems": true, - "items": { - "type": "string" - } - }, "language": { "type": "string", - "format": "https://tools.ietf.org/html/rfc1766", - "description": "The language of the intellectual content of the asset as defined in RFC 1776." - }, - "identifier": { - "type": "string", - "description": "A string or number used to uniquely identify the asset. Ex. URL, URN, UUID, ISBN, etc." + "description": "The language of the intellectual content of the asset as defined in RFC 1766. EVES extension." }, "rights": { "type": "string", - "description": "A statement about the asset rights." - }, - "rightsUri": { - "type": "string", - "format": "uri-reference", - "description": "Links to a statement of rights." - }, - "artifactUri": { - "type": "string", - "format": "uri-reference", - "description": "A URI to the asset." + "description": "A statement about the asset rights, for example, an SPDX license identifier." }, - "displayUri": { + "rights_uri": { "type": "string", "format": "uri-reference", - "description": "A URI to an image of the asset. Used for display purposes." + "description": "Links to a statement of rights (for example, full license text or smart contract DID). EVES extension." }, - "thumbnailUri": { - "type": "string", - "format": "uri-reference", - "description": "A URI to an image of the asset for wallets and client applications to have a scaled down image to present to end-users. Reccomened maximum size of 350x350px." - }, - "externalUri": { + "identifier": { "type": "string", - "format": "uri-reference", - "description": "A URI with additional information about the subject or content of the asset." - }, - "isTransferable": { - "type": "boolean", - "description": "All tokens will be transferable by default to allow end-users to send them to other end-users. However, this field exists to serve in special cases where owners will not be able to transfer the token." - }, - "isBooleanAmount": { - "type": "boolean", - "description": "Describes whether an account can have an amount of exactly 0 or 1. (The purpose of this field is for wallets to determine whether or not to display balance information and an amount field when transferring.)" - }, - "shouldPreferSymbol": { - "type": "boolean", - "description": "Allows wallets to decide whether or not a symbol should be displayed in place of a name." - }, - "ttl": { - "type": "integer", - "description": "The maximum amount of time in seconds the asset metadata should be cached." + "description": "A string or number used to uniquely identify the asset. Ex. URL, URN, UUID, ISBN, DID, etc." }, "formats": { "type": "array", @@ -134,14 +105,7 @@ "items": { "$ref": "#/definitions/attribute" }, - "description": "Custom attributes about the subject or content of the asset." - }, - "assets": { - "type": "array", - "items": { - "$ref": "#/definitions/asset" - }, - "description": "Facilitates the description of collections and other types of resources that contain multiple assets." + "description": "OpenSea-style attributes describing traits of the asset." } } }, @@ -189,21 +153,24 @@ "type": "object", "additionalProperties": false, "properties": { - "name": { + "trait_type": { "type": "string", - "description": "Name of the attribute." + "description": "Name of the trait." }, "value": { - "type": "string", - "description": "Value of the attribute." + "description": "Value of the trait.", + "oneOf": [ + { "type": "string" }, + { "type": "number" } + ] }, - "type": { + "display_type": { "type": "string", - "description": "Type of the value. To be used for display purposes." + "description": "Display type hint for the trait (for example, number, boost_percentage, boost_number, date)." } }, "required": [ - "name", + "trait_type", "value" ] }, diff --git a/EVES/EVES-003/eves-003.md b/EVES/EVES-003/eves-003.md index c7f8638..7ed64bb 100644 --- a/EVES/EVES-003/eves-003.md +++ b/EVES/EVES-003/eves-003.md @@ -6,14 +6,15 @@ discussions-to: https://github.com/ASCS-eV/EVES/issues/4 status: Review type: Standards created: 2024-11-19 -requires: ["EVES-001"] +requires: ["EVES-001", "EVES-007", "EVES-008"] replaces: None --- ## Abstract This specification defines the structure of an asset in the ENVITED-X Data Space and outlines the process for uploading assets to ensure compliance, security, and interoperability. -It leverages existing specifications, such as the Gaia-X Trust Framework, the Gaia-X 4 PLC-AAD Ontologies, and implements privacy layers, validation, and metadata mapping aligned with [Tezos TZIP-21](https://docs.tezos.com/architecture/governance/improvement-process#tzip-21-rich-contract-metadata). +It leverages existing specifications, such as the Gaia-X Trust Framework, the ENVITED-X Ontologies, and implements privacy layers, validation, and metadata mapping aligned with +[ERC-721][26] token metadata following the [OpenSea Metadata Standards][23]. ## Motivation @@ -27,13 +28,15 @@ This EVES addresses the need for clear guidelines to onboard assets and synchron ## Specification +The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC 2119][16]. + ### 1. Digital Asset Definition The `envited-x:SimulationAsset` defines a digital asset within the domain of simulation including the core simulation data and all necessary files for describing, evaluating, and visualizing the dataset. -All simulation assets MUST be derived from a common `envited-x` ontology defined in the [Gaia-X 4 PLC-AAD Ontology Management Base][1]. -A data space portal SHALL display the currently supported version of the ontologies such as: `https://ontologies.envited-x.net/envited-x/v2/ontology#`. +All simulation assets MUST be derived from a common `envited-x` ontology defined in the [ASCS Ontology Management Base][1]. +A data space portal SHALL display the currently supported version of the ontologies such as: `https://w3id.org/ascs-ev/envited-x/envited-x/v3/`. Each simulation asset SHALL be compliant with the [Gaia-X Ontology and SHACL shapes 2210][2]. -The `gx` turtle shacle shapes are derived from the [Gaia-X Trust Framework Schema][3] and the respective application/ld+json [Gaia-X Trust Framework Shapes][4]. +The `gx` turtle SHACL shapes are derived from the [Gaia-X Trust Framework Schema][3] and the respective application/ld+json [Gaia-X Trust Framework Shapes][4]. A [GaiaX Compliant Claims Example][5] MAY be generated using the [GaiaX 4 PLC-AAD Claim Compliance Provider][6]. The example implementation in the πŸ“ `example/` folder is based on release v0.2.3 of the [ASCS HD-Map Asset Example][7]. @@ -45,6 +48,42 @@ Asset examples can be found in the following repositories: - [Scenario Asset Example](https://github.com/ASCS-eV/scenario-asset-example) - [OSI-Trace Asset Example](https://github.com/ASCS-eV/ositrace-asset-example/tree/main) +### 1a. Asset Lifecycle Overview + +An `envited-x:SimulationAsset` progresses through three stages from creation to publication. +All stages use the same `envited-x` and `manifest` ontology vocabulary to ensure consistency and machine-readability throughout. + +```text +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Stage 1: β”‚ β”‚ Stage 2: β”‚ β”‚ Stage 3: β”‚ +β”‚ PREPARATION β”‚ β”‚ PACKAGING β”‚ β”‚ PUBLICATION β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ input_manifest.json│─────▢│ asset.zip containing: │─────▢│ envited-x_manifest.json β”‚ +β”‚ (user-provided) β”‚ β”‚ manifest_reference.json β”‚ β”‚ erc721_token_metadata.json β”‚ +β”‚ β”‚ assetβ”‚ + all asset files β”‚portalβ”‚ β”‚ +β”‚ β”‚ toolsβ”‚ β”‚uploadβ”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +- **Stage 1 β€” Preparation:** The user describes their input files in an `input_manifest.json` using the `envited-x` vocabulary. This partial manifest specifies file paths, categories, access roles, and MIME types. +- **Stage 2 β€” Packaging:** Asset creation tooling (such as the [ENVITED-X Simulation Asset Tools][20]) processes the input manifest, computes CIDs and file sizes, generates additional artifacts, and packages everything into an `asset.zip` with a complete `manifest_reference.json`. +- **Stage 3 β€” Publication:** The ENVITED-X portal uploads the asset, replaces local file paths with IPFS/HTTPS URLs, generates the final `envited-x_manifest.json`, and creates chain-specific token metadata files for minting. + +#### Example Files + +The πŸ“ `example/` folder contains files from each stage of this pipeline: + +| File | Stage | Role | Status | +| ---------------------------- | ----------- | --------------------------------------------------------- | ----------- | +| `input_manifest.json` | Preparation | User-provided partial manifest for asset tooling | Normative | +| `bafybeifo6...zip` | Packaging | Example `asset.zip` from [hd-map-asset-example v0.2.3][7] | Informative | +| `envited-x_manifest.json` | Publication | Final manifest with resolved IPFS/HTTPS URLs | Normative | +| `erc721_token_metadata.json` | Publication | EVM ERC-721 token metadata | Normative | + +> **Note:** The example `asset.zip` is from [hd-map-asset-example v0.2.3][7] and uses earlier ontology versions internally (`manifest/v4`, `envited-x/v2`). +> The standalone example files reflect the current ontology versions (`manifest/v5`, `envited-x/v3`). +> A future release of the HD-Map Asset Example will align both. + ### 1b. Asset Preparation Before uploading, an asset MUST be organized into a well-defined folder structure and described by an input manifest. @@ -67,10 +106,10 @@ Every `asset.zip` MUST contain the following top-level folders mapped to `envite > **Note:** The `envited-x` categories and access roles are formally defined in the [ENVITED-X Ontology][21] which extends the generic [Manifest Ontology][22]. > The `envited-x:ExtendedLinkShape` constrains the allowed values for both `manifest:hasCategory` and `manifest:hasAccessRole`. -#### Input Manifest (`input_manifest.json`) +#### Input Manifest (`input_manifest.json`) β€” Stage 1: Preparation -An `input_manifest.json` is a partial `envited-x:Manifest` in JSON-LD that describes the user-provided input files before the asset creation pipeline processes them. -It uses the same vocabulary as the final `manifest_reference.json` but omits computed fields (`cid`, `fileSize`, `timestamp`, `hasDimensions`, `filename`). +An `input_manifest.json` is a partial `envited-x:Manifest` in JSON-LD that describes the user-provided input files before the asset creation pipeline processes them (see [Β§1a](#1a-asset-lifecycle-overview)). +It uses the same `envited-x` and `manifest` vocabulary as the final `manifest_reference.json` but omits computed fields (`cid`, `fileSize`, `timestamp`, `hasDimensions`, `filename`) and structural entries (`hasManifestReference`, `iri`) that are generated by the pipeline. Each entry (a `manifest:Link`) MUST specify: @@ -82,62 +121,63 @@ Each entry (a `manifest:Link`) MUST specify: ##### Two-Stage Validation -Asset creation tooling SHOULD implement a two-stage validation approach: +Asset creation tooling SHOULD implement a two-stage validation approach (see also [Β§4 Step 1](#step-1-client-side-pre-validation) for portal-side validation): 1. **Input validation (fail fast):** Each `manifest:Link` in the `input_manifest.json` SHOULD be validated against `manifest:LinkShape` and `envited-x:ExtendedLinkShape` before the pipeline runs. This catches invalid categories, missing access roles, or malformed file metadata early. 2. **Output validation (completeness):** The completed `manifest_reference.json` MUST be validated against the full `envited-x:ManifestShape`, which requires at least one artifact per core category (`isSimulationData`, `isDocumentation`, `isMetadata`, `isMedia`). -##### Example `input_manifest.json` +##### Example `input_manifest.json` β€” Stage 1: Preparation See πŸ“ `example/input_manifest.json` for a complete example. ```json { - "@context": ["https://w3id.org/ascs-ev/envited-x/manifest/v5/", { "envited-x": "https://w3id.org/ascs-ev/envited-x/envited-x/v3/" }], + "@context": ["https://w3id.org/ascs-ev/envited-x/envited-x/v3/", "https://w3id.org/ascs-ev/envited-x/manifest/v5/", { "gx": "https://w3id.org/gaia-x/development#", "xsd": "http://www.w3.org/2001/XMLSchema#" }], "@id": "did:web:registry.gaia-x.eu:HdMap:example", "@type": "envited-x:Manifest", "hasArtifacts": [ { - "@type": "Link", - "hasCategory": { "@id": "envited-x:isSimulationData" }, - "hasAccessRole": { "@id": "envited-x:isOwner" }, + "@type": "manifest:Link", + "hasAccessRole": { "@type": "manifest:AccessRole", "@id": "envited-x:isOwner" }, + "hasCategory": { "@type": "manifest:Category", "@id": "envited-x:isSimulationData" }, "hasFileMetadata": { - "@type": "FileMetadata", + "@type": "manifest:FileMetadata", "filePath": "my_map.xodr", - "mimeType": "application/xml" + "mimeType": "application/x-xodr" } }, { - "@type": "Link", - "hasCategory": { "@id": "envited-x:isMedia" }, - "hasAccessRole": { "@id": "envited-x:isPublic" }, + "@type": "manifest:Link", + "hasAccessRole": { "@type": "manifest:AccessRole", "@id": "envited-x:isPublic" }, + "hasCategory": { "@type": "manifest:Category", "@id": "envited-x:isMedia" }, "hasFileMetadata": { - "@type": "FileMetadata", + "@type": "manifest:FileMetadata", "filePath": "impression-01.png", "mimeType": "image/png" } } ], "hasLicense": { - "@type": "Link", - "hasCategory": { "@id": "envited-x:isLicense" }, - "hasAccessRole": { "@id": "envited-x:isPublic" }, + "@type": "manifest:Link", + "hasAccessRole": { "@type": "manifest:AccessRole", "@id": "envited-x:isPublic" }, + "hasCategory": { "@type": "manifest:Category", "@id": "envited-x:isLicense" }, "hasFileMetadata": { - "@type": "FileMetadata", - "filePath": "LICENSE", - "mimeType": "text/plain" + "@type": "manifest:FileMetadata", + "filePath": "https://www.mozilla.org/en-US/MPL/2.0/", + "mimeType": "text/html" } } } ``` -The asset creation pipeline enriches this into a full `manifest_reference.json` by: +The asset creation pipeline (Stage 2: Packaging) enriches this into a full `manifest_reference.json` by: 1. Computing `manifest:cid` (IPFS CIDv1) for each file 2. Computing `manifest:fileSize` and `manifest:timestamp` 3. Extracting `manifest:hasDimensions` for images 4. Adding generated artifacts (documentation, metadata, validation reports) 5. Adding the self-referencing `manifest:hasManifestReference` entry +6. Adding `manifest:iri` to the license link (required by `envited-x:LicenseLinkReferenceShape`) ### 2. Pinata IPFS and CID Management @@ -169,8 +209,8 @@ The following process is implemented in the [ENVITED-X Data Space][12] portal de #### Step 1: Client-Side Pre-Validation -- Verify that an `input_manifest.json` was used during asset preparation (see [Β§1b](#1b-asset-preparation)): - 1. Each `manifest:Link` in the input SHOULD have been validated against `manifest:LinkShape` and `envited-x:ExtendedLinkShape`. +- Verify that an `input_manifest.json` was used during asset preparation (see [Β§1b](#1b-asset-preparation) and [Two-Stage Validation](#two-stage-validation)): + 1. Each `manifest:Link` in the input SHOULD have been validated against `manifest:LinkShape` and `envited-x:ExtendedLinkShape` as described in [Β§1b](#two-stage-validation). - Drag and drop `asset.zip` into the upload field. - Validate the `manifest_reference.json`: 1. Ensure JSON structure matches the manifest SHACL constraints. @@ -195,14 +235,14 @@ The following process is implemented in the [ENVITED-X Data Space][12] portal de - Store `isRegistered` metadata at `https://metadata.envited-x.net/Asset-CID`. - Store `isPublic` metadata at `https://ipfs.envited-x.net/Asset-CID/Data-CID`. - Calculate CIDs for all `isPublic` data. -- Create `envited-x_manifest.json` by replacing relative paths in `manifest_reference.json` with IPFS/envited-x.net URLs. +- Create `envited-x_manifest.json` (Stage 3: Publication) by replacing relative paths in `manifest_reference.json` with IPFS/envited-x.net URLs. - Replace the paths of items in `hasReferencedArtifacts` to the correct filePaths. - Replace `@id` from `manifest_reference.json` with generated database `UUID` in `envited-x_manifest.json`. This also applies for referenced artifacts. -- Create `tzip21_token_metadata.json` and map the metadata fields OPTIONALLY use an application/ld+json conform to the [tzip21 ontology][19]. +- Create `erc721_token_metadata.json` following the [OpenSea Metadata Standards][23] and map the metadata fields as defined in [Β§6 Token Metadata](#6-token-metadata). #### Step 3: Preview Data -- **TBD**: Define visualization and preview mechanisms for uploaded data. +- Visualization and preview mechanisms for uploaded data are portal-specific and not specified in this revision. - If a user triggers the "delete asset" button then all data stored in Step 2) is deleted. #### Step 4: Mint Token @@ -210,8 +250,9 @@ The following process is implemented in the [ENVITED-X Data Space][12] portal de - It is RECOMMENDED to use signed CIDs for the upload to IPFS according to [EIP-712][13]. - Upload `isPublic` information and `envited-x_manifest.json` to IPFS. - It is RECOMMENDED to verify that CIDs from the IPFS service or software returns the same CIDs as the pre-calculation. -- Upload `tzip21_token_metadata.json` to IPFS. -- Mint token with linked metadata. +- Upload `erc721_token_metadata.json` to IPFS. +- Mint an [ERC-721][26] token where `tokenURI()` resolves to the ERC-721 metadata JSON on IPFS. The contract SHOULD implement [ERC-5192][25] for soulbound (non-transferable) tokens if applicable. The contract SHOULD emit [ERC-4906][24] `MetadataUpdate` events when metadata changes. +- The mint transaction MAY be submitted by a relayer on behalf of the user; signed authorization evidence links the registration to the minting organization's identity (see [Β§6 Token Metadata](#6-token-metadata)). - The wallet/SDK will provide feedback if a token was minted successfully. #### Step 5: Listener and Database Synchronization @@ -219,9 +260,9 @@ The following process is implemented in the [ENVITED-X Data Space][12] portal de - Use a listener to detect mint events and synchronize data with the ENVITED-X Data Space portal database. - A data space like the ENVITED-X Data Space MUST check if the asset was uploaded through its respective portal: - `UUID` from step 2) has an entry in the database. - - Confirm that `contract` + `CID` and `minter` of tzip21_token_metadata.json are the same as in the database. + - Confirm that `contract` + `CID` and `minter` of the `erc721_token_metadata.json` are the same as in the database. - Confirm that the entries `UUID` and `@id` of the asset are unique. - - OPTIONALLY check if the EIP-712 signature of the tzip21_token_metadata.json matches the user who initiated the mint (SHALL only be known to the respective portal). + - OPTIONALLY check if the EIP-712 signature of the token metadata file matches the user who initiated the mint (SHALL only be known to the respective portal). - If the asset is not yet in DB OPTIONALLY mark it as foreign asset and add the `publisher` information to the DB. - It is RECOMMENDED to verify the asset in reverse order as in step 1). - Only public information of assets can be verified if uploaded through another portal than ENVITED-X data space. @@ -231,7 +272,7 @@ The following process is implemented in the [ENVITED-X Data Space][12] portal de #### @id and CID as the Primary Identifier - The CID of the uploaded `asset.zip` serves as the unique identifier detecting identical datasets across all systems. -- In addition the unique identifier `@id` of the `envied-x:SimulationAsset` in the `domainMetadata.json` SHALL be used for identification of the digital assets. +- In addition the unique identifier `@id` of the `envited-x:SimulationAsset` in the `domainMetadata.json` SHALL be used for identification of the digital assets. - The CIDs MAY be signed by the user according to EIP-712. - A UUID MUST be generated for the `envited-x_manifest.json` pre-mint to link the asset with the ENVITED-X database securely. - The DID of the member associated with the user minting the asset MUST be known. @@ -243,40 +284,107 @@ If additional non-public information needs to be stored in the database before m #### Synchronization and Security -[EVES-007](../EVES-007/eves-007.md) defines the ENVITED-X Blockchain Identifier URN Schema. +[EVES-007][31] defines the ENVITED-X Blockchain Identifier URN Schema. The synchronization between the smart contract as in the [Marketplace Contract Reference Implementation][18] and the ENVITED-X database relies on: -1. The contract identifier on Tezos (current Ghostnet contract): - `urn:blockchain:tezos:NetXnHfVqm9iesp:contract:KT1PCaD2kmgCHy15wQ1gpqZUy9RLxyBVJdTF` -2. Search `CID` of `tzip21_token_metadata.json` and the complete `asset.zip` in database. +1. The contract identifier using the [EVES-007][31] URN schema, for example (Etherlink L2): + `urn:blockchain:eip155:42793:contract:0x646B92C8f21e55DF67E766047E4bD7bEdF8DfA14` +2. Search `CID` of the `erc721_token_metadata.json` and the complete `asset.zip` in database. 3. Compare if signature on CID is a `user` belonging to the `member` and if member is owner of token. 4. Check: Uniqueness of CID in database. -### TZIP-21 Token Metadata - -#### TZIP-21 Rich Metadata Mapping - -Attributes not in the table are static and the same for every mint as in the πŸ“ `example/tzip21_token_metadata.json`. -Examples are the first five tags or "publishers", which is always ENVITED-X and the ASCS if the mint is conducted through the [website][12]. - -| TZIP-21 | EVES-003 | Comment | -| ------------- | -------------------------------------------------------- | -------------------------------------------------------------------------- | -| "name" | envited-x:DataResource:gx:name | | -| "description" | envited-x:DataResource:gx:description | | -| "tags" | $TAG = format:formatType + " " + format:version | "tags": ["GaiaX","ASCS","ENVITED-X","EVES","nft", "$TAG"] | -| "minter" | Member DID (CAIP-10) associated with user | Returned by the View from the SimpulseID revocation registry | -| "creators" | Name of the company | Taken from the company profile the user belongs to | -| "date" | [System date-time][14] | | -| "rights" | manifest:hasLicense:gx:license | [SPDX identifier][15] | -| "rightsUri" | manifest:hasLicense:licenseData:hasFileMetadata:filePath | Full os license text URL OR policy smart contract did | -| "artifactUri" | | | -| "identifier" | Simulation Asset @id | Unique identifier from the domainMetadata.json | -| "externalUri" | Uploaded domainMetadata.json to IPFS | | -| "displayUri" | "manifest:hasArtifacts:Link" of category "isMedia" | Always use the first media image | -| "formats" | artifactUri, externalUri, displayUri, envited-x_manifest | | -| "attributes" | Reverse domain notation for ontologies + URL | All ontologies from top level nodes in files referenced in formats section | - -**>Note:** Some of the information need to be extracted from the `gx:LegalParticipant`. +### 6. Token Metadata + +This section defines how EVES-003 asset metadata (derived from the ENVITED-X manifest and domain metadata) is mapped to ERC-721 token metadata. + +Token metadata is registered on-chain through an evidence-based listing registry: +the minted ERC-721 token records the minting organization's DID, a hash of the canonical metadata document, and the metadata URI. +The registration is accompanied by signed authorization evidence (for example, a key-binding JWT produced by an SSI wallet as defined in [EVES-008][28]) that links the mint to the organization's identity. +The exact registration flow and the precise structure of the registered document follow the reference implementation and may be refined in a future revision of this EVES; +the field mappings below are normative for the content of the ERC-721 metadata. + +The minter MUST be a `simpulseid:OrganizationParticipant` (LegalEntity) identified by their `did:ethr` DID as defined in [EVES-008][28]. +The `did:ethr` identifier is anchored on Base (ERC-1056) and serves as the organizational identity regardless of the chain the token is minted on. +The natural person performing the mint is linked to the organization through the `memberOf` credential property. +Some of the information needs to be extracted from the `gx:LegalParticipant` via the SimpulseID `ParticipantCredential`. + +The `minter` field is part of the off-chain metadata JSON and therefore states the organization's DID as a claim: +a different Ethereum address (for example, a gas relayer) may submit the mint transaction, so the transaction sender carries no trust semantics. +The smart contract does not verify this claim at mint time. +Instead, consuming systems verify the claimed `minter` DID against an ecosystem root of trust β€” such as the key material anchored in the organization's `did:ethr` DID document or credentials issued by a trust anchor β€” when reading the token. +Where and when in the asset lifecycle this verification takes place remains open in this revision (see [Future Improvements](#future-improvements)). + +#### ERC-721 Metadata (EVM) + +ERC-721 token metadata follows the [OpenSea Metadata Standards][23] which extend the minimal [ERC-721][26] `tokenURI()` JSON schema with additional fields. +Attributes not in the table are static and the same for every mint as in the πŸ“ `example/erc721_token_metadata.json` (Stage 3: Publication). + +| ERC-721 / OpenSea | EVES-003 | Comment | +| ------------------ | --------------------------------------------------------- | ------------------------------------------------------------------- | +| "name" | envited-x:hasResourceDescription β†’ gx:name | | +| "description" | envited-x:hasResourceDescription β†’ gx:description | | +| "image" | manifest:hasArtifacts β†’ Link of category "isMedia" | Always use the first media image | +| "animation_url" | | URI of the actual asset content | +| "external_url" | Uploaded domainMetadata.json to IPFS | | +| "background_color" | ENVITED-X brand background color | Six-character hex without `#` (OpenSea standard) | +| "attributes" | Static + ontology attributes as trait_type/value pairs | See mapping note below | +| "minter" | LegalEntity DID from [EVES-008][28] | did:ethr:\:\ (EVES extension) | +| "creators" | Name of the company | Taken from the company profile (EVES extension) | +| "contributors" | Contributing persons or organizations | (EVES extension) | +| "publishers" | Name of the publishing organizations | (EVES extension) | +| "date" | [System date-time][14] | (EVES extension) | +| "type" | "EVES-003" + EVES URL | (EVES extension) | +| "language" | Language of the asset content | [RFC 1766][29] language tag (EVES extension) | +| "rights" | envited-x:hasResourceDescription β†’ gx:license | [SPDX identifier][15] (EVES extension) | +| "rights_uri" | manifest:hasLicense β†’ manifest:hasFileMetadata β†’ filePath | Full license text URL OR policy smart contract DID (EVES extension) | +| "identifier" | Simulation Asset @id | Unique identifier from the domainMetadata.json (EVES extension) | +| "formats" | artifactUri, externalUri, displayUri, envited-x_manifest | (EVES extension) | + +**Attributes mapping note:** Ecosystem classification and ontology conformance are expressed in the OpenSea-style `"attributes"` array using `"trait_type"`/`"value"` objects. + +Every mint MUST include the following canonical static attributes: + +| ERC-721 `trait_type` | Value | +| -------------------- | ---------------------------------------- | +| "Standard" | "GaiaX" | +| "Publisher" | "ASCS" | +| "Ecosystem" | "ENVITED-X" | +| "Specification" | "EVES" | +| "Token Type" | "nft" | +| "Format" | format:formatType + " " + format:version | + +Each ontology attribute uses the full ontology IRI as `trait_type` and the release URL as `value` +(for example, `{"trait_type": "https://w3id.org/ascs-ev/envited-x/hdmap/v6/", "value": "https://github.com/ASCS-eV/ontology-management-base/releases/tag/v0.1.6"}`). +Using the full ontology IRI as `trait_type` ensures each attribute is unique and machine-parseable. + +**Ontology attributes:** The attributes section SHOULD include all ontologies that the asset instance conforms to. +For an HD-Map asset, the following ontology attributes are RECOMMENDED: + +- **Domain ontology** (for example, `hdmap/v6`): identifies the simulation asset type +- **Ecosystem ontology** (`envited-x/v3`): identifies the asset as part of the ENVITED-X Data Space +- **Gaia-X ontology** (`gx`): signals conformance with the Gaia-X Trust Framework for data space interoperability +- **Georeference ontology** (`georeference/v5`): included when the asset contains geospatial reference data (OPTIONAL per the [HD-Map Ontology SHACL shapes][30]) + +The `value` for each ontology attribute SHOULD be the release URL of the [ASCS Ontology Management Base][1] version used, except for `gx` which references the [Gaia-X Policy Rules Compliance Document][17]. + +> **Note:** Fields marked as "(EVES extension)" are not part of the base ERC-721 or OpenSea standard but are defined by EVES-003 +> for interoperability with the ENVITED-X Data Space. +> Marketplaces will display `name`, `description`, `image`, `animation_url`, `external_url`, and `attributes` natively; +> EVES extension fields are consumed by the ENVITED-X portal. + +#### ERC-7572 Contract-Level Metadata (EVM) + +For EVM-based deployments, the marketplace contract SHOULD implement [ERC-7572][27] by exposing a `contractURI()` function +that returns a URI to a JSON document describing the contract/collection. + +The `contractURI()` response SHOULD include at minimum: + +- `name`: the collection name (for example, "ENVITED-X Simulation Assets") +- `description`: a description of the collection +- `image`: a collection image/logo URI +- `external_link`: URL to the ENVITED-X Data Space portal + +The contract SHOULD emit a `ContractURIUpdated()` event as defined in [ERC-7572][27] when the contract-level metadata is changed. #### Custom SPDX license identifier @@ -285,12 +393,15 @@ Examples are the first five tags or "publishers", which is always ENVITED-X and ## Backwards Compatibility -This specification introduces new processes for asset uploads and is fully compatible with existing ENVITED-X systems. -No retroactive changes to previous assets are required. +This specification introduces new processes for asset uploads. +Earlier revisions of this EVES defined a Tezos/TZIP-21 token metadata path; the ENVITED-X Data Space no longer uses Tezos, and that path has been removed. +As this specification and all its deployments are still drafts, no backwards compatibility with previously minted Tezos assets is maintained. ## Future Improvements -The compatibility with the current release of the [Gaia-X Policy Rules Compliance Document (Release 24.11)][17] is **to be implemented** in a future update of this EVES. +- The compatibility with the current release of the [Gaia-X Policy Rules Compliance Document (Release 24.11)][17] is to be implemented in a future update of this EVES. +- The point in the asset lifecycle at which minted tokens and the claimed `minter` identity are verified against an ecosystem root of trust, and the components responsible for this verification, will be specified in a future revision of this EVES. +- On-chain verification of the minting organization's key material (for example, through P-256 signature verification via [RIP-7212][32]) is a possible future extension. ## References @@ -311,10 +422,19 @@ The compatibility with the current release of the [Gaia-X Policy Rules Complianc - [RFC 2119: Key Words for Use in RFCs to Indicate Requirement Levels][16] - [Gaia-X Policy Rules Compliance Document (Release 24.11)][17] - [Marketplace Contract Reference Implementation][18] -- [TZIP-21 Ontology][19] - [ENVITED-X Simulation Asset Tools][20] - [ENVITED-X Ontology][21] - [Manifest Ontology][22] +- [OpenSea Metadata Standards][23] +- [ERC-4906: EIP-721 Metadata Update Extension][24] +- [ERC-5192: Minimal Soulbound NFTs][25] +- [ERC-721: Non-Fungible Token Standard][26] +- [ERC-7572: Contract-Level Metadata via contractURI()][27] +- [EVES-008: ENVITED-X Identity and Credential Framework][28] +- [RFC 1766: Tags for the Identification of Languages][29] +- [HD-Map Ontology][30] +- [EVES-007: ENVITED-X Blockchain Identifier URN Schema][31] +- [RIP-7212: Precompile for secp256r1 Curve Support][32] [1]: https://github.com/ASCS-eV/ontology-management-base/ [2]: https://github.com/ASCS-eV/ontology-management-base/tree/main/artifacts/gx @@ -334,7 +454,16 @@ The compatibility with the current release of the [Gaia-X Policy Rules Complianc [16]: https://datatracker.ietf.org/doc/html/rfc2119 [17]: https://docs.gaia-x.eu/policy-rules-committee/compliance-document/24.11/ [18]: https://github.com/ASCS-eV/smart-contracts/tree/main/contracts/marketplace/ -[19]: https://github.com/ASCS-eV/ontology-management-base/tree/main/artifacts/tzip21 [20]: https://github.com/openMSL/sl-5-8-asset-tools [21]: https://github.com/ASCS-eV/ontology-management-base/tree/main/artifacts/envited-x [22]: https://github.com/ASCS-eV/ontology-management-base/tree/main/artifacts/manifest +[23]: https://docs.opensea.io/docs/metadata-standards +[24]: https://eips.ethereum.org/EIPS/eip-4906 +[25]: https://eips.ethereum.org/EIPS/eip-5192 +[26]: https://eips.ethereum.org/EIPS/eip-721 +[27]: https://eips.ethereum.org/EIPS/eip-7572 +[28]: ../EVES-008/eves-008.md +[29]: https://datatracker.ietf.org/doc/html/rfc1766 +[30]: https://github.com/ASCS-eV/ontology-management-base/tree/main/artifacts/hdmap +[31]: ../EVES-007/eves-007.md +[32]: https://github.com/ethereum/RIPs/blob/master/RIPS/rip-7212.md diff --git a/EVES/EVES-003/example/envited-x_manifest.json b/EVES/EVES-003/example/envited-x_manifest.json index 568d366..4c0853a 100644 --- a/EVES/EVES-003/example/envited-x_manifest.json +++ b/EVES/EVES-003/example/envited-x_manifest.json @@ -1,734 +1,471 @@ { - "@context": { - "envited-x": "https://ontologies.envited-x.net/envited-x/v2/ontology#", - "manifest": "https://ontologies.envited-x.net/manifest/v4/ontology#", - "gx": "https://registry.lab.gaia-x.eu/development/api/trusted-shape-registry/v1/shapes/jsonld/trustframework#", - "sh": "http://www.w3.org/ns/shacl#", - "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", - "xsd": "http://www.w3.org/2001/XMLSchema#", - "skos": "http://www.w3.org/2004/02/skos/core#" - }, - "@id": "urn:uuid:896f0b9d-5626-4ddb-9d28-568f4af63603", - "@type": "envited-x:Manifest", - "manifest:hasManifestReference": { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isPublic" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isManifest" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "./envited-x_manifest.json", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "application/ld+json", - "@type": "xsd:string" - } - } - }, - "manifest:hasLicense": { - "@type": "manifest:License", - "gx:license": { - "@value": "MPL-2.0" - }, - "manifest:licenseData": { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isPublic" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isLicense" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://www.mozilla.org/en-US/MPL/2.0/", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "text/html", - "@type": "xsd:string" - } - } - } - }, - "manifest:hasArtifacts": [ - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isOwner" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isSimulationData" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://assets.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/simulation-data/Testfeld_Niedersachsen_ALKS_xodr_sample_offset.xodr", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "application/x-xodr", - "@type": "xsd:string" - }, - "manifest:fileSize": { - "@value": 645096, - "@type": "xsd:integer" - }, - "manifest:filename": { - "@value": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset.xodr", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isRegistered" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isMiscellaneous" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/simulation-data/Testfeld_Niedersachsen_ALKS_xodr_sample_offset.bjson", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "application/json", - "@type": "xsd:string" - }, - "manifest:fileSize": { - "@value": 61104, - "@type": "xsd:integer" - }, - "manifest:filename": { - "@value": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset.bjson", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isPublic" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isDocumentation" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "ipfs://bafkreif2ycyckuzyv7gc3dsccquyn6scu64johaufjtz3yqzcpbwnpb3fm", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "application/pdf", - "@type": "xsd:string" - }, - "manifest:fileSize": { - "@value": 101219, - "@type": "xsd:integer" - }, - "manifest:filename": { - "@value": "Testfeld_Niedersachsen_ALKS_..._documentation.pdf", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isRegistered" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isDocumentation" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/documentation/Testfeld_Niedersachsen_ALKS_xodr_sample_offset_documentation_stats.txt", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "text/plain", - "@type": "xsd:string" - }, - "manifest:fileSize": { - "@value": 4536, - "@type": "xsd:integer" - }, - "manifest:filename": { - "@value": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset_documentation_stats.txt", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:iri": { - "@id": "did:web:registry.gaia-x.eu:HdMap:DjHgK5ErTBow1Ya3J05tW9l12skGWgZn6kA9" - }, - "skos:note": { - "@value": "This is the domain metadata for a HD Map.", - "@type": "xsd:string" - }, - "sh:conformsTo": [ - { - "@id": "https://ontologies.envited-x.net/hdmap/v3/ontology" - } - ], - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isPublic" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isMetadata" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "ipfs://bafkreicuwg3s4uvei2iu2p5eobozghdodtwhwoi6qiawhwqj3nflrk6dxi", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "application/ld+json", - "@type": "xsd:string" - }, - "manifest:fileSize": { - "@value": 3751, - "@type": "xsd:integer" - }, - "manifest:filename": { - "@value": "hdmap_instance.json", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isRegistered" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isValidationReport" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/validation-reports/Testfeld_Niedersachsen_ALKS_xodr_sample_offset_asam_cb_xodr.xqar", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "application/x-xqar", - "@type": "xsd:string" - }, - "manifest:fileSize": { - "@value": 9524, - "@type": "xsd:integer" - }, - "manifest:filename": { - "@value": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset_asam_cb_xodr.xqar", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isPublic" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isValidationReport" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "ipfs://bafkreibdfcoiqnab7xhatxmmve3m5yb2tdcckiftwstyaheywgejeg4atq", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "text/plain", - "@type": "xsd:string" - }, - "manifest:fileSize": { - "@value": 14106, - "@type": "xsd:integer" - }, - "manifest:filename": { - "@value": "Testfeld_Niedersachsen_ALKS_..._QCReport.txt", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isRegistered" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isValidationReport" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/validation-reports/Testfeld_Niedersachsen_ALKS_xodr_sample_offset_openmsl_cb_xodr.xqar", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "application/x-xqar", - "@type": "xsd:string" - }, - "manifest:fileSize": { - "@value": 62409, - "@type": "xsd:integer" - }, - "manifest:filename": { - "@value": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset_openmsl_cb_xodr.xqar", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isPublic" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isDocumentation" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "ipfs://bafkreihvyno37kiqenic2gxvloondcsrsqh5t5dp7c7lwjbprgwg33lzci", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "text/markdown", - "@type": "xsd:string" - }, - "manifest:filename": { - "@value": "README.md", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isPublic" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isMedia" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "ipfs://bafybeief5r2xgciehzhx6c4kbooifsnbjpiifjei36lpi3kzcdmpr2wvue", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "image/png", - "@type": "xsd:string" - }, - "manifest:filename": { - "@value": "Testfeld_Niedersachsen_ALKS_..._impression-01.png", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isRegistered" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isMedia" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/Testfeld_Niedersachsen_ALKS_xodr_sample_offset_impression-02.png", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "image/png", - "@type": "xsd:string" - }, - "manifest:filename": { - "@value": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset_impression-02.png", - "@type": "xsd:string" - } + "@context": [ + "https://w3id.org/ascs-ev/envited-x/envited-x/v3/", + "https://w3id.org/ascs-ev/envited-x/manifest/v5/", + { + "gx": "https://w3id.org/gaia-x/development#", + "skos": "http://www.w3.org/2004/02/skos/core#", + "xsd": "http://www.w3.org/2001/XMLSchema#" } - }, - { + ], + "@id": "urn:uuid:896f0b9d-5626-4ddb-9d28-568f4af63603", + "@type": "envited-x:Manifest", + "hasManifestReference": { "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isRegistered" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isMedia" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/Testfeld_Niedersachsen_ALKS_xodr_sample_offset_impression-03.png", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "image/png", - "@type": "xsd:string" - }, - "manifest:filename": { - "@value": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset_impression-03.png", - "@type": "xsd:string" - } + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isManifest" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "./envited-x_manifest.json", + "mimeType": "application/ld+json" } - }, - { + }, + "hasLicense": { "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isRegistered" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isMedia" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/bbox.geojson", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "application/x-geojson", - "@type": "xsd:string" - }, - "manifest:filename": { - "@value": "bbox.geojson", - "@type": "xsd:string" - } + "iri": "did:web:registry.envited-x.net:License:MPL-2.0", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isLicense" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://www.mozilla.org/en-US/MPL/2.0/", + "mimeType": "text/html" } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isRegistered" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isMedia" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/roadNetwork.geojson", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "application/x-geojson", - "@type": "xsd:string" - }, - "manifest:filename": { - "@value": "roadNetwork.geojson", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isRegistered" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isMedia" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/3d_preview/breakLines.json", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "application/json", - "@type": "xsd:string" - }, - "manifest:filename": { - "@value": "breakLines.json", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isRegistered" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isMedia" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/3d_preview/junctions.json", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "application/json", - "@type": "xsd:string" - }, - "manifest:filename": { - "@value": "junctions.json", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isRegistered" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isMedia" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/3d_preview/laneSections.json", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "application/json", - "@type": "xsd:string" - }, - "manifest:filename": { - "@value": "laneSections.json", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isRegistered" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isMedia" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/3d_preview/lanes.json", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "application/json", - "@type": "xsd:string" - }, - "manifest:filename": { - "@value": "lanes.json", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isRegistered" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isMedia" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/3d_preview/objects.json", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "application/json", - "@type": "xsd:string" - }, - "manifest:filename": { - "@value": "objects.json", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isRegistered" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isMedia" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/3d_preview/refLine.json", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "application/json", - "@type": "xsd:string" - }, - "manifest:filename": { - "@value": "refLine.json", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isRegistered" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isMedia" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/3d_preview/roadMarks.json", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "application/json", - "@type": "xsd:string" - }, - "manifest:filename": { - "@value": "roadMarks.json", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isRegistered" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isMedia" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/3d_preview/roads.json", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "application/json", - "@type": "xsd:string" - }, - "manifest:filename": { - "@value": "roads.json", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isRegistered" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isMedia" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/3d_preview/signals.json", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "application/json", - "@type": "xsd:string" - }, - "manifest:filename": { - "@value": "signals.json", - "@type": "xsd:string" - } - } - }, - { - "@type": "manifest:Link", - "manifest:hasAccessRole": { - "@type": "manifest:AccessRole", - "@id": "envited-x:isRegistered" - }, - "manifest:hasCategory": { - "@type": "manifest:Category", - "@id": "envited-x:isValidationReport" - }, - "manifest:hasFileMetadata": { - "@type": "manifest:FileMetadata", - "manifest:filePath": { - "@value": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/validation-reports/Testfeld_Niedersachsen_ALKS_xodr_sample_offset_openmsl_cb_xodr_QCReport.txt", - "@type": "xsd:anyURI" - }, - "manifest:mimeType": { - "@value": "text/plain", - "@type": "xsd:string" - }, - "manifest:filename": { - "@value": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset_openmsl_cb_xodr_QCReport.txt", - "@type": "xsd:string" - } + }, + "hasArtifacts": [ + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isOwner" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isSimulationData" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://assets.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/simulation-data/Testfeld_Niedersachsen_ALKS_xodr_sample_offset.xodr", + "mimeType": "application/x-xodr", + "fileSize": 645096, + "filename": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset.xodr" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMiscellaneous" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/simulation-data/Testfeld_Niedersachsen_ALKS_xodr_sample_offset.bjson", + "mimeType": "application/json", + "fileSize": 61104, + "filename": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset.bjson" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isDocumentation" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "ipfs://bafkreif2ycyckuzyv7gc3dsccquyn6scu64johaufjtz3yqzcpbwnpb3fm", + "mimeType": "application/pdf", + "fileSize": 101219, + "filename": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset_documentation.pdf" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isDocumentation" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/documentation/Testfeld_Niedersachsen_ALKS_xodr_sample_offset_documentation_stats.txt", + "mimeType": "text/plain", + "fileSize": 4536, + "filename": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset_documentation_stats.txt" + } + }, + { + "@type": "manifest:Link", + "iri": "did:web:registry.gaia-x.eu:HdMap:DjHgK5ErTBow1Ya3J05tW9l12skGWgZn6kA9", + "note": "Domain metadata for the HD Map asset.", + "conformsTo": [ + "https://w3id.org/ascs-ev/envited-x/hdmap/v6/", + "https://w3id.org/ascs-ev/envited-x/manifest/v5/" + ], + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMetadata" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "ipfs://bafkreicuwg3s4uvei2iu2p5eobozghdodtwhwoi6qiawhwqj3nflrk6dxi", + "mimeType": "application/ld+json", + "fileSize": 3751, + "filename": "hdmap_instance.json" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isValidationReport" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/validation-reports/Testfeld_Niedersachsen_ALKS_xodr_sample_offset_asam_cb_xodr.xqar", + "mimeType": "application/x-xqar", + "fileSize": 9524, + "filename": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset_asam_cb_xodr.xqar" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isValidationReport" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "ipfs://bafkreibdfcoiqnab7xhatxmmve3m5yb2tdcckiftwstyaheywgejeg4atq", + "mimeType": "text/plain", + "fileSize": 14106, + "filename": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset_QCReport.txt" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isDocumentation" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "ipfs://bafkreihvyno37kiqenic2gxvloondcsrsqh5t5dp7c7lwjbprgwg33lzci", + "mimeType": "text/markdown", + "filename": "README.md" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMedia" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "ipfs://bafybeief5r2xgciehzhx6c4kbooifsnbjpiifjei36lpi3kzcdmpr2wvue", + "mimeType": "image/png", + "filename": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset_impression-01.png" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMedia" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/Testfeld_Niedersachsen_ALKS_xodr_sample_offset_impression-02.png", + "mimeType": "image/png", + "filename": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset_impression-02.png" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMedia" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/Testfeld_Niedersachsen_ALKS_xodr_sample_offset_impression-03.png", + "mimeType": "image/png", + "filename": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset_impression-03.png" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMedia" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/bbox.geojson", + "mimeType": "application/x-geojson", + "filename": "bbox.geojson" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMedia" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/roadNetwork.geojson", + "mimeType": "application/x-geojson", + "filename": "roadNetwork.geojson" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMedia" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/3d_preview/breakLines.json", + "mimeType": "application/json", + "filename": "breakLines.json" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMedia" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/3d_preview/junctions.json", + "mimeType": "application/json", + "filename": "junctions.json" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMedia" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/3d_preview/laneSections.json", + "mimeType": "application/json", + "filename": "laneSections.json" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMedia" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/3d_preview/lanes.json", + "mimeType": "application/json", + "filename": "lanes.json" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMedia" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/3d_preview/objects.json", + "mimeType": "application/json", + "filename": "objects.json" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMedia" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/3d_preview/refLine.json", + "mimeType": "application/json", + "filename": "refLine.json" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMedia" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/3d_preview/roadMarks.json", + "mimeType": "application/json", + "filename": "roadMarks.json" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMedia" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/3d_preview/roads.json", + "mimeType": "application/json", + "filename": "roads.json" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMedia" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/media/3d_preview/signals.json", + "mimeType": "application/json", + "filename": "signals.json" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isValidationReport" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/validation-reports/Testfeld_Niedersachsen_ALKS_xodr_sample_offset_openmsl_cb_xodr.xqar", + "mimeType": "application/x-xqar", + "fileSize": 62409, + "filename": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset_openmsl_cb_xodr.xqar" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isValidationReport" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "https://metadata.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm/validation-reports/Testfeld_Niedersachsen_ALKS_xodr_sample_offset_openmsl_cb_xodr_QCReport.txt", + "mimeType": "text/plain", + "filename": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset_openmsl_cb_xodr_QCReport.txt" + } } - } - ], - "manifest:hasReferencedArtifacts": [] + ], + "hasReferencedArtifacts": [] } diff --git a/EVES/EVES-003/example/tzip21_token_metadata.json b/EVES/EVES-003/example/erc721_token_metadata.json similarity index 58% rename from EVES/EVES-003/example/tzip21_token_metadata.json rename to EVES/EVES-003/example/erc721_token_metadata.json index bf3b760..e0279f3 100644 --- a/EVES/EVES-003/example/tzip21_token_metadata.json +++ b/EVES/EVES-003/example/erc721_token_metadata.json @@ -1,33 +1,67 @@ { - "decimals": 0, - "isBooleanAmount": true, "name": "TestfeldNiedersachsen_ALKS_ODR_sample", "description": "simple hdmap example file on Testfeld Niedersachsen for ALKS scenario", - "tags": [ - "GaiaX", - "ASCS", - "ENVITED-X", - "EVES", - "nft", - "ASAM OpenDRIVE 1.6" + "image": "ipfs://bafybeief5r2xgciehzhx6c4kbooifsnbjpiifjei36lpi3kzcdmpr2wvue", + "animation_url": "https://assets.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm", + "external_url": "ipfs://bafkreicuwg3s4uvei2iu2p5eobozghdodtwhwoi6qiawhwqj3nflrk6dxi", + "background_color": "111827", + "attributes": [ + { + "trait_type": "Standard", + "value": "GaiaX" + }, + { + "trait_type": "Publisher", + "value": "ASCS" + }, + { + "trait_type": "Ecosystem", + "value": "ENVITED-X" + }, + { + "trait_type": "Specification", + "value": "EVES" + }, + { + "trait_type": "Token Type", + "value": "nft" + }, + { + "trait_type": "Format", + "value": "ASAM OpenDRIVE 1.6" + }, + { + "trait_type": "https://w3id.org/ascs-ev/envited-x/hdmap/v6/", + "value": "https://github.com/ASCS-eV/ontology-management-base/releases/tag/v0.1.6" + }, + { + "trait_type": "https://w3id.org/ascs-ev/envited-x/envited-x/v3/", + "value": "https://github.com/ASCS-eV/ontology-management-base/releases/tag/v0.1.6" + }, + { + "trait_type": "https://w3id.org/gaia-x/development#", + "value": "https://docs.gaia-x.eu/policy-rules-committee/compliance-document/24.11/" + }, + { + "trait_type": "https://w3id.org/ascs-ev/envited-x/georeference/v5/", + "value": "https://github.com/ASCS-eV/ontology-management-base/releases/tag/v0.1.6" + } ], - "minter": "did:pkh:tezos:NetXnHfVqm9iesp:tz1cZaiTjNSN7x4VZjTQGYBVz4p8eEcVcYkz", + "minter": "did:ethr:0x14a34:0x50916c8e454722d2357916d4250500102288bb03", "creators": [ "Automotive Solution Center for Simulation e.V." ], + "contributors": [], "publishers": [ "Automotive Solution Center for Simulation e.V.", "ENVITED-X Data Space" ], "date": "2025-02-17T00:00:00+00:00", "type": "EVES-003 https://github.com/ASCS-eV/EVES", - "rights": "MPL-2.0", - "rightsUri": "https://www.mozilla.org/en-US/MPL/2.0/", "language": "en", - "artifactUri": "https://assets.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm", + "rights": "MPL-2.0", + "rights_uri": "https://www.mozilla.org/en-US/MPL/2.0/", "identifier": "did:web:registry.gaia-x.eu:HdMap:DjHgK5ErTBow1Ya3J05tW9l12skGWgZn6kA9", - "externalUri": "ipfs://bafkreicuwg3s4uvei2iu2p5eobozghdodtwhwoi6qiawhwqj3nflrk6dxi", - "displayUri": "ipfs://bafybeief5r2xgciehzhx6c4kbooifsnbjpiifjei36lpi3kzcdmpr2wvue", "formats": [ { "uri": "https://assets.envited-x.net/bafybeifo6ve5i6542vi6ruuflxdqtcmcisdtwlqefq2e5a33tljsaqxhpm", @@ -68,17 +102,5 @@ "fileSize": 2397906, "fileName": "Testfeld_Niedersachsen_ALKS_..._impression-01.png" } - ], - "attributes": [ - { - "name": "https://ontologies.envited-x.net/hdmap/v4/ontology#", - "value": "https://github.com/GAIA-X4PLC-AAD/ontology-management-base/releases/tag/v0.0.4", - "type": "uri" - }, - { - "name": "https://ontologies.envited-x.net/envited-x/v2/ontology#", - "value": "https://github.com/GAIA-X4PLC-AAD/ontology-management-base/releases/tag/v0.0.4", - "type": "uri" - } ] } diff --git a/EVES/EVES-003/example/input_manifest.json b/EVES/EVES-003/example/input_manifest.json index fc1265a..be3be55 100644 --- a/EVES/EVES-003/example/input_manifest.json +++ b/EVES/EVES-003/example/input_manifest.json @@ -1,72 +1,110 @@ { - "@context": [ - "https://w3id.org/ascs-ev/envited-x/manifest/v5/", - { - "envited-x": "https://w3id.org/ascs-ev/envited-x/envited-x/v3/" - } - ], - "@id": "did:web:registry.gaia-x.eu:HdMap:Testfeld_Niedersachsen_ALKS_xodr_sample_offset", - "@type": "envited-x:Manifest", - "hasArtifacts": [ - { - "@type": "Link", - "hasCategory": { "@id": "envited-x:isSimulationData" }, - "hasAccessRole": { "@id": "envited-x:isOwner" }, - "hasFileMetadata": { - "@type": "FileMetadata", - "filePath": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset.xodr", - "mimeType": "application/xml" - } - }, - { - "@type": "Link", - "hasCategory": { "@id": "envited-x:isMedia" }, - "hasAccessRole": { "@id": "envited-x:isPublic" }, - "hasFileMetadata": { - "@type": "FileMetadata", - "filePath": "impression-01.png", - "mimeType": "image/png" + "@context": [ + "https://w3id.org/ascs-ev/envited-x/envited-x/v3/", + "https://w3id.org/ascs-ev/envited-x/manifest/v5/", + { + "gx": "https://w3id.org/gaia-x/development#", + "xsd": "http://www.w3.org/2001/XMLSchema#" } - }, - { - "@type": "Link", - "hasCategory": { "@id": "envited-x:isMedia" }, - "hasAccessRole": { "@id": "envited-x:isPublic" }, - "hasFileMetadata": { - "@type": "FileMetadata", - "filePath": "impression-02.png", - "mimeType": "image/png" - } - }, - { - "@type": "Link", - "hasCategory": { "@id": "envited-x:isMedia" }, - "hasAccessRole": { "@id": "envited-x:isPublic" }, - "hasFileMetadata": { - "@type": "FileMetadata", - "filePath": "impression-03.png", - "mimeType": "image/png" + ], + "@id": "did:web:registry.gaia-x.eu:HdMap:Testfeld_Niedersachsen_ALKS_xodr_sample_offset", + "@type": "envited-x:Manifest", + "hasArtifacts": [ + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isOwner" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isSimulationData" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "Testfeld_Niedersachsen_ALKS_xodr_sample_offset.xodr", + "mimeType": "application/x-xodr" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMedia" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "impression-01.png", + "mimeType": "image/png" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMedia" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "impression-02.png", + "mimeType": "image/png" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isMedia" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "impression-03.png", + "mimeType": "image/png" + } + }, + { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isDocumentation" + }, + "hasFileMetadata": { + "@type": "manifest:FileMetadata", + "filePath": "documentation.txt", + "mimeType": "text/plain" + } } - }, - { - "@type": "Link", - "hasCategory": { "@id": "envited-x:isDocumentation" }, - "hasAccessRole": { "@id": "envited-x:isPublic" }, + ], + "hasLicense": { + "@type": "manifest:Link", + "hasAccessRole": { + "@type": "manifest:AccessRole", + "@id": "envited-x:isPublic" + }, + "hasCategory": { + "@type": "manifest:Category", + "@id": "envited-x:isLicense" + }, "hasFileMetadata": { - "@type": "FileMetadata", - "filePath": "documentation.txt", - "mimeType": "text/plain" + "@type": "manifest:FileMetadata", + "filePath": "https://www.mozilla.org/en-US/MPL/2.0/", + "mimeType": "text/html" } - } - ], - "hasLicense": { - "@type": "Link", - "hasCategory": { "@id": "envited-x:isLicense" }, - "hasAccessRole": { "@id": "envited-x:isPublic" }, - "hasFileMetadata": { - "@type": "FileMetadata", - "filePath": "https://www.mozilla.org/en-US/MPL/2.0/", - "mimeType": "text/html" - } - } + } } diff --git a/EVES/EVES-005/eves-005.md b/EVES/EVES-005/eves-005.md index e9b58e8..6a98430 100644 --- a/EVES/EVES-005/eves-005.md +++ b/EVES/EVES-005/eves-005.md @@ -169,7 +169,7 @@ Key privacy measures include: ### 7. References 1. **Dataspace Protocol:** - - [Dataspace Protocol – Official Knowledgebase](https://docs.internationaldataspaces.org/ids-knowledgebase/dataspace-protocol) + - [Dataspace Protocol – IDSA Specification Repository](https://github.com/International-Data-Spaces-Association/ids-specification) - [Eclipse Dataspace Protocol Editor's Draft](https://eclipse-dataspace-protocol-base.github.io/DataspaceProtocol/) 2. **SD-JWT-based Verifiable Credentials:** diff --git a/package-lock.json b/package-lock.json index 1429c57..0c78ac3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,6 +6,8 @@ "": { "name": "eves-specs", "devDependencies": { + "ajv-cli": "^5.0.0", + "ajv-formats": "^3.0.1", "gray-matter": "^4.0.3", "markdownlint-cli": "^0.49.0", "prettier": "^3.9.5" @@ -42,6 +44,68 @@ "dev": true, "license": "MIT" }, + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-cli": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ajv-cli/-/ajv-cli-5.0.0.tgz", + "integrity": "sha512-LY4m6dUv44HTyhV+u2z5uX4EhPYTM38Iv1jdgDJJJCyOOuqB8KtZEGjPZ2T+sh5ZIJrXUfgErYx/j3gLd3+PlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0", + "fast-json-patch": "^2.0.0", + "glob": "^7.1.0", + "js-yaml": "^3.14.0", + "json-schema-migrate": "^2.0.0", + "json5": "^2.1.3", + "minimist": "^1.2.0" + }, + "bin": { + "ajv": "dist/index.js" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -131,6 +195,13 @@ "node": ">=22.12.0" } }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -237,6 +308,50 @@ "node": ">=0.10.0" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-patch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.2.1.tgz", + "integrity": "sha512-4j5uBaTnsYAV5ebkidvxiLUYOwjQ+JSFljeqfTxCrH9bDmlCQaOJFS84oDJ2rAXZq2yskmk3ORfoP9DCwqFNig==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^2.0.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fast-json-patch/node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -255,6 +370,13 @@ } } }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, "node_modules/get-east-asian-width": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", @@ -268,6 +390,59 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/gray-matter": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", @@ -294,6 +469,25 @@ "node": ">= 4" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, "node_modules/ini": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", @@ -376,6 +570,36 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-schema-migrate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/json-schema-migrate/-/json-schema-migrate-2.0.0.tgz", + "integrity": "sha512-r38SVTtojDRp4eD6WsCqiE0eNDt4v1WalBXb9cyZYw9ai5cGtBwzRNWjHzJl38w6TxFkXAIA7h+fyX3tnrAFhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/jsonc-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", @@ -1142,6 +1366,16 @@ "dev": true, "license": "MIT" }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/parse-entities": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", @@ -1162,6 +1396,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", @@ -1201,6 +1445,16 @@ "node": ">=6" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/run-con": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.3.2.tgz", @@ -1330,6 +1584,13 @@ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true, "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" } } } diff --git a/package.json b/package.json index c5e3b5f..44ac5ee 100644 --- a/package.json +++ b/package.json @@ -8,9 +8,12 @@ "lint:links": "lychee --no-progress '**/*.md'", "lint:frontmatter": "node scripts/validate-frontmatter.mjs", "format": "prettier --write '**/*.md' '**/*.json' '**/*.yml' --ignore-path .prettierignore", - "format:check": "prettier --check '**/*.md' '**/*.json' '**/*.yml' --ignore-path .prettierignore" + "format:check": "prettier --check '**/*.md' '**/*.json' '**/*.yml' --ignore-path .prettierignore", + "validate:schemas": "ajv validate --strict=false -c ajv-formats -s EVES/EVES-003/erc721-schemas/erc721_token_metadata-schema.json -d EVES/EVES-003/example/erc721_token_metadata.json" }, "devDependencies": { + "ajv-cli": "^5.0.0", + "ajv-formats": "^3.0.1", "gray-matter": "^4.0.3", "markdownlint-cli": "^0.49.0", "prettier": "^3.9.5"