;; 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
'SP2BN6J24G611GE7NNSCTK8SBY5AG8MFZYEMB8DSD
'SP2ME2FN24CSWJN0MNJN6W40WT3D7H3Z47ME3G886
'SP2MH5BCSRECYR991SJWB1HPFRQQR6M3H6318DBYD
'SP2SSAVA9H7BH3CV9F5108PYK1VH884ACXW6D50TZ
'SP2V20SHV8DT3828MD8AC5G7MZV73YMGQ3RQ1V0CV
'SP2YQCF4DMRWRPKD0EVNDY3AJ0BBS9FQH548GCHND
'SP309HVE14J38WYKD59Y1QYRF0QBHSTRS8PQRWEZW
'SP31FCEGXNA7AYQBPP3R050J3030B74Z7CZHFCC1D
'SP33QYJHG988R7XD10B5MPKG7NCWQJ77ETKMA2HK4
'SP3SC4SYN1Q26XET641SNNDYBW3GQ9M90PDC9373K
'SP3XWY5928B531VTDDJH82M656Y22KA6ZT4KMEJQC
'SP5N79C43YSTBJAFRT1MAKP5P6FCHC6KKYXQ52S5
'SP7VBGRVVHXN50E3XBS0METBRSZ0SX397RF5S1EP
'SP8BQV0867PEB2JH72P0ZPMK2Y3QF2QB2JY7SB30
'SP8PTCDYD97G6PK655CSVTC84XBGQPHZ9R4KPH7V
'SPAP45V7W2HEY59D9QP6WZJ91RZRA4X64SK34R0G
'SPBQZMB53TNS6G79YCFV6ASR1V2X5JPHSP4VR11Z
'SPCWQ59EKVTD3MJ459QWXBKPKMT32EFM64NH1F5C
'SPHYWQJ0P2W8TAWF4MYDGS8933NXGFSSQENEZMZ7
'SPJJE3PPC7070BTDB8H8YB537HQCKRQ5QF3TRPW1
'SPKSAHJQ9JNZFDG10055D3GSMW0Y983XY0QY3F1K
'SP148K9PGT0BARJFFN01N13Z4BGME4EF9KC764KXQ
'SP1K30YJE3K05ETW7MBQP8VM2ZC5DFPECT2ATXDPF
'SP34V64PNDN1535R0DP60EBSXASJHKJ5NH8JPHBQH
'SP36P3B159T3KFD8KM63HQXR3G2TW6AA1114Z8ZVJ
'SP2YEDXA2F1BPX03KERH8N7CS2FEDM5FZ0E2Y7HWF
'SP269H9NABEQ8B3R07XAEWGX6NWQH6GMYMJSWX68W
'SP3Q755332RMAKBHVZ9YKFEPFN3H77CGFJR2601PE
'SP3QPV16913GZSPCVYEK803VP79TMQVA75QY3KSH8
'SP12G8XGDQDWYEX0MMJYZMAJW2CZFCNRJV0BME51Z
'SPZHN63W649JGN769145GS86NMJNK64FDM7Q3B5Z
'SPM1EDZ9E007R40BHTXERAQPRK2CNECG5ZAPXGN7
'SP252KEZCYA5EXSSD6327J3HMAWD8148TQHC3662Q
'SP36B1STPXDX9N9S2TJ5AY4DE7BSJCRSCE6PEVTBX
'SP0ERRHJAQJZS1XW5W5TQ50AVYX0W774DAT7H9JK
'SP12CHNKZSKKYPGJYJCXNKY6QRH21G058Z4SYDE1S
'SP1348A4WTKYZEM6B2S7GJ923JHQJVBDWWPDVGE9D
'SP18YW6H4A4F6S4M40PKCMDHEBSX0P6XSHK2WXQDW
'SP1A44SEHG2NEKEFHW7FWNT5TR06CSFMWZCGGSPG2
'SP1DFYAMTQ6VC5WWJYRGKJ2AA5JNWY4SCB70B5766
'SP1G7DTD8EZ57ARXQDYEGGAV6PE1069YMYMD50TV5
'SP1HXDDK0S6MTJKQ82WNYG5287EKZ5MD0CC4K9Q0H
'SP1MQNE1PYYEHSXP3C5PRX2Z1ED343VEZW625C2NA
'SP1RK97TCV0RRN91MY9WE5G3CNFE3SE7XKCYZJG0D
'SP1RPMRPZW19YZ7DYCKMQ7Q2613R8GVJ12Q2D6MXF
'SP1RW5GHWQ3YHXZGZBWDC8WD2VCRBYSJVEQX9N0VR
'SP1S6XYN45TH8DZXPQQHT542H6E7FPGPVJNKGNZ4J
'SP1TN2TKEW7CPSSAKT8542VD3TD4WHGWVTE79RK0V
'SP1X4FM2KVA0N5KQCAWH5HP5V6Q6JBSFBE7KH9863
'SP1XHR3P14PJDA29NJN1BKFB7M09TWCRPVHX4VJ2H
'SP1ZAM4MZ3SEGSD1HPFZAABKTY5BGCVS2038YT7WB
'SP2578QSG5CZ42QWR6SM02APCT3X7QE2DBXC025W7
'SP26CVY186PNXJNH9A4PS00KMHE8MQ753987N85QW
'SP2B3K2826601MHH3M1750K0Y2HSVW0KDWK70QTHT
'SP2BX4NW1AASG76DDR8AHSZVWXRGCBXXXV5VNT70H
'SP2P79BZASH8TXZZN9PX32WRCAGN31Y8PVMXEPJZ7
'SP2R6AA3FH8YHD08N1E888ZJC4PK0QB3TJZV93EJ8
'SP2TAACW7YGVRVTB560GS8X8ZFZ3X5A2ZH9TKJBFX
'SP2WQ46K5PSEJK4YRKWDAC32GHPZ6KQGXR52YW0VV
'SP31C6FGN3P7G3HG4A6VV3GR0T7QDEE2TPAZW4VNH
'SP36HS5PRWEJZ4GSFP88NAAV9WKVK74GC9S4FSY0K
'SP37NHZ7DRQZ49B2A5Y1JTA9V980GW5M8MX1DXHDW
'SP3BC3EQ7A5PCXET8N4XV8QMPV9QBYRHRW8X9FF2R
'SP3CYNF999AAGG9A6XDJFNSXXNNG207JP89M7SVW4
'SP3ER417AWDRHTGYSSF55PH0MM3RZ5B2W8MV13WJM
'SP3KCAAQWCBDQ1BEM511A2PD3D9EG0KJT359VFG2T
'SP3M4W3JEZW1G076275SDVYQX0N1N5X83QPEHXKE8
'SP3N3TFDG95T9MNRMBDWAK11C8FHQ1P2HB40FD7FN
'SP3PC1B9G6JVKCZ72C0CK04WEQR5CTEYD5322WZKY
'SP3PJWF39BE59PZEHGW84YMV2SE25180ZTFFFR5R
'SP3QS5DJMG4724MWD8H1WJ2RXVX1SMK6J8HM9KNRX
'SP3XKBYDR8VG5K6C75RF9RP3V35EKTJC7DVW0TGHA
'SP3Z8CY621Q4X4DKATABDKAK56KKXBEQ64HZJH7FP
'SP7TDFVGN8EXTW07Q2AGKPZR6A9METHKC5FAF6ZT
'SP7Z5C0ZAE2Z4TDTTCTK4ZE11R01HJZ6WYV40ZFZ
'SPD9B3YJ9HBK6RTJ4DNC9CY5JJZDXXMC5NEDWTCH
'SPECQR9Z1FCPX1BZB5QNAW4N8ZVAQAE25N1SKAAF
'SPEJPS7M0P82025ZKJAT9KJNAKHTKN2TERWYC8MC
'SPJ60BETJ7KS4MV2DBGS1M7FCEW9034EN0V0QQEM
'SPJYFCGV6S4ZPNWJWAM54KXWPGB9M6HWYT87YYWX
'SPQK8CM1SZE7WPNNWDDF7VPCTJC3QZS29TPE67KN
'SPQNE1MKZVJT3VWZ35YTWNG7S8WHXZG26PHQ0340
'SPTT647W8C5KCCDJ949K3D45X2YK2WEFAFNMNSS7
'SPWNNF3D7ZSM4ZHC1JY8FSH192S5321FRPW1KHHJ
'SP21BPPHMXB3WAJ1AZP4ZV6AT519F1C5ZPF76PR8S
'SP39B0E13EYJ5DBEK56CN4R1T7FQ1NQ1MZV7S356B
'SPVZYP0FY3GY79TA8XY47TJ9XNG66XC6G94QSK6
'SP25K241QP51TE9J1DYT5C5EYFJP2B464CF296F9X
'SP2Z9TK9Z8ASVWJAX077SJAEFR48BZ8RMZY8C9Z9P
'SPPTZGM4TDG31FFN2CGH92268WT6TWG71CCDY0NR
'SP13CHFM9WRVDQSY9Y4TXVX5WR6E1V4W8X5DFD589
'SP15ES27VMVA2ZXD0GCZF7BW6TZC7Z7CBMTY2MGNH
'SP2V9ERGVJA2WEB9N80ZPYCPQD91NWVH4M5SJMK57
'SP2PG0ZPKA9RB2W5PJBEPANCYHE2EY043FZ64KX7D
'SP19BJVPX4YGDR0VPGT0NAK2DX6HT3X8AVAGJRVXF
'SP26EMH4V9CHR6PMJR44DVTME2WYBB58XH1YY3Y2
'SP10E3NJ9ZG79AZAKB4JPZCZWXRSE4HQPF8BN2018
'SP3MDDAP0V43QZ1BRD8N7Y9FD30W0NEJ27ZHHN21B
'SPGFMZBK1NCKV8V81GEQ0B7NXD9XFTVP3YFXR3Y1
'SP1QMQ7QX085CVTAD2RHD9TXWKVZ3MXJ9MVCE2MCH
'SP2PFBD7VSRGJPFVSYYTDGP69DTX72C7J40TMV4T1
'SP2Z2TSWP82ANVB5SEVE8N630S1YWNP6C62Y506T7
'SP34C5NVJ8ZMT7JBW8JD18NW8C5TP8SC1TMEVBSB9
'SP8908VQ6TWK2TKZ6X3EKZMR0P9E52N9Y0Z2JVTS
'SP1T8S0ZWH7XY92KXKHRNH31D5DE31ZN046RQDNGX
'SP13PMNVV8CDPQQB6G59GD0TZS3X9WF0DJVF0RATQ
'SP1J366KTPYSJR6X0YP3HVER58XB86XZZ8ZX1ATPS
'SPTWJDP63Z1WTQVW4QVSYTC2158NPBE9YYMPSDB
'SP2MTC6BZQD08WA9TPC1GMNG4AZW3NNZV3JN1EVD2
'SP2433Y1SQPE2F2FYGF315K46XH03VX0VQYJGPMHH
'SP3YS0RA6B43T5TQFGNDYWE63GDKK3RVN09MSBX9S
'SP19K7GPC6E968M5GEM6F9CZQ1TV9CN1W383G18ZQ
'SP1A1W0K9JGV9V66VRAGBARF8RA7PREQJ5X87ZBHH
'SP1G18KGVMP2RF5S2387DBC4VRZGK2T9ETMMVT7BB
'SP1QB348SM9JVWBGPFVR1SYWEC3JYMKETA8FP8J2X
'SP1VG5JRE649BYFP9G9PWC57SMC5DJFGGGDK2DAAD
'SP223BF4776A7TMNQRT41CRSN3Y9V81VJDHBBHFXJ
'SP235C2E2QBXJCS6FV250XTXZJ4CM6T1ZVMX3VC5E
'SP297CWGA866WDBV77A7RS1FPXTDKMTQ7M2XCGME9
'SP2AA7AHRRX2S47KQBZ6YXRWV2JRM05MDGAM90APN
'SP2B5K3GTBYMB3E4NSMGF82PS8QW8WQGKQX49M8B
'SP2BQ5GVBMF9A2BX4BA0SSYHS5C3XZVDGWJS3CETR
'SP2PBG20HXJ9SC9XM9B7395BZJE3TVVAR7SF7S7YY
'SP2XKZV1XY3FK02ZHKCJB5Y14YBXMTRCY8MMP4DD8
'SP30W8459K6W0VSDJ4QC81EV5Q5G6CD5R57VY0E48
'SP3APHMWNC8NNZ6MRVABXVR115VGV2SRY6J268NJ9
'SP3VXBAWZ5WTXE4JPFVJCFYES7GDR9K3G9YHZKK1E
'SP3Z5CWT35M934XZXG1PQZNK4AVRA31400EWXGKHJ
'SP9HEPP9Q9WKGJQ64K5DNVJXWHTYQHE8Y8N0GAJ0
'SP216Y4DYSSBMMEACTMNRFYAWQZ1GWY49DJWH54PC
'SP39Q901XBNA7JTN8T5KY8T7C0DNP042WBEX3KG10
'SP37JVVV12HK12JWJXHJB0RK9DCKYJ0SPNFYVZTX8
'SPDB4MQQPEYY5QZBSE90KVETKVDYZVB38GQ7C3HE
'SP10336KQ0ETTQZDAMGR5ZPVVDXVAXE53P61MZ4HN
'SP33QG35TNN8VXJKDWK3EPDDTA57D2C30W2S4A94Y
'SP3ZNNBATHGXVFG2PDVMVBD6FFB68XNAASQWQ57WJ
'SP3HQ6X62QKGDD6AJETQ21T0S46KHN6NS4N1X04WP
'SP10P1D3277T9DXRN2D82R874V0NVFWMC5FPZB2G6
'SP10YMA2ZFX0VFD40GXHKS25HCPFWM1GG0ZPHV4AT
'SP135Q4A1W9HFT0ZW2VC4F0ER32EJAFX5ZME05JYW
'SP13YV2QVDTJYHFX5XPAW2DV3G7W7CW0B6DC9FJE6
'SP14G9V9YZSKKXQKP77Y2ZQEEZQNHJGPR4KE4V2EP
'SP16G96FFCV9HCYSRT343GSJF0N2PPPYK28XY89FE
'SP186NW1WRS3WKDXJCMQG0CMM5YX8HFCXATDR6Y40
'SP19SVK0XYQ9QWCMKSV9XYME2RY9M03FVJW2NNFSF
'SP19VGH79FCZ5JD6N35K4FDAD3WEWGKBVQK0V4Z4W
'SP1BDXBPHQK7PQCS420J9Q6MV3735ZDVDM75V3VJP
'SP1DX3BXAAH9ZSZ6EN6X6PFHXBP2VG9KZ3CXKTVTA
'SP1EP2YP941ESJ66FA1Y16C09QC0BFRG8MR0YZEEX
'SP1FQKMVRAYQFXATRVJ5ASRGCBXGAGQ2EY6D1D6FN
'SP1G04PVE84H313MMBKRCT13F830KYG38Q1YM1MWN
'SP1GVWTJS7SQ2VAY5GCJFEB5E89RS3S0S9VFZDFPH
'SP1JXCTVNY5F8X06N4H2YS49DXVSM3B8G9X7TVMGM
'SP1NPMXN4A9DBMNV0K2QT7NJPJ88QCJWR674H8P45
'SP1PAGYEDF35JACKPBBTDRYDTV84ZAT0FAMCC38V9
'SP1RBHQQ3K7QZ3TAS75FQDGVY5MKFRTBNNFXF0MM6
'SP1RFVTVPWH6FWJ9ZYSM7MQFDQSGYDX1KBBCWSZ1J
'SP1SVPFV0FACK5DD4D96D24EQTCMPK65Y902M0G61
'SP1V6C4NEKHNPQW2HAY4TAJNCAVHD5QYXGY4V9S8D
'SP1WAQE1JWZR15YS4HX2F6Y27YX6R2GPCSZQ2RCZ2
'SP1XXNJ0SY9DEA35R6SC6XEZAQCCRQEP1DEJCFF4W
'SP1YGKNM42QTKG6KD39WBMMJQ009B3F30KKC4QRYR
'SP1YJ6BS0MFB7HGS75VFR3KRNW7PCDFZ81X4T8JGM
'SP1ZDKV9MRTWSJ40DEHZN3NSCDKEQ44S0CSTT40HT
'SP1ZKN9MXJJ3ZAC1M064C0A68R9VX6N3GVGHPHD5N
'SP1ZMD16B6C87P802T1BQB6HQAETNRVHABHE104FD
'SP213BYCHYJ8BE7MQFT8GYNGMXK3QXCCRWH1AKGY2
'SP22JZ8VRKXBMEHK483WZVMK8EQV3S92QKJPZQJHV
'SP25862CKR2NSPB7D4S3633JWBM91NXWAERGHVX97
'SP266DAFYWQ16NGN0X7N0RDBS355F7G7BYFWMSQ9Y
'SP27YX86KJJENDP3KPFR9THAV70SZ3APTK0SNFTWW
'SP28AF06RQQPV53PCGWS8B13NR69P45T1CJNRNST0
'SP28Q6BEG9DJYAEMDG49GKEA32PS62FBC3YK11MJT
'SP28RPTJ6MXPBFPKW9EX9FQ7PBM9CXWCQWTRBN01N
'SP2944D80P2TQY1EY4E5RFWP3NZFGM3N6DEWPDTGX
'SP2ARXZ36B0VQEW35G0T37SZ918PSH5JH75KG5DEY
'SP2B38R5V65F3D3PPYH4YFC3VEN3QJ3C4G164RXMY
'SP2C8RSDYQ2SPK3X9CC8ENR6M2A02G50K9MYX7RT4
'SP2CBJGKA465HH9P3MYGV9W10NMQVPRVVP9RJRNV7
'SP2D1ZZCM9EQ3EKYVPHNAB3WZJF78V8KG45FF9V2C
'SP2FK7PV2821FR7KD2MB0Q33TNGTTE2H6DM9VQ7WZ
'SP2GRHMVQ80WC3F2TXZ3GX40Q20QTAED897HX16FP
'SP2HKMCK09Q2AZ48GWXJ11RM181W9G6WJJ72GKR13
'SP2J5FM339V8F55JWDS5Q52PYW38MQWM6331TW14E
'SP2KJETQ1Y4SGZ8B0TAG1Y75P9BRA6CDP2JJYCPQ1
'SP2MH9VE5D3HR6SBD51FSBSGV699HYB5X39S8QQNK
'SP2MJN39ESH3QGM91ZHQSJN4DAYF60XRXT7Y4139E
'SP2R3CHRAP1HE4M64X1NZXHZT41JG3XGNHJW4HX2W
'SP2RBGBQ1Y3F5TRMBZMBMKYDXX91B93N9R7VXHTFP
'SP2RCJW3ZTW71CF47Z2BNZT2YM1VNXEYXN6VSQ2BW
'SP2RNHHQDTHGHPEVX83291K4AQZVGWEJ7WCQQDA9R
'SP2VSGN50QSJFAGH301VS6YQMZB8EVZPKZ9DASRDR
'SP2VSNM0P4J6A5F1XYAVJEAKX3BQ4BQ8S0RC7SYCZ
'SP2W3YG1038W1JCN85Y00XNNJ62PZZEDGNHCKBCQZ
'SP2W4453M1WRZ8YKEM70VSRQW7WNTT3ZG476ZF3J7
'SP2WNDM6TNKZ8XAWGX9Y34A4FAAFJAP8D38N78EJK
'SP2XSEF3YS4DVTFB4XCWQ779V0G915WYWCXYE9GDY
'SP2Y9MWKH2EB21VPEQJ87ETR21TERXNZ9RXH51E6Z
'SP2YNK95R65N9Q6GVETX347NPM9Q36AT1WCGGT0HY
'SP2YXRSA50Z8YGPB9TGM24SDAMEA0AQ628SNFDV0J
))
(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))
)
)