;; 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
'SP3KVQ9CP8N80VPFY8CKNKWWHFQQNMMN58BARKFQ6
'SP2VZSP1HHR9JFZ95V5XPE1RYWT6CJQHM82VS9DYJ
'SP16HXWHTZEHHKBE12AB91PYJ63V0S696G3MZZM8K
'SP2XB6QBDENM854JQQXZDR5RB383RBY73XP4NAG0B
'SPBNJ6AE40H35XR2FWBRCMYMAB2FCXQX56W8M7QP
'SPD12G927X603WQ4M2EEZDP2VCANDQQ44VSY09KX
'SP12H21NGQ0JCR6K9TDRKE3PWFD7H66ARKGHRN7D8
'SP1FSMZGDVRG7EB9K3K49M8CERVAQ4VG3WP0E7XFE
'SP25FW34NY7V7N1C3EP1ZVFWE8WP9DCA2RV9S93R9
'SP53T3W2D4Y2TACWT96M0DQQ82G46P2YV9JHW0QB
'SP1VK0J2561XPWDW9Z26AJSE4772FFH07SBYEWM79
'SP2D8RP8J0EYMZPFTT0SS0YE4HR0JV6CBBAB9508F
'SP3XHXC587PHPESC36JZECQQQKNKB6X27E2PCK7AC
'SP1S6BYPM7XC5C08NQ91N8GW9E08XMP3E6NDY2PMD
'SPG5JD3W6FQ0A1CRSQTHC63Q0ZDJ1DFDHVBFPPS0
'SP3GMEZSWD5MHRG03FVBYPM5ARPBT0P7BHXTDJ3M0
'SPCP8A8TCE3D2S2ANA9CJF0YWP04D56TS27MTRQ4
'SP20C2YNZVEXWDAP51M4Z88D21D3TZEPRCB979NXE
'SPC3S0QTXQ4AXP3603FM80HTP4F4519B3GYK8YQ7
'SP2S767MKV5T4JBN0Y6JN1NT7R21R8S7PQC1PBE4J
'SP9DNF686W98JKN8JS34ZX55QF91VGRRGZMX8BWE
'SP2NV686QN5C14G92TBK4BG3AR5ERP5ZDQ6R6W36H
'SP3WXRK54MNX6SWS5CH2X9P701M6EFDRJMEVB9MGN
'SP223B3SYAWAS4YZMC1Q6ET67XC1VQ5R6AB8MG443
'SP3ZD0YA4XMW4ZQHCQBWS1G427Y8Z2QVMHGW4J5FR
'SPC5ZXBWN8WFYQ7S50ETGX28RPKNME43J67PDA22
'SP146N19VXWBS6P4VVRWFSN5FEPJ8X6B04ZDB0XFW
'SP130W5KCTDXD3EP621Q7VYQ9APBBSBD345SYZRKM
'SP2QF9PNS9VGE7B34Y2H3KAQ7A6PMM2348SH69XW9
'SP3AMAPBWWSP2HRBHRCAXR00WFGZT9C0YNJ9CQ1A0
'SP148HG2KJG5HRT7DTHSW4SP1WXZY8ZT996035R7W
'SP420KHGRZZRKPTPH4FC0RG48WNHE120AHT7MMG4
'SP27XEEMAWJV7HRXZ21BNK6EXCFF1J76DBWRDN0PD
'SP1Q8CK9R8RJ8DNXVK8P43T6N45H2SFNGE2320M20
'SP22AW67NPAQT4PBBS4RB0TPDGVQPZGW73F90CA88
'SP1997X43JX4PYEAZWNEMH8MT9JBB9N583244WQMA
'SP1B7X9XYS3KE7FSQ54CQXTACW2AWPNGDW9CFZKGK
'SP3F02FT0QJBKV486SEXHFMKKWD0H5RPWD865CRSZ
'SP18JZJ71X31T9E5CR4RCSYGRC2YV33ZK4ZDWKQFT
'SP37SX9RKVPBNGHM0DMYVXN6PJ8E5FM5K7VRNNB0K
'SP3XZGZ8QJ66GR0XVZXY0VZA4VHHKVPGH63BNF1B1
'SPMTBH5FQ0SNNQZ6TT6XRF6VGXAMT6JJQPPGEWD4
'SP1CBXWG0WE8BH7QCQE29698PKZD828V74XPWE9E0
'SP1261FETDPA4PVJ319JYA6104S9PZEDCDFQ9SGCQ
'SP2M45RTM0F86KFQ3D6Q92N09EJT1AHHGE584EF8
'SP2AF7F1GB74KJ11F69KKSYD9872P0C02VHS65YPX
'SP3MY08759H788X3Y9FAPD683326A1GFC43PPBQVK
'SP18T9PE9K973BQZZ9JSA5SWZWNDXX9QWMEBSTVYR
'SPR23H11ZTMV1V6ZYCWCZ553DEYT3HRQ9443DAC5
'SP2B3FC0DTCR038G13J2BHV871X6ZDG07PP76HXP1
'SP35DBM66MEKPGDDJ1ASPF9QAAF83EFD3YT5ZBNK1
'SP2TQFT3AZFGW233XYPW4KG6ZG7PKD083Y3P47QER
'SP3MVCRB4EJ79TN3VP6GBC4P9ZRYC18E5JQWD6PTZ
'SPS8E27EESKK31WHP6ZC1436YFS50929SNTD6TQ2
'SP3SZX1Z7EPRQ2V6A9HDD5QPFYN8ZGQDW3ZNW4AFZ
'SPHQR1DPS12FGXKQ7H2PY3GGHHP3X8PCRFTJWYAS
'SP1XCG1GSVHSNVPSRANZNN2XF0R9RTJERXH5M97EN
'SP33J2TNQXPDYBGRVW4287WA67X4PSB7G3Z3P77GY
'SP1RKD7CFSMFMMBJGQB24VDRM077YZAR03CB6PCE1
'SP25RXP4J648GZK1J3D6Z6DMXK1AGM6A74GHPKXR1
'SP2143KGF168ZR74EPN50AV058VY83E8YKF4FF14
'SP1S64PYKGRX1WSWAZM71XTT30KXESF3D8S2DCTJH
'SP2FAE7588AWKG9JT6R01FMJHN0Y2Z24DK53Y2H7G
'SP3D4F2VZ89M2XA0AF2P8RB83VSTAAA9BJJFWT7FN
'SP28KSS9FEJ4M5ZDJFAJ27K2CBYGC7TJAQZHH98BA
'SP17M1XRK2QVBMNP36EX5WG8X28AKQQDPM8657ZPM
'SPKRH70TPTN1H5MG6GJ76586ADXZF1Q4YF35Y0BP
'SP1894SK6SCWRXZ0TM6GCGBZNPQB3B3VZ4ENN6SYH
'SP1088DFV5RSXEBVDV2P3TVWPE889BNNFZ0FXJR9M
'SPY5X1SSXQ23KZSY1SAJQVDV4A8N7XBRYZNQ4P7F
'SPQBZQZWX927SJCMFDXA8VBBVWV77S21HSTKTQQJ
'SP244D5CC2MT3HB5Q3MG0RHX2Q1WQ0WXN2822CGEC
'SP36HR5Q5T9YAC8VNWWNY05K1Z2CD00E9HNYA2BDB
'SP2PABYVK5BXYR7N4N29QD9XK7J5J5NRGFA73WPX
'SP25J51VYDH6X6BA0DD00GW2DSB3T8FW8WCG57DK6
'SP2YGH65AR7XVPW3RSHDFWNCWEFFB15T718S5F19J
'SPJATE261RKRZXSRX2VCMXK5J0VQ72ZY19KC26AT
'SP331BBAGCA1VSE1AQV5YEN7E03GB43D5MZZS5PNB
'SP3PWRRS83DXG8Z015Y9T3QZWSM29T9WDG6N3B4KE
'SP12WWY2GMNPKSCN2ZY2A2H0XB2MRQYW89VMM29P6
'SPJS15E5MZPEXTR5E8G7PF5VJ7ZF927W6R33XEQA
'SP3V9G2S1YNPWZMC4GNT2HVPHD138EWD4SJZJ142N
'SP1N1PTGWQAWXTVKME5GBG4FXXQR6GVQW8DPFEXBG
'SP16WTBTYXXNCDM0XKJAN4FQ97SR3P6RA97R5XPB1
'SP1QBRG3HG4EGKYF69E0Y1RE1WANC0NV94CF0Z2PY
'SP1K3PTTYNAF6RNKJ77Q7NZ62QTK99NGYB3FYNVZ0
'SP3X9QQ49RH48NNW062VJ27W66N56EHTT2T5X7D9R
'SP3VG6JMZM32APH422BM7FWVZ712H27G73V4HNPHM
'SPF3QJXTBR0C3E9XHY1JAVP15PV87EYN910MG3G0
'SP1P69WPMH680QDEPV4SRBD5GGMSS3DP59W493KJY
'SPXRJPCXFVEEB6BTA6KBYCPTTJRB09PGA48XR3VB
'SPHE0PHNF1E1Z4YSVSMCT72DQHMSQQBGZEW5JQKB
'SP2ZR74KMGW835MEANH220W1SEB8DB0FTY3BKF0R7
'SP3BG5YA9G4HC9ZXKFRGQTB2DKN6GJFGD27DPBA23
'SP2NS3XWD1N7552AD84VES96FB10TDQ7YEWC803YY
'SPKXW3HHGD8EJAM72Z8C7NBY69XGVJPZXDETXNPW
'SP2Y743CNBQ5RW3A323C338HD1DVK04CSBKMECQ1Y
'SP133VW3D9A5S6V441K2QPC6KNQ7FTQH6Y7C4CHE9
'SP9BYT8NDWJ3BZ08JMM3D0Y6DTD5T9HVB06171BC
'SP2639G3E90J26FGQ5VTSEMFRHEZSSJC0QXER18SY
'SP2TQQ9E931PYD4J7X1G4PPTQHTGEC81YQNXB9ZXP
'SP38VJR8NQJX1S2J8TCEWW3Q4JVP0JS4RH4QE2HZM
'SP1HWHRN8H1PGF6P2SJP58CDAZK2GV356KBQTVSBV
'SP5VMP40DQJP12MZAFQFFX598G9ADE6F5RQBDKF9
'SP6JPABW47WGA85W4WE1VHEAJ6J0FMC036N3F7WK
'SPYYKSV2P4RMT2TXW4YYD3Q7HDZBYXMAC6WWCJW8
'SP236P3GN9TNAK0AERVMPDZJ83P4R25EPYN9AE5W5
'SP1QB4T7MS5SSYKH65FRYBX79XNP6Q77DT8KKYHT4
'SP2FNF33XXXA6H6AFHND46M7AD65YYG1P8GNCY5TK
'SP1D76X7DKTNEFCSXTP29F1M5MQVGXGPQ80VGPWV1
'SP3E2QMYX2W9QCXZRWF02KSGVEQDXFV3FGJ5H5X2G
'SP37TZF3ED3EY5ADFQWRDJGMATAKZVEEW0V7EKMGF
'SPQ5FQSVMC6DY6NBYP2B8VQNNHFQRWVMW2K44FJE
'SPVKNY2KJXQSWWTYRCKBWC1M54X2KRY9XT10BK3X
'SP2EEMSWDMXV3E4PN7CNK39PBEQRPY34J1MWG3CAP
'SP2HHHPADTZHC524FJMGGN0A8W67MZ6CWT03JAXE4
'SPZ2FSQAXSAH75S9D17QWGPZ57JMDGWX4JPDYSCS
'SP21EBXKM12APCY7W1EH3EZZYXRJDKYKGFCTA5Q30
'SP2EG6PJXFJ1BAD7XX5AJ69N9KYDSXCQSJV6Y58PX
'SP2MMH2FB6V2QWX3DWQH2G3W598T7HVRJ2G1TM3V4
'SP3N4K1X8MTBF86E4ZBCXXEJNRTKASBXJK7009QTQ
'SP1TTW5DFY91VC85T80MZ7P26SC5RCJ8N3BDV8S3
'SP2VFWFRK7XA9EDTEW94H7QXVRNY9VERP27W9MRF2
'SP27VQAZ9K7D0Z5PW9MWJ9T3VF2XSM7VTQ48QSVE4
'SPJ7T1H097G3VWAT9XPZ4AT32D9485CHY944TPF
'SP91KPX73W94M6SCBFXC24HA0C3QAEQVBAMPBCTT
'SP2AAPWAT8GV9KWV49QNAQRS4DAG3H8PWD4NJY4BF
'SP30B64TWM1TB8MBRJJ9E8PTKP49G3T44RJF2S9GN
'SPDNWHG74P8CS4VPGQ32502M02Z518GCD1BWWRM4
'SPBK5V142ENK2YP10W2X6628SZQM9FEVQKMXB149
'SP3YEVF4WR00WN2SENM59EJKPVP2NWBR8QX42ZJA1
'SP15C511T142ZSVJ3SMZP9K8SH5XN9MFB7Q7ZZTJ0
'SP187S18MC3B6E80QNMGDDWFJTZVZM65PPVCR1QP8
'SP1EYSW3D2YDJC60MR8EX2DF7PZD8PCQSY9CD9842
'SP37RPZ6XEMHM5DTCK6DFCXKQPCXK45APM9D9BEQS
'SP1JDVX98MKMH9F8RG7AF26FS9KMSHCVPFDJRFXS4
'SP17YC7VY423W3DJ42PQGHJQMMRXS1P19SV51G18Z
'SP17Y28N48QABS6CXCRTKRHGDR11T2BF5HBFZY5FQ
'SP2DQJJ1D1GWS9X1W6FZDSRG5FRTA0Z7TH583F2TF
'SP25TX32KR1EC625JDK2CRZ20ZE9R61RZYZEFKA84
'SP3JERDPCHAHDH6ES6G7D0HRQ1DEB66E4WTK7922Z
'SP2642699XFS6DQ6E2MB5BZ2V7F61EPZCZQH7HZPT
'SP2XMMFN145BFVBAFM10ZA1RYSRG7GH4R89V347E8
'SP4R671HATVYMSYHQEATXQWJ6HCJVX608CA1PC46
'SP3KBQKWQXAH2S86EZZ48TDQM1WTSK7PNV5JMZDA
'SP34YJY14J546BJ5AF28X0H7EY6YKK5ND67RNE0XH
'SP18Q554PS648J745RNFFKT90QW7NW8WASQJ06TC8
'SP2CJBNE5DMQA3KS2S2AAE0AW8BZDS33RXCBTXPQM
'SPQ6S56JMVF48ENB6XFNV5Y1DAS00SZ61MNXG21D
'SP1RX9T9ZNWXZNJVX832V9PJJ8KN4RFN37E2B0DRC
'SP15VC51GJZF9REEEKJ3E4ZA8H4S9E0D2KRZHA04V
'SP29PBD96TNE7QKGVGEEG1ZG6M5G3PSPFXRX91GVK
'SPQVNKB6FJTK89NSZHRK9PDM7TB4W961DEP9XPAB
'SPXRD9AN4J3N1VBKRFNWMBAH0EMBVGZ6RAQNRWQB
'SP1B91MKXWMBQP50YWCNR08XZKBJJVSJRHB72SBX
'SP3NW4P7NGAD65127DDV2FTXDCA1K43QGSNK0DA0P
'SP3M87BY9G9AZ90D97V0B25F5JRWRXTWHHNERGX2Z
'SP3VP83NCJCPY3MCXSNR94GC6Q6SYJCQ8DY6QQQ89
'SP3XTRRBJHEMVY2SF77DJKDXV5Q09MRZXYM431P3S
'SPHYMN36EF74JDTDEDG29YRP21A9RKZ749BMNKQ5
'SP2A5ZWG17H9FVKF02JFH1SD4CS222VR2WZ7ZRWS3
'SP393GB5D7ZYMH7AM6RMACBJMW5DMJ1JM6A7BRXCZ
'SP3G4E4XXDFNSGVSPES2CJ1J1RSSQMGR77KZ422YH
'SP220FQNRYX7SFR1FTK0N11402XV8Q7ZNKGAEVC96
'SP1MY3W5CPTQ4JCV9712FFK9JQ0T9QZ0RDGADFDYK
'SP314RG3CT6A11PCTF2239YQTCRM8R8ZE5KX6M0NM
'SP30KRS65V9YPGMTQDA21PQBM403JD0JBBW65FJ3Z
'SP13ZEYHEGBNZ8GJ0SVC1HZV99A9PC178QZMPAXB7
'SPB2VSAMSYZ905X2BZY2QZJ7RWA6ZXB43XPDF506
'SP2WXZGQ391F29X45JB2RAW4EJN277X2HAYZT5HDV
'SPVD41WQSQVVZ0Y54X5BBJ9X9H75A21WVK8MH85P
'SP3QQ0S9GKGBGPP9YKC7NNB6S111K105PC49TD1CH
'SPZCGN22ZTAH9QD5NG8BZ44PYY5Z803K8S08AZS6
'SP2QJZBTB874KWT9YSG4CMVSYBXVYX9SDHY11108Y
'SP369YMRM83QWP45TFA6C474VB1F0T4MPKGQKQMZT
'SPH1SNZJPHN81MWZFKPQ9CPYRYMZKQX7ET543GBB
'SP17CR258EZKD893TVTYDEYEDBT42F8DCEY9P6CT4
'SP11V20HS67GJRN1MBGBGXY2CD5KT0M30YWJT9CQF
'SP12DQSBFRJATP92VET049BJTJ67J8C20EEAZQVT
'SP360ET4N9FE7A8AB5R06M2XXVCCFZRG9PZ9D0M85
'SP1ZCT38K25QAB3SKFANT6HY2ERF58SPMJQJYZFRV
'SP10Y88DW28TRNTYJZXSXG95BSY57ARFAMGYHCRM9
'SP3TYWC5AWS17PQ62Q26BG2X703KKX1RZXE5H9XD4
'SP30E6ZREYT582YC60SNPJDJ63K74TXAJ386VAAMC
'SP14DN18NMXRNRM9GZ981R7RP6QG3YQAM9NX6QPG0
'SP3M9H338NVTBDYZD4KKWK67AR87ATZ3F9PQ0BH9T
'SPNEFNJMHNQP1E0EAV2S64XC2F9F4Q05VP6QG90A
'SP24Q4Z0ZA1D634717AKE91SBXCXZG9R9DHSDMY0B
'SPJ1KENDBAHWVD3KDNW8RTS6EE7H5J195WPVQZNM
'SP37W6CK0YZ1KJXGFM57Z7VY48T6VFKCQYKQ929NP
'SP1SR794KR1W098E1RJR1JKPPX38ZH1NCDYXFJYTF
'SP38Q50GFD6PDP895EDB1Z4B64NCG9763QFS663G7
'SP1MM5JC9ZBTH65SSVA3KV6FE258DKC6M8HQ24Y65
'SP27JGYKJD4V1K6Z1H2TERBRA62JB6D4EG7HR1Y76
'SP1JEHR070D530BHAN5Z0EDDB7WZDP1WNNYQ2TMF8
'SP25SHMBVVV74WM0C166A4JK7GJS3752A5P8243J0
'SP4SKG8JP1TSHEKSP7W8DRWD2VZC4AWZ8YJ40HTG
'SP3AXPPKT5Y7CPJNGJGHQ7DT9EKYJ6MKJPSDZFZ2X
'SP3A6C6Q8KZ8DGKY66JY132BXWK9H1T28HBYN3D0R
'SP1R4MNE4F8DVZ2933MVGYSP9QD9F3D1EP7WNXQTK
))
(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))
)
)