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 : :
9 : : ;; Errors
10 : : (define-constant err-order-exists (err u40001))
11 : : (define-constant err-expiry-invalid (err u40002))
12 : : (define-constant err-order-not-found (err u40003))
13 : : (define-constant err-order-expired (err u40004))
14 : : (define-constant err-payment-failed (err u40005))
15 : : (define-constant err-share-transfer-failed (err u40006))
16 : : (define-constant err-invalid-token (err u40007))
17 : :
18 : :
19 : : (define-map share-orders
20 : : { market: principal, market-id: uint, outcome: uint, seller: principal }
21 : : { amount: uint, expiry-block: uint }
22 : : )
23 : :
24 : 11 : (define-public (create-share-order
25 : : (market <prediction-market-trait>)
26 : : (market-id uint)
27 : : (outcome uint)
28 : : (amount uint)
29 : : (expires-after uint)
30 : : )
31 : 14 : (begin
32 [ - ]: 14 : (asserts! (> expires-after u10) err-expiry-invalid)
33 [ + ]: 14 : (asserts! (is-none (map-get? share-orders {market: (contract-of market), market-id: market-id, outcome: outcome, seller: tx-sender})) err-order-exists)
34 : :
35 : : ;; Only store the order no share transfer
36 : 13 : (map-set share-orders {market: (contract-of market), market-id: market-id, outcome: outcome, seller: tx-sender}
37 : 13 : {amount: amount, expiry-block: (+ burn-block-height expires-after)})
38 : :
39 : 13 : (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)})
40 : 13 : (ok true)
41 : : )
42 : : )
43 : :
44 : : ;; fullfil a share sell order but adhere to market conditions - ie pay same market fee and cost the sake on the curve
45 : 7 : (define-public (fill-share-order
46 : : (market <prediction-market-trait>)
47 : : (market-id uint)
48 : : (outcome uint)
49 : : (seller principal)
50 : : (token <ft-token>)
51 : : )
52 : 8 : (let (
53 : 8 : (order-key {market: (contract-of market), market-id: market-id, outcome: outcome, seller: seller})
54 : 8 : (order (unwrap! (map-get? share-orders order-key) err-order-not-found))
55 : 6 : (amount (get amount order))
56 : : )
57 [ + ]: 6 : (asserts! (< burn-block-height (get expiry-block order)) err-order-expired)
58 : :
59 : : ;; work of transfer in the market contract
60 : 5 : (try! (contract-call? market transfer-shares market-id outcome seller tx-sender amount token))
61 : 4 : (map-delete share-orders order-key)
62 : 4 : (print {event: "fill-share-order", market: (contract-of market), market-id: market-id, outcome: outcome, buyer: tx-sender, seller: seller, amount: amount})
63 : 4 : (ok true)
64 : : )
65 : : )
66 : :
67 : : ;; Public: cancel a listing (returns shares to seller)
68 : 2 : (define-public (cancel-share-order (market <prediction-market-trait>) (market-id uint) (outcome uint))
69 : 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)))
70 : 2 : (map-delete share-orders {market: (contract-of market), market-id: market-id, outcome: outcome, seller: tx-sender})
71 : 2 : (print {event: "cancel-share-order", market: (contract-of market), market-id: market-id, outcome: outcome, seller: tx-sender})
72 : 2 : (ok true)
73 : : )
74 : : )
|