;; 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
'SP12YC4AQB4PN409HMDR1E8R8RRXCD5FQD16C4NE0
'SP106NTZX1XW5KS81SJX15CMS8F51HP86SPQA44C7
'SP1NJHRCCT85H32JEQK5JCA4MW9P2PMQY1Q5D53VG
'SP36ZWG5VDWQH5A7X1HZY5W09TDNGZ19C5PAQD06P
'SP19V9VRVC00TXJQYNQ3FGP4V1PKNFH5HPS3F32JN
'SP1KE36VPP3CQG0SGT0H64ZH94TQ0WQXCTTJS5NV7
'SP1PE209DGAS3MFQJB5JRTMFTYT7C0R4331K22XEB
'SP2EFWAM278MYN4HGJJH60G0A18M3JE8JSWAA3YD2
'SP2S9GJ32DBX44CK8HV2P6781EA388PZYFQRSKR5G
'SP3E5JF3P28Q75GCNS3TV3GJF3D4257V6FNJFFSZX
'SP3H17JCG9W1RP5H8Z09X8FJA3PF2WJ14STMSEVZ3
'SP28T4GXDDZP1ANFD6S908T4CRV6FQZ6E3RQGQKGV
'SPN461HSZGEA33KP8HQ8BXSZ4WZ1WS5HBS82VTGJ
'SP1QG90SCMMNZ7KGPKPQNY7SD0SPSZQ0AEVP9M10F
'SPN0YWACEQCHFKE050BFXNHYZ4AMR2K8MR2J387D
'SP3PCSW20N2DXZVPNDQ001Q9RGXS2RD17AVN764GH
'SP16ZCNPS9VH8TQM1PMN800TT375YZGPWKP48RQ11
'SP1SJBCE2RWA2Q19YYVB8S4ZH8D0J2EXT5NCEER1G
'SP1Z7XJJ3XXF8VQBXK3QVVY1MDASAMJGEHQKRPMG6
'SP25RGE78GK6KAAWY4XQNGA437DKX7G7AGDYN6268
'SP2JB4EPXXDKV5YB1E60PYASCXVC3GPMVB83PTPR4
'SP2PGDWR97DM7ASJSXY1R7NV5Z829A2H7C40Q2MPA
'SP2V7JA8M49H5TX195GN5ZV0NZ2T63NS9RDA8F3BW
'SP2XV97TQ925WMTQTBJWJVP5ZEK7ATR0G5F6982AX
'SP3N6EZPTSX8ZV2RGPY9NR9A8CA0QET39CY978H5E
'SP3ZWBEW65V1991BSRVXY8T7GS9A75FYG3P9604GW
'SPZQ5Y2XXESXYKSRJDFBY6WX1XX8T47QKSAXTE56
'SP3C1TAP9HJE2BXKA53BNS2PDTG22DKG2DT63EE5T
'SP1ZEFZBJA0Y5P7FKM63DMD3SX9RT7YN1YJNYNMGK
'SP1E1TMGDZW0GCZHERMD9WYDF976GZEZMDYS0RJ9S
'SP1FK5BHM3P0325JSZWWZE2NS8CBMJFQPQ0F38Q8Z
'SP39RF23607FNN6J373FDRPSYARAA514W9RKVGMZJ
'SP3F2VQ4KT7GW31RTJV3SJVPB0T71FWPCNJ3568H5
'SP2XMN0ZJH25DTXHNEMZ5DH930PYC950SSKCHRD3J
'SP38886ZEHEQSAGB50J2C8EBMPHS7EX5EKZ4HK8X2
'SP1BA3NXG56E229KTRVCZJB62WJTPJZ01ASCZ4BTC
'SP4VMR772QMGX40AJKEN1VA0RB2950D071Y77CA3
'SP3TF0J5PW51AFPM5JTW8ZYFC1PK5Q2FV321Q13TC
'SP2DVFKQ3SQ6YDBC51CCGYYVYQYSWD8E9D5VE4QTQ
'SP11CJ2DKSQWXRVZ243SF51KXX0QV8E7TVKHMMTEX
'SP1E4P3ZWR76GDARZZV0VCNN4RDAKH2QH6CG6M5XP
'SP3GT6YMNTGNZ50RBFAPR5WWJMQ2XKJCJAY6KQTFD
'SP15T0NS4E5H8CTYTYSAYF38R7MMH6MGGRQBCEDAR
'SP1ZZ7G7R1R548DC7EBVKGWV83EBZXFNA00VDP5FH
'SP25DZPCHNBG48YJ29T051XZ0AEC6WAF878N9GMQ1
'SP2MQ1M6REE7JFQJRFH908H3D8BH7HS1J0WX1D1D7
'SP3ZY0X5RVF844ZSGBQ22MTDERV2PJEN1C5TSG1N0
'SPTNBAFF07YZSTQV757BEMEXK8ESP3T2CYN1WQ6V
'SP32NK6N7GN16P734VCJ80D4EKQHA0EQMY11PA9PD
'SP1CDN5RC0N5QMXFTETZFM8DYV1PA0WREYCZJ9Y57
'SP1F6ASM2MYVVKGHK0ENMNJAW4HM3WP7956XMCP4R
'SP2Q3E9HDNSCN08X77XT5AKM7V6MVS47ECBBK0YGF
'SPJQMA7X6YD330M9F0FZ0210VY704156DEEA4P44
'SP3DYX83AXCQCRBV13B0R37N3TEYFA9J2D1JGGZ3S
'SP11XBJ7KY71K3EYQVTS9RF55M050NVCYSMDGE6AC
'SP12JM4Z7YFYZ8PMANHV0R1HCQNC4FGQSK95C9DE6
'SP1P9MS7NS329PF9PFHZYACBYSHMW9Q9ZA9EM3G2
'SP1PBZQ1W1S49QVCBS4VGM62WMQ6EFZ75Y9G3AGYQ
'SP1SFK4VABVGDSA8W6Y2X7PD7K93YTQQG7RGHJ3MD
'SP23T6FXN9T47HJQPAKXKA7MJQVPKB8ZCX3V2VE39
'SP27HDFWZZ2PF511GZW3A37KB7EAZJ62VWWZZEBH
'SP2HQ0PB0DMK3G741BNYNY3RY88M93XWMJEVXAZJW
'SP2PYV4SEQVET95JEQJ7R024RC77D4SPP745R8G88
'SP2QEBV9KQ570NA121YG1WG8ZZZPQSSQNT4HVBTFD
'SP2QV18K6HB5NBE2RWHKH1HY2A3HKJ4NVW7KYN2SY
'SP2Z1W4B4GKM4Q1JD0281ZRANN7DGQ7WNMPRHYT9P
'SP32SWZYA024PC08CBJFZ1KE376GFZC3SHTV2BP1J
'SP34449BG2FTR7FN4PTVT83Q3HCCSHMT1GF446ZTS
'SP35B72MN9DYGY37J613C5R56S63XDV559AVGSP25
'SP3WE56Z7SXC9E1Q7SARKTE42YSQP7DQPWKA8BQQR
'SP3WKQ257VBJDCNF3T4SQBKYMGMM8GHANW35YJEMV
'SP3WTM3YXCKWQGFJDQX3RR5S8KB20XNCZSR6709F3
'SPJSE0WHAJN5R60522K0JY1PVJ2SKSTXKFH3SE11
'SPQXCBGZNSVDED3VBAPB6WX61DPKE6KT48Z2TXWN
'SPJYDFT62HEA2PJVV6Q41X77Y5V5F64GS36MYEA5
'SP3EB16DXT05GSBH9VMJ14KWC4N38DV0YSRCB0EZN
'SP18V1ZKEW9YZ8YRNPPSDW9VXT3BSX6HW00HN3R16
'SP262V6XJAHKMGZ254W06WMH3HF21EH8KH6967H5A
'SPV6ZNFFSJ5TWGF38XD3XWZ73M83CQ4JCD7C1K6X
'SP34T0DS0ECN32J0JK891YP6JQ8VZDHJ98MPR74GX
'SP2XA9Y8JB3CQNG817XY5ECRHAY98E51GB48M8PTQ
'SP3ZXMMKP9CT1B6TK2903AWMSGJH60GM3JWJ04SYH
'SP1B193X7HTT59VAPN6YZF01H53108BP912PND069
'SP3AYTZTDYQ7NS0J1A6ZTQJ9WRJ4DY3E19N6FP312
'SPXDHXKQCMH01J9XCDVHY1H9RPESSA4CTPW1YBQ5
'SP2PH04BCJ5S3KP3EXATQX5HDN3A7YVGJJV6QY3B0
'SP1GTW397AFCG3S3ZFS01WJNPQ3B16HJCX1D1TE7P
'SP8AXWMBJ3HF0V3VG62QN3J7EKKVQ0ZGTCSBJJKK
'SP17NAF9NY37HAB2CFXNQPD135KPBMF13FBM781A5
'SP20HQ1JHZP7XD0H6VDHCXNHNYRCZ9ZX0YK8WD9H4
'SP1FA36VZ70HDA5WRP6CEAZRGS15F4P8A29GQCS15
'SP36DAM55VWZPS3NVKTYVBXXG3FWKPBQ2JFDR221T
'SP3GR7FCWCE7EBAY4376D5QTKPFX37AR7GHX70H10
'SP82K2B70PGA2JKTV9S0DZFAGMJ3C24BZRRQD30X
'SPCGJK5MZDPJ54GN0R4N2XAVH7TCCPY012HZ3RQC
'SP3JENZKFB8A2BGCTFSQVX7JKBKF2ZGRJFH73ZP9S
'SP1TV1339KTFWB663BVWZHYVFN948A3BABJ70V49E
'SP2SC9PFY5GBAX8GEA48APA5FCS1ZTVE4J80QCA5Z
'SP1J4P1Y1NY47VPYPD8QWVS091B84DJF8H2SKF9D1
'SP58W1QZEW3S0BP0S0JWCNPZTA1DYNDA45WWTZ90
'SP3GWGD8CHSYQMTMB1RVJYYVAJEX7WQ813PR2RKGK
'SP1TG72THVGHPWPE0BWNB5GT4B7CARHPGWH2PA6TA
'SP8VKJMHPB94ACCHWF7AKWBZ52G3E86G5BSSCRCB
'SP1683HWFY4GBJZXW714JQZ4HPKGCH2R8CBSK47SW
'SP92Y7K97R51SMHDFY185NV8JNKGRHM214EHNF63
'SP3GC8X8BGJ15A3XHWR8CEDKHHRXP9BAZS5WAR2CF
'SP1JTJHCWCC1GSTS9K9J0TFV152KNKZPMTDA82ZHY
'SPWHMKEPS8ZYJARG2A0REEBYJBM3DP5RDRZGME77
'SP9RX3GG1MQWD3G6ZPN43H0V5NVFGXJBC94SJTS5
'SP3Q40ZJJ2ZZWE9NR4SG7K85YBBT6FE0QAX1FQQR1
'SP3SVV7HWPCMWESGAEC54AEQSB52PPJ7CZ61QCTCE
'SPQDH2K448XA9ZF5JEA3SDZE8GV56Q2NWEK7MC1M
'SP26Z13X1TF93C9J20JHM592SCM6GEB36SRBHKS65
'SP30RK02S4MV7B6KEXCNYKXKBF8T3B1S5G20ZSV2K
'SPGBVPV4P125FMFGA2FQJ2ZRA8YKNN6BT2B3VHSB
'SP2S3QGPNJ2AWN3SSF2EG7YT7EPBR4D3HTPXQE5CS
'SP1020QP15X90ZVDQFRB45ZKNYTP6TN05TGG4YJ3G
'SP1RXDBX0DKVWYXPS1WZ1BXVYB2DJQ2JGXEZQ0XTA
'SP3TR9H98GTF9TY11RGY16VGRFGMQ2J655RVKJZ76
'SPFMSWQ1SRTYSECDBFPAY4KF5HDWC3C0B35CP764
'SPRVEA0EYRXDMPVQWQK40RMV1W7QX57WKSMK27BB
'SPAG39YW8YP9AGZYMF0EKX5YCCKTWKZCY5H6FYQ3
'SP2SKMAR9WMD9DBJHC4XTQXPZCDNV1258PSJTRGTV
'SP101P8MTT5ZQT76PDK0B7X8DD9HKH43321ZM513G
'SP2N2P8298BA8PFKFJGFFMTMK54NN59XB8KQ46PRH
'SP3HQAMGTNJTTDWC45BW75Q45H9Q02A3P8DDEX80S
'SP3WEKV5Z286EYZMG61YKSVCBC0FKG4FBPKQYGMVJ
'SPXSEQCRDVG2ZYG3AGCVHJ85TRY9547RS2TZZE82
'SP2PVQCMQWZFHP6410PTGKR14Z2SKWXY4C7P2HZ0F
'SP37NRNC8XA8KTST8RA97Q84FMS9Y7BVYQQAS134N
'SP9FPEZPRXVR7W0HRHK8VD5TF72HHAMV4QBVETS0
'SP1CQNAAJ4H7YWQCR1065FMCNT658HY05P7RYGG7
'SP3K03KQFTBH73X4A4Q2H8D5N1SY74XSBVHW0YWVR
'SP3GTV2Z2ZBXF8B4DDK7AM0KYK4TX0T3BMXX8JQHS
'SP3A7BWWWE0QXV19WWN5D9BQGSH9VJK6MW56YM0G4
'SP37YA46VQF121VEKAP6HTNSPEK5WKDMK4BKPYVA2
'SP3T293CBSG335JMV8WPX3Y8N1GFGKNBFFKCKBEH5
'SP2Z7Z33B08W2364V0QV4Z1KYYWYHMNQHS34A76N4
'SP39G4E3SWH0H0HZMS1DKQZ1Y5BSC1EQ4HFPR1W1E
'SPM942AQAYEX6GVMRN3TZRWRETGEE2YN3RCYY03A
'SP2ZCB3R9JF4QPKVST3JRSJ42HPEMAB4BK4BC8M8F
'SP3VQEEV3FXQ762YNQH0AFNSGWP4995VHP1BX1SJK
'SPRYRBTPQYXR5SZDD1XX5061ECKH6H2952P4YWG5
'SPFPQDW6MVS4SRCVYAASZR61R26QJWFYQ59T4QFG
'SP2XCT5BAMVJG6M9NPRYEPS33S04SWD4E9DTC4EY9
'SP1XTT9RVQ31TGTYZESVRSRG8K0WDSZST3C4FPDKE
'SPB8ENM3PV9T7QMED7THTVHEE2ZHJVYK5S4RAYB4
'SP3JMGV9Y8BS9NEWSHFX3DVEGA26YXK134DXM9R3V
'SP3X1GS53ACYFGAR6WWR6RW6R5NVR168GVBAWJWFQ
'SP35ZPRFSCA52PW0P9N52D2AWP9QWTFH8RFM23G44
'SP2AFS93R0SNHCHHFCH9X9CJTPSHFD1PNM75F6AWD
'SPDGWZ4XQQ500QHF9B4W3247MTZEWE3WX80XCKH2
'SP49PX512DWJ0JG3D3WJ016Y4R6WJA17QANBQ4BW
'SPWNHTE1KG0JE1BRNHVDBJ94EJ6SC6H0HBAHBQQ
'SP1BQBW16Y1PY48M0F5JFWP46076TK7TH5XTSC6Z7
'SP1DRS6WVXNRKWAMBR66FJFVM1JRRXJJZVJ1NPVWP
'SP141GP2MYSE6G8RRRVW3N7R896AF4DG29ZDBAZTB
'SP20DD4H24EE6PF77YKZXM5N2P54105BPY073QFT7
'SPTN9YATMMNWPRQXSGMQTYENW5DZZ4N9DGFXYN7G
'SPG9DGS8J4YQX7B0JSMN2FCGS5769C7G11V5H80F
'SP2WFE6Y77CWKGF8AADJR4HB30WDSQEDXRA2NCX3Z
'SP3D196DXNRR5FQ25B5M763NRE2SB1518RP6KRK23
'SP3AMF8Q1X1THMT6YJ8D7B65NRT7ZN7YD92QG27MY
'SP33RH8633CG35RJP1RVG7VT56XMQE1XZCGZB2XD7
'SP3N0TGQW4GDYHCFZ6K7CS6W3JV0E5P7ZFJ99CRNV
'SP2FY8MV3EZVRTG2Q9J1KMMRVKC86DQ00BGGCQJXQ
'SP4XNJ46PSB9Y2A9042SX509Q6XRSXPTQ3JMB25H
'SP4TY7WVVFBX0XDQ25JB0P617Y7BAY163AJFGEKS
'SP11Z7945VRSJ7D5HE0QGRCR3KXQ8RNE41AZS1WB6
'SP1AXQVWFPKJA2QBGTXZS3HA9R33DNH97HV10GN9E
'SPX74BVCREFB62QW9VB15JAASXYRK49Q6M650632
'SP1TEB27G4VQZED23HG32PQNA7RMTKE8A3JFC3DH6
'SP1JWGNNT4232YZDJAZBP3NV4HD3RVF4X4R9G2C4N
'SP2T5PNF09GZYH92BQMJGJAV0PZ8N1PPFAF3CWE2A
'SP2KV98WMNBQRKR77MMNM84R81MQGGJE4GVHNBH1N
'SP13B7SKWYMB1VYFN1ZW6WQQQXVCCGCTDR28XA7W9
'SP172ZXH6NM1C47HA60APXRFMKFFHS9MFMEM7XT0G
'SP36YBVZ03EA8Z5RY3FWBJPVYREVPREN17MMF2EVG
'SP20670DDG79SX8ASZ6X7V65X2P5NXZ3RN4NZNVZK
'SP1GJ7WKP1HMSK0E6TPNPZVR84PR54N1WZN68ZMM8
'SP2DP0WQQS8CQ1Z5ZXRC0NFD4S9KERBG79CKTP9BX
'SP3D0VR3QVAZE85TSMXN6G8DC64N9KFPA5YJHKZ0V
'SP23ZSAFP0QJP9DCVM8X6R8DQDN8PQZ4EM8M50N5K
'SPKWQM17S8111SGMMED6JXPARN2QJJFVXGK21DSH
'SP2AKWB9SHMVW7THJNSQ199D77QR55ZVAF8AS2BHK
'SP27MF3MFSAAKP4J8V316JZ62M3X9628DVP138J5A
'SP1BXP1TJG7ZQS7SF89153XF1ZG4N1JMMDYQ67W8N
'SP277ADH9HKSG5TTZ12DX14KS1SM7T4WXE4XX3T00
'SP32TCJ1CDWPF1MHRRB37XE5XDDR9Y5390FAADZ9B
'SP3EBP3TEKYKKT1PVCTSX6ARR6NRC90E84Y0CVQY3
'SP2Z1V405B3S6ZCECPT8P9A66N2H3GP60TZ882XC4
'SP1636JWMGP08V6A63PV0SDY2B0NEYQ61PFV200A
'SP1AXY3JGEP7C9C2934PA90VSX3W2PS22QXNN226N
'SP23JG5VVJ8P8E5FSV6FK4331HY03H2EYSE580W32
'SP35CRQAER382CY437YPVPYRT9CRABM6HR5SH3MPN
'SPDSJJTKWHKDFET9FDKX7SJNJWP9WFBGC56YM2BP
'SP3QVCGPGQHVX79W7JA08JWT68PN3HTWFCF6B06Z0
'SP2NT791VKVJ29GP7WKC47T2V01B9VERJ6E6EMVZ6
'SPW3XBESSFF2NRNAMF5YB8FSARV7TASZ3G6J3A3D
'SPGVA1VXCGEPKFJ5EF8YTNX6VZ3Q6SXZK1SF9M95
))
(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))
)
)