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