;; Used to simulate mainnet migration from v1 to v2 in the test suite
;; Must be called after deploying migrate-v0-v1.clar
(define-constant deployer tx-sender)
(define-data-var executed bool false)
(define-data-var executed-burn-mint bool false)
(define-data-var executed-reserve-data-update bool false)
(define-data-var executed-borrower-block-height bool false)
(define-data-var enabled bool true)
;; TODO: to fetch off-chain
(define-constant holders (list
'SP2H35FBMBRT3AEPEAQRC4MNHQ06KZGCE9P4N9E5X
'SP2KG74NKGD60RT20JYWYW0A4NTCA58Q5HGCCJE3Z
'SP2RCBCNFZRGXM3R2QX0VTC7BV5K4VEPWAFNGXXCX
'SP2RQR6KW5PHCKPPC477QH3E91A60MD86HNWEVQ71
'SP2V60Y3N8STG7ZPXBREJ5EYNXW7ER1RWREZX74GK
'SP32MG88ED9DCBS017DA3D59ZWA0F44DWVBKGBAF7
'SP35QXFFAH7Z1FHN3AB165E9TBEJHM0C40784WSRM
'SP37HNSTSPXV9278Z44X65ZRDNQR10KQ8PHTQR5K2
'SP38A0YFH449RRB4B2N7X0YDHNF7XCDJ1WC9STX95
'SP39BJNYR8HX904WB46ZHX1PF06RDP37D5A6BNRK4
'SP3AR6PHPF53AZHMJVKHKSDYSCF228ZS71ZCENA2C
'SP3ATA2YBN4109G14FXAY241WXNCVWGH15YR7N7JX
'SP3BHQ67408EN80SZ1HDEVAC9CB55PCENWJDBQMRH
'SP3CQEAZN2A4C056JHE7W7QSZ2VJ244NMHFAETQ56
'SP3DGJ0NW9EZTMV0J52XGM8JM30FGFK74MK1417S6
'SP3FDNKJ359G0ZGVK0KXDS244MYW4J4P5J46PNQZB
'SP3H2MFMZMK754K3YM3CBMVQ8QYFZEHBF90TSXQ6B
'SP3HAYH3RM6DJW92W6JACNJK6S375BCXNQ1GCKHTC
'SP3RTMACMFTMEFNXZEBCXJNZJQXJFHQQCG5FD2FGH
'SP3S77KSXP4W77X50SJW3DD66J4T5BW24K1D81074
'SP3TA40KJ1DGB5Y231PHFCECWQGK1313J5KM4671M
'SP3TXK5XWA5KSA4DJ0XGBT01BWPAVSN5B80TQM1Z0
'SP3XTNSR93EW69VXR3GR9MTFQNC8CFZM6Q3K076XS
'SP3XVZ8817RVYCWJV2WH4KM6QB2VQB59Q5PY35ST
'SP3ZSH234GTM16C7S3YQBCEGMKAHMDNMX0NW9Z1WA
'SP6AW8N46TC745BZ1E5NCF5V08BG8RWWS94KA1JZ
'SP6B9JG1CSFC048HH2VZ0G2F4AC5WS8MM68N7YEP
'SP9R3TK4NFYER9D8E229YY0N590TZMQ593DR1CF6
'SPA1ADZ34GWE2DSKW0NY1JQNQ6Q453W9NKH7FWR1
'SPB5AZ0RN2K8CPSCD8JVGY8A27NDV9JNPRKGRG6D
'SPH61MSTWWJF2ZYR41KHWJN10ZC6DZPPZQWSNVRY
'SPHK8A7P61C6ASWKYDX1PCDX9YA54DKVJN49EXGJ
'SPKH6DBX6JWHZEZM5PZCC7D66ZM6VRVKJYYTSRBS
'SPQZT5XPD3922JQANNSD3MESSA8RX7JZQD7NY7SE
'SPVKX91QSHE73VVA89V99M9M81Z04426V4B8KRPN
'SPYET018HXK51W7WV04Z0PCF9T88HX6CCD0HMW0N
'SPZY0KSPSPEAGK0423AJGVRPEYVDFQWDR7147B00
'SPYN02DPCWJVVR9K91710N222C295WSMPZ5VX3FS
'SPZ13A25082ETCFEY0DECFE7VMKDQT014Y94R3NY
'SPNQYEN4K6FN0WHH90R4R0B743QS162C0VDEG3NC
'SP13SPZAS7582CV08CY8TJJQT9TKGT841GB09E17M
'SPQ6C903F658QEF0JVYCFZYZ5GCS07ZJWKQ7DG4V
'SP1HXR2W32E3H2WHJFR9JHVA23QGASX6224EPCDP9
'SP2DFEB6133PT3QTADJNDVYWFMKYHM55WZE5126VT
'SP13Q1QHFFGBJ1JXBEKPV74A6S49S0XP205JME9E8
'SP18FVCFE4KS7RJ2XT8MXWCDPF06560H9H681K4RP
'SP1VKEVK39KZTA7T95XTYX3ACXBSDBDQC3HECH4QA
'SP1PHB1CHKH48JBN6TB54032R1AZAY6HVW5P6NFMB
'SP1Z5CRQ86BA1T1ZGWGPXZKVJY3D49VTZGWFBCBV3
'SP2398102ADWJCTV4VWN66PBA57V08H53E4JQV2PX
'SP2AEYY579DAN4R312QB9E7TP243GMDDQCQAWH99G
'SP2GWC1RYR5HMK7Z4EXN4Z54BP55ETNP5SEQ2AWFR
'SP2RBJFYCEA2R00VXBM7KJ8GZ1YCQ5HMZCHRJT3WS
'SP2WM8QCH0HE67D2P76871E181R86XSAG70ACBAQ9
'SP3ERCSEB4YMJD47PPC56X0JZTCZMRFE4HVJHM990
'SP3WHYKT8GX0KG83C13T643DZ328HQKBZ280PSNVN
'SP4BB7N2H95N5BW77D65JRK417X3B7WTW6EG7738
'SP6DQP4M5TRVDVEJYB1G669ZBEQ68DNGE7JGCC0M
'SP2RB6Z8FGSYAQSZGY56FY44W9PZDFD1V7SBJ8JN4
'SP3VPXV7VYRG3DX1S7AWJYXEJ7Y7JT3EYMSS0YJ81
'SP67NSCB8ZZMRQ7Z3V3K5VZNW9MMTJSQPAES3DDM
'SPH0JCDJP1Y47VBMBMVGV5CGH88EYC8QJT04J3P2
'SP1HJVJDX1A37EGRSBVP1THA8QA49A7F472FWPV7D
'SP12B7C9G0NFZBK7AAFN66ZMPGP62E6TA35EN83KT
'SP150T7S3P8SFDJNB72NWZ18N9YN7VQGYXYTB2JT3
'SP15KMQHT7GF9P88FMFXQSFDQ5V9H5PJMJW66JTG4
'SP18P5Q7XNC5TM2P62B8BQ6V49HD8AT9TRH4281HC
'SP1C2SPX04KV765068PAJ760A12JE2HVW54ZSHHJS
'SP1CTCKPXE37FSJGAZRCGNDVHXNBBF67ET7H3GSQE
'SP1FDYTAAVZ5F0Y2WS1NEBXBCHB9MN7ZQTHC4DRYP
'SP1SKVM8ESZPPPDK4RW7EBGEAX8AJCN03Q1Q6649Z
'SP1SX2SGRG29CZY30EDMW16WX3YACKVWTMP8HJ635
'SP1TBD2R3BRXZK2AVPPGG7R459G52P6K4Q24H72ZB
'SP1XBGYXA4EN499W2D310P71ZWZXRKQ3S1X7CA1D1
'SP25TV6WK74M55CFVCFPKPXTCJCVC4NB7GGW9SHET
'SP28Q4T5Z1FZAR6ZYZASQB04YSYP456QXJ09W6H1N
'SP2EKD8EZ1CQDDTX0S7KF9G3G52CF0606DHN2W89W
'SP22C16CX93RRH5PVAXFBGZE8DTMS30W8KV6EEGHK
'SP3ZWNQTG3SDNWB5NSQ0C539XSB2P5W42VWMKB6HT
'SP3REJNH31PG2J904XK0GGFSVCE8TRKGYZPB9CH23
'SP3ZQ4YTVMFKAXX3J7YZZ71HNRV3GA4Y4ZMGEJ8KZ
'SP2RRB04XCDCQ8JRE6CRYTE6C93K6MQCK3PA5RFR2
'SPBNJ5XBPRME5P2V1JPNFYS6V8DW43K835TB5GCS
'SPWFH78WFGRZXRZ441PTRTW3CVGBYWTGSSF9J17C
'SP1HFBJAFQS0YTNRMEJPRGZYZHABTAQNYTSK9SN3S
'SPBK5V142ENK2YP10W2X6628SZQM9FEVQKMXB149
'SP211HBRWHK00ENTGVYS1ZB8VXDDHZN5GKBN3E2J6
'SP2M4H80G769R03SKVA2V42542WYBCMB83XCXC21T
'SPMGDHQ6H0B8A8VZ6YP2REBJF4KZJPBQQ9AF221S
'SP3WTFW6NVGM49Y8S85YDBM185CPJNBFD9RMNDEW8
'SP240SHDH7J0QWXJV5DMREYP01092FS77NC969WHX
'SPBKTHK3W5BX7V2JH025TR6TCCJAFEJ6JKT4062C
'SP1A8N7H2M7037SW0E4EVMQ2X68XH7PZSSKG5J053
'SP2P7MJM3XC9EFYT4VCVXPSZ42GBVQQ0XWKD7JQT1
'SP3DN0WQJQA19YCT4053WCF0NG4PY7V0APF1PCVVN
'SP2WT1CCA1AX4WCQXCKEWPA3DFGF9Q0FQ1T87JB6T
'SP2PBKVSTKQ40R0XD3TE9WCY79W31RFJPYEHNBP1B
'SP1MEG2MG8MZ3SSM94MM5AT236M8GY26R7AF08MMJ
'SP3PS4YAH6TT9NC0CR8EZ2MF43Y5FT9SMAQ51QWKG
'SPEAM154PP3DYZDB03SJZDJRFZ81S0MVPDD7D305
'SPJKTSYEFQC1MM9EABSSF1Q7NCB489SJ3WZQ08SX
'SP2XNFVWZ3X7SBQ59G3J6DXW836W4DZA8KDD1QQYF
'SP1K3PTTYNAF6RNKJ77Q7NZ62QTK99NGYB3FYNVZ0
'SPQN9RYKA6BDZ8RW7MC93Y5TCST0WCS75RGDSNV8
'SP5H4661C8GXJ5D5ACZJNQFXDBSA8NT01ZFV92H5
'SP375WP6WN5H5R1AQM3C39EZY39RF283BGAJX9E7W
'SPBSMN21JTN1752GG6Y7J66WV3XSN90S2EX3VJPQ
'SP2JYY9YM9RZ60GZJWTVVD50824PHYEXCAT9SHGND
'SP3MKHZJWWQ43309SAS2B1XYZKY3J30611B6JS079
'SP1MZ4NMNMRWXES30MGHMTTC2YTE8NKJG69TJ3SY0
'SP29XK0ZSX7PWXWYPSA873JS2WGN9EPS9RPMHRR3S
'SP3C1Z08A0AYERZHM47XH8CYAASAG08EEDXZTEQBK
'SP3WR5719TYHMA5W8K8K4K3GYRTXCTG6T6084Z6HG
'SP735H0MNC2MZE7DKP086M342SYVDSR7C0T71CJF
'SP15B7SQ231XSA6A4EGM3YKXTK3PZG7X08V00C0Q3
'SP2MDTRRYEXWTNM5DX3YHME907TRC88XVPBK6YR8V
'SP3PP3APZ5FQTRADQTQZG9CDHNXX3HBR1A0PCTFE9
'SP3RPHS54W2TXT78RCDBHC633N93HMD4EY8G86NBG
'SP3R7RTAVN56QQTP3349TZ2VX6CXE13NEN1VGQ5A9
'SPNSX52H79HVKKSD5Q70GHW4WQWSVTTPPR3QBXT2
'SP1BX6X7VGKPWQRNGDVP9N3JPDQV0W85738Y00GY2
'SP32FPWZH1H4C769ZDHT89FNZ4N5PA1PW2XBKV06
'SPEDWBCHDYWS2M2B1F59442JY9E5J7NZ31V8BR6B
'SP0E3533N85CN0WVE5TN8ZSQGT9JBFX3457ZVKB1
'SP19QBWZVC0WFQQ7HW49JE0DK8A2J0NDJ48QB7813
'SP30GATBPVR25FMG32VZ256QCRPC64PFKF635YMFY
'SPDP02PP7728P7EFHY3B84HDVQF4YRZXZA2BBJT3
'SP3S4XWETW2RS3SYJVNNM01H40J9J1GSHHA0SY8RA
'SPKWE5GGMPQTWCG2G1KGSWS3HB75H9Y5807SCBVF
'SP1VQSJPBJ087ED9DKN8HK5Z1X4K4XRR1MFR3MNR6
'SP112EXC2GFBKJWC565F1EPEBWJEY6BRB7DCVC0TP
'SP3X9NAS91GBRANQEKBXJXAX2C3K5HHFR4SADRKN6
'SPA6GYAMX4EZ7CKYGJTNS49QZ18C6KJT10SGW0WZ
'SPG85XDJK6QF2GB6CJH8YVGQY7N3STCNV8FJCCAP
'SP1QC02Y6ZGST5EM56FZQFMFHBDBTQAP10PGDR97C
'SP10CTYF1YZJ64S3E4PR7VF1SC3KEEN5BZAK5RY6A
'SP34N89KZTJCDEJZDTRAK4F38C8TBG3SD4FV6EFBN
'SP1BAH2TXVEA3MQ568ND2AHV2WM92AYHQWEDSMK13
'SP1A0Q0FFA72YXPD2M4824S5D2S8CXSP2NDTGVER0
'SPFKV9RJPAXG44G9H41V4NAJAY94B44A8V3AR23B
'SP12TK3NX2QTZVN76Z8K9F05853SJDPGVVJ8WHGKT
'SP3N4KQ3QSENW6BKMW3YVPYTHPDJQ2PM43YWHF1PK
'SPA0RFW0YD4BP1PQ0GB09W2ENVZSAZB4F3VYG8Q2
'SP3TDJ8ZATPTK5QKRVFC5SNWMSV5ZNKTBWADS2WXD
'SP2B3HAGG1F70CTAKPA4B43ER1PV3QKYH1WWJDJK7
'SP1N79BNNWAJYERCEHM3YH5QSWR28EMQS2T79QH33
'SP387AWC5F23X02DJSEAQE2XGNY5NS8W0SPJB3TD9
'SP1J3P6T0C19H8EJFRSPKFNC5Q4MQ9HNZB3W4N1KH
'SP30FCW2H7N10558Q4ZEYE5XXZFEY9GEQFMNZFDGC
'SP1B9VVB4N36CXYN5AC41T3TJ9DCZB7Y671AF0RE6
'SP367R692XMF14Z4AY4XKYY1D7XK8E7GTZ68P8Q2Q
'SP2TERG6W51T3204GEBXQF03D7EA8BHD2RPZZFCHQ
'SP3H2SGCFHJ462D290D6TFBCQHDFPP7PJM57SHN4P
'SP2EK0C7R4Z42PT0PENYPC83NNK8MPGRR75P111CS
'SP2AM3VH574N1E3CZFKVTRMT26VC309H24FM07CQ1
'SP2CP81S7P98QC14XFJ9PHNCZJWQ554AA33G20H0J
'SPH434T4DTNWC4KPCMYDXYSH80CYCZMWB0EFCE1A
'SPPVT05YQ1YYCXAZW972ASJHASXP5DCVY4X90B88
'SP17C4DEZR4ESVW54NZWCT0YJ9D2P4Z45GE3N1Q2Q
'SP1ZA1HKNYC8A4S2BQ3GRK5VBZYSK74ARPKPBPD40
'SP2XJ642XX3VZPNEZNCJZ7DX4EN0ZGXYDN8B2HZY8
'SP1BF1MCV1R1CCCJP6XJQXBQQVYY05HPCCGCEVN44
'SP3QJQNSKTA666TYGC41HM6MSPBCD85PJ7YE85KZ0
'SP2KQ3NTWQTWGAC18T6TC2QG5JD4ARQH1MWXYNGYC
'SP1JANCT3H08F0WSKGXS0KSHC3PG8CGN7BRV5F7Y0
'SP2ZZ6ANKJXB8CEGRWDK98VCE8XQ4N7GW5VMZAAM8
'SP39QYHZHF2ZCHKMEWSKTX5NHK7PNWQPRN96SH66E
'SP3W9P60PN8GWJZHQZT37R8CZZP2MP6BCNACC419F
'SP35S2ANMBVKFZCGAHX7G1RT0B1RSYV2KEGRR6ZB7
'SPD2E26F7F00PF0V7FZZMPPYEFXVF9TRS3BNK48Y
'SP1ZYVXAGZH4CM3ZD14TWCC88JZ6S8Z3XJSE1S1SE
'SP6M4FJS3S0BD8G21WDNNNMPKDWJGSVX1RB67KV2
'SP3ASXSMVMC7QNP078M90MP0SD4A0DX2F9WQ8C307
'SP3A5RJGG6A21WHNVFTK42RNZM7C2EE25XBDFHEAM
'SPTB5ZDHPPZXKKXX59946WA8JJGWWMEM0GPC40YH
'SP4M99XX7213JFD077EH69RBJ42PZ3AVMY09168R
'SP3RR42HTDSEE4XBWRJ3SZPYS0085GX6Z7FEHFYAF
'SPR29G99BQJSV0F0RT1BTG9APK3TAJDRJ35HQ5KV
'SP2RXRMY3CCEP4ECQ59M1RZCFCKKANHP3S1JMTZ6V
'SP2KJGV1CANG9MM3HVGCGCH95BGAY5WTTYP0JEYK2
'SPNKYE45WF3HRD618NNWTK5SPWQVM4ACKXMQWWFR
'SP3VPSMK1WPQTF3GVMPQ0Z9JFKMVPFDSYGWGERV49
'SPGJP335YMK72TE88T8350K4XXSB3ERPHGK1FCP7
'SP3DJ4WVFCW6GA72QWX0597GXG5PFJNRQ3PTA043N
'SPDQH0H5BE4HMCDA0HA5MB85V8C35PVYF6ZA5M6H
'SP1D6J58VFJSWFFAJ8BD69K6YY1BN4T5AR218CA56
'SP2Z0NZDNFCWCHH575M2TWTCMQQ50ZEMK9M12NDZD
'SP11GJ9MXCSFA8F1QZ2P5RRD85JKRYR1A1HC05KSQ
'SP3G7M3RFAP8RT5SA4AVW76JHXM7X66T2C1AT8H49
'SPDYVC31SYH678CK9SPQHZA7QD6102JMNBNVYAYV
'SPQAEDQNPDPD2GEDD8MAHZCSYK61G9EEGVGJYQCD
'SP2NPBYX46J3F8C2FEGVMK3RF0BN6WQNV9EXJYN6Y
'SPB4MJYNFCQBZRD0V54TBJFWPD18FBZA5XD35CM8
'SP2MRBWGJ39XAQWX7D6QT2PRYRCJDV48TSPPR48QS
'SP2MGZ8M0XK3E8WZV2CZ3SY2DZEG8BAZXAX07M7MS
'SP3VTCG8XP3T2KWMDEVB9VYYAKG38Q8Y6E99EBE5Y
'SP2KK65Q588PQNCJSQ91KSM6PP69GDGYBNXES04A0
'SP14QR1861Z6CDJ9QZPBZNEHKVE4229MQDQA3394X
'SP2HP9HA7VHW1D1Y0XEG0CJPC3A883R70T6JKK103
'SP1PB8FRYJ04JFK601RA6GRXEWGTZ7H24WZY7PC8R
))
(define-public (burn-mint)
(begin
(asserts! (var-get enabled) (err u10))
(asserts! (is-eq deployer tx-sender) (err u11))
(asserts! (not (var-get executed-burn-mint)) (err u12))
;; enable zststx access
(try! (contract-call? .zwstx set-approved-contract (as-contract tx-sender) true))
(try! (contract-call? .zwstx-v1 set-approved-contract (as-contract tx-sender) true))
(try! (contract-call? .zwstx-v1-2-1 set-approved-contract (as-contract tx-sender) true))
(try! (contract-call? .zwstx-v2-0 set-approved-contract (as-contract tx-sender) true))
;; burn/mint v2 to v3
(try! (fold check-err (map consolidate-wstx-lambda holders) (ok true)))
;; disable access
(try! (contract-call? .zwstx set-approved-contract (as-contract tx-sender) false))
(try! (contract-call? .zwstx-v1 set-approved-contract (as-contract tx-sender) false))
(try! (contract-call? .zwstx-v1-2-1 set-approved-contract (as-contract tx-sender) false))
(try! (contract-call? .zwstx-v2-0 set-approved-contract (as-contract tx-sender) false))
(var-set executed-burn-mint true)
(ok true)
)
)
(define-private (consolidate-wstx-lambda (account principal))
(consolidate-wstx-balance-to-v3 account)
)
(define-private (check-err (result (response bool uint)) (prior (response bool uint)))
(match prior ok-value result err-value (err err-value))
)
(define-private (consolidate-wstx-balance-to-v3 (account principal))
(let (
;; burns old balances and mints to the latest version
(v0-balance (unwrap-panic (contract-call? .zwstx get-principal-balance account)))
(v1-balance (unwrap-panic (contract-call? .zwstx-v1 get-principal-balance account)))
(v2-balance (unwrap-panic (contract-call? .zwstx-v1-2-1 get-principal-balance account)))
)
(if (> v0-balance u0)
(begin
(try! (contract-call? .zwstx burn v0-balance account))
(try! (contract-call? .zwstx-v2-0 mint v0-balance account))
true
)
;; if doesn't have v0 balance, then check if has v1 balance
(if (> v1-balance u0)
(begin
(try! (contract-call? .zwstx-v1 burn v1-balance account))
(try! (contract-call? .zwstx-v2-0 mint v1-balance account))
true
)
;; if doesn't have v1 balance, then check if has v2 balance
(if (> v2-balance u0)
(begin
(try! (contract-call? .zwstx-v1-2-1 burn v2-balance account))
(try! (contract-call? .zwstx-v2-0 mint v2-balance account))
true
)
false
)
)
)
(ok true)
)
)
(define-read-only (can-execute)
(begin
(asserts! (not (var-get enabled)) (err u10))
(ok (not (var-get enabled)))
)
)
(define-public (disable)
(begin
(asserts! (is-eq deployer tx-sender) (err u11))
(ok (var-set enabled false))
)
)