;; 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
'SP1X8V5C0AFSN37BV0PHCE8FC3D9MCVD4A9ERSTWJ
'SP1PNZ536D15EKBFYWZ64A9BXTZ5QAZTGTRKN12BW
'SP37T58KZ5M8WD7A94M8EREJ3V92KDXTCGC16B8JX
'SPXSEQCRDVG2ZYG3AGCVHJ85TRY9547RS2TZZE82
'SPRAVSKVRJM3D42R462E8QSBDBJKTQQPMVQGB4PV
'SP5WSJ87YN38MYY3EPXT38FY502FC885SMSNJ2G0
'SP20DD4H24EE6PF77YKZXM5N2P54105BPY073QFT7
'SP1ESHCAMQ1ENPXNXH1J3SK76WDE8YQF3NNK5J1D6
'SP1H25KZJH9BSQR1WHH1HKZPE0TYNN9HWRQZTXA1
'SP1YJK4CXRHXN76KZHK619SV0NG8AT9E582GF01D8
'SP256W5CZ649T316REA29NR3H5ZK6ACA160CYF2XT
'SP3DJ3H9CW9K4X4GWKRQD3XJHM3KN9TCW1R44QN86
'SP3DXPAJJ7GFMT388BD4YFQ2R676G3VPBT3XP33PW
'SP3JC8QHJP32CYMNYS8Q5V7TZGCNP24S5RDHJR6A7
'SPDPT02ZAQ8JVYPB8G9FGK0KG31H5GC9DVXJA9TV
'SP11HP6JWVH61F64RR39B33TYPG82VATXTFX20YSJ
'SPDSJJTKWHKDFET9FDKX7SJNJWP9WFBGC56YM2BP
'SP3N0EWENE3JF8BFSQJ7QGJJW9J61ES441HMBGJ0P
'SP1PNA1ASP66W6Y0C5Q94AX5HY9TM3FBAHM681VKX
'SP10FVY8H3ZHKPERY1DYZNF0XNM1P7J8F1RAH70QD
'SP2DGW4MY9HDTR5HZJ5KWT0TBVNQXVWCPFR4PGJYR
'SP3GSS4YT15N5P4S6BJSDPGPG35GZZW1T5KR0BW1Z
'SP26ZFFW07NSZ9ZPG1R5CWGW085JBT9YPB6QFY92J
'SP14WBKJSVG9QN72XAJHTDC2DFSTG3D6J6X3VVR6B
'SP3A0ENV1N73PC66CGREFRVQTP5SVYS48382XFZEN
'SP44DQQ3HQJSE0W8CBGBJGGE03MF41CENGR0HHTM
'SP1Z034T84KTK5CYHWV7WC3VCR1JY8CB46H4SQ9VC
'SP3QMGZJPKDAH730BJX6MKJJZABZKEHBNZ7D0KSA6
'SP3ASJ1Z2BB5AJ0BEN3GDRFPN58QGVAYJG04YYJCV
'SP2HMJC22B41J1CXXPMKJGW0GV3PWF9X0WN5ETW0E
'SPAW24XNM2A186XJD00KE6R1J5TG4YD6K8AG9NMW
'SP31VD9ZBK2ZPE822YMJ64VZBFCFH6N104P9CGS9
'SP2SA9PKXCA39VDF8P8YX9V32QY96QZ46E344SYNA
'SP29GBB1NBFETVTSQ6PBKB5NXVBFWY024WATRT10C
'SP1Q3ZXNZFWZJXM21N7MWJX5GH0XT4FD8PS11WK3H
'SP3GV3B13SRA6WERYPAR2CNGN1XSQHYYR45RH28J0
'SP3KAKNMTVQMWE13H9BKA8H2FSET4YJA71X3B6JAP
'SP35BDHZDASEXWVPQT3C0QQYDH1SWPG3D7BZ4F4N7
'SP1RJAE8P0Y6CSWX4M67M2KMSC4GV33B84FC20SF
'SPNRF9KBD5JNKRHFMMXR33HT5X9T4CZXE4DPSQX2
'SP1RY7R7MJ3XPSEJ4PB76E8W7708AKVV7T6DGXX76
'SPKC25JRJF43Y3B9K9E9JC1KMBBKDT777S5YMDV7
'SP1HYG9BK5H1KK26674CVRXM8YJ7QGAJ2EWTWSWQB
'SP280EC840VCAQ48P3SN3GWBA0R3AVDFT1YSKRHT4
'SP15X00CKRY2TCVZMQRYC1NRHQYFR9MMQM4RNBAJV
'SP1CX1D0DHRJ8M807M4A0W73DJ3P7KTE0K9EYQ0ME
'SP1EW7WJRTYBR1X909P0ZMTXAZMQ03J93BA4AXH96
'SP1ZXGTSZGYGEFJ5P0V9ZWFQ579AY6GWWW6QTZ4VE
'SP1FYABRDQTNJYZZP19MZQ9V2MDCGF3DJ0CBFGTSF
'SP42P53DT52HZM6GGYQCTG8X81R1FV361Z0RX9G3
'SPSGPGCK1BEM5X1E82WK7EBN1BHGBAX0CDZ053G9
'SP27MF3MFSAAKP4J8V316JZ62M3X9628DVP138J5A
'SP2333SSV9J94CCKF76AC77D60BRV7Z05S0D4JJZ4
'SP3APKS5V8BYEP1FFE7HYETM6K74KAS2R7KCYQTKV
'SP26AS555K99147PW7BKKN2D03WXCMHRC657RYF4P
'SP10WY3PYT635T91C98X17DVH6GC3G98YMSA5FBH4
'SP14KXJG580E3J21XBQFSHSK5PWME6XRP5CP2GEFY
'SP2RY81F7C7HF8QATWZA346J3W706EW1AJ340X1AD
'SP2ZY1E7R3SRQZ3M4Y2PZVKCN7J93NYJAS6REMPBM
'SP29Y0RSEV1BFA9J2NXN9KBVD9FQ6K67E5S4P499S
'SP2TWAN6GS0RG0329GGBXEH691ZCNDFCD0EVWJBVV
'SP2VFW0X5G9H4WA84T6M4ZPAS8M3Q4A5MFVHM71BM
'SP88R5N6BHGH9SYHAQ4AEEFQ58BDF9ZYXN93FTJA
'SP2AYX9FE0JKGE6TGFJNPJ2MWD380TX60MDW9R0ZC
'SP3DT37PHEYTAZ02JACRD8DVX9BWEED4ACXAK96P4
'SP2M5GKFET8EWWN8H0FWETVTXK46DNFCVMGDCK889
'SP2M2WYEFYR0VBA9BQRP847PFRRKK9Z4DXFJXND9Z
'SP37Z1VJFGZHPME22RKHBVTAAMKEDS4EMVRZ0WW7E
'SP3N5D0W6RA5TPNHKMX5PXY76H0KXCG92F50WCDMB
'SPT77KK4S527SK5HAC9M7QJX32X92QKNABS03G37
'SP2AAEQE4342EDRM5T4FTRN9DGWF9RFSH2EVCH1JB
'SP2PS9JBJ37NRHVMSDWDH47T4NMWVSWHRX19M4H2F
'SPSCMHXABE4VF0CM444FPG785QNVDWZJAV333AKP
'SP2A21HTEWS8ZNW2NCBV6QPF9HS2PEJ9VR2CFN3WZ
'SP36C1ZR47KKDEQ6MENTA71DAQRGTPK4AX3YW4CHF
'SP2130Y9Z52HFQJCV0MFVVHW6VG8EXTQ2JYX0H646
'SPA00X1H9WQ0K5MKEZ3P5W52KQ1F1ZH5M1SJ0QSY
'SP1D6TCPT97P481NDTRNWEMET9PN4DH84B58BD452
'SP12VKQPNTB29ME5WKP8HXE9655XSE87TFSTZGKN6
'SP1ZYR2GHFX2B05VT0DAHDAS8HV5N56MYM4AEK1RH
'SPCDMH50NVPR5VQ8WMA87ZQQ2R6F4WK42T55CTJ2
'SP2ZWNX7D8XQSQ72KV8KP2ZD9RDEGMC5AVSV649Y0
'SP1FNHJVFEHHNMT060JXNA09Z4HPMCEFJXQS31QQZ
'SP312V4XCMT3QGAZKXE2JXY2SHVT32KC8FT2PHJPP
'SP1STG9SCJG7TQQ88W2W8MCRDDTC8G51BBR6SGNV3
'SP3244MN1R8FDBAWZVXWABWDAXPC2ZR4G7VF2NER8
'SP2KG86D7B16APP0YQ0B0HYKFSCZ077AN94CWM2K0
'SPA1VC35KAV5W3AZ3BH4A5PXK4VZYH1R2VZVG09Y
'SP3NXDHCCBM5MZAKSBY73R7HGP2FZQHRFETX8T9E2
'SP2MJVY28Y1PPE0DMV2ET8SE2H6XB6Z9VVPB3606W
'SP3N28CS9Y10HMKM7XKX9GB7XVYQ4RRH0QPK5ZGBZ
'SP28MYSR3JYHYS0P250HB8VK6103240N9CY3JN980
'SP3537KWQ3GJ00SSN1ZEJ55T5YMHJ33SXS6J6BZEB
'SP22WJX4DJD2307FJNZ3N0JN69NYE72Z2XJTHM1WA
'SP25TB7WZPKQB9B60SFR24JBYW88F6KTDTPX95D02
'SP101P8MTT5ZQT76PDK0B7X8DD9HKH43321ZM513G
'SP1RMGE16NRZB30TVSEMP7T184FRQVQ7GCCFKQTD4
'SP306G8J3RWV7M9TSHQARAX28NQYZZ12T8QDA3XPZ
'SP3XENWDFS7MWRTR196JDW4GZHV6S6GP2V9TE9FE0
'SP2A8DFWF9WPJ8TNXXHEMTRTMBHPAJFDNWDT55RPX
'SP22C082E14Y697RTC1WFN3QKH07Y78VH4YZ3RRN8
'SP38EHRFJVKPHGCAP0SS66B9CVC6GB261N64YXZYQ
'SP329V3YCY8AYSBHYHQE5KYD0NWNKZ27E8Q58G313
'SPZWD6DFGM46NDWJSTJS9Q5PN1AA6CV8HZEQV5GC
'SP2C3T4K9H3Z3YT2DK4SW24Z62KJQPS5WVDVKTTEV
'SP2AZW5483XGNY9M8HMX4ZYTB82GJ749XDQ1VWMC5
'SP35YZH8658SEF1DB98YJKS9S7YA8FF01HG0TCP17
'SP1WHKQFA8R7WMTVQA970TD6CFN91Q3D7XN95R8N2
'SP16GS3Y6C2PVFCE4NYD2PTGPVF2ZE716E350040W
'SP34PS58KM6499FNAD5NVH3PWRGJDS0ZY8D3RYWRN
'SPW9J82WPRPHGNXGPH65Y0KVGG22E9T9G4TV20PG
'SP39B4B4Y00X3BCV1HAG8D1CM4BKSHEKTD078ZMQY
'SPJ1R85XPSYHMCMRBNRAMZ5WCD6HDGN7JCXDHWF7
'SP3W80R1M84BJWGNPNY0PGH92KXH4A0D93ER9YACM
'SP8T42AWRNCQPMSBQN276SHAPB2WT44FPQA6QMHR
'SPEPMTKR6ZEDCV17RC7F9HEKRE9JKHK92QD5C8XQ
'SPT6A1ZY975ZD0TW5SP128WQWTQNVM4ZC856KZQ2
'SP235P7K01RM45M5NTJS6SVAEPRVF049VVSN6DHTW
'SPCCXA6F61STMYXT4NX6GN0YJHJH6M637KA0MKAP
'SP37PV9AMB74BQS7V4C930SM9FFGG84SPFGWDMMF2
'SP33QY8M0QQXZKV2AHKY3KJFY5WK16CPK5XJ49F52
'SP1PGHCG4VV9W5F1A6MWYK6D02J0G21CTWKPS18ZG
'SP2X674EGGN554GMD6HPKHC19AF48NN0VH944X6GC
'SP3VFPYHXS889Y6ZX4VKWXC1CB5VTRK4ABJXN0JSW
'SP8NR21S2JNZ5R2QFNW04ZQ09CX6G1W94ZPRAMZ4
'SP1HA3F86WDFQQ0JQKDD2YWZXV94EKXGW7WGEA41Q
'SP2NJ4DABZMBGTW7YS85S2KZP5CAEW7CF0WRGZVPF
'SPK3PK7BQETDVF8EZ2P3BK3MWDAT5JKS6VFMYV1B
'SP27G8MQ9R0DDE3ESVF2N034YZG6QD71YAXZRD13J
'SP3ZSN26GJPF7HQ9SMA6S79W5NK28MG670K6BJ2F2
'SP33VPEVVPZTNMEE81N6F7C9T73BM3VSJMA05EWCS
'SP3D9J0QYK9V9F16XBBNWSMHV90DFJRNWW2DN6M8Z
'SPGABGKD7PJKGSHQSW75FS3804DGP7X6WJFGHYDK
'SP1XMMFS8PQGRBD7YPFZ6CGHREZYVW4TJVV5FEJ2A
'SPQHNRJQEJFPPQVY259J765XMZ5831X2DDHB0R12
'SP1A0T49CAVT2Q2WS3NJQWJXRR47GG2XMZ2Q2XK7F
'SP36FRJSNZFC0ZQK3CXV66HK9GGT3962HPWZY7GHQ
'SP39RF23607FNN6J373FDRPSYARAA514W9RKVGMZJ
'SP3JYM3XZHBBPM4T1GPAQBM2MY0T0Z9BS72F4J2NX
'SPYSZVD0PBQDB4TPTPCCD3VFP9576E65HSNAVS7G
'SP1EGGC6HP81QVXMNVAW653BBVG9P02Q0TKMP2BAJ
'SP33RH8633CG35RJP1RVG7VT56XMQE1XZCGZB2XD7
'SP3977K7V6CN7XPT7TSSZZ4B08W7JWKVCP0Y17M3J
'SP31C762CDZ76SKHVNEKA6M7M8E0CBNPETMERSNQ5
'SP1QY7NPBVTAY3QRTG33FGZTPNAVP35FFH55C98JB
'SP1MP1CXC5EPZJV2BPCWQK1W5B5AKQKWE764JZ3B5
'SP38YXD4Y761ZZ64V9ZJ03Y5CEYEYH745WDKZQP54
'SP1R9477WRDPQB0ADJ63REA2P7ZHVJ3V5T0KTN145
'SPQYVK4EXX4CC979D22TAQPR12Y9J0GS4676HG8N
'SP3NG5RS721RVVV425KW0YZYQNS9TR9373GVA25HV
'SP2GP1FQ7TPTTHJYCCJKE5C9MT2VXRN50KZ4MJ63N
'SP2T2K31RJ529V0JB9754P0R297YZJGGPBED2D318
'SP36A2KPTNNB0KXM7SVKEYM3F4EKFXZENTDC9KM15
'SP1R4B8KKZXEZCZ21MWMJ5XJBTAN4PMBVACWHZ3AN
'SP2XCT5BAMVJG6M9NPRYEPS33S04SWD4E9DTC4EY9
'SPW0AB3D0GEFM1FJSN579BW7NKJYQQDZ4F8M6VY5
'SP1BQBW16Y1PY48M0F5JFWP46076TK7TH5XTSC6Z7
'SP3WAWNPW2KQMS7G9ER8ME9RVREG1WC10T2SVHM3S
'SP1ED2H5ENVTRW8NG3BQ47V3M4W14G71WH4YASD5B
'SP12QAAEH4R5Z9YBPAXG7FBXATDK0AVMCHAKB9AQM
'SP1ZWB0MJ6CV92WD4WA5X9YWBXZHF6C5T9ETT5B28
'SP34XZ8FJXP40G7R6VQETGY8KWSXF1GE5NTJB78Y7
'SP1NR11A1GA4NXFNXCJ7B09SQ0V3NDX7CZX2Z4SED
'SP2S2K2R4PWFVQQE0CZP32W264ZQS3E18ZQ57WF1R
'SPH3X54MB56RGF917CK0T7SZM8E9SS1GY6RTCN14
'SP2P2F8P8GRNJ6T5H2BHQB059ANHTZ4P0SEG20ZG3
'SP2BP2B7B3HPNZGY7CMXCMWYQ8NYPY577ZFT063G4
'SP38MGVTC7T5W9K47TBPPFFWTNVN2MJXYAV22JQ2F
'SP30N96P7393MKPBJ2M93M5EVABVP77JY6EBDQXS7
'SP29JJVSD8BEVGZWH5TS0RYHZH4Q2DSAZNXPEGGFZ
'SP1QF33CQESD5K623HDG9CW19SBDRTW17N13WGXVR
'SP3K47Y6STKES195TV262H8ZKCFXB5DWF71MCWSDB
'SPRF1SSEE0GPYQKSQ3NB5W4YHS2KZNZ5AY27SVBE
'SP10ZA5HG5YNQC04H810BNYVDEASSDVDEYWHGMC4F
'SP113TQYRKXN2VJY69HYZ28CDBP83NFF8EAD4G4T8
'SP160PBH4Y013NBHG54DTMJF2JXJRBPDH3JN45RRK
'SP17ZP22NTM2VTQK866YM5PN9SQ3NW3SKZDT99GQM
'SP1T340N8AE2A93Y444TT2K0S2RPYVSW77ESTDQT8
'SP1VKFC3CTAFY30YK5C1BND57EFVCWQHCY4VVYHW9
'SP1YN7GXMSGEQMVXZMSHRC8YRGC6XDJK6B8NZ7ZAB
'SP1ZW56W69Y6WHE2Y7P3G5GSB3B9WZV0X1W467BKF
'SP23S4KHTBQADHS6Q0EQVHTC7Q9YRGBSD0F3X6QY
'SP24PT6J830JM5EP8VSQ0MBNSW4S8S2YB2D2XN781
'SP273X2J7BH660NQJ45N521KRHQ2V90EK3CM9873R
'SP27NFDCTV98JB4H4DQR6XZK7VA4ZJWM0EHFA46VB
'SP2BTWRQT4M8G058MQP2QXXBPHPB9TJBE0RA9XY5C
'SP2CGGTQ2M90YJ3P7RATTWMBZV6WMRF87XK0NBKTY
'SP2DQCM7K2QJ1NGH4FW0HQFGHCB492QS6EXPVHGPV
'SP2J22Q10P49C83AAZDCM7AFDV98DFV3TF2B1A0TF
'SP2T57JBFH3X9KB8K3R7GTSGPFA79P6W2BBPF5EP7
'SP3010F6GC7C14K9SX5TTRCKFEGVG1D5A3RYKT87W
'SP31C4H1AFMF3X3V59HED5750M8ZSQT0VZJ89KX5Z
'SP31JXEB7PKSTW69M8JWDBHH8JQRE5C179Z06K70X
'SP347VWZ452DTEEAKJNGQJBRDB662P09DT0X4YFBF
'SP3CWQEWH6P8JA5FS67TJAM6TGYTDY1GZGJPRQFYD
'SP3CYCSMGWGCTFYM7EWDBXVNZPJ0VF0CV9WFWPD6V
'SP3H7H4KMBVSH79KS31FZSPFQ6VCMZBSQF0QJ0NBF
'SP3MB3CSNMK68HYW60KVX9MB4QBKNMSZHYNGNPCCR
'SP3NW880NAT0N9K35Y0Y3MKE3F3HGKAS2AN2BF697
'SP3P2F02BKN8QV49FEDTGTYTQY7DMNATZDMARHZ80
))
(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))
)
)