;; 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 ststx-holders (list
'SP2AK93N5RG9T4DJTTKH95MSR0XK2A0VFXYS1BEHB
'SP32D63XYE9N6CV38DM77NZYVZFBP3GC9DEZE734H
'SP3NX6ZYZ9YHMZQKQ4G0V1FEPR063JGV3NP9CEWYW
'SP3H214YS1TTEFEEJZKVR7ZMFVFQN3C9S3543RE20
'SPW3XBESSFF2NRNAMF5YB8FSARV7TASZ3G6J3A3D
'SP1CNF1MATW7CQAWGKZB8ZTMB570NAQC7W8V8S825
'SP1BKKHA5QSCKNS3C4SXZK3YA3RNABF6CT843GD0E
'SPH20RDAG4AC4PEMBW6KFTPHGWJQYYM3MJBS1HBK
'SP1ECSV65MNZMP7J2K7R50VYZXWQZ3J0R5N10WATW
'SP2G19VB266HYA5RJZ78PDPGT4BDVW3FVSVB6VC8V
'SP1FPAHJAQ19FGDCX42WQVKN3M8XQS2P70K726TDY
'SP1J3T8TM2EXGD8HYX0HS0WWT1AZGYJS94JZ6312M
'SP1C64SDP8WSVJNGCQG20K9TPJ31CXZBT499EQQY4
'SPVXSTGYTH14JRSQX6HW4F4JK929XADTN57QSWEH
'SP86RGM9GEE1TVWEWJ0HFE1S1ADFN4WPTZYGS5P4
'SP30NFZRET3P0Q5E01MDV0G4K3AC5K0C3RSRENEDX
'SPSKE9Q5Z8890142KK6YYWERABANPRVVKH71D5ZQ
'SP3TSPJDV9XFPAB7RTRT5G78MWYP3W0TP22ZPBEZX
'SP2GW688R7ES529VSFG52RKNT5ASJ8NZ9DZR0EFJT
'SP2E5QX1BBFNZ6Y5JSPQTHHQ42G5RW3Q6GVT8GE59
'SP2VJ189K5PDH2R0BV2BJQDPR0G68HY8Y0YV29XXA
'SPT6BNADY3JEW0T0HF8BMBTEMYRRNJ7STKMYY2RJ
'SP12EYX0Y4AHD8FQT10P0WRCA9RH820P24E4TJX9D
'SPQF4G7SDQC7WS42VYE1AXC794XT8SN2CYNFABDK
'SP3NQY3KZE8YV294ZSX8HNR33FSJDCAJC1GEVQHPB
'SP3QP8DZ69AJ3NPVYSC9R3M5F3QVEGDQSET8NJ67G
'SP3CXJAAD4QWSM6GPD7C3T8GHNXCXWV6G54QZ820C
'SP8DS6EEP9G6WJT96YVFRKQ6HSNKQDK22X71K0V1
'SPP0BF2HGWT4TA2WVBE8FW1XYZZ6ANNR5X5EXEE7
'SP22FMFR5MVNV1VQ8W9DEDNP2AAHEEGXA94NZZN11
'SP18RB0ZXYQJXWSCS089W1MFYEBJWQ7E2895MB8QM
'SP3BNY6FETDGKE99NRP4RZFBJ312F66WJHC78XZFX
'SP2WJAF6FZBPYDBX4PDZCBHDR0GZ0J0BMBDW9NHXX
'SP114GGK7HTC0V8H9S4MG614FRD35CC4EQ3KN8MSC
'SP11JHAYKX8XX1AEVGD4VYW65MWN6TMFM3MJVQ382
'SP1C646REC1TQWGQ510ZRK3PAKNRPTZ1TFHVCYTJC
'SP1G071PB6SA5KJ5FH8NKXSEDFY3HEJXF8Z9HJ7WK
'SP23F3KBZPNZJ8731YT30WPK6YN5JZPN86Y1SYRCM
'SP3EJ6214KGMZEC2N52QQP47R2B1XNZMG0M0K4B9T
'SPSXYRD1WNWCT796K7ZB8A2EDB61HJ3HFS4VGMXZ
'SP193C42YA2VZTXTK1WMAZQN46Z1YS7EKSKRRCR5S
'SP3CVNRKN7GP5QR3SRM7B286FMENJWFPCV5PJ57AB
'SP287FZSH0WV8NCQ536VDCDF19MGKYZ41H5BRN3T
'SP2EZSA9WGXYYFRDWJ2KWMJM68JGQBN81DS905S8R
'SP2T34XQ4TT5Q9JNT97WGD7B0DMGA12PEPSXF6V63
'SPTEX166XYEXMGDC8PANRV62KQSRZSDHMJFVVBES
'SPBCFQ85XBSFD2AW7BZJNC5BSMC57HM0PYTAYVEM
'SP1JSS6NKKCY4DPXT0336VSSF9X4MXMRWVQYYNZJ7
'SP3VQSX4RZQGC22TEZBFM967AD0H06QTYJ033XS4E
'SP1F22YBD1113ZTPZB947X9V5SGM0CSYHZ6V93GBH
'SP3GQXQTK93CQKFRJVQDZ91XX05CYNJA0AY285PE0
'SP2ZC3012VG2NAC41GE9QJSV9JKNV0TC7SPSCQ6VQ
'SP5QPHKS3R8SRWSP2CJY7XWNRVXKBYREFMEHGB11
'SP2MX50BX723AH6BDCGXW18VJGZM6TKN98J0VQR9T
'SP25GSMBZJKMPK81DQGE034FVC9E4BSEW5RFY5MJB
'SP3240VQTK1XQK73A9ETZS22RK19908Y9A1TSRVZQ
'SP1E957S175XNPC4M0F6D765GD77RB20TXNZP2A9K
'SP1Y9NSD7DE0Z7MKWDAM41P2AT3WY27423S6VZMX
'SP28PW6SGP9TSJ3VWP2VG1R3CYYZN3MWVSKZVWSFS
'SP2S9P8NB3JWM8HZ3DMBQ7ZT3SJHDV9F5HX33D4YZ
'SP2TN7JGXTVSHW18E0VGG5APRZGVN55YKEQ33CSET
'SP36Q9AWRQSBSHEQEGTQX8995GT9SSS6RRCAM2DSA
'SP378SMDZMVKRR2WXP68YTFPBPB4A0YWF2N2EV3MC
'SPMVXTF8DG4MEDJWQ4KR5MP2AS2HAJQT2AT5KNCJ
'SPQTFNW148QTGM55NGKCX2BSA1APXDBR2DFSXFMY
'SP213XQ7T5XKTVZS9WQ0PDJM8V3X6E3SFE4GJ7JRX
'SP1WN02B4Q975J4JWVGSH9ESY31JJQ9BJRTJEX93K
'SP3HK1125HFFSVVVXDPCD90PS40Y352VXA9439F50
'SP3VRNHPYAB4XR9YARBJ2CRAGZEQKXB9KTE6K6JB9
'SPR5MKPBFTEA03N46ER1H2QNPCBRFX4TC0HY2VTB
'SPWF1WKME4SXJ93F4H9NKH4G2TPFHKYJVAQDMNKQ
'SP144F4JWAGREMXDNJ3TAEN3K5XP30RGB4YRQEAHK
'SP2MYTDZTE7BRDJ3AQTFQJ07G97EGMHNX1Q5VR023
'SP1HNQH0FW7N5QWYEF77SGRZSDPHCV39TY3SJN8B1
'SP1KJQQ4E02M2KEHDD0A7Q3K5YZYN8EMWPGRV66BF
'SP1H0T6NCB6M0HTGEJ5MR20F56NMRD1M4DEQFCY00
'SP2EWS0C3T2FCD7TKADRT5B0A6N6W3Y6ZBMCXV6TA
'SP30Z8WE34MWM21M15SG9RVR62H6XPA5B5PQWRQ89
'SP3BVQSZB9GV2YHD7D72QP4RXVNAED4419Z3CYHP5
'SPD97227ZV1T6JK40Y64ZNP0XQ41K0133VDWEWGB
'SP2NCA6KFRX4YTGEP0TT3XRZAAGHX52WWY5Z2NSPS
'SP1M74ZBMV19PK20BTTF8MPZZ6N358FKA4RNTG34P
'SPZSPEZXTVNBQSYM2C8JQXY2SPW02BD4F4A2ZRB9
'SP136M52CXXMJN718JDVQMK6DE1P913XRBMWYRARS
'SP1V49K4QQTZR78Z42JG445VNQKCGDMTQ37CZKQ6V
'SP1FE6D3W44SDFMB2WEQE5EE433ZP8V6RQ3DW71V7
'SP1P2W8KHXFDTH44CR3099P4G89GHRREVV5F8NQXN
'SP1QQR248BKCGZ01ADY12MMWTDSPW54MH5JH2YQMP
'SP1RWGDJGARW1EFFV955EG5QBQQ9RJJJHTYVB31JF
'SP1WA17N6C5DPWN3WZXKHG5RZ07DN97WG6M2KG2QH
'SP1YHV879WDVAJAACG10TN5WX0TBTPQS9H9RH961V
'SP30JFDMMCT18BDDZ32W00FBAFZJ83818VY969T4F
'SP31380KS99QKRVQYMPDZDY0Z0XNGD47P7N4VR677
'SP32NBBB97BE33C55WE343J1Q7FVXK8QTHZZ2MV40
'SP3B3HE5RZ7CNY1CR23A8C9VSVQXWDKXKE1ZGBNGB
'SP3CCF8NBVHBJ3GC71H716FA7B78A1T5563KBA1NY
'SP3FFHB0WN5DYCS011MQ5DEBHJSH6T5NPZ2H9230S
'SP3NH5SGFR0T0GX2V0FG1W3G4PVGSC3YF9BP8XH8X
'SP3RVS7MGTBXHXSNF674Z3X2N166VX158SKHDPE42
'SP3SEB8THFRGVGCTHHK4SNTV089KT9VDRKYEW5W2V
'SP94QTVFKF9BDYSKZAWWR4HE74436K69B6P20CND
'SPBGHYEZJQP4N2CY2FST235FSJM3BTGYAFDF7MQC
'SPHM7KBKSYDSQCZ4ET9EPX30YXG8DYH6ZCY26HPP
'SPK0X5D3B8XJFF1F9HEQFXG42X25X02KDDP0J1C8
'SP259P8RZ7GWKB23993SMP73TBQJGBEJA7BE7W195
'SP13S561VDPTXQXP6HD4G3ZXDDXY3K73Q5PSX7HTS
'SP2CSVE16KA2HZ2KKR4GGWQ46V1K9MZE9WX43PXEF
'SPYXRTPK9XVMME9Q5F1255N84NNRVZJZ5B9CCT7Z
'SP2SCZ33HRSDR6S6JFKKJV2ZJCR7623B02WABHA84
'SP11ZNA5S9BZ23RYHBQDFF8KEHSNMPCEE57Y8ZDE7
'SP125N9A2A2HBQV3NT2PFX4ZBQGM6H6Z52JDD8KB5
'SP16DZ2C2NRW9JNMQ2BCHSP5DWX69HA5PGHZX3GSJ
'SP19QADJC0TV9VHP9AZF81ESDQC5AGX43JM80Z9XP
'SP1EVF6MS4K6CJ066K6XKBHA5HE9MXNTH2SMWJH84
'SP1V383TXHCN1015BEX72KJ0SGCQAGNDVR0AXJ3SV
'SP22GG8WB0BFTR6GNFMPWBKHHQ1DFE4MP3H4CR9D5
'SP22PNPP28PDEFMVSMVBFNS4HT2PK12WCAKJ0MH5P
'SP25240BWK65X2GR4YR95RY9RYBZYXV1RD8CR3K14
'SP2ATC84N5NZG6KYMFJFQA3641ZB9TW71HGWVNEE6
'SP2BZN08127GMGFP5WCXVWBQH51TVR70SV98Y6R06
'SP2HY2PM8TXV7EE2ZY7E5N7EGVY8P7DSPSAFSBTBR
'SP2JRC9WHTMTHY4WVQ6XNGQ4NQ50QH387BWDC09RR
'SP2KNBR8GQFEW9CM3331V0CSBP6Q2GBJKKRNNEW17
'SP2KX8W9YJGPFM71WNRYCVDS6KA2JZT2FDXBMVYZA
'SP2M10RR50E3F6SPYF7RK6WA6QX5E79KT853KD6G8
'SP2NP5ZV74M5E5N50WHN5WY82M31DEWZ3E5NBQDMH
'SP2VNQBEC27KXPG5B0H9ARGCQXJPD7F5MK1Z85P85
'SP2XH828CKCCP7ERPG40CTEHJW19VWQVVAR2DEDX6
'SP2YDGE3MNTHHQECHH5VJTMBJQTDGBT3TFCCP9XR9
'SP36CA0RQWMWG9TNWWDAY5GQ82Z7QTDM71N24N2GH
'SP39QRR6V7XQPMKMVPTTPHHAG6AC5GN40RAVG6SQE
'SP3B04A0KQME8HEZ25Z509PHXV4FNKNP5GC2AYDYW
'SP3BN9WXHZHCM1E30JYHDPP0HJ7AFDZ74GBTFYJ1J
'SP3ECETDRRBJ22M29Y6B8YVWC1FR8WMA16SGK14FW
'SP3Z48XJ8CREZBJDM9WQHRSRZH12DJ43Q2CB9GZQ1
'SP3Z60Y91N6K3ZJNKFNRKBSNPC4AASKBRKV2F128P
'SP3Z975R6AFZM1TC8440A9DAVE000AAW3273J0KGN
'SP51D4T03XFAJ28PPZ37871YMM00E3G9MNY5K2GW
'SP5NGRT8YP35Z1ZN08393A72QH6NGVME7EEHW6A2
'SP5ZR3G3CFPDGG519X8HS4YGQ7ACP7S06ZTT6B7V
'SP7ZJE2VPFBXHE155JD3GQBMX8JJZ7KK9XR77C1J
'SPEQSSGAY64879MW5WZSKB0M0PQNNG359HCN27YS
'SPHRCP25QQK2PRH5T9TH1JZSE145ZP85N8THSY7B
'SPHVD8WJHVX4EAC0VQMF6H5KDMKGWZCVHN5FRVHF
'SPJ9GAFA661TWN7BSK7Y4T82EPXGVFC0DPG6TDWB
'SPMC8R9A4GJHHFVCJK8YRGRP02WPZ7C6A3BNHFR4
'SPNADKNF6NH2WMFAFY5NZ3J2H6EWAFYG3ZW9QJYD
'SPQYTG17XATAGP8N6TST1XQEVABBR23T8ZK5J3Z6
'SPT36MSX3C5K3ADSXTB4BB92Y08XYESS29Y42V27
'SPZCB1ZNN6FE71RCXD8VSSDW5FAFZFWDSV47CQJ8
'SP2RV3T6K1HKF9RFR9WNBZ7ZN4RB8PDSR0M5ZNGJ2
'SP164BZXT3CY2QZXXRMHB0S6C73ZR2B9C9GFHB9AY
'SPGVA1VXCGEPKFJ5EF8YTNX6VZ3Q6SXZK1SF9M95
'SP1VKAB9K9WYYRX768X13A7GRWQH3V493CBKTGATF
'SP2RZ9PT6HW56N8MR60N2WQ7G6Y8R8JKCEHY505E4
'SP32D3TPBQ9T76R4RM9B0R4H5KDWJT5M1HNY07XC3
'SP19HEA9K1C88HFD6FH02C6XEFQZNZERD1CXRF14D
'SPX84BV065709JJVA7G7Q7RW0TGHBBKZJ089NQV0
'SP3CE9VCDGMPHYEMDHTR672YT4W7VXJZHRP36SNSR
'SP25SAY1S2MCF47Q8DX8TSG9VB1YBZ5WM8AXWW1Z7
'SPANEA903S1RPKNSA3N6PKRB0FK2C07DYW0YJXF0
'SP1JNWYR2813Q61X5ANEW179KTZ5MT6AY1JDCEG88
'SP2FK5QYXX63QQ27S6V33QVY7JDV0N2WSTYWVWND9
'SPZAP95MR6FMTXYFEWTBQRMB4GCJVZF66GKJVA0W
'SP2SWF3PVG9RVFQSDEZMZ05QEB04RRX3REE87S6FP
'SP9XD6041FFN5BW6ZR9J3FSESR4S442JPYZJVXBW
'SP1Y27D4F7HTSM43HK391Z3Q8K313JBCWT3ZTASMW
'SP1MAT8HETKQ8857NNK8XETHNM81MZTM81W0J725N
'SP1TS89E1KPQTYRNGX83YZWTV5FXRPNCEPHY0PY4P
'SP3FY30CK1280WQK3RKB7GP8FGXWBQ0DC0R40P45A
'SPW4N9KS9PJNC7Q8J3NDP1TX52413T82CJ65WFBE
'SPZA40GACTGRW8M52H28HMNS80NXN79HT9QDGSBS
'SP2YHQQXYD4N36MAEKC1AZ38BBQB3DQ9JKR5CSVPP
'SP2ZFDM86ST2R3BR1RXH7C151JS49P35T9T2NW8XE
'SPWTD99W80C3BD36S5N020ZVRDC0GBC2WCF34Y83
'SPVQZ0SC3AVM0YSAHPMQK8PMQ9HSWR6YGZ1KMG7K
'SP2ZC6WC1B18PY9G1Y6NZWGRT15YJ270ANC23QKBT
'SP2H5JCNK8Z9FSE8KWZQHVWPWGG6G7RFFWJ754DPJ
'SPRD1HSGPWASY3TQAAKQF22DJV2DBCZM4R70VJMM
'SP2B2AQSBXSZAMBNN11NGP98W22D0E6J854KSF8RE
'SP5516ZJXY1HY0Z5RDS907JJ141XMSZ28XFM4Z0Q
'SPMNTN0ZCT5QBEB2V3CHK9G5907SQGGWE1AANQ7Y
'SP2GCZ2F977QYP2Q5TV5QFNXD472QNK5M9SD9TQW3
'SP3YB66326B68Q1AV52CEBF8TSK5X1PM6QDN8Q96Q
'SP3XAF2KSVEN2JGF1ERV8EA5CNYBVB83AD8AWV5AX
'SPSYTQN988CGZ77470XWV8XJ6KDHAMBCK8X8MBNB
'SP11YY69VKWW1N966QW3HPPFEW8Q92R2S7242XH78
'SP130A1D3WTK5H6AKFND65N88H71JGF8HXDM1MK09
'SP14JH0V56M4EN5GMC4M4P0D3ZGBNB9BR3HQZ79Y8
'SP15K35EPGE1XJ4TYNA5W2DAZK4FR16RR35K2RWF2
'SP17SKMVA2K8E24QF536QNQM5CNVXBQWTGCQB8Z9T
'SP17Z5YHPE0C1KXHBDY0TYSW0Z4JV6TGK713H6QYV
'SP18330JGP6V4ZYGVJXHPQ0JSWNTEQX6YMMQJTP8T
'SP19ZVYCFYGZJRXXSAXQRT4GC25PNRG0Q03P4XXAK
'SP1G3BYR25HPC8SA2HPSCNTARD947H3V2H2VPPSVZ
'SP1GWTYCEQPYRAYT5PTAKBH7S2X3S4YHQMWD9M3GY
'SP1HJ3612EG6VRCND053WGWP2V1H67N78MXYCEPM2
'SP1JV2VDFQV3DXB52XJKRC37W0W5E27BDRWQSAJH6
'SP1JXYRB0CS94SSAYGTQGBZK1ZVZVHDW8BQ8BEJ4C
'SP1N9X8KB8ARJ2S217P97V4AXBX9369RP1Y1NMK48
))
(define-public (burn-mint-zststx)
(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? .zststx set-approved-contract (as-contract tx-sender) true))
(try! (contract-call? .zststx-v1-0 set-approved-contract (as-contract tx-sender) true))
(try! (contract-call? .zststx-v1-2 set-approved-contract (as-contract tx-sender) true))
(try! (contract-call? .zststx-v2-0 set-approved-contract (as-contract tx-sender) true))
;; burn/mint v2 to v3
(try! (fold check-err (map consolidate-ststx-lambda ststx-holders) (ok true)))
;; disable access
(try! (contract-call? .zststx set-approved-contract (as-contract tx-sender) false))
(try! (contract-call? .zststx-v1-0 set-approved-contract (as-contract tx-sender) false))
(try! (contract-call? .zststx-v1-2 set-approved-contract (as-contract tx-sender) false))
(try! (contract-call? .zststx-v2-0 set-approved-contract (as-contract tx-sender) false))
(var-set executed-burn-mint true)
(ok true)
)
)
(define-private (consolidate-ststx-lambda (account principal))
(consolidate-ststx-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-ststx-balance-to-v3 (account principal))
(let (
;; burns old balances and mints to the latest version
(v0-balance (unwrap-panic (contract-call? .zststx get-principal-balance account)))
(v1-balance (unwrap-panic (contract-call? .zststx-v1-0 get-principal-balance account)))
(v2-balance (unwrap-panic (contract-call? .zststx-v1-2 get-principal-balance account)))
)
(if (> v0-balance u0)
(begin
(try! (contract-call? .zststx burn v0-balance account))
(try! (contract-call? .zststx-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? .zststx-v1-0 burn v1-balance account))
(try! (contract-call? .zststx-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? .zststx-v1-2 burn v2-balance account))
(try! (contract-call? .zststx-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))
)
)