;; 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 holders (list
'SP166Y3Q445XBHGX4WAJNFH90QDZ5F2QG96KJWA8B
'SP16M36PRBRT1BK0HYMCDWEVG6XTY5WK345CZYQ6V
'SP16NWVZETSFCAAWRJCQMV5WZZ6X5E64F9KA0EEDZ
'SP16WTBTYXXNCDM0XKJAN4FQ97SR3P6RA97R5XPB1
'SP180BMQ04G5NHKMTC2GENHEMJMFK4KQ5KENHZ53
'SP191XBB3YSB93R9HXRSMM6YP47CCHRFT4GTRZQEH
'SP1KJZJFT288BK1C8G5YXRZ17WFPB06N8K5TP6TXH
'SP1MBGJB68RKT4K442YSTB3WSQHYNF225K0R3H7CH
'SP1N0NCT51N31AKNSBFVCF5MMYWAJDYRXWDX1422J
'SP1NHR1FGSZCP8MSY6J1Q1FMCKE34PMVRCAYTHCTS
'SP1NK86C8N2WH098GN18RYHVBABNQTY34YT32G5QQ
'SP1Q3H902DXTEABMEAQ8T7QVHD6TMM934FGA7MRY8
'SP1VBQ31D2T67PAJJA2XZSB6R2T911J5N11AP8MCR
'SP17KYWCE38C81K43ESJ0R0REC2GTKZVJK927AQH0
'SP225X4BJEXR23AJ311NXWKWREGR2XB49QBTD02WW
'SP238A061K7A8X4SPJXZJ8S2W8BC0ZGCJFWQW2C2
'SP27D2PH9ZYCHPXQ9GYGT9X46PC92H2DH5SWV392D
'SP27NQFTFXVHWG5BK6V8GQMC77MAKS5Z1SH2J5RKP
'SP28MYSR3JYHYS0P250HB8VK6103240N9CY3JN980
'SP2E3DNHPVJH045SSMFYN1DW7ZWGKYZBZZQPG6V1P
'SP2G9AFSSMAK1S8PSCQTX19M40ENWFV4HZDDT7TYH
'SP2GBJG5RETYYCQ68NKJZAY7YMNR075BYZHJMBXDX
'SP2M08Q3V2ADTYZWWH7GN4ZVW0PTQM9MDQ1GKFSQT
'SP2MJ52EQX0HRWZXVEWZZS8W19KA1WZWCT8XR7NJK
'SP2PD3QBD8DKAB1B9TWQMBVK5XH29XTGQ548V1WCE
'SP2SQ6VCBSSPCNTAZA0SDMD8AR8RF8V2RBN02BG21
'SP2TFZ0JX8YGXNB5CS6949ZCGQFP9VSJMBJKJ33VC
'SPF628CZHVHT1R5ECM2VGF1RSRX39WV1532GP8Y9
'SP2V7W6VYHNDSDRRDX088B3H48KH1MV3TQH00ZTHH
'SP2WTF589V34J2EMPGM00KEGBGARTG09M9D6ZD95R
'SP31WX6NZMZKHF4RPSR624BVZ62KG0CJ33BR6SRCY
'SP32CRYFP7YT0RJV3VVPW25XJ6SKHM0XDKA91S2XG
'SP32ZHGWDV2ZRTDCJ08EVF9WSNED529HZV9GQVCAM
'SP359R5TBG8V5N7FCJNP8C0ED74ZBJWD2DC3QRZRN
'SP3CNQCDP8A5CEA87JHXDC1T9BDYG747PHN4YGCD7
'SP3GWJDFTFY7QRDXNCYDR469RYRM4FKZQ87NQS815
'SP3R7JHWZNMRX4NG19QZ91SWZA4MF8HJD04131KXJ
'SP3SED3MDQ9VYYZPVGBMEJ53S63FRF9MB9HS1FF6V
'SP3VJGBB99FMFJKKJB2D8P5CQYH165HZA2RFKMPEK
'SP3WC7TCFBPVZDARCDTSZB5NV5C73E643S03SM9R9
'SP3WSDANWP24XMQE1CVSY1MJM8GMQQ5T3H5Q0FMA1
'SP3ZS78YTT8N5NJQPX7M50K1R57W764MX5T47S0XY
'SP5X04FCN1G5Y4GTEM0JY6QFKQTCAF47E9Z8J58G
'SP76AS2D8FJPA9VK115JC48MNS01JS7YZMD2FMCP
'SPCYN7662K6R761J6GSB7G8EHT5DTAYRXK43Z9ZP
'SPEAKNCQF9B1BXPNDR24RYFH1Z6PHBYNBEXH4D72
'SPEV669P28Q25QXD4FK6989WPECST50HRBDR37J1
'SPNBKB0ZMQJGDWJ4Y3KGMWPQZ9DY0G9Y4V3AW5Y6
'SPND17QV5KP2FBENTCBDN3W8B55PNJMCHQDGK0D8
'SPQW4YEMJXJJ55XSRKP4EH2RKNZM0HM1P4TEG6YF
'SP2A5ZWG17H9FVKF02JFH1SD4CS222VR2WZ7ZRWS3
'SPZZDFGRADAM0B3YNYMHW7Y9NAYJPWH9E18SRAJZ
'SP32FWX642CY86YRJG9X6BN5QKF46PGBSRX2RJC4X
'SP3G4E4XXDFNSGVSPES2CJ1J1RSSQMGR77KZ422YH
'SP3JW7CH7K8B03P1G4YKZABRJ5KK1CN6DVMQYW0F7
'SP219G4RNY1T22S4ND4CA1A3D2CSE89GRSNC1DW8V
'SP2D2MYH0DA633Z7Q9DH9NB2C43P4DQ49A7Z8BSWH
'SP3ZHVC376YKEDMVXYP3RFF583C3HKJG4C36P4MFS
'SP3XF7DW9K4R0E23BKF9244TEJJM3DN5WWV5CW2Z2
'SP1501KK51HK431S26R0ZYZD06V38H4S41D77V6B2
'SP12TY5EC7B94EWQ1PSKXRAMKQVGK9ZVE0R2V12PD
'SP0A9K0J7W9TNY6WW5J69ATH784E21Z4XCAG19AJ
'SP1VWTB462SXBH4E8WEAEVFEJN7XTGSR0QS7PYXMN
'SPKAVBJDHGE1B334GQY7NX74PG3ZH7SM1NZXNCTX
'SP1V6HRCT3TGQY009FXVBG38KQ4P1BDWTZTRJ9ZCQ
'SP3Q9PX4WE6KSB09WZ6TCKK4R17ZGS1Z1YN6PFDH7
'SP3GZYDAT52VPQBAQVE6Z2KDHNG0X9RQR88JYFPS4
'SP1NHW1TTW8VFV5HSY4WBGQ8YSMW67VAM1VVKXN4B
'SP108HZME3GMMWVWHH7C64AKD2236EJBM9XTYEMZG
'SP160WCNCHWWZ58SF0X1Q7352F8H4333Z1E78DW6M
'SP2PP8FY6SR9QPJQCFA8TE8HRGGM31BM7837PZRF1
'SP2M2R968GVJJ6VGRJGPW80VVB7HQJENZXTET0KBP
'SP2DEK2CZJ63NJ9T62FW7Z7DEGCA04KN9TJEHD67F
'SP383MP5H2ES0NERAW9QMRTEJGHZ73X9S8A19W4RE
'SP2S5A29H2QXYGG89511CGZP574M57CH58MH4TZ5E
'SPTJ05EVV911D498G5TZZS14M129EDCACWFS3DEW
'SP1BDQN6533R87TJB9RQ5R18RGBQSR42B40QAEY3
'SP12C37DW3GE6JFW1M85B90ZVN0JV9M0XFZVB6K74
'SP22SH76DDS9J1WVP7CP86NA6QNYFW1NA65TG365H
'SP1D76X7DKTNEFCSXTP29F1M5MQVGXGPQ80VGPWV1
'SPYS2VWA4306ASCEYR03Q785X2YENQB1BGF6Y8DF
'SP42BFRNMBRVJ8F0SF941XP0NP0Y6964YN6C40TR
'SP7XKRYGR7Y7CRM9KBY5T195PQ2G8RS2MPTYQTX8
'SP1V4ETDWXK8NN86QRHXP59WCQWJKCTF206KNC9EZ
'SPXV28X43M0K4SBHVPY5R80E54MTKAHAZHQAB54M
'SP6NNDN41289B771YSN8GKB21WNH6FEZAMVQNXYY
'SP2EY0KYHBS5ECCV0Y88894ACP8639NCK71YZJ871
'SPQ6S56JMVF48ENB6XFNV5Y1DAS00SZ61MNXG21D
'SP2YRWXRG14GWV8DRST1G36ZFQT2PBFQ2ECP16BJ0
'SP3X1VFWVNYWVE0EM7G29Z8FDT0REPG67M787ZKJR
'SP1QPR94TSB8245499CJ153AQJGSS0GFHMF47PPC
'SP2HSAFEY5HK6NV6R2P2BTJZSWVJB1W0D6TTR1BJK
'SPE79WNR1QX2CPNQAJWD02D7NK68D0GRYWSZHT02
'SPA7PJWFKPPYQ2BDPCXAG0WB9C52G06B2Q50QDJ5
'SP22HZXFSK1SZ3R471JK8F5TKBZ0QN89P65JXVXA4
'SP3XCV5CBREEB3660ABWED4FJ8AJBJ40KX06YEB23
'SP2KD79FKDGDM8K9HRBG26YC6MNAD3EFM7A6A9ZM1
'SP38W3MG1G36H9JMP9VJSRH06B7VDRKRAP65EANJ7
'SP33506QDHEW6NK09CCG67NYNXKF8EFQNDEW2GXQB
'SP1CFNZN0NCPNQWNCXMGBW35T5E3B9MJAH1SQ454J
'SP35WF2YWVBXE6F0SJZXA6GSP0HTVY14D4N74Q8CP
'SP2HQK4MNY11TSQCTYE5RFPYBVG4MD160956Z6F3N
'SP18X2VDYCB351JQQ2RA01S7MS318E42MSDYMSMYX
'SP16FHQ8KD21YAFZZ33QFAQZNME5GSZ4E02FB6G01
'SPCR6AMSS554N3TPF43QTHJQ6KXK5XSSQJ416FEP
'SPBK6YC9AEAPSK4FTMFJM6H95TBD4237V9XYBKY8
'SP38JW5NX0EPPQAGCAACFZPNXVCTJPEJ81CRXR9RF
'SP2PXM5SAHTCZ7P9EM2N58213JQNEN6F67BA2FC3S
'SP2EGFDK5A2PP30YRX5SR2EAR9F6RFDM407S6FJK3
'SPDZD1JQNQQS5SFWQCYEGJ00TY8EJG74M9A5BYB0
'SPCJ0FHPQ6SQV9JKHE4Z0TMCH3FE26FD3KQDZS4V
'SP30WE8NRFAFFWX6BZ25EE5R8VBWXD01H2ZN4HV8E
'SP1CJD5TWN6GXSGRRNSF1SRYGF02DG682WHXXJVT1
'SP1M5DDJ48F4DCR29FJY078K9ZTK69NSMFJ5A451J
'SP1BBWNR5ND5XFZH1JW15SXSTKBV3YKCZB53DNM8W
'SP32PYMRSFCPRVP6KJ9YZMQG5XYXMD2KQNM98BBSH
'SP3MXEJDFBPQV0AHCWTA9QCGQE2PC7ZNZVCFK5W3X
'SP164S279A1RR17SFBRXBS5G247CT1YNAP173ZDF9
'SP23Y53DM7D1NH9XFP86D5ADDGKRWKBTMEVXX4SNS
'SP8ERH75FP56KYMD89TZ0P3H189NFVK3J41E8GHD
'SP37A167VW9D6AGN3E7B6B8WRXW505S0FNAPDA785
'SP1KPDH86AWT9TQQ31G5JHEJ3WRV16S08ST71TVKA
'SPA5RH8C126V3MPFKFB14B5F0PGEZ3XTW67HK1FH
'SP1P7Y6XGQ1VQDJNQEM969ST5MMFFE3ZSCFWRGEZ5
'SP2S2AYBASR4PQ0DB0SS45KHJ89G8Z4P2GFRETEP4
'SP2B21583TT93X9VRW85MKZ10NXXHP5E5PKKRZ2S5
'SP1KAVQEF35H8F7DCCNWGJB81GCSCN473BBNVYR9
'SM9RZJ7MKS24RX0CXFQS9G6N9ES8T9HJ8KE0XCQW
'SP7DTTR30FX57K7W26RCTW1FPAV12DF3B04NBRWT
'SP1G2YHW23S05W7DFCYAKEXA1SPTEY5TDY8QZNZ5A
'SP1BSGAJRZD4W6VJWHCTRGJBRKRT6880FQX79JKJV
'SP35C6B3A46MVY8QBFMFFT3NXPHHGNCH4P57WASK5
'SP25JFQWEAJ7JFP542K0ZW27P6MPGAE05MKVM8ESV
'SP16RHET9DSJDNGG8417Z5A7KG62ZW1CZHY8HVBK6
'SP2GP1FQ7TPTTHJYCCJKE5C9MT2VXRN50KZ4MJ63N
'SP14MD8QBYWSQYP2ANTCJ40RBSEX6RX9P2FK5A8AK
'SPWKN3V7EPAD6HH09XHAST4NYWENVWY4ZFA1Y0YP
'SP1Z6N15JG33MPFSV1PXYTZBZXQ7H889HE84EWE93
'SP1PVRTEP7TWYPR0PZFQ8Q25266T4TSWV1EA6H8YD
'SP14CKWNSJ1YTPH87YJKP2FVRRJJ0SZ430JWWBD42
'SP21YYAXGWPEK24D4J6127944QM4HVS0AAT6C5TX2
'SP2QRDEVCNT7H0TXYTDCPYYHBEEX78CGQ0PX35ZVP
'SP9BNQ213349B8J476D20VZY8PQKCV7W6YF6DB53
'SP3VPM349ZESHGPGTFVCFKPBVN4YMK4FWF1CSBRCR
'SP1DG9Y27CGCZ5EZ43RB9ZQ1PFB2T4D63ZRGR1KBY
'SP3RVC285H3GDEDTTR0ACTKTSNRPVFPF3KEHRNSN4
'SP1H55FD59A5D7FJG2CV3AAJD9YK8X9D85FA1WX3R
'SPEEKM41M4J3EFB6P44ZR2CCPT43N8137BEDBXN6
'SP375GH89FZ3BD01TZZEVTAKWCQP8BWW6G8VDN982
'SP3ESM7WKBDMBZ15PSNX1KWV414DH67G6PGMEBK8H
'SPSNA5R5GG45RAWX343QF9NAS0MPZRG0WTY05NHT
'SP1S974FS9P7FZ2YN2W5DM7H2T1MXKBAKE8G6PRSP
'SP1F65AVHS95ZJFH7NR2HV8NT1WP4ECBY90HKHPC0
'SM3XWZ6ESYX9KBC9T202ZX8QGFNWP6J3696HNCWF7
'SP2P80JEZSZSAVQBNNE7379XP84ET8EZY1CQSN397
'SPHWQBXQAMZYM5EHX4QGCSCKAGXCRJCM572ZNYAK
'SP17TH2Z6JRAQMAMX80BF0EH0JHRS951YN51BZ9S8
'SP15CQ5E0Z6Y9PV2YJ0C7YSDWC6E2516VXVWPX7TR
'SPYJ2XHR5HN4FCY0R3WQY3Z6TTKMVK7AFJXMFKP4
'SP1R46Y16CJQHQ515XGX0XEHW33EBE8JCPJQ5G92R
'SPYKE0BJZ7KKCR2WHJF66CQRDCH100PCTS5QC36Z
'SP2MMH2FB6V2QWX3DWQH2G3W598T7HVRJ2G1TM3V4
'SP3EXHKFZFR82BBJCW1QJY0RAQ29KBHV88AYAJNE7
'SP1B3PZ308BJRWH1QSRYT7GAG1QTY1HGKD0SESYJW
'SPY5MEW1FZHX3EQGEVTVRJS5ARJRKSFMZ0PH4ZCY
'SP2JC40TZ0CNY26WFN9FGR1RS5HVH2JXFR1H87CKF
'SP2HXFQVSP5JQH6MSWKYWCZM3FPRCDFCD014PJN7C
'SP2HRZ9W6PAEFH755MPDK664SAFC40W65JWWTY93W
'SP29NE9Z7K8SVCEYSWGFN66SH92EQTHJXX9E97B72
'SP129SXKETWEF24CFQBPHKSN96ST6EV7D519HZGFF
'SP303PN90SWX0QMKGV3J1WQGSMHJAXXH99KRNNMDK
'SP2H05MWC9RA3P3CV2VG7H68VATJZZ78J1H6P0MQ9
'SPF096ZT1GW79DPDV00HTK2SKCVNVMT39P4ZG38X
'SPK0SG3ZRVG0FPAFJBBDWJYEC52VVAH43AEG0WZH
'SPF0V8KWBS70F0WDKTMY65B3G591NN52PTHHN51D
'SPM4JKECG23CJGXC93BDXX7579WVH5NR7E2XVC5H
'SP35MEYYBHSFCFXY296YGP7NAT6Y4XBJW2VETR8AV
'SP1NDDW6D3AH9R35SDP3AQC33CE9VXZ63WNVWVCWC
'SPKJXWNJE2TPE5XXFZK0W9JBJ6YYAKG6BFPWC6HP
'SP1KQYW4R64DZ6K5VA72M6NZ3BS8XNXQV67VP631P
'SPG8E2PXF8PAYKZ5QX6FB03NNMXPDDB5880K3RJE
'SP2EG6PJXFJ1BAD7XX5AJ69N9KYDSXCQSJV6Y58PX
'SP1A63MR3VMRTKX8DW7FK55ZHWXEZCVRZBBEPK2AN
'SP2DQ1GZKXMXG4B6BYGA20QQEQ7N0YS9CJ5RF7DJP
'SP1A2XFKZ9KG3Y9SSJK7WMJFJM7RA71M5AR1V5GB
'SP2DR646H6RMWKWPZGF50XDR3C2ZN42C3872V28GB
'SP2DQQMDMTQ2NHE4NMMH2RNSBH7Z2E4AZT2YM691A
'SPDNWHG74P8CS4VPGQ32502M02Z518GCD1BWWRM4
'SPW2XE9MFKG13WJNBM2GHYY46MT352K8DBB8H2H7
'SP2D7PG71J84XGRCKAWC3ZDHZ2R80QN4SHZN2DY5B
'SP2B1PS860593Z4716AK7NZ09M7JQE8WB3WFN30PD
'SPCTYQPCXDB9DHVMV16PBMZ2VHM5KS9JGK2YAXNF
'SP3KF7Y9P26SHJRE8ANF8PPNDTYHKTRYD21AZJKKF
'SP2BBNE571FZ0CP8YH4WW8S2XPKYKD09VM5GDK2GC
'SPC6DST8JYA0SG5948PTJ691VTJRJ1AFQDW654Z9
'SPD0TG6WT7FYRQ7GH8Q6Y4HJK6FVECQZAV3QMAH8
'SPZ66NB8WD1JFBJDYSEADKMF3ZRWP7302F6A0ZY2
'SP3VMTA44MSFR0K6EWKX7E18BKD41WANCC41BMJAC
'SP3W42AA4NS8MJZDM4AWFEC1VR7KDVC1ACHNNG4AF
'SPVFN2Q79BNQ28TKAA7VC2G3SK9KF9VB84YPTWM1
))
(define-public (burn-mint)
(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? .zwstx set-approved-contract (as-contract tx-sender) true))
(try! (contract-call? .zwstx-v1 set-approved-contract (as-contract tx-sender) true))
(try! (contract-call? .zwstx-v1-2-1 set-approved-contract (as-contract tx-sender) true))
(try! (contract-call? .zwstx-v2-0 set-approved-contract (as-contract tx-sender) true))
;; burn/mint v2 to v3
(try! (fold check-err (map consolidate-wstx-lambda holders) (ok true)))
;; disable access
(try! (contract-call? .zwstx set-approved-contract (as-contract tx-sender) false))
(try! (contract-call? .zwstx-v1 set-approved-contract (as-contract tx-sender) false))
(try! (contract-call? .zwstx-v1-2-1 set-approved-contract (as-contract tx-sender) false))
(try! (contract-call? .zwstx-v2-0 set-approved-contract (as-contract tx-sender) false))
(var-set executed-burn-mint true)
(ok true)
)
)
(define-private (consolidate-wstx-lambda (account principal))
(consolidate-wstx-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-wstx-balance-to-v3 (account principal))
(let (
;; burns old balances and mints to the latest version
(v0-balance (unwrap-panic (contract-call? .zwstx get-principal-balance account)))
(v1-balance (unwrap-panic (contract-call? .zwstx-v1 get-principal-balance account)))
(v2-balance (unwrap-panic (contract-call? .zwstx-v1-2-1 get-principal-balance account)))
)
(if (> v0-balance u0)
(begin
(try! (contract-call? .zwstx burn v0-balance account))
(try! (contract-call? .zwstx-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? .zwstx-v1 burn v1-balance account))
(try! (contract-call? .zwstx-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? .zwstx-v1-2-1 burn v2-balance account))
(try! (contract-call? .zwstx-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))
)
)