;; 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
'SP1CWR5PC3NWR1CKDY1202V3DPQRSHCB0W5QXMS8K
'SP2C92H1H9F1T1AW1JGADV5BVSN8Y9Y5VB1RNXYC8
'SP3HZDHMXEECN8666TWR17MFXJ950EN5AZNB2J10A
'SPE8345J56TXQRBG8JPTP9JFEZ5EH3M89K2N7RNX
'SP1YJCWDPKD2AXJ06SKCXPW22105ED7WA8QMWQE0G
'SP2NCAY7KKAH16J3DX3JNQRKZ60JK8TTN4CCSXSJ5
'SP12K0NAJPJKYM9TVGHX12ZGKRYD45CGZM2373BAH
'SP3VEMZ5HQ233FF9E2BFKV911NQ50W352J3PNG1VD
'SPJA3XFABPV7XVRJQJBH2TTGFYKDZNWFD3XZXPKG
'SP1WTRVC2B8NQTSFCPDKVV2WGD02NMHCDRBX9X22K
'SP28TEF3MC9HH0KFKWV99HG0SYTFAC9KW9HRA4GEP
'SP1F9ERZKZKG49W8MSZ1Z6774FDQ8ZSDWEPE83P41
'SP1W467A37ZTXGMTHNFCK14QFAKC2SEPY2GDESX72
'SP2AC7NM1SA8ZY5FAH06S4QXFD71W06TJHJ7V2KJG
'SP1PNEAZM774PAX3D0K6XJCCE6046P654F2GQVEST
'SP3RM03TV6RZGFGQWZDFSE4XXM79NCSN3RYKJR53E
'SP2KCPXP65FHAAVVGJR2A6BAA9TJ9R3798J3VZ7BF
'SPHQEVN752C2Y9BDWMAF98N6RBVTP8CQB51ACBEY
'SP2TG5BXDQKQS3391WJKK96KW9CBQBDYFSQCAAGE2
'SP371G31CCY0K0K4B41J0Q2NM9W1JKGE5N6CWHWR0
'SP9FPEZPRXVR7W0HRHK8VD5TF72HHAMV4QBVETS0
'SPHJZ6S6M22TATB805TMAVQ9YNYMCSB4EJ5VYE1Z
'SP4TMXNMJJXQK85VD0QSGQSW40GY1WJC03BAGS7X
'SP2N7FTSJYX9XN22F8EE3X2W2X6KB680W8F2J71QV
'SP3SP7K3XFT4ASCD8B99B7DHY2RG3ENP8DR6ES5F3
'SP1CH3JGDJVWX8GYHD0BGF3HQ7QTZ7ZQ0YEJH22M
'SP2X699FPDVNDMX5NBHP6NTMXP8GBDJTASMFVK9X4
'SP1ZDN5XQYKEHQ1PS3E4V6ZJWXT3CCRDD4X5WS077
'SP5S14TAEN2QHVR9YDW7APGGEEH3RYNJMDG93SSM
'SP283AEYZPARJAQ580J225P3FSPXSN6THVWAM0VRJ
'SPD77FQ5YJRN3B84519VF6APYNFFVGSY27VZXZ49
'SP2Z3M2FEAQ7G5EZQSXBM6YY5TE7WMNG3WF77581M
'SP09YH67K4J9BNR2K6R437B685QQPPSAB8KTYBVA
'SP2EXWEQTE8E7ZRW2W5JNZYDDZ90FBW0MJWFVQH9E
'SP2VZ434VPXCJ65DDVZJDGC41VJM71E94K3EK0F8V
'SP142P8QEBZ0NJ6SM06609KAV659ZCNZZ84CN0EMX
'SP2PVQCMQWZFHP6410PTGKR14Z2SKWXY4C7P2HZ0F
'SP18NFAVW5MFHM3EWYQ2C5VMJKT2XX7GKN5KQZ0QC
'SP2JEYQD9RKAP4SKYPBMCY4EMS37RJS92GZ8ND4DG
'SP36HWS19N0RF18RGEH38DMPPBNEFNEMEDXY371V2
'SP3ZZ0MR8C26QWXE92NK0MR52KHMBZE3KHANX3E1G
'SP365FZS1S8642AGS4V3JC10KF79XQ9VEYFBXSPYT
'SPD2JP3HK1F4RGNHRDJGN60QYAT5NDN7J4MP261P
'SP2KK924Y35RZ81KS2B445D19V47QSR4BYF84J4BV
'SP2M47CCC1X59YGMERPTDMN1WXBA37ZBTB03BVJ2J
'SP6ZDM5GWHF1VZ6BRKB1DCTMHC5RCZFEGQKK14MG
'SP26NBGDCS4SR4G6R5FGCTHDBV2KQP8M2S6Q9Z5PG
'SP1YHA8VF7TP54RQK3YDFMX57WWX0V67HMTP3E73E
'SP16P0R16J75N651ZA2PPST61HEMX7A0X0M5JA9QQ
'SP2JR4ZWCHTAF17NF8YW2WSBCEWTNYNCRWKSY8SVD
'SP3N8RMWEZHFY83WTHZJRZV7DYFAKGR9SHF1MZ5R
'SP2KCT8MH5GBAZ1B4AQ4ECEQPWTQBHXV5TYD4JQPH
'SP3GQ2HW5GE84YM4VV2XYMK3NY6FXR187P864R0BD
'SP32YRQRDPAVCSQAVBH28RJCKAZC2RVEG8HFVN0SB
'SP30YYW07A4SSESMRVBR1VH6XCBXYERHEJ9P9SAB1
'SP071J37P5YRTHYMTA29FQNTRV7HQWF3GSB5Z0A
'SPKMGTEJ2BKH5GB13MH2VYQR96F3A262A09V18HS
'SP19MF61ZQYCAHB3RVDSD28C2TFAXKARGAYB7QK3S
'SP12PJDYK6HSFJRN6YN23MXK3V3NKBSEN1WS0MZ4G
'SP1T5DA1T7SGVW4BTTZEAQZGNZPAVC5QXV9XT5VH1
'SP1WG24AKBGPWBQP74FRZS1JQSFR0QM33KAA9H5EX
'SP3HE875MZ1BBQ0E5WP4GYT98D0DDZGAWP5WS946S
'SP1PPHRGH3H0RA5TM8NAPBM4RD9YME85VTCC4S14X
'SP2C9RQ3FC6HDGWF4T3T2SSRRVRYBGQZVH0CYC0S0
'SP31E8EP537PDVF304V83KJJX4H2TN2Z88DQ1KPX5
'SP3CVMQXEKAWAZXNKQM6XJSSZK0X19Z7D9N5FNV60
'SPXGVV3XN53JDZ0DXZTVHGCJREVNY54CPTM30ZMA
'SP3P4Q0YC1DD2EF7D3CNRDJQNSMV616MANE3SC1XX
'SP1Y0CP644NV3TTQM5VBWM137K1VC0BJQ13WXMADZ
'SP2C22P7AJTZ5N931TEEARCHMR72Q5EKCNQ38ZVC5
'SP29FT0KRFACAHPEXSH1GYRG8W5EDQ7QVKV7A7K3P
'SP1K96254R3KP5TRT5N2X64FB12VMHX6MYS0BQGYQ
'SP27RZB1DQ4E3H71GRV4EAQF1TKDFRHQXVSQJ6FSN
'SPDG903BHK9JBC20MRE7R7YMCBSTK67VJZ58EPAE
'SP3KT2S3Q88D5GJNKVZAQ751SF3SK6QAJQJZG66XY
'SP3MWG5JRPDZCTKM2Z48CVYAK911YPMQPAN3SM0TZ
'SP2EJSKCAD26AKPNYBQACSX9AY2JX6V27D3F9BW56
'SPC1R555YCKXPT1R34W0DXA8WZYTC0AQ6HZB1AM1
'SP17K76Z5D963QKB4X8T03ZF0945ZHTER06SK2HJE
'SP2781MAQAB4QJXAAM0E2JT9MDWNX16E573Z8FYT
'SP18TMHKPGW4RZF2CE63NCZFNEAKW9P1XS3EZJQVA
'SP2RPS17WA2NFVHSYFVN0NZKXFFBT7MNM8GENMZNV
'SPFEXFX4SAQTG8SAC3C09CR8T00AZB45Q01KG6Y8
'SP29CRNY1ZCDCAXGG65P60E31K1QN6E3AHWDA1VXQ
'SP34118J2CZQ2JEQ1V2Y90A5WF2ZT8920VTY6E4VT
'SP3YVBDA8AMM7S9Y2MMXFREDWABP454HPW98RQBSD
'SP1FQNTC40A2ANXZQRXNZ0ZG03JXBV02DTHAZT36Q
'SP21W0F2W0GFKP02T87AQACFQHF02WWVPHF8MQSDK
'SP2CDJS9Y4SVP2BBMZM6G8E0ETAS99GGD16Z5EVHH
'SP2CPG8G7RHK0FJJTJP1XF0YQ9Y0C03NT339QVKXQ
'SP2Z2WH6EXDX1EJBK8JMJVQR3C8QFCFG2F3NHM6F1
'SP12MC1AHWA97GXBWWAEPDZG28GKV5HX425Y2W491
'SP2K9MJ51N9B7H1MR5V99K2D1G5WK013M1AW7S0PG
'SP146HRMWDXEC5JVB161N64S5Q40Y7R9TZQKH2DWQ
'SP20PNWGZEEPN2G7RH96M8HTR7DV580BF7RRXMNR4
'SP23DPK544CQNX958YBKT5GEMQ7N5BDZA40869E7W
'SP34Y9YKYRTGJ4GWE2RQ7GXXS0S82ZSCK45T6F99
'SPBCP52CE88D57EKQYXE125WSZVSHG2F9XP0KW6Y
'SPG7NBRWFSQ1JXMVHF5457EW651F4DBC2FP30H41
'SP4C4FJV36WVB3104MM9VBPHPW15X3YXCXN6K45N
'SP3DN0XTA133DDE5ZDQM5DKCFED4PYJ7N4F6QCNMD
'SP2M3DMQZCC70RGKH6VKYY81RYGCDYWSNVRC934G0
'SP3MH2RDK5JT5PTC47M8BXHSSGS781NMH94JE0D35
'SP3A4PC3M2WVA7DDVPVNTJB87628VFG3EH2XQBT1Y
'SP2E4AVJ4JNBDD6ZC96B2F0X9S732SASMYWJFGG0E
'SP2T5PNF09GZYH92BQMJGJAV0PZ8N1PPFAF3CWE2A
'SP3EZNJV4R01258B4SEV19DV67HNYFQWNRG1D5DAJ
'SP2AFS93R0SNHCHHFCH9X9CJTPSHFD1PNM75F6AWD
'SP3VQEEV3FXQ762YNQH0AFNSGWP4995VHP1BX1SJK
'SPH6N76R4RP42CWNZPSYFEH98106PH4RJYBMHW8K
'SP1XXNVF8HNVXGC7HR8GHY278SAJMMZBK333NW27J
'SP2P6XT0CSG4FJJCKFP5NGSKB1208PC70AJHTB51G
'SP3TFHMJ45J9J6XS26BZ6TP391DHXNVGHFPGJCB53
'SPEGKJA4XD1PTAX849346BMWRRQJT255H7EJPQX4
'SP3W7Z4H0F0NW0RFNBD7YHEPD1J7WAHZYBDB5D2TQ
'SP2SDZ8CB9G3KQ0A5ZRXJBWQ38TTG45AR1957PDFP
'SP3TR9H98GTF9TY11RGY16VGRFGMQ2J655RVKJZ76
'SP2RQR6KW5PHCKPPC477QH3E91A60MD86HNWEVQ71
'SP39X72XC4BY9ZY1MS4WRGX2HWTVYTJPJN23JH79Q
'SPX9PKFZ9MPJGJREFXJJRMRQ0JB0W9NC18KSKS09
'SP31GEN16RESV2C8X338V1FQN2P2W5RPVS46MP0AK
'SPTMXJTZ8TY26H5P6GYC6XHAGJJK3WB03MWM5W27
'SP97H7HP5XH17KQBH7VQFT08CSA4Y1YMZTS58371
'SPWE96STY8FDJG1XC24X82RPWYQMXR5B0DHK1433
'SP6Y3K6FMFV7VA0RPJ0PRT798TEVHBRE4EXQVQPQ
'SP3706TWRRM4QJ3GANN619ZJ1XGS42EFKS5D9K190
'SPFHBF53D6WSTNBD1VP4BFRDCVNVAR0PXJ3N1TXK
'SPTN9YATMMNWPRQXSGMQTYENW5DZZ4N9DGFXYN7G
'SP11Z7945VRSJ7D5HE0QGRCR3KXQ8RNE41AZS1WB6
'SP18Z3PJRA49DEXY9JX6VVQ9YAB0Z2FVBBDXVFAQB
'SP142CABNW8MASXP6MXTSVJJ0Y7QGD07A76XBTV84
'SP1EWNRKC89MM1Q0YE29DGXTJKWZSPR81D51BPHKH
'SPNYTPMYTJFCQSD494DANHKZGW7KZP59A0GH76BM
'SPY016P46GP1D89TMCNVQZJGJ5VJ32ENXVMXNYAM
'SP2N2P8298BA8PFKFJGFFMTMK54NN59XB8KQ46PRH
'SP07BEDF7X2W1YWWMGN873QXGHTWYV0F3A75BPXJ
'SPCA7JSVDEFKE22N6DWHCPK500Y83S727WXNWFBH
'SP1CG1SAGH4Q1HH9RRE9045Z5E19PJT68110E2Y4Z
'SP2G6TZTFH5CQVBJVY0G70H4YVMTNEH9TBAVGFEZ1
'SP3DW0F0KK460HS7RM7HTATY0M76XE7XR2H8XZ10V
'SPNZESG41WPCB4NTY3RN0S3NNVFPP6E9B6M6D0T8
'SP20AHENT2PNEHGK7BDYGB3Q5G2JMAXASTV6VAVD4
'SP1YSRE5CMDJ8W06TSZH53MY1W8DWMYRZX84XYD81
'SP3Q0EC8BPMQKJFZNFA9FTQFCD23EHD3BV4PWEXZM
'SPK2FQXRX1DQAX0EW0KEBC6T4HDHYPGY67CVV563
'SP2P61YTEYQJFY93VQ05WPMGZWPZ49DBAK12G45P7
'SPB10HPC7EY9GJ2C9EZFQCAZK5GFEYZZ4VYMZZTS
'SP1G5CXRRXE2VG62GPC2VNAJVAH0Z8G7YT0R6CMGK
'SP2H9SWD5NCDXD0PBA4GWK1KMYR4Z4Y0KVZBV0Z5T
'SP55AP1P842Y1R80PEG2DAWA2TCG2E45S8A4R9W5
'SP36T7GKCCSV6GCTYBBGT808KPE50RTW6CGZNZR64
'SP37K1FRN4V34613B2QZCB1DYC8Y5WCWA825CC5R
'SP21ZCD8Y2X62PB7AET8981WMTYTMV6NC72PYV4M6
'SPVJXWX167KBF34374HWK8CARYJYXDFGF8598NPA
'SP36C0SC6Y0Y5EJWR51NDGKWQSQSV1H5DT3RB9K1G
'SP3T293CBSG335JMV8WPX3Y8N1GFGKNBFFKCKBEH5
'SPG1SV2FJGP12W9M7J3Q0V2QST6NSNER3APCNTD0
'SP3W4KRNX3HRY2GG7N3M1SYR1JSMFP1JX3V12753
'SP3J6MR8XGT88PWJ43KR5XG225ZC17K3R4XY5R7XC
'SP3VXX7K2QPG2TRN6X6CYD00CQGZEY6RPV9806DDV
'SP3249BC88CWYAXBSAZ2QD5EWJ5FW6CM8HBKTP5EY
'SP2BX4X7YMP7Q507X7F5GX48DC4FVGN5PYQDNQ3DJ
'SP2X4ABCGATGPPPDDBJX315881YYP4EEFG47JWW2V
'SP13B7SKWYMB1VYFN1ZW6WQQQXVCCGCTDR28XA7W9
'SP13ENEXS3ZTJXWD0S5PY95S94V8DSRWTZ8AGVARV
'SP235Q57R727MMWNV2ZPWZ0P6CDF1VGFR7A2RFXKK
'SP1JXQ312J9KAGSXDHJ713726AYWHAPJ8WM96KZ7D
'SP392Q98BY4ZEC6VZHJV72BXC8HF2RH2V5CE1Q1XC
'SP1E5KVXXSSBT5D3ZRBPCT33PNR9EDEN5341XGQ70
'SPN6JB7EQ5QA1CRSBDNPM60RAYRGVEWMF33GYBWV
'SP3MN7GYQ8S6SD9HR3V1FZFR2XYDF7EE08V28Q8GW
'SP2Z4DACNQ0APJBA4VQ33TXKZHJKQNTEJ7CAM8D4N
'SPN3WVJQR4F8AQPP3XX3JJHMRG6WNQE1NRF26BDF
'SP8BTGZ5JM5WS08AJ2WXE8CQDESBF2VCHXP9XH4N
'SPJGHBAGB5JPCEG8564VK40F8JR955VBWVTGSV5B
'SPSZD0TTH2PSE0A4Q2D86TZ7BHH6TJVRBXJHTZ4J
'SPS59JFA6R9CXJ00WQRTYH07Y5MHQE2SYV3C4ZKQ
'SP3QX2AR570PYJNE8A7QD3CSZXGM1KXYTF1EDQQ8G
'SP3V09D3H2WKGHEECG2DD7QV5173FCRJJMHJC60EZ
'SP3NA7GVKR2MXXSY4A9QJ65QY6D75BTG72A5T9EBA
'SP3SAYJ9YPDS3MK76QH9BAFR27DA86E3H1EATGDTG
'SP1J55TJTA97EM1YNPR7D1Y3MJR01SBQXZG89RMZP
'SP11WRVHGD42FB6KP1QG7V0BFF7R366PQ9HE14EDT
'SPX0EJZ5HF5S424B31V9T2SFH35JKEKHC7RH1K2A
'SP17NP61ZCJ6WR52J70A5K3MA76R5MBEGWM6KG3PQ
'SP1NC04G54EKH45071NDZJQRJ4Y6GW6TSV1DCPNAF
'SP1R2YTYMZEEKQ9DZA9RXA09CBFTGJDK2JQ9EVDBP
'SP34GCE4W6WRCS1X06QAETRZ2FMXJD0KYHT27X4B0
'SP35VS61DV3P375EE3XAW57NVJCXRD5YBKCGJN48S
'SP3NM83N2MBSDGB8S1E74648V7GRJSG2ASVGSDZX8
'SPCFTSTDDTC9MPHBZHXD9QXV9G8R2MTQ3X51FT2H
'SP3KNDZNSSS3NPGQQEYJSBKTSM6W5EBT5B5ZRC91
'SP21Y3KSRJRDF39WBSDAFRYAEH8G9ZW3EWDQ2YSB9
'SP2FAGY411BFYRQ9F1NB32GTF8JM8SCSC40P049ZG
'SP37X7A32WWTGNNKGZRSR4D4SANDQSSCWN4674WWA
'SPVB33PK8FJM73HR3ZJR0HFJ7YPN3PZ3F3H4P8GP
'SP2WYTMK3MGZX7AHS1XH7EBZ14A4WXFDQ79Z468W0
'SP3AQQCWZV5XTXP6F1MGK4ZY3FZ3WAKZWJ8K5W9PY
'SPPWSYZ852ADS3F29G87V7Q28FFMG0EVC6CDG8J2
'SP24HEW4DX7QGE41AV6B67J37M12XQJRJGQM8C8F5
))
(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))
)
)