;; 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
'SPRSMJ5QYQM8T0YRJGAFZXRFXN3K6PCDRDYE6B2T
'SP3SXNT2R5QHETRQMM7WGJC9P7DXGYCMEKH70C1HQ
'SP4MNERPQV3X4D20Y0RS9M943GPMVYQ79EQW8NN5
'SPQFACZ5KGYJH3XG8BDWW2VGGRBJ8BPFVEXEVC6M
'SP3Y3GPE1Z5MS97AQMW83BV1YA68APTTH0MFMVPXW
'SP2W0538S5PCZVZDNEMJ0CJF4V0B20DDD6XT2139N
'SP1G6XSM7Y9Y9JFKBMEJ663D3H16MW096J2QFKQ0B
'SP2R984KG79F9YEWH99FNYJKW1KXGSJ4V385S7525
'SP12CW8WE5HQJN0XTN97QWTGXKFDS5YPBY17KXMKD
'SP1HJVJDX1A37EGRSBVP1THA8QA49A7F472FWPV7D
'SP1GKBCNG7F0TF6R9NQQRH1R6BMQZZW5DPYW1C515
'SP2RMHZS4XXR8KNHSZSV0FZ7YKJMKDRVSQMP7ZSK7
'SP2RRX2EKSDFSZQNQEFJ0JXJGTJ7GGGB29KKE1AXB
'SP29JDBZVBA1NVN40R4RZJ2H4CXZJ75B51FJ7DXAP
'SP36DX1KS17WR02EQCFPGQXCGRBS8CSSME4P173Z7
'SPKAA6NM8058FQ7RM4XDE1XR00T05YTZWVWBD7CM
'SP2RTRFHEJW876FDC3R2HBXXSJ11GADG2208QR51H
'SP21B5C5NTPVCG319RWEDDH5KTZ5CPVH5T8BFACP1
'SP2K1JY15RM8YFKW31CT6XRPV93N4YN928HPJGYC3
'SP3MS5H6FDB9KAE92AMRDVZBGYWSXW8GX71X7A2P5
'SP6DAB7XQ8YE8WM37JY65M9BMSC7572KY0ZYFX4Z
'SP2HEP81NV5WB9E7TRJNNP1WEQ5Y8FNPZ0YHAVCHW
'SP38PZX3BKRRTG3950PSHYMJRVZ5PBC9Y57GKYNS8
'SP3NSX0BRADC2YWW49YC5EYZH18NE6PZA5DRTQN55
'SPW5SZZ1KFG6KFF8N8JF73QTBGJKHT998RRBAJ30
'SP32FBR7CVXA13N61PHGXGJGXPADT8ADYWNH1CZSJ
'SP2B60TZH7X9XV9H7NKGVER9MFE6GP4THTTPKQF1B
'SP3V1N2QBQPZHJVP82PEHJAXXZJEV1TK361DDRAF1
'SP2TP09VCVS87T27RZMDKYHXB8T73B5VBZ237GB3E
'SP281DHYZ11K3B0BQHPWBBH5SRB457270073RVVES
'SP3YF2ZN7S95DNWTYC4E98PDR7HD4EYPJ838HMMYJ
'SP2BA72NM4RF4KYVKHTXTYF4Y3XVWRD5RNB62HNW2
'SP2JB3YT19W714E5ENCFNDG1MFNS3MWVDQH9XBKJ4
'SP1YVCWBSXTD5R6PDB5PY71DKA2A1TGSNQY150EM
'SPXDHB0NW30ZSKB9KMBB7KAMEGP01X9BX5Z255C6
'SP3XX87N1K5EVGNTGCMEXHWFZFZ5T5SRZ04RC9XBT
'SP1ZP650KJDD91TQXBPS6EB4T54EF237NW1MN0G8N
'SP6FSZ841ZN4X340W51AZXBEW942B8CEFRYBP3M3
'SPBSBH8KGJ9CF40JF099QB9TTP42MDM1SXVQE7PZ
'SP2MYQF316JWNY0M6MBGRFPZS17GJKRA26ZPB35HM
'SP2DWTSEA5073VQH46F25KFSEETKERJ5ESE9GCJJ3
'SP1ECA5M0E3NEYGGV8PNY61VEDA20QPVN23P8HTVS
'SP23SY381RZ6QXB1X8Z4DG6G8ETZDWZAT5BWEKCET
'SP3CX9HWGVQY04FZBRM0XTD0XS4GN538STMKNZA2Z
'SP3J9J71T02XB5C4PJJT3FZ1FASYJ4V8XMR6QY8D0
'SP02SP3EBCJ45RG4YT07PS088QRNYKXW2EKN4D91
'SP1BYP5JMNSD4Y0E0XA7CEFWVA8ANGZM79RMJ7DA5
'SP1M2T0M9NWKTHJNFMPCCQMEGHF82DG935TMEJ50E
'SP2KP0K1AYV2T39Q2FKJFVQG9ZMG90DPQ7JRMH3BG
'SP3T8XVBX10T72WB2E41ZTS5NCY85WC6YMWR2QA6K
'SP3DGSR08ZWWPKKXXFJ91SC2JQ0HZZ1JC927DM58Q
'SP22EDZS007Y9Z3WTJRK1S9VFP8YEYD5DGVFZ2XM0
'SPSN6K776CXQBFSVM74W4SAR8W7HCQD6844FA4XC
'SP8P3A9HTE5TC8NE3H0GQ75C003SQF1MWC0BG2K9
'SP2V2B7EMRA7VYF6NJHGZFK406B6R3WDC9FRAWBXV
'SP1CC4F8MVMFKJ3PVMGXJZEC2ZCPV6MMGVF921Y3M
'SP1ZFYA52KJP45K8PEW75RC47D26ZRFNSZQRV7A4W
'SP2MXBK498GBVS4DEJD770ER5R9F1CWCME3AF01JS
'SP14G080R1D0DS34FYJ2P2CMKNFBB0ZQNR7EBSPNS
'SP2XSZSQ8XGTF4R1JT3HEHRZB2TD8WWQY939ZSNGQ
'SP3BEB0FYGCKWNVEPMPHZ7KDWF28FABKSPCN0CEEA
'SP1M6YMXN2765KHVDK5AGT1WG1AY9G7SA4BPGWFNB
'SP1C1HNXKT4Z37W8KR2JGGNDK99SR46AT7K05TD87
'SP29N16Y4GQNB9B59XZ1E69M5R6EXC6RFWVRCDNVH
'SP2FT36JWVFAS00C1JW9YD2CVFSFZGT8XJT333A0R
'SP3S5PHE5SFRS8YXQ75EKRN10NMS50GY106Y98GGA
'SP3VCX5NFQ8VCHFS9M6N40ZJNVTRT4HZ62WFH5C4Q
'SP6HQP89M2ASRDH786TAGTQ6JV34AV0SCZZ5DN1B
'SP7GS93E2RY8SSZHHVF3XDP0Y5R9RF18TYZG0M56
'SP28SX5ZZ42EA3MMFEA9DESQ7S2SABAG64H9CE32S
'SP4QVGWX47MSDKQ94J4DHNKZ96JVXRHA4532XC2R
'SP1YMCW211Y6KYJ4BH9Z07D9DBEMCR8WCWEY9MSVS
'SPC1KE74AZ8TT6GB8MXSY6W00MFNC29GDFXHPJX6
'SP2DJQJ4NY12HARXAVGFBG97K3BNW82SR6YAVFZDK
'SP25JV30G9TJV095SPMR3M1ZE0K352HD3Z0M367A6
'SP3YPCZ78BTMFNAB4M5CZA4JZ8S6MMEMHQZZZVEEK
'SP177T5NSTXGC6ZF6RG2V6PK544VX0J5BV87SKJJ
'SP5SDPRJKFSY0622M6112G6JCMTCMS1JJGQDZ17V
'SP3J0Z8YSJD20TGEBE6M992CWFDG18VB0PR599VY9
'SP1BVZMZ6ZH09T7W93X8XKKYBVB1CVZEGYPK4TDBN
'SP1Q576A61WCX1A8P8RNZ0WFNBS4YP2G6D1A49CBA
'SP1A6MCWMH9RFMV8JGPFQWF606J8X1XE2RPY7M1RM
'SPAPEK8YHYS9PTK4HKBEZ9F68D1NV4KQ54K5ZPWW
'SP1WHXE0DJ3AMZ83GK88R1B9VXM455ZQKF42WPWY9
'SP2AD76A5GB28SQQ35F6ZDZ6WAY9AF8XJPRHG5GCM
'SP3EX1PXY6XTG2G2SCRC7CFT2GMYNRB122RX67NQF
'SPZZSPRJQBVNJ0W888ET23XA7XJ33WR4835SDNF1
'SP2S04CR4BXYZAJKZ5EX6DJP6M91B4BVXW5KHTF06
'SPVYJHP1HEQYX7J7EXK4T4D0FD2ZA340FTT368M2
'SPZAEJRJ6FA2X8KTFGZ7ZPJJ12N4HST9HYSE1V2R
'SP3HNAHDP23DDC4589STTSDYZA3CPYJ84R872D086
'SP1AP2MP8DYJWCWRFZC2H5G744JZ2JDXPWVBA9NC9
'SP61XQ5VC22VBC8A685W3JFCX3TD366GKGN11WSX
'SPS4HWEXC0C1GK18YS02P7P4RHR35AT67B4YD0VV
'SP2AH81APQ7DWCKKPHVZK1G2NSSECQ3E9BCJZEZDR
'SP3JQSWM0F9CZ26HMGWECJGA3TNXXR9DM50778VJD
'SPAGS34MEBV3SHE74DW0EP54KSFQASGWPSHM7Y0C
'SP3ZD58SSCERCN6PMKM87H80227HFZB56YKB36KW
'SP2G2ZH9QXK68QHTFT83NMF6RTCS2WDTW17EDMZQE
'SP3YMQCC594WZNP84KKGHNE3EF1HN17TX1VV4ZGXV
'SP3WY7PFV735EXRMB0HM8SG6W0ERAA7Z6H4398VEQ
'SP6NJ2W531HJM9W4NE08A2GJB6M9T62RRH8JJTCG
'SP39C67QEXVA0W12ZHG14H5RXWYMEDVP2XQPQSMXT
'SP2WX82B681E06D03FCM8QJF640PZ7PCHXE96FWHQ
'SP6J8NG0Q2AENEMT9BYJR3785M93TJNBSVTAHKET
'SP3VFX95CF1KHRKPMEE0F4X9DJFTCBHJGPJ7FRS9Y
'SP1YFNJ8Y7XQSPRHB60ZZJQNS5MAFRQYMRXT9T994
'SP1J46N6S9V13A53STJXW062SEKEWWXQ7ZEZK5BP5
'SP1Y5S7Y8R3FBEVD4NFDVYGVXQSKCCQGJEH1XWSF0
'SP2Z7B3GJ6PPHV0X5GN3P876SQ4VE27FX6HE6FHV2
'SP3T8RVWVKYNCARXHM6JXCFMPYXNPS3PR03ZT9833
'SP2SD6921RJCZZGRHHECXZBMTTNNF5R7BFDA2TAGC
'SP197PW7EE4YN54PGAKKJBTPPYJ75HA1258NEDZEW
'SP1NB4E1FARJ0NFQH0X1VBAJ1TPFMN9H0AGTSPB16
'SP3ESBPRMB1TC74VXDF3P9MDEQXN6WE7KYXCD04VW
'SPC92KKHGWRXAJD30ZHQA041X1R5Z3EHMWYMFD3G
'SP1T4RZDKYPN7QQN2SMX7F73MQ8ZG4SDYX017D8X4
'SP2GRRJ18NHCHPDHJ8KCS09PJKR2HMK7Q26R9XMAQ
'SP3PN457AYB863WP4DEQEACE9C76ZBZG2ZFRX0XGA
'SP1RXTJXFQA5J9TZVB0XGHWZB56GEER1B7FRY0PEW
'SP3J4WGSTPXPGATV4YNJJ6YZAKNZ7YKQX247GEJG1
'SP2ASBP84JMKC937BVRR6AE13X4P4D3BCTQM5GQH6
'SP2DFV3QD6MHG82303HWRCE4CKAFC4JKMZ2QARX2N
'SPPP4VR12Q74MVJXQFZ23CHH83V7T7PT3CMXJRFC
'SP3RYK0JVHKXNMFKH3Q7S6WN6838XZ10DJVJ24S4Q
'SPSTY0VK6MT4M82HGTABTCGZN4RZ5FZW06KN3KFX
'SP88T9ZPQ2B8VECHWE7GA1H6YFYG3013F2PMTT78
'SP3AKBP5TXJ4BKTEN7P6JH5AHAJ2Q7ZAXN51R8PNQ
'SP3G3GN0K670Q3YN59X2BYH31V7YWQ4Q547HVV1XE
'SP14P8KH28NGJT4BVQ6685N19T8G6Y76WBZZD0EKX
'SP4DCE7QPBAD3QBE85RH29JQJJ8X05RA4CXWB8CH
'SP2B8YDSKNRQ41M8TQKNX9202HPYS4KMT4PRA4RF4
'SP2B76R0S2BKJE1RFES2WKX1HSGR70M5VW7GJ5TPR
'SP2DBGW9ZFSDG1CSWJXTF32R6G3TNXK7ZEQG7KKQZ
'SPCH4F28VMJTA3KT9T9FRKCWF1H285E3GZ1KB1XJ
'SPEFXT1ZV6Q4G0MZ8BGKDT6K4DN9A88717YQPC5Y
'SP2WHHNS0QFZKE4J2V0PMJ9X4GHKXA6NTCMXX36AF
'SP3K8C7XMJ3NJ5SCW35580Q7E8J5BZYDSWF9DHZRH
'SP2VNWBGYCVNTB8HSVXW31PJAGAC48GJ82FVA1CPP
'SP153ZJ69T34S5Q8MKKP7THB9RVCSYFVHJV37S2EC
'SP2XW5QP3M9E50CBE15G3BD7TW44J97ZCKMDR2N4N
'SPQ84JED7Y8SXVR270ZQR5RFV4FZRTF62W0YX35P
'SP1P03FT5XAFCD50K821TW7YW854QG80HMYRJXDF0
'SP2CR3AJ2MNQKG708PJ6K9G13W34NM2N66P1WDJCD
'SP3GA5R7MNK6B5YY4079RQ16DNDSNFTDQW1WB6MJ7
'SP33YM4CD73DBVXDM1Q0GKGS0DGF8SC9P9SXF4Y7E
'SP2Y89Z3WBCDCXS1VR0NY9W5BX4AQVAB9S4BFEB02
'SP8P3719TMPXMA2DYP9696WX0D9213K1CWY6PJ4Q
'SPC37JHRY1C06JN1QRFZ6EV4F8FZ5XNEGKHMRM2F
'SP3T18Q8R8D06WERE5VEQBR1VY7H3QTRDXB01PTKS
'SPAB8DT8R3Y4V9GAC6AB2V57XV30AD72T4T5Z4Q7
'SP3JXVWNAYWQWK8XW0V5B3DMGZK709805K9M1RFZ8
'SP14EBQ926P4APDDMT6VP1F0X867F7Z2TDW5CV69A
'SP39KW7PHTAC7MKDZJT64ZVFS141B4G7KQKEG7MG3
'SP17J3NEBYEEX930NRJC5DY8187K1CMVPW104CC8C
'SP3HNB747MBKNDKX44YQMFQZYY19SSQZ1WJ3DS3RP
'SPXRWYCBABERSTKC2XNS4M9QMQFSR907SWR3582S
'SPCGQR2RDSBBQYJ3SGNV91FHPRGFMRANHSRH492M
'SP25SF2MPZZS8Q20QA3VTYJXTHAHCRNM5MSZYDNB0
'SP3950ZX51YWKXBHW5SJGYE9CJ0WTY9FW4VYYJC5R
'SPK959EVHGPV89APDC0QFDJ8N4PEKM1MXY519Y04
'SP31YGFWJKDQDQ2H6C6H5ZH0KACH3DETJ7N1NRSRQ
'SP2P889QQYQ5SFHSBVCB5SXHGGXVJZTQN3MTY75FH
'SP1TT7C6ASEE5B6GYPSS9BBKH8S67M5HXYPKK852N
'SP1AQMCE6AKND8B8R5RV7QNJGC5CPEBPPYNY6QM9T
'SP35MJ7PS69WE0BX1QFE2QS4VNFS2W32N8AEWHZPP
'SP1ZM4WD2EAQ60FR33RW7XRMHGDBDXTJJMZPBAV8N
'SP0ATPX8ZDQT2SZE61EGC4GVSY4MN6G17WPDKP8M
'SP1222YJD8VC4TQB26MCYSM25SAE44ZBYRZYDBSDB
'SP323F9RS1CN0NQWNY42S3HAHE8M97SVFTMEQDAGS
'SP28KBC99D9WG3QF9W790FAS3AG63ZD72QR6S5DKP
'SP3V149056SMK6SGG67F1TF1QM6B85PWVMMPP4QGM
'SP333RABDXRWDSWC9ZF8Q4SRBGKETF5QSZ3CKA2MD
'SP1NE94ACGPH4Q201XJJSQ7999H28VMATMZS6PWQN
'SPQ33XZS2AG1JNGXDF54B3Y3KSTDNJ0QX0ZTHT7Q
'SP2SHSJGH8WSSWQ7EQYMB1NV1NDXWRVQ9AFWQVP31
'SP6S0TN2SD167XJ48EGFAHYEYY36VV06KDGNQ6DQ
'SP2JSH2D1QH82JNS2Y098520G1XCPKZ37TS9V6RHD
'SPKQHV4CSMWF7S97G073WM0ETYS2EC93007A5N1T
'SP247R6GQNQT2Y28ERHXENKJXZ70XDH9PWH4J6KMS
'SP3ZPETT80VKQ0HK9ZVS0H1YTS5ECKYTFAF979QVR
'SP3DYJTAE1ASP1S0V3QTCKDN4EQ4MSKMJJV7JAVRT
'SP3WDW47VF6J3J97NZGQATWX2NYDKH4B651P5DZZY
'SPRC5GAVWA7PZEWWTCGWJ7XW838RGGEC34S4M9W3
'SPFZRYYTZ1K5JAZHE69K68JYZAWBXSZ56D9MG4B0
'SP12P9170E3W0N6AYMJXYWEHJ47SX4CCYZEKJQR20
'SP2GJE17MS8PY64BD52ZZF2DWVFR46K0PSGVFJPJX
'SP351BAXDQFSRSBRFDGSM4YK3R9RHZXG30J95XWDH
'SPR7QKWVE6WF9D23NY0RPCRCYT6XT1H93WFSMZYY
'SP1H9VDQTC1FMT5DQZAVESHBS42B9TK1BMEV6DQ96
'SP1JJTJAR37HBHFBV73GFRMG07XYPH3VEKWTWT7W1
'SP20X1JQKC2T8T3T25BYK36WVAKR9SYT5W5MV8XW2
'SP7DTTR30FX57K7W26RCTW1FPAV12DF3B04NBRWT
'SP3QTR5M8546WNC8W7S7NHT82ZG4JBY73F4R7BWBV
'SP3FQDV2TXGD6XD39VX1GWC53J0SMCZD4DYM16W6X
'SP3A0NT1P4SV2JVM3R7RWADWSDSSG87RFPMW9DHZR
'SP3XQ0PZW1PG84TJ8ZWZ363538B5EJ1Y3AQ8Q7G93
'SP3RW6BW9F5STYG2K8XS5EP5PM33E0DNQT4XEG864
'SP9522XY6FZHCX5SSBY2HMWTY24YT2FDJ5V8Q99M
'SP3TEG7QB3MFK5JQW75HEXK5S578FQT06ZHYP5ARS
))
(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))
)
)