;; 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
'SP2QY47K9EH1RJVNQ7RG7NHZVQ422XST4Q65V525A
'SP2JXGM510VF4FAAXJ2VC71YFZWYDCNM9AN36DB1H
'SP2KJDH9ZMTKJE53BH25KS6S7G44MWJHVFSKWY3C9
'SP24Q4PHRJR2XA9W04TM51AFVT59E44VT0Q0ABFFH
'SP157KK6WVK72CEX3H2YMAF0CY5407GJGHRGZ2019
'SPCBMBG299BDHJRRS50RPYMZDC89RVBS2QB8R7NS
'SP3BKC7BDNKX08018T93BZRAM7MBWEM4QC5TWTS01
'SP2YDP13MXWC61FPAWSZASA49E43ZZA2P3G3M5P18
'SP32KDHV15T3HT5R70PK4W1VDCG046GW9YGHGMG10
'SP14HZGZN7BNV3PVSY201PCYRQDH1TDKFY1GPM4JN
'SP19JJBMB7B5BZ8ZENAFREFWZ4YPDDBV1FDE07264
'SPJQGGVMAMH2P6K3HCK5ERQD3X2NC89WTHCHY86A
'SP2GR4FFCNZ5FATP98Y50Y3V3J2F1NKQ8AP9GBP0W
'SP23AG7C2K5PQB547CF6AP280N3ZNNAAZE5JPZ11W
'SP29P31FFH93AV36XYQXQFRJH6G7DAG3S78FAX94Q
'SP1JQHZ30YKZ0P0JWCN5G4PP21J9SXVNP2WQ13R5Q
'SP11W2TMT4CPXT3XDY5N2TPM70JDGNW97740T7Y7X
'SP20F36WMZ92GPJR9JGXEJ4JH83X0E35AKGCJPAM6
'SP30ZHK8H1WAB9YENN8RS514H8K00ME9JF4X3YA8F
'SP3KBE3MSSH8KQG2VHKTWMHYGCAMMQ3816KAGDNDJ
'SP088R4S4TV05QSVZ7E0RZRFAVW0ERBF5PCQZS3M
'SP166Y3Q445XBHGX4WAJNFH90QDZ5F2QG96KJWA8B
'SP191XBB3YSB93R9HXRSMM6YP47CCHRFT4GTRZQEH
'SP1KJZJFT288BK1C8G5YXRZ17WFPB06N8K5TP6TXH
'SP1MTB5KPPTYCV7MK5WRA1K16MT09D1MMNQ34JBHX
'SP20YMFGY5M5696RHZJFGG5KAKNPY9P8MCFDVZ97Y
'SP3VJGBB99FMFJKKJB2D8P5CQYH165HZA2RFKMPEK
'SPYYGACE3AXA11168AT37Y9CV9V9SWKJA3R13D1H
'SP3P1P13G798Q3JQW753QMR5DRN2SWGXRT7GEZKXX
'SP2YW04A60AY7YSGCHDDXDGFYFYSWC8CFVHQ2NEGG
'SP182SG9RKKP5Q1ZGNWXK534KKKS1BSTJ2YRZNJWP
'SP1ZPER5ZDCTPR2GQKRR5PD1TDQW220DPMMY6RKTZ
'SP38P4T1XHXAARYBVB42RC98N5AMAQNVRVNJ8VK6C
'SP3ZWBR39XF80ABMVGZ66ETNXRH3HGCQHRPYW40GG
'SPN45NHBRTMH5WTBX7HVNB86XHWKBZF20TSPF5A7
'SP2VCPEJE77TYQQV1ZG8H1GPR7M8YW7MV3MP190XM
'SP3FC1PYKGWRHX5NQDFV7DDVMJGFFHTCSS9FDFZ59
'SP2X1SRYGX0MSDVM2AK7XCQSSFTEN4SFEMDAWSER4
'SPD1HA50T6NJX9HNKWKPWEG5GAGQWZMEWGKA0JGX
'SP65R92AE22DM9D5VJK348TFS2WEZW2VWDNQNC87
'SP3ZTEQ37YPJFFR43MSG3S3BYKP98W93338F0AZ9S
'SP1FWDW6FFEJJSB3XAZYW5Z5NNMKMPANHHQEY4H6K
'SP2Z82QFEEVF9CM5QGQSVRTQRTCVDP9B8JHEPWARG
'SP2A5QR4RZJ8NX10KBZH96P10PV2JB9X38WSQX75P
'SP11WJGD97M62JW93KTF73WTMJQA88AGZ12QE1XQ4
'SP167DH2FSHMVS3AXXJ50T48Y1VKDPYNTZGEXC6FW
'SP2J8Z373ZY2JN5YRMPCEBMGDC8FQXH23796FKB0B
'SP3VR3GZ37ACP52FXQ10396BZS627QYYN94QGXV59
'SPJD4S4XV0A2TPMR0JBSD783Y8ENCP0DBAPKJ10Z
'SP1KYRWD2SCFKTKNFDS6WHVJVF12DDCBBFTCSTC3B
'SP2SR1D5A6YEZFNVE2HJFKM514ZNEHMVWH2RNW35N
'SPEYVE70WT2R42HYC5HY1Z9TBCVDX0H33FZXE1M8
'SPWCDMR6A0V6RFBF0G4TBR1EV33NEGKCVQYK3A87
'SP21RVW2J0RFKT8XB7D6S87WGTEHKME5YJDTV2MQ4
'SP12WY70K9XCJBHET62NS5ECJMKTF69MAE5GDQBC8
'SPC1J2JDFVJHQ7XX7AAQM5W7BFBHZP5AGT1ANM94
'SP3BE0CWFPDAZNXHR63J8CST7ZAS3PS77JQFEZBSX
'SPJF7KNVD5MTEZ3EYYE9E8CQT8Y0GBSDA3YGBCZX
'SP180BMQ04G5NHKMTC2GENHEMJMFK4KQ5KENHZ53
'SP1BPFCTCNBEV1G9HS4TX1KER2K4KN1DM9J54FAAS
'SP208N8AXXSJ2FS53YJFA8ASN7EYQ91V0AW9163RG
'SP24PXN9VWN189KZYJ04FN7QMW3Q5N9WH9ASYVP7K
'SP2XJF3HZ6G1B2YVZ5D81CV70C77FPXJVATMY6TN0
'SP3JF4TMVBAQX12SCYYRFSEFX9YYGYPFEYXP06TTY
'SP19K6GRESRAXR4Q0ZBECQESB6K0NKBCBRBS2WSYR
'SP1S1GHS6PBTCQN4VDMASZFE9GT2K2DP7QZ39D25F
'SP39FT9QJK09WM2CDDRASQRDM5ZVWD9A7DVGG8T90
'SP25456C9QAM2CB8W0E7SW39XPD8SAT9HCPHRGPG2
'SP2M2APJXTAC12K8MD83E807T4CFDCZ7EEDV9NR4K
'SPDX6RMBC9MTMAXCP8C68N58142EYC3J0ENMTEND
'SP1ES0J06MWHJ0VS0MH1XWJR3V3Z64A1HWF0BQ6MA
'SP39QJ8KKKA6D805RJQ15H5RH7SDZ4BPDCBW72C6G
'SP28MM2EHD0GSA2N37SHV12W9F7XJC8JM3BE9CWA4
'SP1MVRXED26PVN88DSFPNBVTQMVSMCGQ21HZPC7BG
'SP15YJ3NVAYWPVZRQQRPMHRV1148G5ZFVXHM45CEG
'SP2V9YWEMB3F66N931V8RR7MS48KEMES2BC6A107C
'SP3N3W86G5RGMFPW8ZE6SJJ18NYY92R54D1YT01X5
'SP288VBS70SMWSGMTEZCWW9JFF4FB4AAVG56GG1HQ
'SP14WZEHZSP2JH861GT0CQ56YJR8JGTAA5RHYX2FX
'SPGWH64EVENGEPQ3F71HAS8CEDVCFJF9T27PEKK1
'SP3S3MR1FSSB0A64PAF7ETT64PJQXVHF223RAKGYS
'SP1087208W7B3ETPQ8CHP24K0PGNW7GC822SKEFHK
'SP25JQDX6XQ62FP7ACFZCQKQ7T0FRWEJZ603TRHST
'SP1F6ASM2MYVVKGHK0ENMNJAW4HM3WP7956XMCP4R
'SPZRMGT60E6CKK3VXDQ73S3FS1DRFC4XBMAV94SB
'SPRB37RXJ69HNA1YP1FAVYQEZ7R69BA8NJ9Q3KNY
'SP371PYZ83YNB7ZZN6EXSG2X46HWRXAY3PG6XFY5T
'SP2Y1B27ZQRYN2SNKVB30SGNW1SH0Z5VKN6M546W9
'SP3PRKGPKEYSD2K5F1FBQXTQATPVF80D6VVJRSZEE
'SPHDKSCFC2KHRQZDKXXZCJX4SR68D39GE2RM6HDE
'SP3WE7SN2VZY3T6XF9BRYZ710NMFT01NXHR6XWAC5
'SP1Q27V6M4Z6TX2ATKRXV49ZBSAC3THFQE7T6VF07
'SP2S4BJGWGBYAW7SJPKJ0TSTJZ8QXF5B6FEV1QKQ
'SP1E1TMGDZW0GCZHERMD9WYDF976GZEZMDYS0RJ9S
'SP1CW6S7ZTRW461R937D57Z6JZ0C0VT148AYWBS2G
'SPPPE2KF7Z93JHS49FNGWSBQ5MK5MC0YB7TK87Z6
'SP3XRPJ492YBM3EWA1ASCC6R7BR37Q7VVJG8CTZCY
'SP2ABPVX9PRJ3HWZPCWPMRCEBZKZM81PSZG4WN7GH
'SP1VAKZQ2934G25VMRQEFE1065XEARPT3C2KXCWMW
'SPMAH7DZHNMF90WP2MT3M2Q7PWCG8P9QNEKMCMX4
'SP3CDAQM3XB1EFY9QYK5VN7JERPN3ZF1Y4GXV3EN6
'SPJESAKNTA504M1DHG1PH90BAWHEDTGKF2MFBZQ7
'SP1FAZ68D36RFMC3FZJKG6AEH61PDCWVPW8X0HHK4
'SP42H2EKD3Z4GHFWZB6Q4BYSN5XYE10DMK0K2P26
'SP3VF7YG6PXV18WVWQZR3P64AP47XTB3M97BBKFR2
'SP2RHSHTNXXYY3B3KGJ61JGV4AB5PSHDG0GXY7DBM
'SP1Y5AP7J7R7HNFENMM5EPJ9MN6ACS7917TASRXVP
'SP1FM4M8FJCPBGJFC16PZ850NF95VKF83QYK8JB0K
'SP13HSVY2FM6DWVEH7831H75823J768GD094SZDDE
'SP349RWQBV7TA9X43THKCWKPND3A4BWJJ5BK7VB29
'SP3VWXQTBTAX61CK092Z1B4TRWSD7K9K5CV2AAEG5
'SPFNKH3FMC9XEJKKFPH5WJT64BBY5J4SGN6532V5
'SP122XJCSCN50JHHK0HJ5QN01SM6FV8ZCFABPA0EG
'SP1G5TMNE3NR3Y8ENTHZ5M5M9STC20PA839FV6EKM
'SP2DSN51SJBF99KA6PPY635WJ9AXNP7DZNEBQAMA8
'SP2RNA50RHS4YGY526EPG3C3MKW2GT6D3ETMVM6KS
'SP2VXR7BB029X40NCPSR5TV0HBXBAN8GECDBSVD25
'SP3B6QPCYE9DQRHF34NZ8PVRAWJJPEB9P2QA6SV91
'SP1HAC768M5FJP0YXB4MPBD0SSNQ35H2VQWCQ4BPZ
'SP3FYDXAW5B9P9S2H6E3KDA4VM8YMZVYCQA569KVT
'SPRFF4XQZCVZVHTMS5VFJXPHVFARMYGB3G6XJBDG
'SP1VGQKPQGSPSPK1GGADB1YBE925DPTPPK2DTKCCW
'SP2ZS8SC6J7YYWMBRV9BKR4JMD0HVQATD6YTD8Y8J
'SP2W99PGHBHRKMBFV0RGEDRM1Q61ZFASE0G44AJCM
'SP6E3760GSF5M3SNJ1NJ4C08VBHRGGQ6KNRECXSA
'SPGJYMP93MQCXD9F41FZFJ4M4DADHKRYPA725YMY
'SP33N6EENC2099W6RET3NV9ARJNEX0EG1NCJ097FC
'SP1MHFYZBHPEEBQ8F4WBCHX7554H1ZQBNS1SZM7M9
'SP3QBP02N24425Z3M0NK38Q9MM9KJCQR4NYYMXDAX
'SP3ZW442AHT23SWB1NZ6QMKS17BQYWCTZS7371864
'SPBGEFP1DD2ACE4PJPS0X3KJF62NS1W3KAQ095E9
'SP21CWAKK83TM9A6A88PV1PX9N5XQ22D0WWP3R20D
'SP26XB6WDJBWZWMD6A0C6G4CSMP9SVDJBM4A310T4
'SP2G2TGA0WQ80KC7E9QA6BBRHMWM9KPFY2YSMA9ZF
'SP2XWWRJCQG8T2TD7G824T2C4W9CK6RK6KN0NESYT
'SP2ZR1B2BGRK2D5JPY6AQQY3HHXCTTWC2BJH277VN
'SP34HST7MCXY3BRFA63P5M6TJ6WHWQMPSH8JRHGC0
'SP3D8JVNDK0GSWN66JTWHRQKKS79YZM6VGRM0Q4JA
'SP3FRQ15P30SH11FJ4CQ44BCAJBXPYMHJCF7CS8QZ
'SP3WM5YZW7MQ1P7Z6YEYGS930KC4G9NHXMXEY2975
'SP3XXV2QC1BPD5CTHJMENR2P7MB43MTEPNBHQMS0D
'SPH7614P9N8NKRXHRZD3CNR088911DBSZZVWM6F8
'SP1H0JW8G9J6RNY7PR3CBHY1K77TV1GNVR7K2YM2C
'SP33KSKH3AKM8RDEN68HKSHT2Z365ZMM3AXQ5A08G
'SP36H9N9WGPGFWBGAEDE26A5XC10BACJNCB8NZ8JG
'SP321EXKGT4CMZR9JPCTVNDPBS1VD9NYT9QX8QDFB
'SP1VMP70DZVXZZ3FE9FR31Z4DD2QR3CENZZ09VE2R
'SPWANR3Y7TGYM19MKSGE021KYMHCF0QA1S52B950
'SP5HSGF5AXFFRVD7CG17MD29VFCNZDY5E7XN9AZ1
'SPK87SRVR619H86DBC2V9RHHXRY6RJ9AD4QDZK63
'SP1E530A9WSDDKWGTV37BQXGX5PRJPQ951EYGK2HA
'SPS12XKSSR5DVDRB4NV02S57G1ZSM7F6V3Q5SXF
'SP4E1VHEBH293T2QB1F6VG1DJRX7NFD1WMBVXJK9
'SP2CBXBYS5JE6C38D6DMNB8N52HVEYQHMH9J9X8DG
'SPRDEGFKPADF5AE7H2NNY53YYKKBJA4WF57NR44X
'SP12JZ1JK33KYBXSMRJ58WXDYFBGQMHDKZ7JWCH6Y
'SP13G0EB9S7S967CPMW8ZGK95MPPAH0NZYKQ8B9MM
'SP15GNMM5KT5NAEKSDHGB4XJYTRK4DW9H1FR36XGE
'SP18X6SGB4BDHKTTVM1GAWTX1E8H2PHY0JS9SQMQG
'SP1AAD3Y2899RYBHTB9B2H23MRZWJPY8CJ99X79JP
'SP1E3H806E6XJJCR0MXTHVT6PSTXRDT88WTZB8YE3
'SP1EX7X6F3HNKAVH3RBT8CK0S6QJJ828ZAA62TQ9
'SP1MAW2N4YFQEBTYEJ5997J8XAAYJVHKPH5XE6VR5
'SP1PWGQ2H9P6J0JAFMM4GTTXGQRF0DX9638SYTCM5
'SP1Q8ERJDYMXNVBQPKM525G5H4Z9B67BXM9N45QFK
'SP1V7SGYY204WJC2Z1Z9ZMTS6RJQC1E4DT29EK58E
'SP23GCGJ3HBR2YDE1C0JVYWHG9AQQJ8HD5WY5DKEZ
'SP25FENT5HAPYH9J4NM54HWF7J9TPRD1A35Y2WY0C
'SP25KA1RNTEA1YDWWPTMZH2DRYC0SHRR7Z9ZA29QT
'SP264TZNNRBHGVQGBJCN15BNGTJ1B0TMAXZ671Z7V
'SP2CMFASSEGW91SY590E30YGMMBK8CN34GKHK33S5
'SP2NT72Q30V7R4Y4E13G76FFF9R7FXZCCQV73WNYD
'SP2S553RCEC8W3YCT9SKTWXT4XHW8TF2A5ACAF0Z0
'SP32RW3MTSXT35777C31HKMJ3QV083CQNQQYBJXGA
'SP35NFC541V3GBCN3QSRPVQX8GD6GJT2EBY8BX8EB
'SP35RAH094C8QSZKK6DSBDRSCGAHRQZ8TJX41RJWS
'SP3A94YPV4H3V3TCG8XJ8M760TSZN4Q1PJRZ35981
'SP3CST77R92DCJGM5A4AX54DNPWD1YZ3P2HVBVMG6
'SP3DD84BVREMAETAC6S4PP34P5QK1XSX379119B94
'SP3P8M5J25457Q73MKS8EGD5Z19Z57RKYSPNEAK85
'SP3PCASWH8HEZNCDM318SPEG1Q8TYWQ3NS73ABT8Y
'SP3PQ8FGTKHNYM6EG15ND7XDB1R8B64ZWY6SXWXEN
'SP3T294DE7665ZBB44B44KDJ0QHRVV4A0VGKGGQQQ
'SP3Y91DTK6ZK2C6JK0YV5CPG43T0FX0TGNTPMY8YP
'SP3ZD4S7VW98KFYSE3W5HJZSFJF01R67AW1KJ0SHN
'SP421EMPE97JPDN2AD1YTEJQKDV6QARZQA8SS64Q
'SP9VFBJ19K5FFA7CESDY5185BNAWFF7PGQS0JQFC
'SPHWA5ZSB4WXC5F2TZB336X22YN5K70FXAEX3YFT
'SPQMJAFX16YTWZ49GR0NHQZAPQBMN8Z1C63X3CXJ
'SPT9Y2DS8GR9D0XVV28Q0PWTKR396HB7VQJFQV81
'SPTBEE4R2BP752FMHBC60B72FRBXS2YEK6N6GEF0
'SPTBZJWQFCZRR5T42ZX4RG3AZERDVSM2CXYGJ12Y
'SPXWG0FVZMNQQSCBBZAD37438Q7EXHDCVZMJXZ9T
'SPY9ZYYQXW0PTA4F8WKX2A5KCP7B0V83Y8GA7KWS
'SP24A5YE865PYXVPHVSRJW5SAEGACGJ3B04C18HZQ
'SP30BRCTPFKSWX6X1C4WM5X9RKSN4R7135EG3R746
'SP2KPCWT1R763S1TYZ95C7XFGCV5X039BY2FD4KPE
'SP302MDF2HSG83XSWT2Y7WBB682PD3NYHG2DEYKQN
'SP2FR8V5KX0H83KQSF1TWPQFCWPESNBMG4CCKCDG8
'SP3MQE3APBZX38D69YZMN9KMYQ14F6J75JAFFKZ26
))
(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))
)
)