Source Code

(define-non-fungible-token real-estate-nft uint)

(define-data-var token-id-nonce uint u0)

(define-map token-property uint 
  {legal-description: (string-ascii 256), 
   address: (string-ascii 256), 
   geo-json: (string-ascii 512), 
   parcel-id: (string-ascii 64),
   legal-owner: principal,
   operating-agreement-hash: (buff 32),
   manager: principal})

(define-map token-debt uint {debt-token: principal, debt-amount: uint, foreclosed: bool})

(define-constant contract-owner tx-sender)
(define-constant err-not-owner (err u100))
(define-constant err-not-manager (err u101))
(define-constant err-already-foreclosed (err u102))

(define-read-only (get-last-token-id)
  (ok (var-get token-id-nonce)))

(define-read-only (get-owner (token-id uint))
  (ok (unwrap! (nft-get-owner? real-estate-nft token-id) err-not-owner)))

(define-read-only (get-property-info (token-id uint))
  (ok (unwrap! (map-get? token-property token-id) err-not-owner)))

(define-read-only (get-debt-info (token-id uint))
  (ok (unwrap! (map-get? token-debt token-id) err-not-owner)))

(define-public (mint 
  (recipient principal)
  (legal-description (string-ascii 256))
  (address (string-ascii 256))
  (geo-json (string-ascii 512))
  (parcel-id (string-ascii 64))
  (legal-owner principal)
  (operating-agreement-hash (buff 32))
  (manager principal))
  (let ((new-id (+ (var-get token-id-nonce) u1)))
    (try! (nft-mint? real-estate-nft new-id recipient))
    (map-set token-property new-id 
      {legal-description: legal-description, address: address, geo-json: geo-json, 
       parcel-id: parcel-id, legal-owner: legal-owner, 
       operating-agreement-hash: operating-agreement-hash, manager: manager})
    (map-set token-debt new-id {debt-token: contract-owner, debt-amount: u0, foreclosed: false})
    (var-set token-id-nonce new-id)
    (ok new-id)))

(define-public (set-debt (token-id uint) (debt-token principal) (debt-amount uint))
  (let ((property (unwrap! (map-get? token-property token-id) err-not-owner)))
    (asserts! (is-eq tx-sender (get manager property)) err-not-manager)
    (map-set token-debt token-id {debt-token: debt-token, debt-amount: debt-amount, foreclosed: false})
    (ok true)))

(define-public (foreclose (token-id uint))
  (let ((property (unwrap! (map-get? token-property token-id) err-not-owner))
        (debt (unwrap! (map-get? token-debt token-id) err-not-owner)))
    (asserts! (is-eq tx-sender (get manager property)) err-not-manager)
    (asserts! (not (get foreclosed debt)) err-already-foreclosed)
    (map-set token-debt token-id (merge debt {foreclosed: true}))
    (ok true)))

(define-public (transfer (token-id uint) (sender principal) (recipient principal))
  (begin
    (asserts! (is-eq tx-sender sender) err-not-owner)
    (try! (nft-transfer? real-estate-nft token-id sender recipient))
    (ok true)))

(define-read-only (get-contract-hash)
  (contract-hash? .real-estate-nft))

(define-read-only (get-block-time)
  stacks-block-time)

Functions (10)

FunctionAccessArgs
get-last-token-idread-only
get-ownerread-onlytoken-id: uint
get-property-inforead-onlytoken-id: uint
get-debt-inforead-onlytoken-id: uint
mintpublicrecipient: principal, legal-description: (string-ascii 256
set-debtpublictoken-id: uint, debt-token: principal, debt-amount: uint
foreclosepublictoken-id: uint
transferpublictoken-id: uint, sender: principal, recipient: principal
get-contract-hashread-only
get-block-timeread-only