;; 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
'SP3GSSCC9DBPFP97033XDSVHDX6TMQJ2DCN56P5HN
'SPDA28P15FHRT0734TP5RD7D0KHTF0JGCRYE8BSZ
'SPK047AAFMWTZ8GT0RBSZR00Z0H48Q01SS73NNAZ
'SP3RYPWG23E3GNJYGGS1XNF1EF7DPSS2K0P908PGQ
'SPQXWA0XAR61JRDH8YDBEBZM54CZDK1P9JC0C1WQ
'SPKKTBR81KJ3PQ2KZ2Z4XQJT295BKQZV816095KC
'SPMP52C8S7WA69887YY516D8HHHB5DSMEDEXY3QJ
'SP12ES6760QNTDV4Z52CKKCR97W4K9JF35M2VYHSW
'SP20MJMY2H5KXCMZR34JY76R3EQEY6T2KNNZ1K9CT
'SP1R48QY0W8YGTVBGRMMMSZ643B6PNB1VKR8AEAYC
'SP285FVD7DDYBFHVM25HEQVR6XRM9GBP9SHK5RBYP
'SPTKHZQZ806K740S99G6ECB1726YF326E47AKRXQ
'SP1MJQZ81330T7AFHDE8XGH6154FJPVVABSFX9P7Z
'SP3KB5V38YGGZQ1AWNBCT12VQ2XEFHXE3QVZKFS0A
'SP2VHK8HS0BGZBPCW0J4XME6M1QEFGVZMMC8TRD14
'SP13CZA5ZGBZN2QTHRY7AK25WV1FEHGHTXB3BKS2D
'SP18T8G59THD4TZM9E976SQY0F4926C6H708R4RG4
'SP2ERR437ENM9JPXDNBM3CNBZV1F68D6RWDSYY2BN
'SP2A8E9BY1YYHP0JMTJZXWQ8GMQXGZZJ72K808C6Y
'SP2GNB9FFRJT535M1FABRN0RQYEBKPNPGDM2P444R
'SPEV1TS51EM2D20SWA4NGKV7BEHQ22Z35JY18DK8
'SPBNSSPSTNYTQR6W8MV1HS0K4YMG6XN6P5896J0F
'SP18KJGK2H5NGESXTGS37NP16ZVWXK4HE3WXMRSCE
'SP38D9FGRVH1DHE54Q5E4J50E662RXJWY6ZYP2274
'SP3BBTYVYEJM1YMRS5DBZY7W30NV3DF1MJ90TE0ZR
'SP2YE8VZ47745VKKQ290BRX971V9MGZGJ6HDBT3YN
'SP2591N54T6FTX1YJND3TKDY5TB1RWFFWXZYW9XZ
'SP166J8YBC4978V3DV006E9S0G44QVGPA88BXV5FE
'SP39VDGM02VMDTAAXC0DC1HB7GX1QQJBEGMMMZA8Z
'SP3NVC92JAQXZPQGZZVY1ZBWTC7KXQNBZRX8EAF54
'SP38VV5MQWYZQPV7GHDNA82J78W3VQK8YPRHM3Q6N
'SPWTRNX2JMD6CRSG5YXFKQQXNX3NVR50QF3QM3NS
'SP1JHDHYF7S1BWW9DN3692XKY2Y16NN50FWNYZ3Y0
'SP2GSCZJN8QQ8E61PSDG0BENC1FTXCVBF9HZYBSYK
'SP2KGCD5QCV5CJRESDW96TQC8MZ7DQQ0BFD3C3890
'SP1GZ0B2T5TK1KGF0F15DTS3ERFYN7SH5CA9AFFYE
'SP1KT7QB19VQEHZ4EW0VFEZ0457KA12F6FTC7ZYKN
'SP2CW7DNCNH6Q6V8C7S1X87M0NZ72E2MCMX6DPMY5
'SP9FTAY4SXYGGGPAF569TNPSN96T58GB8TKMCXXP
'SP1E2V57HFWD0HSN0H751Y9WSMZFXTCFBG0F85VRM
'SP366Z8WNVRPKTNTSYBJV16H16MSZRETSK0BVD23D
'SP38BJX467AEVRQPEMJRX041WHXS1S4NS3SZ1HZV1
'SP38DK4JAY0NVH59QM21EBBNQWZPXB94K0FXK0JJ8
'SP1R8K9ZE5XVB9Q13WRA250MX4J1RYGSXABSQ69W1
'SP1HVG66BYR7ZW38S2DCYYD9BAKBQ7C1JQJGXWC69
'SP161281WXR94CVTSR3JBQWKY1BXNHTA6QQH656KY
'SP3X27NM39MR9HM98D8PEWAHE420JK3X090S1382Q
'SP2XMN0ZJH25DTXHNEMZ5DH930PYC950SSKCHRD3J
'SP2WY0X4X1G7GW2QDT9CWTRGMC1PNDJR0CK5ZFZQY
'SP1732D0QHNYX4RH99EVNTSR36T8A876CBKGQ8FFF
'SP178HJT9D65AG7VBEJESFGQHRPTT8G6006EKCMN7
'SP1E50HZ81ZXPKW9JQ36WAQJV6WH9ZBQTNBN7MTPJ
'SP1P9YKCG5EXVC1RPJ55RHZGCMBH4S7NJB8BV0DC1
'SP1PBZQ1W1S49QVCBS4VGM62WMQ6EFZ75Y9G3AGYQ
'SP2W01TKZDZEXMSNTSQ48N162RB1DTHAQPWDZ4PCD
'SP2WFE6Y77CWKGF8AADJR4HB30WDSQEDXRA2NCX3Z
'SP3TFKTJZYPCBX2NDXJ9WCJXVTW3SWVVVWM2C3AXG
'SP3ZBH0E1AB575QMQ0GKNFB81VJSYKRKM06GDQ9DZ
'SPTBDWVHN5164JKC53VNZJRJSV8Y9Q5WDYPJSFMV
'SP20MEDNQ9ZBF6ADVZFEWRH474J6WHJDD8N06NGSJ
'SP3TC69G3696435GB20QDY5ZXP0CJFE1BFX44VPZH
'SP3CWXSK6JY2DAN7KY873P4VWN6TJR73670GSEXCC
'SP2HXFYD2BHNEVPX01SKK26N45GBKJ5E3X72G1XEG
'SP2Z1FQGG4BW74GVSS5K82Q9Y5BDM44RYZZG0ZHZ3
'SP16NKD1F4528VM115N3ZC9Z0K8H6V1TYRSHM7ZF1
'SP1031T8ER3VKTXDCEFVTB2SQEC7WJMXECAP4V59F
'SP2DB4HC9RM0AT5RF1YSTEMMWZ6ETPKMW0W4RRT1H
'SP2BEBDJYKG9QVMF87QEFZMATRBV9ME2ACFA5AY1R
'SP28GK03GBYF27ES8GPEAD5X06DECJCDP4XSS3FAS
'SPEXFBMSDS656FAV6V9TRPAPY9G7XGAASE9PYJGA
'SP2SDVG8PPFV4DMJKVE0PN1HZKW8WWJ272M097D8K
'SPBQ6QY471478FVZ2ECZ118JT3YAVF5CBXXQCEP2
'SP20XJSVQX6MMXK3QXZD3TJKB2AMFDWAW2PZQGZ69
'SPQHN087TCXJNA34PHDVGTFXTE3WMA8KPBRTX1X5
'SP3EFATMQT0TA243Y7QECYVNC1T630PHGS6P6006N
'SP19G975RDN2RGF8TYF1WBFGM3BVN1WZ31WTMFZWY
'SP1JKXYACM1WN4YKQMW16VWZXSNKHXSYHDRT32VXC
'SP2G4X9XCK4V9MJXE9YHCVC9NYXH3Q6V2Z6G4WC0
'SP3GK1A22KDY7ASBFB2ZV2HF5S2VREXDVYGQ1FF6D
'SP3HVHCEX464WHXPQ6Z1KFGY6WM8VFRMGY1M59V43
'SP3TK9E1FC6X1PZJVJSY78YX487RJQZN5AYH5JYS
'SP2SD6F55PRA5SRHEX7GQJFRQN3PR8AYQF1T0F6S7
'SP7EPGMZ6MZ37EYGGHEG4A23XCFYPWJ19WG70BHG
'SP1Y4PGH86P3EHK5ADTEQ6G7VT9HJHZHNEFFBRA70
'SP3W5GBYN9D8G425DA5HNNA4KSVBYRMTAJZZHCB8W
'SP22SM689EZH0AYPTF4W4WYGEKWY9TV83RD1HQ1KG
'SP12WRYW2WQH5PE5KD0GX091N1WBCRK4C95SE3A73
'SP34T0DS0ECN32J0JK891YP6JQ8VZDHJ98MPR74GX
'SP12JWWTT9Z26JBXCMBBNW0WT1NB5Y2CE5N6HYGTX
'SPDYEST76G05NFJKPBGWXYF2X9BNDZKRRY1S61SN
'SP1965EVW84AN2FN3JPAWM2464Y0NCXW15MB79RQX
'SP19WVC8SQADT5J0HB47NVMMHW8GHPGZFG8XQPRFS
'SP3AQS1N9SQQB03YF0HG5KS7A2KPJYB9T81623NHY
'SP735H0MNC2MZE7DKP086M342SYVDSR7C0T71CJF
'SP1WBCBPEJ1PA2NDJTC3792ZCGMSA2Q5D9J1HRPA6
'SP6SVZRG52SS35ANKZR0RTBE0CN982E3AJZZKZF3
'SP65380NSY3N1RXA61CJ99ZP2561X10CGNTSEYS5
'SP3Q8DE0858VWF82Z8VHQMXD8RGR3120JG6XG81QP
'SPP7SF3VCAS55KRRSA6X1NGQ76VNAAFKQ0NEK5K
'SP1ZJ9HZ2W8GZTRD710SGD0AY71AW0KK9SJGGJ077
'SP1JEP2M7SMMRNM4FRE64SK68B3XDK739CT8W8SAR
'SP191TPZ8Y62YKDYVFGTV79QN49AK72BTYSM570RN
'SP3EY1VNMNW71X1DF80Z942YGMHQFDPD66QRTVTT2
'SPM2JZ5R7M6AZQTXKEM94K63E2CN95TT6AMMA5PP
'SP20SQZS5Z1DFZ5JWZ33GE6PFGPJTFSZKB45P423
'SP2N5VENNB1ZES5Y2E53DE0SEP2ES51BR21TR66P6
'SP2W61PTFSGFPQFD8G09308AMZBQDAA01X71NZ47S
'SP2EN45QPCEHPJA67MQ0QGE2THD15MWEPWNDEK2Q5
'SP205MT9CR2VM1C849E6N10WCENQY614XBNCZ08SY
'SP2MQH7WB2K4KYQ7H2XGWF1MPWYQAT7EVAQ4NF7MS
'SPY7DXSJF8AP4DW1KWCW36ETTKMTSB4HW6C75VWK
'SP279BV3MYNZ31JWX1TNS53JH71QWA4C40E82NG7K
'SPPY66JNSVRKT8V15NY59WZCSZPP9SJ78FT29NPV
'SP21SZ259KJ62FPZKBAADCA7TXTTBXXEGRHC195KR
'SP1BSY4EJAWBR78CAK8K9N0AM1VA4T7BN5CHFY4ZB
'SP36ZWG5VDWQH5A7X1HZY5W09TDNGZ19C5PAQD06P
'SP1CGEA6WP9NAMCDAT5HVRG9DA8QSA3BEXQKY50K8
'SP318B1ZG9XBY8T2KQWXZ903P64JEBRMYTHJMSVGS
'SP504ZBHP6NVF487R7ATW4HZ0MX999QEW8TQK2SB
'SP2HRQ930E1ZCJM3X9XVPDD6K7P51TBCXKN8PTSSQ
'SP3YBGWRSHSV4E8MC7NGH5SQ4W9ZGFEY1G960DVJS
'SP3HJ7XSYGMF9JCTGGBEWZH7EVG63715XX1V0QSV2
'SPACDC8RGAAX550YMVKT6J9CMT7048482DX0JF8K
'SP27B3WMMG9VCQGCDQ7P9TYKXVS79BJ3ERZ4WNRJV
'SP2C99SXNC1THSZBBJHK350F8F71XW13673HYZZE
'SP34FF6KTQ8VNC52VFVQWAY96H9W2ENTVZTQ02JSJ
'SPKJR0XQXJKFB9DY0ZYKA3R938F06CZ8K575SG9C
'SP3HJK9P7PKZBMVK2X526K78XV4R0WCNGV3FKB58T
'SP2XE4K93R9TKP4H1AJBJH84P1X2FCXE4BYKR174C
'SP1CSZ1Y4G16GT9YJ8D23NW22P1F6HFW5BN83GD9J
'SP38B3WP9S7MM428XQPB7PJZ983825KNTSDCPZSCB
'SP7TKAMJ0V8TSY316HJ88QGXBAKT2V7AXZDHCX4D
'SPFJP2VW86NG4M4725C6KT5FAJ3CK7481Q6WHWBH
'SP1F4RS9K8VMTK6VGW6QXMDGF6WBQZE7AV4P6JEEP
'SP3Y7RFSRMRZBST9HHF3RHFQEKKV5W3PHGYYB96Y8
'SP12NFRWKF2SRV656YZKKWRN026BRNJ0FCQ864PXJ
'SP37M9PYWK0N2DH6DPJJCBNNAEEVWBMDAHBA2H1S7
'SP35J9GR0BSZ1TV4FHX4E45E9JYEZ439AWKA10AG4
'SP24E694062W16QBNXPAJ6FTFM4XVYWEMAT5DJ7FQ
'SP3HR568582J0G4AVCRAKD513527GF2K6CVKQ8PRM
'SPPB1A7VEVMMY6M3ER3BMBBJYW9NNM9GQ0KVVC8M
'SP1A9NJCYPQ8B0B8Q1ETG55T8YYG7X3S5EBEHZXMS
'SPWGTCJWFA5TDJKY7WVNY360SYR5BE64K96WQC8N
'SP8P5Z54AWBZATHD6WGR3MN6SQQ7KMX6SV7RYJ7T
'SP17951KHZ2D8Z8QYFD3YKRHNZTPVPHQ4061EX42J
'SP1874T7TRER4NZTH87PS5XC1W457Q8VB0FCST6TF
'SP2BEFSB43KR4M6C9117SA2A6T4SA6H0X1XDZF716
'SP2RSV8RE5J2KVTJ3FJTAFPKB8E6AMACVS9MBEWNH
'SP94XBKTMBVVTRB4CCHH7N75AT15EBE9ZDYV7PPH
'SP2WC3S1S4K04EVZXCDVHNTGMPZ8Y8T1WSD6X0KWA
'SPGRV3KWMW5A8VSZGKNHMS6JXD82MQ5ZTT0E6W0P
'SPW8JW1GERWDCY8XXEKW1TC939547DCMW1M2XENK
'SP3YKW7DBTYDSA0FJH1EF8Q208A9HP65RAP4WEG5H
'SP8P0JQNTB4DYS3R59BH2BWB4NMJCRQ3QG3ZBB2D
'SP1236HDA42B1BNDECR6M97PE660J8Y6P4VXMFR1K
'SP3A5ZVBV3ZTNSFC5XNYAYN6V3RFRQWFHQH5QX4S7
'SP2CWKGNX1E1XT4F7W56KQZGMZ3MNQWHGDPGVA00G
'SP1ZACF7WEXMNXV9R03C1QRPGM8V6DQ7KB919RNDH
'SP1ZBJY9YDNHFWRP12VQSK259N1J53ABJ6HDTJVT5
'SP1R0JXJEGHKR97M4H6RPFXAGX8QT3SYVRHQDFVSQ
'SPYJ7JAWA02WSRH51ZSFYVBKQ80H6B3G9K3B7CKZ
'SPRTGGX3PRNP6MVCHX3P486JZHCFXZRQ8YS5QJ7K
'SP214CGYXQCBJWA41Z4T3N8MM39G9WWR6AHYKRJFK
'SP3X6BV2AGBCDQHVQ6DD689E8ZY4XJBN10NNNXZR9
'SPF1QH9WN8VYP4WQ7WV3Z7HG6E409NYQM2HGYVBF
'SP3AYRMSGRYXWGPE9D219AJF7XCNM3EMWXK3QBC91
'SP24YQX6EGWWABD80WKP733HFJX8F4CRX6S6WDP37
'SP1XJE1F8JAX0XKDWZR4XE7V96MYDXRQAA2AB94RD
'SP3MTVR17D40ZGRZWGAPKSVRATYZJP66PFDAVNADF
'SP19TNWV1S9NJ4H5QWYWYFCD2G1S703ATNVQBT80F
'SP3Q7Z62WWZMASTKV5WNQ8EN9EC8MZY6CTC3MZPJN
'SP16Y367028R1ZT5B918N1BKPM7RQQ4QHHW19CGMK
'SP24GYD8ZF3RN0B359BD29WF2FBZEKBNA9KWP5H02
'SPMZEM2KV4GS59VS9DYN35YYK3P20XV2922918GJ
'SPE9D75RQKZVDFQH5HRA8PG73SMZPNYM2296CQCK
'SP25NQV0CGGXBNAJWNE617TD9H8TZ8KRGHXGF7YMN
'SP366NWB1DQHA9EQWFJ4EBNKM51KWMRKTQGTSA4RJ
'SP2FY6DR6K2RXWJ1WKF41M7V0WZY7ECN7T2MGG5FA
'SPW3CMTHZB13KB61KR4HPDRTBV1VRBJCXQGETS2W
'SP3ZTHANVYY5FM4GN6AH479PHX1CN9QJMS1FZXVEN
'SP1K51PR6KXQKWGHNRJFK92SCYTAPYDKHEVWX5TPZ
'SP24R1TPRHW720G3GDM0TAV9GPBNAQBRVHCF9575T
'SPBVQ97925R5S67BAB4D4SHEBDFFX6TMDKAGE8AZ
'SP3N7YV23ZNSRS9W4WAZBB8RN71FTRVB2847QSM1W
'SP274JYGEQHMBJWC0S925CT3CNX4WPWD8Z303BCG9
'SP1S2S18XDQ71A92JVN898S621XAQBDQMY6WT4EA4
'SP3RYB9ZR6S9Z36FNYG9SAE5MKKHJSJZZFJZ23777
'SP3XCYWZV85MKTW9ESN60A008DC5HZBG0ABT3Z498
'SP6G8CM8JWF8WVJYVGN4BK9G25DMVVVR9HF7QKRV
'SP1C3603663D9K103S8JG3W5EVY7MNRW259ZNFYDG
'SP15ZGMJC9W74NARD5VPB4DNBB1AB92YH3JXFET5D
'SP19V54WD431PG6VCS5NE31BAWVQ9DB4WVHN5Z579
'SP3NSY0F75PNNKEPT0D2SHSDGY3SDD90449X504QC
'SP1T2M9TX05Z0S8FXA6SSA8N6BJHEYQQJMCH68P32
'SP2NRJT9NWYHVDK1KTE1978P2YMN2T8JE92H2525F
'SP3PWNRZ7XC8RQWKS0T7DRGX78ERX07FXK5P8S8Z5
'SP2YGK04Y8K4KP8N2F9BJWS98B5VAP3CBECMZRPT6
'SPX4BWHPH4CSCP3159KR8EACAQ9CQVX2N3W67K0K
'SP2P1XY1S6MP2YXRANN1ZHJQXJV8K9KD7EP0FFC69
'SP1T6NMGT92PGM9N5274PFTHXAC04B7K4TX1510MM
))
(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))
)
)