;; 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
'SP2D4BNFPXSBN2D0R8QS2QRQED9TTZVVS8EBA7RPG
'SPCKYCR729QZ2TFCWJVXM91J0BPR6SWDQ4BTSWF5
'SP3CXAR2VXWWCCGEQ94YKVVNPN6S74P3YC9XKHKDR
'SP21H3NM2YXRB88TACSAK7F5KAHSPQ79B6B87TXT2
'SP18T0NVN9ASCGTHJNHP41NG82NE50ACQ8AEV6HX9
'SP378NAN3DT5Q6A4ZRQNX9ZX1FHTTYNHXD0VSH0T8
'SP1YM7WWHA02RYR14EN2E7720KZMWVCJRX9WQ3HX9
'SP35DJCXZTMP5DH4GR3C49ABXZ7MGRVPYSVREWXZ8
'SP216CCD1CXGSGVXEZ073A6M8MCACT8QQ33XH5QV5
'SP2C6BAJFCZAQTE9JVTNHKERP9E85HG65DPTXHH08
'SP1NM07V4FW2B5206E24VB07F9T3HFCYCCQRVBJ6Y
'SP3W8K9APP6F00MN74Q8JR86M650SPWDE46CTQZZX
'SP3RVDPQSZ11H0E93B75H5A0BH09XAFSR7N1KHMAG
'SP37WSM3A5R82WZXWMQZZP375VBVC6W1QGSXDJ8TP
'SP1FB3G0V2S78SMQ11M1AWK3JXXAYP2FRG1N54634
'SP1NE7ZFNT8KBGTFX6BX1TCZ1QJMGAT2ERB0RK48T
'SP1XC8PH6FK8MJ8S0M24WGWVAPPE4Z7YYZ66FEW7C
'SP2KCQCBSGRWVMY8S80PVVXVXFA3G70369K95TCQ5
'SP2G5BMW0H0YZNNWZDECJREPA19G8K06BW1KRT94K
'SP163E8CNQYCPN060JVBTVTV6RR0QA4QDYRE84D44
'SPD7THD7GS835R02RMZPDWJ3HE6JG1CM95CEJVF3
'SP268RA6Z6WSZPSCJFNJMZHH5T1RC09J3C1GYJY7H
'SP2DH8EWYV1AD95YKNNE4QTY1VWPN9FET8Q6YAR0H
'SP3Y61HTFVK1DX11XZY0CAYHFXD89FCA6MXDJAJDK
'SP10CTRSKN508PTZBT327V6JRT49TWJMQBAK4R9BJ
'SP1NSVETQ37380Y1Q9SHBEPAWM79NW7HKDYXN8E2T
'SP2F800YGTMKR447KXR0ZPPTZ7KQ4FRWD80GEC6NG
'SP3BYEB6HYXQCHC9JCAB1MD8JRXSE3MPB9AAYNPKS
'SP9ES981MBE9RJPTFWWYBBYTESCR3K3V9J1742XX
'SP1S1SEYS6YP2DSH0RT0WXJBC8KR3KN0SWPB2CDFE
'SP5TX47XA0FPHJ3GP3QM1G1PXT2NYYP9R0A8NBF6
'SP33V2AAXVVCTR11DVJPKC5HXKWXHGWFJ8M5WCR81
'SP1W9F2531BJ09RWYZF3FXBDN3KCY4E2TDS221263
'SP2G1X9SBGSNQB3357D0B9VGTEHZ1EN4981SDFQG6
'SP3TSJDJ55HVZM758W7T3M2GXE4VSRQEYGDZKFW4Z
'SPD1KY2V76R8PKA0HMHHCCDE51KDQXJV0VM98V1R
'SPSFH3JG92JZRXNEJWBHZM0AS0ER6TJJA22QBXS6
'SPYG8DT91J22PJYQRFQ371QZB970J3BFDW4DSVZF
'SP3PZBC7GZD0H49PJ4VT0CQ725W5YEMTEQF1JKSA4
'SP2X4FEGSRJ8PJ09DYGVVMTGQK9H6CSKQZGNXJQE1
'SP26RCCH463CWPHP7X839DTM51RZ8T134CYBMMD2P
'SP24CMWWRHM2536ZDJMT0Z3H3AH75THVPGZN6MTFK
'SPKEQ6E1BC611T2TYT0FQGPHJ7FPDEFAS9BWTKCY
'SP19DJSJVYR5RYQVJHM60K8SP00VRK60M9AYNE790
'SP2V33EW6CRS8NHQMG7Z8F274E08S9ST5RC3PJCRA
'SP30X0CQAT4MZ5CZCX9V89JYT87K60E8RASBJMHED
'SP1VE2C3RH2NAEM7CSBET6AZB8BMQ6P2JEV7S34V9
'SPEKD19ZS4PR375K8JX1AZE5K30Y50CHXBS93W0H
'SPXR7YZ18S63W00F1XE89VGZRE07VVJZHHV02XR5
'SP1WACX2V9EYEWTTV0X1760ZR7B7YEMBMFNMFCCZE
'SP1305M27AFEYSW1BZJ14QAANKAPV8Z2ZGDVYFF3E
'SP37Z1045DF6VR3W8AE0J4HC5KCBCBMQ4GSB5Y38X
'SP19JQF4FC5G5Q7DY7JV5MNCRJXA35NQ8CSDEMASC
'SP1T9KBTFXH1STT3KN2SJ008DBVERMQB724GW0HZR
'SP3ESS7HBVRSR6V40V21HQWD7S3T87VQZQVSXN3S2
'SP1NCFRCK5KCY4VM93E9B2ECYYW1QB33P0JXBB69B
'SP0AW56JCG6XNAQ8XTRA406QW2MKGK3Q79FNDGF3
'SP2JQZHRKSMK8HR736E9NCHPWE79VWGV317SPB12N
'SP2TG5M7W5DZZTRA2ZHRKYRHMXJ302W4WJ2NJQTXD
'SP3RYA48ZZA0XRPAQWA29VZK67ZVQXW9XM6C0PYW9
'SP3AADSP6PKZTJRCR6W9EKVV9P1E2T5X41R9G19AM
'SP3B46JEFJARTR99JMJDZWJ5AK6FXTEFKX468718V
'SP51JCW6FPBB92J6G6XET87DTSKHQSV49Z5MQDCR
'SP2DG7NP284B52ZTQEY7B1SQFW56SA2FJ4BTTBYME
'SP3KMGHQ0AZY23G1RABGD8VT0BY8P2C91J604AA8G
'SP3VGZQE95AHMG49ES9MEB1PDPJWMNS2HB6R18992
'SPJQ95VN4R1539DYA6NKF7AEBNER153SF20608M7
'SPNQ4V8ZTRHSTRCG8JF2JRE57FMTKAYARYPZA0K
'SP1CRBCJX2ARGDC5ZXF16XXCVP5FDGSNCGW3324BK
'SPR9HWDFCFSTGEA57R5YT830ZQEGRZQP208WYYX4
'SP20RXX0E90CQF9EDD8R6D7272A40B4JF9DX47QRE
'SP3ZC556G8MY761PSX6MTH3J9MR6T40DYDZZXPZK6
'SP17V4Q8AKP29GM4NQ8QSQD6M0JH9DS8C5JNRJHT1
'SP1GSG9WTQ2B1VQR1QGVE0JYEY73725NKDQK8068K
'SPTJ8KDX7AA6VDEJQNYNV4PJ832NEMPEPTY3F4WW
'SP6R1EKY8QYG4MPWXT6NZHXCDZDF1RVMJMKMYN7R
'SP1W1C4J5P4TCYGK6NQYCTY7AFQA5SMQ18EG9NZB8
'SP3Y8S1RTNFYQPJMT52NP0MVNBH3ENBD203J54YRV
'SP3YEWQXPP6C4VPGJB8Z0N0XD4KS1TZ20QCBKB61K
'SP1BEPTEAERHYHV333489Z5DGBJENF39T54DHPGE9
'SP1SSM2K91JQVF4QK4PV563W6GMJSTRS09VZW1J31
'SP2PGDQK4EA3D1CJ8TGWQGQZD5BM4RY16P8YSFDNY
'SP2QCDVNWBM0HPKXZ2B9T9SJ9YB2ZG1KJ6WXJK61A
'SP29PBH92R16WZR8B5DRDKNC206ZY8TKD91BCQ7D7
'SPRVPKRQVVW60V398HKQRM2WT8M59ANW8YEK8CMM
'SP16WRK460P6KV499JRTBEB8RJQ2H9RV2ZZ93MR3
'SPZM762VKVTS8YHKG8HM7FR1KJYVDQYQBR320W9K
'SP37YXBED47YVZHAWTFTWBBP5NXMTHYEBCZ0FC41D
'SP4D369B7ZEVCC1PDCK589D4XE3NJFW2KC366N27
'SP2TRVAG14MAR9WADKPKZ1S4CRBRS9Y4EDFXPG88S
'SP34049TTMQMNWHS6ZGQJ59PWC15T1HE3ZGJ6ATQX
'SPTVXRMBKXMFN7V4TRAPVAP92PE8NPMX7487R59J
'SP305NMNMC0A4RT77BET3Q3HGPCGVTPVWH1860YA7
'SP3Y33CJV5YTP8WKJ1R7QM7RDJ6S8KVXWF3B4S0ZG
'SPJ66HEFR5MXZMHC5GGGRMP4GE2HA9EEYKENNP2P
'SP2F74K4NXDEKWH739744MC6BGH0M99Z02RHTHE84
'SP380WYDKAB86C0WPK6FZFRCB3DDZTWKETDWQ9T54
'SP3WG60S7VAXS92YW9GNQRV382BF0GHTFJ3EKN0Y6
'SPH0VEEAVXJQ9G6X5M7K6S3S1VTFE9W24P904EE6
'SPDAY5W58TE9EAK2FVYEQ5RGMR9DG3WV4QBY6QEP
'SPRFZ9TJD5XMMM9NRW0ACZ1ED1X3MEC2NWNJ9CMM
'SP3Z412AWB9DW1GH1JKP5TPZZRFWENF24JX5BEM4B
'SP1F91BQSX1FZYMNXBZTJK7JH1CZMFMBP8V35FNYN
'SP11B2RX862CABS1W61NJMPKCEJ13TZCMXPJ7QKA
'SP1CNBB4H3XK5WNZWC6CDWWBT7M1N0ST8040VCP94
'SP7M56FSB1MWS8MAMJADXJ2Z1N8D3BWPMCTTYMWG
'SPGAW3MCH65T77H80F5EMHDT0DKKC5DM8WWCDVVR
'SP1CZJJNR2BQPNAEFKKSVE9B7SJNF9T8R2Q8S08VE
'SP1Y0M9TM169NASMWZC1680HEGWSVGQH9J0ZS3H12
'SP2BY7JAXFAXT0QZQNS8SBJJ09E20JHB0FRM48SVH
'SP38XSJ91XTY6ARN2W58AKKPBJAJ0AM02W1QJ497F
'SP1RVMDJCF57CMMBGYZ8P8VCWV3D9MVT14SRV98VK
'SP1RGW2YQ6W5J8KCTY0MC30AHVX1XE7GS9A6YM73
'SP2KA16J4V0FSJBNG8EP4P624S2SXEAB9F4WXNNJ6
'SP2JF9JVQ6AYYG3VDYYSM7B87DZTK2QAX783H3T5R
'SP1NGMS9Z48PRXFAG2MKBSP0PWERF07C0KV9SPJ66
'SP2FA1H3K9FMY2CQ80WWT2JYMHZ5Z2B810AT41APW
'SP1EWFTA1AANYGSRG4E2HDJ1E57FB2BZ4QZQNG64T
'SP2AYKW7F72EFSAHC1WBVHKQBE7MA19WCC5PRDC0A
'SP2B4M6D4NBEJDDAX22SS34MEPJPPJ3T920V7RHYE
'SP3SSQ80MX20VRN1SJ1YHMVMYMB6DG1V925GAT7NA
'SP2EZBRH2T5A4TPFFTDK48CHR0WG95YZZA4HC1TJE
'SP16KEHSZT4TN8VTAPK03HZ77PYTJ6W3GBH7CFF0S
'SP1X8N6J3WB4E9F4KT9G0NFQTATJPQWC19Q72BQAP
'SP3WHY3FT5JG0A9NV28AZH0TF38AHHZ1JHR9VJKCH
'SP33JS3FEPHZ0254MX17SK863QE1MNTJHSEDY94RF
'SP2B3AR9ZG3RNSVTRJ1YZ5X631YXHZVJSKZPXWQ5N
'SPM8BXZ84S0THSKD7012VR1A7F104SWTPSEGWY4C
'SP12827T3YEN8812EXXGYCPY1BW4M3KB6FZ1FCRBD
'SP21GTVTEEDQBBQSK6FPEG4G4XGQRJGJDQV41CAD
'SP8K6R670CRGD33YFGRQFWQ1CPWAQCXQ7D5KVK86
'SP3XNAP9KD98GVAQ4MMAMWH773PPC2W4862Y4W7T1
'SPPV60Q4TRZTZTDWEDJ88YM43GNTTFBFG6SNRB15
'SP2X3755VRDZQPZCZ72PMH260J4NQ4J55GA9GAE9W
'SP21JTEABHK6KK6ZFR9AFDA02GYYP984T5QVB9ESQ
'SP3W52FFFV8Y1589SF5K9E9D4TE6KKWW5VMREZ0N4
'SPVQX0N26TXX84XNT1M4GA6BJ6EFT5DSJQB3K049
'SP19WPKPV3TYD5VKDXZX4C3AKKD5A3GFD4M76J3RC
'SPG6M2B89MV2PQPB8VDQEJ13EJKPMJHPJSFY54XH
'SP3P9XNPA8GQ2GH2BJ0P3DK71HS34WSD6TK59G3HR
'SP27K5VXGG9512F3Z1JCE5NS4NDC72KAAZD929ABS
'SP3PA9N3B8QWGT59NDW1NBBFWSBC6E75TMPNVTR5K
'SPSWMG92KG6APQFFX8BEQBE2ZF29N9TWR5M7R56C
'SP20QZBHD8QZKS9NGV9FQ76KQ6AD98SGQKXYQ2ZPG
'SP1EE7VDA75CBET7SY9NCMWZ965FSD4DMF8TP6RC7
'SP1VXXMCJ5MVCXK36SFD0DFWW35MEK37AFXMWQ017
'SP1Z46Q3V6AJFPR9B8R4K7F04QVE2YW6ZNEJKG5VN
'SP1997REHPBDBRRWRHCTF693SHS0TDEA6V84TKYZV
'SP399DK5DZ3Q9ME894KEFZB4C7BPJRT4FYH08YPNZ
'SP2MMDXEY1K4AK10SBNCC05M4RY3BNPM5KCSKEBSR
'SP1NEYZ0E1G4MXXA2GTPT2DRSQS2XCMEAE1YKKXMB
'SP394GJXSENF2QMB8S4NGKVNWVD75J97XRQZ7C6N2
'SP25M96RF3MSESHQXSNKKQGGX52Y22EFJGPJQFKBE
'SP3XNNJ8TMMF1YTETT2Z070VBYJG3Q7DZS00BA2P3
'SP2C6WA81XA5XHBS60FZG2KKNHS9M4T5KQAMH2P4Y
'SP2K8KMB5KFZHHPEGDH0X7Y8KVQSG3CYHJVSX3FHQ
'SP1JGAW4KJS31AEQFGVB2Z4M7Y95NNRA8GBMMN515
'SP1HXT635AVD4MWFGNYEC79YG4TXS5QJE9NTB3T2A
'SP30A5QYGBG69PQT7Y2CVW9SAX3VTWA3QY5DST080
'SP5V6VHTMGQF7YJNG3CD6RBG39BF8XYFDDVZQGRN
'SP1N6QYMS4771B58J5WDQMX917F2ZQJVD48RJH047
'SPCDCWBEZ9ZEK49BNMDE2MDMJ0E01W02H9SA4TVZ
'SP9FAY1C55SERZ68NNMAX34EVYW9A0XJW57V2FFH
'SP3J0X4B678MMJW3V7W52MW1KGV1CZAJNGJR6VA0N
'SP3HP0XTX2CC4GZN4T9XER4Q8KFBCTX9YXE7H19GE
'SP1FW8AA1YQ10G931P2MT40ESVK1G6J1VZ15PN8FV
'SP8J27ZDC7AYZ80EK3CN14GSCE52R9H3PBQK8F4A
'SPMV9V33BTPX45D7K1YJRV4N65MQJ8C3EGKMPXVD
'SP102FPDQSDE9JZZV1V8K51SY4WWJMV6ZQZ4MT3MZ
'SP23P0R5P0JWA3HM72M0C4H5T0MR0MKQP6NFAZ3FX
'SP27DSHVCV8WH5R85XSJDFS314VWG33FGZKJK7R8F
'SP3N8CXH214D2NTYZ2PFRFCK9EJJMM6FH3MDGJ8SM
'SP4RWYXSAM1TXYNYVFDV073XKB4W9P5HWT4RP85F
'SP87YDTZ24N25N1499JTQ85C28S0MNQZ1P3D9W0X
'SPR6RNTSP1TRMNXG17DHN7S2EVQ4AVDK9Y38MK88
'SP12ZRK139NWG5AWXXRXT7A1MHAANDDGDZ4H37RYG
'SPG4AM3P10V8DWNB4CC8XBQDD5244C8Z8HSQQTYJ
'SP2MFVABGNB6F6C4TVERCG0ND5CA3FWCRQDAH8FP1
'SP2TT71CXBRDDYP2P8XMVKRFYKRGSMBWCZ6W6FDGT
'SP35B8D78SWFDFFRMXB3X015EDEM0YFARXY585N8E
'SPMA0EH4FZGPA1FJBQXJREE22CBKYCBBVH8M55TV
'SPSE66H734989AC6PD3X3M8CZZ34GAV9ZWVPCMNQ
'SP3JG5564E6GW56ZFQ5G7B8BMQ8H3H292A3JT6AGA
'SPDTG2CG4Q3AV92X0RMKBFPKYR7W77ER6RPGZ0XK
'SPDBCT835MPD9HTDTN56WZX9J2STSQXY5M3JJ5G2
'SP2HY3ZNRF1ZA202KQKW7C59M24QR0NZ2NXWSBBP3
'SP147GRE72QZBY1M668MJ3FVN9H9VTWVPFGFMPKJ3
'SP1XVVBXPSRMQEEDB549SY1THD1Y00KDHHWXTYFXZ
'SP2PN3KB4SMAYG1D9Z79294ZB83NGKB453WSK18JC
'SP15P56F24FAY09RVRM98J0NDCW2P3JTDWWK8RQ1J
'SP1NHCT9VFB5KWZ4YKVQ8RR7ZSG5B1CDY5WCF06WH
'SP3QB8DWAWXHJZCV9A5882Y2QY4ZM8Y3QZNEN5189
'SP1WQFZWWKADDEF1B6Z9T30QHWNY3VR9X0MZC63G4
'SP2EM5T1YJNVDRKXC4M7J1EJV9NTN84K9PN1ZS8GE
'SP2GB8MCSPVQRX2M7ACDTKS75DHA0JQ8GSD5JJ8ED
'SP1T7QT0MZZ318GW7HJ91JNTQG5BX438PNH7B5Y1J
'SP2SNQHT55ZM0TBF7DD0TA39XM652QZ97E3CXN2SJ
'SP3PDWEB65GV4N4W1W0ERD4Q047M10TF72ZBRSPMN
'SP2FDSGHQ5NJYXX8EE3GEW1DD44YBMC00Z8KVVT65
'SP376Y7METTJAT372GYDGD225YE20A01GAV7KJFKN
))
(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))
)
)