;; 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
'SP1KZCKP2693P63G8TTESKJH3ZV3SRNDXS80RKZNY
'SPBQ4068HV0JRS39PXBFSDWTNTGXTY7TTRV6NYW7
'SP3VK6CCR1VNN0SEKM5SDD6XJR74BM8J550Z2M8C4
'SP7CNKQV68P6RB599T3SV4QTWTMRQ9CWGBS4MJYW
'SP1R96QFWDW16K57T0457CE8JKJWYA5RM3KGAAE5Z
'SPTG81TWDYWPTRZHFPW6XG2BZ1VCV7B70BXRG68N
'SP33C9P97HH8BSEJ7NM2PWXGS6YGR02B1SSR0GXG7
'SP2RYCXYF7MS9BG061TBKGFX6Q4EF3D63PZ6M4SR8
'SP2F06D7MHQY5PGV3ZSRFTSVSMF1ZF427GGXFG7JP
'SPJVBHM3HAV9EN0CBR8711ZZ3H5J5HS6J7TP6SS2
'SP1F8ZDT9JXPD5DY3J0RC54DWZSAXETD6QZ98KC4C
'SP271PVR9R7FY3T4SNZ769MFB7HS4CGBVDN61VSPE
'SPHZW8N7EMXHY7N72JNE2EE1TD4Z1FZ8GENAHYFS
'SP1HKGDQEK0KNYHP3DZ9H5RQ49HQC1K1P352AXTG1
'SP2JBK1E2DDB6NMXAVYNJ2TJHMH6R9EFACB1SPHKD
'SPNTV728XNNR3KRZFD2FAFBR2DVPA39BB2GRPTVX
'SP3SK4HTXBYRZHNV5TRE29V4ARPSJ4JH7NAYZREJK
'SP1XR7GETSAHW8EYX7PTXNQP49GR0WHTQ14C1N1ZJ
'SP35C795MDF8ZNNG120AXPR3TZSETBJ84160415M5
'SP3M69BX3YPWVBYVBWDWAP3FQ16H1GDR7TK8KQV18
'SPQNE1MKZVJT3VWZ35YTWNG7S8WHXZG26PHQ0340
'SP3E35YKH9J3223GQ0CPXSSX15GDANZFN3PMRV4S7
'SPM5T2SPFX29CN1PW9TY3VNQ6H7GS7X8X84NCX31
'SP19AZ6MKKXV0JW5R05F7YBY68NF72TSMVB2CF0CB
'SPZ073CCNHBHTS5J7F3WH7P9W5NXFA0RGS729BRE
'SP2D842AB3VFXD79D72KMCFJTYPZ3CV9H8DHB7NYN
'SP2G1GP05X1Z6EKV58WFYXKA2JY9NAPPHAT284K8A
'SP2KK65Q588PQNCJSQ91KSM6PP69GDGYBNXES04A0
'SP3WQ1D6S484M84RFWG5JHYDJD2CP9Y9D7MK5HY6E
'SP2K0QDWQ0RD4QGEZ36Z8W4JC0PJBWN776JZRNFS6
'SP1QXYFBC9GQR13SBYHSQY8DNHZXE50MMTB7N5D7Z
'SPR118RFXZQC6TRH3W0PC6ANWAN6GW2ZMM3MBZ4S
'SP344DYY5JEZKZH77223CDZBA94RW4QWEJKCB0ZHS
'SPSRQNN7GG7FJ9FFYW1MA9J9C7X5DVTNN225TAZF
'SP2HNPCJVV5K109RSGYQ6A5XXTN82ETPGXSP79RMP
'SPWKM2GP8R2E1Y824P2DPKD02ZF3P6E6Z319WQ55
'SPZZ77WPBG2FGSJHMRB8B5S2H81NS4XG5CQFXXEZ
'SP1QPT5WRX7Q598J5XDNRH6XF9FJS7EWRDSQA1SR3
'SP2EV1G9NC43ACQZPCQ3Q4A4YMCH03EVN686C4WDH
'SPCHXWCWTAJ7E4D4154EHK9PHXX4BQ3EYE8H7R8V
'SP3EBBKX8GHC76AD2WXFEWGEDF6W446EFQA1AD9BJ
'SP2RX6WRANCKWZ3C1AT4VAP3ACAZMW4QPZ09ETQ94
'SP34N095J8ZS70P4V78DSJQ9A572KMG3AEF4P1QJM
'SP2BKBJF34XSXRNRQ0JDF475KM1Q7F410VSKAG5SB
'SP33WBTGK5H7JBEVCSCJ4N4E9QNSS38K0FBEC83H0
'SP1WHA75KA89M4PHGXXNZMEFA7SKSFHTRKPYN7K5V
'SP3NT6R64ASC3FBV0AD02AJ4B8SQ8J6BGBK16JDPW
'SP2AJGK10AF76C42P84CQW5A20JVKET5P5K7Z3P9H
'SP36Q34V1Y55ZB4E675GX5CPHMZ62P5EMP7W3D668
'SP1CQXF17BARCXH5FVWJ9RT84PE7SNCNNF4PTTYW6
'SP2R2XYEJRA0ESDYEA8CTR80GZ7847P1JDJMZ9SXC
'SP3JR0Z2RXSDJ12G548EN23HV46QTXA09GJ1SRVVP
'SPWYXX9SGPDZ8RAWZSR7J9SB2P039P393NJ316GS
'SP2KYZ21Y302Z3D7RFJ0KF1TG2AC6A33VWJE3CJ1X
'SP3A23V9S1F1WNXJS2WKRFCJ3NRVH9SJE3FW37FRN
'SP1MGDSQVKDTCBW4THBS75VK0JC650FSSPQJJEZ83
'SP3TFX7T0RG5T2QRFTNZXNN7GWRE9KV7YTW6TTBSS
'SP2AR1YYZ5KFFXGCPETA2WP2P6YK2Z6ZXFXXR9S2W
'SP2ASBXYH8JDHA7CTG07BEC9BD9K4HMGV2KF6HBJP
'SP10YP2D1ZQATN4BARD3RZAVKKD1FCM3BN6B9N6SC
'SP14PTS6KK1Y6XABT8HTM22GXPJ1S5YVCRX27CQF5
'SP1BDHZCX6M9VPPC3EDP9BQ15NWJ72XE4ZDWC4DHV
'SP2T95C6W3TWA5MB9W3WYPZWKENXJSSD0WHXVN591
'SPQRCD92VZPXMXHC7XTB2S6PC8X3NQVM6AXB4RDB
'SP2EXDVB2W63Q45F1TVECVVX16RJ3JMZDTZD7CXZ0
'SP3C6MM8VT29NTE859C2QBE6W0X85YS26EAG9AZ9M
'SPJMXPPMVPAW2THBJJ667EEHJZC6XNMT699N5363
'SP169WQRKAA030141N0RPCN03XP24MEF0Q5YQE0JB
'SP37VSGHA8P1MXBYQQBQNAJ7QSAB4V25A4NXPBHXG
'SP3ZRA26GCA3CV643FJ5B6RACGNXTWJT781X9DXHT
'SP1HER26VQMHWWZ68Q567FNKYJZMX8DT6N6T0E26X
'SP10QGZY9BBCQXNTF6RJ70GTBD411V2ENE61E7PKB
'SP13N6RSHFY4ZBQY2YTZ3EHK516ZC5T56QFN0CRMQ
'SP1FC1ZQ22MVZ72TCHYSRKQFZRQ33BVB7BS5A0S0Y
'SP3ZJXZ7321QH9NWJAYEN27CEX1SR3HT7TY7Y11TT
'SP2ZDTWRQTS3MZWD1K3KJ41YQWFVRRNPEPMVP9CAD
'SP3C42M5Z0Y2610R9R221754P6RDF75CNVRQNMB9W
'SP2GETPSZMD45EWTTN8DPQ6Y9E6WRXDSKADC21N50
'SP32W4KSFX4C6F1GR2SDR2ZV8ZTVV30Y30D2Q4BJV
'SP3KC96KSN2H7TTEBCC5XFS0R6ARZT3KWME2CGTSF
'SPS8257VCGNACTPQTBY2MXFAMY38BGS4XS1P2M10
'SP7WVDK9XQX3THSZXDCJHS1HBX3WGE28CHVSS882
'SP3EVY1MV7YBRA3G5RNZQNYJRS6TCQ63W10FC56YD
'SP2M3KJNCCQTTX609WGRDYVGE20GC1J1VWSYX9VGS
'SP3JDX4Q4NQPXE1X6Z7ZVRQMCD20N0BAWR952ZQ4
'SP2R4TN3VPSSYF0VEX5MMZ760GQ33VBG5YS6N7446
'SP36QS3WJXDRT2V8Y62VSS0X8APFFBD0AKY7Y71QC
'SP3QQ118JX0791S29M3C75Y1V2QN5EVAZB6BQS115
'SP142E4RCPP5CF4CH8XJWKD4VSD06Z3207NPHMFN1
'SPXH0P2X8HQKN5995DMV63E8YKAC6Z3DW3XGJ4BX
'SP1SC7DK4TG2X5P55D1EYTGMPD0X445SGSV1H1TQ9
'SP2J8CXA43YM81C4RPHVCBS4D9FNYASGGQFFP8CGV
'SP1BX43ZN1KC0D141MB4520X3864JCJA4KFCJTGFW
'SP1VYVBHZFWMXVB4AENQ5AZWA4VT870715FRZGV3T
'SP3BF0BBT4ZVPN89NYA1CRA08Z33FQRHMQ243KFKX
'SP3TNSV7GBGBNYWPXQKPA7KEJWM3BD4HAHJEAW70F
'SP3NZA45KYP1DYT3RFE93RD9P6BE9472Z1C1W0MPX
'SP6JGA4644RMP6E11ZXWV88QJM8CNMB07PF412FE
'SP3T1KM82GGEN55F08M480R6F2T7S0E7203MZSD8E
'SP1C110CGPZDTY9082VNDS6C4R310CSHWHWM16SB1
'SPN12B2XZYBS7KVQ8YNCWC0B3PJ7WWFGZJAP53AW
'SP2P601CJ9QW1DW7GENR4HH63Z2ZF0DW0PA8CYRQE
'SP385CNKXGH85EVQ9VQ2HE49P6NMGM1J8ZNT8VSRF
'SP1XGQNEBDY7EYAY7KYNG1R3EAKECR2QNED7TNS02
'SP20E9PKHP3B5H12X7PRGKEXX4MXGFNE3M1WV1QHM
'SP29TJXKVFE1P32BAWNK35HJYGCYY1BGG2WVP0PH0
'SP25X4ZVYPKA7W65RN9YFSMRM5XJ77JZAX9JAQNX
'SP3WH4VDCB81VY2CGN0Z7XSJH8YSNF8R9B3E51VB2
'SPC37235FBW8J05HGY52FVNBTM5B534C3DYVD02T
'SP32MG88ED9DCBS017DA3D59ZWA0F44DWVBKGBAF7
'SP3FNQ0NJY378XA9PXC3KCK6XQ2M5ZG9GHNMRBHP2
'SP2V9XG0W2YYFR25Q6MZACJTT4SE42JNJB1RDDXHN
'SP2T485Z5ZQD3NBT1AVT8B7FKA3QBJNT9MRR379Z2
'SP3N0E912EFGNBQBSWTQB7CNFHKZVN00P020V61BJ
'SP2VS98S3JVA60R32GNGDRWJMHXA2WVNW70CZ97PM
'SPYXBP5VDHXE6FZGR439D7RNH0CEHAA0C4KAG1Y3
'SP2H8KHH0YR27VZNGKDMNRCDTZES3X1ZAJVXHY3BH
'SP117PVEAK7PXKGW5K8E0Q9Q0VJPA9PTC28B6PFWJ
'SP1DR9311DH5CD8XATFDTSBCTK4TXZYP027J4AH20
'SP22ARKWN5F6CCYXX5DYVJQCE2YSAPGEEYDZHYSVR
'SP3T2JNF5AX9G9HPEGHPFE4V3YGQAVE3XKZHAPN5
'SP3V8SJ3X3A9922MKFBWK06AK9D81E77H1NTDHNQH
'SPV6BJMKY1ANCAD8YVXVNCVQBQA3ZT8BVMGQ79TK
'SP2JFY8426TTDWZAPGAGYYNVJ6R9PP72HCB26YTQA
'SP274B4B0XTAF6CWQ2RWZJDW7GB5ZXS754A97XNKH
'SPS7KC9G138910V26X2H1EMHEVBEEY2WZWJGNNRC
'SP27DC4CEHMCVZ6XC5KKBZ3CGASSJJ9NC1XG2YR3H
'SP30Y844WC3QHA28HQYKJDAD9QWC20XD4B7JNZCSF
'SP1G0N15KYK0N7N4PJQ05YFJ972M3NYVSCF551GYP
'SP3B40SQ5VHAANZSXMYFZRKXY8T59BG1YVEH75NWM
'SP15Q4A34WR76NDQBCG0342RTZBY1A44YQFRG94B4
'SP1Y3S9Q5ZK0DV9GWGN8C2WS5921F287TCDZYKPS4
'SP2WFJNJ8F7YHR15YJK3J90C6WXBCA8B0ZQN0S1KK
'SP3GH8WG2FVN2XT5JQ2F92MSH40VCZ8MNJNBD0T4S
'SP3M6QTG105CTM3BSK30ZYKK6B0R7YDAYJJ9D2FEJ
'SPHJX434QRXRN4C0X52Z9SBPVTBABDMTFSH92ERQ
'SPWKMDQKZ0G4EJVXC9VXF0FP764PSFAXSJCEHAP3
'SPD0T3GE983BN1QXMEHDNZBH2J60D8AMJ8R01ZAZ
'SP71N7X6G8KYGQPHZW7TB4PD1JZ6ND9AESF9JPZ8
'SP3VMMC1E6416NVZEW36J7R1D1KKNV49WFMJYAYXV
'SP5SG0VVESRM0YN8EN4MWH4JJTZY7PRYPHM6EX00
'SP2NKVCHXSF361KRR5Z925CTP385EM116WG31T0VC
'SP5BXQ2WZQXSWC3NPX0ZQ5X2CH93D76F10XX97Q9
'SPZ6V1QPH0CSA3NWPK9BMTC6KF8RQQP931SZCNZK
'SP2HXZ80FWFNAW241MMTSFVP4CDF4HAGC5CSABYNS
'SPV5MQ3N28HX7K9YXY1EF71KHSCPPQ6ECXV7GSSY
'SP2HPP9EZQ12K2ATJ5QVGK0ZMRS9A133KMVCQJ47H
'SP33K2SBGZMXC6H2CEV95GRKT9W4HGJ601TZWBF49
'SPNK74MX3FTWN7V7S7GEJTJ4BN0A5ZT2YW44CJ6R
'SP1FN2KPTCZ6Z22RF8V86RXWQ3E16H9HQ0A98WN4X
'SP2EKRMW53DMRV6Y8A1933GCBV5J4CENR0BEQ4AR9
'SP34A1CFX21AN9X9AK2J7JA4BN3A9ZABQ3014P71V
'SP1EQGZT0WN75N5AMJH2C40N5GBJTEVY9E6ZY8EH3
'SP60MSQ086RZTD83THVMQ8SZAX9FR86MHP4CSVFE
'SPQ53XP5ZMGCG3M094M4VDSR5VG3C3DK1342VSBN
'SP2K793MN5VVA4GN2ZX72NVEB7E0PGR5CTC3HSVAJ
'SP3KDD3BRSCDJ4JG2HG1EJEE00DFE0CP1QWQZ4075
'SP3611GN89RB34BC48JW065Q3W6ZK81KPTA7GY9VB
'SP3WX8FQZ345JZ1QAC8RX84D3H19ZQZJRY9P8ERQJ
'SP1RP1T219NCCH0MPHMXX24JCCEMHARA4HVTH30Q9
'SPN1SRYV175Y77KP22FA3SBC39FDY70STD4BZ05E
'SP1VA19VT5SRW2QG4SSKX92WPDHPPKHRNWQXQJN5P
'SP3G59T148CR0WM225XGD6VCHFFNP5A3PYXRXXBJB
'SP2R0T61X06QHGQ67SNTF6M533QB21FBYWY4JFG1B
'SP3VBPSV7DSJPW5E3ECQ9V07628DBCWWSQH6M6Q6K
'SP1AQGDVHGD26NGP5SGVZ85NP6RGPE8DZ57CES1D1
'SP1HVS97D52P83DCRJJKTX71J9Z98HARCR8WZNVN8
'SP2ZVGMDY610RK5CJHR8YN0PR47X93VK66B91GP1J
'SP31RAA7NKDDWZS75ENHGHS2P9RNKM1XSVNJ45YSD
'SP36G21ABF380WDYHC02VGQX05EA8Q06BSM6P08XQ
'SP253F6E2VCSF0PS4DWQ7QYT25CMTE6BNSYZWBNKP
'SP22S0WX1XPNHFMNTD4P44RGS6EA01JRMRFF4QZDY
'SPJV2R1TEKXA51G5Y8FK8F0A9Q5MJGBETTCBA18E
'SP1JH0W12GS37NKPWYRYWDZSWF7BE5W89P9QYXM90
'SPFMTSBRGBBZ5B81GW9X2S78QNS2XHB5CWPCRQ0G
'SP9RV75K77F7G8HKKKVS3438JEH8ZBEW36PEVNW9
'SP226X8S1JHGSZJ6KKYA0D2H6NNAMNCAYXWPRDKN6
'SP5JFXT3D66T25S1AP95XRXZ3QHNMZHQAJF6N7TS
'SP27HP4CGDGK6MXS03ENAS64DN0NYNZFDXTXA16VM
'SPSD2H8MXP6BF60D43HHD6NS395JHH7HKCATEQM1
'SP2Q402MCF95W2V22CAV40HPRFQQ6P69SAD54RW6J
'SP35JQDC0S8DJEANBHBXV4QEPTS9F7QZ33XP6T6RT
'SP3QAE6MF75M9WPNDHZWV2DCJ33DDJ2NES5051JCT
'SP33CTXXS9D0JFFCKK1PTAMEAGMVKPKMMJ80HA89H
'SPAGQZC6YKG5BR1X0VW0KMW5NF0AEN9VXE491HRV
'SP217FF3C1A8JMACJ4CTKH2A1E10T6J9Z8F03ADN8
'SP3CY345YMPG09M49Z9SQVZ3FC0P6P774CACP0R6K
'SP1T8VJQVT2QVZWJSKDVDC4D9YNHK2V0J43Z9J68R
'SP2W8SXYX8HP40V6682F4F5CRKZRPRGREG4HKBMZX
'SP5VFJDVPV9YJPSQ4DK3PZY306F42QPN4GMQHAS1
'SP1R08FJCZ5RE2FJX5C2V7FG53GZ7XN8NDBJ36THD
'SP1YG6919MQ9MZGGYTZGG0W7BYRV6TDTV0FW98X8A
'SP3VVXQJ0ZMA0S8MGBDBFHS5E8AWSQKK3ZKYF5DBS
'SP20ZVNE709QNGFCPDNRS3KDVYX12MYGPHQQYNDH4
'SP3PYEM3GRR66BFN79SJ2K4GP1YVJ0TNDRACMKGY
'SP1RWWPH1DMKVHK22ZHC008T5RARCZMM4GCBA78TX
'SP174ZDHFJTP50MZ3ZGHXG4CEJV86T3TGJTPMVV7M
'SP2DTM0YS0GWRQW2WDVVQATQ6BTFREBH77FK8ZYQ6
'SP2Y2S6TPTXV4X5YRA488JVW5Y2DYM4PMKJ77KNZY
'SPYGK1FJ1C53A273XTWHGFPAYQ001A3NMW94M34M
))
(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))
)
)