;; 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
'SP1NEYZ0E1G4MXXA2GTPT2DRSQS2XCMEAE1YKKXMB
'SP339GS5B7JA1DFTVX3SH2VWXMP4QR8RM5KF4ZZA
'SP214QZXD1P53554BTC91FYW0DWKZ69S55KWBEP82
'SPSQXPJ1GRCNF98DFSYBZ0JE81M7NN51H460GKJA
'SP2QHDBJWZ0NB9KHS6787GAK4Z2X0FMJ1HPQB5QHW
'SP20G89G29YMM0B0ZRH711EXVWJDF9TBQG7S02D6N
'SPJYH7C2F7SJH13E5JB5T6HV21KY4BAYEKSF1AV3
'SPNF6V2Z7SZ6NXSPQK3R5SSR3BKCBWQ6E029VZG5
'SP19P51DNENYEM96PVNKSYNJE4Z5705ZJC08ZS007
'SPYF9PC72BSWS0DGA33FR24GCG81MG1Z96463H68
'SP15M881ED8JGZ5CAXTR6VM4FRH61C0SJQ3H9BAFR
'SP2J0Z0C54R721YQWPWYPJKK3RPRFV7HD1JFX92NY
'SP3A3MD8G3H40BA0TTFNVKSNSG0NG2TS5Q1H65381
'SP2ZVSN1650MDXT422V6CJZB68FAPSNR38395KJPN
'SP19P5STJ2R7XG3SYCNAVVT2QGVGN5A5QWS84CM9S
'SP14G080R1D0DS34FYJ2P2CMKNFBB0ZQNR7EBSPNS
'SP2ZD939NNAEVH4G4RVY74C0GT88NR36D52KD9GHB
'SP13K4Z88AVWRHXKMRPR744N8PDWSZR6M4YVHJ1HQ
'SP1KCBPWHQDQ9MQ8E7GPHS8A9GFYAZ2WRN2F5YC14
'SP286BG9TRMCGN5C5JF4A39H3PWQZ8AYZJTESZ1YP
'SP3PA54HNBV5XG0TKQJKJGQNMJAB3X61K1S6S1WXB
'SPNTNE8J95K1H69FW8PYZGRM8PXDE244GS8WX3NP
'SPF27EBBDHFVYGN0CFKEE6XG812XWYJ5V5R564CA
'SP3AADSP6PKZTJRCR6W9EKVV9P1E2T5X41R9G19AM
'SP3RYA48ZZA0XRPAQWA29VZK67ZVQXW9XM6C0PYW9
'SP13E39EXQAN0PKBR9MAFZ7HY1T71XB9YP5NBHPCV
'SP2CS6HTBN4SE149P8M82WM3A2MQA8HH8EFRDTTYJ
'SP3XE83R926A0X892VA30028K0TT06PSMC8YGWGXQ
'SP37Z1045DF6VR3W8AE0J4HC5KCBCBMQ4GSB5Y38X
'SP1YKRHH5M7G6NHYQ4FWX6M6QZ19H0S9FY1P91GS4
'SP1ZFAHDR6X14YN94PA8EF4MK1ZQCGDRHGXF64GA0
'SP2DG7NP284B52ZTQEY7B1SQFW56SA2FJ4BTTBYME
'SPPZTRYYGZWA7BY3YX6NSXFE87CWJE0FFVEXCQ9Y
'SP329XX3PSAB2WZZARW39K25B275B62A7WENEY4Y
'SPJQ95VN4R1539DYA6NKF7AEBNER153SF20608M7
'SPNQ4V8ZTRHSTRCG8JF2JRE57FMTKAYARYPZA0K
'SP2F6XA179WBAJ3HBZKHCPVXHY4YGNXWHTP0APARZ
'SP3JRHW6MESKE576TAF36DM3TXG6D9S6GZXHB37V1
'SP2VDM89W60BBQQ5100JGBH5GZ5P0578AD6B8MB47
'SP1R2DHP2TGMY0KR1EBQX6TYWT0Q1ABZ2HB4C049G
'SPMNKBFG1S3JT61S6834K5ZJWW1V8J262EA9PVTF
'SP1NM07V4FW2B5206E24VB07F9T3HFCYCCQRVBJ6Y
'SP1YM7WWHA02RYR14EN2E7720KZMWVCJRX9WQ3HX9
'SP21H3NM2YXRB88TACSAK7F5KAHSPQ79B6B87TXT2
'SP2BMZVJXG2QK31BBZVGBSQ1RFG6FK9VSSA9Z25G4
'SP378NAN3DT5Q6A4ZRQNX9ZX1FHTTYNHXD0VSH0T8
'SP3CXAR2VXWWCCGEQ94YKVVNPN6S74P3YC9XKHKDR
'SP3YYFF1K5W7AN0YT2ETS93YF1SPD004ASCWENKAQ
'SP1TXNDK4CH2SB794Z390G7P28WZ0S7JY9VWAAWBK
'SP1BEPTEAERHYHV333489Z5DGBJENF39T54DHPGE9
'SP19FPTFZMPTAJ3X4E91Y867MTEEY4TC8P193AJ1N
'SPR8KP1APHSY1C0VJ8ZJ8HW5SD9AQQCAFKF807ZY
'SP3ZC556G8MY761PSX6MTH3J9MR6T40DYDZZXPZK6
'SP11QZRK4RFQTT3166AT5PSHVY2VMZF5DH33PF7XN
'SP2QF6JS3328V0V04WVXSNPEH3A5362RJ8X6FED83
'SP3F9C08AG8HN8A5K6NSPGGC7X08AR0SSX1G78JF7
'SP3WG60S7VAXS92YW9GNQRV382BF0GHTFJ3EKN0Y6
'SP8X66091KM6A3EBYK6XVCHKA7H1S6YRXAHCM184
'SPZ6RE4H52X8MY6PF88YREAC27YWH8WA57K4YVX4
'SP3KQB7CZXS0JS3XV160W16Y8PTQ9YWR3M950FPN4
'SPJ6C9ESD3WEY5JHM0X5XB07R6FC4GWM4NHDG29
'SPVGHVMWEE5PE0PJPQ0XVKAGCM5VRVEMSYKB3VY3
'SP1GVEZNSMC5TNXDKCKP0XGXS0XQ717CYHDMNWR7Z
'SP1TC21ASZ57YQFC9THB85HSMDH6P1BNVPACWATRB
'SP30E6HTBK8DKSD9MCPJRT6BF9JEQTWHG4PN7JQK1
'SP4D369B7ZEVCC1PDCK589D4XE3NJFW2KC366N27
'SPCPXYYZEXDBKMQHYG6EG9PX59T19KP0H0RJSDT3
'SP1TQNKA0M6HD8R4FX2ZYP8C76ZN5PMQ5K4Z6QKZ
'SP25Q7GAHC5WEH53Z377PSKN5V3ECTATJVXWYHBE4
'SP1ZMBTA5PZMPP3ZGQ4PVAYJ8S10TJ4WZEKJ0DKN1
'SP1AHR7EQ1T6Y1GK757GSD4H4D6V75AV850C81SSA
'SP2049RXXFWEJ4NSSES011P6P9TKHNYGDHKSH5Y4G
'SP2WC3Y0F8MZNTE0QH642PGSND2HASEN7P9BR0WVZ
'SP2ZQ6W41ZK3FT2N07610VE0RAH3VV8AZTY1QB49A
'SP3ZKR29VHTM9MDKT9G1KRBC0A8ZDCDMH8P8Q98M2
'SP33JS3FEPHZ0254MX17SK863QE1MNTJHSEDY94RF
'SP1CNBB4H3XK5WNZWC6CDWWBT7M1N0ST8040VCP94
'SP1N4SN89EF1SHP2YZ6H533AKVWAEKGY6CXEN0P2Z
'SP1YNB324SGQWVFFCBRCMTYNFQZ5WSX9FKEY38SKX
'SP297X0KW3YZGMAHXWSFQ1XE48A4EPAZNH7Q8W7M9
'SPQVDJ7AQF4HHEXWW4HQJYX5QY37P3XMHKJTAYME
'SP1NGMS9Z48PRXFAG2MKBSP0PWERF07C0KV9SPJ66
'SP3KH9V4F1RXJY55DF1MYFSREAME9K7618EB5MRJ3
'SPY39PKY0A43777ZTVD2XH86PGFW3776DXMX16H1
'SPKPDKHT2TH732Q4FZCM3EBS5WFWAT96B5R258S7
'SP3P9XNPA8GQ2GH2BJ0P3DK71HS34WSD6TK59G3HR
'SPSWMG92KG6APQFFX8BEQBE2ZF29N9TWR5M7R56C
'SP3JMY85ZD5E8P8XQ0QVFE23RKDR3PSQJHK0CHHN8
'SP1RSHDPRBG36203VWCN4ECZAX9N6S23XFPCSGNN1
'SP1DKM1GC9T7W7RH2F4DX8EDVVQSH4JSX858ZK3DC
'SP1H5Z2WN165X46EQZ41EB9XXZ9KJ98S7CA1YP16G
'SP2C6WA81XA5XHBS60FZG2KKNHS9M4T5KQAMH2P4Y
'SP1T18VGPKQR2WBV7S7CWJN9GRBRFQW525YYVBDFS
'SP11EBWRDRHWHWBM8XMNTD45VM5Z41XM29TBV7ECD
'SP22NR9RBF1K6TJHXE71C9MJ3H79P38DT7MNBHFDH
'SP1J5PS54EC4M9WN7CVNFRP5J88DB9K0MS06PZ7R6
'SP38F139KNGWV4GNPJYGRFHM0MG4NKEJ97T7ZTT41
'SP1D4EWTP39DRRKNAAH3R5176ARFZKB08W53TJP1G
'SP36A4Y00NGQMBFF0X68VNBA23BRWNQSWNK63BKJ0
'SP2HJ5P67V0MKJA0BNW4AVGF166SK4MX8W6JK2XC
'SP29B6HXCE34H5JZNPK7RBJYW7M81HN7C48RJ3X0K
'SPTBEBSQAAA7PCGA15MWAW0KKHWDMK5KEY5SW3W8
'SPXNSDGSAFH5PR004RGRZT2FNPYBHWKSAESW7F76
'SP2EM5T1YJNVDRKXC4M7J1EJV9NTN84K9PN1ZS8GE
'SP2WC112DEJR44WVAX5A2WZ21VCTTVMY000AJKKYT
'SP2EZBRH2T5A4TPFFTDK48CHR0WG95YZZA4HC1TJE
'SP2NMG5CCPNE8T4CTSNE6NAGBNNSKQMZ71BY58FKN
'SP2SKNBT57ECBV5Q06QD0XEPWRXP6RXC3FEQABFH3
'SP1N4AD8N1HXNT2KFEFH3302JK504ZPGVERS6AC4J
'SP2DH0WAMJ13BGGRDVEVYKDXMDDKXJYX79305GY1K
'SP3TCNH1X2YSSC5KYE6B5N2PSN5T1BSPPBS235ZP9
'SPMVPNCFY0XQ5FS3N3WG52560FQ0HT7YRDSHY4H0
'SP2FZMQQT0FG9GNFVT04YA5QCG7NE4ECKANJ2QNVZ
'SP3AHC04HMPVC1FCHRNYYK4FA2JT983MKBJG07KKB
'SP10AGGDAKVP3F6KWAV7WR0KEA305WYB6TQXTRQC7
'SP1P045059SR9JQQ0EJEHHX50NXY1A7BBJ91EKYKG
'SPD7H7GMNZCT3BKTARW19CGPV7J5MRAEASGGQSX6
'SP2F95N90VZ0K0VH896K74GPGRSKRAHTXBXXYD7D0
'SP3SKZA6B545DM92MYMG7ZG88N81B6J5CVGT1HD7X
'SP1ZFYA52KJP45K8PEW75RC47D26ZRFNSZQRV7A4W
'SP8SHCQXZJZN6TS58MTX6M4PBN5PQ110F0PAEG9T
'SP1AP2MP8DYJWCWRFZC2H5G744JZ2JDXPWVBA9NC9
'SP32DS7948M0JRT6C588DQSBNP170FBHGZA49B00F
'SP1E00SD7W8FZ9YAWC6PTKTKVFENF7X8ASJD0JEW5
'SP54MCRGFAWNQ8NFWZ8JTXTQH6R83AQB10R2JZHM
'SP8SW57KSRRH1R0X5BDGNBZ8Z67KFEW74Z9KVVZ5
'SP1FHAX0BQXEG17GMHYZ4WWACAJKNN7RWM96DM3QK
'SP3EV7DWHMVJJNF9Q64YVXVQH69SKHVED89R3SR5Z
'SP3MFG5GAD2Z299ZC082KPST29394GDQ8HVZQ2KSD
'SP2EAW0J3EW0G80KQW9MFKJMD5E20EFG2YMKTEGJG
'SP2TA8J29XK4D8WBYPJRPVS3S3Z2889ANFEHEREAY
'SP3TAQCT0KQ1TC9E6XJ33J26XPG1DGSPS61M61H9G
'SP53J18BK5RERM7RZSPV4GS0S08S3ZE8GNEFEYHJ
'SP1C1HNXKT4Z37W8KR2JGGNDK99SR46AT7K05TD87
'SPZ2FSQAXSAH75S9D17QWGPZ57JMDGWX4JPDYSCS
'SP3PR3ETRNRY4MRTCPAGG2VF7HBC577Q87R0GXQV6
'SP1YGSVXM5PZW4S74W8MRATXJDHVK5MFZS9T0V7VY
'SPR6RNTSP1TRMNXG17DHN7S2EVQ4AVDK9Y38MK88
'SPD85KB6T7JPSQ4PAVRZF1H8123K4AXCE4T9Z3TS
'SP2MB14QNT1J204PQE0JSR5KB2WP4METREJ4YGM4B
'SP247C4SSWAP2BCV7A6W25J29K9FKHSBZKPHKZ68D
'SP2DJQJ4NY12HARXAVGFBG97K3BNW82SR6YAVFZDK
'SP1AZMDNVMPR13VYKVEXHFGCXP9JETA2W8G5YTPAQ
'SP1S4HCKDP6DQTHC7JRAT58325K6E5N7CK5N5G5VW
'SP2TZE09GHARKG0B8NTT9X77QXBTQPQ2J1579T0D8
'SP31A0B5K60KHWM3S3JD0B47TG3R43PT1KRV7V53B
'SP1PRJKBT43P9G31R8FVNMCTTY1E3520YG8ZWD9BR
'SP1SAP3Y1Q0QXA5YGRC3K38HQZPB23TGNG3SMD3RS
'SP1308WCZA8S00B8XT6774A61CFT20BNZCAHNM3H6
'SP2WXJ70CEZMWCC19NRYFJ6QCD8PTR0B8PW5GW78R
'SP2T5ZS0WA4BP31E3CTK5GDAY3VKJ1JXSGHDQZD66
'SP1CYT4564E7WE2B7XK8QWH6B489WK31Q5H6WY8EV
'SP3G5RZETXZ4WB7BWCMF57CF7DSR56M0BHE32VB9E
'SPX3VGDWG0FVSGPTB1PEFSQ3QE15ZGHVWC0RTVME
'SP3G2C60QHG9ZNBDG0J519C3QQEP8XQNWD80KD9GS
'SP2WCGD4T8V432VF1866PKN7B313FMRKX795BCME9
'SP2917XJ23T0WQM0TXQWEPSVTC113H7KC67A2R8JP
'SP1A6KAXF6QTGT8T8XK2MBJY9EWSG04TX4E7REHKC
'SP174N4YHPR6E92JP7F4Z6S0X0P7YREPKHDVH00RF
'SP2C9626NVF86VWFFND7HJ65DGEK5P84Y52RQ05CB
'SP1TP0G22FE4FFMJDHVBMBFW4494895NRK266ENH0
'SP2CR5WFGXGKDYC22C56G2RWHHPYCX6JXX7YWNDF1
'SP4TYPHTNQS3H0KFK896PRVHAC7RS626G57M1YA9
'SP2PGNQ22P3CTMVZ2VZCWNWQJ0BZ6KKHDVQ0JHKP0
'SP19ECAYACEGGD56T9CFNGRQJC32F8P1H50EATCHX
'SP2RMHZS4XXR8KNHSZSV0FZ7YKJMKDRVSQMP7ZSK7
'SP2EDJ9C7GFP2WNF17KF9HAPSY9WP7QJ1QYXQD9EW
'SP579E91FKEBBERMAKK3FZ2Y9RT1E8CFVH3XE8TF
'SP28GP5ZJ72X3F742KR5J6T9HC6NT7G276BR8QGGH
'SP1VDCM9FZH5DCDA21M06PV216S0DDECV0G62AEZM
'SP30TZGG24XKX9VC60S93TYW8FE3T94CRX4X2DM9R
'SP20SZTX927EXMBAZH6ZQ0REQS98K201J1A0AAXEH
'SP3CC9SYWR9AWNF5QAW8S9SXNYRKA71M3PM27HFAG
'SP2CZ7NSQHCSZGCD90WB8V581T1PB97M5BJ07R2J6
'SP39CW2CR0VMM931KC1VJEV76YZ1RX4ATAZQ3MV6A
'SP1XTT0TDCCMJYZG8X3G3GESAVWYXEVBYW2FFHBB3
'SP3N2RARPZ4FZP7JHJTXF30NAHQ0T9EYG4QZG4DJ5
'SP3X6G145Z6DV5H49MN0P0RK9SXY83ZN4ACM3RPMA
'SPFQ2GKQN39TGSNMWB7SH15YDM94X8HTDD5BRZF9
'SP299EWYXSCWDZJGKH6SA45GB5R5ZR27NJE1180WX
'SP1CC4F8MVMFKJ3PVMGXJZEC2ZCPV6MMGVF921Y3M
'SP52HDPHB83HWA7JBBJM8NEG1RCT13YXTH4HT5P8
'SP3JMWGH54DNFHCRZ82QQVX64XFY7P0CQPQMVKRD7
'SP1ZJHN74VH26SPHHJB4YP6NSEYVKFZD1W0ZK5K9H
'SP1N5QSSB519R04607NP2DG53MWEDTDZ0EDHQX5Y8
'SP3ETHWJPJVYGSPZ502P2CK53YXSQ8MVQEY81NHT5
'SP114SBBQ586P91XS3N5SGQCZ5N21T1R9SCQERKKH
'SP2FWXNZJ4QEMKDBYA4R61C6N71JAY547RSH8B6K0
'SP3FKHV3VQC6036ASPSV7D609TZGCC5SEVGFMA8ZZ
'SP953X8DCHVPNXG2TH2PMGAFZAX8MNE63N0X2P8S
'SP281DHYZ11K3B0BQHPWBBH5SRB457270073RVVES
'SP2VJMH4GK1KTKX9CSTP5HKJ83A6X3K4C6N519943
'SPZM99G969379CZRW0FBA0N7BE1D4HAT2QKNHXPD
'SP3WZCDTV70NA4H3RPHAF233HG4Z34JQVN1YQR0MT
'SP8FJY9QA7478VB123KAZPC8C272HDH2FF3MNMMB
'SP1TGQMX1GMBQVEB8DXMYF312HBJPKMYT27PKRXN8
'SP2SWKTYYWC1FEYVMG59NWGC9Q95DW50SDTE8JEBH
'SPCDHBJZEBW5ACK06501J8ET1F8439B6VS3D02K6
'SP6S0TN2SD167XJ48EGFAHYEYY36VV06KDGNQ6DQ
'SP2WETGD425ZAF1WRZEZSNVBJAS8E54HM8YHNTERQ
))
(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))
)
)