Source Code

;; A simple escrow system for secure peer-to-peer transactions
;; TrustBridge: P2P Trust and Payment Protocol

(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-NO-AUTH (err u1))
(define-constant ERR-LOW-VALUE (err u2))
(define-constant ERR-INVALID-USER (err u3))
(define-constant ERR-NO-PAYMENT (err u4))
(define-constant ADMIN tx-sender)
(define-constant ERR-NOT-AUTHORIZED (err u100))
(define-constant ERR-ZERO-AMOUNT (err u101))
(define-constant ERR-SELF-DEAL (err u102))
(define-constant ERR-DEAL-NOT-EXIST (err u103))
(define-constant ERR-BAD-RATING (err u104))
(define-constant ERR-INVALID-DEAL-ID (err u105))

;; Basic payment storage
(define-map payments
  { id: uint }
  {
    from: principal,
    to: principal,
    amount: uint,
    is-complete: bool,
    created-at: uint,
  }
)
;; Check if deal parties are different
(define-private (validate-counterparty (counterparty principal))
  (and
    (not (is-eq counterparty tx-sender))
    (not (is-eq counterparty ADMIN))
  )
)

;; Payment counter
(define-data-var payment-id-counter uint u1)
;; (define-data-var user principal 'SP3X1Q4Z2F5J7Y6G9K8H9F5J4D5J4D5J4D5J4D5J4D5J4D)
(define-private (validate-deal-id (deal-id uint))
  (and
    (> deal-id u0)
    (< deal-id (var-get deal-counter))
  )
)

;;;;  Create new payment
;; (define-public (create-payment 
;;   (recipient principal) 
;;   (amount uint)))
;; Deal storage
(define-map deals
  { deal-id: uint }
  {
    initiator: principal,
    counterparty: principal,
    value: uint,
    state: (string-ascii 20),
    timestamp: uint,
    trust-score: uint,
  }
)

;; Trust profiles
(define-map trust-profiles
  { address: principal }
  {
    cumulative-score: uint,
    deal-count: uint,
  }
)

;; Deal counter
(define-data-var deal-counter uint u1)

;; Check if user is valid
(define-private (is-valid-user (recipient principal))
  (and
    (not (is-eq recipient tx-sender))
    (not (is-eq recipient ADMIN))
  )
)

;; Initiate new deal
(define-public (initiate-deal
    (counterparty principal)
    (value uint)
  )
  (begin
    (asserts! (is-valid-user counterparty) ERR-INVALID-USER)
    (asserts! (> value u0) ERR-LOW-VALUE)
    ;; Validate counterparty
    (asserts! (validate-counterparty counterparty) ERR-SELF-DEAL)

    ;; Validate value
    (asserts! (> value u0) ERR-ZERO-AMOUNT)

    (let (
        (id (var-get payment-id-counter))
        (current-deal-id (var-get deal-counter))
      )
      (var-set payment-id-counter (+ id u1))
      ;; Update deal counter
      (var-set deal-counter (+ current-deal-id u1))

      (map-set payments { id: id } {
        from: tx-sender,
        to: counterparty,
        amount: value,
        is-complete: false,
        created-at: stacks-block-height,
      })

      ;; Record deal
      (map-set deals { deal-id: current-deal-id } {
        initiator: tx-sender,
        counterparty: counterparty,
        value: value,
        state: "OPEN",
        timestamp: stacks-block-height,
        trust-score: u0,
      })

      (ok current-deal-id)
    )
  )
)

;; Complete payment
(define-public (complete-payment (payment-id uint))
  (let ((payment (unwrap! (map-get? payments { id: payment-id }) ERR-NO-PAYMENT)))
    (asserts! (is-eq tx-sender (get from payment)) ERR-NO-AUTH)

    ;; Process the payment
    (try! (stx-transfer? (get amount payment) tx-sender (get to payment)))

    ;; Update payment status
    (map-set payments { id: payment-id } (merge payment { is-complete: true }))

    ;; Return success
    (ok true)
  )
)

;; Add trust rating
(define-public (rate-counterparty
    (deal-id uint)
    (rating uint)
  )
  (begin
    ;; Validate deal
    (asserts! (validate-deal-id deal-id) ERR-INVALID-DEAL-ID)

    (let (
        (deal (unwrap! (map-get? deals { deal-id: deal-id }) ERR-DEAL-NOT-EXIST))
        (initiator (get initiator deal))
        (counterparty (get counterparty deal))
      )
      ;; Verify rater
      (asserts! (is-eq tx-sender counterparty) ERR-NOT-AUTHORIZED)
      (asserts! (> rating u0) ERR-BAD-RATING)

      ;; Update trust profile
      (map-set trust-profiles { address: initiator } {
        cumulative-score: (+
          (get cumulative-score
            (default-to {
              cumulative-score: u0,
              deal-count: u0,
            }
              (map-get? trust-profiles { address: initiator })
            ))
          rating
        ),
        deal-count: (+
          (get deal-count
            (default-to {
              cumulative-score: u0,
              deal-count: u0,
            }
              (map-get? trust-profiles { address: initiator })
            ))
          u1
        ),
      })

      ;; Update deal rating
      (map-set deals { deal-id: deal-id } (merge deal { trust-score: rating }))

      (ok true)
    )
  )
)

;; Query trust profile
(define-read-only (get-trust-profile (address principal))
  (default-to {
    cumulative-score: u0,
    deal-count: u0,
  }
    (map-get? trust-profiles { address: address })
  )
)

;; Get payment details
(define-read-only (get-payment-info (payment-id uint))
  (map-get? payments { id: payment-id })
)
;; Query deal information
(define-read-only (get-deal-info (deal-id uint))
  (map-get? deals { deal-id: deal-id })
)

Functions (7)

FunctionAccessArgs
validate-counterpartyprivatecounterparty: principal
validate-deal-idprivatedeal-id: uint
is-valid-userprivaterecipient: principal
complete-paymentpublicpayment-id: uint
get-trust-profileread-onlyaddress: principal
get-payment-inforead-onlypayment-id: uint
get-deal-inforead-onlydeal-id: uint