;; 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
'SP1YK87RM5G8ZNKDAK4MR2K37VXB0SDSJS57FAQ4B
'SP1YNZ4B6ZDGZB2QHW8B1MSD839RY564QEXCDR7A3
'SP2803S0YB2DJK5SBQX56PCYJVEXT9AJH758BAM4M
'SP29C3TGAXSJJJ9STJJTXNWWEMVX17RNQXQA9KTEP
'SP2XRYF3S2KPG9BXH09MEHKYJYZPGJZZYF46SD6V2
'SP2YVSVZ25HXEWFYSCWG8TNAXYESKS1SWA8HT4Q8W
'SP30XJHX14HBJBFZT4EGQ7SJ0Q4GE54X9ATJRWW78
'SP3576JPBBS14V4K038P58PQ07XRPGKV9W01GK5D
'SP3H6A3ZD9Z4RTVB3JJE6XCNS5NEJGBTZXQ7CHSV0
'SP3KR02R9689A6Z4F16JBYHHD29J9DG3JZFCGTDR6
'SP3MK3F24FR93SC4SPDCGA75BHJ9VK9VJDZ3QF9DN
'SP3SYB2TVXDD16TAPJDHMEF9YEJZBT2CHW9W5R7SS
'SP3SZFGPKV4G45JGPNPHPKB8PNE07SSEQSBD2P0NX
'SP3T01YZJWMQ2VDG20MGX23WKHE1XT12PHJGPJBAB
'SP3TNZAA0SSV84PRHGPBV6CT32NW2MMVQJEQK6JFR
'SP3ZCX8VKVXT1SCQVQNNB3X1496HPFKFYFNMQESZJ
'SP79XGB68AP7RDS919R9EPHT789GY64N4VM5HP14
'SPCGBQY37XJK557CFQBG20Q7SHZQYZ14F6JG0VEM
'SPCMYV6CKJG9NM78FJ77R72VJQ98ZK66CC39RNEJ
'SPDEHYTG8ZT14EZSF0N2FZE78MK4XRSZH2JR08HE
'SPE7VFKE12D7KF5BH9FXHZE7NK8MZCTYY8AAMENK
'SPGTGMQWQ24S4SDZE9QV7TH6J2M9PEPQX6DKRTX4
'SPM2X1JQEHWSYDGTTV3AW4C10X10JNQEKVY4T1D
'SP3RGJ82BWDE2FW37PKRNTZ376MQW35YP98EPSQMZ
'SP1GJ5AQ9MR1CX02GGTRFT7YF33GY7GGZ4WC70S0E
'SP1CZ40JNQ0907C2KJPNEEWZER17C9HBHTP30JG7Z
'SP3BS0YP8W3P7MM0YRFVPAFCT90GS78H46902TVGC
'SPHH052ZCDKKS2VFN8D17266MP3VMCH5DDYAJFFD
'SP73BTB22SDGVD6RYG7JTQSBNQ2795ZH1NQKCVTY
'SP1V4C30A8GZEC7ZKHVNGYFD58733M14TNH6Z4YGH
'SP30HNAPMTA5C3ACV7H0GNW9EHECMFJZAKGPJ27NB
'SPV8DH2P859X4BQVKF6SYBPVCJ5E8XM7H9WGH74J
'SP2HMAV5ZHEMA6J0P0DQ00DPJKD1VNF40M9CHM8VA
'SP20N37V1XABW8C35PPMEGKM62Y8BK1DNXNC2NHHG
'SP1B80E0X3R1KQFA5GFQ7RTKHTR038M513AG3143S
'SP15M57F3EB9EJB58CH7KMQWKY7CJBZW8JX9VMRTG
'SPEDWWG6KC7PK1TFG6E5X942C65133C1Y19CKKDZ
'SPBDZRNYQAPPE32WY3XNY2AZ9A1ZYMA19NM3SP7Y
'SP5XXPN7C9JMJ61AM28MGB5HM8W1Z7E4KD7YXB2V
'SP3E2ER2Q7FYTAZ43J13M3343NQZ0SGM4HBE43C37
'SP2KBJ6H55YYWJF3VZN57CRMG5BM1MHVWYQPSG6DM
'SP6CWRC0B8W0FH58JZRMX7NFEJX5MJCBETWJNYTE
'SP1CQ4CVMDD1EYJ0VD1R3ETG5ZPK3BAEPQ9W2D76N
'SP1T6AAWSBRGZ2QH0Z5GTGN6W3AEVF291N8TFNWBK
'SPKQ5MB15K14CPZ66DSDRGWACW4SG7Q39E9A5792
'SPK7B9KM7S501ER7CGZRQ1HVF4SW5YF8GHBSFEP3
'SP1P5MYWR81WY6V8BXN9ES76WFKVXHY0FPTFWFA87
'SP292J6F2JRD9QKYBKYT3WFKMTHJDRDREW9W0SSEY
'SP77PW2N0R4EKHG88KG3PTZQFXE4YBPC49KD8VZR
'SP3EVE4T1RE411J2NHDGGY51D579B576XMYGD2C7P
'SP33J7AJNTK1E21WCVTZDW43M2D7MZX6F0Y12WSN5
'SPZATNW4888T3H03XQB36K2H9GSCGGKW7WQWJK2F
'SP3991QTCZVTK1T0ZTDFQG74JC225BPV4PNDFD161
'SP2CH1NAT2C9JQDHR33GYSHY7CHJ2R8BFG4BEACKV
'SPZX8TJHWC7PK2PZSA0XPJ4EY4ZK02XQBWR8KER
'SP3NR2V5BWTG5E1PAZ9CDA0Z98D379TQVMGN2MJW0
'SPX41ADBMW3358GAQZN6BW6Q8Z4PDDAWKFEFJQR2
'SPKX3XH6KPEB3C648XJA0ZK17EWZDN75077VQN7X
'SP16Z8HK3ZANETHRJ3VSM32PXDK52CEXGWV5H6K7G
'SP2X328B68X5VHK0Y7RVBMQYJS747JAHCEQ34HZH7
'SP3MC9D90TSF97HMV41NWKF972DK0SX0Z3MD3TD2N
'SP14T4C906R14JPMCV3PT8RK7QHF4P2MA3HXYCTHF
'SP2QF9E9NNYJFRPJJAKEH7YZSY2GMGW4TFAP09C53
'SP2VR7B6MFAASDFM0QX21XVZMX0WAG0TEGNHZDJ4G
'SP5033A8FTXFJ3PXTN8S6C15KXQR8NSAE2EF401X
'SP3ZJACDZ0YWH7YGHT6SB51T2HCSWK6VFX12T5XV1
'SP1KM8EBC5CWBC50ACVJA7E5SW32HRCNAK576D5DZ
'SP1GC16CZTXW5NSP0X95Z4DC74Z8JQ39RBJ42P9RD
'SP3VZ7E564CTJS8AG5JXH95019YXTDWKSS7NQ81Z4
'SP1ZXFAH8P7JXFVGRWHF2F2Z75CQZEAR2P7P435V
'SP34BFP2VV83NNP5ED2S3V486ZTEAG64V752FWYKY
'SP3WJJAYZH8ERD74KWJVHMVYQ07A50YHWN02SQZFH
'SP38XXHY0A6H8Q8N6W1FHWHRQYBBVMA96DAA715DV
'SP1GF2XMEPKJ85HSJXGZK5T4GQ3BF51Q1ZCB2X4K8
'SP3WCBPXE360RHFY6297XRRWJ1R4JYZ5F6EDZHC00
'SP1DWQQE9F8VDDQZ90GSCBS4KWJXC8PVJNE93Z21G
'SP31A3GMFQKWB5NHKESCCVZ8XT9DJBBCG4X20QKHW
'SP1VEZYW73DH3PKVDW5NWQW3KW7Z0XN4EVNHQ86FT
'SPBWPE3RWBRREBJSC9H0SB886M7M8YR1RA08SHCY
'SP2394A1B476NH8XH8199HK8BGNVBGC7198XG122N
'SP127PPHWR1QJP8QXTCDD10HGH1VM77XENTCH51JH
'SP1Y31BGJSKWX26NJGPE8WM1J27MCRV5XJM2WN656
'SP2PK6K47SNRSGBG7KYFJZANEBMDRX004HT28CRAT
'SP2E7E3EC22GFY1Q2JQ2JKM94K0ES23G5FE2EXFAH
'SP22YSKFK65EWVF90QNAWXK13BJSH0Y0YN758C2BY
'SP3JFAVYCZ411PGGXYV80NDTBJTE1NXYD89AGDSQR
'SP3JG69V9DT05VEAT1EMJP2J8WYE8EWBS091XADVE
'SP2XSRB50TZTM67VEJPDK8HXG13J7EFT2MNG9FV2Y
'SPBYSJK3RBGS801H569200XPF0098BE1QNPQZ9ER
'SP3YSS2JA0JNTMF3X0RHPCV4RDR530V2B26RF4JHB
'SP16P4D65E94NPTR9A9JS463R21WXC28C50Q612JX
'SP1GHEHJGT3KPP13DA2TGK5R4T1W0T4Y30YA9WDGJ
'SP2HVRAXV038SG97N2KD6GZ6VVWNWM79DJ74G6DH6
'SP8KST3ZZP180EFD6Z5EQZDG8CJTCQC4PJPKK4E7
'SP9V8MRTWR1TEMWEBSKWG56PBENR7HD6MCRWDWCS
'SP2D603X7EGRVCRPTARB13ZRKPTRW7P3Z2S9NS98Y
'SP2BPKPQPKA7H6VJ8F0PT86Q8ZZ3SEBK69GA0BN3N
'SP3HBCVQ5KZ541Z6SBM2C08SQDJ7FGPBJN4BZ7NFA
'SP35HDH9NZ0Y429PCAHQJTZ4K7HWT187EY6Q0V1H5
'SPGF0SRMK9D47DEEDH99QZ450FKSK2CFJ25GPF4F
'SP1B7YZRT68532Z75TXW9CFPM0H7MVA9F17ZEXSJ6
'SP2BDECQH0EH0DVZAWVN18ER6QN84GDVKYM8K5ZJH
'SPN1S83EXVDMFTS0NTN821CGJWQ5TH849BHWY4FM
'SP1H6220TFDVK2PPXAABH9A1QTC49X8E3V177HJCX
'SP3QMR1J2WMDPE4NA1DKRYK0CQV2D9KT1FND22MCP
'SPFEC7BJGGWTVR05AP3C4R92C5FRNFXY0X248CTP
'SP35P88GSCCVBT3Z19KA06QPRVA6A3NSSTB9ZR3WT
'SP1EP8DG0PC6QN9HBDT74M0YD88ZNPSHHR2VG0NC6
'SP3AWSGZ97Q33AMRJCKY8D30YFB5C3F9NPP4G02YR
'SPNV59PASK0BJZ7GQJDTJ33TVJ173HDF117CFPYT
'SP1JSVH6HS9SC8GV3WT1HYTS7JAMFYQSCDY6ETB3C
'SP1Y9F36K1REJQ31Q74V0RAJMXPC4NH1416BG5NR7
'SP4DC8ZSZENV6DCG02J1QP354X0FHSX28Z0W8ABN
'SP2DPE3EBNT2B15YFM5927P7CDRS42KM8NQPKXC88
'SP1ES75KWGE4AXR0KDEBYSH902CRMK5ZCC85RAM2B
'SP2N0E8603F1F5E5V7MG42CF0M3HKRMV651BPTWAG
'SP2FV2GWF7ZMHHDCKWKC9VSC8PS20GQM3ZY3HTBXK
'SPP2SNEKE6EQPVF3MZ8QJWMHEBQPKCVAPYY4PXZR
'SP33DEN4E21JVNH00MNVYKG7C157SEETB4D0MS50T
'SP212P4HDH76K4J3FN1RMHH2BMKNSZX5K0F2410ZC
'SP2AC693K23Y46W0WZBANGGGDCSGQ81W2B6GSB31Z
'SP8R6JGYBG317WG0PER5HPP9RDF12Z4FWEKPE8JG
'SP21RVHBS1649BPHMTG2H7QFEX0FX6FY3MVZTZ51W
'SP33CAHPEWQ3FZG3VHZ7F4Y8VHYFGFKYNKQJDM2K7
'SP2JC1Q82YTFJ20P8J9B095EGN5X7HVSCKK3BCBW6
'SP90M6Y2QZSGX9DBTXNY3XZWQ4Z3S82MTDT7J1CQ
'SP1C4JBW7PBY80XAA2XPD792SH2MQEP8DDB3AND9P
'SPN8RF8EA3XHT7SVKQ5ZA336QMVT5682HPB66XSM
'SP3V0SFG68CE32WZNYCT45CET5CC5K0T43990DW1Q
'SP32R0TQ2GQFM51KH2S51QJCEKC3ZCX21V3HWWBRB
'SP3Z5X93E69BGPW0K8PSRSKN2FZSGH4SGRBG9AAVV
'SP2BY8F99F42DC4DPPZPMK363VTTJ7TMNQ95MP73J
'SP2H1KSBF3P2WPHYX76SX0PBC732GK4KB2FFQ7WCK
'SP2FT7RCZM5F1RYHKX7BEVE9XHQBXX5F5JWN926F8
'SP40TBMQ4WYVHX0QPC4VMDQWVY84H2XHNB1HH4K4
'SP3CZXW6R80SSE8BQVXXSY955384RC0V03ZYBS670
'SP39HSN1Q9R0GAGTH5NBX3S6YHMM42C5E5XWR7YZB
'SP2G3WDPPQDY8SCQ61XV3X464R48THJJERHZA9GAF
'SP26HWV5P6XV7AKYSM1SGQ74PXE36GJKP71G78AXE
'SPTN0HJDSSK44MDQ6GPV2WT7T1F9A3K68NHQMCGP
'SP3S4NBHF22DX5MBG3CC89SFF1VBDC6VT73T5ZVE5
'SP36D82MESV77S2HKNKDB574JW0XHVR7EC3C08ZNV
'SP11ZP4PSYAM83PBYDZN5RC96CGJEYZYZ0TTTJ6Q1
'SP3S806N8CRK2C1K22B87XTRKCS1Z3DPD5BA6HRP1
'SP2VPZ513RKF4VG6N1CVTJ3KB496KBS6MPJ9MZ74W
'SP2JN81ZK7G2RX4DDHJKMFTVYX6ACCK27EXRFYNYC
'SP8MTWE67BTFAPZNJM4XXHRJDKKK74797DPWFZ7P
'SPXNGGBJ23PSJ3YP3H6HF6B5D5MVC9Y3SSP84ZNK
'SP3THC01N71121VXYSC74TJ2DA94KRJ7FXDETDD3K
'SP2BRP67R85FMM6RG7KD2P0AAGZAE8DFXFTPWMBBV
'SP1135B8RBZPS6A9JBV8640N36CSJ98W3Q900GMFQ
'SP3Z9QRTFG83KXN0771ESK2NB5Y76H8HG95ZTM3QX
'SP1KR6YF6QE29GPTTY42NTNH3MV9AP2D771CS1ZSB
'SP9FJJZ0C5BMB5GX2D8S5SP0WNJHGW6AECE991B9
'SPHFG2S4SMX0V9QV0C39QVYBNGTZYY76Z8MPV3N4
'SPBRH8Y7GTKH1S8SQN613A3VTHZC57B8A4MDEW1V
'SP267J4MFJKTBZBT745CJTH27FB3WBQTRMZFQPQJ5
'SP26ADCZCH4G4ATKBSBQVAC22H8YDEQ3M0YRT2THM
'SP215PMCXYFW08DE9B6XCPATAJ2HS9DB0VWMPS0VB
'SP3JRHQMV265DCHTPZ38AR2PR2CM4HXNMCXGH2HWD
'SP1PPC8WJXNC5CCQ14BPKBZGK9FMRX2MF8D60H85R
'SP3691KHAKZ4PEVGGKP2J5VTJQ5N2C04Z0AP5Z1Z9
'SP71X8NZD9Y8VSBCBR94KX0Z03F13N2TDJHEENBP
'SP9PNGPY62TP891EABFSMPQBTTHZSA6MQVT02G0A
'SP1MA2J47TSPXEDCQ3V3SV36R53M1TQ0XGWAPAMTA
'SP27XAHJFV0ZA661AA1FBZYCMTDYDGRNFQ553CB35
'SP3AAHY2GG1FNB1QW5SV9MATVF1678NS33HQRW9JE
'SP1BFKJRV7M6F6E1D4RTR4JE5NMEEHT922B7E8TMP
'SP30QDHC33D1875N0B5HWZNBD3MGJ5D9FVSXZR17Z
'SPFQ8471579F52S84AK10RS9Z852MS7HKVDFJGBQ
'SPS18BFM9D20M4RED88CHCNCWSDAVCZ1HB12DX92
'SPSDPMPHDG53ARKM2NAKAAKQWQ9C3XK8QEZHKDX6
'SP3JHF6YFE4RY8Z9TY63DBGJXGSFE68QNBX6CKZ98
'SP16QC2G7KDP2NAVP4CGHFZ91WTS74XMKNA4G4D3H
'SP1836C74CQR9T1BTN2BKTDTVRSSC9FZYY7593PS1
'SP1SHFXKDNQ3M9W5CFD4SVHJHNQT0JSJVMDAEXAEV
'SP111FQ381SKT1GWEK8H9216F0JSPY8AVSPMDCP2J
'SPESKPTV30MDD6BVZ81GGTCV0HR9M31FTW4TVP43
'SP1FHM3BTRX9J4S9E9XYTNDHGNJ7WPTGPZJB2R2RK
'SP2AZXBMESZFYW8TXEWN8QAFB0865WHTTAGARZJYP
'SP177WKTDNVQQAGGD906VD04T2TNFMNEX5PDAJPM5
'SP1A7BN0KCS5CDZYBCB1NZNRY9ES585556Z0MKWRT
'SP19W9QF8N8BYXV3A97ZBVKTRWCC3MZRDZX3ZNCMP
'SP29FBYAJX9YDVAZ9A8GB4HH91D6R2V29QH34WQ35
'SP2TRZPFVJ5PJ1J7F2YKJCAPPKP054YMSFK6VBFQT
'SP2S546F5M023ZB1JB80C223SVZ6JBMP70DY77J3G
'SP3NEJBM95N17DJS057K6DZBYV5XJE8X01NEFTX4
'SPGZ5MS8WAQ1WRTB3482W1N4WEXMNGEP0ESJMJWQ
'SP7VFZRAJ2ZYQ789JAYTVSQ7ZP6Q533V813CH6XE
'SP27KBPANSS6CM6677TVCMMY3HGEB966K89BRB8K6
'SPZW0M0YM7YC10G4RN0M80MQYWM31RBRM3A7XWZB
'SPE1F2KZG3X75C45TP14CTGPWTBPTSGGXAG6KZBC
'SP1ZJHCYEH6Q3X3GHZR9KA9CGK47VHZ8KBFYK2N66
'SP3H25FSK0PV53DJZY5K80MQXDDN23T79WMZ7KZR2
'SP1HGBJN6Z4J5A5W35R9D46MRSRD97QXM6R1M16XG
'SP21T8YA1C1FCSX4HZVPJ7GJB51HRW6G11MH0VP32
'SP1MVZF9047CRTVE65216B7M3A80WK3KKJRG4ZY10
'SP1KG5C27YRWVKQ4E30BJC55MS5H9J5VFBQZD04G1
'SP8PB0CDXQ2PE9HGNCQ85HPRTKXDAVQ1W0SHXWBM
'SP3YNN627WAXXPA5W5D1ZZJKTM7MXMSZWE1YSWEW
))
(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))
)
)