Skip to main content

Submission Process

The submission process is how asset owners provide information about their real-world assets for verification. It is a structured, multi-step form that collects device specifications, location data, financial projections, and supporting documentation.

Submission Form

The form is divided into logical sections that progressively collect deeper detail about the asset:

Step 1: Device Information

Basic identification of the physical asset or device being tokenized.

FieldDescriptionExample
Device NameModel or product identifier"AquaPure Water Purifier WP-3000"
Device TypeCategory of the asset"Water Purification System"
ManufacturerCompany that produced the device"AquaPure Technologies"
Serial NumberUnique device identifier"WP3000-2026-00142"
Installation DateWhen the device was deployed2026-01-15
SpecificationsTechnical specs (capacity, output, etc.)JSON object with device-specific fields

Step 2: Location

Geographic and operational context for the asset.

FieldDescriptionExample
AddressPhysical location of the asset"Av. Comandante San Martin 1200"
CityCity of deployment"Arica"
CountryCountry code"CL" (Chile)
CoordinatesGPS latitude/longitude-18.4783, -70.3126
Operational ZoneRegulatory jurisdiction"Region de Arica y Parinacota"

Step 3: Financial Information

Revenue projections and cost structure for the asset.

FieldDescriptionExample
Estimated RevenueMonthly/annual revenue projection$2,400/month
Operating CostsRecurring operational expenses$800/month
Capital ExpenditureInitial investment cost$15,000
Payback PeriodExpected time to ROI8 months
Revenue ModelHow revenue is generated"Per-liter water sales"

Step 4: Documents

Supporting evidence uploaded as file attachments.

Document TypePurposeFormats
Proof of OwnershipLegal ownership documentationPDF, JPG, PNG
Installation PhotosVisual evidence of deploymentJPG, PNG
Technical CertificationsSafety or quality certificationsPDF
Financial StatementsRevenue or cost documentationPDF, XLSX
Permits and LicensesRegulatory approvalsPDF

Files are uploaded to Google Cloud Storage and referenced by URL in the submission record.

Submission States

Every submission follows a defined state machine:

DRAFT --> PENDING --> UNDER_REVIEW --> APPROVED --> (Certificate Issued)
\-> REJECTED --> APPEAL --> UNDER_REVIEW
StateDescriptionWho Transitions
DRAFTSubmission is incomplete; user is still filling out the formUser (auto)
PENDINGUser has submitted; awaiting validator reviewUser (submit action)
UNDER_REVIEWA validator has picked up the submissionValidator (admin)
APPROVEDSubmission passed review; certificate is issuedValidator (admin)
REJECTEDSubmission did not pass review; reason providedValidator (admin)
APPEALUser disputes rejection; resubmitted for second reviewUser (appeal action)

State Transition Rules

  • A submission can only move forward in the pipeline (no skipping states).
  • DRAFT submissions are only visible to the owner.
  • REJECTED submissions include a reason field explaining what was insufficient.
  • APPEAL resets the submission back to UNDER_REVIEW for a fresh evaluation.
  • Once APPROVED, the state is final and a certificate is generated.

Data Integrity

SHA-256 Hashing

Every submission produces a deterministic hash that serves as its fingerprint:

  1. Canonical JSON normalization -- All submission fields are serialized into a canonical JSON format. Keys are sorted alphabetically, whitespace is stripped, and values are normalized (trimmed strings, consistent number formatting).

  2. SHA-256 digest -- The canonical JSON string is hashed with SHA-256 to produce a 32-byte digest, represented as a 0x-prefixed hexadecimal string.

  3. Immutability -- Once a submission moves to APPROVED, the hash is locked. Any modification to the underlying data would produce a different hash, making tampering detectable.

Submission Data --> Canonical JSON --> SHA-256 --> 0x-prefixed hash

The hash is used throughout the certificate and on-chain attestation pipeline. It serves as the unique identifier that links the off-chain data to the on-chain record.

Canonical JSON Format

The normalization process ensures that the same logical data always produces the same hash, regardless of field ordering or formatting differences:

{
"deviceInfo": {
"deviceName": "AquaPure Water Purifier WP-3000",
"deviceType": "Water Purification System",
"manufacturer": "AquaPure Technologies"
},
"financials": {
"capitalExpenditure": 15000,
"estimatedRevenue": 2400,
"operatingCosts": 800
},
"location": {
"city": "Arica",
"country": "CL",
"coordinates": [-18.4783, -70.3126]
},
"scores": {
"environmental": 88,
"financial": 85,
"overall": 90,
"regulatory": 92,
"technical": 95
},
"wallets": {
"owner": "GBDM6KRXXJHKVYFJPTPW3WBDKUYVCH7NNEI67DDCP7YX4UHX2GODPHGI"
}
}

File Storage

Document attachments are stored on Google Cloud Storage with the following conventions:

  • Bucket: Dedicated GCS bucket for validator uploads
  • Path structure: submissions/{submissionId}/{documentType}/{filename}
  • Access control: Files are private by default; accessible only through signed URLs generated by the backend
  • Size limits: Individual files are capped to prevent abuse
  • Supported formats: PDF, JPG, PNG, XLSX

Files are referenced in the submission record by their GCS URI. The frontend displays previews for images and download links for documents.

API Endpoints

The submission lifecycle is managed through the following API routes:

MethodEndpointDescription
POST/api/submissionsCreate a new draft submission
PUT/api/submissions/:idUpdate a draft submission
POST/api/submissions/:id/submitMove from DRAFT to PENDING
GET/api/submissions/:idGet submission details
GET/api/submissionsList user's submissions
POST/api/submissions/:id/appealAppeal a rejected submission

Admin-only endpoints for validators:

MethodEndpointDescription
GET/api/admin/submissionsList all pending submissions
POST/api/admin/submissions/:id/reviewStart review (PENDING to UNDER_REVIEW)
POST/api/admin/submissions/:id/approveApprove with scores
POST/api/admin/submissions/:id/rejectReject with reason