;; 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
'SP1RJ6MTX4Z1YT2FAM027QERG8YVCR0SZHEBEH8TY
'SP10F8SMRSXXE7DF0W9F0YK6MFX3MHWKRADN659AE
'SP17XZ92TXSSBN69A2ANSYCKGF6BRNFPNP03RA2FQ
'SP1D7WCKA0EHCTCJXRGQAPEASVZBJN1KZYF74ZAWC
'SP1DAJ300RZMACZ0EXTVNMV4FYSCVHD38AZDR9KPM
'SP2ATM3N7Q5GBCP8N4C1JG5WDEZ5MRRB5K30SV269
'SP2PAF9ZPRVKZY096MEYY1JH0A6VFC576M3G2CHWQ
'SP2SGZS5E68BWTV14CT419WFC93FGYABN8H1PN32P
'SP3VNQ1HQGH6B811QCKR1N3YNQJGDMW67CJ54EXXE
'SP1CSYA7WYFN70B4TFX6TP4RNSHJDJ7MS2S2ESKWT
'SP2E4G40EN1JSQKA6PBMQAMGPQB1BM6XYBR3TMMAW
'SP2E95A5PJN7XNA3HW8Y29930JY7E6J6223J6CXAW
'SP33VSYT54RY15D7H80N6AR3457HN7KJ8QTP95BKH
'SP3JTT5CXH5Z6MRMNSSQWDQ9TYT2Z8PQXWPN1FZSC
'SP3KK45VE4A4QH0RM7PB4XK8X7967CVPJN8E6MACW
'SP2FJ71PMQ12XJRXW100MV211QATPCF90DGATYF8A
'SP40S2B2BK0NQCFJD0ZR6BEMMYQHRBKZP1KJ6HMP
'SP3Y3BQHWAT77RSM2ZR676V6RS5V1H5TZDJYWZ2KA
'SP1G1WXKAAHZ0KFJFFT0X8SPCK899T99S5BZZGFJS
'SPSHBAPVCR3T3QNH69S9RA93KCBGK4NPDBJXFQNA
'SP2HE2F2MA3XZ7ZY3JMQ7BSG35JXSK23RHT1KRY9Q
'SP1530YMSXEBCC2BXJPE536D1WRT56K74DW29ANM6
'SP22V8VF2GKSHR83HJ0N7441EZKXGNHZPSW6CK013
'SP3VRJ5DP3FH2634PW3T3S60S9EC010CAPQ7XV35N
'SP250EWQ2XVTVC79YCFSFM3KYC63E9KMEDFBSVN96
'SP3J4SS58BS44NXB3N5H18H9EYYCQ0CDNGH207JCV
'SP1F41WYA0H4ZWWTPWN8JRS8QT6M3XFJ6ARH92PE2
'SPDMMRAZK2W6MBCAH3TFDNNXREVZXDYC2QVRCNVW
'SP115QV95V4SQCYV6EE1C0S9GFSS1TFM41AHNPB69
'SP1QE6HA288FMHXC9AC9CGHN033G1FEA37QBNVBN5
'SP313GTBFRHJ7VT23X96NCKAD876WBBHXHV8KE16P
'SP2VATCTH2ZJ3B9YEVB6FJYR8X2GGNR71FVN2JK78
'SP2Z7GM8N81V00P7Y06VGA7B7EYYESC5QDVXSPJW
'SP2VADJ24QXP6QT9GM30HA6P3HS3KTK5PAWECADJD
'SP29CA7DDQRQ68XCMJ60BM4V2MTTVR6VPDJNWRPY6
'SP1TXTSQ7NSR7SN1YPCYR2SRZX9Z43VXJJ5R9V45J
'SP3C8RV4SBC18NNSH4EQZX934CV977KV3FXYWRXB3
'SPG714KDP3142ZTFNDWZN96SPTAEVTZET7NDP4S7
'SPM5A4Y2SG6HM2PC3MQFPSPWH312MMPQH3FXBVV9
'SP147VBW9A3XRXSWNN75DK1VZGES78SG6JE2GVY69
'SP3398GVHAJQY9Q1R83CXQ17B28H9ACZHV0TF1MEC
'SP2HGVFKDP8RJQGKREPBWSZE45WZ9KBRDS9W1YTJD
'SP28CV2Y2PNM3FZP1035XGG0516SKDWDTS922X8YM
'SP17WX62HVCDHYPDM190X03ATSS3K6RGWH40MQMZS
'SP3R3X5M1H1WR8K2H3D82PTYAJ8S3K8QS36K16TCT
'SP37WSXR7GNM4S6KH7WR7QGR00BZJT0V850BE64T1
'SP3CHH4FWZ5WE0TZWTW80QKZHN8N9777MQK47V11Y
'SP0F30W7EH91S41ZM060NK1HYHV4WYDWMCCM4W8W
'SP1FHX5674TTDG6CMPGP538YXVAH1A5KC2JKZK3RJ
'SP21E4AS823QWXPFD76YY5EC7E9H7JMR8CF879TMM
'SP24FN0X8TQN6G11EGXB6Z51VWQJHSWJ4XAN56GBW
'SP285J473A9ZEKSXV3GXW53NCYB3QSAXV5K7WP9S3
'SPGR2RGKPJ1AEMNW6N3SNF7WKTVP9KMY0G791KEK
'SP3GTJ3ZS6P3VAJGGT2V0TQ6FE0TV4KM6DC2RC3SV
'SP1N29JZHE36RR6C0XD4HC9VGRJDC79Q2JY6WCKW9
'SP35C9JTVHPN7Q5BB9RSVFC2WQSN1CFVMESA9VG7Q
'SP1501KK51HK431S26R0ZYZD06V38H4S41D77V6B2
'SP3BY40T8GBWZXTRB9Y1FZQ8QRHY8T80Y9N4D5TB7
'SP1VE9RBZC9F5QTGWJ6482JK6HWHFKSC40RMVW5WA
'SP1NBBB9942YXCTE91WCMFKPSDK9532H0KFKHBW2A
'SP3VF4AMN57PDN1R5SX25ZGXVHH4VGDHY34QM9110
'SP1T0QQ2JPMGJTZG1N4D313AGATMHAE7DV9623S4V
'SPVF6H5JRZMPS74KCSHM9SYNWT5NP0QN1NSYTHHC
'SP3HZFW2YWV9RXX7R6XR7S5MGHD9WKZEC319PWWE1
'SP3DCXSAP7P1HAAK36MRJGJGDJHMGVR24P2MGWEHJ
'SP2GRBNARFFYS0BGCH6K9S2CMVJ9ZZ31MGV0PT5DW
'SP3KKR9EJMWM0YMXBTQ66Z8GYZRFPPY2RDZ4VR3AY
'SP3381EH5BATN0EP1N7EG6JENWHPR44AW1VVNDB5S
'SP70J8K511ZHBK5C2WBYKHD73W997ZX58NPZBVSA
'SPT7DA5W5AY8R2MKM89H85GYAHR26T5FK9HZ8K8S
'SP2GDCVWCF613MHP83X49MQXET20WNHRQKWHGMW0C
'SP3CTTM0C1PXTJK3BS8Y6542ZR6SHZWF3Q3KKH71S
'SP8DWVS2VZCFE4Z6MCGGJJGK6KY1GSE3RVGY8AK0
'SPASK0HA85BNPT0DFE2FBHP36Y04B1138R3KSSYF
'SPMS460349YM7EPD3M9D1W1X1MKATVXW6513WNS
'SP1C9V1W1NEEGMPNVAETSTWH05CJ8Y9P4ASYN7K3V
'SP11CJX3NEVEE6RZD1M6V06A6Q20B553RJECZY6Q2
'SPZ93GY6ZT1PTSARHP8RSQD8NY7HTMT4WY9PK5CS
'SP1VR0DTVA9G1VAV0MPER2C6XNR3NSA7917MZZBAQ
'SP8Q1E8V58GF21ERHSM5QW4Y9R9MV158B1GJVCF9
'SP3SK9EMA3E6ZFCFVN1YCK9RCDQNWHVJWZDBEK0PY
'SP3YA9RPXE1WTZZHHWSDYH59PV6E0JCX5HH2CY9M5
'SPZY6GD10D441B9QV819ZX19PYHHHX03M4RZ7KTW
'SP3JRXV18JW0CGQ1MN65EERFQ9R80XMBZM2WD4RFX
'SP2P3QTD1ABQNGXF4K33GV1FH1S4BVNCADKBAK2XP
'SP9D6M8ZN62CR7Z96Z98KTQ8ASSTQYEWPGWZKAZE
'SP350TNVN5M7V4V5XN6DA1PF4MDQ87210G3Q2QTZ4
'SP2RHTHAS7QBCGG77NKVH3PJF28EAC0GMRQW3E9H4
'SP271E4JY1W5017SR69WN1HVSV7P6S2VE2QWV4ZJQ
'SP2MCN9N2E69XK18CG8874RKFBBMYP0F6R7N39SN7
'SP2XFM09ZSNFK1KQ89C40AECVQJNRRYHQB19ZGED4
'SP2BWCMN1KYXN9AS4A9Z9Y0X3EYJ3F154KAT05083
'SP2DRN4RNK9SE99HHXHWXJDMYHB2H7JZRDDV6MPSK
'SP10CRJ9KPTMXGSTJ39GDQYWA1PF09F9HF2RMDEXX
'SPKQWFFMVTP90MZ9SF1YBYRNM3ENVHQFD1C8Q1X8
'SP19DYQHKVR26D47BANXEC2AZX2Z41ZYN8AAE6RXB
'SP1EN3XBXQAKB5ZG7HTJ3134G45SP3VXFW7J0XR0P
'SP1RY5JKSQM0NBGX2PC2SWBEPSTMBW9YHEY5M3XP5
'SP3Q6BNPKK5DRHFWK8C81Y2E4XCM30ZWEZ4TH31K0
'SP1Q1PVYXM0F4VFP8WQ7237W2SP25RY250KWDQ71A
'SP1G3R4G3Z1P8T3NQ56P2BV32VYBD879ZBCH9CQJ7
'SP1JBJ1KK28417847D1QXED7JQHM4JV4SF24CW3R3
'SP1WW9TYHXRC6KM36FS75T251VR4R291WC4DEYJWX
'SP2CSRKGFA5SYMJQ1KMMAB1EA6SE75GB1TKXVDJFC
'SP32J94HMV1FWF6W9XDCR29AP5QYJFH3PM689ECGS
'SP3BV4RXFH77B4XK0R85C33VAH0P5FQNC5VC0C3Q6
'SP3VHHYNMNMFGJ13ZDZNBCE8WVW576B7VP42NT2FP
'SP7QKE1D7G4KBP83TZCQE084ERDJF4WCS0S6T2NB
'SPAX0XB1HTPFGD2FEFG8ZFY0NRBM0FNT6A6Y3JZM
'SPBVQA2P6T89TJGKDN6AE9VDPATQZ1N4VBN02BSG
'SPF8XJRAEBA954J86E6BA1EQFQPBEA2RH5HHJNDS
'SP1719YC7X2TXAXPV215FY1E1S3BNWAG4EHHB9V88
'SP21QHNTS6CKXSMFCTR9Q50D3W3XN9F022XVSYA35
'SP28JKZMED14Z8Q0ZBCS4S90MAZCDT2N6KGVS7YFR
'SP2S8CMW186BSD209M1BG147H3ZSPCZ5RCHZD9VH9
'SP346EEXDSJG6PD8M5GG5DADKVEAA8KQ5D73QFBXZ
'SP3GWJDFTFY7QRDXNCYDR469RYRM4FKZQ87NQS815
'SP8M8Y896CR64EQQJX0Q7SQAG69BP3PZ7Q6YYQGS
'SP9SEQYA7N732TECXVQJBRZV4NS56QXYEX5XW22G
'SPZ7CD86181XDZ4JCMS9BSQAN2HJXTV6F6F57E6S
'SP198PWYC5RCV34H0PN68P9ZKEN1FJ76YPXRK55QX
'SP1FGECXEAD59GT5WW7BGXD5F028B255G2QN95BWQ
'SP3B85BTQD65Q877DCRAVCXH808GZW1KFE2EXX323
'SPBB0N3T49HJTYJ39J43E9A7JF9B774GK6JZMHFC
'SP3CNY1D6QWQZTTJDJQGF0GGVBTX9QBB42C3NJQJ6
'SP2SPMDVGW7N4A1JFEM9SJF0BZFNJEGBVRVSD85N9
'SP2VQ5JACVBQ9Z03GCNY2QMNG081WZ4P5JEW9W5AF
'SP2C9M02NHFJ0N6F9QPD1CNQX1XXBTQY120JC6CRR
'SPS91ZN13DYKGKYTVR3XS2AE6ACENCZPHG0RGM58
'SP3VSNK7F2QD79MS6BNSVVA6TYZ341TWSBC530F4X
'SP3250QSHSN8ZG2FZEX241Z08QYJ9KX56KQ29MRSY
'SP2Z5SE4VWGTY90KHNF540JW2A3Q5QEGNQWHVZMYY
'SPR40QQSEMBQP7DM2QFSYF1VYJ4X861FFAH81QZ9
'SP3Y3TB0A8QZRZ5X9H231WA1TVXEG4B2ZR8GC0AZV
'SP2CKEAS55GT4JAAPBWGJ84SAX1X3PTMVJG9S8ZX9
'SP2KAM0HRXPTK409N2YK11B2F0H54KJK268MV6TX7
'SP3DMS4G705DTTKHG65Z1N5K4143048A4W5TE2CQ2
'SP3SMK6Y1HXSZQ4DBN4GJ2PSCAQECYNH89BZJE3CW
'SP12GKVNXMYV9F9KY3QB5P4TXKNA0GS6WFTHV247Q
'SP133Q2NAQJ740A6TXBT7HBQYFKP7XAY9WHEKM925
'SP145W00SKA0TN4X5Y7W9NM3XPJTH0ASFZT5E605P
'SP1S3XYQ12RSD7P0CEAR6DG15QVY5CCRPHHA9Y6YV
'SP2N6KWWQ3NQPYWJY3N3M45HN16XV97PYP1M7KXA3
'SP34QSK9TK076YNNNZZBF619RG32P7FEN1SHCVPSF
'SP4B8V3NPH1YKWACDYRSYS9WYJYH6EXX07QY1X6W
'SPG3NB5815EC8ZV0X141W64E59S0ECZYV4T6TCF6
'SP1R3516EDV2QB10HQX6ACKYGYP7A4BQ77M0CVKZB
'SP3SSFWBAV5XQN5689S6J2ABHDXF2GD3W98Z2WN3X
'SP3G0JPRH9K2VP42P0VY8NYSTZFH0KB0ESXRNB497
'SP1JWTSX1DJHD044T5MN63JHDVH14GYBQBVBE7V1G
'SP1SC556D9ZZ3VY606JEY05VB0K912FSFHSA7JKNX
'SP3W83KG17KJZZXPDZQDTRQKQRGHNFZN410R9P02E
'SP20803JVJRQ4FRY7RB4TJGN0YJNESEHX213Z20WP
'SP3XYJ38JYWK3S212Q4F736EDJ1VVHWEKXBHP1S9W
'SP1ZZ18WQG9VEM6XGGBZAAP7B4DXH6QMNSBGR1ZBP
'SP37TJWMKDCX4M1S6JA40C08AG6RNHMZA75WBD5EP
'SPXAP0Y95X83W224FYZFHSV74RCJRHC4Q79MA930
'SP243C35WPQS17NZXRBM0XDKRR3JKBZXFZK4NVRVS
'SP0BC4BWMVXG7HW7Z9S52T917PF9MY263H9C5EGX
'SP1FMYJJVGGG2YTDQ3GMAH76GZNANQMCG21PT21GG
'SP19NPW1QYFAVJ4DFY9C29X9MMVD1RA3SGK033EZ8
'SPSSEXZMYW9K00JP525VSB87DR0A6KY80TCPVZVJ
'SP6VYC941Y64FDV16EA8623V51QW4PPN47JWM6QZ
'SP4M2MZ1K50589XBM5P6HKFM8E0XXRTE4DCN1GQX
'SP7PXKSXW8XHD46N6XTQM7Y7QNW1RP7SGN2DTZ7B
'SP2EA5WB32JD1RJBHPG5K35ZVE5T1QNZ5M0Z93S7R
'SP3VAFD5QXVD2W2SDS8RN55CB857J3WQSMWA4SCNQ
'SPYJWJ1543R00TG5GXFM3W6FEZ1YNZDRW66TR3BA
'SP1CMZGP3C5WG6GX5HS55REZW6V2W1J980X3JT0NH
'SP4PB0C4CMXDDCTHFG9BE1RXQZ038CEXBRJ165J0
'SPEC5QMDF13BWRS66N7F3GXDHHH4KG6HY2WQMCRG
'SP1ZKVZ6FDAETGFB8RGYP15VD9KRKW97B9JTMAE9S
'SP2JCYRFVSTBWG5WRQFBCQQF87KFNQ55H5CTMAQB8
'SP1ZKCCF1GV7E0Z102EM9DDMJ04NM1Z4DDPEC8VFT
'SP1CANMFPN48BDK441GM0HYCCSHVDMPCYTENRZ9SA
'SP16MTYWKHDC83HHKNYMP6TYP3N9FHBARNAF216HH
'SP1CMBJKCX76QJWRMHRX807QNTPT09TGH65T9C1J
'SP1WHFKAW813VGWQB4MWT1V9BJZ0KKJTWX2GJWPM1
'SP2QPZE4Z38P3SAGZHNW6C4G5W9JCBZGPG2RN77T2
'SP32HV9B0E34458Q799G3J11C55J4R9WA8ZC6KFPJ
'SP3JB3HSPM25VQ329PH1Q6SMKGKJJC8VK3E610J0X
'SP3KY268NHG8XTZ317T12ME4JG2G5C8TPXQD9T3MG
'SP3MAKVCG6HD05PNKN5H39E2PSGXVYYNKSGSHYD1P
'SP4GK64C73EP1PM96NZ2VKQSDQNCWFE995G8HXEV
'SP7Z2VP84H9GHJ16N1ME1NTVQ3RWD3S1S9Z66B3C
'SPD0TG6WT7FYRQ7GH8Q6Y4HJK6FVECQZAV3QMAH8
'SPG00W2RCKSH9FYN66K4Q9Z1VYWTHPZMAZ91S9BB
'SPHWQBXQAMZYM5EHX4QGCSCKAGXCRJCM572ZNYAK
'SPYKE0BJZ7KKCR2WHJF66CQRDCH100PCTS5QC36Z
'SP1K432EE4RHAMGDWJYFM0PQ6JP97ZPBX6HTQSKV3
'SP16VN2WT07D0YKR75FN7J0SJ5Y10VMFVEB0J9JD7
'SP15VXZ5JKZQVEVSJ5TACEPZDHCS1H2HK1BSFABA8
'SP22CWQNN4PQZ2TTJY5Z3CMV40TSGYC8DJCWB2FSN
'SP38HMGJ9CAM5P1S86FEDMSJJY01KTD9SYX6ZH2BQ
'SPAV7F452T54B4XYX5SSM5QZRRKQXS1B21HP5GTN
'SP12TYM182WPP4R73V0542CS8S2RAZRGKQ0NQHFBT
'SP1K4ZS9166B303BHA8VR7VA1YHTWFNSB5FNSY86V
'SP1K6X2QSD838SV109NARABKCE3QW2BVCFAQRH13N
'SP1MTXQTBWKEBHGBGGT760KGV2168YCC21D10NXP2
'SP1PM9V5M7PZGXVZT4YZQHABA8TJEBT2FDXTB0TM0
))
(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))
)
)