;; 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
'SP7A512Y0G7TX0N38FD3DB5JH4VA2BQV6T3Q9CVP
'SP5VYBD1S3QPZK7QMRWWHVNSJT9HSC0QJRM4CMNW
'SP3Y5WP5562YKRD4PEG9Z9ADBT7BHVT2KXNJ0NVBT
'SP1BJ88CRSMFGF79SMBMQVKYV2Q6RWTWPM56RZTXM
'SP1G6BG0RJSQWD5XRR9PXTBKRCMZ6AVWFRDHKJV8D
'SP20WJ32B9P9G9B32ZXS7MXNFSS8PVHEVEJXPAXMC
'SPXMF3CSAQV2CMAZE3FX6FST8WMD9VF1C1M2NGGQ
'SP2RPCX636ZTTCM6TBYBHME3XKZ27ZXMSA3N8QPQB
'SP179E4TQEDW24975R88Y8KBKBG0AYJ3GK9FY7BCF
'SP113VAC9F2VNRWWC4SBS3X9MBKYR0VRBPJAWZ2SX
'SPNVW1MJZBZJZZRNAFNS4F4Q49FDW2V7RQHTE1DV
'SP3DMTE2FEYANBGRAEP2CBXSPVRCBE8333CF4ESSY
'SPA05QAHHC3Z5YT1SGJVTXZ5G8D8MFFWWJXT2V5M
'SP2TC5X4JWAZZPWFFTV01JYK86DCP26EWFP2XWRFP
'SP3N8PG8TFSXBC61PZE2DTBX2YA2FMCW9YJ3CACJD
'SP1B5HFKMDQ73KHEQMKSPJH3RYJ7X1M6GXE4CR4F5
'SP5VMP40DQJP12MZAFQFFX598G9ADE6F5RQBDKF9
'SP14AATYGAPMK2Z5R5R1FAMT87HWQFHNMFFM5D1ZF
'SP35V1WT0X20NYSB8PWE73GTM2Y0GSKJE0EAC3PCR
'SPAW24XNM2A186XJD00KE6R1J5TG4YD6K8AG9NMW
'SP37BRVAE8B5E8MX855XBYTJBTJE1JMKQ2CRJBEAJ
'SP3K8N4F92Z9Y6EPY05496E0HR21GFC7XTAWZ32BT
'SPBN0HM7HFWPPQ650Z3REPE2KE91G3BBVKTXM661
'SP2XKKDH3MDT312FWCHDT00A35C5FZJ4YNRSWDEN3
'SP1WXBN34M8F8GTK6XDS43KXNPKBWWN3NR1D0AVPE
'SP8KEK2QRRPC371HWQE2SGVMY7ABK3YBNBGAK7MF
'SP3R6AHE765A4EMTB03T8SQ4Y9XSA82346NKCGNB4
'SP2E290TNAEPXEX7AJTD2X0C6X3QM3HD84Z2R9HT1
'SP12MSHKSVYJ9C9KE62YKRNHGW63WHTWF086XF4PT
'SP1SHNXDRWV9WHB18GTFK4GEFMMG2JC5X7WYVCBD2
'SP3RDG2S392N86YNDRN0PWAZ6E3VEXA749PRV996B
'SP363B64Q7ENKY5J7687SCXR9Y2ATDBH8J14503B6
'SP141AN3MDYPHW805AT0TE5DW5KGX7AZET10JWJ8A
'SP142P8QEBZ0NJ6SM06609KAV659ZCNZZ84CN0EMX
'SP19VA9JNHM52JCAHQ293DJ4YYJK1NHCHX0TCRZ5N
'SP1AQWQFPZFHEB499GSZMHQ2P4EVC8ATYRPDRMM69
'SP1S538TKS1HVKKA111X54FCR9DV7YGD069EDTF1F
'SP2CTN8DRXS72G64MW7NY86B6DSPNN9RS7XK4V3KW
'SP2JR26WV20HR5Z4KE1M4WQCTEYDEZ9EQE6X4RQB0
'SP2M7JAN7TPM95RD2840V723SH5TMS42353JN7B5E
'SP3C9JPPGYZV04QF3J0N3ME7KN5NDVF79AZ96HR1
'SP3Q0EC8BPMQKJFZNFA9FTQFCD23EHD3BV4PWEXZM
'SP3QG9M0AXTS3X7ZYHXMK6F8VXCQJCBKF31AEK10B
'SP3S5ZFPD61MH1GZWYGR0EG0NXYGQC3MJGJKM4FQ2
'SP405KS28NKVV170XG5EQQPYGD8H6MD2HCABZQK3
'SPD1H3Z1BPX0CMMFWHTHECYMCW1AWV614FFJ7Q4B
'SPFKS2J4T23ZG7E0QVT429HMV2K7AF2FNKGH066G
'SPJQGGVMAMH2P6K3HCK5ERQD3X2NC89WTHCHY86A
'SPPMVWYJHZX5ADZSA7GMAAPGE3V07JEE5KZSFP4D
'SP1N7ZMNEDN0Z46MTNMWDDF6Z9P2X0F4G4QWJ36SS
'SPMF0VBPE7QAC422FQ5FFPETJP3P8K3FZH5TN7MB
'SP3S4EKYB6ETJJZSWQPVY7F5DQ0EZCDGKH2H0V7TV
'SP1KKPEY23CCE310DADR1KS06Y7KMET6M4WAE31JV
'SP1V0MWV8V9Z7MRVJAABWR4XPSFJZ67R4FMN011HE
'SP27A5RMDF3CBPAW2FT361D5MDGFKBQNV63691K3B
'SP33YM4CD73DBVXDM1Q0GKGS0DGF8SC9P9SXF4Y7E
'SP1MW03TEVMXMVZ1850DV28YSYSKA8S35KC824QAV
'SP36KK1WYNES6725ERKNCFHYFXBF81E8S73AAPKGP
'SP18TMHKPGW4RZF2CE63NCZFNEAKW9P1XS3EZJQVA
'SP1W8RMQFRR9X73C513HYC9MPTPE8YAR8SG4Q279M
'SPW0CHYR5S4J0DM03ACH2PH9ZHPFJ776Z1EQBPSV
'SP29851QHS8V178JMF25ZA97S8AGYRDRATD5RF71C
'SP1W6M44JAGRRB9Z6ZCPJ0042Y07X8TPP99G4P958
'SP20EXN4R20YEJQ2B9D28C4AKVQ4Q8MY22DJ17M2H
'SPX85MX9MXAMM3K94M3SM68808B5Q2CAS9YHFBC7
'SP2J27DHGBWJP0HQVF18QCDN7N53TVFGM7BCAM88X
'SP2VZSP1HHR9JFZ95V5XPE1RYWT6CJQHM82VS9DYJ
'SP18P01QFVTC78Q5JBYJ1RVRBZYD7866XS5JSSVAS
'SP29JDBZVBA1NVN40R4RZJ2H4CXZJ75B51FJ7DXAP
'SP1MXJCYYZNCRX9GKHX1STKDPPH782RRAWB3BFHWC
'SPWBAZ54GK91JPEB27RD4WBKKM1EE8Z7F496E79N
'SP3G4V4Z7C3EPB5J8F2YZDJ80BAR1QA6DKMPA25Z3
'SP3WQC8F759JDC98PSH3496MPZH2PV5K0W3KZG6R3
'SP161QHS676YAM88D58Q958DV2XQCSF73DSN7S2DP
'SP2199VESQD8NT7TTA6KFQTRV9Q61XA3BW1B9V6WX
'SP13GAAZ2Y7ZNED8Q2QXX2P7SC5SBP9TSVD54D0XS
'SP11F09DT5HFYN7Z5HG15QXW0CMD40T2XJYY0G5AB
'SP2A7GMXDQJCXQ11P7MXECF8RNCFQHF9NZXSP7PPZ
'SP6Z039010BSKKHRSYVDYPES8M7BZWWZGYGXZ2FF
'SP2KZ24AM4X9HGTG8314MS4VSY1CVAFH0G1KBZZ1D
'SPZGREY3VZT12MEWPBMMCMP1QE9FZSNBR8N6M6KX
'SP1VE9M4VDFJ62Q6R92H7FE7NNXSR46YPBH038VT8
'SP2SQV6JYEAZ9ATS711ASFYRDC9ZN8PMPJ772CQM
'SP2TBB7CTW97SGPN39F23H75XRQ4K0DF8X2XS9R6
'SP12Z97VJ9N46Z8DYA7844VFF898YF81KC3JS7C3Q
'SP2ZYTBCV6MK1M9XRX425483MT8BBA50TJQBBGWD4
'SP12ACF73GKBYGTR143ZREAFPRRBG3HYHWWX31VTZ
'SP163Z2R28REJZNB47QSWGNHFAFQ19BVM95JCB8VD
'SP1787EJFPC3GKSGG60EGCE8BWSQQ8HFF3BS78WA2
'SP1F9B5PE789Q44CKP9P3PMV90X69S530G5M1MB0K
'SP1GHR5KZQZGPMGC7N96DBPX6KGTMFZTMZP1MXR8A
'SP1MM6AXFQJZ3120SH5TXNY2KMX3ZE9T0FA56NE86
'SP1WTHN1FXPV4Z8Q51ZEP057059GTNDV5PEBEG4KV
'SP1ZXB641189AX4EEPCRQMST94GGC3X777PM2FFCA
'SP215NR9D2ZHQK92FKBA7GHN84HB4TJVGN5PZ36P5
'SP287T55R7CZYBJRD5YJJTV6GYW4KQV3Z4SWQYKGZ
'SPZZZ4GBT5V6YHMXS2NRR6S69E5H5KT5VK55NKMP
'SP2C0DMWRMXF8YV5TZ65YNFH0BTM3ST9FE8KF8XN4
'SP2F01KHX4DCBHSSB6HZENZR047SHGK4HHA66F62V
'SP2HKJMRJ9MQPNSP8QDNBPEZ2WC3Q8B2KN0DX27YK
'SP3AX271XY0BFFBQK7ZV39J1BJMN3QRSBN256PQAZ
'SP3DS58AYD5HG53H1BGGXNVA0T8X68HDAJXX9BR1P
'SP3J0GFS3NFRY8XH7HXN9WYF7QF8KZXT4AMGBB445
'SP3VFB4NTFX3Y5S53FQ0P7CGKB7XWBZKSJZA3VZ89
'SP68SXCZ8KCPDYDEP53BZ56GQBH63C3AW3ZFB4NZ
'SP8H1JPB3VWRXNS8ZWYZK09WRBXD9308Z88MBEC1
'SPNK3DAMEBBK5TF97B3XR9KED32BMYHJP76AM9MJ
'SPTWKQ6R4XWY32Q2WBZFK2D880GG6F75M11JA99D
'SPY2D5MCXCHPK11M0FN4PE716QFX0FH80JSRZBH2
'SP15XCYTD8XRMFMAH1CAER6F33G4EARK5Z7RGY7X5
'SP3F30GDEVMNAWJYK41HE5K6RN2BGHR9YT4B51PKQ
'SP6R1EKY8QYG4MPWXT6NZHXCDZDF1RVMJMKMYN7R
'SP1B2DNGZ20JYS7BYWTBDD5DKGK8S4TZGYWG0BMDB
'SP2BH3V827MTBX31MF25V5WZ9BHDEJDG0DWSPMCA7
'SP40F2Y3BPW9WCS1KK8NKEDF97JPNE45FVNVW250
'SP1RMCY5Z8CST2AFJT85A4TG8TGMQ69R0YJKXY5SE
'SP2DJTTZD81H14PW20J9B1NP6X7KT9YAMC5RZ041S
'SP1C3603663D9K103S8JG3W5EVY7MNRW259ZNFYDG
'SP3ESWRH568H33R78NH67JS9GX8CG1C5RYCZRYPDN
'SP1QVNXWWE0095BXP3D79TSY69WBJ7N99TCCQR6RF
'SP38E4SFJ5JFJVAYRJRFS4YJG8VSA8E6RE713RA75
'SP3WWQXYGYYDAZ4JV2WJETWC9V16CTMC1E71K01BB
'SP96YJV1W1J9RZ1S68M0JCJWDNYQDW6A729Y6N1C
'SP272332S509DG40ZQ8PH73RKN7FYXJXRFF8VB412
'SP33DXJZGD89K6HS98AVAMMYYJ0AZ997E55WVA1ZB
'SP3RX89EZX6ZXCASYYSVVN4E7PY8AS7135Y704P6P
'SP10JNWG4MF0CY6H30C1AT0RZ8MJVHG1BW6YAAXTP
'SP19MQR3KGAKK6P2NVE0H1VBH92Z4P5NGR94A1JWZ
'SP1NWRYHJ4A5FD0NTRETDP6C98GMNZG1V0A64SQNY
'SP252SP28J0JX7Q9NPET957KARJR5JHNWZFKDD7N2
'SP5YWD5WZECNGPYJWRX3RGJMQV7VV23VPK832Q9F
'SPRB00BW4DR56VCH0MEYMCY942BKM1SR0Y1EPSZ
'SPZ3PGRF0WT5ZJEHWS6KG853N9AHQV6Q61HCMVCB
'SP2PJ8RQ3Q6RS8A8SP9F1SN03J1NVHDPYBCHE125A
'SP26QPKZRW3J5XZR2FM9NWG9WE8BVW28A8YVZK7A5
'SP2QFBR77PZZ76R151K20WGBAK7VWBMFMN5P3ZKX0
'SP23YTQDD36TXW1Z3CFKGHWBGDBB4R2B0GFTZ649Q
'SP1K1E1FZJAMVJ5R3PBWX7MQDPFC9H8B1AJ7YXHHT
'SP1SQFWYGWX2JPNQTG87PHFX4H2WHB64Y334J0E6F
'SP2YFZKRZ6TJ2MGD4148QPY2M3PCEZB727XFYFARG
'SP3F9S76QDCQ1SGKG2Q9T21WVCN5C09CMTT13HZ6N
'SP9H4GSWSHT6EMACP6X543X7K6TAPY2FATHRN3DC
'SPQMJCMMVEW69ZV1NGP8SFQAE4KYPBP3FCTGNDFE
'SPQVAY1A2QRATHFAD88AN64C2A9Z423J1MTFJEJZ
'SPVEKTJWKS7D5TDTVFKRNY2Y3G93WSZEXDE3E2NM
'SPZX4S98KR7EAZT6C1YK7XD02ZDT3N0XBVBVH4NK
'SP1K432EE4RHAMGDWJYFM0PQ6JP97ZPBX6HTQSKV3
'SPS11CXQSKCXK51CZBX9XGWBVK6RAHX3FA08XCVC
'SP2JC9XJARMYPW21G7W4X2KB8BJSQ9KJYVGY4WGSW
'SP11KG08SDVDGC8QF1D1FE9GGT05WB51CMX1B5DK5
'SPV873HM0HVJ1AMJE81XH6TZHHVJE1G3RC4E6SRB
'SP19RBW9WC1FERYPKA34EF58Q4ZG82PN8D25B5EW8
'SPVM0TTV8XD7AEEZZGE3JFVXF5WXP4CVDFKMEW6R
'SP2GZHBP7MKV9NMSVH3VVZC36HSEM0CESWAHWMCYH
'SP3VAFD5QXVD2W2SDS8RN55CB857J3WQSMWA4SCNQ
'SPFGE323ZNXDVNAJM4A2E8K74ZTQX4F82MHZ2H9R
'SP3QMGZJPKDAH730BJX6MKJJZABZKEHBNZ7D0KSA6
'SP19TNWV1S9NJ4H5QWYWYFCD2G1S703ATNVQBT80F
'SP3C42M5Z0Y2610R9R221754P6RDF75CNVRQNMB9W
'SP108PFJNH8ZF0YNH8RDERYTZZW5B135RFYBKCHA3
'SP14Z85YT1E5DTSVBKR0ZZ7JYABS7TTYFCFN6DY4P
'SP1SDGGFPAPX8M4X2SWEEJXZA2H1YZRG53GZG25FM
'SP36AR7JR66V24AM94XFG894FRQ20WY4V3TFPGF1N
'SP679V9Q1GVVKS9529QMGCTH6JVYWP9JRTH88RCF
'SP2ZMTN0NFWRP1P73NCWBP1EZM1V1CJBEGJBDNS44
'SP79VCNAG4CJD700MW8KJFN2VB96DNTVB19B5SCQ
'SP1XHXFT81FMFW616W3JZ9Q1NC88VJXMXVWKGE7GP
'SP3AMFPQKS44BD5JFZ1PZY2DDASV4TGAV7QCKBCMT
'SP22PB1H5DXW3655HF832Q3XCDED7981SD1BM8V7Z
'SP381FBRR8NGAGDACH059JSYZR8D0GQHJM12GNYZE
'SP274JYGEQHMBJWC0S925CT3CNX4WPWD8Z303BCG9
'SP1MZN19KN6DHGHYWB580SAGA7D95DP4RB4PCSG2A
'SP1EBG993BP45APFYQRTPJXR75GBGY1H54MTWVNH3
'SP331F8SSP31M3AZQSB850XW5AGYRFJYFZTACXA1W
'SPXQXMX7EVVG6HA3FJ1HGMHAVGKTX6GAM4Q7B9JN
'SP208BFNA6FP2K3HS8V3VVD17JBNN63RCEP7PN0V0
'SP2CZBQ51FHR9FFW0KCG74JV31WP0G8FFY6FFTKPY
'SPCWFX40VYF9AH4WKVRJ6NGYP2TPGZC2F5PGKFGP
'SP17AMXXHR9MDZ1EBMNZC3P8SNWGFR6YE5AF5GNHQ
'SPNF8ED588DAEYE16TE56R5N0JAKT1F94N5N9C2P
'SPHJX434QRXRN4C0X52Z9SBPVTBABDMTFSH92ERQ
'SPERCTFGBCKJ0X89WPT6N3R4KKEH1XEXD93Z9DPW
'SP12M0YV78GN6DJN0HDKJA3FEX633MEWP5JCCAPXE
'SP13F7JHQA5QF4VW6CWE6RNFK8FWEHG4DV07V0JN2
'SP14EBQ926P4APDDMT6VP1F0X867F7Z2TDW5CV69A
'SP14K4QQFSQJAY6FEPTBE3MWEQFBYAJAZD25BTPNP
'SP15TCCPS6WWN6QYBA3TQYGG53HW36RCAQTG1BXEZ
'SP19EEVB1NY23C1JK9WMTN0BK0DBJ4X6A9SRR7TPR
'SP1C4VJDMJGT7QKWY6190Q9B1BMW6FQ773752A761
'SP1JTQ988GYBQKZARR03XNKQBGTTB181VNAQDEM1E
'SP1KHKQJ8431GD01MM4KW82CT9WAC6RSQ6G4G2S7W
'SP1P0YC629F3DXNDMF65P19SZDK1TM199RQ586HPT
'SP1Q420T3F85GWSKHPF4XP79D05GWA0083S9YAC2D
'SP1RY5JKSQM0NBGX2PC2SWBEPSTMBW9YHEY5M3XP5
'SP1SQ0J8VHQ5GF6ZNNQ323CDZMMQN988XSHA128X9
'SP1VA9HEH5VJFBCGJ6F8VF9BGS8WF6DJE9AD7856
'SP1X0YEJ1KD97AZTFVETT32TX5405QDVX0R754SX3
'SP27Y6G1C9NBR4CMQXR8N8WAWB0ESMPT7Y990F3AH
'SP2C92H1H9F1T1AW1JGADV5BVSN8Y9Y5VB1RNXYC8
'SP2FHSXHZHXS2S10ARYE0Z8GYT43J3TG7Z8WQZR8M
))
(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))
)
)