;; 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
'SP1QWRT5VPE7SGZ5HAJRRNWZ2J6T7N4SPP4CWAE5M
'SP1TG39NN9B0X74XY7Z49CCMEMX3PGBFQN6248KTF
'SP1Y857PRV9C5EFNHFP7JHC8RQ6FDKVXKHYWA1EFF
'SP21R6KRT96593KV65T4DXQYV2BWDY542CYFQZX4E
'SP22YQDR1FTZR8S9JWZCFMS83VP73NSV3PQY0Z7E6
'SP22ZB8T6R3J0XE7H2GT7T0TYFRSR6YV8B8NH8Q0K
'SP232AF9HQCCJA7ZRX7PZGSBE62S6XDG7S5H5T87S
'SP23YNKYV36VM874NCXVV3W3FT7VS5GBPRCE59WD4
'SP24Q5V10M56BW8DDAAF10JQ2P2DPS4BTD05JEANT
'SP250659TH17MPPMBWPTWVWZ2J0C90E6HS4NGN091
'SP26C2EEJNAKX5M6S7E509XQDXQVRFKWR0S3CGQSN
'SP280YD5K77V57EJ6AF5SBDARA1TPN97JR39BX5JN
'SP2A9K4ZGJV4MXADY6NDEPP5Y7RZ6QD2D2B6XD9VB
'SP2C44N3RDN6914QRSKFGDD85GQ2VBVHZ3NN7CB7S
'SP2C9K1150C6E900YWGETMBZP6R4J1JMR3TWN2SHT
'SP2DN387GGBA78J14RF5R4A51FSTTPMRRFQNWARQB
'SP2E9X5ECV2AH0HDNYSWFKG0XYERSZPSAGB5YZK4F
'SP2HHHQF223ZARGW0C2QH7FYAZE9EH4T223K36H2W
'SP2HP013GFTDJ55X9KTQZZ98JEQJZYVX8XTQE6WCN
'SP2NGJ4S40C60QJ9BV9N8J2AMTQ3HYE6RQCDRTE85
'SP2SZ8CG4GKJ8VE650T974ZK7VHRD9GWTAKW2V50Z
'SP2TAD14GZHQQZWT65NFHFZWNK1PHVWP1X4RWXD93
'SP2VRHB0RRNTV2ASRBEMMSQVEAJ375J77W6JCSY40
'SP31E9DH7QZ68J22P7QD27HZY8D6Z4XHSFXEMP1J8
'SP31F1MMYKX69Z73P4YDR82PKA6NEAJCZT0QYGAD2
'SP31VJHXTK3JQQ92TAK6BNCEKSBYRA3XGVMXSKR84
'SP33K555CBCXVQFMSX8NN7SMAHPPPA2KSQHQZZ9N0
'SP34R64CCWCR2ZS8VCH06YFY842R0P27XCV54647G
'SP35CRQAER382CY437YPVPYRT9CRABM6HR5SH3MPN
'SP35GD1FRNA3NDQAJRECWWW02RJYSV3XKHD40DJZN
'SP365BXACDNR490VV78G8JT2VH6D45D0WCYW6C6JN
'SP375GJ6MKQNS4W1X1SMW8X55VDEQX28ZJWG7WRV0
'SP381Z74J6877VQ9SM22700VRHDD0WZ8Z7XVPXH6W
'SP39ZGENEDXAA5FW0XMHP7DEVHV0NB5KS507FJF2D
'SP3E5PHDT9JRNYQKCJBDTW1W40RDWMXVR1JF1BVGR
'SP3P007DJM3X2QED3KADYKY0RXRH0EWTZ1RQ6KYC9
'SP3PVJNY6HHRN6TZZVJ3HNGHKXM27H93J4N0JNS22
'SP3Q7PBDTACEKXFC6N6MM9M6VB30FF3700KJJQX8
'SP3WJT7Z4WEBBDJDT0BZDBW7QZB95H5ZD5J1N1VHF
'SP3XGDZ0AZ32KD75R9SZV56K6DNMV5G5G3M0RDTKC
'SP3XVG4YW0RDCKNSQA1CKY2G008E2F14KHFX5Z8PE
'SP81XFF1BYX12QC5BZCK1ERBSS37DXGNQ0Z3JSNK
'SPE1ESG9BB8XEB3W3CW19XEPBJ84AFQHRSYAJ46V
'SPF0DAX2NF6JDP2T3D3QHJAHW306HD1VQ1WG8HJE
'SPJ130PTSERQ0SA8B5RFEJDN5JVJ4M2TGTWNXR32
'SPJK33QZXQYYCG97E378GR2A0YGNYXNSCDQ6VS7H
'SPKKJ9J6CMR13SACZN1X18J61DTBK9277X6T8NPY
'SPMP2RC159RBTNFZ4E3MSD584WRGDP6Q5B55QP7V
'SPPV0XPG3BG8CFYPST9Y74RA9QW5GKG7TA2TDHVS
'SPRFQSAC8KG8HD1HN135E1HJ0SM4W4K7X0RCWTAX
'SPV9M5TKSD43TYVAPTNYGQXHVGSTX7DTTM3PGFPY
'SPVV72R8QHMV4TAYQWKK1FXXRJVPCXMRM6HRFFB4
'SPZCGDSSZPTA1X0EJ1A699FTPPXYCZ1MTJ1X91DA
'SPZWX8X4JRZSW54777DBAC4902AT0HSWNPQP1GA7
'SP3REXZ9NQQ84R2SJ0D26CJ6RDBQ383W8QM5MC2R4
'SPXBNWERA5Q5SBHNN3NC2HPVVT8G6EHZX6V1HRYG
'SPE17FZCXQT4AAMBP2FFECRB49W9GZRJSPH4XWYP
'SP3509TBRM7VNMREKZQRYSC0CK38GZ3HQZDNT7M8Z
'SP3Z3A0JPF1V0WCSP1XAFAREKAC6DDJZKCFHQNYPK
'SP3QYXKEN23HKQW33CY02228TF6K9TPAEK7N1EN6W
'SP2F84G1H4VTBDDJKEZ7NBVTPHSNB0T6H9FJHNYP9
'SP2SVMVW20SN4DA4PM08PMJR07500CHD8ZC8CEJW4
'SP1F7WTTZEDZE5KNV25XASJ485PF6CZ47SQMBGFHQ
'SPP3GG4QWN1RCAVZC7GY3CMSBAKCA36GMKR8ABH7
'SP2YWMJCGXXGZ4R5AKBK61V3CBRKMQ25HRB5K594J
'SP247Q1F0YJAD97EGSY9JTG03H5DWZ2AV72A78B26
'SP15CGWWTZXP478NR7H6T2RMQM4P2VH9FSG8E8MKT
'SP1J51BZEY47129MC3TTXFSR72NZDACPN446BBND5
'SP2D6WH9SZ7GXDRSK4RZXGXFR54207Y0YSCMYC4HG
'SP1X6H9Y9HCCE3R2EXP7N54Z1DXBE1STNJ7S1BCNE
'SPW36BGF18XA1GPHCC34AFY2A24DPDN0EB3SHYVT
'SP3QFT6RN0YDBV9DWMM7NCK93Z9R8NC2BF6GE8ATM
'SP2F1TAT8J1A15Y6Z7DAD9P0SE3R15FRH4D9RFSDQ
'SP2S7WZRJTEK09ZZ36WHNA56A3CRRESG01H9MV96S
'SP1KK0XEGZWQVANMS1WNFSVVX5W6Y6KJB5J8XM0FB
'SP2021Q3J7A69XDMJ2XBVMAHF0XNXMJ536F0PG1K3
'SP3QKH18M85H3F2CN4KJ9VM7DMDCCKR4SKW11B4N1
'SPERVKX65E0TZXNTF05BC5915A13H8R5EYJC34GT
'SPSGWZRYN8KM7PJ72DAKH12ESYF0CENG11EQBXE2
'SP1JW3EHVQWS2NSWT86DRTBZ410M2AY255X4WYVR
'SPWZF6Y2735C86ND6VGKRTTPC80NYJRJ3HERPWDM
'SP1VP5V8EM82TDMJ6BKC810Y6P89GEHX3EQK1690S
'SP2CWMV7N48P1WDJKEAHY66KVVG9PPHRTBBVZKB08
'SP21WZ9DAQHMS9B3TX3VJ1D89EYP0RQXA34QPB69T
'SP1YWTKVBZK4AG9DNK6WCNQSQ8H218TVWTGM5YZFX
'SPBSM3JXCFNAFFGCEFDWEFFRKH0EX4GNENKNX48C
'SP364DAHX20XPKJZ9XN3Y9ZVGQ784T8AQVXF6J3WP
'SP1Y9W8PJAMQA1FXD33H8MREX57JPEAZXVRYXNP9T
'SP13HQBWPB5ZX6C59VYVY6NVVJEHB1SSYPEJT1DXY
'SP1SA25KPQ1G9MD7QSKB7M380A9JG4N6T65VVMGD9
'SP278H5S1G9CJFM10EEJE8MD36HDZXK8D1QTV98HZ
'SP398FECRZG6T67Y9PPR4JAVCPPCS07H8R1JBZE3B
'SP1MH05S2MDMWWC16F1NYD5DMC4HRDF6N8EE6HYEV
'SP2J3FSPN318F5RC0JT96B3MK27CRTDGWKNW96ZA2
'SPES98AQH1DSVXGREDVWWQ1XKX6F4AM8YZ2BA70X
'SP1GNWSAKFDWWRXCTMQTH7BSRDXRRPQTMJ02ZQE38
'SP160N9M3HDGDACNTKJKH0CMPPZMFR2460T6HV7NT
'SPSXXNR6P8PCG9X58HM1RRM3333FPXFZTPFAAWXG
'SP3ZKK8MAW1RYZZ4TC64BHKBV40XX7ZP0270B3640
'SP17NVDZ9A8H5AYQP4WSBMETX77WG2PYZD4PD6XGW
'SPGC24NWNXKW9RMWWV2V28CX2Z1JEWYCMYZF52BJ
'SP214E7NFJH5FC0QEGWGD1GT9REC6DT1B4P64VPTW
'SP2RV6M22FGF5VW4F916H5E2R0MRPZDBCWXFRCNYJ
'SP3NRRCC84A522SCR165V81PP8NNEFFS474NAXXA8
'SPYMYDZGZAR4TEYAGMKPGKYH73RXJEDNEZ6V1ZWJ
'SP31E6MW7V48SGQV5VQ9JX8XCJ0AQ1RTVWEJS9PC8
'SP3PW48J5P649TTA5HJY1B5C8724P7P49516HKNE9
'SP327F3FD7EEJEQ3ATC90G6TCQCT9SDFJ7XW23640
'SP1ZHE24ZZFVGM5JJ4BGP8Z1HZ3SFKW7RMCKXDNSA
'SP2NSVEBQPKMX8JQ4J6EFKGDNE6XX0DBCVPZRV6GD
'SP1PV390R5TW2PHCCJT1D0621WP9VXQD4J7SGMNQT
'SP2J2S7BV37VXV7H051ETH35FV8MN18H8DRJ3Q6NX
'SP3Z0N0QG7DHZYGYNAZGR3236FAWNHTW5EBA9C6Q1
'SP90ATAJZPQAKCHS4NKXJYAKMA0NVKECW0WWS9MJ
'SP0A84E3SY5616YTGCMWFEBAW84KAXFZSADBG03E
'SP10DGNHWQP2TK84YW4J68K05SDQAPGDJH685ZHJ
'SP12C8N4318E44G04X0V3QZRW5ZPBSMT8S4V3CTGT
'SP133SXF6N0C7RABEP9XQJFE520VR5Y9AJ5CA6M1H
'SP13R0ZZW68NH96DF1JZ65B543TBRM6FPTCC05G39
'SP13SDGSENQ07BG7YAXHAPNNHVFW78DKAK06C5V1Q
'SP14XKJK0KDX2KZ18YX0CNMM2HQFGTDGWD5CXEM1B
'SP151ZSRDT0KC22HXH3W5FCNDQW872GNEXKK99P6Y
'SP17XC1HV9DCGAGYE3EGF8N8NV9Y6812KBEK0RT31
'SP1AJW997K1XM0BGX6DJPN24E6FYH71WWVEPVNZRF
'SP1B0HWZA4R7NR8E0M3A4CRH9RW8DPXMMCATW30ER
'SP1BKWTT36MSPASYR4SKHH9JVZAJAR43135KJ7VVR
'SP1BP3XX35WSVJSBTEN86QTJNQ4K2VRAT7BESGZ0K
'SP1BT737RGSEJZPM0NDBV01DSZG10C248HW1TJNC3
'SP1C0W3GV6VBSA2GNZFP02TA0MSF7NCCPCR221VX8
'SP1CG435X9V21MSB0JM2M8H89MQYYZ6798NGY7PG8
'SP1DAR154B00BKP0BVY4KX0XA0XKGK7PNWZFW1E9R
'SP1DBNQYY5KEHPVYSKNF7TAK2DNB3ZBQSY700SKHY
'SP1DEDVWKS7ACV6TD5QW0BQMH7SAJFQYF75HRNY5Q
'SP1DSQCNZS65BRMGMET2GR2JKX0D4YVSD5CQMNH1G
'SP1GAKGV4E65TPQX3HZ2C681ZJ3PTRFZFP0KJ57KT
'SP1HMX3YWY0YPHH3PDPR5PEVWDNBGEJH5T18B1NGG
'SP1HX9R7870D6GRB7WCXAB9TQKCQDEC4FC6MMD189
'SP1K1KQJYC81Y9RA4C1D5FT4PM0HY5G6ZH8BG6DCE
'SP1KRKN5SBVDDBCH2ZE41GM2ZCMD2D05QXWNTGYP8
'SP1MPZZ3Q1AV52XYGQV94FQD0YTSHPQCYPKSDJ0SJ
'SP1MRK96WBAXW3K34TCFDZC6P4WX2QWJCC5H9JRA9
'SP1MWEKKY6HV68S9HTFKJR9ZEA0EF46J06MANXA02
'SP1N6DW24K1SWHV6A4QYZGCJ9E9EHG0X7Y0MYAQ00
'SP1P6HG0SRCF9M4FH46BHZDWFWWMJPTN29WNJ4KHW
'SP1PRXN6DKK46Y0PFEK7KSWZ35WYJTHQA50CZHZ21
'SP1QNT2M40SA2PJY9HJEMQ1AG5GJDPAXY5ZEWR48X
'SP1QXBC998VG17WEPPD52WFDBZ2E9RHN1NR6ZYVQ
'SP1R0JB5ZXZCQWVR3VVB47WQB48EPQF4NBSB6KV6S
'SP1R85E2F5NHVGN86QCYT1074Q0Y191ND3XX6DF19
'SP1RA3GKG16WWNA53HRW2BBY9Z6GKXX371V3QWC6Q
'SP1RZBHPQJKD4QT6ADYDKZXCKVEYNPN42J9X1CP9V
'SP1S28EAS3Y5BV2HJH56AYVW8QXD1V7CMYH6NNKDT
'SP1SEXFJJEC81EQJX5NKZ8ZKP8HR8ZKA3DB60KYB0
'SP1SRJP9BRZEC6K8SXPNHN2NFTEAT5JWNKQKP28RB
'SP1SZB8PTQE72WMQAX7E69FXRXBFG444G0GAYJ7M3
'SP1T6GVV502G2H4KCZSSJ66EMD611AR74MDA51KQT
'SP1TY8QJ48B5M9QMWXYFYVVDDXEXTQ60DGCYQ3Y3N
'SP1V0T26EQ57HW34SFKWN7TC6RAXGZTQ6NAVSWVMH
'SP1VWZHENXX86GDD00W0S4HRMRY1P0TCART0B0Z11
'SP1WHX67Y037WXT85MNJP1W1PJ08J48Y08N5FSG8Q
'SP1WJ01K77PST9NVC4T472K0K6S9M4YW12TY4M1Z2
'SP1WV0K90R1GP2A4F2EVPYH9RJAFW0VZJFRTY27KW
'SP1XQY6V3AYH4MT1QCQAQYRBYBX065Y0VN52N4CKV
'SP221GP1RHJHKHCQN2E4BTVYHVFR64NCPBFEE7C4Z
'SP227GFTX3946B7DFNQZFESRG0XMP48NC27M9XXZ7
'SP227TNJFY9CGBV93FFXD409EX27XQQ940GVKQS9P
'SP22ARN7NFXWC2NWG5SZ555G7Y5F33FRVFEQZXSMN
'SP22JZK6PDKF1CT6XD9HAPSTN0ZTC37QMBA3Q46VC
'SP23D2QGEAWMY75VVJW2Q67RAFGT3M5XJGTNS9VV9
'SP26T3TJQ9H12MZ2K7A64YT40MPEAF557AHX6P4PB
'SP28QY2NN3KEN5CPVFATA2K6ZXN4A7SM3JC9G897
'SP2985A8KCFAN5N87CNJCWM14ZW5DW2E8574TW9VM
'SP2A3W1J3FSMH1MFFD56B07743Z82DQ86RDS7986
'SP2A93F3B1W3YBCCF0ZASNW62VZRE980Q53GFFEAZ
'SP2AQ366W79Y21AVH6XRR9H3YTD6CPZTWBK595NZ7
'SP2AQC9C7ZTW1G0AG28TTVCRHT8C864X1Y406CZV7
'SP2CC76A0WZV3SECA552B23ETRX0HVPWE8F93Z1A0
'SP2CE123JZGQ63MGMN3VPY26QTQ1DS1CCEEYB3TVF
'SP2DP3S7ZYWS9WP8Q4D4FTSGB6YKW28Q4ES31C12V
'SP2DXTSW5J2ACC69KECV5E278H6N34RXE2430DRMA
'SP2E7YEV17MGDV1M43WNRJDDGXS7HFH5NMEP3GTV6
'SP2EKAF598JF8074QDDRZTD27TQEXDVN63586MYZ2
'SP2EZWHY1ZHDW3ZPD4RNP68HXWSYTAW2QES9DH290
'SP2G5PVNK59P98DS5H1EW24DJGZY0WGZ9EQCYXTBE
'SP2GMXBAS7DTX38JDZTF650YNNERFN4YX8886RJGN
'SP2H2BSNJ69P8FC7TYFKTWQHBGZNA8BJGMPW36BAP
'SP2H5MYZ9Z0JXNPXMRQ6DHVZK7VGFPRA3E96SW4TV
'SP2HFA9QYH0CZ59AQ6NNTC9625JSZPCZKTJHMHPA7
'SP2J9H9MD9Y2WXKJWYV4M6X0YJHSJ94ZA1ZAZPAMN
'SP2PT3421GA3PG46FP1NT2H5V36ZZDE8C9FKSS2CQ
'SP2PY0BYHP63SMYJ2253QTM14P5041WPBCJPCGXF0
'SP2Q9C1JJ4ZMN2QYRNK0M5F6S0GCXWSZKZ8DVVF91
'SP2QMWS3PQSXGFB3E5ZPY3AT5Q5SW19GV0N8X114E
'SP2QVQ4T8YS9GCTF3T8PSETAQP9EP8Z1X739D7AJ7
'SP2RQ7FK82NPEBW0P55YVF1S0RRB4SF22Y7YZRCFC
'SP2S3QGPNJ2AWN3SSF2EG7YT7EPBR4D3HTPXQE5CS
'SP2ST3R3VVKK2HWFSXEAZPMSWF97D2TYJ0KXXH3B2
'SP2T7KZDAJ4SYQ9PYXF4WT026N16HZ3PQMSDYDC1B
'SP2W5HMQJE18ERK0DNC7B9D9H7KGSTSBSBYRT0SKR
'SP2WYF6G3E574SBHJC88CRG14E8WYYBS6VCKRXPXK
))
(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))
)
)