;; 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
'SPJG013EY7YRJRZZXBE6VBR5KJ5Q6ZNVTDSGHBJJ
'SP1XGQNEBDY7EYAY7KYNG1R3EAKECR2QNED7TNS02
'SP3YKKE23MAQA1CSQJGWXBKYXMVGGH3G6AYHHBXHR
'SP3E2Y6B0NT0JGCT45S7AJVV2XXTHYSZ53P9QWCM
'SP3WWBGPYWTAY35ECC6N37JMRMSWF50V0HNTV7R7Y
'SP8A85JKWM678B987NMST7XDK33Z1K2WDEWB5SP2
'SPX02KFCK6BFWKADP9N0J4ZMTPEFV7S4X0V9ZFPD
'SP1V778605Z806ZDHB12D2RG04W3SXF30S82TSW9A
'SP23Q62WKQ2476E6DPBX1DSA9027WY1G2Y7MW32FE
'SP2C6HFKAGXTZN9F253CP8MQRCKXSDTDMQSBAADKZ
'SP3M6D6M2BS7FNEFV111ZF6WQYATNJZ89Q7MXSPAE
'SP2X34MVZGQRNBG7S5AT1S44XXA47WVEMTH98CQYN
'SP1W8C25TZCXDQTAR7MZQPSNF8C73274DCNT2NWJZ
'SP19RMCXH8EW32FGXE0706RA02QX7QDQ323XJ2PT2
'SP15YJCPW4APZM7C0KDGJN3DC5YH3EQQ4877F46AP
'SP3BSWJTYBDJGDGZ54T4T0NMBGQ6BBFZCWD44VMH9
'SP291QXNFRNAVGYR8PEAEJMV9G55161E6NJVPM1BG
'SP23DZ9XYT3YNF70MHAV9Y3622H8B3DX10WMWT2T9
'SP1ZJW1V01F36YRTFY4NQA8E497VK1YB89VM5Z7FX
'SP1WQHWG7T67Y314SG8FKQY7YX7TVYN5EFYQE3JW2
'SP1C79G23QWMW0M3ZRZM4H24X6WBT6SKN1ZZ3F2V8
'SP20X9NZTQRRAEZBZ8XZX4CS7RKSEFHZYZMXMW20Z
'SPT9EK4RGYKE8DENB1RRS7NE4BW2RBSM2NQCJ40K
'SP3722W4GQSW60QPPC9VRMMANGNHQCP07BCPF2FTB
'SPQZ94RC1JB4YQYDD17WSH397G83RP21G8Z9CHSM
'SP1V60JNK9RD612ZZDGSNFM0ANZYAC19Z6CJJZ4A5
'SPJ1GXDF8SZQZN96EQTC07Q78DS2DTKGD3JT6NHF
'SP32Z3S3C4N1GZSE3V4HHGM2ZT2B3J2K0W7M50EVP
'SPC9YQ34Q1XCCC7XPRZ5CB2XF22JV3WNM7BMMARD
'SPZHCRB6K4FR6Z2NB6QEAWB7WCADB8V32VMRMYQH
'SP1S2XG2DERE2G1YDHQBD0NV2E3WTXEZQGW4J2DX3
'SP282JF15RQMYAYB9QP9PKHMDCXEZHXW4HNG8AQ78
'SP2HG965STSHPXKJE033E810RZFHGC63NY484YRD5
'SPNW8J1RQDR8H5TYMME1272ZT5NEA059BDYFE0Y2
'SP3RRF8NB4PWFT7ND3JZEX3V8V4D6YZFTFQYD2AZS
'SP3H8HMSYD872A0E1871V8167BHQAKHER7806E4N7
'SPZ2K176BZMRXR66N57336FXXEDNQQEE7SSA7G7Y
'SP2BDQVAS3S4QX1NAE1T23NJAV43PGBSRB9TVXXN1
'SP2SXJPXDKKN424FR172N5KG6K32ZCZ8M7HFW59B1
'SP3A4VF4SZ529HXAQD9F5B07K4YQE36ESR82M92Z0
'SP3ESS7HBVRSR6V40V21HQWD7S3T87VQZQVSXN3S2
'SP2SJZMDHHG2F2FFBB0FQ9YYCD6XMX409HRXVNREQ
'SP1N26MSCEMXFH0S7P8WHHTGP4T2APF64W402KDGW
'SP2WR4NMZP7T3CSD82DNZHJ0S3HTW9G613TG95MR
'SP88T9ZPQ2B8VECHWE7GA1H6YFYG3013F2PMTT78
'SPYK333RF00HJN5X7AS18Z0WZ0AQAF5Y53QGN5K5
'SP1F45VQ6M771TKXCY4KM1T62A4TC4TVRTKVCGWRM
'SP17E3Z59RVZDQSMMDVQHYBT156SM5GX3ZFC35MWZ
'SP6VCC91ZYYJ21MS4HG40HGC7QJ9AZ8QC1PK6FVD
'SP2YB5404TE2VSQ65SJF1K56RCA8YZPVFFWNPV444
'SP3HNAHDP23DDC4589STTSDYZA3CPYJ84R872D086
'SPYFA5Z7CYTEXCGDRG87Y2JCVXQTZB24HNRZ7FSW
'SP3ZJF89QRQW466932PHMQ2Q65MMK1EHKPJA2M9DT
'SP2RJRBMJQ09GEMZ0255ACY089A30CEB5ED8AWDB6
'SP3ZBFE2H8D4MD1409C45NWKYQ3CFNFX4CAENX8W5
'SPYD3HVFASAPF4N9WF45PRF5FPN0C67F2F4BK7Z1
'SP21VM88VH4R9KPWV39MA2J1B2ZB314GS2XF1J0PS
'SPQRVXMG41C7K6ZG0PY06BBTS3JPET2Y8H31JE9Z
'SP16DSDFTK2YV8Y4NMAC8CFWNBP0QWBJ16Z4DPPYK
'SP1843KM1SPSMM8MHE4YFDFKFNKC8FFK8BTM47W1X
'SP1TBPNTWGGCTRCCB9H8C44TWXBYVBVE2DK1WV8NT
'SP3T8XVBX10T72WB2E41ZTS5NCY85WC6YMWR2QA6K
'SPYD9TX0D82S6K7K0S5F51DN2H1GZ0S5B45QCJT8
'SP8B2K22BQ5KKXDYDZ0C4KMVDA1BV61QGSSBBK99
'SP18TSFXQ1GNX53ZTPNFKH0EXJ4SDMQG9XC2VKV0C
'SP32FBR7CVXA13N61PHGXGJGXPADT8ADYWNH1CZSJ
'SP2QJBRQWAQ96BAPZAMGGEYC35D4X5JKRVNNWGBNE
'SP25W2FB3W83932QXRDCH2CN7SF1V2YX5EBHBG9XG
'SP1D49J1N5ZRR1HHKY0TZ7GPAYWTHTMS9HKDBESQ7
'SP3XC5VKX238MJTBWME5PDK3WYT4E5B02XGP08XSR
'SPNGWXBGMWGERHDN67B7YKMESD7ZMDG8XVJDY8M1
'SP2FHCGY2ZQVZAJK1F87BBT49EX49XC3ZPBSKPV24
'SP3G7MEN3SYQPN55HSK3F36GTA5NP7BT561W2PW9J
'SP19XDCPCAPTJ7V11Y8678ZFT4XD2K932FWJ4ESG2
'SP1R82ZGYP29HBC7DGTT0ES80VKE1FPNW45CTZWR3
'SP1VVWMVY7YCM5Y5DJKJNDYX4PVKJD6FQ2K1VJ6JB
'SP31ZA4DFKMX57WB4J3HBTGSF91KFJM1Y3MRE8ZJ2
'SP37V30X7F9AZ3088R3SCPEHAS8YMYKHYSB736WQF
'SP3VN8Q96A5ANAHJZ12RHXPHKTP65DWT8RRGCTYZC
'SP3T18Q8R8D06WERE5VEQBR1VY7H3QTRDXB01PTKS
'SPZD3EE1M7YMH3RCKNQE1CGPA4VDTGMDCT2QWGQN
'SP3T89EBCXSN6P1B7EQJP0CFQ5CX6JRA4FDP107DC
'SP2W8K8A9X5X25TK75ZZ5YMG0BFVYVVH33PX1T5MP
'SP2ZB8V4D49XKDJ28XH5M2EEEFT2KV05JDQ3ZC23H
'SP3P3X2P13K8HMVBJMJ0V3FJ0MY1JXDZY5H99E74T
'SP14P45C5MKPWM822FTZ0RXX2S5H9NGJVWX3GZ3AH
'SP1FKNNAKV8FJ93YW9W3XWPV0RT385V3ZEX8VJE0E
'SP3KN25CSY2SMR2FF5NC3J9ZYW0W81HJ8KH7MVQF
'SP3R460A0B4E5K7AETMMBSPMVMYQGJCSPK302MGRN
'SPWYNGMZGAJ596MQPE74S4X6HJE24C96ZN6W9N0V
'SPX7FMVKKE7QB1CE2NY5JVZWQW7VSENXR1ENSND5
'SP9K1JQAF7STSXBK0J5T53FRTP04TT5MFFGPQ1WS
'SP15PDXH4MEW0NZX7P8NM4K1M81E5CRFH705VBCG6
'SP2Q6Y1JP3T1C3P6A4PCWFW0HMYAM3Z4PTBYMFKY5
'SP1E8JZPGCVYTCJDME43XYNYPSHZ78W65BSQ9FCQP
'SP39PXRDW3RKZ6038CT63W34TY77FJKRYF1SF8NHF
'SP115A1AMMJ9CTXXC0FQJS1WTB124ZBNJQ6CJY1R
'SP2AY8D2BH3YVYGQRVENGP1WPDC1MGA3VNND0C5GW
'SP3VX6C9XF4QHY78WZPBW0FHKBPEXKWRHJ60SEKGN
'SPTX1Z32NHWNZ9FB92XXS633MM3CAP3A6N30T4K5
'SPTF6YWTW5FRNQW2RP913HHGBS26XF35941AXHJJ
'SP1TDYWNEAFT35RSM6KB31FTCQDNP8BRKA0WSPDKA
'SP2904Y89DA71T1CR77QVFG1Q3SNHWZYSPVKXJZW5
'SPN8V8MA8B992M18JCAT8G34PWMY0H5GKXC8HPPN
'SPCGJT66SJ314GME2JRCZKTQ5KABKCJCH9HPS92H
'SPYNJD9EJG7YP4ZN686X5R0ZVPDG41Q19NXGN8V9
'SP3R3X5M1H1WR8K2H3D82PTYAJ8S3K8QS36K16TCT
'SP3A09H1JEB4F85FZ6XEXRSZA210SC6RB7Q7V7DAF
'SP3DCJW90R7SGRH00QJTG47E64H0C3RCDHFDECMY5
'SP3FBRHG1JPG7F9Y88PPDQNB0Q148W2NG1GM2YY65
'SPDV1ARFK48D1JFXDRT0514NKX2Z76GQAA9EAQJN
'SP1BX43ZN1KC0D141MB4520X3864JCJA4KFCJTGFW
'SP2QJNK08YJRQKXGN09QTGDCGA5C34ARVJ33626PY
'SPTF0XTAPH7Z0SYFW68MPQXSVDGE372774K41N7T
'SP18FE25KJ0YHXR3STQYSWZ8B401JY16CPY3N4BEY
'SP2QS8E5AR408Z7J3ZZXYSV5KR80SK16MKFBF4Z2Z
'SP1RP1T219NCCH0MPHMXX24JCCEMHARA4HVTH30Q9
'SP2GRRJ18NHCHPDHJ8KCS09PJKR2HMK7Q26R9XMAQ
'SP1S1CKF596983FC5TJ5RPBHY3NGJREEA4YZ7VFEM
'SP3W9Y9PYY058SXG58K2898GRDJXTGJ8R0MN7A0ZK
'SP1DF8DV34V83K2X07H40M141927R4A3Q4SC3TDGZ
'SP1T07GK9H4M0WP4N1DSSA7NJ7GNTQZ0GBZM0GAR2
'SPXT043P4H1TYPKNR219AA8FHADJ973NWM41DM7Z
'SP1FSX9QG8K0ZBFM104737ZN8KMB5S6PCM8J7TGMP
'SP186EJBZCQ3H4AVFB075NSZA4KYXRSWMD5ED3PBR
'SP2NGB15VJEXCR5YQRQW9HFGTC6CDM65EBBCQZ29P
'SP2RN4MYP5WKP8WC2262YBXZ0D0Z9XX38B5DA13BK
'SP22VK42TD6TGSGMVQE3KRZ04YFE47WZYY7G0T893
'SP3TTZVGZ4HNTYSDSRGN1GXK7RWSWYJ9FXFWJ2BCZ
'SPCRBX951ZJVKQ9B0ZN8Z6QG3WZ0FG8D7TC3PSFZ
'SP2GZ39RX2YJYQDW72C73X6PFKX086FV9ZVKRTPEK
'SP2HAATKAY08TCESWM3ADAQ1WKJ7C1GNP8Q5EYVSH
'SP1TCA7QER9J9NKCKBB78K48TADDFC2GXYM3QQV3X
'SP1M6YMXN2765KHVDK5AGT1WG1AY9G7SA4BPGWFNB
'SP2CZP0VGN4DA08VX9N2EM0G1TDNHZD65TRBWDHE5
'SP20X1JQKC2T8T3T25BYK36WVAKR9SYT5W5MV8XW2
'SP1965EVW84AN2FN3JPAWM2464Y0NCXW15MB79RQX
'SP1AEFS4DFN77S096X55273MZX8CHW8Q2VGJKQWVA
'SP2277PPJAZDPPN9MH9ZDA1AJ2GGAEY2BDW09H1Z0
'SP2GH00QH1V5QARBB8JZ42QWBN7JGSRZHSZ4QP6HM
'SP33GCKHRP2KCQ2QN1B4EF7JYZN07F4XW1V2SPKD0
'SP3VCX5NFQ8VCHFS9M6N40ZJNVTRT4HZ62WFH5C4Q
'SP1HYHXZTNWAHTDWAH6Y1YMDJG2SWSCHJW7H5SJV9
'SP3WPN9AJFS3NJA0K5BGBCZGE6ABHMFNS4WWP8K1F
'SP19HEA9K1C88HFD6FH02C6XEFQZNZERD1CXRF14D
'SP2P336EM6HGAX7NQJGR0A4W7KP11BNY25YDSTA6W
'SP19G975RDN2RGF8TYF1WBFGM3BVN1WZ31WTMFZWY
'SP1JKXYACM1WN4YKQMW16VWZXSNKHXSYHDRT32VXC
'SP2G4X9XCK4V9MJXE9YHCVC9NYXH3Q6V2Z6G4WC0
'SP2KKSYG5S7DK6R477Q52CYZDHQ4JPDG2DW2NXHSW
'SP3GK1A22KDY7ASBFB2ZV2HF5S2VREXDVYGQ1FF6D
'SP3HVHCEX464WHXPQ6Z1KFGY6WM8VFRMGY1M59V43
'SP1WKA6VAKGG9WJTP9B9NYPQ1PQST3YKH1BPK3SRZ
'SP3TK9E1FC6X1PZJVJSY78YX487RJQZN5AYH5JYS
'SP1NE94ACGPH4Q201XJJSQ7999H28VMATMZS6PWQN
'SP1VYRJ54N7B55K6N4HPRBZH2KGZGN8SXNE5VFGX8
'SP23NFYZS897VN62YDPGK6ADSVS9M99HSEBJ4JQA4
'SPEFCW4DY382E1YGJFZD4DQARNWASE5CT9P3V6YV
'SP333RABDXRWDSWC9ZF8Q4SRBGKETF5QSZ3CKA2MD
'SPQ33XZS2AG1JNGXDF54B3Y3KSTDNJ0QX0ZTHT7Q
'SP3VQM3J443GDF080BB1HKMPXXRX01BBHDAJ0XTF9
'SP1AXXQ89Z1JJT1XXFW1MC7J6032GTJVJK27KN197
'SP3XA9EQ1BP2JZGGQ8A5ZZWE8CVF7DAX0MF6FS2K
'SP1P3HD8Z6F8EBFP4CGN2MFP0V3JGN5A31NT3GDHQ
'SP1GF27KKQR481ASDXC92DX3AN7BVY0MTN36ES19N
'SP1PSYNK6TC5ZN8VZRRE5FWCDS6WKGYM3HDG20P7S
'SP20QXK5X0W10NNCAJ3ZDAKG3JHNFGYBJ26V4HKS9
'SP10EXB120DGD925GFQABFD8SF2N2VCQ87MB0DGBJ
'SPXN45EPVY45S1CGQ4GMWX3BP3QW37MM8WQWEPV7
'SP2F0AHP4Y35AF74YK0VZN5AEZCXQK4REKBC0D8M6
'SP2N7VSJ2DT9NY438G3VDWYFP3WWBKYN46GQPHH6T
'SP3VV79SMYWTE7XZCJGKR40MJC0BS66WNS6KGYHWW
'SPBN2RYDXB4231HJ2GHFFRGQ54X0SBMHFVRAVCW3
'SPGW9BJR01CAWR50XP563KS4FCTD0AR8YBEQB81V
'SP3D0SAFAZB9X2XE3XA74JGHJ8RTRFYQEQPGWEG04
'SP39AHHCMG916GWSN5Y76HVCVGNJ17TPN8EQQC0C
'SPFJQ1HKXPHNPK9RWWT6V30B9HRA6HJC0QZYM9ND
'SP2CN1YSJAF0E42Q9KWYE9HZF6BQGJM88ERKCXR8X
'SP8K9JZX540796ZG55635431K8F16GYCY9RGKSAX
'SP3SF0PSD7KYVJQPKKRBYJFF7NENGFHZSBVHM3B27
'SPJT77EJH44M9FR660QHZTKTA5HP5RQN5GSYN579
'SP15JAQWRZ4BSGH4SQF7NMHJK4DE365G89HBSYY58
'SP3Y41KPAHVS9C1JTY4064R6AD7GFPZ847PED6X85
'SP10WY3PYT635T91C98X17DVH6GC3G98YMSA5FBH4
'SP42WGS0C3TKSXRFX37TC4PPWKQNH8M092X1Y2XA
'SPKJ67P9BDZSES48MM3S4AWQCRR2N6R5F5284K66
'SP2WAR53WP32Z3VJXWDCCRDW25QYTEMFAY108REBR
'SP32N0QKN7GVVHZ4HS3QQV9H8ZTHAMZ2JZR2AB7XM
'SP1WEM9XHAQCZ703T240H08RCHZ7QZ2VH67PNV1P6
'SP2HMHC2JNXJ9363MDE1G2S4CTJSMDCXG4AG50VQX
'SP31JJB2R6BKHXEPA5NA01P7K8KYYWZHPQJC6BT0N
'SP3GPV7YEVS2VNFYYXEJA4HWXA0HFX4SMFK9F12P7
'SP2DQ16YHF0H2K2RNEADHTG8C5J67GZNJN9QRG47Y
'SP2ENJ3R7X7XVRCB6WKYKJW3A71M8275SCT08Q8SY
'SPFZRYYTZ1K5JAZHE69K68JYZAWBXSZ56D9MG4B0
'SP13BKX0YG6ZH47XMTD6QW6AC50MXH414M1FCBEVR
'SP8JD9WCFPKJ9SHHJYE36TG1AHVQ4MVG09JPSBAZ
'SP3BPMSQJTG8NRAX8QHF7RY4PGXCRN8VHHNRCT7HV
'SP1HMHYRCEQRPR01SKF3R62YF47NMK9JGN2Z13HQH
'SP10E9CQ0W38TRYHA1V6XZ5M7M2ED3GG45A6JDNYP
))
(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))
)
)