Source Code

;; Parametric Insurance Contract
;; Automatic payouts based on predefined parameters

(define-constant contract-owner tx-sender)
(define-data-var next-policy-id uint u1)

(define-map policies
  uint
  {
    holder: principal,
    coverage-amount: uint,
    premium: uint,
    trigger-condition: (string-ascii 64),
    trigger-value: uint,
    active: bool,
    expiry: uint
  }
)

(define-map claims uint { policy-id: uint, triggered: bool, payout: uint, timestamp: uint })
(define-data-var next-claim-id uint u1)

(define-read-only (get-policy (policy-id uint))
  (map-get? policies policy-id)
)

(define-public (create-policy (coverage uint) (premium uint) (condition (string-ascii 64)) (trigger uint) (duration uint))
  (let ((policy-id (var-get next-policy-id)))
    (try! (stx-transfer? premium tx-sender (as-contract tx-sender)))
    (map-set policies policy-id {
      holder: tx-sender,
      coverage-amount: coverage,
      premium: premium,
      trigger-condition: condition,
      trigger-value: trigger,
      active: true,
      expiry: (+ block-height duration)
    })
    (var-set next-policy-id (+ policy-id u1))
    (ok policy-id)
  )
)

(define-public (trigger-payout (policy-id uint) (observed-value uint))
  (let ((policy (unwrap! (map-get? policies policy-id) (err u100))))
    (asserts! (is-eq tx-sender contract-owner) (err u101))
    (asserts! (get active policy) (err u102))
    (asserts! (< block-height (get expiry policy)) (err u103))
    
    (if (>= observed-value (get trigger-value policy))
      (let ((claim-id (var-get next-claim-id)))
        (try! (as-contract (stx-transfer? (get coverage-amount policy) tx-sender (get holder policy))))
        (map-set claims claim-id {
          policy-id: policy-id,
          triggered: true,
          payout: (get coverage-amount policy),
          timestamp: block-height
        })
        (map-set policies policy-id (merge policy { active: false }))
        (var-set next-claim-id (+ claim-id u1))
        (ok (get coverage-amount policy))
      )
      (ok u0)
    )
  )
)

(define-public (cancel-policy (policy-id uint))
  (let ((policy (unwrap! (map-get? policies policy-id) (err u100))))
    (asserts! (is-eq tx-sender (get holder policy)) (err u101))
    (asserts! (get active policy) (err u102))
    (map-set policies policy-id (merge policy { active: false }))
    (ok true)
  )
)

Functions (4)

FunctionAccessArgs
get-policyread-onlypolicy-id: uint
create-policypubliccoverage: uint, premium: uint, condition: (string-ascii 64
trigger-payoutpublicpolicy-id: uint, observed-value: uint
cancel-policypublicpolicy-id: uint