Source Code

;; Conquistador: Decentralized Escrow and Reputation Management

(define-constant CONTRACT-OWNER tx-sender)
(define-constant ERR-UNAUTHORIZED (err u1))
(define-constant ERR-INSUFFICIENT-FUNDS (err u2))
(define-constant ERR-INVALID-RECIPIENT (err u3))
(define-constant ERR-TRANSACTION-NOT-FOUND (err u4))
(define-constant ERR-INVALID-POINTS (err u5))
(define-constant ERR-INVALID-TRANSACTION-ID (err u6))

;; Validate recipient is not the sender
(define-private (is-valid-recipient (recipient principal))
  (and 
    (not (is-eq recipient tx-sender))
    (not (is-eq recipient CONTRACT-OWNER))
  )
)

;; Validate transaction ID
(define-private (is-valid-transaction-id (id uint))
  (and 
    (> id u0)
    (< id (var-get next-transaction-id))
  )
)

;; Transaction Map
(define-map transactions 
  { id: uint }
  {
    sender: principal,
    recipient: principal,
    amount: uint,
    status: (string-ascii 20),
    created-at: uint,
    reputation-points: uint
  }
)

;; User Reputation Map
(define-map user-reputation 
  { user: principal }
  { total-points: uint, total-transactions: uint }
)

;; Generate unique transaction ID
(define-data-var next-transaction-id uint u1)

;; Create new transaction
(define-public (create-transaction 
  (recipient principal) 
  (amount uint)
)
  (begin
    ;; Validate recipient
    (asserts! (is-valid-recipient recipient) ERR-INVALID-RECIPIENT)

    ;; Validate amount
    (asserts! (> amount u0) ERR-INSUFFICIENT-FUNDS)

    (let 
      (
        (transaction-id (var-get next-transaction-id))
      )
      ;; Increment transaction ID
      (var-set next-transaction-id (+ transaction-id u1))

      ;; Store transaction
      (map-set transactions 
        { id: transaction-id }
        {
          sender: tx-sender,
          recipient: recipient,
          amount: amount,
          status: "PENDING",
          created-at: stacks-block-height,
          reputation-points: u0
        }
      )

      (ok transaction-id)
    )
  )
)

;; Release funds to recipient
(define-public (release-funds (transaction-id uint))
  (begin
    ;; Validate transaction ID
    (asserts! (is-valid-transaction-id transaction-id) ERR-INVALID-TRANSACTION-ID)

    (let 
      (
        (transaction (unwrap! 
          (map-get? transactions { id: transaction-id }) 
          ERR-TRANSACTION-NOT-FOUND
        ))
      )
      ;; Validate sender authorization
      (asserts! 
        (is-eq tx-sender (get sender transaction)) 
        ERR-UNAUTHORIZED
      )

      ;; Transfer STX
      (try! (stx-transfer? 
        (get amount transaction) 
        tx-sender 
        (get recipient transaction)
      ))

      ;; Update transaction status
      (map-set transactions 
        { id: transaction-id }
        (merge transaction { status: "COMPLETED" })
      )

      (ok true)
    )
  )
)

;; Add reputation points
(define-public (add-reputation-points 
  (transaction-id uint) 
  (points uint)
)
  (begin
    ;; Validate transaction ID
    (asserts! (is-valid-transaction-id transaction-id) ERR-INVALID-TRANSACTION-ID)

    (let 
      (
        (transaction (unwrap! 
          (map-get? transactions { id: transaction-id }) 
          ERR-TRANSACTION-NOT-FOUND
        ))
        (sender (get sender transaction))
        (recipient (get recipient transaction))
      )
      ;; Validate recipient authorization and points
      (asserts! 
        (is-eq tx-sender recipient) 
        ERR-UNAUTHORIZED
      )
      (asserts! (> points u0) ERR-INVALID-POINTS)

      ;; Update user reputation
      (map-set user-reputation 
        { user: sender }
        {
          total-points: (+ 
            (get total-points 
              (default-to 
                { total-points: u0, total-transactions: u0 } 
                (map-get? user-reputation { user: sender })
              )
            )
            points
          ),
          total-transactions: (+ 
            (get total-transactions 
              (default-to 
                { total-points: u0, total-transactions: u0 } 
                (map-get? user-reputation { user: sender })
              )
            )
            u1
          )
        }
      )

      ;; Update transaction reputation points
      (map-set transactions 
        { id: transaction-id }
        (merge transaction { reputation-points: points })
      )

      (ok true)
    )
  )
)

;; Get user reputation
(define-read-only (get-user-reputation (user principal))
  (default-to 
    { total-points: u0, total-transactions: u0 }
    (map-get? user-reputation { user: user })
  )
)

;; Get transaction details
(define-read-only (get-transaction-details (transaction-id uint))
  (map-get? transactions { id: transaction-id })
)

Functions (5)

FunctionAccessArgs
is-valid-recipientprivaterecipient: principal
is-valid-transaction-idprivateid: uint
release-fundspublictransaction-id: uint
get-user-reputationread-onlyuser: principal
get-transaction-detailsread-onlytransaction-id: uint