;; 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
'SP20Q1H42BNH6YD6WFPCX4RZC9VDJXD8HEZTRF0CZ
'SP35QTH6NRQTP4A0E8GFFG9EHR78R2SM1DKVMP2R0
'SP3JW7CH7K8B03P1G4YKZABRJ5KK1CN6DVMQYW0F7
'SP21GMSFGMF113P2YHS9GKP68EJBA6FZPM5PYFY8Q
'SP1R8DXMHZDRCCBV8R58X616XH8YQZD17V6VHCWQM
'SP37NRNC8XA8KTST8RA97Q84FMS9Y7BVYQQAS134N
'SP1DAA35XXTYCYT0KT080H93Z0395123ZRZ60R5QB
'SPPD271BSB67EB63AJY5HH23BMCDPXVAGVBM6B0N
'SP1GZ2FFGX3E9XH0QWEHCD8K0H6HV35ENYHBPPAAY
'SPC2SS5V01EN252D7KDWYEG6QH612H2FM68X635D
'SP31THZQ1Y6B34Y5DTD1P4VM85XMMF2NPMT61PR83
'SP29RH7WJSASRJ63AMYJA99DTJ53E2BEWE18DKN41
'SPJGFBT21SZ5M62JGZ8KGY2VVK001BMA9D31G01X
'SP2S3JZAETCZJJ786Z3QJQBRWB2X8YT1QHBQS4SNZ
'SPNEKAN1C8QY33TBDGK7A910NZ7CVWGJP1YFQ9CP
'SP2FJ43QM87477ABE2VT6JN4TT1W88GS11PBEXS22
'SP2C2MP8S761M2PB04WQFSF6R7BDF429CN1J3H97A
'SP9R6821783PE281AJ9GGAWQZCDJGSCTWT2N96TY
'SP3HAYH3RM6DJW92W6JACNJK6S375BCXNQ1GCKHTC
'SP1Z6N92VG62E6DS6Z87T8D5CE9QBW52DGGWTABZ8
'SP1YKQ0R4ZBH818MZXKQW34133358GGRPV8N7Y66J
'SP1CQNAAJ4H7YWQCR1065FMCNT658HY05P7RYGG7
'SPY5PFSWWAJQ4DH5NQNH1V4TPGM6R9HCCMWSM6EJ
'SP3P7C6TGT8XHGQHTQX5RHMQ1E33ASRRWB4PF0PE8
'SP23BYPV6CSGAVSE8NYXHE47W4A481D4BARVHY4M5
'SPCGJT66SJ314GME2JRCZKTQ5KABKCJCH9HPS92H
'SP141GP2MYSE6G8RRRVW3N7R896AF4DG29ZDBAZTB
'SP419WEERKKC4BM6YFC3P5P55VYWBMW2GPX0J5NF
'SP2QWW46F5M876RX9694ZRJNSTBZPDCYWXB6VQAWR
'SP38H0R0VR65Y05KX8QCR4RQYJYVXDKSMATGD1EDF
'SP3WDRZCVZQBBEPKTYC8D7YGRZKCNXQK0E3APMNFD
'SP3JWM51ESQ45F61H27PMP6296NNVMR1M8QS9CYYY
'SP2Q8PG3C59MG5M7QQ1F7RMBAD1EJA3QJVNHTK7GH
'SP2E9K4JC6HBYY9ZQRVE7JVZTNBSP5CN22XDA91AC
'SPH85B3SDQBT0VT6GN1KKR0J2BDKBWACYGNAVXHN
'SP1A4MBYCB2DKM0HCVPTCKWBVSAD0J73KWVRJ8RWF
'SP26RBTJTMX7NJRM72ZT6HBCA56ACKC7QP6RQYAXY
'SP1TD7DWWPK3MSXZFV0GTS9MXS5GEGWB29EYNY4KK
'SP1TP5Y9E0FWA6J2A7TPWSFXCV2C5A1BMVYBVAQNN
'SP38142W7333X0Y8CQ3WN6R91S7F63SVRDN5QB0SS
'SP225YVMZ847RHACF51AJNZEDQ6PQPYEM9GFHKZ23
'SP1S1ZWZT3AYS026Q1QDCTQX30QJFTW6AFGBZKA9H
'SP37JGDJSKPGPAB61YX7R2T1S1VSGRKWRE7YSZNKD
'SP257AE4YXX1B5T5TFCGJ638DF3F4BBFCHHTGVY2H
'SP3N4JGYJZKAYE66DYE0P03XNR1E4989ME06DBP3R
'SP3M1H9S2YMCXP7A2K25PPF8J4EFJ1DWBRWYA7SB9
'SP1EEX54CCPKQKDQE17WWV9KWM7GV7S0XT2DE1R5B
'SP3SD85BE3DQAADPX5V8K0DJKFY61ZM2GZ3K9ZH1Z
'SPHPQCXGKPHM8XD5DRG5RKTXAGH6RP2C4DTNWMRQ
'SP3MYPXMX0B0R3TT6FA54NBRQGTHBESA98M7603XC
'SP29Q44AVG9EMP24WZQYB598AY9D47THRF9576GFP
'SP3R6NC4XSW6VNC89CHQJZ0HVTQ6WKXGZ8C9F9HG4
'SP1K0HS27EEQ2VHJ5TC6Y9D13CKVM90F6XN1PS558
'SP16WTV666FQD1VBJZZJ4JBTF2RQBSH7RWSS3TQKN
'SP23KT0WWDD1CHDZYHTNDZCDET3ABV2D91D0YFV5K
'SP1TPS6R40HVK21CDNXZPNEKDPB2NQSSXB37PKFPW
'SP262Q37WXVJA3MPT41R1ZN79R0BYYFN6BQ7MTAKV
'SP1QHWM6701EN58257W7AXKVYVD5M8HKBGVPV1S6G
'SP6P4SYXEPH76C7PANGTKY4K157E8W4BF3Q5VS38
'SP3CNERKHGR5R0K420SFQ71QRX1V8S41QGT5TQG05
'SP2MZQMF5VHZVYXWNAAJXJ9HPHNM8118VQ5T69X7P
'SP1CQ2W3ZT366FH8CPPS45DC2K895ZCPEB2Y2D4BT
'SP3DP35Q8NFCZ5PEV1XPBWS4VJ1HMGVP4H2ZTG34M
'SP3PK5G6RDA9JDX95DNZ05B6MCZE0HKR6W7RZJ9G
'SPAAF850DTGJAXD6CS4ZT967TEZ8H8JSM4XVVPGC
'SPVE9E5X5BEB8SV9JBNYMFJN4Z8EZ7CBSKJCXTDS
'SP16FKF910W37P8KRD252VR7XFP3VTWH2PNB0N816
'SP2NCBQMZ95HF9ZCHAY64ZESMWXJ58WVW1JSHNMSX
'SP3DJ6FW5K7XSAM7ZA425Z89D6AC1CNNSHF4FJRZY
'SPYEGKVRKRFCR4KVVS4PFVVVYA4J8YBP03M7NZED
'SP3Q4Q2YFMCGWPW440YQ8836RJ1DA12NE8YR4K1NC
'SP28FBBHNGN1HMAHYGB1552KS0Y4MG5C9C69PRX16
'SPN3X73KB44TDG17GSFZ68GBHKHSXASEWTBGGWVS
'SP198MXDTBXJEV7SNP842X4J25WMVG2D8P91B9XD7
'SP161QHS676YAM88D58Q958DV2XQCSF73DSN7S2DP
'SP3SNCYTS2S58VX9VYRM5ESKZW4M3XPK6QHVWQJTH
'SP2VAM5V0YRWPWY13PABN1H5S398YJ4APXZTFV44F
'SP38RFQW01NF19SR8NGW9HPC6Y08P61XA7P6CSGK
'SP3QNRH5T4XSTX3S9AKT4GE0M78D0WHB14DFQR4JE
'SP367R692XMF14Z4AY4XKYY1D7XK8E7GTZ68P8Q2Q
'SP2DPJ2HRWD85N4VRZTGNDG3VDNH3YBYP4AZEBWAT
'SP2WWYDMHNG2J2TPBT0GPW4KCYCA73EM0RE6E0R59
'SPGXMKC2BDNBZ9S5219Q420BD2HP8G44HP6C4Q7P
'SP1VSD5SSTYSGPR6HJNZZK327KJV3GCXDQN37E0Z
'SP1AQF84H25J98YGSWW36PYYAXJNXBQ2XZWDKXZGP
'SP1PWJCQ9NGHX1H2KW5P23QEKK9ZY2SY7SJZ6AYS1
'SP2H9Z97J0B3159H45ZFX6TVKS9RT3KVKDPGAHJC5
'SP1D5MFT868MW6RMW95GDPE943Z83FMNJXN6DZ4RT
'SP78ZE0PGE1EHJCQVP9QJH5NVKMRVZTSG5GSXXY4
'SP324SHQQNNM3EB0NVJYGVHV6B6SVHK3KBEXZX9AQ
'SP158Z882P7CFZCX6K077319YV1C102MS1D0SZF79
'SP2E01ZP4CTTV82WGMNDMBKXDYVDFRY1VXZWCQ9KS
'SP1X7535CVG83SN2JGJCPEHR05NWSVQTKN3Y3YPA8
'SP1ETHPYYPS7WBZYAR2XA08QFF3TKPJ0SSV9TPX56
'SP32AD7VVPWH34DGD6J9TDE77PV4506M519W8TVV1
'SP94K8JMH1Y7MVH8F44D1ND31WF2W0PX9YRJD9KS
'SP11H1GYPMK1KB97VTCCXN21WWXWJ62C35P8NC6T9
'SP6ZAVC8TCJQQBZHHQZFZBDDFZ7A13SPH542W8YS
'SP35VWTS4VYAA7VJN6103E412TFGNPJDA09GFWZA3
'SPCQAG6W6EXAA7AFR80YETR41XAE3Y9S4KN1N7P6
'SP3MSS9QW07TGNFK5KRHKVAQ22JQT8QGXCDSQ4TK6
'SPSH273QHN641AF4D1S1H30V2HG1ZJ6MG71NH8P3
'SP6YP3CGZ60Q5NGY8CW93YSAZYMA91FYBJF3YBEM
'SP2X48EMT7RR934KZP938W87MF93H96RVC1GNK7YM
'SP2CTN8DRXS72G64MW7NY86B6DSPNN9RS7XK4V3KW
'SP80A205JVKVD8CD445MAJB69BF58FXYK2W3Z5W6
'SP3C7Y0GND3FX7T5MGE5HHFEN6WYET1R3BBHFWG5B
'SP1AGYQ6AE317F873EQ5Q98T4X32X37TR5E8XJ0HF
'SP3VM8F6FKS3810M3NVE6GZ937BJXZGMVKZPVT1E2
'SP33K116R8VK57Y203YCG30Y2EZARP8PNF3YG3SCY
'SP2836M57SRADJK8AX3YQVDQ3KDP5FX8TRSXFXCZG
'SP3DFNRK1KP380PGQC53MB64M4J0Q9GCM5C7NXRKA
'SP2CYKHA22MWQKV17ZG4NS77RBFP66RG5GETSF2WD
'SPX6WNZQG74TA7WMMZ2F3CB1ZQS9H2WNMK49S171
'SP1M95SQD54PF7ZAZ8STEHGGPZ5D3SDKNKFPCST8S
'SP30R813PPBADJD43THPT7NQAJXXYG41B6B25KTXD
'SP3CE6AEZS7AND0W66QMEN8SQKDQD2G7EDVWGGHYB
'SP3JRK3SH37S23B95RM3N0DB3SRXYW9316FY1HHZ1
'SP3ZNQB9KTW7PXG20P5ZK9ZR8PP6A6SZP9XTAECXT
'SPKWQM17S8111SGMMED6JXPARN2QJJFVXGK21DSH
'SPZY0KSPSPEAGK0423AJGVRPEYVDFQWDR7147B00
'SP1XTT9RVQ31TGTYZESVRSRG8K0WDSZST3C4FPDKE
'SP3X64YJVRFYCW5V0RGGS31E105Q51FM3PBJ2NX70
'SPF0419AFT58DSF25FDT2GNKX2GF6EW54KWPSES4
'SP2A8GR05SCY4FYXJ9SQHC25NP68E3TCW1DBRCY4D
'SP272A2XX6NQ94J6VFX7D3X68PV5F3XEK1QXKD8X8
'SP13H6YT3KPYDCR69HQ7QK194EKAYN9EKP97R6E12
'SP1W62NTXCARNMWF66R88Z42TN2YDS7AH2DXZJ0T5
'SP2PACCCTSS3S83N3K1X4WCR8XS4W72TF6NZ8SPSG
'SP2M5PT3B0GTQ0SYFYBQQ6NMXMT3TP0F5X5DGBA4G
'SP1H2VXG24PC6H9C7S4402WKNT2KZMS506D03PPD7
'SP2HH04JYX78GKGAMW00WSWXA627Z5MXR5G56VGJK
'SP32A3S954VE2R5C6E9Z39G1X26DG0CBEGPX11E0B
'SP13Q1QHFFGBJ1JXBEKPV74A6S49S0XP205JME9E8
'SP3EHQXZK6SV1XRP95RNHR74RBXZ9YCAN8YZC4AWA
'SP1A7N0043HV6HZVGK3MWYEGTJ0Z6CDZ3CTR7KMXA
'SP3ECF8SRH4DPEM4CK177494Z52PH8YYS62PYXBV5
'SP29VBJG1289TNZK8AN9EA818VBBMM92CSGY7KDGE
'SP1XE3NF4ECXWBHB7DRB1WTM9TYCCTVN6PWG9W0BT
'SP157EZDGP445SRFBJG21TBXVCY7YRGGAN5YNDGSY
'SPZJYYTWMPFGANF4GRTJAGQ2WXVHK760MFYQWPT9
'SPXPP6R4NRE0879V1ZRCRG6R62K8T02K0HAGB61P
'SPCZDAQFACNYN9M2JW442FWDP2Y8MYGK190K8JF9
'SP1HYDSBVZ6YEDZZHVE5BEM91D3HTD0MYR77B5PB9
'SP33CHRX0A347ABF681Y75YMZ6CYY9R956HD4C8PE
'SPK0SG3ZRVG0FPAFJBBDWJYEC52VVAH43AEG0WZH
'SP1GCY6V9WZ8REVRKNKJP0K89KHZ9RDR3Z8Y0RWH0
'SP1AFRGQ20EX3FW8XXEQYNTWJEFQ1ZAS7YZWQ1QEF
'SP3TF0J5PW51AFPM5JTW8ZYFC1PK5Q2FV321Q13TC
'SP3M5W90V9704BSHK054H8ED718VN5PEV69JH68ZE
'SP390ATGDGQFHE5YEWKXHCGQVXNAQP25JAXXZMWSC
'SP279WPEXXTN709AJJDRTTE92C44396A9965F2RQW
'SP1HG4THJPXK2JC8APJB7B8PC5APDCYCBTF2FQJ24
'SP2YE9H0SQ2HS0TV37JD7EHAF3ZHETZPTE983MM3R
'SP1T53P2NK02T7DR9TRW6QM184TQ2WCGS9T1W7KH4
'SPBC5CXC2KMBYEQJX5ANRZ7JBYQJZZQ8JN2HZ20X
'SP3KBZH8CPBC1HWW9F132ZN286V4HF07EPPGKVBNT
'SP2HPJXZKR41K9VKC84Z16DJVH94DA4J1ZNW8J4A1
'SP1YV42S1JTNZK1ZZ9JDW4KFQX3QERHRNBW9PPAE4
'SP7J42390QDA490H886K0WZ9CDE28XGN06MH2CEC
'SP3TWZX04D11435JMTD9TGDAN0ZQ25BYVRXRXS32F
'SP18BH60RBHY9G1N6S5X24HRN9T07XTZ63KNGT75G
'SP2XTKHR4V5QHE1RHYG62TZFJ5QFM3PP50XZW9E1
'SP2E4JE5BXQ6XVG86D2BBKSK3N9W49TEMY12CAATF
'SP10P6ZPFHRSMMWNRQC2TZW5PENJHNZMMEGFKXWQY
'SP20670DDG79SX8ASZ6X7V65X2P5NXZ3RN4NZNVZK
'SPVYF139HBHH2604VJDYDGVEN00ABE6HDTY7N5RR
'SP3M8RMMY5DRJ26D15KVMAGPY3J29TWKCF51XZYR5
'SP37SZERFNG9H90Z8VAE8RFSQ8PWZ6TWSXBQ7WH7R
'SPQ2FSHT0VVW9K9FE280ZME4K06YK03FMKV9P1B
'SP2VSKCNCMK643YZJ5TZG4VA7JAN3AQ0Q2BPZRG5J
'SP277ADH9HKSG5TTZ12DX14KS1SM7T4WXE4XX3T00
'SP1G2SBVRG0JKKJ39VV6FNJNHZ11P870304NH97P5
'SPXMF3CSAQV2CMAZE3FX6FST8WMD9VF1C1M2NGGQ
'SP2E2X9B8CM2JZGZHJX2J5DPVNEH9X2ZA56R6369H
'SP26R92WMT429GFT7NCY8101Y61T2GWX96KSXERX9
'SP3ATQMYPKE2H29QPPQ9PZ2VJ8KGFXS60S5H9G861
'SP1KF22FMF2FKA8GNNPEREK9QQSF57B253Z684ZWC
'SP14WN053FSPWX9N79TAPFAQY08RSHA77CZABBEES
'SP2KJ1XEC1QW5JMCXREM2EKWGZAY2KY7SJN5ZMR20
'SP3AHTE1HDRH2M788QCTTMGM3GM2KZJCYDS8V7W24
'SPHN26ZKQ0YKAEXCWZGXZAQQ86VFV9Q3KG3J7TKD
'SP1X508EZVR5Z5JF83Y5M31D19J34Y8AC28T7JQV2
'SP10BWWGCZ99F9V7Q6SQ5J0BHQ1G0HAD3F2EKAH5C
'SP2FVAJKR5NPB1GPC0QQB8BY2QR8N6V496Y9B53FC
'SP2KRRCBNHG11JX00JXCHWMVF1NX1R9QJG7JCTY66
'SPHSVAQ88KGGNKRTJHPDCQS5XECZDPX2FHF8RKQN
'SPSDXKV3H9N7362JM4DZCCZAEB5JB77CRXG6YWCS
'SP2Q2ACENECKR8GJJN1ZF38GCX8S8QCAH0C5VK9Q1
'SP1AEBF4EB838CWQ3W4HJ596MYDN4KQ2N3DXGE6XC
'SPCS7TEYP9423PB44KQRF20R6DCEXA6SG4X0GD0W
'SP3A2FH4QMSB82X950AJMNZZRKEJ8642B3WJYT1RA
'SP5X6CG726Q6HHZ53WFDN4ZB4JXCGBMRDS015WVF
'SP11F0THQYTPRVPTP2ZEND3MX3T8V403YRCKYVQP3
'SP2S8F4T5PJ8QRWSC1JYHK7JS2KKXZA2HQEW5G357
'SP3DX1DG12BBTDHMXNHXQ5EV4MW0HP7SZE83D5ASV
'SP1SM8FEZ0PAE1S96M74NND9HNJZNXB15TG99672G
'SP96H999T4DGNZ9HD0WZRY0GWDYT26F70BEPPSQ5
'SP3V3395XMBCXCKKYKBVC5E5G308EJVMBP9487ZPC
'SP176ZAN4CW8Q6XC6Y5B5FQE0K5SP4H6K5NNKFPQD
))
(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))
)
)