Source Code

(define-data-var admin principal tx-sender)
(define-data-var removing-code (string-ascii 30) "")
(define-map referral-codes (string-ascii 30) principal)
(define-map address-to-codes principal (list 50 (string-ascii 30)))
(define-constant ERR-LIST-OVERFLOW u102)

;; Admin address
;; Variable used to store the code to be removed from a list
;; Map: referral code -> owner
;; Map: address -> list of referral codes
;; Error constant for list overflow

;; Private function to filter out a code from a list
(define-private (remove-code-from-list (c (string-ascii 30)))
  (not (is-eq c (var-get removing-code))))

;; Add a referral code for a user
(define-public (generate-referral-code (code (string-ascii 30)))
  (begin
    (asserts! (is-none (map-get? referral-codes code)) (err u100))
    (let ((sender tx-sender))
      (map-set referral-codes code sender)
      (let ((existing (default-to (list) (map-get? address-to-codes sender))))
        (begin
          (asserts! (< (len existing) u50) (err u101))
          ;; Aggiungi in fondo alla lista, controllando overflow
          (map-set address-to-codes sender
            (unwrap! (as-max-len? (append existing code) u50) (err ERR-LIST-OVERFLOW)))
          (ok true))))))

;; Get the owner of a referral code
(define-read-only (get-referral-address (code (string-ascii 30)))
  (map-get? referral-codes code))

;; Get all referral codes for a user
(define-read-only (get-referral-codes (addr principal))
  (map-get? address-to-codes addr))

;; Remove a referral code (admin only)
(define-public (admin-delete-referral-code (code (string-ascii 30)))
  (begin
    (asserts! (is-eq tx-sender (var-get admin)) (err u401))
    (let ((owner-opt (map-get? referral-codes code)))
      (match owner-opt some-owner
        (begin
          (var-set removing-code code)
          (let (
              (existing (default-to (list) (map-get? address-to-codes some-owner)))
              (filtered (filter remove-code-from-list existing))
            )
            (begin
              (map-delete referral-codes code)
              (map-set address-to-codes some-owner filtered)
              (ok true))))
        (err u404)))))

Functions (5)

FunctionAccessArgs
remove-code-from-listprivatec: (string-ascii 30
generate-referral-codepubliccode: (string-ascii 30
get-referral-addressread-onlycode: (string-ascii 30
get-referral-codesread-onlyaddr: principal
admin-delete-referral-codepubliccode: (string-ascii 30