Branch data Line data Source code
1 : : ;; Title: BME040 - Marketplace DAO Extension for Share Trading
2 : : ;; Description: Enables CPMM Backed .
3 : : ;; create a share order to sell market shares - note ths dao can be be enable to automatically fullfil orders
4 : : ;; under certain conditions which means we can model 'sell-shares' without impacting market liquidity
5 : :
6 : : (use-trait prediction-market-trait .prediction-market-trait.prediction-market-trait)
7 : : (use-trait ft-token 'SP2AKWJYC7BNY18W1XXKPGP0YVEK63QJG4793Z2D4.sip-010-trait-ft-standard.sip-010-trait)
8 : : (impl-trait 'SP3JP0N1ZXGASRJ0F7QAHWFPGTVK9T2XNXDB908Z.extension-trait.extension-trait)
9 : :
10 : : ;; Errors
11 : : (define-constant err-order-exists (err u40001))
12 : : (define-constant err-expiry-invalid (err u40002))
13 : : (define-constant err-order-not-found (err u40003))
14 : : (define-constant err-order-expired (err u40004))
15 : : (define-constant err-payment-failed (err u40005))
16 : : (define-constant err-share-transfer-failed (err u40006))
17 : : (define-constant err-invalid-token (err u40007))
18 : :
19 : :
20 : : (define-map share-orders
21 : : { market: principal, market-id: uint, outcome: uint, seller: principal }
22 : : { amount: uint, expiry-block: uint }
23 : : )
24 : :
25 : 13 : (define-public (create-share-order
26 : : (market <prediction-market-trait>)
27 : : (market-id uint)
28 : : (outcome uint)
29 : : (amount uint)
30 : : (expires-after uint)
31 : : )
32 : 16 : (begin
33 [ - ]: 16 : (asserts! (> expires-after u10) err-expiry-invalid)
34 [ + ]: 16 : (asserts! (is-none (map-get? share-orders {market: (contract-of market), market-id: market-id, outcome: outcome, seller: tx-sender})) err-order-exists)
35 : :
36 : : ;; Only store the order no share transfer
37 : 15 : (map-set share-orders {market: (contract-of market), market-id: market-id, outcome: outcome, seller: tx-sender}
38 : 15 : {amount: amount, expiry-block: (+ burn-block-height expires-after)})
39 : :
40 : 15 : (print {event: "create-share-order", market: (contract-of market), market-id: market-id, outcome: outcome, amount: amount, seller: tx-sender, expiry-block: (+ burn-block-height expires-after)})
41 : 15 : (ok true)
42 : : )
43 : : )
44 : :
45 : : ;; fullfil a share sell order but adhere to market conditions - ie pay same market fee and cost the sake on the curve
46 : 9 : (define-public (fill-share-order
47 : : (market <prediction-market-trait>)
48 : : (market-id uint)
49 : : (outcome uint)
50 : : (seller principal)
51 : : (token <ft-token>)
52 : : )
53 : 10 : (let (
54 : 10 : (order-key {market: (contract-of market), market-id: market-id, outcome: outcome, seller: seller})
55 : 10 : (order (unwrap! (map-get? share-orders order-key) err-order-not-found))
56 : 8 : (amount (get amount order))
57 : : )
58 [ + ]: 8 : (asserts! (< burn-block-height (get expiry-block order)) err-order-expired)
59 : :
60 : : ;; work of transfer in the market contract
61 : 7 : (try! (contract-call? market transfer-shares market-id outcome seller tx-sender amount token))
62 : 6 : (map-delete share-orders order-key)
63 : 6 : (print {event: "fill-share-order", market: (contract-of market), market-id: market-id, outcome: outcome, buyer: tx-sender, seller: seller, amount: amount})
64 : 6 : (ok true)
65 : : )
66 : : )
67 : :
68 : : ;; Public: cancel a listing (returns shares to seller)
69 : 2 : (define-public (cancel-share-order (market <prediction-market-trait>) (market-id uint) (outcome uint))
70 : 2 : (let ((order (unwrap! (map-get? share-orders {market: (contract-of market), market-id: market-id, outcome: outcome, seller: tx-sender}) err-order-not-found)))
71 : 2 : (map-delete share-orders {market: (contract-of market), market-id: market-id, outcome: outcome, seller: tx-sender})
72 : 2 : (print {event: "cancel-share-order", market: (contract-of market), market-id: market-id, outcome: outcome, seller: tx-sender})
73 : 2 : (ok true)
74 : : )
75 : : )
76 : :
77 : : ;; --- Extension callback
78 : :
79 : 1 : (define-public (callback (sender principal) (memo (buff 34)))
80 : 1 : (ok true)
81 : : )
|