;; 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
'SP7PDSYSW6JEVSCY5CXBH8X0VQ1JZ8HFC0AWAVHQ
'SPGT67NDCETCJGWXEPX4VFXHRW3KJNVMTQ6DB56K
'SPDRN8QN4RZHKN7FCTXAV6NCDC6ZR81BP709653Z
'SP257ZR2SW8RQ1PYBY12Q216ZQFMJW92F9ZQ650CF
'SP11ASX0166XB0QEZ1T3688NBCRVJAT05SK9N8PYD
'SP3BHAAZ87M7VA68FG6B1EF98A4QE91EP7A7585K6
'SP2BATKDR21G7ZYVM50JGPXQ3VQDEP74Q516QNCS
'SP1KW31P2MTYDYSFH7ZW2FEZT7RE9SKMAG60C79AV
'SP185NRZR78GT3SSEFVPGF7F5PW447EGS9VR2RAKX
'SP2PR3CB3QHVB3G8DWDK22QZXRMPN3R53BHCZQF7P
'SP120QSA1FKFG4A785YFB16JC3W1A32609FGK8FR
'SP1PQ0VZF1AC9DBT13HE6P5D8X62J7KTX3M426KVS
'SP90JQY436Q1F7HWT7EWE15VXY145SC7AN34W4DZ
'SP1NV14G70EBKD4EW9KCD84CABDT13MVGSQ3XEN8V
'SP29YYB0XRS61FPFQ2GTK6K4Y1GH0QGM2MY4EFKM6
'SP3F2BQF17YSHQJ46QA2XFB76G1FTGM6YCPJRJ9MT
'SP2834TB5Q6EZ5YPFBRTPM5RDTQAM95RGFVYXKHVP
'SP3BRDKZX64MVZF5KXGYK1EZ7CQAPP7D7V35V08WH
'SP1PWMPB9E3DA8JQH5PJMX56B45TXRPYZNWRW3Q7H
'SPMJD3ZVS86VYGFTVCJ3R3PSMPJWY0ZQ5WT7X327
'SP2DSYGESKKWG2C6F74Q7GV931Y9TPNQ914N01JFK
'SP2D4P7FGSF6GNDPS61V35S08QY6JSJYHQF1A9Z7
'SP22GTMW6YERVVZHJ0W3825ESQ1F0JQ5XM5176JMW
'SP3QCEEB3SFJ4804YK5XSS49K00EWST0A8MRF0W79
'SP1DWASQCV2A00AZK50SF1ATW9ATQHJJF2P6X70SE
'SP36WFTA4M3BQD1RSK7B3S4XPXCWJPC5CDQ035JT0
'SP3FNE37MN5F04NAXVBQTK8JSAGQ1PB197TE45NZN
'SP1FZY71FJ0SJRHS38EBZQHC8MRD4M9105C6JH2TJ
'SPE0Y9GC5669ETEZRFSSN2PE5JK4N5ZPP8SKM8NV
'SP38RET6VJ65GQZ5FW15XV1SXG02N3NM876K4H1DD
'SP1G12FFXC7JAXYAGFTMPEX6FF7QQ5CC07XHDR3B1
'SPC5T21VK1CQSMWHVARFW3M32NY1AJRG0VRY3KK7
'SP20SWPW3EK1Q9TYYVCJXB8CD8J78CAEC6K5PM5N
'SP13RFWT3TWC8KB4QAV0JY56E8R313XQ6HCDWTRGB
'SP1F2NPFBTNVA3QM4T93RNRXJEKY6G0009TTDW3AZ
'SP398YKDHEHPVSWB16ZCV741AP88ADPKTMAZNQS3J
'SP2GCJRAVQ1R3FHV9KFS5QDHERBSTZ1TBC1WE3G4D
'SP2ZF4CRB2BZMRKC8X863FZGVVBDXXFZ776725WN
'SP3YEG1DRVJNH1DC1E1ZFWJT9TW0AG13KDZGQC0WT
'SP2WEXDSGPGB8Y7AW319N727V53VMWC5S32VSE3B6
'SP3YNX6PADDF3M6K8R9F5K5EER75BSZQR3VV6VDGC
'SPHTFHBMM5HCN6JGXY7H17BCE8WG3W93AQP3SNGX
'SP16DFNMDDB24TADE7WA37VDSTBEPTWR6WXHK6NVN
'SP3YVJVF4NJB5NNN58D72WK79CFYMF0DJSW3GHRJH
'SPC24B1719Y60Y95SYQ40A8C1W2ERFSKJFJSC62Z
'SP2PHJ799E4VV8J5CK41EKD2Z8F38ZXEM2C9Q93SD
'SP1HN7GVEHCY4K30EE52S14EDPNDNN8720Z0EJ99Y
'SP28T2Q2WJA9CH1P7SKS02SNM002V508ES2KK68EQ
'SP3WKRZSKQS0F4JT6VFM1SXSQFGXJSYGY0ZGSPKY9
'SP3B1KGZFVMCPK4RMNFQKSGQM6YEBA1QKZ593K0D2
'SP1CEK5S4MHA3C6470NKFNAGTVXB1XZGZ4W6Y04WS
'SP1N3WEKX90D9J0ARZXYH4797HM7W6Q2Q0V1JKJWC
'SP1TCZVV6VD0V02DHBC0ZDHW2P29HN3HJC2E7GJE
'SP3P9VNPR9JMH83YB87KEKY2S2CNDWART79AJYCMR
'SP2M8YQ84MR96VHRB6SE2N6KAA2JNVXKABW56YSXJ
'SP3J5T9RRBASZ8SXFHZ5KGTZEV3Z8W22SVRSBZ2XF
'SPS16CZW18W0M316S7QP5HRY6W1NZERBWTW9AXWR
'SP2F4TND6SSKKR44YE6MZ7Z86YSDVQ1C05CWM67ZH
'SP3PWK88ZFPH2FJDVGNDX5XD739KRWRFR3P1ZBEJW
'SP23B0W01D1BRTPTDXZ6JC4ETP9SPY6XXVTXB6DE7
'SP22GRNZHCEXF5TZD7JA5EGQC37Q8AZSJMXGEN4Q1
'SPX1DKSRRDC6PBZY3GWE0SPHDCM24WE4E7C3BCHJ
'SP1QW68JNJYD3R2MM5QS3KKMWMHAF5QM2CN4YTRSD
'SP2Q4QR8YJFFE8736QN5F8VQ0P42XD82H210XB6TW
'SP14A17X8XQG6CFHDSDV7F9A5H6PEA5WA8VKRJ4FQ
'SP2Z1A9SBJKXD4GJ510X8MR8S0GB1ASEVGFEST327
'SP29SY9P8K6JNC5MG8JG54KVABHB76ZZSX40TPFZC
'SP1S2T03JFSWEK12X1VPRC62V1JJQ9ATC60S50MYC
'SP20JK256ZBWBZF4YMJ2QK4VAM2PKKY5HXT60N2R0
'SP2RQT2SGNA9BZ2SSX9S28ZE9VX7RD90SXHWF81K0
'SP33ATADNYENQG8REEJ1CB4BJHVBDMQEBKKR620BR
'SP2J6NYGWZ54YNHBF5PT19Y3FQK89MNY2JJ2N73PW
'SP2PEVXEBDN5DVTA9SJMFYJ33XXF8B14GQRKT1PS9
'SP8AFQ4RR0YA4PDG7WA84H90GACF4YG3CDFN725C
'SP2H12M60JZVZ8H4QBBVVVRC3RH4XX74PA7WQCP5A
'SP201TMTD8TC8FH0B3XJGW8BJCXDZJ094ESN4XTW1
'SPW2T9QZ6BWVHSR6FH4CH2J58TJ7VHGVT5DTDX09
'SP38SCA99A3ST1EV5XHC2EQ15H2WMA1FDE2CJ0ZBB
'SP1DMAXRZ8X1BQ8BJFHGFQKZ96Y68QEQQY1FBTAMH
'SP311MBKKQ0QJDMMQQRMWQKMMDV8S9YJ3YPDDNKQ5
'SPCR29JMABXXHAZNGZKE1N1PG8NSMSZDCHSA1NCQ
'SP1QSC9Q50K8AV0TG827E0018QBDE43N2N5HJH2DT
'SP1S3ZTQBFESA4C44CPGXKN7AB6ABC4X28FD9W119
'SP2VTQJBF84R9CJWSCNXR9960E25G1KRDQZ4XZ9SP
'SP3JR1EZV1XSAYJAENK98YXX7ZCQ0A9YB79SCTYXF
'SP3FNZWT0QM6JC91H3ETX3MHHHVBVGDV09C14ZNH
'SPJ4CK4ZHFT0DCT7YRMSQA067MNZTK5BANAYGH8R
'SP14CRY8HWPT2Y6T6PYAV9GPHNFSRHVX1QQ05SN4V
'SP190ZCK099TMK51YMM9144KQRWF6W5Q8NP77XXZ4
'SP262W741F3ZAZTVYSZV8AZQ8D19H728D2SSY86N
'SP3SZFQBKADCP2DK3RZE49NN75Y48724E9B269B6T
'SP1N01JQ8VXPC2VF5B1PZV5P5XSK0CFNNPEDC7Y1J
'SP2A34E1CJA10E4GXYM68A6XCRZBGAN3870HSXGKJ
'SP2002TYGGV9PZRFH3W23NGXKZCFBH3KKPXAAP09K
'SP31Y1EJ1HF5WV2DN4HGQ0QBRYGG95GJSAXF1QF58
'SP10WN3PD6HG8KED34XG3JTYSS2M34GW6BQQ4TF7Y
'SP3XKHQZKGZ0FQTYTE728QBW8JDM4G9469NR3WYMC
'SP1C2SF0C7Q5R68DP0Q5FMW4WHARQMPY2BP2RPKBJ
'SP2QQJFMAW352VDP0QVNH4PN3EFVABKFVXNWM9HEX
'SP314GP41QTNCGRPVK7JFMVN59782FVNVB00ANKNC
'SP38XTNX38DZN2H2VJBCAVJ8GWMQ6H3NXHX8NFH68
'SP2BT1Q8TT6F4TTVDJP43TYH05WVDZ9FCBX62H93A
'SP1SC00C4JGCNXCJR0R30GYQRYSJK64DBZTQ6DDF0
'SP1PEVWE2A8YCG8V161E5FT1ND17TC93VFS44B93C
'SP2553YVDHNA3KTQD0K8KPA3BBZ8E4T0X77BD3SM6
'SP1WMZ4283CTB9ZHGX56FG1ATF1HX2VBVHC2PSQG1
'SP2HTEK87FHXWG2QWSSD7S3QNA4CVW8G1CP9P48VE
'SP3X7JTNV0XGJ6VRSEZX0EXE8G5YH0N6ZRT4Q4MVV
'SP13X8566YAA4SVN4KCVR03WW3KN6CSZ5RFAYFPBG
'SP3QH3SPY2349ASEWMDG9G6S0FJX51TM8HFZ8M34
'SP3QXYSVPRRKHW33XYXME3ZMX380DJ7RN9399BQM
'SP15JSSMXR1YS0CK02T38YNZPR6ZNEAQJ532K601R
'SP14J94SRYM5AHTQ3760AETPGA50C78S1G4TFTD2H
'SPHFHKAS5XPGNJAJ8VESP58CJWSGV0FTXJ5TB4MM
'SP2Z2PKS9FDTM010PK9V1R8FFWCR7G0DB4NJAFSK6
'SP3JHWV926ZJDB5QB1KKD07JEKTTQG9P55WHHYQ45
'SPYP81H849X63XANHRD08XZP29AATPZ1JEQH6D51
'SP2HR9N2WCVZAG3TK4JMY8Z6JY327XM2Y97TM5KGW
'SP24G5AFV9JHGEMZTFRWDAX4E3PV9AJ8R82WCV4C7
'SP1TKYWBWGB5J939B568M11ZX8MHT29SB6G4CK8AM
'SP1W707NEMZ0TEX6D33G62FWK5EEA9DT7A6K886XZ
'SP2M3E53A102C5HQSVMYX5JWGTZRRAB4QRA6MYK4T
'SP35ZXCADJ99E6Z04PNZ6RZERWMKB6WYM8VT258XZ
'SP3KDDX6CXHHK46N7GB286KVV6FWKH8NMT60ACQJ1
'SP30764A2RTMJC3W96HPNF8MTFJK8TRT8GBQHEEBT
'SP1MZ09J2SVBCHF9SKYNXDKFAQ34E3C5PXWQS7KPH
'SP34KP8KVE1ZS9PB5WEKXXFA1EWJ3G9SXRX723FMS
'SP34A4RSAAAX9R4W5D4BRGXVTEM4R6X5ZDF6WH38D
'SP3Z8Z9T8A5TT3FHV8221ZF8BT7JAZGD0NYGCZE9W
'SPQ92YKB77GVK2P47M1PMMG74R5GSAPD23E780V2
'SP2K478KATC0SHQCJGMGCVGTGANS51SYFEKBW63SP
'SP2C3Q0A74M00GDRPRBVKGWAXE88H53TH7R7ZXZPZ
'SP33HD6PYD5TAT6CEJ8CPE70Q9VEBHXWAXZSFVEMQ
'SPDYBH15NYBZKVKJG3PGK839H9RP87PM804E9FNZ
'SP2JWHJSQ9WT0D7ASWGB0D9Z3YKQ9540JQ4SMRZ7F
'SPQDYVH8WSY4W2GYJNVRD9QYAHS42RC51WY5E4K1
'SP3720DHS93ZTNQ47744B8VAHHP23N8XDJ21372Y
'SP3MVAE7G6S221NVCH1YKZ2NC35V2QEKPQJG8JQT
'SP1GDCNJJ5FMYEG516DEHGBZ4X15CR4X0T5RJF2WJ
'SP10SAH17Q0W4C1SNJGMNZ6BWT0YS2R3PNT03F905
'SP89FAY4P5WA1AP5PK4NQV9FBJD3SQ0S0REM12RS
'SP1GN5HZ5BVP6P8VT4YQ04YFPJFFW610TEFJ6FNBZ
'SP1864Y3GG9J0V01E0QP9QTBM632NRWCNVQBHCZR6
'SP27M65AKYWZ2DV7PW3S9BKRPX7RZ8370P33560TJ
'SPNXWSJNHKAHQYJ3DR0JM34JM4YY1458VZKPTZ3C
'SP2SX9M9SQMMB1G8C2RR056XCD51BYDBAH7HC7C4Q
'SP166E43JMSDXXRZZ50FM588QMHMF25DQSE31NVCY
'SP15M3XD7XYN7S23JKDMF8HGNPBFMYPNZQ2CDH9SN
'SP3E6397TYMGKKP7JAV4BM5CH4EVEE0KXRX67QN1E
'SP3VP1FF5GERNR2FEHA62Q2GJN7GT8D4VKN7QZACD
'SP1N53P0W8S0WZQG33F21GZM4DTHBMY2CK3HDH4G4
'SP9Y9NXC0Y96DKBMPAEY1JT18Y8650NC8HG9P856
'SP2GPW7F4QHJV2S9V76W1WWB8TWJ3YNZB8XCJV4XR
'SP2MTHVTFXVS695J4H600N90GBRW3PMXEDJDR22YP
'SPNWGMRAPKWZVWZPKW0T0NM9KVGY76SK6NZX40RC
'SP19XDCPCAPTJ7V11Y8678ZFT4XD2K932FWJ4ESG2
'SP2KJ9N76CAJ9PD62EJQE9P2YBEFBP03NWJ962GX6
'SP10HPTXWWSN9DMJJ4QTN3D4YVN4EEVVV1KT69V7H
'SP1ZYVXAGZH4CM3ZD14TWCC88JZ6S8Z3XJSE1S1SE
'SP3F719NG3WWCMD5HK0HDWJKNC7SJT7NVCBTN895T
'SPVZQDDV9JDKC78X8HTMDR4S9V947X4PRDC91XZK
'SP1SQ2364FPY20VZECG7XFGT3AYYM7GWA8BJBAGAN
'SP2MREEYQ29JKA4SWZKSX856ST61AXPZGDTRA25T9
'SP2V8AFRXRFYQE1B04QREA21JJ2HGJRJZ1H93GB6B
'SP35MEYYBHSFCFXY296YGP7NAT6Y4XBJW2VETR8AV
'SP1GYX898GSB6S97FWFQXDC9VGT18FG8VEYQ0AKQT
'SP3VA61WASGVGPARY2R2Y0Y0S785TW5JWCQXJXKC
'SP34C3T5M1SD6XPV5QR0YAX4X44H52CEAHAYRDFB5
'SP60EC74B4J7E894CXCSCRHXX0EKSX6P0BSWN1R7
'SP399KNSYRW6Y363XS54TE3RCSDSW1HMA2E640K7P
'SP28T85YPGYD2BYBW5E0QSH02VQXVARD83V9KA47Q
'SP13R7HYNK9HXZSC3P3BSYHVFZA84CB6M697JC46W
'SPAY1BMJXR7N24CSBF19QXC730JG2G49JX4XHS8N
'SP3NN6Y9852TAHX70SE1VYGDA160B58VATZ52HM2P
'SP1M2F96QM7VWGMMDZZ49554BWRZYSC7QD9KV7X60
'SP10YD07Z41XHTQHVH0SJKKGTYGQSC1ZE88714Z81
'SPD6QXGFPJRYR86M0WK3NYWD7279GT5K1JMB46WK
'SP1VN5FMT989VW92RXG8X62YW8HFK2JNZ8ZKYRNN
'SPY6D3FA6RQFTQTDDMR0SCGC8AD0XH2E9S2C7QEG
'SP3VYGFM6J8ZYF7C5SBDC87XKEHH34ZPMH7B3XCEC
'SP1GHJ2NFXB1JKTFJ5QZC2321JK3856J968Q7A12W
'SP3766V2QFS9MTZGGKVTPWST3J3NMFZQ9HVTV9N34
'SP1PMY4PNEH3RC3P6VKM5RGME210A9XCYVC6QC58C
'SPGX6PZRNJWMFHPH4T5KVD4N1EDPDE0BN2DWY1DD
'SP1BVF4CJRDK0FTF0PMY41W7VY0WE93HXF346MVQ3
'SP3TJVHP0N0YPZXTZQF1C7DDCTD5QE3EZP6C5CS33
'SP3MV6AF57HQZYRRKADK300NCH9NBG8QCTM6DX546
'SP39CQK9SZBPSSG7Y3YSQRERNSQQGKGA18CCBE799
'SP20M01XN8BDMJKXKPKFHEJPDYSRDND66CCZFR9K9
'SP3D4XDWDSYRJPKA349F8GKSY7CNBV0970VPZG5DY
'SP1JGM1JCM15APZQWVCNVG1SMWBY9XKQYMSR0T3AS
'SP8SDGX50SA3NTVDPZMWK4DYKSH3SS0EPHY6Q17P
'SP1YCKGH91VHNXYF73MQQQW9F9KX0R8QFKPCNC63V
'SP2SV8KNCEXF94VDGFWHX76QZV53ZKSPRPDYARAFZ
'SP23KANXBX6EX6R5RTA3JMXYBRN42EFBXZGDY8GAM
'SP1HEBJGGBCZSK15Y9XHPJX8JEG27XG5MBJJ4QKXB
'SPHRSPV4VB9GC97P9WHN2MSD5VXFDC23MX0C5M01
'SPSWTWPBZYNZRNVQKBC1PZ57NSM1T8VMV3JGVG06
'SP2C8NC0PXWPSB83QRHSDMNPX9WGVDX8A5WYEDZJ
'SP1PEFQSFSWTMM4Y3EDTS2B37YQJ4M3FRAACAQBDR
))
(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))
)
)