;; 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
'SP3Q8CE0R6QTS388857WQ8V1CX98Z0484PNK1SXHR
'SPEF3STVF4JTVC5GE6DYPA7J8095J282FR15D8YY
'SP1GZQM6RC5KRTH6Q6381PZDE8CRET1509DD8YDB
'SP11XBJ7KY71K3EYQVTS9RF55M050NVCYSMDGE6AC
'SP3HH362D85VFQZQW242XJBD4NVWKNP0TF678RSNB
'SP9RX3GG1MQWD3G6ZPN43H0V5NVFGXJBC94SJTS5
'SP24Z9YPQ4TTP04Q0V77FNNK5MPWCRJQ2WQYR945D
'SP1GWFDBR3WHQSA9GBSTZHQ3CD7F0E5G0GBNM0EQF
'SPWZEH1TST626FDZZ14B50PD0TQ0EB925STNYH1V
'SP6ZCVNK7XV1ZNDSJGHCFH796C0GRRZVEP40D1HN
'SP3YACBT0H2DF547EKYNHCNAT2MH8XJA5YYK8K08Y
'SP38B5H07H1XJ756EEPMS8VBJE9HPGH03C50VPNAJ
'SP21NRXVCC65MGVJP60AJAPDV54G2GBEZ1XZVBXYR
'SP2JZMF3FE47C3KFAWW1E25BJXFAQ0YVNEAMADHVV
'SP3WTKFTRF7GB78HVJP9BYB0C15SSJN674NRSJE4E
'SP32N4VGESRVK0B8BAC5JW69A6T0Y8EK576ZG2ZY9
'SP1E4XHAN5Q4GGH1CTX08SPGA2XAVVR4D5FTBGJ0F
'SP1PEJAHPFT6ZQ8EK7XHVT5MNABXKR7SF89QC6QR5
'SPEPSP99786JRCYN4CSCZYQZFAQNTCVTMQ4B5S2Z
'SPW0APJDJDN673JB1RH3WE21BY3J8HTEMDRV5QKR
'SP126ZXTFRARKBYKZKRSW1GGWZTTDGESME7C9ZPF3
'SP1PTC7V3SABKR0DZ4EK84PN5MH1GWEK0VP700K9G
'SP3VD55GB1QP6WVSVFXCFGVH1K761J6RGWDGW7TZP
'SP3DA7ZV36X7JWQY2PHPNQ4658EDZ7CD94M0QHRFB
'SP2KQ3NTWQTWGAC18T6TC2QG5JD4ARQH1MWXYNGYC
'SP360NSG1FVW1VDK34Y01EBMARW2J6JV0P0VZZXCA
'SP1943YQ7FTHDZ4G7Y5VGRE5EQE8WW1APTJ6MVV0A
'SP23CFGV0MF81K2YKFFW2K3DYTCHP2RXPS40R1T8Y
'SP2TP83WPXQ67493B6TXTJ9GCW1TWQAAA51WN718K
'SP2WG7N730RTWR8JW3CZ2FRVM0MM2CD1VXQG8RM73
'SP2XBE5WAKRXS6JY89FWEJS6KE5JFRP8N5SH9JXV8
'SPZD9VKAYG22QGM5CVCKEGAJBY5Z4GWWXR51MS9R
'SP1GS0QB29RMP9CHBYXF8RGC3RK3EJT59CFCZY8YJ
'SPH8BHKXCAR99VR0FM1TRQJENB9JKRBGVPJYPEJC
'SPVBKQ7W54FV6Y7J81ZJEGPWHQ00MXGA0APME5XJ
'SP10QFXZ8K0BJC13S65RZGBYMCNG3H4ZG7CP7MV9A
'SP152MGQDSB61Q5BJ9D37HVS4P91X6MM9BTAJEFWV
'SP132BA7V6ZHETTM4SYK4JDDGMYFR7RZPXBB328M1
'SP2ZZMW6XBAWC358HS4JS2V5RCCEVRZ83BYE9XWSB
'SPJ4S588T8MMSTECEXMGGZ60W9CNZ72QQ7FZCT65
'SPRQFZQEREK2BCSZ75XGBY2Y4A0XWX16QT2PE96P
'SP14FA5F6ZQH4Q379Q7Q3B3SN7QK753AWA2YBNXNS
'SP2K3PDV1H55SVFNNFA1HJAJ3VKHN1RJH8B0JJEKN
'SP2Z2CBMGWB9MQZAF5Z8X56KS69XRV3SJF4WKJ7J9
'SP36P70X095JTH29ZNHGRVW636QZGPTQ2AG1HD1YH
'SP2BAVCA9CHK6NY0HZATJB5R2BQN82GV40Z8AHEE9
'SP29BKXQ4T29P3PBWHCJ69Y1CD07FQFV6GPBY220F
'SP32SWZYA024PC08CBJFZ1KE376GFZC3SHTV2BP1J
'SPWY23XJPAWQZWJHFDT6KA07TTDS5NED13V43EVF
'SP37P8KJT0DX4NTYTKNA5MNMSKXKB9PSVMQMP265C
'SP305DH1G931D4TR5SD2MW8S60QYWVVX50K7R1CAP
'SPBDF12Z84Y2897E2HD93F2QQ5F9FA8S5AWVB2Q8
'SPF763BX7BDZJ4SGS1PADPH0QGZ8NPFMP0W8XBS7
'SPBCF0KY0K4GQE9FMS7G0D41FF4F6SMMPCD7JW4P
'SP3PNM7H5FC3AD1TENNGA9G5A8ZP1M4KQ2YQ5ZFYV
'SP16YV03BQC0PG1AWY99QN6J4PR6C29ADNH4JQ4ND
'SP1JFDZXYVWBWSDA8NHHT4D0R2BENZ06X1MC5XBZ4
'SP34EBCGWF7JZMDEWV3YQ83KR62NHJS1JQHQADG6A
'SP2PHD84GEFTVG7MDAHM8YC4RFVME9RJDJF49TX3T
'SP29MM0AX37654JBFVK992B6GRH6F8RGTT76P5N2K
'SP14XKSS1Z1W4W03RHGYR84P1YTF9818GDE8YMZTP
'SPWDN8SX01N2310G2A9Y7M20QQZ9KC594DQ0QZKH
'SP3KZYTDJDYSXKRZHX4397FMK6B3BQ9WDJ4HYKTKW
'SP3QZSQJKKC4E9J32KQY1KH83Z3QRRYBTSHPZYRDQ
'SP18ECMRFBB3WPMHSD2YHYMX73QDZE47JF3M6HDHZ
'SP7YBCQX95K87ACQS48B8D8EJG72FWK2HD9FX2H0
'SP1ZJR0N14B04FX9PEVKT11J9T413DF6623MEBDNF
'SPGWA16Q09KX1B3ARY62DY9D8ZSXTR8D448RBT4S
'SP1TG72THVGHPWPE0BWNB5GT4B7CARHPGWH2PA6TA
'SP3JENZKFB8A2BGCTFSQVX7JKBKF2ZGRJFH73ZP9S
'SP3NCJ26C1Q242ECVKH5KWATJYXFWY7CDZD7E3DGX
'SP25M2XDF314123EYE36YK65V61WE800BJ75ZHP94
'SPG5QQ1K506D2SAKCWGG8ZGE25HKCC5V0096QEVH
'SP3BY4E9JXGDP2GEMA2395PZY3BJJ19NRVT532P4E
'SP1B9DJD7B2JAQ1F72JSSC8A047468DAN2FD0JY4W
'SP1HPF7C3ZA0EX63N48RQKVMNX9N988C7DWWTC95W
'SP1DP772MMNNEA7PVSSKZMZYA0K2PMTF92AYBWDAJ
'SP2HJE5SBEBRAKP8578X0XVR1BR76932V0349VNG4
'SPB8ENM3PV9T7QMED7THTVHEE2ZHJVYK5S4RAYB4
'SP23SWBHRJJXTHNMJJD8JRW445074M06JC3BBFZHQ
'SP3X588PDAM6VDDFPJPZ0EA7NB1T1947QS269SW27
'SPHCF1WBK6XF724W73FWSJYDB4R1ZCZEK9DZ67DQ
'SP11C1T880E8A4TVYSYVFXXMSSE10ZS429N99Q5AZ
'SPJCSG2ZJD95JR4QG9Z0EP786WN7T3CAF7GKBD01
'SP19DF2HFEV8Y0S50TADABPNVCCXW93E4WZS91Q5P
'SP22FNESJR7MX9PWAQ18A90CKQKD1VHFRKV6DVK5P
'SP27F8G2HB86FAF72XD4A4YYBMBZKZWNFZYNXRS38
'SPA4D8M8W7X992AE2R0VGCPH0CPNXP1WR78FVTBY
'SP3GC8X8BGJ15A3XHWR8CEDKHHRXP9BAZS5WAR2CF
'SP3GWGD8CHSYQMTMB1RVJYYVAJEX7WQ813PR2RKGK
'SPCGJK5MZDPJ54GN0R4N2XAVH7TCCPY012HZ3RQC
'SPEXTRT7R996Z08X1PGQ93ZTEYVSCTTSM4J7187F
'SP3J29M56AK3XVXWJG5EZ2HSX61GTK7KPNEP86WKM
'SP3RG0Z3RDAJX5RP2KJE7MDBQ2JDFSGC5RA3QX3VN
'SPBTTTS5FQ9P8VR1W16D7QQW5A45D6BERXXC3AKV
'SP22W36VNAT5GDVDFZ2SJJM9Q4PN7W1VKZ00MSRVK
'SPA03F4V3FKXRVGM8P9W4DK40QQX3M2XQMY83BHA
'SP2FT1QA6GR9P9ZPFE4XQCZHQ04ZHJKAV7C51D1M
'SP3Q03WZ7V1Q1K9S8GC4AYG9CQ7P1RN4BVP9GQFW0
'SP1DX0HH933EPJMH297R7Q4PS6GY3NMNZSW99NPYW
'SP2YYYV0PBSHPRHASGC17MTD5ZZ3JVC4Q3BMQVREF
'SP281KA07A1YH2MFW5CJVZF99VCRH2MCQA9XFHRDR
'SP2TK7NKJBPSGFKKWVD7RXDRQARRVRCQJ7FWWA0SK
'SP2HW88B6MEMZZF58BN88YJXYZT5RWE9G358G6WGW
'SP3Q40ZJJ2ZZWE9NR4SG7K85YBBT6FE0QAX1FQQR1
'SP3CCKHETHN8J55XJHNV2AH2F3FWTK1425QWZ9J36
'SPZKJRCJKM6RDHZNJAHCSN9ZAKGPYV35X2JY35KG
'SP1HX14VBXW8P270MVE7WJZZ23MV145EBVB5BEF7T
'SP2DHTTJ24ZCW4DRZVXMRCJGK9RGQ6BP45VXB4C82
'SP3F3DS8H1368NZY6FHRM104CYNTDT6Q5V57N3FAC
'SP3E4CGHCD91PR1REVY6FDBK6MR00A7XCP12ZAGY1
'SPJH70Q4JA2H5GHEMZQXYE8H9XTD3RAWKES1CSZX
'SP3N9PYX8FBRHST3RZY0QQ3KPSKKXCEVW7ZTK6S0T
'SP25JYKWNPVY7G6CVP5BAG0VKFMX3DTH41T8FMGZ4
'SP3DW9KTFJJNE28EMSSSAJ5XMRRTZFQNW33X6P5RT
'SP3NR915K4TKV4CA0RY74AWF0GWET0P6Q1Z8RP2KD
'SP2JT3XFW8QWJRTCAASWW07WJC80XPPKJ1M5JSTQM
'SP3D9HYS1JA088WE5BY1X6HEGWJFQ663ZDY391ZFC
'SP14AATYGAPMK2Z5R5R1FAMT87HWQFHNMFFM5D1ZF
'SP3BAP1WNC3ZGCEX6BJQTZZH1VPZ5BJ2VYJT8D6BP
'SP2TD9H3GY9ZPNB1Q149MYX8HHT8X2Q15ZYQWCKB9
'SP32R7X4ZGDGFNHRFZYQ8YBK16D0K26DYMHWZ05EY
'SP2FPAYJA40TQ572WE8GM7SX1Q7YAZRCFB50DK5JH
'SP2MC8A89S0EV0SC1S0GBP5YP8F3T0KEH4NTXP1HX
'SPWHH8PB7NBTS6ZZWM8T7197675TVWDPZYJSH4BX
'SP3539DTDFG5GFKG4EXEE2T2F6C2DP291JGHCQW88
'SPD081FCXH1S47SNGD8K5T8P0AJMGTCPJYME1WTZ
'SP3BEF3A0GDS3QGQ3YVQVK9ZCXWK9QWTMM79RTDQW
'SP3RFM93P198JDT68NCF5DQH5034WTTR6JD5T5HZ2
'SP1E6EKZY88Y8TT8PJSG00FMXHTC1VBVCN64G7S0X
'SP1XSZW5YHS02PW82FRQV9HXH3MD0GRJFQ08X7RMS
'SP23B0XMZSJW3EX5TSPZZ7D6X9EPT3CA7K2TZFSPB
'SP3K9TP33ZY8FYNX0RBF1PXEW16A1Z4Q9BG5Y2RNS
'SP77Q62SKTNK997F21F2A8V7A38V9SQN1S72NPP9
'SP9CZ3GEZPC1NDK85W0HXQP5NAPF4TQQDRK31G1Q
'SPR8PNGZVNB9CGZCPVZ4GBB1QDANR0KC5VEV9Y9F
'SP26D23DCXVVW66YHZ6Z3DXBGNBJNMA2Y2QYJ0JER
'SP2FHSXHZHXS2S10ARYE0Z8GYT43J3TG7Z8WQZR8M
'SP1KDGFQX2JQNXQNT8NQJPZPVGY0WTAV1SVX7TJPW
'SP22XJABJPMFA5SNG4CN8AQKDJYXMAZT8YBHT0133
'SP3AEEFGP21ND5QZE6FKS8G610B81DXVD0399A5RR
'SP1JTBVQV8XBB7WKPN8GDT8AHXTAQJ1KXK7K6ES4P
'SP2W9V8X6A3YG9140YFJ8MQ7MDHJR5M06RAEDPQA8
'SP2PEHV8R0QKXXT1YMWD551JJRRTMFW9M1Y3GVDA2
'SP3K33J6GFG0R10VZNZBA7PCKNZXQNTMBAQVE1YK2
'SP1SY043Y1S8Y2D88JGY7C4191CJ6BYAT14D9ZXGB
'SP113VAC9F2VNRWWC4SBS3X9MBKYR0VRBPJAWZ2SX
'SP12NT59RP062GR9DFZXEV61YTJD5N1G2PC1YKE83
'SP2GEHNS7HCJSNQP59S6XNWYN21YHWFZE1CXN0BFY
'SP2HTV55CQJJ3HSFDXS7S5RBRJT8YW9SG5TFT0A7S
'SP3A5Z8D47MQSSSR4M4H4S1EJKN3HHYTAATZPGXX1
'SPA4Q216PTXBE9YGG34JN7X7AEHZHTJZQP1YV7A3
'SP51P5Y5731EZHAJH6WHTCB9QQVSP3JFX9JB4M7Z
'SP3VRAGBPHKRCNN47AG8QNB5144DB0BK2CQRRMAWB
'SP29DX2PV40QY2J6Y66MDTVW5KANSGD8VA1FXC6RA
'SP3WJZW73ZEARRP4YCARPB2QYJXCDCXES5HHJ46F1
'SP2SMSPX443W4HTX9YT9WVV5C0A212FJ8WQMGT51M
'SP1J80GGVSZ3E9WJ8J8WDC5NPYY6JPZDCF7ZTBATA
'SPRE4H17RHZT3DY2ZVE56ZRDZQV034VQAT3DJGXQ
'SP2F7T0T9B6ACTKV214E086XWF8PYBV12V7VP9F5V
'SPHF8RG97TEB2FNPJF9BX885BZF98E1TMV33QNRQ
'SPZCY64MG4J3BNCMPE8THZST36QV5EYTEWAVR4C6
'SP1YRFYPSPTPQJFDE07CNHQQ998QMAHG4K39HG71A
'SP27BRY6CDXZ1DGTY5JM4NS24AKHBT20M850ARTR7
'SP3BS93GMDJVB38MY5BY63G73QZ1BA79ERJA50VKF
'SP1G3RZ5YDQ559BQDDKA9EA0QMSJZ43EYYM3HS4Q
'SP2RQZDD02SVJ690DP7H065W46AK082AKWYNBKZ83
'SP3XAGB4X61XCF68MDMFQD8W7MPFHN8HJBCW2E7JA
'SP17KV2ZDVGN94KNXTPA9PAR0Q9EZBM623T63WN1R
'SPC6KYH02BY72QKVK0X6W6XGNDTFNYPZBTA77F12
'SP1SV762CQCZY7BE0KP8CKRS2XZF7AYEBZB5CW8AJ
'SP1385AKRJTN33JJNJVHWRJGG541SXVNC6QKD8SKP
'SP58713EQBKD6ZVSDWY69HW182X72SRBZCA53XMZ
'SP1CTYTS6934Z0R8ZNC09GZ6TNP3EMT7HMPSEEKFS
'SP1EEENYKSHYTFNKHXKG42PBK0N8RKKFRQKYHNY83
'SP2VY1QVQFK36X6Z7KAZNWZ2GMRNZM9CH6NTMV8Z9
'SP2FZFJF5A0AGT0PQCD0CYKWAF09BHS1VJVY0B9VW
'SP3WZWWMGM03Z7B1AKG6YNE0KHAWN781D0TWA0HFD
'SP1ZCQHF16M8CEV7KQ053DD482VQYZMS3XVJJ51X6
'SPVM18R5C1VYTFWE1DCR08XZ2D90BJ4B4D6MCR5J
'SP125K45FQBJX5PWC4S2X1DH2159FSH6YHGSTP2FT
'SP1S655TNCZ5MHB3BJ5FQ8K8FYKDT42ANJ13JHA5G
'SP22W70CBAKZ4P6D78R54DMPFYZPHR76D6QB5YD0B
'SPYB6P29GT1F0PAZQZXYAQYMYEB9MZE105380Z8P
'SPGVENXCEYZ3G8QHTH9FMR416SS1E6QWC34QQBKB
'SP11K4RMT2MVYQD17JWGPZRK2EG0RW7C876BCA662
'SP1DRS6WVXNRKWAMBR66FJFVM1JRRXJJZVJ1NPVWP
'SP2VPBSWZYW732FV0DYYENC4275GJEA5K10P08J4Y
'SP083ZNWHHFS3RVSA1F2GK41HNBH2HJ36N8AVA1K
'SP10JNWG4MF0CY6H30C1AT0RZ8MJVHG1BW6YAAXTP
'SPYWB4VNZR6BER31GT8QC3F6QCXBY3WE1CYWZXD8
'SP3VPHYX0MTFACHWJTXCE0DYJB84HCQBJRW8F1D9V
'SP38QCWS15NZBRA7D3YZSZBWXF2XVWKFCJM7CTCEC
'SP190GFXHFA096G8V7B1SE0221ZJX6D5CPK8FMDY9
'SPMF0VBPE7QAC422FQ5FFPETJP3P8K3FZH5TN7MB
'SP23M260AB5V9N9BJ7GJYSHFQ66R1Q1XTT87H4G1M
'SP2CDJ70KAQM56ETHXD51C0BM344PM20H3M8F9H94
'SPZ4BE75SQD2WWM1J4K6QFAXXKK0S39GGBXAQVYV
'SPNFG66D0TYSES82P6WGXCXG6T8R45QDGVH5JKTC
'SP2K04RKSPMH0PHVEH0WZNCMN0ZFM61ZTE1JF6SJM
))
(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))
)
)