;; 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 ststx-holders (list
'SPQJN9008GBDXCPVS2CZSPXAPYV8251GZX1GX64R
'SPWCA0NFQM564PHZANZN0NJH0PAKDE4KJ60ZQX57
'SP3Y4FBG02E39JM2Y9KA6NPTWW4MAP9HEBVYC40SD
'SP340SDYJFFY5PAGVAVV97NJJXPPJ7YK9KKJK2AGD
'SP3JQY2XMFF3DXPA1W0H16G35XR29BTWYCP427AT8
'SPVTZAMM0MM4WMZC6RFKF6XZTXV8HPKP3NWR4MGG
'SP3TF1TFPJ8PE73DXB52AJAXCFR5XN9RT0Y0WQJ5S
'SP1N40ZQFA80NN2CT7E81Q6GR9MYKDG749GVH8B93
'SPA0WVPQNE7K9STNJ5WVB163R4M5PK29VNKABJET
'SP19HCHPFVSAQ82ZZGMMXBBVFKP6AFKVMWTV1GEH9
'SP1J0HF1W5NG6Y3PY56YD5S65YAHZQQW52CCM9FSF
'SP34AB3GE04JF5YY1S6ZNF99QFKNY218J737G85G3
'SP3PMKNKF6EB97WRJQ234H9G03YGXPST1T8PAY3XG
'SP20880S41WCKX3FDP4B14N93DK43FZG6JA2CF3QJ
'SPMZSHY49HXY4HM759GVPMP4ZM0HYXJ9VVF3TRS2
'SP1XPZ55KTRYKF89ZWB1FVXVEBQV28R2RA80YHQ8M
'SP3DYX83AXCQCRBV13B0R37N3TEYFA9J2D1JGGZ3S
'SP3JHZQ54Y1KMHZ1RQRG1B6SW47ZCNEM5NXZTNH9Z
'SP2X2CVX24AAXFW6KMRQEH2MYFJHD88R5R40ZKSZX
'SP2BS1YY80GGWKA0PFHXWXH2NQHFTCZ600HDH8BR5
'SP1Z9QKX59DADP38X0PHRY9NQX0X29BPE0Q9136MS
'SP17WGFQPDT20CWHCC9S4VVDZ5NBT6HZ52MGX4WG5
'SP3CC9SYWR9AWNF5QAW8S9SXNYRKA71M3PM27HFAG
'SP10VD0X3X2MBYZF52M25Q79QSM3JAB6HBADQRAVC
'SPP690D20TX80NA7610ARA4P835GZPZZFZNV6XP8
'SP2X6RZ5M8KDMYHMBX5WQWMR9SYNK3Y87EEKAXN7Z
'SP3HAC1YQHBMJQTPKCW9XY6EBMTMR93TPYPYKH43D
'SP2SGTG124NX7XPXFSTD47T77N0K5KX7DGFT2SRV8
'SP1VE9M4VDFJ62Q6R92H7FE7NNXSR46YPBH038VT8
'SP3JCAF094F0PHA7S85XAYAZM5Z4GWM9VZQ6GTMGP
'SP391JEHXE2D348BXFAK5VYKTK8KYRSMDX3N1C6PK
'SP1XCTE80TGHKPWP6Z7W372JCQSDQG5KX8WXA2N8E
'SP1A6KAXF6QTGT8T8XK2MBJY9EWSG04TX4E7REHKC
'SP9GVRQ4H9181E0RK20C4GMGQ9GEV7RZ8552BZWJ
'SP1S9V348SY2H77AH4B008KX0K2GPW2EGEW29847M
'SP94YN79D00S42WDQT6WG0DH4JVYCSR060ERAQZ2
'SP3YHVAR9CP9QD2D2HNJ5RH7NT5GXE2X4GXNX4YPX
'SP2BNY111K73715XKP1EBEBVVRWSNMMV1H42SJHZ
'SP115EKQXG1D5X4S1WK7HGJ6SDJHZMHHDQYGCTP7W
'SP1E6TBJE3ZQZ2Z8AFYNXFKM2FY65VB3N0RM3BJE5
'SPCAZZVVPP70A7TWM8EGD1SDDK7NARGGMZC5NN3V
'SPD1R753H3962VCBMWYQ23ZGKRG03EBP0WVYMH1X
'SP1YH7JWGQ5A26R6DWT38SG9F5E868PQ7A7J93K6A
'SP3A09H1JEB4F85FZ6XEXRSZA210SC6RB7Q7V7DAF
'SP1WYESZ6QQ0ZG4601AAT9MB0YZCZGJ1Y8VR36D6E
'SP1J5WHWNNEYH5NE9DS4W0RHZBP4XTKHSX79YC18K
'SP2HWSAW4QKEADTCNACQ7AMTRKM0EH66C5E047SG7
'SPHAE39Y1VX5QD2RFGYJG824WCE7MXNF7DPK2B8A
'SP1AZMDNVMPR13VYKVEXHFGCXP9JETA2W8G5YTPAQ
'SPDP02PP7728P7EFHY3B84HDVQF4YRZXZA2BBJT3
'SP3XD84X3PE79SHJAZCDW1V5E9EA8JSKRBPEKAEK7
'SPPAWSEQNK5J3A9MP4TAP5W2T2X9RFT85CMR4AMY
'SP1TVC41BRE5CYKGG2QJW375TD163MGNSEK2CVSZ5
'SP3KQEH6W884GMZXSXPM768154A848HRNWQD49E7P
'SP5CPS1JXRSN865AMEVHA7MV0SWJEY9KV4E096JV
'SPWZZGGRAY3FJ5V3TE5CPGHDSP9QECS3XTW7K2RV
'SP66NBNHNQ3DJKS5TBCKX6CFZRN40JB9ERQYV33T
'SP1B70Q1CC59KJ8HS30AH04NYV4G4D8V0E4Q9ZPFN
'SP11P09BQ2BQ4XP3B9A1XBK3RQZFAQ187TASB3ZWH
'SP1RJ530AMMT8GHQXTWGA71RXED06WGRK9DD04933
'SP3WWBGPYWTAY35ECC6N37JMRMSWF50V0HNTV7R7Y
'SP1WYHPJJVN3P0PS32BMF33P6WVVK1SNRRS28ZF0G
'SP1CKNBR248ZNTX1B443TSS6FRNNNYQD44ACETE8W
'SP1NC4G4ECCCRJ1F14TSRC79NYQZ1NN0CW2B2GZBR
'SP3GETBY9TT91BGSE2EZN3G2ANHXG2SGH5PE7SZB3
'SP1CFD0KXA1G36CPFGDFDAM1JHJ2H7XP100QP6590
'SP19299R5AAYRE7P21ERZYTRV9V0R13YT4X2RZA6V
'SPR7Q4Z01VNQ7FB7EJ3CDH3A1BTXT38CQK4JRK49
'SP3X1PPX49N1MHFSHQJASZHNS4K6MDA4MKTGMJ08V
'SP2GX159RZGZ66BBBWRW5F9BEM2TB1F7VC61XXKPF
'SPP48BJN1H998K35P8ETZ5RRQVYGZ2G747XPV20D
'SP39TAEWH0DYMK8DZ00D61DMA4D4N544HVGQHVJR7
'SP3PKRBPR9JVA3C4DB1X6AB8BPWWMZFK158GC7RA1
'SP11W1XH5P9Y3C0ZETNRD7NEPFGW0GYY4D662M84S
'SPBHS6659W1X64MNHCP6047CE33KS0XJGYBQ1DAJ
'SP1KBJH686YYQ99RHYRH2H4MVXT4JJARSMTZJ7C8R
'SP3511B699EBNE7J7A1BJ96R7H5A51R3CAWG40GCW
'SP34YTRT3ZJMSJXC60SMVGQKDE24V6YCVR76KP32K
'SPDG9P5A7AQYQ5K1BDPBFYGBVF8JG3XZD9BQ242S
'SP1HJ9G0SRVDMH2BPRQGR43T2KB5J301BXEP638CB
'SP3TEH15S7EW1YDBVQW3FAN5772M8XW7BXABT2BST
'SPRADAE89F2YM9J9QZANK903SS63BY9XDK0HHHNV
'SPN3AV2KQ8HYFHGKC34SGVSS9TNMJXG56GXRSR70
'SP1VVR95BWF35KY592602WX1YH0YG302CBT8AJWZZ
'SP16R1ZS66H8N1J1RJ0NHTWWNF126BQR41XWRN491
'SPJ3Z7WH1X8WTQZYCT2ZT9D7DCBR9173FXBXJ6XP
'SPAV0VQHN75HVZ8XX24CHM17N7PJN94YSENZHRT0
'SP1P458Q2Z3CZY9CHDJ3GS5THDHCYD7PR0BM5JFZ3
'SP7TEF3PAXCQHZF4N5PT68GWQ5PGWR6VDNWQ5CYK
'SP2M15MPV81XE5C7W7DYSNRPA55WNTXSGCKG963GM
'SP1Z2CYDTV2HAMJV0EP3ZTKX82S987AFE0S4EEQWM
'SPBB1FYVCWBEPDTQ2W025VPPY6J4J92AJQ34N1S3
'SP1XSRW2PAZ2MNVNRTA0BE2PV4JT4AM4S8MTQWXBM
'SP1WE7GH2Y5CVNTMXZESMNKVJ2W2YQZEAB3Q16JPP
'SPQ7KBBP7MPVBGBDFBW17X4C07JPEZGPSX4XZMKK
'SP4N75P3PES527FSKTT0ZBA8NMRSSCFB9ZDD55QG
'SP1CZSCTN83KTMT9VPKXQHC8T5K7RZQ6QDX4P3A26
'SP2KPAC2GY5KBW9Y9S1P79SMQW072YBC2RACGQ78M
'SPBWV567QSW8101V28XWE0N126RAX906JN8YZR20
'SP1VKEVK39KZTA7T95XTYX3ACXBSDBDQC3HECH4QA
'SP2ZGXB09V8T0TV1Q75PKA8YVMQBC0ZPFYAE18972
'SPDH4MRBTPA7TY969XX57HB0EZJSGTTHP5ZBTAPH
'SP4S5EBHWB3BV6M4RJ2Y6CBVJM3J8B4CFA9H1Y0D
'SP26HC9SH857TM1R4X7NRZGPZJVFGGH5FTARYJ8DR
'SP1S538TKS1HVKKA111X54FCR9DV7YGD069EDTF1F
'SP10TRDNW4VVW85Y2F17X5EB1K90DD0XKG3WTDJMM
'SPG527HATQQJYWT75NY78BKWV99SXBR8TQEP8G04
'SP3X60DDHC9WW0R345QWXD6Q1M91B73KWK76BHPD1
'SPWNHTE1KG0JE1BRNHVDBJ94EJ6SC6H0HBAHBQQ
'SP20X0BMMX8A2F5BST7J4Q322TQGD8Y43QJZ524JS
'SP29MQCJ70SDQN73VZC15W2ZWWEGG2B3MJQ03R71A
'SPWFZGR26ADMXADCE5TE8WSSZHKKQR7R2JRS2MW5
'SP329V74DYC5326TGAF8DN2FD201QS646S4662VAE
'SPNS0NNPZGGM6F8S95452B4ZCVZM4884FYD89Y5F
'SP2MJA78HTP53ZNXAEKSG0A0CNG1Z5T6NDERZSSK
'SPNY7WD51NKPXJR25G0Y80QN7ZPY4CDR6TAP0VB7
'SPA5TQXK1FEEV8SA0S6G2PPZCWKDQQCSRG0N5BM4
'SP3MWVV1MC6XG0KB0YDBP2MF8FFTNBP6762Z6VRBW
'SPZBF4QFQA6NM0GWVV3MC0DBR4WQ4AQCSF5742ZA
'SP17TK3BKFPQADD4Q1CTWSR5GC7GVFY7VE76NJTW5
'SPXEA3AM1AXNMQSQM5NKNCRPPKK97E7YQ6RDPXR8
'SP1TXD2F8BKQJSYWNSBVR6CCJF6HB52HVP318FXT6
'SP1T12938AEDPVPK0QMK6FAB1JMJZMBZVFJXQTV1P
'SP1XFE8ARBQJTCCAR2VZPE0P4E0FVVWBXNYTYN2V1
'SP2Q4KDMT49WP7E8GG19Y4ZVJAT19M2DEHN7NSPJT
'SP1YWV2TWH3XRR4NR88Y3YPDPJRDE9PK7448RVS6P
'SP1WXQYF73B4RVJTM5S2BAMRF5KNG4N2MN1R1HS4T
'SP158SVVFP08QWPNMY09RSWTTMTQ8VXF8J0N18453
'SPXYZ93BG3ACW8MMF85JXJY9WNRWHKY9ZAJ3EY2K
'SPWHS9SQ9YXWYNRCS6REAE8MAJG1HQ55PBS5XEFM
'SP3XTYYV9133Z7RNWEDEP04Z6FZ0E9WVKV9D65XQM
'SP2SFZX1WJSKT1GA2STDT6E5NWDX44GW4BB8DW4DJ
'SPM3FHN0FX79MBDYCZ6QWKHF5J43V8VDK6EFHY4Q
'SP18ZCM270DVYG56EVKQKXHSS7FP3QQCZBZ7H5BVW
'SP1QDF6140PMACZ35RMBBEY3XX9Q7KJ5RDCASAV4K
'SP388NTWTSAW7GZC2EJWY5C8XHWJB6NEPJ7ED75HA
'SP10D6S36BBZY8GZ573QFZGDP6Y6MX4NPWZ8DZAAM
'SP32DS7948M0JRT6C588DQSBNP170FBHGZA49B00F
'SP1WK5MA8RPTT10C2EQ4BEQYN3BBEYY8MCY5FFKRQ
'SP3NJDR2106BK02RGME32P3V5HQ1XQJ1JAG15EMWA
'SP2W5AT6FW839WN5VSNCZ6BTTHZRBKC9Y3H2NAZEJ
'SPAFRYT831WS7ZRHGZBPMNCBJRBC0ZT884HFXERA
'SP6Q4PKK5F41REG9JZJ003SSS3ATMJ4A10E4RQB7
'SP2TERG6W51T3204GEBXQF03D7EA8BHD2RPZZFCHQ
'SP23FYK8ZYRSGDS5A36AJS59HMYNSEYXWGB1JKHM4
'SP2SWRWV9YFN54SJEMJMXVET4V636H047FTKVAD3W
'SP1C79G23QWMW0M3ZRZM4H24X6WBT6SKN1ZZ3F2V8
'SP2W1HT181ZWEY1FZNEEDEKWKSKRAXHGGJCWC84PN
'SP1M4S6VV1NN03N95C97SGWRCRF55CYCXJCJ8JHG9
'SP26JK63XQJWKNB1A453Y33E214XZ9NQS15AVR8K8
'SP28QK1Y9DK99RQGHMNY5TKPNFS5M4ZMMVBKB0WHD
'SP18BSZ7VWZ0HD6BZVPRXQM5Z81RMYCNNSZ70RCME
'SP2DH0WAMJ13BGGRDVEVYKDXMDDKXJYX79305GY1K
'SP2X5X4HSR9ABHSY60SR3JQXE7SDXQQVEKKKVAVP1
'SP1WN58KDZHZ6F3AN911F9FN3B1VGKV5NFDNYDMDX
'SP1Y3YC25R4EEJT6VANSRTEVZA2Y8JG58GF7GJJN9
'SP5G3QSAFBM35GN9E8EGM0PA658AZ1MTP13KQ9N3
'SP2JZH30520DFFS4Z15RY0Q9ZXEFNF6E32S7XZ1YK
'SPYD9TX0D82S6K7K0S5F51DN2H1GZ0S5B45QCJT8
'SP1YW81X44VQH3GDTKT9915HR8JGRP7H20GS423KF
'SP34PBER02VRG8CSPH1J4F3BHRDWEWWMX30Q2440T
'SP27AB49EX6YHKD4WJTEEFE4GK5G7VDFNQ9DGAYP5
'SP31KQ6YW76YS9RBNNVHJ1F452SYXP6SH0RY2DV6K
'SP2RZ48CG5S4S79C2A3GRNP7M9NETMBWW2346MFHM
'SP3AEN3MACD8JT0QRH97D5XCHE1RCD30B17XD822Z
'SPR0ZSWXT1ADA7K4ZP7TX86P8WVGW0H606J110RH
'SP5MGT2A3ZAM3WWJEPQMV5YPZ6136PK66V7GR2Q7
'SPVSDAKF4GM3D7VZB2RNRPVDMECVDSJCHYG8FEHJ
'SP2XWGZ4XNGX3CBMJ60WB8WY5WWCBXAY21M80WT2Y
'SP26F2CV39RJATZ45X78PX0CMQQ8V6GTVBT1NN3ME
'SP3HBYRKZ31RMA1QRM02FFPQM6FHQ7QB5X5WD46NQ
'SPTC3QFZ5XMBDHQ05TBQ5FDTPRCJTK2V20NN3PCC
'SPTVY89K3AFEK7HFSAANVQ4GN3FMCJJXNW03EHZ2
'SP37TYNSXQCD6Y913KPC5M53ENXQF6P6142XQEMXZ
'SMG15YV7YPTP14MJ1PSC9RJ00FEE53M15W3Q47W2
'SP3G5RZETXZ4WB7BWCMF57CF7DSR56M0BHE32VB9E
'SPJJXFXA3VX8RWD3A2RTCFQJAF9DVR9WS42EXBRJ
'SP1J32S2MFQK1TT17J9J0WJ1MXBFV5SAPR1YJ0WDY
'SP3H4TZ5ZNWTTXX8VWS8A973CRXNNPJJN1H7T2GW0
'SPG6E41SRHAPDQRNYRWJBS9JRXVR4H065X8TVRAC
'SPZC6AZT0GFKNV1M5900Q6X5H19NKDBRC160T53P
'SP2BENRVZR0TJVXGV3X3XMK9V7C0TJFGSN8SYB6DP
'SP3RRF8NB4PWFT7ND3JZEX3V8V4D6YZFTFQYD2AZS
'SP3ETD7NJY5STSZBD2KRVX840EMW5AJX2TDJ7Q2BQ
'SP1KMMZCJESRYGHZVDZKRXZ1TY778GJJF6SRJ60WG
'SP1N7R7PT634TRWGKZ620HHMYX4YS1P3996YTM42S
'SP2ZHTK0AJMXF20KCQTM482YAYB6WSY7A7A708VV8
'SP1HMVKQK2TSWE1S3P1239BENY9PZMF70CC764M0B
'SP2AGHN926XTT6ADKVKEK49J30M78C396W7ECA3Q9
'SP3EJ1M2681VYSEXFVB15ACCTWM7DVQ4M0WQC13B8
'SP2C25B1DQ60ZJDCBAY1FVT1KAEGJXR5RBN9HRFY8
'SP10Q0MJKXWXJ2FH9GZPSJXHJX4K2ERET5TDJQBC5
'SP13RJD0P8CAD7WVRQDT8X8052G8EZJTY1SGSBNT9
'SP2YKCYJCEAJ3NN92V5AT1HW8A497GNASMJNNSDVC
'SP271QFEBN0EH4N1XTFW8T3GZCZS2VJYAQ508QHVM
'SP2M2ZFETRTR46K9J19N94JHGSBF8HRE4M01K721E
'SP2GZ39RX2YJYQDW72C73X6PFKX086FV9ZVKRTPEK
'SP2HHTZRJFAE92M5V5Z3NHFYJDNG5NEWMNXB0MG4W
'SP3NWS0XNR5DZZJWMVBA4SC2KM3CJKE6YKDTE2JX8
'SP17WH9WXDENGR4EXFVZNDE9RW2M19H5C8SQAMTG3
))
(define-public (burn-mint-zststx)
(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? .zststx set-approved-contract (as-contract tx-sender) true))
(try! (contract-call? .zststx-v1-0 set-approved-contract (as-contract tx-sender) true))
(try! (contract-call? .zststx-v1-2 set-approved-contract (as-contract tx-sender) true))
(try! (contract-call? .zststx-v2-0 set-approved-contract (as-contract tx-sender) true))
;; burn/mint v2 to v3
(try! (fold check-err (map consolidate-ststx-lambda ststx-holders) (ok true)))
;; disable access
(try! (contract-call? .zststx set-approved-contract (as-contract tx-sender) false))
(try! (contract-call? .zststx-v1-0 set-approved-contract (as-contract tx-sender) false))
(try! (contract-call? .zststx-v1-2 set-approved-contract (as-contract tx-sender) false))
(try! (contract-call? .zststx-v2-0 set-approved-contract (as-contract tx-sender) false))
(var-set executed-burn-mint true)
(ok true)
)
)
(define-private (consolidate-ststx-lambda (account principal))
(consolidate-ststx-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-ststx-balance-to-v3 (account principal))
(let (
;; burns old balances and mints to the latest version
(v0-balance (unwrap-panic (contract-call? .zststx get-principal-balance account)))
(v1-balance (unwrap-panic (contract-call? .zststx-v1-0 get-principal-balance account)))
(v2-balance (unwrap-panic (contract-call? .zststx-v1-2 get-principal-balance account)))
)
(if (> v0-balance u0)
(begin
(try! (contract-call? .zststx burn v0-balance account))
(try! (contract-call? .zststx-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? .zststx-v1-0 burn v1-balance account))
(try! (contract-call? .zststx-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? .zststx-v1-2 burn v2-balance account))
(try! (contract-call? .zststx-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))
)
)