;; 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
'SP2F74K4NXDEKWH739744MC6BGH0M99Z02RHTHE84
'SP1P6D5YNBWJG4D0SGQAE4F1BMD7TM2QJ0DKJC4WV
'SP3J0GTQ7YH59P1CMJVBXHKZRKCAQVEJ8C6Z20NK2
'SP3GNHK7M30R8TYCWDPGRS5XBHGE0KDR71EMVTHK5
'SP2XDSVCZRGQZE8SSPYSET47QS1EQ7Y557X8XYZYR
'SPW2Z7F1AVPFCR5ECZTSS9SHHJ44VMP2YYYKW19M
'SP1N6T6JZFD8CWDP76BMVR7MCF1AHXA4EGC87F2DP
'SP1N3WKPS7PQKD837CTGSWEQ8QXTK061CHH2CKM3J
'SP1N2NTQANFA9RMCJY1PH26ZNB1QKNSRM8RDTJ87A
'SPHVR2GVVJ4DZBMAZMJ40VCYYWYY3N0NM7Y7ATK6
'SP271N4269J9GKA8GN4R0BBD35ZGKJF9XAQCTNF0F
'SP3F719NG3WWCMD5HK0HDWJKNC7SJT7NVCBTN895T
'SP3F7B21T0T3XR3DWQJD0YFEAQ82WTZ25YYBNTKPH
'SP3F287FKZM88HN3W1QEWR7GG8YMECV7A4EKDCQGP
'SP5TXV59MPMDRQKRC4E6TD9FTW2SVG3DRNTKP6G4
'SPFYP975AXQ1T05VZ9VJ3RRNRNHXJ70SZJ96PS59
'SP1D5MFT868MW6RMW95GDPE943Z83FMNJXN6DZ4RT
'SP85BBSRQXDYV7VRCH074DXZFZTSXC3D73BD707J
'SPHNA9C3V8SK7JN5E9VY11FDJSDVB3DCQ9HZJT9V
'SP2C77FVS56N5YKFPR7PSDE4S9Y3ARJR289HDWJBR
'SPYXRTPK9XVMME9Q5F1255N84NNRVZJZ5B9CCT7Z
'SP1M26JGHGZKGSTGMABA6HJH97DCN8ASVBP0SRF82
'SP1KX4GB9Y57Z2G00NVQWMX4CNVDSQ9HQJSJ7EM1D
'SP3DK8ZSPFM7DY1R9QV52THJ4FHYJCWH3JBK0KFYV
'SP2B2KZ5HBR93G2C28KP96C21VAKAM22VP2D95A15
'SP2AA3RQQ8R98CZER4J1SMCSG879A4KM3WH3PM1KW
'SP28ADSCPCT4FF6SJQA5MZJXA1GRBWBKNAZK6X7ES
'SP191JH2V41GWTP668DGPZ6XZ611RHX2RXF2Z4RCW
'SP3D16S6RS6667WTZF0CY3ZF07ERVWRK1K721RGDC
'SP3AFEAQH36WAMHFD8F85Q40DP9EDNKACFWWHV1Y9
'SP1H3DY1527FGNZCN1VTAKWZQK8EW7A91V0B4E1Q3
'SP24M0BHJZRZW8ACE5WEECWYDGH6RD3TZTK1D9ABZ
'SP3SPBHEFP4M6AAQM16WF8YCXDP01RSN1J6QKZ16X
'SPF9HDW15CMN9JSFJ2Y1PHWANZ5T4HT1F0ZN4JE8
'SP3SDC5MPVKRJ6Z94W7WJQBTSJPTGY4BH76MCBH3P
'SP3SDZ9WKEDX6WT8BKMY80SM37VD6QKGQH9GP5CD
'SP3WH6CQNSPDG5Y7MN5CWKVDNEX3CN4QGHH1PM0JB
'SP21TMS2PXRAAKH1D6GDZ9KD1JYJW7SXX54XHJ1AS
'SP17Y3F4K7MTJH4724RMTZFZ2V15AJFWGJSAJP2YZ
'SP1AG1HVRS0K35EJTC62SSME661NFN4KE57D1V1BS
'SP2D5R9SPRMM2E0VQ6DVN331Z2H3N7KEG3EGY50RF
'SP1FTHMG0MTJ278RX4VY2FR21QNVB46AAV02Y62S8
'SP1FCPT26X5HP0MNHMYD3GBSZANAKGMFZH816W2TM
'SP16WTV666FQD1VBJZZJ4JBTF2RQBSH7RWSS3TQKN
'SPZX3MBQWPXK25RCEMB1ANBC1XB64DH63242241Y
'SP1EPGQFF64GK4C262XVVCF90XTRMND9C8ZXR7DG4
'SPNWGMRAPKWZVWZPKW0T0NM9KVGY76SK6NZX40RC
'SP360Y4M1AWDEYS872AN3DDX28FQ023ZMBHZBQ1B2
'SP3RRNXXXWTX6DQVA1QGR7A99T0063NK6Z85RQPWC
'SP12C716DMJEPP4QQG92S0J7ETSXVN8WDYNDYNKRP
'SPZ7AFCNK9W555F7PWP20AJZ8WH70V2JTZQHT1M8
'SP1X9DEARN1E0NANBWP336AR081YHCQYV133GP1W9
'SP1E8ESFXFC264W9JVP6XNQAC93R7FQEG9X5R2C6M
'SP1E2KMT1DSKZ3CVRWG9470N5TZFFGZBQZAKYWVZH
'SPY446J8MNKYN53CCBP8ZSM48FZJQ702XPGR4V8Q
'SP16HXWHTZEHHKBE12AB91PYJ63V0S696G3MZZM8K
'SPH3F1C379BKG5X7YXQEZJD215NG1C2SGHA185V6
'SP3Z62XNETXWJH4Y2S2GBYQEHGTJNBMRGCMW3S8ZM
'SPM88TP159BBAZTWV3C7YQP7FSPN2EBBH5XSW796
'SPZ4BE75SQD2WWM1J4K6QFAXXKK0S39GGBXAQVYV
'SP1RNRWWNY052GAT7B3E8S3TWM7D7MRP6HPEDF215
'SP2VSRZN573WMBX03S1R3HJC7DYMKD9GPFXKN922
'SP32WAC5Z5TJB57GVFWYWD0R46MKVBKR3RG8GKQNH
'SP32Q82EW7954FKDFHWQZBXHBV8H3Q5FC07FNFY4S
'SP2FJ43QM87477ABE2VT6JN4TT1W88GS11PBEXS22
'SP3QCFG648F559ZN1EXP5DA7CEWD9HWQQ9YZKG08B
'SP1T6YAEGDDHV4N7M6HMQZA8QDQ6P7ZT8KY33QE1R
'SPHVSSJYR7ZXPTDCN0AP8G13RJCK9SE1RX946TTJ
'SP2B9C909MV81T1HT9QZW7J1K93529GNRADX3D7Z0
'SP10RE0D991JAEWTBNH952ANSCCY6H80VSEAFGMJH
'SP3T0AZH1GQNGD4SDF8RS7NTQ1BEJ029WRW0196G5
'SPR6003AKS34MYZ8D8VB3CH86GMGSNPVVH14X16F
'SP1V1531A9FZ4ZF802THWJNN79HX8JXBMTR4KMSD0
'SP3NPJ5Q23SJN5PJQ1JRHQ06QE6KM3NJGXSCG3XAH
'SP35ESMWXVXAKPSKGBQEZY8DJE96E7R9WTGB8MK3W
'SP2ZPKZXBX0RSN6KTT2DGCCDAPC9XTXDEQ9HZD3GY
'SP38CX2085Q0QA95XQ2CGXPBXCXMEJYYKYHJ1JSJX
'SP1VGZCXXDV14RAKJPZK0Z1JETM64EGWBPMNJ7CF4
'SP6MT0E6YGHY6SMSWHB9J4YEXX7RQCSK2BHYS1RA
'SP1C4QNQRQA4DRTYZ3VQ2KVE2SZP4N6SM1HAJZTVT
'SP133X40X37GV1AXAH80ESGK2QFTJGMGX8RAZXTAD
'SP2HX7KD2NRXXXTB2AKYGEJD7A817ARC06H1P1CV0
'SP1DNDZ9B3V9P3CZMV15MPD71VDPA4VYEKM1XCP2A
'SP3VNB48X3YC9KM0NVNM205KFNP0R3HBS9JG6Y3JS
'SP2Z88KHPRY9ECF9EZWS957A9TYTNGD65EMF2W02G
'SP04FZTETK9DH5VY5QKABMP1NYCYW40FYBSANGRS
'SP2KY125GEXKEYR8HYQZH2CXMKVF0NNER58RVZETS
'SP3TQVCQZ0VQ2NNNSWV32XVH6FH0H9W7C1NBTA7E6
'SP1D9BFXBVN91SAQHV5W6MD7KW71DMTHV7E9TJ8XE
'SP1MW00D3WGJA1MA11Q3FS0VSRHBPQHV4JCKV7VWQ
'SP34BJ5NCDJ8NF33WTNB3QHPHW4R7W7CZYMXBK3S5
'SPTD2JJTYZDNNGGQ67E895943SD2RQ47WEHDE3R6
'SP1EE4ZH41R8Y0JESV502WCNGBPH1E4P69XER7YA2
'SP1QF33CQESD5K623HDG9CW19SBDRTW17N13WGXVR
'SP3ZZBA4SQ2V4QCWKKNZZ3QXT02C0ZJAHSVDQXV3X
'SP75PFD3Q5KK9RRB32F096AYPYKXBAB4BQJ2DVPH
'SP8SDGX50SA3NTVDPZMWK4DYKSH3SS0EPHY6Q17P
'SPMHQGEV4YTPGA4MMSY3FCDR4PW0SNKKHTKEK275
'SPTPG73383K7YBGP6AE0CZ2S2F1AX9K2D0A1WEAR
'SPXMY8G7ESYM3YFNBHQVKG0MN9EMBGQY4NGEHNKP
'SPG68GXC7ZFEW8GGDGX1Z3K5XWABX89CERGDAASE
'SP3P0B73CPJ459CECG0N3BY4HTTP7AT9R6EQMQCND
'SPX6WNZQG74TA7WMMZ2F3CB1ZQS9H2WNMK49S171
'SP3EC5S8AZJ5FS2KB4909DDQTXXHN8QBKP8XKK8S
'SPHZ0SX0EVRKD4N07NFDFD50TQAB9VVWTAGAG2J6
'SP2N4MM40HBAPCW941J08S9ZRMD5FQ4FSJZN49PMP
'SP1MD5Z9G1RQMBW33RZ5BEM6FZ2PK77QGPZQQGJM4
'SP31VYGJAYAMMEJMGCWZEX1B0ASD33CFV0H7AD80X
'SP3ZF8D73XYDPHPM9VYTE46BGHZBHANMQXHD93TP
'SPP0BNXWZY33VKK092A46RTADA1WA614BV5Z7RN
'SP207P8M3AT8VPBB9X0KVEW3P5TBY7909FT2BB024
'SP7H6D052RB609S8MZB6K45H8WP6VFMFARS2TE3R
'SP1HSXBJK7BPNN7682SWTJ0FRH76RCR5RG6KT13QH
'SP2M4MDZ0HR9R9W8XQB9ZN2PHMY5PYXN40R99R0YW
'SP3Q3AZ3FRJTE8BXBBS401Z6K33V6XCY2K8VX1MNF
'SP3CS6584WD0N8EWFFWBA9SGHZ3519TJAXCPADBZH
'SP3SWQ637TMXJ8VKKVAQT4HRM03TH8FPD2YQX1NRQ
'SP3VV3HAGYZ1M63NBEDF8XJZP5M6SDH0YTJPQV8K4
'SP3WVFYQRS36RD76RMECFRVCM3ND8H782QQM8WSHE
'SP6D7BERVXVBNHK880Q5543PGFHDRE5YC6MVGY8R
'SP2R1Q1V7C34MXBEMHWVM7EMA094HZ44R8KWZHTQ8
'SP26XRG2856J98YT396VQKFGC191C6FJTR4P9J4CX
'SP3M9H338NVTBDYZD4KKWK67AR87ATZ3F9PQ0BH9T
'SPN4YRA8KYEAB6ERBPA8ETZE8EM69XPVNE498FZX
'SP2JTKE7NQK8K2VDJK3DYENP5JFNWZNCAGFYJX91P
'SP3VG6JMZM32APH422BM7FWVZ712H27G73V4HNPHM
'SP20VF9ZM3GSHPZ1D41E1DDQVCPAGCHJ2AEP2NQX2
'SPQ90DBD0X0R536RJP4TAG447KA49SAHCDSRV7ZY
'SP18ANYWBRS3X0EVR9H3TND35ZA7HG68MXB0FE9YB
'SP233W0XEJNNJ267Z5Y3X1HEYCQWE27PMR8QD7HNG
'SP1W6TJS9BA6GDZSF7JVBV5X913NX5GM6K1A8HSCR
'SP1DP71GK5Q9KZX33YPBNRAYS34B4N8PNQVFMBHR8
'SP3ASJ1Z2BB5AJ0BEN3GDRFPN58QGVAYJG04YYJCV
'SP10D4ZCFY7K94W0AHBQPD1MV662FAY7CRWM40VM3
'SP1FVJX270V99Y90KN7DXAC9B6C8S3N8MSNF8HQSK
'SP1GNWSAKFDWWRXCTMQTH7BSRDXRRPQTMJ02ZQE38
'SP1KK48MNE8XV14V5GJ9W67GN92JDB645D8M1DZ9N
'SP1TB1TCQE6VRCC4R05EPJN79Y0NMTRDAPAPF4MSN
'SP24RW51MKAV6XRZ1JSMRYZTKDRE1FJZ5DNWCMXJ5
'SP264TJ7XX9PAKYW258PFSVJBCBKPZ1CA6VP6NYG9
'SP2DY2NYB5V051DHG584H2Z7EE4C87462WZ4EN83X
'SP2FYEEZAJC16BTM745J580MVZ0KSBNMMKM7YF9WH
'SP2GMJX06XX3JV83QSARC62954MFHCGD2EBSSTH02
'SP2H79ZXPY61HWKKRRYSR2837ESP13JJG15XDJJCW
'SP2HVDP8H3KVNKFHQBC2R2Y38XQEDXRPSA3YPBN5F
'SP2KST3SKBKWHA6T8JW71HVEXA313S40Q0WCJ2SQB
'SP2MV2YYRABTMK176E2CSJP1R3CVC7MS4HCN799T1
'SP2QKE471WK6AVZTGFD5291SN7JWP53MMJZHE79F3
'SP2SBY1KGYMKJM67TBF2KV954B9GCJ9EXBFNW03XC
'SP36RRSENMT3ZVEET671N47N39SDB8KR6FBYWF1J7
'SP384PHPGAYKGX3Z8A3MKHT6M9TNHNPA12YRSXCA7
'SP3ASKFRKP14M5ZMJ9PZBT4B4ARE3GR2S3TGBHY6C
'SP3EHQXZK6SV1XRP95RNHR74RBXZ9YCAN8YZC4AWA
'SP3JB7V457QQEH3MQWPCQ5F9ZYDKEPP9A1H4XNJBD
'SP3QRF4BCN0ZRXXJKSWTQ8YRSKE4BTSRRMS8AAKQB
'SP4BNY9S21K27PECD9BS84SY5QEQQXYW3526DN2F
'SPBER0PH8RPTNDAWT6AP3BRD9TGNBAGJ5YTPHB9B
'SPQ2MTQJZ660XT1KWNPP2S4WFD50FJWX4EVPEW9Z
'SPQM83A4TREYYPNR1RVD2TQ9TNZV75FJA3914581
'SP36C0SC6Y0Y5EJWR51NDGKWQSQSV1H5DT3RB9K1G
'SPN4GPJD3Y77XQFP24X6HG6PPZ3D9KPS9HD70SGT
'SP2TWNS55C53YZX825GS8VMR82BKA74ZRCEJ0EGWG
'SP29H22PF2HCAATNVEQ2XE41JNP631K815FZTW3WG
'SP66WADE2BVYANA3BNV21WCKVFJ9M74B4FQ4XR0Y
'SP29FMP95ARK77B4ASZ2E73A0RZXCZ3VY91TYBE9C
'SP3XJVSABQTYGVAYP73F5GEDSJWP8PNKT58ERKN63
'SP1Z5T9XEYPWCTBVS8Y5RNFHVY9YSK62V9MM61C7M
'SP28N47Q9924TRD48XGR2QV878JNFSSPWBD37RQBG
'SP3E9TC7XP97XJC1T3NW92T8F4J3PR17HHFMSWJG6
'SP2NY428JH2MV60VMTNGPZAKVGA4W1ZWQQGGNX7NZ
'SP15WH82JXA7FFE3D3M615JBZ9TWG1SAYWSG7W6GG
'SP116VDRZ7F80VB00AKY2ZDSVFD1ACZ4E0CPTEAEN
'SP17AEHKGX440VESW7DNNEYK49GNT6YBZ4K636J35
'SP17Y28N48QABS6CXCRTKRHGDR11T2BF5HBFZY5FQ
'SP2PHMA1MTGQXG5DV6G61AW7GHRZH946RR54BK4FG
'SP28P2GV5P6W39T06NAS0DXGM27B7BBFB1QWW70J0
'SP28T85YPGYD2BYBW5E0QSH02VQXVARD83V9KA47Q
'SP1R8DXMHZDRCCBV8R58X616XH8YQZD17V6VHCWQM
'SP2PWEJ8EECS3RMK7T66JER47KQ2K8DBME0DTPR2Z
'SP2VP81TMS6RNYZ01HYS013FAKH7ZK1KJC9S8MME5
'SP3W7Z4H0F0NW0RFNBD7YHEPD1J7WAHZYBDB5D2TQ
'SP19SG86QVK67VJ37D500TZJ4730ADNYVJKP3M11G
'SP2HER9FS9TAH93ENW0PC6JZR27WN5HT8R94GJTRR
'SP12D8N1E31J14YQHH5W00S40M91BYVQW0M52CDG9
'SP9RWTXYJ53K9CX4WTVC7R96NT81QPTRNW7T9RN6
'SP3WZWWMGM03Z7B1AKG6YNE0KHAWN781D0TWA0HFD
'SP3R1J5R4YHV44P9PWZMWFHDDTP7816PG9H37M432
'SPZ9944R9FKRW6PFGKF9QFGESY651CX4PQ1NMZ0T
'SP21311YEMRK2N5RNZ0WBAVZQE1R7YYWK86C80JVF
'SPF4JSWSV021QBYAN4PQPJ589MNXYPK98J59VTGH
'SP2A190E9GBNHZVRY9PP2Z5Y3ZTEE3ZBH36TZGEWZ
'SP2SH9D76JJH8EYA4H0D6XCF62N80JBGQTJVZP73V
'SP2TMTEJA8151A90NH1J2QFV3YEBGCMPF83N1D2Z2
'SP3VM8F6FKS3810M3NVE6GZ937BJXZGMVKZPVT1E2
'SP2REHQPEX28EVKPC0BTKXAG8ZFAYCD8CEQN9PY35
'SPMZ912TEK2P15E8Q9W1W33QN793XR7XVDYY4R8H
'SP200BSQD9ACKTAW4Y4HC1F5FA6DRG2F93277X7S2
'SP11ZPTQFFW5QF3NYSJ4JYJKNA638JNTKFQAV60BP
'SP12B7RSNHFJPWSMJJAQ6M2H2J35RNFN3BMBVS52C
'SP14H5EYG1980JTS4GS060TXTMG5C47A3B0TJCJGN
))
(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))
)
)