Source Code

;; title: wealth-water
;; version:
;; summary:
;; description:

;; HydroChain: Blockchain-Based Water Quality Monitoring & Compliance System Contract
;; A decentralized platform for transparent water quality tracking through IoT sensors,
;; verified laboratories, and distributed governance ensuring environmental safety standards

;; Contract governance principals
(define-data-var owner principal tx-sender)
(define-data-var admin-list (list 10 principal) (list))

;; Core water quality data storage with composite key indexing
(define-map quality-readings
  {
    site-id: uint,
    recorded-at: uint,
  }
  {
    ph-value: uint,
    oxygen-level: uint,
    turbidity: uint,
    temp-celsius: uint,
    conductivity: uint,
    tds-level: uint,
    is-verified: bool,
    verified-by: (optional principal),
  }
)

;; Authorized sensor operator registry
(define-map sensor-operators
  principal
  bool
)

;; Certified laboratory facilities database
(define-map lab-facilities
  uint
  {
    name: (string-ascii 50),
    address: (string-ascii 100),
    is-active: bool,
  }
)

;; Monitoring site locations with geographic data
(define-map monitoring-sites
  uint
  {
    site-name: (string-ascii 50),
    latitude: int,
    longitude: int,
    water-type: (string-ascii 20),
    is-active: bool,
  }
)

;; Sequential ID generators
(define-data-var next-site-id uint u1)
(define-data-var next-lab-id uint u1)

;; Error codes for access control and validation
(define-constant ERR-UNAUTHORIZED-ACCESS u1)
(define-constant ERR-INVALID-DATA-FORMAT u2)
(define-constant ERR-RECORD-NOT-FOUND u3)
(define-constant ERR-ALREADY-VERIFIED u4)
(define-constant ERR-VALUE-OUT-OF-RANGE u5)
(define-constant ERR-INVALID-PARAMETERS u6)
(define-constant ERR-DUPLICATE-RECORD u7)
(define-constant ERR-CAPACITY-EXCEEDED u8)

;; Water quality safety thresholds based on WHO and EPA standards
(define-constant MIN-SAFE-PH u650)
(define-constant MAX-SAFE-PH u850)
(define-constant MIN-OXYGEN-LEVEL u400)
(define-constant MAX-TURBIDITY u100)
(define-constant MAX-TEMPERATURE u3500)

;; Geographic coordinate validation bounds
(define-constant MAX-LATITUDE 90000000)
(define-constant MIN-LATITUDE -90000000)
(define-constant MAX-LONGITUDE 180000000)
(define-constant MIN-LONGITUDE -180000000)

;; System capacity and measurement constraints
(define-constant MAX-TIMESTAMP u281474976710655)
(define-constant MAX-ADMIN-COUNT u10)
(define-constant MAX-PH-VALUE u1400)
(define-constant MAX-TEMP-VALUE u10000)

;; Validates non-empty text input
(define-private (is-valid-text (text (string-ascii 100)))
  (> (len text) u0)
)

;; Validates water body classification against approved types
(define-private (is-valid-water-type (water-type (string-ascii 20)))
  (or
    (is-eq water-type "river")
    (is-eq water-type "lake")
    (is-eq water-type "ocean")
    (is-eq water-type "reservoir")
    (is-eq water-type "groundwater")
    (is-eq water-type "stream")
    (is-eq water-type "wetland")
    (is-eq water-type "estuary")
    (is-eq water-type "spring")
    (is-eq water-type "pond")
  )
)

;; Validates geographic coordinates within Earth's boundaries
(define-private (are-coordinates-valid
    (lat int)
    (lon int)
  )
  (and
    (>= lat MIN-LATITUDE)
    (<= lat MAX-LATITUDE)
    (>= lon MIN-LONGITUDE)
    (<= lon MAX-LONGITUDE)
  )
)

;; Checks if monitoring site exists in registry
(define-private (does-site-exist (site-id uint))
  (and
    (> site-id u0)
    (< site-id (var-get next-site-id))
    (is-some (map-get? monitoring-sites site-id))
  )
)

;; Validates timestamp is within acceptable range
(define-private (is-valid-timestamp (timestamp uint))
  (and
    (> timestamp u0)
    (<= timestamp MAX-TIMESTAMP)
  )
)

;; Validates all water quality parameters are within measurement ranges
(define-private (are-parameters-valid
    (ph uint)
    (oxygen uint)
    (turbidity uint)
    (temp uint)
    (conductivity uint)
    (tds uint)
  )
  (and
    (and (>= ph u0) (<= ph MAX-PH-VALUE))
    (>= oxygen u0)
    (>= turbidity u0)
    (and (>= temp u0) (<= temp MAX-TEMP-VALUE))
    (>= conductivity u0)
    (>= tds u0)
  )
)

;; Checks if user is in administrator list
(define-read-only (is-admin (user principal))
  (is-some (index-of (var-get admin-list) user))
)

;; Checks if user is contract owner
(define-read-only (is-owner (user principal))
  (is-eq user (var-get owner))
)

;; Checks if user has administrative privileges
(define-read-only (has-admin-rights (user principal))
  (or (is-owner user) (is-admin user))
)

;; Checks if user is authorized sensor operator
(define-read-only (is-sensor-operator (operator principal))
  (default-to false (map-get? sensor-operators operator))
)

;; Initializes platform (reserved for future upgrades)
(define-public (initialize-platform)
  (begin
    (asserts! (is-owner tx-sender) (err ERR-UNAUTHORIZED-ACCESS))
    (ok true)
  )
)

;; Grants administrative privileges to new user
(define-public (grant-admin-role (new-admin principal))
  (begin
    (asserts! (has-admin-rights tx-sender) (err ERR-UNAUTHORIZED-ACCESS))
    (asserts! (is-none (index-of (var-get admin-list) new-admin))
      (err ERR-DUPLICATE-RECORD)
    )

    (let ((current-admins (var-get admin-list)))
      (asserts! (< (len current-admins) MAX-ADMIN-COUNT)
        (err ERR-CAPACITY-EXCEEDED)
      )

      (let ((updated-admins (unwrap! (as-max-len? (concat current-admins (list new-admin)) u10)
          (err ERR-CAPACITY-EXCEEDED)
        )))
        (var-set admin-list updated-admins)
        (ok true)
      )
    )
  )
)

;; Revokes administrative privileges from user
(define-public (revoke-admin-role (admin-to-remove principal))
  (begin
    (asserts! (is-owner tx-sender) (err ERR-UNAUTHORIZED-ACCESS))
    (asserts! (is-some (index-of (var-get admin-list) admin-to-remove))
      (err ERR-RECORD-NOT-FOUND)
    )

    (let (
        (current-admins (var-get admin-list))
        (admin-position (unwrap! (index-of current-admins admin-to-remove)
          (err ERR-RECORD-NOT-FOUND)
        ))
      )
      (if (is-eq admin-position u0)
        (if (is-eq (len current-admins) u1)
          (var-set admin-list (list))
          (var-set admin-list
            (unwrap! (slice? current-admins u1 (len current-admins))
              (err ERR-RECORD-NOT-FOUND)
            ))
        )
        (let (
            (before-target (unwrap! (slice? current-admins u0 admin-position)
              (err ERR-RECORD-NOT-FOUND)
            ))
            (after-target (if (< (+ admin-position u1) (len current-admins))
              (unwrap!
                (slice? current-admins (+ admin-position u1) (len current-admins))
                (err ERR-RECORD-NOT-FOUND)
              )
              (list)
            ))
          )
          (var-set admin-list
            (unwrap! (as-max-len? (concat before-target after-target) u10)
              (err ERR-CAPACITY-EXCEEDED)
            ))
        )
      )
      (ok true)
    )
  )
)

Functions (11)

FunctionAccessArgs
is-valid-textprivatetext: (string-ascii 100
is-valid-water-typeprivatewater-type: (string-ascii 20
does-site-existprivatesite-id: uint
is-valid-timestampprivatetimestamp: uint
is-adminread-onlyuser: principal
is-ownerread-onlyuser: principal
has-admin-rightsread-onlyuser: principal
is-sensor-operatorread-onlyoperator: principal
initialize-platformpublic
grant-admin-rolepublicnew-admin: principal
revoke-admin-rolepublicadmin-to-remove: principal