/
neoswap-sc-1681329852289.clar
157 lines (131 loc) · 5.41 KB
/
neoswap-sc-1681329852289.clar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
;; multiway-swap
;; Contract to facilitate a multiway NFT swap.
;; Each of the parties involved has to call confirm-and-escrow to escrow their dues.
;; Once all parties confirmed, finalize has to be called to redistribute escrowed items.
;; At any point before the swap is finalized it can be canceled by a party involved,
;; regardles of whether they already called confirm-and-escrow or not.
;; traders
(define-constant TRADER-1 'SP136AXDAQ41R31GJWJX8KX14E2T4K8PA08NCE6Q5)
(define-constant TRADER-2 'SP3BTPH354JEM3E8AYAHQS9SWJ591TJQYD9QK0MCF)
;; receivers
;; constants
(define-constant ERR_ESCROW_NOT_FILLED u401)
(define-constant ERR_SWAP_FINALIZED u402)
(define-constant ERR_RELEASING_ESCROW_FAILED u491)
(define-constant ERR_SWAP_CANCELED u499)
(define-constant ERR_IS_NOT_TRADER u410)
(define-constant ERR_CALLER_ALREADY_ESCROWED u411)
(define-constant ERR_FAILED_TO_ESCROW_STX u412)
(define-constant ERR_FAILED_TO_ESCROW_NFT u413)
(define-constant SWAP_STATE_ACTIVE u100)
(define-constant SWAP_STATE_READY_TO_FINALIZE u101)
(define-constant SWAP_STATE_FINALIZED u102)
(define-constant SWAP_STATE_CANCELED u109)
(define-constant TRADER_STATE_ACTIVE u110)
(define-constant TRADER_STATE_CONFIRMED u111)
(define-constant TRADER_STATE_CANCELED u119)
(define-constant NUM_TRADERS u2)
;; data maps and vars
(define-data-var swapState uint SWAP_STATE_ACTIVE)
(define-data-var confirmCount uint u0)
(define-map TraderState principal uint)
;; Set TraderState of each trader to TRADER_STATE_ACTIVE.
(map-set TraderState TRADER-1 TRADER_STATE_ACTIVE)
(map-set TraderState TRADER-2 TRADER_STATE_ACTIVE)
;; private functions
(define-private (deposit-escrow)
(begin
(if (is-eq tx-sender TRADER-1)
(begin
(unwrap! (contract-call? 'SPJW1XE278YMCEYMXB8ZFGJMH8ZVAAEDP2S2PJYG.belles-witches transfer u78 tx-sender (as-contract tx-sender)) (err ERR_FAILED_TO_ESCROW_NFT))
)
true
)
(if (is-eq tx-sender TRADER-2)
(begin
(unwrap! (stx-transfer? u943738 tx-sender (as-contract tx-sender)) (err ERR_FAILED_TO_ESCROW_STX))
(unwrap! (contract-call? 'SP1C2K603TGWJGKPT2Z3WWHA0ARM66D352385TTWH.the-cavalry transfer u984 tx-sender (as-contract tx-sender)) (err ERR_FAILED_TO_ESCROW_NFT))
)
true
)
(map-set TraderState tx-sender TRADER_STATE_CONFIRMED)
(unwrap-panic (update-swap-state))
(ok true)
)
)
(define-private (release-escrow)
(begin
(unwrap-panic (as-contract (contract-call? 'SP1C2K603TGWJGKPT2Z3WWHA0ARM66D352385TTWH.the-cavalry transfer u984 tx-sender TRADER-1)))
(unwrap-panic (as-contract (contract-call? 'SPJW1XE278YMCEYMXB8ZFGJMH8ZVAAEDP2S2PJYG.belles-witches transfer u78 tx-sender TRADER-2)))
(unwrap-panic (as-contract (stx-transfer? u943738 tx-sender TRADER-1)))
(var-set swapState SWAP_STATE_FINALIZED)
(ok true)
)
)
(define-private (return-escrow)
(begin
(if (is-eq (default-to ERR_IS_NOT_TRADER (map-get? TraderState TRADER-1)) TRADER_STATE_CONFIRMED)
(begin
(unwrap-panic (as-contract (contract-call? 'SPJW1XE278YMCEYMXB8ZFGJMH8ZVAAEDP2S2PJYG.belles-witches transfer u78 tx-sender TRADER-1)))
)
true
)
(if (is-eq (default-to ERR_IS_NOT_TRADER (map-get? TraderState TRADER-2)) TRADER_STATE_CONFIRMED)
(begin
(unwrap-panic (as-contract (stx-transfer? u943738 tx-sender TRADER-2)))
(unwrap-panic (as-contract (contract-call? 'SP1C2K603TGWJGKPT2Z3WWHA0ARM66D352385TTWH.the-cavalry transfer u984 tx-sender TRADER-2)))
)
true
)
(map-set TraderState tx-sender TRADER_STATE_CANCELED)
(var-set swapState SWAP_STATE_CANCELED)
(ok true)
)
)
(define-private (update-swap-state)
(let
((cfCount (+ (var-get confirmCount) u1)))
(var-set confirmCount cfCount)
(if
(is-eq cfCount NUM_TRADERS)
(var-set swapState SWAP_STATE_READY_TO_FINALIZE)
true
)
(ok true)
)
)
;; public functions
(define-read-only (get-swap-state)
(ok (var-get swapState))
)
(define-read-only (get-trader-state (trader principal))
(unwrap! (map-get? TraderState trader) ERR_IS_NOT_TRADER)
)
(define-public (confirm-and-escrow)
(let
((trState (unwrap! (map-get? TraderState tx-sender) (err ERR_IS_NOT_TRADER))))
(asserts! (not (is-eq (var-get swapState) SWAP_STATE_FINALIZED)) (err ERR_SWAP_FINALIZED))
(asserts! (not (is-eq (var-get swapState) SWAP_STATE_CANCELED)) (err ERR_SWAP_CANCELED))
(asserts! (not (is-eq trState TRADER_STATE_CONFIRMED)) (err ERR_CALLER_ALREADY_ESCROWED))
(try! (deposit-escrow))
(ok true)
)
)
(define-public (cancel)
(begin
(unwrap! (map-get? TraderState tx-sender) (err ERR_IS_NOT_TRADER))
(asserts! (not (is-eq (var-get swapState) SWAP_STATE_FINALIZED)) (err ERR_SWAP_FINALIZED))
(asserts! (not (is-eq (var-get swapState) SWAP_STATE_CANCELED)) (err ERR_SWAP_CANCELED))
(unwrap! (return-escrow) (err ERR_RELEASING_ESCROW_FAILED))
(ok true)
)
)
(define-public (finalize)
(begin
(asserts! (not (is-eq (var-get swapState) SWAP_STATE_ACTIVE)) (err ERR_ESCROW_NOT_FILLED))
(asserts! (not (is-eq (var-get swapState) SWAP_STATE_FINALIZED)) (err ERR_SWAP_FINALIZED))
(asserts! (not (is-eq (var-get swapState) SWAP_STATE_CANCELED)) (err ERR_SWAP_CANCELED))
(unwrap! (release-escrow) (err ERR_RELEASING_ESCROW_FAILED))
(ok true)
)
)