;; 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
'SP3S94GKV6MQNQK83DC76T6JY2GR2QWCG632ZTJT2
'SP81KDNMEDWSN63C964P7Q6ZVJXNV7PPZ3408P8K
'SP38RVX7H4YEFFMPD9ARE52JKC2KRMYF3CBHVB4RF
'SP1JAZ5CY4VW82H44T72K0QSS1YV19WNE1QFJ3XCG
'SP1Q81WR3XNZGG44JPW0SZFZZMD5NR3RK6YAJQAFB
'SP13YJ17T9E27AZZSNBC4ANHMS9A3MPFG14CZJY8Z
'SP3JMAXAXY7MXDD24J686WFCVKYTNG8R8Q05PWRNR
'SP1MZT6CCQ7EN5MKYCPDGSETN45VAG6J0WD0FH4A0
'SP3XQMANKR51TFB1WZZYBZ5M40A2CFK9P67BAQ7EE
'SPXXDDKDZ7KH9F0HD7M7NJ8XXA6S4T9ZFXR8TPRQ
'SP14WHG8B8VH28CAY3Y7ZHY1V647APG0697YFMWTE
'SP3Q2DAX68VWX8P28DGG9NH3KA2XHTMTD0RM8WAC5
'SP3T99ABTTJQXMS1P3T2PXETT6NC4V6CEBVM6QE0P
'SP2RE1HXGXN6R3EGD5HS187MJG5JN0EMJV6728YB7
'SP3PJYP3861PST63S9YBA8TKJRC8YFQ46C1T7R9QH
'SP12ZD1GCAKYWCAHN38ZY95S4RQTENEMHGZT0ZCTT
'SP1W2FZTH00ZEYDTCD62A7M5QFERRDHCH260B0QXF
'SP20M1FVXVG6XZJA1RJTJ7PEJQNEYK2PDH62ZAFJE
'SP3F9ZE5JGHNWBJVTVYVXENYKS1ARWQ4A7A4TV16M
'SP02CJKA9889JZ8BWWXMXA7V408EKWTX2JE3W09N
'SP32SKQWT1F813FGEKSNJ01RH7Q41848FEPYDNM12
'SP18AJ92HFM4NQD87AYB2MWGEPSFVYE0A21X9Z5MW
'SP3EJKQHB1YT89QAPGVKCC1NGXEDHF4F3752Y15WG
'SP39Q0WABWWQV0TVQAP5SKMMVQHJPNGKD9AT2JR3V
'SP1GPX3ZYJNDX1509F4SENPEGT2EC4PV8AAZDAYPM
'SP278074TVTFH6V1XXYDXD67MXYDC8SYW2KTDBZF4
'SP10JH4A181517G4FMKH0E4X8E787HH3FQW0MKA3P
'SPNKSQSM46BKWZ098DMHWTRW51VB967KAMW2TMRS
'SP2Q71BTCCJFNNKSVBZ4RDRZE5JVT858NSKBDE0T7
'SP152GA8RSN02EXPNNGE13NGPXCFFMEGNBR53D224
'SP1ZWS09KRFPNHTQEZZ8BPJA2HBVRXEB0KWWKAV0E
'SP1SEZJ9RQBTYX3GH0E7M54S27J5NKQYEPFCBVJ4P
'SP19RPXCFMYFP59E01QC7XATAH71P0GYPB6WQ8PSF
'SP1KSGEEX5PQ5BZM3R1ZW23ZFFXB49W83C42P6VZC
'SP16GJCRSVYBPAJCVY3DCWDX3X378BZFRT8ZV8R38
'SP2GA8GQZKW852WQ4TEYKP7JR2113Y72MKV4SEFBC
'SP3Z5XG4HX5PEKWGEFA1PN2PJY6NPAZGZMF0SHQKT
'SP3BGJ9T9MCNKV0NJGESKHHCG5317ZVCQXR8NDK8X
'SPSSJG97H6YS899SEQNHQGR8FBTD8G9BQ9DW2J94
'SP30MK30GF3YACJQ0ERHG89V1FCAWMQBKSPQG93MM
'SP2A0N4QD7M907GNFPGPPHD0F87V1AJP7XXJCDJN8
'SP2QC7W1WR6P7M6SXP4QEEEAEDKVS9PA5VPT60XDX
'SP2TB10FA25FJMEGFS64QDV3XZ0SQADFM4414HK5S
'SP2904Y89DA71T1CR77QVFG1Q3SNHWZYSPVKXJZW5
'SP22VK42TD6TGSGMVQE3KRZ04YFE47WZYY7G0T893
'SP3SPJRFDMYKCCMZGCPF3YP9C85HXM2Z0BTD0C48D
'SPX663FW24Q8XQ0PF1816Y8YGM6Z3TMTVACE9HXH
'SP38QDQ9XA8JF4KARQMFBEMN6BBQJ63PA6MVWHGD5
'SP3JKZWVBPMV4G7FZ1CMFK8Y4M4PFX2TY7KA40B5D
'SP3BGVWP9CZ34CZ4NKFNP3Q3CSTF0G96HM2FBJH64
'SP1RH8NXXY30FDH2GEWPYJAZDKC8TJPKJ1XKEB074
'SP1THT4VXQ4Z843WCDZWM36R2X7T64JFNQX46MEP3
'SP3CSCEF057MECSN0YZNYP3477M4HJG1K3XWG1JB4
'SP3D4E8CVDPE7YVQAYAGRD9B43F53E13NYX5K0JVX
'SP25YXZ3XV2XFVKEKSK9JYNSVCMZJK4VT8W87GZE2
'SP3CNG89209A70AK4XX9RFFP30EVEJ6ANCC0NNEJ8
'SP2JJC33BPSC6XVGA5EDP8TTACE8N08JNC6MTK3XH
'SP30FCW2H7N10558Q4ZEYE5XXZFEY9GEQFMNZFDGC
'SP1K7M2Z05CR4VH3NNPYP46FDHEHQGRXAJ9TJBDMD
'SP1D64T8VXJA7TWPQ8FMP7A9E6TXNS6K6GTRDT1T3
'SP25SWAJ0NXMH2EHEWE02VRW8VSY0SF7SQ9BFM0BK
'SP2F02FRWRSG74NH8CDWNHSRWS8YHBH04451R3ZXT
'SP13H831AYFZWGHZBEGK2E2EA8MB09YTXZJ72A44J
'SP3EFB7S8VEWNDPY0TE0JRX15BRN538B4XDWQM42P
'SP3F9TTYZ3P6K6DRH9VMFN9NJADEBZGKDCBG91A33
'SP380ANQR0PHRGXQWHN7CYMKC8KSJS2MDBZA4EE7S
'SP1HN20P4EP8H7J4H8XS3GJJ3XDXKN07DZG64RKQM
'SP3C9JPPGYZV04QF3J0N3ME7KN5NDVF79AZ96HR1
'SPYK333RF00HJN5X7AS18Z0WZ0AQAF5Y53QGN5K5
'SP1DFRYMYTY829Y9ZYH7ZQSWD94M0PZB6R0WEFZHF
'SPPYHFWFHSG0QQYYQNTQH9K4D67KEMSN5XCADGCP
'SP2PC22KS614K8B863DW9CAY3BFQMA7XZ2B4CM6E3
'SP0AXR6Y5HJ8JVV54C69N53CJHATKS9T4RTDEJJM
'SP18H7HHSYQGSA1YA17PX6NFKFD9YA256MV42W35W
'SP1ANYAT911N2M91ER3TMRY8FBNRV9XZFCSBBMZ37
'SP1ASGET1H4KYN7T6CHS2TAXSCASY9WSK37F276N8
'SP1AVKGHDB8W0C0WKA65H68HZPY45TRTMXYZV57AK
'SP1N2NTQANFA9RMCJY1PH26ZNB1QKNSRM8RDTJ87A
'SP1PDFNFG9QM6084K6RHSAA2881ET0XEPGH2CMMVM
'SP1QTGV4ENRH0CKSXV09GVKC5BDYN1REGM1NWRD7C
'SP1RKHEN687140ZESE2F77RK5X9AJNP0PBC9ZMNWY
'SP1TW90B21JH9TDT8CWA95XH2TWS7TQWXYXCN8FN2
'SP1V0HRGQQ4YHXG184KYFHHHM08P317FMP77N8DHE
'SP1X9DEARN1E0NANBWP336AR081YHCQYV133GP1W9
'SP1XKS06HPZ7K4XQKNMNJ9ZWH7P3H8DQ0DA8CP58Z
'SP249NXYW9KG16PN0QQ6NBG0ERWDTP4122S26YEXC
'SP27V5AM4QWZJVKQ8VDWJKHRMCPTDCHV08N6E9X2M
'SP2CAS0WRN4DMAWDE606FZZ3YX7874N9F9Z1X5GYY
'SP2F7F4HNBEFNQMREJH45X5CAN01ZZ714YKRKPN97
'SP2F95N90VZ0K0VH896K74GPGRSKRAHTXBXXYD7D0
'SP2H3TTG3MQK9CEF59S7VQ86H4FX9CH596ZXSE2EK
'SP2H5XRAREPQT5PGA4JWAK0NSAVX0GWMVVE428K2Z
'SP2J38EB5XFFQECD01Q1C0BT64HQ7AW06GK65TC84
'SP2S7Y7BMX7Y73FHV3SV9W1EE63EQ98BE95PZ4C4E
'SP2S9GJ32DBX44CK8HV2P6781EA388PZYFQRSKR5G
'SP2SNMNATK05HBJY5AFXJ2PR9NR88H33V5G9K65WE
'SP2W9VGYQ50HRKYH9N5W3TNB3VHZ3D72X4HJAZY7
'SP2Y5WK8W30JGR8688GT68TVJXX91QV5347KPDZJS
'SP2Z1W4B4GKM4Q1JD0281ZRANN7DGQ7WNMPRHYT9P
'SP2Z6PPX5QHGXMF2QHM5ZRPCNWT95MJMMMQ88VXC7
'SP2ZKT3C5R76512ACSA1C0R1HJ21ASG8ZESPCT3ZC
'SP31H9YM5X8X6N9ZM0VWGM4GGYRDXHZXHFCGYCSKK
'SP33F5TMX4TTX3SXSS8V3TXE4FNCFX1B1DRF64JJH
'SP34S2DRV5CP12TG96F4CRPFRK32STHK158RKXT8B
'SP3CJWG8PNYZS0QGTET0142Q8B03G1DW2T8A3D7ZC
'SP3CRKCVYP853H0A2J3THRFY6BA6HH8D6088T5Y09
'SP3EEDX1CXXXQJPQSA1311PFRDG3W3BHTYXRY1K0K
'SP3RSA024ZBKTD1WFAWEJKFN2SD3A7B0CGEZZ0R5D
'SP3SKZA6B545DM92MYMG7ZG88N81B6J5CVGT1HD7X
'SP3TQYMKCDFD4X1SPCM7X55VJJSJV6Z6YNH4XCX3X
'SP3XZ9701DM8XEAXZT86A0JC3DMB70CPKD4X13KKD
'SPAYZ2TCDP2BRVHF0WVXNZ10G78NPX6Z2RBT4BXT
'SPC0HK4DGXZ786MKNGCJYNH5XDKCW2Q2DAJWQRY4
'SPDV1ARFK48D1JFXDRT0514NKX2Z76GQAA9EAQJN
'SPH61MSTWWJF2ZYR41KHWJN10ZC6DZPPZQWSNVRY
'SPJ76T8J5M0C1FV4210SX6ERNZ3N4QB8B5EYQRAF
'SPM4JKECG23CJGXC93BDXX7579WVH5NR7E2XVC5H
'SPNKSQ0XECRRW6G5F3WMMV2DZ9D01HVKYAQMVQ8K
'SPPMG60V945QW8V0SZ7RFWPYC4HYPXK191D2WKJZ
'SPR3H9VFNTQ0J6AM5DCJ7CH3V7RY719H9AGNTQB7
'SPVT27H705XYPRWH40VV576KCYWKBVW5VSZ0CVEJ
'SPVWS9RP9S7W52485DV5T6CVVW7T433SV0K4GSF0
'SPZD14MQR2BZ4M8VB3AG8H42EXYRSHPN970GWGQM
'SP39HZWWMWBHECGZ8BDFGSJ0310V38QP6BCWN83F
'SP20945N5G0F0V9AZCAHEC1GS3C1S2RWT325H9N0K
'SP31QEPPR3VHW034WTV623YBYY58MJDT43CGRXVB1
'SP19J0RWDXAQKBYT2HTWCEY7ZA820EHK1BVYGZVW1
'SP2T8NABXMBY81NV9Q6X66BSMYSPJ90J315NH310G
'SP14KA59Y5BHS3VN0GJR0A8QWZKQ7KH2YAM5JHXBQ
'SP2KGXS6V086VHVD9KDTC9029S50ATZC6JSXYQ5D4
'SP1DMPD0JNAVDRCTY17S2MNHX8F6502NB0Z25RVR
'SP24VY1XCMF9HW0F2G4Q9F7Y599YZ893BWACZT10P
'SP1Z6PGT6A38E8W6SHJF03JFC2BMRR8X3VQHBX8S8
'SPTF3Q3QHVYWC8A9XCFAAPQD2W2AGDZXGE5AVFAV
'SP3KSSGX2HR8RRCKMDZK07V3YPFEW3NTKKRE3ZGRS
'SP1H2R9GV7K3NFZWBDQC79BYJN2CZSA85DPDY7YZ5
'SP3B5TT0YRTSMK4VXD147KTF84HGBJ7Y830VEW73Q
'SP34A3BGSV788PZX93PMBBPJ6B8024SDBRHD69PHR
'SP1CWAJPYV8A8NW2G259Y36M77RBQCSBFG5K72YZX
'SP2SKVWYV72F38ZWN74D9CRM8P4MC1KS995WDTZZ4
'SP3C7JFQPVHHS1EFGT9WXXXJFH6CE5ZPVJ8YTQGER
'SP14C74BQXZ4Y741TX1SY96QDYTRSKH7YC413TZTH
'SP1KP9E4V26VP4DZEBEH9JMSYDWRJEY98KHFFP2A5
'SP7KF7ZQDA44PYJ9H7G4A7P3E85KWVZFT7JH8136
'SP2S195X6RKNQ7RMFHX32Z8E61NHFD68PBJAG8F52
'SP2D6KTSRE0A4RCYK4XNXB4ZK8GCDXARFY9B7QXRW
'SP39WTKHH436QV6BTS9EKCW64CFT2AYV7XMVTCY0N
'SP19AA3K22Q09KFGSZCFPVGHPKE879DCR9W70HMEM
'SP2419ABMN44BQ275GD5GKESDPBWM4GX1BG8MY2A
'SP3V4VHRTTEFWS2NAYXZJF6QCTXM45W4SJWFZBFM5
'SP336EE6CBKM01N4G9E9BYFN1WM46GQJS22TDM8YS
'SP3T6BZK3VAQZB7HD7VFX7B59EK1HJTXDCAKT0VP2
'SP1W06VKEMWGEBTSG00SNNTRX5HM0D5Z8HMGQ4FGK
'SP3D9XBW1Y39W3X2KK5GAF4KYTGW3KVPNS4R2H2K7
'SPTVX180BACA1YKJ2SWV0XY6BMECJD7SBPZGKX97
'SP1AX55VTKFT1C03XYQGSHZ3CRCCNXZ8ZT0MP8ZP9
'SP33VPBRZGBT6VJD1D2C1RAMXP1TJ6R0V843Q05J3
'SP11XCBWERH2V5SFXWPTSAQNCVXZQEW1FF5040FV8
'SP5R1X651B8SMBS5691CGJS8F20DS5WNP1ZXM2YP
'SP2WMYDF3S39FWDSJ72CAJ9PZRYTW1PKTC0WN5QAP
'SP1CW0XDACDGQQWTT751T6JFJ01JNMZJQEPRN92Y2
'SPH4171MVADSEJZ0MEDA01D726HT4NDARQ9NQWP1
'SP182H6CDDDACMDNQAG7ZQTHZPNXK5GGQVW42J85Y
'SP4JNHJB6B953T1S2GZTNYGJ3PZAHG12NFZY8GPF
'SP388VMKKX9XJ5TFWZ0FM88DA3QWD2YE9QK3TSQ2A
'SP3DGEBES323CX9KV5GAJGC8SRNWFKC1NK0GK6BH
'SP1YG64TFZGHE2P7DFCJHFEC93D2HNAFFHK2YK255
'SPFNSGY6ETAVJ9V0Q5X7PJ2R8AP63PQX3SHVH2J3
'SP2QWDBFWH4FZWB9DWC1B8NRVYNSCG0GCHHNAKQ07
'SP2HYKRRZWHDHSDZ3G7FYE48JD4W6PZRVD0GY6YAZ
'SP30N106SWHK75NWMPKF625D5GR3WGCWN8ZA18KG1
'SP20X5TA49TXG8MJT5GZ0DTRWH3HFSASQ8PMR3BZ5
'SP3E690137QJXQWTTAS5Y7BF9KV5B7P2562EZX05R
'SP1K22C9E00EV6SX5Q7MJ1VHDG18JAJ0MVYZ3CQY0
'SPFDXVD3GQFS77A112E95QTC7Z0JHC3W5G6C3PH5
'SP22Q82AYXCVGVZAM9C4AF1TTTEWYYX5JT70ZXDTP
'SP3739A3P4SSEFJP1XR28Q653S760RKWR9PK3MH37
'SP1PMY2B1HK59Y3CW4JMVWN29RQXDP9ABCMW6BRT2
'SP3CZ90EXBQMFAFS474HVPFAG2SKNT6085K0DDEGJ
'SP2ZBY2M3ZB3SEM95CSTVFN6DHKA1S82P8FBKVCGH
'SP2K5T95DJTBJRSPRPDS5GVE12H6XK7YHXWN74MX9
'SP3A2V8NTVBETNRF5697TMBWAKFR4HYZ9M5B5P484
'SP2J3F35AAWDTT52RDFR437D32TPAEE10NF9K0ZH8
'SP1S1SY4CK4X7E6WPEZ58FBR4555GJW02Q5W82GH7
'SP3WHBHC4S8D4CXDQANTH6K0FQGVA4BSGD9PZV3RA
'SP2XFR7VGBYTHT9ZRP7XP3SP382K6TV0VE6B08KFT
'SP1B87GDCBJQAYPPBEMBMX1V769GNGFEN09VSJW9S
'SPQVGETXY4FMR005P02ZT2KB6CYVV3Y6CRX65XD2
'SP8V9M21ZVCG87SD04NCWQ9X27JVCX0C3B3P2T7Y
'SP2G46V5BCCX8ZCWNW4ZHXW5BYFQ85MBA2Q474CK
'SP3SEWVFDDSF3DDBDCPBJPJMATHX6VNB4QMHVR8NE
'SP18W5G3WJ13K01WSJZTD8YD8150XA0RR57K5XSGB
'SP1TCA7QER9J9NKCKBB78K48TADDFC2GXYM3QQV3X
'SP1KZC258Q30CXKVSDH4EKFFRVF0KZADTBZ42XCTV
'SP30DX5RDQ50YCXQNCR75XVPGEMY1PNVJY3ZRGV1J
'SP31C8VPSNY90MBKZ7W6DSBGJ1S0343R77JZDG9QK
'SP3MAQVK6XYYBCKA25Q2SJZDPT72F04S26BCSXQ8D
'SP3T6W0KYBF8B7R7WFYPS7VBPTBERD775K8HHXJ76
'SPDG11H1QF47P7E6YMPFD1VBVET6Y19AVT8ZFMF4
'SP3FA5263MGYJ1NM6QWAEZAGA4AVBD3YKS9P1TRDG
))
(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))
)
)