;; 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 })
)