;; 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
'SPB2VSAMSYZ905X2BZY2QZJ7RWA6ZXB43XPDF506
'SP1K4ZS9166B303BHA8VR7VA1YHTWFNSB5FNSY86V
'SP3MAKVCG6HD05PNKN5H39E2PSGXVYYNKSGSHYD1P
'SP3KY268NHG8XTZ317T12ME4JG2G5C8TPXQD9T3MG
'SP4JNHJB6B953T1S2GZTNYGJ3PZAHG12NFZY8GPF
'SP19G62NAW4VBC8RH863S3H56EES1BH59BF404KCQ
'SP3ZT277YNRCD7D0QJW8MP8BX9Z2WGZJXVP09G9BK
'SP27VQAZ9K7D0Z5PW9MWJ9T3VF2XSM7VTQ48QSVE4
'SP3JB3HSPM25VQ329PH1Q6SMKGKJJC8VK3E610J0X
'SP3HY81SNXYTWFJ9YHMNR8T1H0AS3ME97NBKGBQQ9
'SP3EBBKX8GHC76AD2WXFEWGEDF6W446EFQA1AD9BJ
'SPVCDZD61JRK28F0T44Q6QSGMN7TCRM4WYGJ50F7
'SP1BC0K0BBRXV29P3D1MDJA833NX9TD8288QRJNPY
'SP7Z2VP84H9GHJ16N1ME1NTVQ3RWD3S1S9Z66B3C
'SP19QRDX18QEK65NW69JEKSASKPRR01H06403JHVD
'SP117EHDBJ470HVNYN98QR7VQ7V8WQ1SSFDC3HQSG
'SP3EXXSTA958N2CEGS98FP1DV77PYY4XD5DMPKE2S
'SP1HNZG65014BHEN9THBXSKF50S7BAS8FKQ2DSRR1
'SP3ENAG8BCZWE9V8KZRRFB167J13G31YPP893V86P
'SP2H9Z97J0B3159H45ZFX6TVKS9RT3KVKDPGAHJC5
'SP3E5D57KZV19FWFXMBMH4Z49TN260Q3A3A1H8597
'SP21KY9H972KG9XP6VB0R5NT9B6KVTTJFAWVK3FV8
'SP24SG4PXFPZ237XEFN4WE6NN8ENNSKM4SSK65E7G
'SP24CBRGR1Q22W69DX95JAZQASH2GSVYJBM0G9NM8
'SP24ANEK96Y51TT99FBCG3PZKMESBQ5G4YZXK1T5K
'SP614AFNXAKK8355XEJZ8A7J7XM165YY68EG3PZF
'SP13KR3VARNT8EY78X8J802DVARQRKNSVTKP914PZ
'SP13JS1CS7ZZAM4BB1MXZNYTAAPFE40K4MTPC6M36
'SPM2D2C0TJY86544E4BVQYSAVSN7SVTT8XR5DXRW
'SP4GK64C73EP1PM96NZ2VKQSDQNCWFE995G8HXEV
'SP39Q6EHCN0VQARB8HMS0WWBSEJMFCF1QBEZ2Q5QP
'SP2Y7BAT6DE5JTQZZ7KTR3XHHBQJ7AQMNQFGKVRMW
'SP3VEXXB25S5P9YKM5CAM21R93EQWCG0T9NSWCE1P
'SPT80DSX0663XRE6297BX6MM62ZWM03TD4KKC5RK
'SP21X1GTS9PWQM812AXPK4779CNRPDDS9XF1N3VBS
'SPSCDBH36A1WCYHZ5V8HRH3D4R07JW92BRV1BEM4
'SP1G0EGYPGT7RQN2JJEQVPP1QRHZA5Y5HHY2CQX0F
'SP37NFPY587Q5NRFBZC66M7CG2625AHKQXQRVZQGT
'SP262CK3VPG6PDF4S96TTXFBVV9Y9Z75F51A6G83N
'SP21EBXKM12APCY7W1EH3EZZYXRJDKYKGFCTA5Q30
'SP220FQNRYX7SFR1FTK0N11402XV8Q7ZNKGAEVC96
'SP2132QWAA4V4KA8YHVHEPWP5096M57AW8FHVGN06
'SPQFACZ5KGYJH3XG8BDWW2VGGRBJ8BPFVEXEVC6M
'SP36G4GJX55CTGM4TJ2CY3V5S1G87524XQS67AM9
'SP368FS8694DQ2KEHS7YR74N8XJT9ZPEWQVKABNR0
'SP35M1A73CPENRFZ8XRWDJ7J4X7BVNM3V3QXTNFW0
'SP2061CHMH1Z4GS0KM1YHXMHQC9MT0538YT4KS51K
'SP205QRN3SVFSS23QD3SKM4AHZ3AHTVFFHPVN7W29
'SPR0VQTARXWQ11DX4XB90WA2KA1K5GBYE7X4RK2G
'SP3CCF8NBVHBJ3GC71H716FA7B78A1T5563KBA1NY
'SPCKB6TSWTF6EQFDDZ8CMJ49J81AKPCX6BANM7EJ
'SP1ZM7X6Z48884FGY426V00D8E6XPS5N8C4Y39J4E
'SP33K9XY95TBDWAVXTHE5JYBZ3Q07PV77W8SN2KJM
'SP1EYNYR0DJEFQAAB8RK1DR3WJ8R3E4DFCZWX6SD2
'SP1Z7XR8GX1WW2JJHZFS9W0C9SB84MNX6AA137KQD
'SP2VK90G11SH2PZS3EF7M0BWSXTSGDNY0CC625MEG
'SP1Z438DS26J9EP394A4HXSQ4S4P8626JD5H2DAGS
'SP32HV9B0E34458Q799G3J11C55J4R9WA8ZC6KFPJ
'SP1Y6J1Y0SZYFEM9NT3FQWTEKZDCDZ86RTQ4BG2T5
'SP3BKRX5K36TE7JV04QW5F8FERN24ATH0YNF6Q6NS
'SPGR2RGKPJ1AEMNW6N3SNF7WKTVP9KMY0G791KEK
'SP2Z2CBMGWB9MQZAF5Z8X56KS69XRV3SJF4WKJ7J9
'SP2Z1FQGG4BW74GVSS5K82Q9Y5BDM44RYZZG0ZHZ3
'SP16MTYWKHDC83HHKNYMP6TYP3N9FHBARNAF216HH
'SP4438976727GXWTD2RNH72KM9Z3ENTV0PKWFRDB
'SPX7YGNQF4WG0QDFE8R5CCM36NDSQ6SK9APJ3AA7
'SP2DEBWXXF7DNG6WGN395XG5R8J0M99BW4AYQ0QJ6
'SP3MZTR403FDX6M0EKTE5Y3SZXFT71CBWGDNGYE49
'SP2CR4WRKV2CFM028KP7H0SEQTD009RX76DTQNNV2
'SP35HE18EAF7A7YTHVAX7T67DY8TV7DHST9E2JY7S
'SP3T87QDPRRYB0BBAZ16MMG9BE2MKHAVNMJJSH9DT
'SP1G0NFYB7X76WXT78VRJ45H5V7JP9W0J4Q55X5XD
'SP2R4NHVH7B8ANRGKZMNH5CD6NZ1VPC6CBFPSWXMT
'SP3W0QZTSF0WK2B4X514Z2SRNHHDZ9N4C22GA2NPR
'SPK3P8E11MGWEN3HNY2T5W7MKNMDDF21WWHZ6FRB
'SP13CMK93PRMQSNCK2WN1DSBX80MQ5GKF4GNPD73V
'SP7594WNDZ1V593EEXSHFJV53E5M7G3NK1G7V5Q1
'SP2F10DRA21TTXSCR2B39KYV22D4EJQSYWWM391M0
'SPTV0PFHGRJSARM4N30AW9TJYYK82GCTMTQMKJ0Y
'SP7A10Y8GBTRBGYXZF02DJS9CWQY0T8BZRAHEASP
'SP20MFRJKMXAB8KZECJZ0CMDGNPYPH3GGEKAQ30PC
'SP3GEVG8CBXAPVBYKR20KYJ1MA206V3SDFD5W3YKH
'SP9FAJ3ZC3ZYD5PB6F8C6D8FN6WVXD8TV86T61RP
'SP3KSKWPGS0PYQ8VA027V5EDFJSDG5GG91QTNFDHV
'SP237V09675NR572ZEW9YM4F2PQWJ34KTGCNJKY30
'SP190Y2P7S16NTFMXPB9EM3RMJXE54M3ZX51S23G6
'SP312H61H5FE0SSCHCS2MYBAF5MRMT2CS3WV6XJ21
'SP61DHHNRWMF8NW1MFPYHR4HX4QA27VJF3Z44AF1
'SPHE498N8Y9G37XBQ2J4R977G4DD4E3NE7WE9M6J
'SP3H2G88TDZFJKZ0V6QSZ8PGT7P6QEECVKW1HRT1V
'SP1PJCJ3VRVZYF36DJE0SXX8DRR8D9CK7JNGM7V8C
'SP1MK5FPWENNA93414ST9TS5FTADHAM3VWZ3EDEK8
'SP2P6DCS5N32T9J92BG6YZQFNTJJ1YV34ZPS8CDR
'SP8X251X0GX2QJ1P2VP4MBREK9S22JW0CMP41G11
'SPW22ZQGDN9H5VVMZQ0DRFT26W8PQ8N0PWR89KXT
'SP3MMD4F9KAYJA8TYREJA44ZT9XH9FHQ33F3957J4
'SP33YEMAP9AHRJGW94BA04HXVJ7BHZKRCWGFFGAKD
'SP3CX7CDG41KH6WBNBQ25S7JX99K9RF6C71WR216Y
'SPZA8R3NW38689CTBWE8H4WSR4WY63Z03A3EYR4F
'SP2CV251XR42Q50W4ETTFS6SXRA61Y2GHJ96R99QN
'SP1ZBR3FWRCKWKYCCN8V3B5M1XBAJD2YKHK9WYQ38
'SP3D1M1G3PCVE9GNBPEV5TSSABPAMZGYC59Z1ZHEP
'SPRQ1YDKZ4WDA74D3SXYT6DT7GH7RWK1RG3EKBJA
'SP23JR19W7Z89TKN1ERZCRFQZ83MY4JR101G9VVRR
'SP34TZP8YBXF28GB0HHVE4HGDC7WK44AB975D884
'SP3M2SKAN6FDRWBRB89SN9GCY3DMAFBB0R44VM98H
'SP11Q1RRT6H0611ZKFWT30Z7KKE07STT1ARD5WMNG
'SPXWBMSJKDPJKNRHH4AYZRY1C0FA2H06VWTWR7Y5
'SP36JGJM16V6ET9R1W3F62YJH1PEZNXEGA2E7XM4G
'SP2N8E1205AWDP3YSKTHJBVQC7T4HKJK5BRRKM2RP
'SP1DGKS1BE1N1K21W1DB2PM0H9T9PZEXVN3SEWJKA
'SP1C7AJ04AKA9KAGB41MG2D6W37GYFEXV7R2PBSSJ
'SPYN819BJRTW5MTD6FRZRV3P5ZHVA1Q836DQ8EAZ
'SPCH1JNJHNBTRSHRWSCFTJ9Q4Y9KE8Z94DX5ME1P
'SP1BNF6VVD3PE2XEFMYPGVS21PE6CJBRTQ4PTGDFK
'SP3G64KN9RCX2JHSE158A6AF85R4CMD5Q48ZY41VN
'SP2FX3T8J2EMB5DTGB874TVQYBEFE516XESQ88GSE
'SPM7G7N741FQT0EXW9RVKPVJNV7AJFDVH6F2M14R
'SP28H1PQN5XG29DHRT5KA5HN345F0G3EDJMJW5D3S
'SP25WV6AW24VKXMZQNPQM71QCKXA8DEN4RAYN38S7
'SP1K026C1ZN65FG4WB96WPJSCJ44E2MFQQ33XYD67
'SP14TMQH37FXX0XG577R6D3426SPX1QT0KMEG0ZXJ
'SP18A9MPVEH76J27D364GJ8A4FX8NMJCQQB298V08
'SP1B91GFYNYWG1AH2V0RPVE0FRAK1ZXPQNR7JXD3Z
'SP1E2630AV1RBY3A3D56M2TPF6PH63MGBA1FJSY63
'SP1ERZZ0G7KERNCXQDJF4GTHCF8DGZB8001YCNPQG
'SP1GZJPD8HJTW37057NV5QMY8BQZM9JSFSFZV0N3S
'SP1HVXK0VHRRV376ZRZGRJAVRZHM7MYR0XS829B5Q
'SP1MJF36C9RF8C4NX5PYER5Q8H6ARGEFX12EGGPF9
'SP1PGB1T5KRNWZGDS1JEV7775HJMYBSEM2Z333Y8Y
'SP1PRGYNPTQ01FTWM5B9XMGTT66MEWCXQEW8X6WXG
'SP1VS1J5WVFPSN1G639JPYKA9SB6MVG2MJ045NB7D
'SP1YZE0WQ04T7BSFCSY85BG6S9Y7F95CGYEPPGJMT
'SP20E0RC1NWFVD6A2QC8Z4CTWK7X5FKFCB6M6P6W4
'SP21W0076Q2YTHW2VSHE2DTW5VY3AHNKK04MP1T2S
'SP2QED6YW7H6VMSN95T8BNWF3V47HB0XYVS1K8B3F
'SP2S1TR59CNE0M2SX31AS7SPS2YEKZRYVMKDCHSE1
'SP2YT55JGXDRM1XRBAKJ1H9HRY21G4XZERTJ6K6WC
'SP3K814YPR0S9GJWEA5T7ZH6NYMHC7H9QEZCQPQ8A
'SP3P78V4GQKAXZ31PYV7RBPYDTGPC1872EDES4WWC
'SP3SMVSB1DZSB0M4Q3BYS1G7GQVX0E2RPJ7ZDHV7A
'SP3WE89AGAEZK7GGN7RR32PRR5SEFPX392583R18Y
'SP3WZT8XA6Y70KEVKSN04962P7M3CFA15WNWQA9G8
'SP542R6HE0Z2891G08SSAWGGDMGGYFHX6JV6RBBC
'SP8J8NZDN88QPS1PBA85R474QYS590HPRP34TEWM
'SPDTRBQC8WCYERVWS1YCCT2VFM95EPYM7H41QHMN
'SPG34S51QV6YTZQGVRPZY9323MY4BTCFAFP1HR25
'SPKF8819YKH859G8V95K1AC4A8KH44DXGWJ2CTN6
'SPJ3N36QXJ7P4D20CT0F9K334YQPBWPDFFDQ654D
'SPSFQ68AE3NG4JGDWNJVWRMSEP7WT4DHEYWF5XJJ
'SPXEKQ9G4S71QPK6TAC6AC2FPNFWF9N12WNPB6G3
'SPCX4HVJ2MVQ8FPF2QXYR69GA8NS2F35EZSYP31A
'SPZS4EEFDP278N3BSBAAPHAVFBRXMK733D7AH0HC
'SP1XHZJ9QQGM8WQXK0BHMDE61XQG26NTTQRHZWKG3
'SP2DMRAE2SEJHFHQV18SEXZ2B027E0K2WYQ0TEQ7G
'SP3YWPQ29SZ3AXXRHZE0JBDBK75GBEY2AT94CPV21
'SP3QSR24WRN3PSA6K48HSNWVN4CGTBQJP5ZFCMKRH
'SP2GTAYZK314040CZJRDV743YTFEQD4SVM67S3D5G
'SP1XY0JXJW2EJN3XBAD0A3J58ZX9EDCMZVE8NMPEZ
'SP3YPQTG292EVZFY1B4DK9MSV43NQ84VJ4SZS4ZAT
'SPCY78T1G9JK64CDMB3E19NWGN82K9BWHQGA4FRZ
'SP33XF6CRYDVEDB8JXERJW9M22EF97W4YT9KF14R
'SP23SG8TKYP7NJVTVAT035HNHY3220KNVP617HPAJ
'SPKSE25B7H12D41G12VHC72JQC70BMWXBWBA7B50
'SPEB3YJGJ7AZ5RAEJCB0HPK0ACRECFT6KX9075EW
'SP17GF6D61MD891SPDBFK50323PPHBK96F3PJ591Z
'SP265Q64DCN3G52EZRWP95AKNKNMZ7C8DPSJ94G3M
'SP2YBGJA4P3KXFR73VE9WNM4GEJEHG93EYW2JT80Y
'SPJH1HWAXHV87ME61AJW8CSPNP9K3GJ61E6WJ6ER
'SP2MQ1DFVZRWH582NGHPRBRPEGBE15JP4XMAQEQ5R
'SP32P38F0SNN42R5B80PSZE97A635F2C91V76QAYY
'SPXM2HC3Z9TG1JJMDYN5892X3DM2ERQ77KF4QPGT
'SP22DRQF5M56JNB7PE10RGKFPDZ5FE30ZX5Y2KG7B
'SP1106AS2Q0148C7CN7SJQQAEGHHNB0NTFMG5Z8KX
'SP2NAXBVMV3J3AZ6J2J5DJGZBEHR6WN8BRTE1NX94
'SPVQNMP85PYRQAA2SN99P78PERX7YXEMXGSD3XJP
'SP1MRXHBP09CQZRGDTXREA4PJZRG9T9VG1HNXBVAW
'SP1R0BP36MM2J9QQ3MQ9KV1BN2JFG3XRC04GK933B
'SP9Y9NXC0Y96DKBMPAEY1JT18Y8650NC8HG9P856
'SP3NJ34KE66TG9RK6BRHF2VK4HHGEM09F2XBAVXPC
'SP7KF7ZQDA44PYJ9H7G4A7P3E85KWVZFT7JH8136
'SP1BF5FG7HNWG6MW4WB3ZVMW82A6KWN9RK630DVHQ
'SP2ZRG13N2AFC85CS83TTRP639GXAS9P8GHJVAX8G
'SP1BFRC0ETCMBN7RXV5ESVH32F3TJYTAVE5P9NVGX
'SP1CE58QFH30RK0P1GGGH6YGZXFA49GCE6J3V8PB5
'SP1G5266V59X2QVE28X4ZW5V277XJ4CFYKB17BCYR
'SP1JY2AQ7WPJD59T2JXRPH0GTTXEAJ0X8KT0413ZN
'SP1KZJYCKYGJN1638GJ1THK89B31GBHWEABQ0Q7EV
'SP1N37X28QF55WF5AYRCSF1XMV1MD1HCR82Q814W1
'SP2322QZG9F5AJ7FS5X0DDDJ7PGECQSDZQY957S4Q
'SP238X3JD22HJBMWR8E7CKTF4JCBQ73BG9YS1DBH8
'SP2BXDA360XNV8WQEYC40HBEJSY4WCHCXD4WJH0SS
'SP2CNFTZG44C2ED4ZEP1V3XYVD5SHWNEZ4RJFMTMV
'SP2YXE9Y2H3286HP9V4B2QNF44H04422R2GC52BYF
'SP38KV0FD0REEMRSVRVR98C60303B0JYNF0JV69H5
'SP38YQFNSVJRG2V54TAD4M293SPJ560JWSWMRK4VY
'SP1VKEGWAME6CYW8QX4D7QT9KR31H92XB4YW34WS7
'SP23V5T4XVPPS51YXHGBSFD1ST2R3X46X9GSPGZN2
'SP1Z4XMH3FR8V52GS7SXEV7A7HFJ0KFWWAT6ZC57J
'SPYMDHNYE8TXYCSWDMWYR6WNCFNGQGETZZFPJAFA
))
(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))
)
)