;; 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
'SP1QTSSVHRQKX42CEY9NZ0Q808J5MTPXGV41Q35YF
'SP1SQFWYGWX2JPNQTG87PHFX4H2WHB64Y334J0E6F
'SP28XSESN0BTCBS8X91YHW8PXD7RQP77JJPW4XMH1
'SP2EPZQ71PXY783S6R4493FW7C4TXXF8652HW5SCQ
'SP3942ACZ73Q768Y19A1QTWJBTPCSDV3ZEDQSNYJK
'SP6JAVT15GK449RBXGYDZHWRF0E8XGSRDREK1YGQ
'SPHPBWK05V0XCN1H97T8SEBHGXTG7KNFYQ4PYXJ1
'SPR0DKQ8BNXRMB4W20MAFPSSXP70WS65A715MHS
'SP109KATYDW3TC8ZNZF0WGF58S5XF8PDAW5WVPYYX
'SP1612JVQASPPNP72HBWPXBR9JNKVC45Q35MZTAVQ
'SP1Z74Y3HNTZV2F03F6JA3JQ685JWG6BTPTJ0QDKJ
'SP215NR9D2ZHQK92FKBA7GHN84HB4TJVGN5PZ36P5
'SP3G6F3AS6TJYVG173D21DS283XHWJ9V00GBZ13AS
'SP3M8P704ME3V511T0ZR0N457W38B0Q3PKSH415EC
'SP3PH86GR1VZASJ20YK0G9P60B6Z2MMNC96Y765A1
'SP8NAN40X1TR6HX82VNG0CYTKQ4TTMY600TW1DFA
'SP9XM5KZYD9V1FMAZYQBZA2RVTTMY3745FFZB6XZ
'SPFQCP1A7V9SGJ8WHRBDP8WP771V46YMW344AG6E
'SPP82DZ6J5JZ4J6BXT68K8DPVE7NHR5VVH0KC4Y8
'SP257T4QVF4EB2QSZWP0TK112QEWDSRPYQ1EEJEJ8
'SP2EJ9AP25022C0ADCAGXTFKFQVFAEF7XYZEJB5JK
'SP1QPZ5HT3JBD17CAF40FZXTR81P8KKAXHHZQNWDB
'SP3CCXW93VY31ADKW3HE73PSGBSKJ9FFH9EFN82BF
'SP2PNA3NH6WRFTVGF88TS89F3RYG801YPXPHWG3KF
'SP3HSPZ2ZN19AMHM022VR8VWEG015MC2DYD22H4CM
'SP2D0MKNF3CV7EQY2HPX10D9YMQG6AB104M808N55
'SP2V01M60V88T7HF2WT7PEB53B4BFS3A0TJV2H5NW
'SPKMG3623R1D5XTJXG80RGMDZ0C462BXBJ3Q1K1G
'SP3KRJTWQ83KV8GNFXQVKZY8Q594SQ6AKSAVP5Y0S
'SP2BACT48Z5Z82A3BZN7NXTGD6TGM6A93BQSD0HP5
'SP1RNRWWNY052GAT7B3E8S3TWM7D7MRP6HPEDF215
'SPR99A9WZ2ESJCRMZA5WGR9DHWKYGGRT9337G4C
'SP1Z15KWHMWFH6N4XQ8RNTMWN4KQVBFKAQW1ZX8VX
'SP1JBDCKXVSPRW6340Y3P31DBFBSYJ42DK012G64R
'SP245KAZ48Q4N1RE6PCHGRANYH6TXX0DG4PQSAT8V
'SP1NN5RP6G9NV7JCBBBWQX1X2KY813005G4VKWTCB
'SP35H4EKMEHS4HJKBB6HDX9909ZCWDF0GFX2NRN3
'SPV9X7J2SXDT2EDEY8YCQGBZKD63JX737VQPMSQF
'SP1RS94BWM0F66GB40N299FF8AQJ8GM5W0BCB5JVS
'SP3KE8ZDNZ0QCKCWXMW1NVGFBZ83TP985SPRFYXVB
'SPK8A95GCX48AAV8HDPQMEVTBVYJ0M067K45SBNP
'SP3ESWRH568H33R78NH67JS9GX8CG1C5RYCZRYPDN
'SP14QR1861Z6CDJ9QZPBZNEHKVE4229MQDQA3394X
'SP26KG3J25NRJC3HC2BD6930WKE8DAEM0QK6PXZ35
'SP8YSRK1GXZTPNGRYW06M744FVTQSKY0MWJ2KE2W
'SPHBNR9MN87MN4MG5SSTKYC1MSTR14M0WWK9A6BT
'SP300XEHTEBJT8BE9R6QABC2XYS38JBF00P0RFDH5
'SPAWF26YJTQVCVPY2B0PCWFE070SFCSHFVTMY067
'SP3D556RSW44FZHPS2YQJ9C6HK18HW1MEEN6D1CE5
'SP2E0C29AVHH8DDY10MZ4K97PTCZ2SEVNE96F1WJ1
'SP1M2Z1QTJCWYMF0F5JB5KYNDHZRWKBSJEAYHHPY4
'SP22KS826Q8ZPKVHAA0DTMHB6KRASHS7A5P6PKN6W
'SP24GMJYZ8A9975CZF7ZR3QKGFMF84QTKTNF4NRR9
'SP385NP4NGJ28P0HE6355HHA9B18763Q2QP69GX4R
'SP3KJ6CQASTSGD0Z7A19V33VAMSEMY0XPD80F0XCA
'SP13688SZPX05F6VT48ND1KRKYS72CXDCKE3XC1S3
'SP1AZZK1771VF680CW9V61H1XVHX3R9ZJKSD3496G
'SP1CEQF1GK3DXJ9PTB9NQMQNK1SR8FJR1ADBREQ6F
'SP1KEC0T7NJ8JAYG6G5WNK609HWTKZP1ZSHAM6TF9
'SP1WXRMPVSP5NSHRE24KEAQETCC8KYNYTV58CS55H
'SP21BKCJC80FR7T55Z0ZTKGP7BC8HJV6B99T4BM34
'SP23NGNEG3DXR9SGAZ1FN8VK1SXZAHPZ4EB8HFT41
'SP27NAC1H0YGMG939XNZW6ET1R84Z873W73EXB8QA
'SP3D16S6RS6667WTZF0CY3ZF07ERVWRK1K721RGDC
'SP583YCXSJ1C0C48CX85DHKQMV5JD1PJG3YQBCS0
'SPM19B8JM0RQR38VYATJ0W2C6AZNEDKEHBY5N60Z
'SPW7M55XXDFP6VP7E4CW4AWAQ6S6X6NBZQEKV83H
'SPX844BXY4H5BWBB1ACFSFF25SPC5K3FP0XE8VKZ
'SP1QJDPGAJPRGQN4T1X6RHGAEJTAQ9DG68CXADQH2
'SP1HAZNEA5A56YKH7KM18M39DE0DV0H7ZX5K9FT3J
'SP1BCD986ZZ71D7K1PJ76MEQGE5A0430JP3XEP2EB
'SP33DNHJ2P3XCB5R5JF0TCA6R8ATG7NJCV3D4R5T2
'SP18Q01BQT4QNJBHSSQCP534E71B7A9DD1X1M6069
'SP3FHG75XH0KMKDEBJ3BSFTQHWZ7KFGVSKHT41B3N
'SPT12CDNQ1M0EYGCA3GF1VKP95W837SZ345GRM5S
'SP1G3TT99S4KTQCNCM5QN7MV73JBX54AY387J8M2T
'SP224G21ZK17WA7D2VZC17JPWQ1PWEDPB418HM127
'SP2RNDYEAZWKVDB06TT761GRZ67VV8WVV4YBH6W73
'SP28Y4F82SRB420KDJC2BPE6TQ52A9HXMAKWVPJPE
'SP39TBSPBEBSSZWEFWAC2FZR9V94C05EWCFHW91ZT
'SP1EQPJS15JMH6YHA079SH15E77ZZB321NQBR5RZ1
'SP3XGM1Q16NMC4Q7NY50H708GAXRT32BWHRCZ9J2B
'SP16VHK2PS58YM582Y1K27374T6Q64MYZ1XJWN1FR
'SP1NQJ3QXX4KW0R0G9WHZ26S96T5KF9VM6K0FJN3V
'SP315XBDYJXGQZ9T3JMV2D9H90AJDWPV4V78FQMGK
'SP3AH0JM7FYBGT4FH8GA1A20XTDVQ3NPZGGB7N5AG
'SPBHVPH6JCG2XSD7JAF17X60BN6EPR67KYRDN20A
'SPMS02JR723GVC4YRNC6NSMH0ACBGMSZE7XN5271
'SP3VRAKW72G7GEM2YYT9GV3QK51NNBGNRNEEHEZC0
'SPFAB8A6D49T8WVHGE0NM6YQJYEDGDM6E2WAH8MP
'SP5H2M81YDS6A8EX2ZP0KBPDHM6CVWHJQC2Y92W1
'SP29C68FVGV48H7GNFSRRQQJMC3VMVCRTXNCGBFRV
'SP2X4SDD5KGTQ225ENR03BVCH2V6F28EBX60814AQ
'SP368221WC2VG7FBKXV9WZV1H392AWA3VXRZ9RRNN
'SP2FSQ43XMXR76HN1X0YMXWJN4NX7HKKC6DX7D2H6
'SP1RR6PNPESZSC8Y7APDX0GZCBJ394YSFPKVMDK3V
'SP2HQ825GJ0DDW4QZ26DA1HTTNMFVJV0SNFPN4XT0
'SP1232YJY3NM44265BK37ZC3S6BQ1JXB4MZG1MAZ9
'SP2K3F56YDVABD2MQG01KGJ0RQZYY4C8B6VJS5GT4
'SP25QW4AHC6707ZKDSYYZ46051ZAQ46WKVXAWANFV
'SP6KRD4ZC5XWCAV3Y13PRGWE5MMYARCSQ500HMVS
'SP1M9ZCKKVZ64YJBXQ3J7D583CFY5SMEXPSAXH7D7
'SPQAEDQNPDPD2GEDD8MAHZCSYK61G9EEGVGJYQCD
'SPZ9HDY5E9TNN5HZPXXZBRMXQX91PRH88GW55BFF
'SP2KD79FKDGDM8K9HRBG26YC6MNAD3EFM7A6A9ZM1
'SPMMGJRF75N96PCMVQDMC0Z494FNENAHANRV0YVF
'SP35MPPWKDMNVQZV54VXJ68P6CXWFRVWYT00B9KXP
'SP3HWGJK8QX4NST283XCGBJSNASJENMC1AN4G3BFJ
'SP1974GCPXTJWQ3RFZK5AEX57KR0795YE2RHGSWJZ
'SP3BWND6AM8E7BE6RMZXF0HTFVRFWC95007C4983Y
'SP3DWBR82JNVM12ZSB4AAG9TR3H7C5P5Q5XT69NPS
'SP3N9TS22GFG2JH1BJA0JPPTXK7RTYCJNMVZ7XM9R
'SPDFV56J717C5TVRSN7DR6C5H4BY9ARF2HFNKJ51
'SP3AXDTQX90ZEK0N5KPZZYM0HPJ1MJ7ZR5TZ3B5J5
'SP14WHZA3PF2YJ4GFY30CQ5VXXREGRP2H7DGV87YA
'SP1EB80713ZFETGR8S3KBV8K7WCEHYD9JWNC8PKN6
'SP1H0BYZV0TZBZHAFYPWSDWREYKWJJG8038E7EQX2
'SP1KJSAPJ2XJAFSE3TDGCPFR1TCSCAT4D2CPYE4TP
'SP1KPBGP2XT0TSWJPQFKPD9BYPVE0K577E0ER4CT0
'SP1PMXTRHC1XE9GW85YQMMHG6YZJC0Z0WS6MYHKMY
'SP1QQN26PNJC8TD49FEJT5C724AWAV32WHDGADX0J
'SP28XAJ7VKVRP98W92MG44K8YAT8TZEFPQK4CZABM
'SP2DTEE7S9QQD2AGEZ5FHBZMJ0ZMF8P7DZBKEKE74
'SP3163VNMQR33CXNEKVNAMY9E3Y92R1NPWFVJRGGP
'SP379F3C8GP8P8AQBW2XZK19M8E931QJG8P989PK8
'SP3JM11KT5JPM0QHQ8595X0C20X1Q4WXAR7BNM3BA
'SP3P05D4FYZA8JD0TJRTPQV2WXGSEYARSAR2RJ99Y
'SPMRWFR3A694JWBVA9NNVJMCHM5783E3JNQA9B1H
'SPV04KH4DBYA5DK1Z9JRP04VG1WAH3H6P9QH2H42
'SPWJAFHY9W429CHCF4W5J6M586VKKG9X95RCJNDJ
'SP2XD5DWC4MV7EESVAXZ54KHGJBSGR3XGJV7HC4DZ
'SP1MW3AW4CMK1FNRGQ2RTCF53HRC5Z5JBTM00H81X
'SPXM2HC3Z9TG1JJMDYN5892X3DM2ERQ77KF4QPGT
'SP1E3DQ5RHZM51KHNAN8FSPT7HX6TNT42P7WDVWWK
'SP6HWZGDYMCVN5EJ02S8X415SERB4VZSQSTXCE72
'SPPFNMNCX6Q2TCDJJHGAC763C12875NA97R6F8NJ
'SP1X755JKKQ88WXNTXHEX0EJ12W957AZAQEH28JWW
'SP1FFYZ5D6QZASSV76STRKBWPRB9VMBKYF9EMNYW5
'SP3CBJC1C3XA9J0ZA7HXNK67AWECP6XX6TF58A1A0
'SPCPXYYZEXDBKMQHYG6EG9PX59T19KP0H0RJSDT3
'SP3612WSXDWE16B7GQEEMGMA04EE4XCH9M7V40Z5Y
'SP1E7F45EV6NQJ6XNH3W06DV5P6EQRRYXDRVDXCGA
'SP32556X6B0V9GDE9GRX6BQ7EBKV6HSKG3ERZG58S
'SP1BRHMJD4H6C5NQFA6HYGKFX6Z2E75J7WD7QZ5X5
'SP2JSPQD7M61NMJ77PVDXA7SQEPHSRR3V1NNQ8J80
'SPYS2VWA4306ASCEYR03Q785X2YENQB1BGF6Y8DF
'SP263ACQ08D5J4PWQFTHAX8GG0TDFCGX3MKG43HKX
'SP099VSFS5TK88TM1GJ3MWKHPBA3XMG0PG3PFYYR
'SP2SE5910ANTWH06F32V892KQTEAGWFV7RBBX11CQ
'SP3WC7TCFBPVZDARCDTSZB5NV5C73E643S03SM9R9
'SP3Y6TRFRFWMK1MZ660VGG9Q7TH9XNQRVKHCM9EA3
'SPFF2RQTP864RRA58NEJ886G75T4J32XEJ37CCWJ
'SP30GSD56W7864WR53E1J4A1H7XC88SR7RXT0TMEE
'SPTN43YKK34RFDZM45YAPWAPAVD33PN38BB1JFWV
'SP2YFZKRZ6TJ2MGD4148QPY2M3PCEZB727XFYFARG
'SP1E3SYVDWCA3TRWT6TF2C3GAHSZB0NSEAQ46WEK2
'SP3953FB8S7F2WCXF7398CXF38ZM49E5C244J91NY
'SP3KMYV70ZDN6EH42W6FXW76GCG77NJPD1SGT6C9B
'SP1RVC8T0ZEFBB02VRK6ASERG6QQ0YSGB10BZQREP
'SP15PDXH4MEW0NZX7P8NM4K1M81E5CRFH705VBCG6
'SP2AJTGB4GBG9CJ9DRX5HMQGHEM34KNH3DXSS7HF1
'SP2VTG5QDQ6HHW0G4FGAZ3E9EHS4WS7Y966SRGNAG
'SP3308YQTG8XGG3PFK35KJJA0TYCG0RVVRVQ3HXZA
'SP1A3225DQ95B2ZBFDP36DZYK63Q9N00EZCXRH8BK
'SP20HWFWFRYM4VNASWK14EWTFVBZCB992NP7MNZ53
'SP3CSDCC7EVPGXVWRFFSDMZNGZ6Z3T956BPGCWPB3
'SP3JCNGT06X8T79KAZGG5XS8ZGGMS8DSPYXEFJ26
'SPKPC9WPM60DHAD1WHTCDC1M55YE0ZYD8J88X54Q
'SPZX735T7Z97GSC7GZM6RP7BKMYKBZNGTGAG2XAF
'SP3JJVFJHYF83D3EWEVDHCFXN1AEFM61BN98TA5NP
'SP1DMY09AC1716AQ4BQ6F9XC4QK5PRT0C4H3AN0SH
'SP1KSPYGMENSE273CGPEDGW7ZBCJTYRRM1A6ER3ZK
'SP3N83E2GM68KKQDW8BR0VDRXH9VVHQEJ3ATZFQJ7
'SP3GP0D1A19TFFF40QVVSXESWRSBVR2NV03FZGDYY
'SP3JFGYA2CZNCA5NR654AXK54EXY38FHKVDQ093J2
'SP3ZMRR6M0YV2EG2C43MJCHTRG6R7YQMPKR1G25AW
'SP2TQCP43Y2KGJJ64T9EHVRDHGD4CRFBWS8W41QH6
'SP3RVVNA7MKG8Z4B0C7WKZCQVSKRMQPDQGWACE9SF
'SP3ZWA4895AZJ16QNE8WJHCCK9HPZBV5JM1CJQZ23
'SP1H9SVTH7HJQWPH620Z9QSSEZPNNTGPWPAYESJ20
'SP1YCXKS2M73899W7BCAW3NBRQJCB62ZYVABWYTGM
'SP21JTQXW01SSEQBFJG3F0QTSN907XDDCAKCGCVJT
'SP2D7PG71J84XGRCKAWC3ZDHZ2R80QN4SHZN2DY5B
'SP2N994D7NGFC71SRPDDY5Z1TWZ1PRH0R7CEDYR67
'SP2YJW1HA7FY2FBEMEKJYDD6RX9EBAGQ8JECX44C4
'SP2ZVF10TKX0CB2VK2C2F2CQ31GYYE05VHP28HCPP
'SP30PJRM2E3KXGF2289PB44ZFTGSX5BRRNJ2Q0AFM
'SP31V48MFS28BFC5S8DSWVHNDW9E5CGTE85WDQMGB
'SP3JTNRJXP7T8RM0GZRGVCYCW8ZPJJHS54J3RATE
'SP3PAFA4N0SAYJQQ3N24QQC9PNQK7211D2R5HKZ72
'SP7BZRBZMP1XJWP3RQDAQRA7PTYGB2FE4S1X8T7D
'SPD916KQF90CRTBCAAGQFFMX5KD5G2RC257KMDYV
'SPE2QZA0K5R8DHFBSZFQEH3PHWF68V0FDKQ7VJGQ
'SPNQMBXEM92PQH5VE12E82JG74PHPP1TW5FAT84P
'SPTQANDS81X5P9DJCCZ4NGHVA508R6K9C3HYD7AQ
'SP3MTMK8YQ3PYX66ZT59JGJ173ZBHTHJCXNPEEW32
'SP2HRC2R8XYXHBFJ0RQXKQNANYEDWE4V91PQ0XF68
'SP1159JBSJX2E7TCRMQT5HGXDZZCNC7S5K418TW9R
'SPD14397EJ75FDMAA61CYGTDNN3Q5M8DVT7E469F
'SP2Z7E3KQ7ZEB43D0DAT7NACYAC4QX8KM49TP5MKK
))
(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))
)
)