;; 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
'SP27DJMK46Q1977C04S2TC1YH1HCCK0KNH5CZA4KP
'SPF4JSWSV021QBYAN4PQPJ589MNXYPK98J59VTGH
'SP118R52XTMWJTZWGT09VMC307HRDVPXB2F57YSTY
'SP2G8XQ3HY26Z69GFXXZV408AQK70NVQ044F3Q6MS
'SP2QY8S6GYJWH8GMX8P8ANCFHNK9F2VK7T14H6JDQ
'SP3ADPF1R31REZGRYMC8G62XY3X6KRMFK75YM914J
'SP16KBGJKY8749514KQJ2Y7X5ERTED6EFABKKCEG4
'SP82G5J2J17SN8TDWBD8DGZQENXDM71GJYBSKBRV
'SP23YTQDD36TXW1Z3CFKGHWBGDBB4R2B0GFTZ649Q
'SP19KC16DDY7AN0HD05ZXT91Z3007TERPDC5HGBAS
'SP1RD3QDXGMSGBR9BD5JZV5W628H42TKQ7Q0TY5E7
'SP20S8B48QB0BQBS046FAXP1N7E098PR8PGK5RZPV
'SP24CRF0GSN7G734B7RW0A5TG3RDANG2PQFM04SQR
'SP2J8T14430XHBNC1FGFVVSB5GQE713BAH9GHQ378
'SP2JH55EAB92XKCDENF37W8E9QB7M95GSHKNHSM72
'SP2MM20DQHTSXEVR1K5CRMFKW1N1YFF28F0ZPHSGG
'SP31WF88NYVKRJPWV44T19Z4M55ZKNDX1KTAYAZYH
'SP3251DB02QY1EC543VFWVRVD9GRK94EA5Y8W1289
'SP3R3BXRSNCCDBVXP8SV7EYDV6WTQY5WPA13BAB3W
'SPR0EQRD0ZFJSY5AH3ZMGV9XC1A0AYZJX7914YAK
'SP2FF3M47FVY2PGE71MCEZ5DEAKK80R3AHDTH3PK7
'SP2CZAPSA8PMFP9FE0BPKAB83X10QR0C099DYGPMK
'SP3DZWHXZF12MTW3WP8TN3KA5XH09TK8QNKC1SD9G
'SP1SRYXNXTNRKT174CQ21V0KR329295SMR31CM3S7
'SP2VE39M87CWWQZ82EX5Y4P8JMEH0PPXPPJC09N3W
'SP36FES4VZ0CRSSFASE7GPSDK2EZN65V39MEBQDHX
'SP3PVB8V4SCTEMJ6KW6Y0WPW7VDPTG2NN1AF484NH
'SP18A6PSVMYTC9REXF5MED259S5Y9TRHHD8Z7Y69N
'SP2M8THMJDTMT27QJ6BMZN5V8PG1C3FGXS39YA1AB
'SP1WT0MNXRA8Z0TEE7FS4Y836HQ62WR0ZPXG31T51
'SP1HA8S0S5CZSY20WCHZG249RMF4AAQBGK7DEMEZM
'SP27VRX2R0C310JA0CBFV1NZDPFQNC97J26KV7HEQ
'SP2FER9MBKXXWPWVHSJVM26YRC4C996SV6E5JB2FA
'SP1MY46M5JQ4TXHKX6MDF6BZDPJDC17M30PPV4RTZ
'SP3PY9MMK498GT10XZQBPP34RSBGBJVSQ1AVDYSG7
'SP2CS8JCCSMKNN47TG0D3S4KBCRVWH8N8M9EBKTSA
'SP2TRWVT8WAEV9D96G3PDNX9AHDAH6Y0MVYW8B2Z2
'SP2AA13R5HPVEV57RKHY59XZ8XGN2E71C1KEBFSWV
'SP3JNACGEX37WW3GJM4SHZMZ04QMDRVHY63DC58HQ
'SP1ZQYG5H5SPF4Z49RAZDKMFSGKK7ACTYNY3QM70C
'SP3CA3WGSEEY7FDN93920187NN6JZAFWWGA09D63S
'SP2Q94KJX8F2Y24FKQ56JB6FMZ5QCEW0H2YTRG5KW
'SP73813P0X4ER4KTWQX796NC9T500P092KJNDYDN
'SP2925X9ZAQJ8BCZDJXD591YVR65JCQAM18SHKCPB
'SP1JES6BF7VN9840VTXGT5MB36SY0PAE3KP7FQNTZ
'SP1ZN3QYDX9J8F1V8HDBB16WZ9EVG762XRPED0HMD
'SP1SHNXDRWV9WHB18GTFK4GEFMMG2JC5X7WYVCBD2
'SP33A07WCCVPV1T2DR60VEV0438ZX3D39EJBJJST7
'SPNRR1SRABG9VG67FPEKP0T02ADK1YAJ328ZZAZ4
'SP1QJND5B1AKD62WJXWBZQ3Y3B0075A8W53GACZSE
'SPHV0XKVMFNHMH94Z9BZEXY7QDCPA9P70NHTYCN5
'SP26M0D73ZRBKCW385ZHP02DBGWCAY4Y4FFPFWEGK
'SP4XNJ46PSB9Y2A9042SX509Q6XRSXPTQ3JMB25H
'SP143HB25C8NHJ2170H1XXG1H88RC6DKJTNJP98QE
'SP1KKD2QHZSFPBR8T8833YR7PMZ655ECZ8JJPP25Z
'SPWV51E9AJFX130258AN5630F5JGH0SW8664H4HW
'SP2GG01D9KJD83T2J2WVH16M5WZG5PXEC2SHDZ2V0
'SP3F6G7BCHKGTT9CZ92589F8S39M3WV6XBBKQQ4BJ
'SP1GR3KAWAMASAP3VM3A0B7S0KNTH28GBP5QXM7Z0
'SP1QPM5R1WX75ZAF8N32PVZVGX599CAZ21XZST0WB
'SP3FWTJFVKASJ28ZFHGGM7SJQK67KCMR20Z5BHRC0
'SP3VYVR5N8X92W52EC0CFM7D73JSGQJ8PVTSB3PBF
'SPC5SBS86W7ERFQB6JC2V66TTV3FYRKBPP62V9Q8
'SP3SW0AZBG4TFR7MYBSEC14KEGHPBQTEWD83DCNP0
'SP28HEE4DKS663N4J1FZ8DQZ029R8ANAKA9AG1A8H
'SPRGKWHWMD4XSZH9Q8F2JA6M9ZP1CV0PZXBJK11T
'SP37G57APVTZK2HYTH0ZYAX0HYPHNSCQ879GHWWA7
'SP3R6DGXHDAJBACQY58TTP3TF23WCGCQSBFYJPSTB
'SP27Z6YQP3AXG22H1M8FQYWERYAZCW839C246YR58
'SPMYZC3EQYQ73RJFZKYBF7D76BNWEVR7TCH7XDBD
'SP2D2CGSED9KY0JDZ5S5AH18Q6ND84GWE3H2K8ATD
'SP3N32RZSS712MXDV1RASQJT0T6J7DCN2ZVGMPHT0
'SP271KAWDJXG9V17JAMHGVZKXBDT6174K6NK6FKF
'SP18J924CYWH27917JA095FSY17F7BJQ6SSR3G5ER
'SP55DR77BE23GPRX1ZP2PXHV0FEW1YVEEZYKT45C
'SP1RJ35XQDC8CMB7P1XPHBFBGNSH0GK99PVEFQATD
'SPW25HV76Z5BVGVP4SR7Y64GHW8Y670YTD9MER8C
'SPW3K0YEJ48DSYFBZVTS0QQJPGWZBHP1V5CHAWR
'SP2DJTTZD81H14PW20J9B1NP6X7KT9YAMC5RZ041S
'SP249FW0PZF4Q7T74RD2401WVAZCJ5JXB3X9K4ZKB
'SP26YTTWHY3FK0E2SGT8CXCBF8RZQSKSAEDQ9774Y
'SP2Q6V9SAWDCJD0ZG9BQZJH5MRQ8F4YGDSSHQCZ8G
'SP3ZV9GT3C86V08BE1V27EMN96BF8249A9GRSEVQN
'SPW9PN5NQY0WWEVPEY0YTVTDAW9KJQM6DB5VRTN4
'SPK39Q4SZZ0JCQZ18X6R2X64EDX5Z1DSHJHME67G
'SP2SJKF39G4JNKSXFX4KHTRW44YGFT7A8JP4HNXGH
'SP346392NAEJ3CNFQM5VR8TFD2GKCJ6ZHJDYG65PJ
'SPQ0NV3ZMFV2PHD15BK1E216958AXDY374CB9Q9H
'SPZKJ0JYQJ7HPG43ZYA6520ZAD13ET55NZMNZ1ZE
'SP381FBRR8NGAGDACH059JSYZR8D0GQHJM12GNYZE
'SP2PM0ZC1JEWF325GJHT235E2Z42E0EMH13K7YQFP
'SP28PBWQF53NAPTJVDM01VWED604ZZ09Z1VM0D8ZZ
'SP25FJ3B7S8KSWD63WVF176ZA5HEPVXTPRZ8YR9CS
'SPVT5G3RMBCDV7DAW34RPH4FH64SC0GQPKRS5PD3
'SP18DV3R6YQY3KDJ12E57V79Y1WX3C4ZKQ3VWZGEG
'SP3KVTS0FPZPDW6NMJJ4DV1QJYQ9YFHSZHXDX02CT
'SP118TYVQEKPSB2J2Q26NRY3Y0RR2ERJFD2VVH1VP
'SP2XPNZA2VB3M1HNE6ABHK1DR9YAPP20ACYN3KYA6
'SP1KE36VPP3CQG0SGT0H64ZH94TQ0WQXCTTJS5NV7
'SP1V0PPF17P2BV83H0S3QWTWH0GYYA3YQYE430Y1H
'SP2W13BVYTVCEBHKXG1H3195PXGFFWVVPPWZ1SSMA
'SP1YB1D9T4N43ND3PSJEWX6JVVRWRKVEESD9H80ZA
'SP2197BC4G84VYHT52K92EVW4SQ6VF3ZY7E3RA2E8
'SP33TTNT4XZ4D2BW3HCY63MN2TJZQP7WQTNGWFTBD
'SP5TN2MP8EW41ECDDS9R10AZJAACV5RFBVP6PR6X
'SP28M47TAJH1VJTH4CMJ1ZKWHCFP4YA29E2WNZDNQ
'SP1AKV8JTRJ2M8E9HEGDDFG05A3ME3P13PP5KVAFT
'SPMTGRW374B5HYWNVHNQ69CDR5J81X0JZ8FG4981
'SP3KEAPV2K6Z5Y7TA7K5WYY2BYE19320DK7D9RBH3
'SP3VFM5YAH8W0W2ZYD1P3Y6JNMXJ33Y9HQDR2V9Z8
'SP1KB1N79XG1C9NXQ5JQMGBSJ41ZJ2R6T3V9EACVG
'SP3GND3T5N1FTTQCK3F7KCM8DD23J9C38DPS1GQKP
'SP211MNK9MSGMR628T3696X12TMKVVWQ7N2TT3KD5
'SP1JJ42MYKV4WXPA0VZCK7SK5015HVVFCZDY06NZZ
'SPXH0C0Y1SPGF14W3VCEECC9DKXKY0EH17S8YC08
'SP9V2WP3G21J3XZV5CRCEVWDQTG259739SX569AY
'SPK7H00T21T5E5GP7MWDP3WYXASV3YP48HMEQH2D
'SP3YTK5GSHJQMQJWWH661K6GJ0R2CJD0S29ZJ5HEX
'SPZS50A0C3V23F3XSAMTTA9J4B33T45SZKJM57XZ
'SP3YVGMA31TMGHJK8FW2HFM8YNJHJW2WR7FWZ4WA1
'SP1K4K0HJHKQZ1VYR38Q6F0DCKQJBN99C6KSEYQAG
'SP142YBFT3NMNB0Y6HEYEQWDSXVXQGG1EGSBA4ZWV
'SP3S08PWPWHJVZQFKWSBM007Z553MVFCF44ZYMK70
'SPCPAPDGA87BXQWMDQPM5DHKW9HM5XTXWWDP9P78
'SP38M3Z6W0T2HBQA4DPNB9ZQFJ1M2XG5CJ271C1AM
'SP1Q9SC2P66BRTPPGAASSX8WNSZ38C3XF9XPRFSAT
'SP3ZJJ1528NXYXCQMR1BAFD269G48MBW0EZT8XZD9
'SP24088SJH8TCHFBKVE6K6VM6TNJ6HWKD68TAMCA5
'SPA9MEDDBCZGWKJWVFCVR7NR1VNG12SBV3W1SDD0
'SP2CGDSKJX6N1QJ2ENF7E9QG94HVGDRAM1YA7R0M4
'SP2DXQY1G61WJZW81V457RB9398JDV1Q9DFZAEEEQ
'SPAS6SB39A6YXF85P9EQA02YNYC60VM36H81Y4V5
'SPV7NW8M6SZNPW8NYWEQCW4HDXBR1DAM3922Z0XW
'SP1389M014H5B4N3JFK55PVVT2EDXKRX44VJG973Z
'SP2FQ8SD5P0ZH4MPBPD4P8VFW8BW0ZAKYCMDQ48BH
'SP33KA50YG9RCPDC7FNS0FEDF8J4P5ZWGWTXSKWTY
'SP2PGQ059ZKX2C4WC0E8GFKTQAZR6GTYPG7YV9PCZ
'SP34M6KFH1D9H3VJM1G7S1K057PVFCT3GNHRK5RN1
'SP11H7YGNJYAPPRMB36S5ZHMPZFHKA0099SADHYP8
'SP3GTYGPYT1G1Q2ASCCVW01NC2H6P6JBAJJDD9ERN
'SP11JS1MKCFR0GCZXTJW52B87QK0GZWA2C2VA2SY9
'SP3YSPMQ7EANV6CTV0PEBNFJ8DAAZE8AGCS5VCQJB
'SP21TNJGAC1X3Q8313SNXKTHREYF2D3HCNRGKGRM4
'SPYTFAGR3808H1350053KWRYAMR8SYAPTMY7T87N
'SP1T1YRMSGJDV73GPD7Y5CMFFS1EDS1YV4WW9860
'SP2A7JBTA21WPFVRDSRRAS187AYRAG5FMXH4Y6YE0
'SP2EDAAEV65TRBVMENKSQV0HKKJX36JPHVGXNAWN8
'SP1HFZYFM0K5PAZ581T1VFAG8CM1R4KWWDG5QA1HZ
'SP1S93MC98JK9EH47M300CEW9Q6E59J0F6TZV80GH
'SP2JBM7JE960C2GHRKZG01G3Q0WMCEZ7HQA9P863B
'SP32G7ABWZ3E0JMQ84FN7VQ28J6DPBDHP2WBCDSG0
'SP3GRA4VX9WGSN4SCBZAJM94HNRTMEYEXBZBD0BAP
'SP7BZH2EWC5PYSACJ74NM5Y2TK5PAHP71AXJSM8Y
'SPSR5YZD184K60XA5NQ84HJEPKJMW8M90K99V4S3
'SP246P4FA1FHDMKSXNM59HPTA3S8KT1VW67G8GPP9
'SP33MABXW0DT3QEEYQT6ZADF0DV82Z8BW8YWE48T1
'SP1VFQFVF6QKEVDSRVQA3HTBPZBRPV2ZJVZYETASF
'SP36QA1YJ9TJ4AG86R9BWSS8HVZWP8A0H013NCTBV
'SP1B7W8W59FS91B7SP6TVRJYCRJQHY8ZP8Y69T1W1
'SP2H6B6ST4AD8263JE6XQTD827FMP2R7KTT3FYYBN
'SP203XEQGN5HF524870AXYNZM3HNFKMG0Z4Y09SJA
'SP7A512Y0G7TX0N38FD3DB5JH4VA2BQV6T3Q9CVP
'SP372PDFR3MPKZ3RMYY10G2XTYV7YAA6ABPSHZZVY
'SP3S45ZEY6TT7PY2NHDQXD915VT4HT6T5PZXCJQ82
'SP2YX1568ZQK8JBQNJ7947XCNNWAZGJYZFFBW5VWA
'SP3X6RAX5BFAQXQE2PZP1JEK5XBEJJV1NMGANGQ36
'SP865PKHG2V9YQ9HMS0DFW9KPMVBXRFDNZXC2R04
'SP2SM3T2DGXW8CMB6J8GC0EH71ZP283PDEAYDJ7S5
'SP186EJBZCQ3H4AVFB075NSZA4KYXRSWMD5ED3PBR
'SP1HQRV4DSNEM2X8J1BW4TYTK6XGQXC05F2VQM30F
'SP1MBN1J1TSMPCHCEXNM5PXTR29FEB4KTZ1M8TB9V
'SP25NB9AXH5T0H3PXWY5HJEMQXXSH4SMR5P51BZY
'SP29RZTMH3V7Y10WGZFDH0SJDB1QK14D194EYRJ8N
'SP2BM6Z2PM2GWANPHZQ7K9SWQDB4PEZC8FPWERSV9
'SP2C9T27P2WYP6V4P2PR5EQ64WBJ1VS420Y1RH59E
'SP2DGE9JW0R0NY3AQH6M5K99AKFFJWZ2E7RZPYJF2
'SP39SPG4ZFVSE1EKZ3DD3EGW57CQJ0X4X0A51JP0J
'SP3PBZ28WNWJGNMMSBJBYZ815YE6S7VJHCK4262BW
'SP3ZMRW01TN27C9X2QDX3WE01YQ38DEJE5E2B1GNJ
'SP7QWJXFAAT6ADYNSSPC3DSQS02BRFRF0CEQ9M9T
'SP9ZW9E7F8BVPQADZA7BXXH1AE91TWYP4KGX453W
'SPAVJVPCEWSC4P9S1ERAQ0MKCF5QTVBXBTWET5BE
'SPC3H20FHE4NHAEV7NKT85E1VQF1JKG7F1C808VK
'SP2W3MRK6246WPR3702CVAMV76XNPE99WNZ2RKQMY
'SP2Z2WTK3DV3PTEQZ82N3CCGKAJ3T87RPKV6KMJNZ
'SP3FGTW3QR0N1C49NYZXSFHYEHZYQM471FYZ154KE
'SP24TGK0QJGJS4GKS7RZXJ40DC03CWPJSH0EVDTMR
'SP2WBXVZV29DNPD8Q3VX88PHSRR47689PNQ54Z7Y4
'SP22J4K1CV5K2X75QVNW4W6YMM7E7JEF70JF0ZJHA
'SP1GCWHYHGYKGT4CDP782KM94ZZ5E1DHHF0D59G5C
'SP2QZT3P5NZR2WG910S84B3YW3G6ES5WZ7Y9Z6B0R
'SPM8CGZART0BXZW6PT1Q82NPX04WW48TFHD7J9KF
'SPACGWHC2TANJK0MFT70K2J7SE4AMETF7B9R2ZBA
'SP2M7ZFWNHXJT7Y1HDR4M44ZZ58X1NQABRZAWA258
'SP2QCX3NM62FT5XN88C8HK7PCRNCX9WG51TR00RV4
'SP1G7SS5NSR89JZVQR8F62GQK7MP86D53823NB0A5
'SP3TR8BEX8M4B93ZDP06BFWW8SYDHANTYHKZ142FV
'SP341ME1ZVR2MP40246BTHBQJYZAYBSQPN980DTK1
'SP3MT5CP34PMM5H8M0R4Q52P5MR5JN0YM9TYSYVZM
'SP4TY7WVVFBX0XDQ25JB0P617Y7BAY163AJFGEKS
))
(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))
)
)