;; 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
'SP2YSHD884XP8KHB01ZGCPC7C8N8P6F7BJQXJJPW4
'SPTF7TRK58APKSPTRFK7N66RSCWE7MZ559A0A88J
'SP1A6WF1BW2HWWTGYC21S6AN4EPB58919FYHWHYVA
'SP3FC8T5JQ2C1F5NR1QTNR6J671065SQTEVKQG7XS
'SP1F9T68NESARA7RDZ2RA8P4NB3PPFY8WWD8N6D9V
'SP1HZ8Y23WGZ8FS6DXXYAZSJH5B9J32PXFYZWYFHV
'SP8YQQPW6JP951HS8MWRKPZCH8Q0EEG502MFXQT5
'SP3G51KW6F6AQ8R168CA0SZP0T6M9SS8716YJ2EB4
'SP1AS79RG412M1WYW13Y3DR980833T6JSEMMS6G36
'SP1PZ5Y7X64GN4CY0784CYBP9DPKATDQG4B7PBETK
'SP34N33TA17XA1RVRQM4QSV9BZZR7WZK5FVZ67P2N
'SPA4T7AHGY8C0M2Y89X4DEEM25BNVBJ42406VYK2
'SP3X9D8S36EMY53N1X52S2XE2M6J0M2QZT269FDR4
'SP2H4KW5CVGK2JW4KPY6HJQGG6QH2R4357KK5P8QC
'SP3M0NE6YNKAM8MJZTB58RF2HFW4D91ZW4HKJ4JMM
'SP3BEMW74XMBEBRT9CDD2MP1PFJB73R6XETRKCG40
'SP2NGJDV76PHSY8JYCRVY57X1QNJMTTCR5J1RVPSB
'SP1RJC76DDEGTXEA21MNVDAV40Y4HW845C9J46RJS
'SP3QN0VTE5GVD2EMJMD0PRGCYDF0MM8K5RA038B6V
'SP3TA27VQ6KVZ0TH018ED414WMM65RP46EDTKWKRB
'SP3GXRSVBWTVS7DNK466APX88XZKAB8FT52ZQ8WG4
'SP1MF358GE7ZQ14S37D2Z3X2SQHPGC06ZA44EGYMM
'SP2XPY5SW84AGERSD2MG14KDTNTAJX85DCP0P700M
'SP3J2KC2GJE0HFS26NMQDQYD8JJVAXNVJJ1CBWG99
'SPFMQW8TH77H8PACSS26J06VD5D9WXQTHF5F35GV
'SP3STNRK5ZMECEESCR48B58BK2DGP87P1RQKXJYR2
'SP12C2285NTBNZH38SAAPVBDCQMWT2J2SYKC1KDC3
'SP12JZ1JK33KYBXSMRJ58WXDYFBGQMHDKZ7JWCH6Y
'SP12TYM182WPP4R73V0542CS8S2RAZRGKQ0NQHFBT
'SP16JPS75JERTJYVG34ZWVHK2VPXVSM9FPSJC117K
'SP18SK7DM7TRHHWT2N4PG0JRQ1D0G122VDR73Y9EB
'SP18ZHM9H0QXKXEJ7MHV7YASTG4ADDM0J6VH3RGH
'SP18ZYDZW6D8T130QG1NAG9Q03M5B3P78MZ9VVVGP
'SP19M9QC5CSMZ4C9D54A2HNMJWKS9EF07888NCYBH
'SP1AJJNKA70PXD14RGPWG5NHNM1WAEZVQD7HNK8D3
'SP1DC7R5978SMVF9SK7PA07WKVD6G1GTJ8FHWKZET
'SP1E1NSVD7RJEHX99BPKZK0Q906N58647AYK2PFDY
'SP1EAN55NEND0ZX4TC7T4H8FA8B92YCY6HJ636AGE
'SP1EWN8Q0FRNYDM5EV6941M4DZK3ESR6JK14A4TBS
'SP1GMX77TC9ME4YFSHWH1XTKVZ6ZT9ESCYYB0E9B1
'SP1K0AZZA19T8EJ5FPPB0P19CFQ51XX3BE8XJPXHA
'SP1QJ499K0F8621JKD4F2PHAQA2FENK854HA17KQY
'SP1WE1WW0T24VDEW95Q41YR1Q626X82FPPNJ9NCDH
'SP206X0HYT3V8J93ASSFJSFYB70J3ATZM2S0HNQ79
'SP22BRWKMRH6P1APP4CDQ8KDQ62V8AYNF5XX2G5BG
'SP23CTQDK8KQ4FCM5JZCMZ62BDW94GNVRJ7ZJ2Q02
'SP242WZDSRHYE0839DSNSEDCC86TD3190B2QB7FP5
'SP26RMN84H52GHBEB8GBA89PBST9WRR7FX6MVGHVD
'SP28ZTJS8Q58ERK8MDNFGQA85CHQRP4SYH85B95SG
'SP2AP6WYMJA4S9TKZEW6MWTBZN13Z5MB3DGMFEVFN
'SP2BN8460YMNRCY0V5EZZR4XJE2RQN9TKB5E15K93
'SP2D95CNTM9EKQ2MASPXW5YRFV2CSYEJYH4FWN31Q
'SP2E6TVF3MY9VWBYQ1YRRB4CQAE55PW7JNFJMS9X9
'SP2MZ3ER18HWY3N2KBJA7A14HXPZK8261RQ8C1BDF
'SP2NASZZG35X4MN3BHB7XETABMV4BYYATJQ3T6VF3
'SP2PRCBCCKPFZ898AC0N3ZNBAYGHG310V44Y7FZAZ
'SP2QC0V8719W8YCJSTZ6719RKBQ7FQD4MQZYM4FD8
'SP2R75AVVRA4S33NR35EPPAXNCZ99QDZ6CQK0WP69
'SP2SP2CBZ2GE9YB4N6FMRAZWN5QEZRVHEJHTQ8XC
'SP2T02EZ2TT5GA8G2NMTE4JPKWY471HHEK4ZKXM1
'SP2WJ8TFMZ9WNRE8F12VHB02VFMCNN7Y51Z1P6CEV
'SP2XJZXRF1774EGXKF6YHH3WD25CPCK90APZA56E5
'SP2Z2GQDEPY31Q3Y4G4J59NXRBEN6QD7FCH7QTE1G
'SP34DFT6WMT3N3FXDBJHSXX5DSW554SNDBNF9GVMX
'SP38MBQFTBD9NMXXSVGZ1TMQKV4ARACMA8FXPAT9P
'SP39ATK6QGD9FA6JDRHDKA3VF8TG5FMHJQPYBE3CB
'SP3B5D8D7BQTD8VDNW27W3GFZNYX4VNYKQBDRPY5V
'SP3CA0RCACARNHEETH7MHNYSQTRNHWC1DHJG75QHC
'SP3CTQWREGFB5FSFH4BF7F0637ECECXX06QDBVBF
'SP3FCX6X5N8FBBKJ32EDB9XZQ1VAR2175466QB8T8
'SP3GGWJNMHFQ1594DFFQVQDFQ1F44PGSMKK5B3XV1
'SP3H7VP6NKH8PPS6YKETFAXKWTJKEW88QC75F8VYW
'SP3HDVGZ0QCHTPMH8WSE526VXYY5Z2ZJ65P9DX6CZ
'SP3NRE072ZTT3G79VBD5JM8SZ3SEVC22S0XERN9D5
'SP3RCWEGQ3XFJW1ZFP30Y569YSD643REQBH6ECXET
'SP3S018KZD7N4JSWGY6XKSMB918Y8NEW9M21KQ49E
'SP3S0BQFA7V03BMPQET1YM8BBQ020F8AWWS9Q7ZQP
'SP3SQAZPKEP57K8744539NCD2TC7DT8KTEDBS3BMA
'SP3V8RSTAG4AVNX913MVZG97GS1B3849W4H2G5A0D
'SP3W8WBJMVYWRZV33S8PDRKBXJ80S6033ZXASBY5R
'SP3WV7W60ATCSRAY8941JT789A0DYVFQWNT1N6NYH
'SP3X8T8SA3FPRK6S8RD5XZEH9K44SP3KFJFEP4SQM
'SP3XN8VRCGT78C7CTBEXJZ9EB2AECQ6E5WY4QT8YR
'SP3ZMRW01TN27C9X2QDX3WE01YQ38DEJE5E2B1GNJ
'SP7102KND7SPE1X7NKB3T8QA9EZQHB8ATK772G5N
'SP91R225BG4E59CKZ5CHQWJT5ZTGZ8YN5H62AA8V
'SP9XGT85DRA04B68JPWKQJMJ76XJE7SA06XQSYCD
'SPAN3P3RA2QRGM8V1J8JFDX583EFFT2V9RDCVTZC
'SPBWCEVXTAF47H1EA5D9NWDQ8VBQWWF6R1BT6VXR
'SPG8NB7MFQQJV4VG81QQ45R4E9P71Q9WCNZ1RNS7
'SPHXS70WQ9C4DWRSP17JFF2WGZZF4KA3H3682NME
'SPJKZMT12BFWZ0N6JE0GC6EEMWX65VX5109VXS61
'SPN1SRYV175Y77KP22FA3SBC39FDY70STD4BZ05E
'SPQH90DSXKVMGQWSZ8DJXAAZY602B9MG7PF8F031
'SPRB37RXJ69HNA1YP1FAVYQEZ7R69BA8NJ9Q3KNY
'SPSR4N3GEPRAJ671CD0Z5XK34JYC0T6MFS5F9G30
'SPTYFJMPMMNFVCX1BBXQ33103Q3ZBBSPA1DW1PTE
'SPZD08BHKJWWBDHHZXMVNMGFTM2J4E5KAFG6S0NA
'SPZRMGT60E6CKK3VXDQ73S3FS1DRFC4XBMAV94SB
'SP175FN7FDFPF620D3WP4R535210ETK5HESD37JS0
'SP13Y2X77XHGWZ9G9C0ZTCBJTV65YFW4245FFD10F
'SP2RZQ2R3H6QVTCGSK0PMDQ11BW5E1XYTQKDFEF0Q
'SPQX1CWTP9YWY15W8HJA8W3S1X0VFNJ9Y7006EAE
'SPPTKVGP1HG5ZN33HJAH7T35T7A4SWZGESQPA4VP
'SP46CPPEGAA7TK226AVHG9MFHP3WXZ4DWWHP983X
'SP242VN297W76HPTPAQFBFMYY8X71F5F2826N2X69
'SP26WMWG6PTR2QCH3XXPH5SZHH2FZ4WCSJJ32DBNP
'SP1RP6MXN0SK2SJTSECS45XASS9YWDZSP5TVSQP37
'SP1GNA5PQGA8G5FPQXC9JVHQ7M3PS53S2GGHB4QQN
'SP23386THPFAZCNN9BXMTQR3KCSPFY3PMCX7YE5PT
'SP3Q0NJ3RPS7K1G7DBQDSC220D1JH25VM51WBYKFR
'SPYZVEA6WH1MFFQ4W5MWPM183WY70A3XPWG1Y2AS
'SP2N3KDZWCD6VEQ59TKW7ZA0DVTT32VXPA5EP4MQ6
'SP3C4H7QRF8ZK50TWSXPJ3E06TSHCWGKBRGY3RXK9
'SP3MYZ2T7JA4GYBYMSZ4ZJYEYTZ69JDD0M7W4BQ8V
'SPRTX0BZ7XMRWR2DDSGC7PDVWTJ1FGAAGSRPBYCG
'SP3R8W79XCQDVJTKF9QEGSAMNT9N4D8TQ8PJYHCPM
'SP3X46VG34FA1X349HEV4ETNYHD8RX7DYAAN9259M
'SP37HNVKA264XH96CS502SJVPNBM3AZW1HFHZR8NH
'SP3WDA1EB0TTXFHA9JXNZ2AWRTA5VDXT85FYHT59Q
'SP1QPD6Z8SWZ0BVCD8NFZD2T3GESR47DWG7K0W7B1
'SP28F44VQJGBZ4A1W9HD1Z63HPWB57N28997F3WMG
'SP1362DHKF2DQY2KR07XSZ0EEYH8P9YW9Y3KE79MQ
'SP11QK57TSVSRSNTZBDRQ25HYBBFJK8T2Y06TQFZT
'SP18SWK54C8H9Z5PXQXYZ0Y6WHRVV330T27CB8NDS
'SP18ZCERQA3ESBP2TK0W8EM6Q5RHBXHHJ4WBHDNH3
'SP1SZ1GH6816KXNP1E26DQPWJF33ATWWPY1FAZ16
'SP27FQHHVJJSAEZPGZPMK4J7KMZTKMRCQTF40KXA1
'SP28W1Z4EW6EHSFM97183S3TDRB1RWNCXW4HZVSWJ
'SP2MVFY603K1C91XP1PHWA01KJ78SBQATCZDSMH0Q
'SP2TM7NKBG94MM4DTDBWBW0QRKGGTJ2CE26SF3AZX
'SP2WHSFV0K0Q38XP1JJNAEBP2K02VREBJ7EFYNMCT
'SP3V4KCB5HT6CDG8MJNGQ3J7F7Z1M5ZZ44774PYGK
'SPBPZY9N8VYT2MMESXP1BARH3XPHGDV6DWW0TF5E
'SPRSECC45ZWE1MKDT8CMH5Y3MG4NRQ4TJQXWAKE2
'SP3GK34189BCSZRR2MGS4AR6HP9P5ZG10TFVXY4XH
'SP294EQ0Q41YNTEMMJH69CZA6D20TKK31PJ4RBRRQ
'SP10WHFKAZHG189XX6MDF6E7X25ZCNYADW48B14PC
'SP1CDNKMQ473VC0TSKTDWZ2AC6CF4Q2E7Q2FFFG9J
'SP8T80RGBNBG2E5METQ0KB0HCQQWYM4T2GKMDZ5C
'SP21TR9EN0WESMK0RHQP545W9G9GPTMJ5KV8F4NJT
'SP1TAAN9KMRSB9HP67CY7PQ9DHFR64DGSX7Z586PG
'SP2PZ3MVTTP7CFWJMMW8YWWGR250DHFDE11BT8SN2
'SP2RBQNS29P5YE0RB1HC9GVW3JCQCFEX8HFJXGC4A
'SP3AAZ14KVKRF8DN6FV2YDFJTXFV05PA6WT20T267
'SP52NY37GAVJ846V9YFWBV4NP2V7RD0GT03TW7CW
'SPEVZBMAYM97038JEHM566JVGAFX0P0QCPWNK0MB
'SP81R2MPHCV3WDDF9BTN6WWH9WSXE4C7MWZZ30HF
'SP2S04CR4BXYZAJKZ5EX6DJP6M91B4BVXW5KHTF06
'SPAPEK8YHYS9PTK4HKBEZ9F68D1NV4KQ54K5ZPWW
'SPVYJHP1HEQYX7J7EXK4T4D0FD2ZA340FTT368M2
'SP14FYKH9DA2ZPZM7KX2GK4VZPH8JM9E05XKMS8RF
'SP394D04F73Q14KVDFQCC8J69K6N5NRX9RD56T4X3
'SP7WHPXVJ72EA60P2P367GQ9AR8DB3D7V2TBQ8Z8
'SPH86MD6Y23MVN3N49EQ3GA7YHDCBBHJK0PCBY4E
'SPQ3X76XJ53D0R29YR32T7WTKPVE5Z8QP6ZBMC0H
'SP1XK3XJ3CEWBQ25SFFR7AQHWN75D5ZRVCMXPCKJY
'SP2EHCNABRHBTYGWMJW057G2QZ0BHC3QTA51FGMY7
'SP2TYJ2CN6222QR6KJK4QR5VC357ZGZG7HKCHHFC2
'SP9DA60FT76ECDKQ53NWGNDWGRXDW3GWCPA07Q5X
'SPHTDH0KD6CG7MPY385R63EVKBYB665WV5HE36H5
'SPWD1JTRD4Q640TTH01PBXJDWTEQAGH8PMWJ8G4X
'SP1MR82SR514ZPKNBMR971T2H6RZ9YNERDB45D7PQ
'SP2FMAA3MNDEAV2DS8TREDSX1M3TX9ZQ6A0M8J5KN
'SPYVHWGMH7HGE5ZCKMGJJKP37S4KNVTP27Y57AJ2
'SP134ACD749QYM1J4ZTWMJ43MZH38BJB33D24DQB8
'SP3WS2W8XTARABFAXMQF0RVZZED1JGDT9S0S6V3MY
'SP28JR1MMYXF8TDGW074RFBFMH44KNYACG9Q3D0BV
'SP1KR3N5FHV6M90MRZBKA0DRBDKNAT2J2XRD6JBMJ
'SP1ZF3FCTSE5PVBT5KAKER0EHQKB9J38GW9G403PW
'SP24SH0CYRH0R8NC8H61PVX1THJBXTP0FYQZ86K3R
'SP31JQD8XDKMESB3N7FA090T1YMD0NHR0ZJ0RJWZH
'SP32K7KVC811P6JQMSNV8N7F252FS9K23RJ0JSYGM
'SP34KCEDE4CKA5R026DZCBXCAJF4DS44ZKNCZZER3
'SP36G8H8Q9EZ6CWV8GVMR8R2CDY0S1R87N9TZ2MDN
'SP3WE41ZRG8G39RJQR9YA7NMHXYYN0ET2MG2HDQTH
'SP8RH3MVQ86QSWMFHTMTNK4NX069C937REWQB76J
'SPM074DVKPDNFEQVH09JTVY8KX623ZSX4X9YFDMV
'SPMWC9KZ55E608R31YYSZZW0F470SWHFBX5V7GZZ
'SP2CJBE3SWKCK85KKKY1ZY898MJNVSH0A703565HS
'SP23BAHSA1F9DJ6PGQ3RNWWX4FQ509BN0JCAS0XSZ
'SP1JCTFR38HC16KRZGYR3Y2M35AJNNKFXR3DZ3YPE
'SP1MY295RBFTB2XGD4457ZE5KSRPD27C3VXCT1D53
'SP3NPSGR3FV87HANM5XV7QWY1YW18BQK2KV4A0M26
'SP1Y4SAJ2HFE539FDTTCZFT8CTRAQQ256CVEAPND0
'SPMP0MWMT9252616HSKJN45YJ14ZGYX2VHMX94X9
'SP10GQZWNFSJECAGA1YXGC55EM3XMGMVMC0MQY1BE
'SP1EAJK7K0745FF6F7MZTSF8YGWAXJ64S31WYFH2P
'SP1FD33S5AD9MW9C57BN1R4SWMG72M9667J6BZ2P7
'SP1G6S78GZNTVZBX69YDS8JXZ5BXT0WPTAXSYGXTP
'SP1PC6WXVD09CFE57MHZNK8YTE75P24EWFNRWY43Y
'SP1RZF32V2SRPBHJC7DTFS3K1MWZ98RE1ZS15XFZ9
'SP1V6B4ZR0GYZW3QJDH8FN80J5QFWGZD67BQNJ9TK
'SP21FWF386ABY6GQ48T0X6XSHQA2J2GN72QFXWCTR
'SP2296TKETXYG9X5BMG2C49YT3AXDDJ8PVP5TX7PH
'SP231QRYXDZ0J3FC4APXZH37C3PXDGBB4EN0P8JMF
'SP28W2QH41END2DJHT8AX7S3MF3DBR32H7VX4S93B
'SP28XCW4CPMYSYC5CPB6JGSMD7FWTS4CZPKDT0E7K
'SP2B4H9E422VYBZ55J2G96H47MAVPS4H4RHMNC1YA
'SP2BN3D2THQMN5JXTGQR2B4TERTPG5S4KDJN9V4GZ
))
(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))
)
)