;; 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
'SP3BVQSZB9GV2YHD7D72QP4RXVNAED4419Z3CYHP5
'SP1KXVFD25MTPYYHPQ3FVW39ZJSGH3Z1GWD5Q7B5A
'SP2ZC6WC1B18PY9G1Y6NZWGRT15YJ270ANC23QKBT
'SP3MS5H6FDB9KAE92AMRDVZBGYWSXW8GX71X7A2P5
'SP1YMTCRET44R6R30XZN4ZG5P7V792AYYTHZ8R6HJ
'SPE29JJGCX146H9JSD2MF5P4W2PQ8X8TC1J0N9D6
'SP1Y27D4F7HTSM43HK391Z3Q8K313JBCWT3ZTASMW
'SP1TESX2QPBW2K7B27FWZ08KWR751FZPBFG4RPFN4
'SP2021Q3J7A69XDMJ2XBVMAHF0XNXMJ536F0PG1K3
'SP160N9M3HDGDACNTKJKH0CMPPZMFR2460T6HV7NT
'SP31E6MW7V48SGQV5VQ9JX8XCJ0AQ1RTVWEJS9PC8
'SP30Y844WC3QHA28HQYKJDAD9QWC20XD4B7JNZCSF
'SP3ZNMYJC30QY26F8GFK3DPXPF5YA1WQWG02RAWHD
'SP2Q4XFMT9XZW4SEKR56BZ70Z6EF37AJ51QSH3SYK
'SP11XCBWERH2V5SFXWPTSAQNCVXZQEW1FF5040FV8
'SP111G0S42TY2TY3QSATH2KZMMRJYY00Q0WA1A1CR
'SP34ZB2YBBDPYVHHRC3EHMPNB8RVTZJS7WD1455CC
'SP314HN833ZNPQQMQJH0GA134NSEJQKFK47NFZV39
'SP319XW5CEA3TN7N2SAA8B197WK2CY74YJCF2TBJ7
'SP3W5R37Y7Z0VKFBGRS4FKTRM7H1QENTQXNFZ64H6
'SP3SB0NRVYFK91K2GRXEKR4MEYVBDNSS5ZNBAR7GB
'SP3015FYN7XSTSND49NN3D1DDDSQ50S6TBH8G2367
'SP31DJ3NV67WMSCJRTZPWXTW4N7SRNQWDK9FMG2D6
'SP3M4VTSGBMYKDZ49XQYSKHVWSAH62RVC6EQ2MDR4
'SP6KDDXGXQET3YG38QB264B76V9FT5V77HK2JXGG
'SP3H16WEDNK57P0N518DK2WY9CWMJRMZRK6F995JV
'SP3YYBQ9Z8213CA0XBG92H8HVE8JF8E40XGEQ3ESV
'SPWPNKTZWG9ZR55ZSP20WCZXPSBCDYB4XQDKWW83
'SP3BF9Q1Q0BKFMJKJ4R85TNDCWJEE21X9N4XPVXQ7
'SP3TGRP71Q5CMXQD0PQTEDMHS2A0JDZ64F6MGHVM7
'SP256CVDTR9MET9D74GT2QYFV780F2PF5XZWJQY6N
'SP1HZ2DKYG294GBGF9DJQBK77W7RWBNFCRV1ZFQ23
'SP133Z71NV3XRK60M5EDSY7EFNTXNEQZ0EDTKHWFF
'SP1G292SPX7G8J81XAPAW880BMGSFNEW3WAY1FW09
'SP33W0DNGZJGG4ZFZXSM56855AMS90FY68PRE2AC
'SP12HFJYX172392KSTNJ7XT4RK1791QWHWB59HZTC
'SP3DYT2FWN042DXNP4FH7DZB8SHT1MH06773KKXZR
'SP315HZ9VP9HJHNVBF4NAG1E4ZKX5WPSHKBW702QN
'SP22MT5KCGNB2NR5FXW81T3RARDFX4AA4E2DVECV5
'SP33V0D2CV736X9V99JD2V0R36G7X8GZ1CSZQ8XFY
'SP1PMY2B1HK59Y3CW4JMVWN29RQXDP9ABCMW6BRT2
'SP38D047K8FW05TBAPCHSB731EFCGRQS0SBHTEGMT
'SP2CT6DTYVCXA1PDT8BD72YR2ATHK2A5PVC5MDDF6
'SP273X2J7BH660NQJ45N521KRHQ2V90EK3CM9873R
'SP1NK5EV2TZ7ATJ70YQJPFCV4BZRS7J98J87MVYC8
'SPZEVMWDHGCSAA6XR62239KR1PSRKGT688QSAR85
'SP30CVEAPVEEJV8PHPY36ESE7J4A6VSHQPJEEKTB4
'SP1M6WY0ER490XA5B4N26609XBRMAVKCG4XH6PTG6
'SP19JWVXA09XSESHYJFDX2QVX0SVNSKZ51EEE1DY0
'SP19HCHPFVSAQ82ZZGMMXBBVFKP6AFKVMWTV1GEH9
'SP1K96254R3KP5TRT5N2X64FB12VMHX6MYS0BQGYQ
'SPJGHBAGB5JPCEG8564VK40F8JR955VBWVTGSV5B
'SP2GGHY9C697PSVBNX1TSFDJCH003DZBTCFTCF9ZY
'SP3Q8PWSVZWEP5B2VX3734P2XH3583X8HJ6PJQ37B
'SPK2JGK6CJZ85RQWGQEX47MH2F72Z0EXDP5D72Y5
'SP19NPW1QYFAVJ4DFY9C29X9MMVD1RA3SGK033EZ8
'SP2XPYVPYCEW75XWJV07A0B00TR2DTNYKWD4Q5TKQ
'SP22DP27V28BQZ7E953VZN7M93F2M930CPZHYXC17
'SPGABGKD7PJKGSHQSW75FS3804DGP7X6WJFGHYDK
'SP1HA3F86WDFQQ0JQKDD2YWZXV94EKXGW7WGEA41Q
'SP3TDHV7BH8MKYEJYSVSW18PG1YQV0C236SPJYMYV
'SP31JXEB7PKSTW69M8JWDBHH8JQRE5C179Z06K70X
'SP2B60P7RBXFKFK3B0SHYJ6DV6769XVXQEBV2NNBV
'SP34HPDPJV2VE06RN7KFQ775C82ZEVBCAZ4MDJ8GF
'SP17XFW0963E9WG8484ZGFYS1EX9YGRGNEYGJKHZH
'SP1ENCEZASZP4SFK0JWTE44JZ3R9A91FPGZSFTNZS
'SP10P4RATEA0Z15FE93TVWHGW0QXKFRX4WBERKSWE
'SP3PR8WPVBC0YXPSEVR78T0NPMT1Y01231QZRQSKK
'SP1ZYR2GHFX2B05VT0DAHDAS8HV5N56MYM4AEK1RH
'SP04GTPTJJZV83PXPK21ADV195Y3SNCYMNDKPJ7Y
'SP16KMQWMF5ZKD95KCTA04FZPMZCNTGBBAPF33JN4
'SP2MA995G5MG9NS7RRTWGZFAF7MCMAXVMR9NG47SK
'SP3VFPYHXS889Y6ZX4VKWXC1CB5VTRK4ABJXN0JSW
'SP36Z1F8PVAMQBDV0TXV23RT3D81JM4FPMB10GV83
'SP36A2KPTNNB0KXM7SVKEYM3F4EKFXZENTDC9KM15
'SP3CYCSMGWGCTFYM7EWDBXVNZPJ0VF0CV9WFWPD6V
'SPRSV23J2YJPEVJ5DHWE9DYCYCQSWAJSZXKAH0GX
'SPBQP51PRR44VESPFCXYSTKE25VJ6B9K8020SGD6
'SP1XMMFS8PQGRBD7YPFZ6CGHREZYVW4TJVV5FEJ2A
'SP1XMJ5ZW231R6D1V48PQJC7MEPNKCB9DB2AREBM7
'SP1W1A4ESK3NE47JNQSE5PN9465QVQVWEGRNX7HPH
'SP472ATR49J1KSNGF35G8106N1X08Y4RH8ZZT901
'SP7VS3MDFWCGGAPBCZBH6N698RP2XQ863ZG7RV1R
'SP1TR4FT89D0FVZ5ERFKRCSQ6KB033Y3A1PNRVAQZ
'SP2GPXN19WWQKB6DA30RQ1RQD4W0N306BMAVJ1Q6M
'SP6DJE9PR0P9Y0KEYTBWEWVN43PH3SNHWSCHBT1H
'SP30YYW07A4SSESMRVBR1VH6XCBXYERHEJ9P9SAB1
'SP3YNFB1HK6NFR0ZR4A2Z1PDYEF9ZG25KRSB2GEGZ
'SPW3QD7ZT18M7QDQDB26ERT1TW4HJCD4TTJZJ00B
'SP36C1ZR47KKDEQ6MENTA71DAQRGTPK4AX3YW4CHF
'SP160D7SPRH9V4X3P4RKJ9PD76QJ80Q3340MHXFAS
'SP1AGH95BMHBNV45XFDVDN7H4Z0W8XFJENTPTRJQN
'SP1GTE21CREAMWT2XJFQ8JSNQ8DWK8S8PFWX4X6XX
'SP1Q5X0MFBQKCBQ11H6S9SP7QGWWC361P4X6PR4W3
'SP230BV3879CNFX3GQTM53P14R3Q6BFS91BTKD7M9
'SP24GYD8ZF3RN0B359BD29WF2FBZEKBNA9KWP5H02
'SP36EHM7RFXC36YSD8HKNJP7V344XXPPEHFP5X3Y8
'SP5VFQB5KS35Q8XKMAW757QKM3AR7GYMZCSABVSG
'SP3AGX0J22QKCEMFVASY22A5F44HF19ZR5JQNSW01
'SP19K6GRESRAXR4Q0ZBECQESB6K0NKBCBRBS2WSYR
'SPB75FFNNMVZNVWGE91SGRCNRHTASABX562988N7
'SP27G8MQ9R0DDE3ESVF2N034YZG6QD71YAXZRD13J
'SP15QDCJMMG493YXVCYSEPHGK4J61YC2X6SQD654Q
'SP1GAA9FFD59J8MPSG2S23T5RAK39RESPQM7NDE84
'SP1MYRPBPDWEZ9J13FGBFGKZ0TA9ZCYRX73XTT6M3
'SP24Z7C1VBBEQ8Y988E6CCR42MW8F7D37BVKK01TA
'SP6GKMZ7BWZN848ADG15N5G74M8QQSAV5D0VMDE1
'SP1DMY09AC1716AQ4BQ6F9XC4QK5PRT0C4H3AN0SH
'SPJ8WB0NY2GH5K56SFWG8337QH16BM8AH2V9GWNQ
'SP1D6TCPT97P481NDTRNWEMET9PN4DH84B58BD452
'SPVBE21QQ1TKNBVVT113ADT9KK6JEC8JKKNBX1SN
'SP360GVPPMMHWM0BTZCC381GC1881MZEXJHJRAJQJ
'SP19JQF4FC5G5Q7DY7JV5MNCRJXA35NQ8CSDEMASC
'SP1KT7QB19VQEHZ4EW0VFEZ0457KA12F6FTC7ZYKN
'SP3KEAPV2K6Z5Y7TA7K5WYY2BYE19320DK7D9RBH3
'SP1A4M8GV6DSBCNHWGP1RZ53TQFHT57KK9WKRAJRK
'SP3T4KE7CZGCDBRARJGM3ECC6GNF45EFBE05JSSMM
'SP1C05H7AE5ZPWRN2BT70MPJWYTKJ5XDXH57NJDZG
'SP1ECASSY1VNPYT8MDGYQZYA2QFC98NTTQ922839A
'SP24WS3W13JK7W2S1W7XGES386CJ91W783RK140WY
'SP2F8ZMEPAN43EDHGN1X7SFRJWSSQ48THCJNEF0DR
'SP300JJR9QAP26VAX8Y81ZY7A8R7B2QBAFW69CTN2
'SP3B85787JXJ5DPV2K4DCAJREKNGWWHZ37ZENR2XY
'SP3KR9SGTMN0DRN5WPNN3MEDS4Y6XR795GCGH466K
'SPHQ64GAMZT25QTBDWC70H56HVK9AGM17A6GBN72
'SP3354P2D3ZSMQ0Y82QHZSTXYP7MYWAG9Z9NQGN48
'SP3TH1DH46W29CRZ7EHT2D9PCTR93Y33YD5C440JA
'SP2EJSKCAD26AKPNYBQACSX9AY2JX6V27D3F9BW56
'SP2EDAAEV65TRBVMENKSQV0HKKJX36JPHVGXNAWN8
'SP17W459944DRA4FSRE1DYTHTVZ6620WS8F24NXR9
'SP3RFW3FH7890SJ2KJ1VETX9FN9Y4J1T4WF0QRDAH
'SP2WD3NBQFW5PDNAX6F85M3TY7ETEGBC0K04X91AA
'SP1M0YRYGQDD433YFWMD1EBFQH4067B5WDSVZGZDG
'SP52EFJKYDSF5K7R331CMFFAFNVDN18F55JZGA8Z
'SP3J4T79KP2AE70D9YTDNCJMHX5VHV6Q7P0SYX3MT
'SP23FHX061WDTW4K4BN1A07WA041S1M7B6CEAJFJQ
'SP3SA8DW9SSWD3XQZ082BT9AG67EEFN9YWRH2SQ5T
'SPN0FMB91X65WPEMQ278NCWCZ14XSAT7MJ4J9543
'SP3GS0VZBE15D528128G7FN3HXJQ20BXCG4CNPG64
'SP1J9WWRH5R5B6CYB1YF5C34MRWKTXJ71YVD8XNC5
'SP2NCAY7KKAH16J3DX3JNQRKZ60JK8TTN4CCSXSJ5
'SP39FHAJZKYYZJRN27Z96YHV4F2590Z30537V4ECQ
'SP3B07J8REM51ZZ8BT216K1RHN4K8DTE7D0GZY9R7
'SP3QVF7RFG5VV9TWGVWAGWYTMA71WYD2WV5FTF1M7
'SPC6KYH02BY72QKVK0X6W6XGNDTFNYPZBTA77F12
'SPNYTPMYTJFCQSD494DANHKZGW7KZP59A0GH76BM
'SP2W11E7EV0HVAX2KMDSXG3PCWKH1CEBMK5DB8RVE
'SP3BJB60HT48Y0T9R93H2AWN62GWP8XTYFTETYRA5
'SP3RKDMX6RD2N2Y13A1KH4SKFMEJ0J7D74YS0MW2T
'SP2Q8PBDVQY4N3PD5THRE6RNZC4WCPDCP0KMB22MD
'SP34HBB15K9P54ZRK2PEARGG0PW98QGSV92YKQHEW
'SPG93SHW397F615QM0PQX41MN1YX5TRC5G1V5FR3
'SP1G710B4TREX2SB2H0M466H80V8REDWKY18HK802
'SP3DW2YR31HWKR70630ZPFM88F1Y5M490AX13QC19
'SP2YNQSG3W1X7QY5K2N693CQ1JH1ASKQZ4YSPR2RG
'SP2BP2B7B3HPNZGY7CMXCMWYQ8NYPY577ZFT063G4
'SP1HRWQ1NB3QP80AWCSNFP7HV7MC9T0D85MTFXJRW
'SP1QKSRB3AG994K68HJD81CYH8JDHYCB5BRS3QV4Q
'SP27S9VTEADYFJS2G8GH21QADPZ9445NCHR86MG7C
'SP2R7S54GFS41PWKVZMEFEKAD4S4SZVPJGXSFTFYV
'SP35N2M7S2FZKB3W71N5BQHVN4MX2W83S586CRD9
'SP37NHNXT4SZXDENVM57WJ6TR7XWHTVV748S3C01M
'SP380WYDKAB86C0WPK6FZFRCB3DDZTWKETDWQ9T54
'SP3QR8PYHYRKFERM3CKAKQXFQ7M1SJ4383EWNC30R
'SP3TMV68FTXT02591VC2446SE22EQ895F7F9B2AQT
'SPP573S6EBM2XS05ADMCB8E1C3EPWKSKQKS1ANKJ
'SP16K4ME6DMN5MQDVY5K71SC168014GPGSBCHZP9E
'SP7Q1V1RKYHJTNJN2MJTV03HH385QJKSW91XK6TW
'SP1Z6PGT6A38E8W6SHJF03JFC2BMRR8X3VQHBX8S8
'SP1ZS9BX25WFYGHKHGY399057HT4MBH6TQMS8ZKTE
'SP55DR77BE23GPRX1ZP2PXHV0FEW1YVEEZYKT45C
'SP1VYT41TQ3CC5C6PBYAW6EY6XXWMZBZJT0733H0B
'SPM923TSGVG4VZ8BJJSC6VS4PTWBT2KPG5FRNKHW
'SP1A4MBYCB2DKM0HCVPTCKWBVSAD0J73KWVRJ8RWF
'SP7DMXKBSM8K3CJJJJNPTE3MNACK1WJ2PF1Y7Y29
'SP1ZR6F7803KPB9F6N9QZMX51XJ2Z10NQC2V7HPV8
'SP2N5M1PJ5X9RJTW9QS808Z1F4576BYG3FVA91QY3
'SP7VKV8BD0G1FQEWY7WNTA0B2292YNNA0P57YXR9
'SPXMZGWZS4XPGWFX1WC0M4WH8B7HMXP5E5VZFRYX
'SP1S875XNBT4JFM3M5G6JV7Y7FPPS7Z3XYQHJ1G7X
'SP1Z92JEZ76ATASFQE7RMZ42YN0J9R3NG7AJ6R2Q1
'SP336EE6CBKM01N4G9E9BYFN1WM46GQJS22TDM8YS
'SP44TQ39TEQBZ2FJWZERJWRNN0C5KV134SP9DGTG
'SP1DC9TAV0P22SHK2DN2PAQ8A8PZXKKFWR6NG4G1K
'SP1TNP9RJ7Q68Z7C464KKE7KA73HY258NPD53R86C
'SP2CT7PK64AJQWQP0XHECDGPJHHKREB7F13TY6XHH
'SP15NXA780H0JW0CCBTNVPDP9MN51FAJJ114XWCP
'SP19VP6TGY5JS6YEFBZHMB1DRAVJE8F49HJ7N3ANN
'SP2S8F4T5PJ8QRWSC1JYHK7JS2KKXZA2HQEW5G357
'SP12QAAEH4R5Z9YBPAXG7FBXATDK0AVMCHAKB9AQM
'SP2PX1ASZ1A1B805PBZJCF1QDX3RKQ5NDHBPW72T5
'SP33B5MBQGXA7G1X87Y5ZQHFDEFMWBTZGM2DZCPY1
'SP3F6WQZS7YF15K31BGAV113J4ZYCNXFKDZR5A6TB
'SP87PHFBSH9B51W2GBEN7BG4RHF81PP6Q4WKJ96V
'SPDVQQ1N5CMA4H12SV6EWJYMW13SJWRWRFDK0C2A
'SPEXAF3YRNCR01Z4DFZ567Z0FB4RKPHM88DMKJSQ
'SPJHT7DMDAZJ7C28TJH6M156C13DE2T077AAADQ
'SPPMM67301F5DDDF4KMC1DXWG89F9BR4FVQ19W9A
'SP2X1BTF8XF0KCY0J4V32FV9J3SWTM5FE8MRQ4J4S
'SPRYP03R12HBSWFB9X8NZCJKHTPWGTBFCMJA7RDQ
))
(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))
)
)