(impl-trait .trait-ownable.ownable-trait) ;; 4000-4999: registry errors (define-constant err-unauthorised-caller (err u4000)) (define-constant err-unauthorised-sender (err u4001)) (define-constant err-storage-failure (err u4002)) (define-constant err-unknown-user-id (err u3500)) (define-constant err-unknown-asset-id (err u3501)) (define-constant err-user-already-registered (err u3502)) (define-constant err-asset-already-registered (err u3503)) (define-constant err-not-whitelisted (err u3504)) (define-map order-fills (buff 32) uint) (define-map order-approvals {maker: principal, order-hash: (buff 32)} bool) (define-map authorised-exchanges principal bool) (define-map whitelisted-users principal bool) (define-data-var contract-owner principal tx-sender) (define-data-var use-whitelist bool false) (define-read-only (is-whitelisted (user principal)) (default-to false (map-get? whitelisted-users user)) ) (define-public (apply-whitelist (new-use-whitelist bool)) (begin (try! (is-contract-owner)) (ok (var-set use-whitelist new-use-whitelist)) ) ) (define-public (whitelist (user principal) (whitelisted bool)) (begin (try! (is-contract-owner)) (ok (map-set whitelisted-users user whitelisted)) ) ) (define-public (whitelist-many (users (list 2000 principal)) (whitelisted (list 2000 bool))) (ok (map whitelist users whitelisted)) ) (define-read-only (get-contract-owner) (ok (var-get contract-owner)) ) (define-public (set-contract-owner (new-owner principal)) (begin (asserts! (is-eq (var-get contract-owner) tx-sender) err-unauthorised-sender) (ok (var-set contract-owner new-owner)) ) ) (define-private (is-contract-owner) (ok (asserts! (is-eq (var-get contract-owner) tx-sender) err-unauthorised-caller)) ) (define-map user-registry uint { maker: principal, pub-key: (buff 33) } ) (define-data-var user-registry-nonce uint u0) (define-map user-id-registry principal uint) (define-map asset-registry uint principal) (define-map asset-registry-ids principal uint) (define-data-var asset-registry-nonce uint u0) (define-public (register-asset (asset principal)) (let ( (asset-id (+ (var-get asset-registry-nonce) u1)) ) (try! (is-contract-owner)) (asserts! (map-insert asset-registry-ids asset asset-id) err-asset-already-registered) (map-insert asset-registry asset-id asset) (var-set asset-registry-nonce asset-id) (ok asset-id) ) ) (define-public (register-user-on-behalf (pub-key (buff 33)) (maker principal)) (begin (try! (is-contract-owner)) (register-user-given-maker pub-key maker) ) ) (define-public (register-user (pub-key (buff 33))) (begin (asserts! (or (not (var-get use-whitelist)) (is-whitelisted tx-sender)) err-not-whitelisted) (register-user-given-maker pub-key tx-sender) ) ) (define-private (register-user-given-maker (pub-key (buff 33)) (maker principal)) (let ( (reg-id (+ (var-get user-registry-nonce) u1)) ) (asserts! (map-insert user-id-registry maker reg-id) err-user-already-registered) (map-insert user-registry reg-id {maker: maker, pub-key: pub-key}) (var-set user-registry-nonce reg-id) (ok reg-id) ) ) (define-read-only (get-user-id (user principal)) (map-get? user-id-registry user) ) (define-read-only (get-user-id-or-fail (user principal)) (ok (unwrap! (map-get? user-id-registry user) err-unknown-user-id)) ) (define-read-only (user-from-id (id uint)) (map-get? user-registry id) ) (define-read-only (user-from-id-or-fail (id uint)) (ok (unwrap! (map-get? user-registry id) err-unknown-user-id)) ) (define-read-only (get-two-users-from-id-or-fail (id-1 uint) (id-2 uint)) (ok { user-1: (unwrap! (map-get? user-registry id-1) err-unknown-user-id), user-2: (unwrap! (map-get? user-registry id-2) err-unknown-user-id) }) ) (define-read-only (user-maker-from-id (id uint)) (get maker (map-get? user-registry id)) ) (define-read-only (user-maker-from-id-or-fail (id uint)) (ok (get maker (unwrap! (map-get? user-registry id) err-unknown-user-id))) ) (define-read-only (asset-from-id (id uint)) (map-get? asset-registry id) ) (define-read-only (get-asset-id (asset principal)) (map-get? asset-registry-ids asset) ) (define-read-only (asset-from-id-or-fail (id uint)) (ok (unwrap! (map-get? asset-registry id) err-unknown-asset-id)) ) (define-private (valid-exchange-caller) (ok (asserts! (is-approved-exchange contract-caller) err-unauthorised-caller)) ) (define-read-only (get-order-fill (order-hash (buff 32))) (default-to u0 (map-get? order-fills order-hash)) ) (define-read-only (get-two-order-fills (order-hash-1 (buff 32)) (order-hash-2 (buff 32))) { order-1: (default-to u0 (map-get? order-fills order-hash-1)), order-2: (default-to u0 (map-get? order-fills order-hash-2)) } ) (define-read-only (get-order-fills (order-hashes (list 200 (buff 32)))) (map get-order-fill order-hashes) ) (define-public (set-order-fill (order-hash (buff 32)) (new-fill uint)) (begin (try! (valid-exchange-caller)) (ok (asserts! (map-set order-fills order-hash new-fill) err-storage-failure)) ) ) (define-public (set-two-order-fills (order-hash-1 (buff 32)) (new-fill-1 uint) (order-hash-2 (buff 32)) (new-fill-2 uint)) (begin (try! (valid-exchange-caller)) (ok (asserts! (and (map-set order-fills order-hash-1 new-fill-1) (map-set order-fills order-hash-2 new-fill-2)) err-storage-failure)) ) ) (define-private (set-order-fills-iter (item {order-hash: (buff 32), new-fill: uint}) (prev bool)) (and prev (map-set order-fills (get order-hash item) (get new-fill item))) ) (define-public (set-order-fills (fills (list 200 {order-hash: (buff 32), new-fill: uint}))) (begin (try! (valid-exchange-caller)) (ok (asserts! (fold set-order-fills-iter fills true) err-storage-failure)) ) ) (define-read-only (get-order-approval (maker principal) (order-hash (buff 32))) (default-to false (map-get? order-approvals {maker: maker, order-hash: order-hash})) ) (define-public (set-order-approval (order-hash (buff 32)) (approved bool)) (ok (map-set order-approvals {maker: tx-sender, order-hash: order-hash} approved)) ) (define-public (approve-exchange (exchange principal) (approved bool)) (begin (try! (is-contract-owner)) (ok (map-set authorised-exchanges exchange approved)) ) ) (define-read-only (is-approved-exchange (exchange principal)) (default-to false (map-get? authorised-exchanges exchange)) )