Source Code

(impl-trait .dao-trait.dao-trait)
(use-trait ft-trait .ft-trait.ft-trait)
(use-trait nft-trait .nft-trait.nft-trait)
(use-trait treasury-trait .treasury-trait.treasury-trait)

;; errors
(define-constant err-empty-string u100)
(define-constant err-member-already-exists u102)
(define-constant err-not-authorized u401)
(define-constant err-member-not-found u404)

;; constants
(define-constant contract-owner tx-sender)

;; data maps and vars
(define-data-var dao-name (string-ascii 256) "StackerDAO")
(define-data-var number-of-members uint u0)
(define-data-var number-of-historical-members uint u0)
(define-map dao-members { member: principal } { name: (string-ascii 256) })

;; public functions

(define-public (move-stx (treasury <treasury-trait>) (amount uint) (recipient principal))
  (begin
    (asserts! (is-eq tx-sender contract-owner) (err err-not-authorized))
    (try! (as-contract (contract-call? treasury move-stx amount recipient)))
    (ok true)
  )
)

(define-public (move-ft (treasury <treasury-trait>) (ft <ft-trait>) (amount uint) (recipient principal))
  (begin
    (asserts! (is-eq tx-sender contract-owner) (err err-not-authorized))
    (try! (as-contract (contract-call? treasury move-ft ft amount recipient)))
    (ok true)
  )
)

(define-public (move-nft (treasury <treasury-trait>) (nft <nft-trait>) (token-id uint) (recipient principal))
  (begin
    (asserts! (is-eq tx-sender contract-owner) (err err-not-authorized))
    (try! (as-contract (contract-call? treasury move-nft nft token-id recipient)))
    (ok true)
  )
)

(define-public (set-dao-name (new-dao-name (string-ascii 256)))
  (begin
    (asserts! (> (len new-dao-name) u0) (err err-empty-string))
    (var-set dao-name new-dao-name)
    (ok new-dao-name)
  )
)

(define-public (set-name (member principal) (new-member-name (string-ascii 256)))
  (begin
    (asserts! (is-eq member tx-sender) (err err-not-authorized))
    (asserts! (> (len new-member-name) u0) (err err-empty-string))
    (ok (map-set dao-members { member: member } { name: new-member-name }))
  )
)

(define-public (add-member (member-to-add principal) (name (string-ascii 256)))
  (begin
    (asserts! (not (unwrap-panic (is-member member-to-add))) (err err-member-already-exists))
    (asserts! (> (len name) u0) (err err-empty-string))

    (map-insert dao-members { member: member-to-add } { name: name })
    (var-set number-of-members (+ (var-get number-of-members) u1))
    (var-set number-of-historical-members (+ (var-get number-of-historical-members) u1))
    (ok member-to-add)
  )
)

(define-public (remove-member (member-to-remove principal))
  (begin
    (asserts! (unwrap-panic (is-member member-to-remove)) (err err-member-not-found))

    (map-delete dao-members { member: member-to-remove })
    (var-set number-of-members (- (var-get number-of-members) u1))
    (ok member-to-remove)
  )
)

;; read-only functions

(define-read-only (get-version)
  (ok "1.0.0")
)

(define-read-only (get-name)
  (ok (var-get dao-name))
)

(define-read-only (is-member (user principal))
  (ok
    (is-some
      (map-get? dao-members { member: user })
    )
  )
)

(define-read-only (get-number-of-members)
  (var-get number-of-members)
)

(define-read-only (get-number-of-historical-members)
  (var-get number-of-historical-members)
)

(define-read-only (get-member-name (member-address principal))
  (map-get? dao-members {member: member-address})
)

Functions (13)

FunctionAccessArgs
move-stxpublictreasury: <treasury-trait>, amount: uint, recipient: principal
move-ftpublictreasury: <treasury-trait>, ft: <ft-trait>, amount: uint, recipient: principal
move-nftpublictreasury: <treasury-trait>, nft: <nft-trait>, token-id: uint, recipient: principal
set-dao-namepublicnew-dao-name: (string-ascii 256
set-namepublicmember: principal, new-member-name: (string-ascii 256
add-memberpublicmember-to-add: principal, name: (string-ascii 256
remove-memberpublicmember-to-remove: principal
get-versionread-only
get-nameread-only
is-memberread-onlyuser: principal
get-number-of-membersread-only
get-number-of-historical-membersread-only
get-member-nameread-onlymember-address: principal