;; 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
'SP2KH0W8Y4NPXWRN021QCBD0GN5HPMYJY0R55DWXM
'SP21PT6TTQK9WRZVDA8ZV6CPWJN5ZTQMK5Z7PZRAW
'SP10DNQD75XYT5YKEE0PCJJTG4P44581XHQ3VKH03
'SPKVZ7XVRR0ZDH7ZCEHDZXT12K7HPJ99P4AYSNAA
'SP2D6J8K8FTGSZT6MBD33YR7XBGYJSENSS42BJHF8
'SP6ZP339KDVEKHH7TRQ9B67WCH6V91S4T1MFGMJ8
'SP1RSQB7JVZCDWR8Z6Y23J6SBY1SKE5HJZRS3W4HW
'SP22M8PNY91V7E8EQHB6CYXTKQ2MZGVBJAAVQGKB4
'SPTJDR1AS6H87Y49D9HZHKZBB5VANHPF6WPYMCGH
'SP137ESKA4QM44Z7K8P0VNYSFAXMHGGSZ9Y452H0V
'SPEQ52N8G7FBYJ96FB3HNZZAYPYKQ0YS6NENQS2J
'SP5027N3VHB0E69F25WMK5XRW2J562FXA3BR4VFA
'SP3T4Z7T2FXHC6WHNV6DDQSGEJWXDXKM8G46D2G3C
'SP269Q58RMAWSHK3BMAQJRYX14XSZ0NX8MBEBK9X3
'SPACVVGXRQA996K235PCFM43A36M5F7S7XZCT432
'SP2JT0W4WH5719EVMRAM0QKSHDTX6PRQFWAX2TR2Y
'SPTPBRSWM4H04W0FK5WD6BNV5G934KA5559TPR77
'SP1G3VG9SJYBE2S0RQQ4PENXX9P0XRQSKHB4671M7
'SP2AFT5744P264YV2Z9RFM918QVFZ2APFPK1BFDHH
'SP2C5F3ZNVPHC1Q1P1TEKJ3N412G91JYTB9ZZ524X
'SP3CGJXKTQV0K76FQXE3BPS37W8FYM542KG6XAWV0
'SPJH1JHRSF0974T8185HF1CW2DMA8Q5HBTPX5VQ0
'SP250E2JMAQZQ0T23B2VW650W1K6Z6584V4ER3YDM
'SP1HYVE03YPB7K5P2DWRT51EM1D48EY10DV7Q6YH7
'SP1TP443R5R7TYSMM8R4068D5A17DKH8E57A57ERF
'SPPV773HXP5PF84VCWCEPQCC6CCDSQ2AGRXPT7TB
'SP3PQFSJASEB527EK7QKC2XS44PE4J049D7SV982Y
'SPER70E2VQMSGHAHBMRVV102CEX5PSRBGEMM5MYC
'SP17RR45C7AJ2G0H0M0SMMPE21RD257ZJNJSK23PG
'SP1T9JECT4SD5CWJM7EFYZ00NVA02YZE648Z9ET7M
'SP266K40HRWJYVM7K7719YE7X6CCYE5V7B28P7PV8
'SP1SBXARKMXJ0QDATSB8BMDZT95Z4EP4V4HRH8QK3
'SP3TVGJPTT75EVG0Y1GGJ2XTA75PHTA751AJZFAVQ
'SP2X5B7V79WVNYNZGCDP7R2EG5C1953H8KVPRPVPP
'SP3XH89X1NYVYQGR6DCMM7CHG82RS0FDK0CGTAJMH
'SP39V3ZKMZMFDE0EKC5GGXD7NDVPCPR32D5EES6TZ
'SPRMAVW90H4DQDS67XHKHFQTR5AH7MHKKSWFTAM3
'SP650Q8SNM305FNZ28Y9R1CYGGHD6NN94H98RPGM
'SP12M06ECF52ZKJQE53PEYNY49K0PVHAW7VAZZGH8
'SP24F0TZ2M4N4A119D21Z8JK3B7JPVK3V77FTKD46
'SP2QKMZ4PG6454VQACNFGKRFGETSD4XNR8CMFBD58
'SP139WZG82T84Q1HJV0Q459YTY74RNDZY2G37N054
'SP18P2EYA4DAR93NC238YNG6RZ50GAFXGYGBJZ09S
'SP32F18J3PNE45MTVKEFNVRDA16JQ4A6ND66M6XNQ
'SP2C30B781FA1RY1VKD976DXQ4W8Y3PV3M4FY4B4D
'SPYR0QZ2Y6BW2ZF4G9GF8H61HQE88BVSV3P2HN9Q
'SP3Q5M1HPQ9K4J75VE5R27M77DB7DCH2R43AN68ZD
'SP3G31325A5T64R85ASCTWSX4E7Y3Z1DNGJ2P3PF1
'SP2KNCSQ0MPTG8N2C61PDMAZMVJ5DHTHE2V9G66M3
'SP1JP03MX7E3D3EFCPEZB3DV75AEVV9XKPXCKE6RH
'SP3HZ9ZD18E3NGFNR6YX2TB3JMK5K0RYN6PSW1AA7
'SPXR3S843X52E27WGT8R4MFQB2QB1V7KKEXN046S
'SP3WFJF9H0TSSMTK95R290T0TZDNYEYZDZ2PTDN4G
'SPQDBQA5KT9SGMGG1JZ18JXDHD6PEPTCMBVHVR2S
'SP3T2KZXKM6KRQYTHPEDA94TP2EGD9RRZN0VK77TB
'SP2577CJ1TXJX9ZENJHBDPP56DAFM4ZQ0A5ABFT10
'SP2Q00D1XZHQJ8EGD3HNTPK74FTXCK3D35B71QWZC
'SP1PSZHDDDJTMBRBKHNRQE7NJY62J0AJ8FKGJJBBA
'SPE8B4S1GBX8W3PKG8K9BZP7FBNNCXRPJJ4BTMN8
'SP3JDMRTY4WG52W47YM35K2EQQY393C62JR1JFYTE
'SP11YKRHKGSAK97RS0A7SR4Q2RPYH0FCEG9SE7VRT
'SP3CNSKQ9SQ1B5P363G0AC10XDPF6DW7TQWDKJTN1
'SP2HR1YJE5T4A2NK1HWDMR21765BQWVBRWDJX7BH1
'SP29BTRRZ0TWSMP8AR8H6PB9MYZP9B82YVNFR89AB
'SPMWMF2VV7290CJC1J13JDNPHP0AVGWKTWANZNP5
'SPGMWBQ0D56SHSSG9T7CGRZ3WYBPESEAZKN3ED2K
'SP1KP60ZSKMS8S030XFHBPV7XF5SQYQ1Y71CJPZ1P
'SP2RDZ1MDC7FB17HP0JFBBAYMCD5BXHR5NHHC1TXR
'SP3AJD04XAH8SD56J6G9Z8H1DFPNM3WANPFP7DSCR
'SPCKGH9BZ8AWSAS8YNSXSB4NAHFNHR9YWKG36BT2
'SP38A8QYPCH5H5GGPA7C8MR7EV0GWCQ4KCJX68C5E
'SP2M7HZZ1NAKM15GGD3Z814K6CM324NVV16W1AGEN
'SP3DGTNM05QJSBKNWNC7NJDTWY0X05E7TWE6K9T67
'SP3RQ9CXJMNFB2W631BAD0QQCEQGBGSY9N2DGRG76
'SP12YP9A079WFRQGYHZTXXB59G8V4SYCFEH1BPK2B
'SP3S70G90BPHFJMYM15N7XRCAADSSGWRJYRAEY4RV
'SP38A4RHRNVT1X4RR6EQ4EKEEFMD2FDHGD2XQE2TQ
'SP36TJ0B1VHSMTCQ8V4TRS7AHC1G9JJEKTZK54Z1C
'SPNZJ5W064M3FJ0YQWYXQ5Q6FNKH7PSKPA8N0M30
'SP1SFHBXKPJVRJHNHSVB6B6YY070JGMHDH7KYM813
'SP3VZ7GVR8EPWV64Y3GQWBG7GGHKG3Y6ZEQE5N84J
'SP1RCJR3X7VW8R3E2V0D6H6PEDGRJD7FMYKWRGBTQ
'SP2M62F1FJ1BRNGX340JTKDFV8XG8SZYE7CHW5ST3
'SP2J60HG8R5B1CQQ5C3725R9JXRB32TQC68BK98MM
'SPQSP0E9WHQE3VC2ECW8EBPBG4SSMYV3W6C554T5
'SPPHW1YPKZ5TNW152D6H1RFGG4XWM3Q9ZVKJQ9NK
'SP1MVZFZPVFTG1K9X8FS1APGYHNG51K6436HDXT9M
'SP1GTFQWST1B4PGWV6DNYEJGK7P4Z45E14H9F2XKZ
'SPK7H4ZC0AFWCECCEAG2AA8C3XM35DGMFEJK7EAX
'SP1S6RJ08P19RRCAEW675K18Y07XE4JKYGE9K1MC4
'SP1WY9A0ARJW05PR45HRHE6GP5C5QKE3RNE7RPJ62
'SP7TVB7Z439YXG3N81F8K9B3M0M26QMJ907CHJXC
'SP5B2QKJVPNDD7F1BV80HKK43M6E0EPAR9ZX7A5Y
'SP3399EM9Q46VCQNS53C099AM5Z5S61TR024HDBG9
'SP38321HDC76NY5NH4A46VT3S80BY0ZC77ZFMFE6A
'SP289HXRF3J5GSS0KZ01MC1T5SVE1D52GVR626TF9
'SP2HS0PKN6N7CRYXP0N064S5NG15CKHGKHY6YEY8Y
'SP1ASF8GN5WEK08XDAJ4AE8E0X9574TNA3WB5NMV9
'SP29TFG4CY0JW8JFA96ZG5PMVDZ45TSBVJ59K0JGH
'SP2S6NK9AYRPZ6KZ47CKPDZHZ8WTT5HTYB8CZJSKY
'SPN71XX3WCB71QRWM2S3CDGTR2YYRYC734W4VTDK
'SP3JD62MMX5JFJ5BHC7ZHEFDV5Q4NER10AE6RV2ZK
'SP49FDDY9PE1PFAE9VWNNYVNEGG41ERDC611K0NB
'SP18HM4G48TF9D0A6TAQAY6YA3S82HY5AK7CKYK7C
'SP09RQ68Q6R1GNK3PYQ6JY0ZRQQGS8WCRKYVPWQR
'SP1H987Z4MGBMZK5YQNBQV2YPAKMPKJ88GPPSY4TV
'SPZ4T7DY2QC66E6M5KTFK2J2BMBVV8K0MA6HG0EN
'SPMFZ7EPDQKYJ6HVQ1DKWMB7AQ52YD484MZDEB3Z
'SP2T1RTF34X5HTT4DT8H1HTBXP3E21HP8Y74S7GH8
'SP20R3AD1KHM52G6FC8MHW198Q8B8WE43NRJ7SRYP
'SP36751XBCWE34SANBRF66ZTQWHHPRQZ4JBV6HDBW
'SP3F6271AGKE16EHZ3DKK7K8300XJ39F68YWGGEG6
'SP1HZ6N1ESJM8Z7HR16BQT716QF4RSE3E06H7CJ5B
'SP32418092W76RCCHMHQX0NM3ESWVDQVKQPF7BGRD
'SP2DEZCYKAM7GA08R7KQWJY3FVSNSCCVFG53H82E1
'SP6ZC4D4PXJCQ6FM39SMFZH65RRXHDA1N2HH19BM
'SP1377NENWEKQSNBSH0N23ZXXS2AEJRR1Y154RWQ8
'SP1424VKN0SN05HRCT6RAADAEH5V79FA4Z4NTT8A2
'SP90T250PYDC5PJ8ZYZCGZE0W66P1E5QFRNJJKBY
'SP1BB3GZ8EG3V4AMCHE0H3PJFZRHV4NX7YC6Q5Y0A
'SPRFW7QSS025A3WPM4C13AN65PGZSQ00XGRB64MN
'SPGSRHBRJ3D8GHV7FQEHF5KYQ3NQB89V9T6M00C
'SP3PEQ33YM12S5PC7TPEQ7W9DFEP6PHTHCG036C82
'SP3B1F9ZDMYFAWS5AAKJSP3YQ3YNK6M16EBAMXFCK
'SPVM3MBFYQZE2KZTFAGY6VW1PJ0PG9NBQA4ZMQW6
'SP3S2G9Y394TKWGYPKGY443FXX3XAD4CMZJ3FDNB
'SP3JG88NAMFPZ69JZR00540Q9XSQF2WCG6AH6YH2Q
'SP2REDDTZPVPE3RQ75M57EZ0YVP5M95KS3CYVTXYQ
'SP25R6PJBXMDK5YBEJ9WCAGBDERSH18TVY2YQJ64X
'SP38M2EG5RJPZC1GD07Y7FJEA7ZSPEBBN1TGNBRHZ
'SPCAGF7XB11CKX24Y94AQR32ZGWG1TQYAV15QKR2
'SP25WMRDJZVAXF3QD9PND203BHREGVKD63HJ59WY1
'SP2AX6SW7CG1B3YHK9AY11522GNFBXF4RWEGPGKX4
'SP2ASEWS7K40F74WC7Q6D69KM8FNS268H52NQVSKX
'SPV93ACCTXP2GH068W7KAHXD7SA0RNEZ52HH4D13
'SPGW6101QZGX2N8G4620CHD1WCRPETH4Z78V9C4K
'SP33JVY9G1R03VK0RN4M6RBPNBMRDKQJBFJR4VH95
'SP1TXQS8FMSJZG563NZ8ACEBSYEE47YM4PNR2JAT7
'SP38DKQ13ZQ4DHVF84XVQ4EKR4G44F9GC519FR087
'SPBVZTDHAPMABXDAZMMW35576FWPVJD5MR409NDV
'SP10402R43K7SPNM67S980X5ZMQYCSCA8MRTGZP7T
'SP1Z7Q061F8YEDNQCS52VGT3HG1T0R0J5VAPEE1S7
'SPV4PZ769APFSB4X8SD8RW43CTJB513BCE3JZNV7
'SP3M49HQ9BTTQPP17QT3Z4PGQABM60FDXMFXXXKVD
'SPJWQVZHK602DFKAD13Z5GNGQ2K2V0EFK4P7RQBP
'SP2TFBP3VV7RQSPBTXE3MFT0YNYZ395MSZADFVJWE
'SPVKFPE0X2BCGKF68PAHHPRP3MZ69EM057EGP0QH
'SP2ZEWE3G2QWMN72DJ359S673KM8NJKW2NR1KJDMN
'SP2GNZX4M854YMMV6B80DDW7QPH9YPB2081T02XB8
'SP9QVN5DDG5TZARNWBRK04PVZ8JENXJAPRTHGNCG
'SP21BP67CRBDFF0YNMAXMT6DFEHS7PSF434CH54Z8
'SP30YK1KCS08PHRW723CKF0RG8JKD4TYX5QWNSFZ6
'SP3NT4FE0NE8ZJ4J70GFZR942E2QVWQW6DBPGF2FJ
'SP187MPTR7XWKFPY15Y5JG03SKB251Y2H21JM5TKV
'SP3WKBJ7TM0PTJD18DBJ9HGZ8G1DHG5VTHB0WJ3RT
'SP36HYAM0RNFWSBC4AA0E424YPVCVB5T2J8Q70NDP
'SP1W3SV3GGAH3EM04G8SYS37MCTZMP9FJVPG1QDTW
'SP1XH69B0CD4WNAS25CAPJ7112P4MYD1GHSBWY8TH
'SPPV1RC36E530XFST5KGC4Y8FJ90QEQGAGT553S0
'SPFBDY3XQDBXJFNGYXVMVVT0SQEEYPPE84TJQC75
'SP4H6E6MMX2V82DW82GRZ63PWT1MWBRYV9E75AND
'SP1XNRWS8A6Q1WCAQSJAEEYKPQZAWT74KNF4V20FG
'SP239MEGMSWNFZCCAAWXRDBBJ8MM4JY9T8310GGKP
'SP15EVZ9EE2Z3RA5BY2HASGTWJM47TP250GFBAJTW
'SP2Y4XWJY54K2Z1N5KPGJPPTEGR5HQY8XYS9PFM9F
'SPNGAEVMP9Y80HS0052CRYH7HK00GDWQSJPCT0KX
'SP1PB973DS5QF937E9RJN2N7N3NB0KWTHN63Y9PK9
'SP3KVK2VE6R9YP7RTVA314AG1YQPZZ05P2TQ3T2HQ
'SP2N7KTEW4G5WYCHTTFQ6CQ85YM1C4BTXSSABP4A4
'SP3SCEYX1DPG8VJ8S3NF2TPG8FN3VJA6Y51DG1J9Q
'SP2H9NXHJD8M3ZA0PWJ3QV1C82N36Q2TCC81TRCCP
'SP1Y9PNP3Z2RZH93P4BXBRJ098V5ZT401D5WJAFZ1
'SP2CTPEAGKPV8ZY8VT6HCWQMTBT47QE1EPQW9AH3G
'SPAMCF16B6SRKRWY1GSZT7FG2R7BF71KCRT1MTZG
'SP653P586GSRF976DE3T43A3129FV6A10T1XVRRC
'SP1BQFD3HS5CE86TW76YCYD8SCYBKWS4CXS0KD1EB
'SP144HFHHHNDSHJQDSSX72DW4QN7VR6M7SHD9G50S
'SP1TCXJ7HDW9MFV0KZFFDXRKF3A1CS6D950TQ4WCV
'SP2N2TSJMYZP4GBZMCCP54VZAM2QT7P2M8DXQTQT4
'SP3H4ZWV9XFR7TEVF08GSGQ8K11JNG18SWJ5YRR50
'SP31V2T7Z5S0VC6DNJB39D3B7NGTYW7CBEBB4Q1AM
'SP32G3HW4WA17TF99T3PESWAH36A7FM9B0D2GEP77
'SPDDCQ8D909W0ZSWRFPWN24JSPH5NJFBH9F136DE
'SPK75J16MH3STRYM6J7RJQEZJB25JPCW1ZRVEJ6B
'SP1ZGJ4KEY3HWQFARAJ8WXMARGQKYAGR9ZG2GSTA6
'SP17K8XTX27ZNTDHWBRVT4CD5QXMS49PZZCHSNV7Z
'SP1EA29CEFR3NQRES43ETE7Y0HCFVBRTFPDQ3AKXE
'SP2EJHA9VSJ0K854RHQVX3A2MBHDAQKZAJPBEYP71
'SP2DK6595DW0NZB23BA3F223MZA6P2E105GNAAXMX
'SP30YQ1H87F7R7GEFYWMEPYWX1M05QBMEVAQB9NSJ
'SPZEMD9DP1VE1E5Z0NPP28HDQQ9GRA89QNBGFC7D
'SPPDEQJMNPBEC5GRAYV064FVCWJCEVJ4BD4X68P0
'SP1RCV241D78P9D3TKYTM3A1Y4M8350Z7MHFB3AMC
'SP354WS1KG1H43FZQKMGWV6F2XWE23496XBEYJ2DB
'SP3P1B2MZG3WF4EMB8YWA9HFWECMQBNGKNQV0PNNJ
'SP1D1R9QV69CV2GG055GKAS3SDHM78TFFNDF12GMH
'SPSDHQGRKP16TKKJB52RZ86KM43FC4CHZST0X15S
'SP2GEC9WRK72EW7NCM6G5ZERSBV0Z3BWJJB78NQ77
'SP10VSZAZ51Y9DTCC88PTC1CED1ATGCCV6M44Z6PG
'SP1Q2MMGDYJW89026W2QPCKFHDXZWJMBJQ097D6WM
))
(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))
)
)