;; 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
'SP3Y70V4973798AW0ATMHZK0Y83SSF8MP9ZYP2F2C
'SP2X33B380FPG6KJR8RAVNQ2HD4DCJX177PEY8HK7
'SP2JE9C99RTTN3PD6HDANQ7C3HA9DES7FER94GFV4
'SP13VZQ6NZMQ1TG80NNGFFZN804C7Y52DJ9DCCPXX
'SP2YGDPCXACP7S8HXH0HH4VYJD4GFNKYFYEB0E5WY
'SPMKGW2WW33NJTD57YSVB7JES847A5VGNJNV0GR2
'SP3XGBJYF6E5T6H86JPDMJM83NVD8A2RRA6K0W5MN
'SP3GYZXTVQ058BJV09BYK6YVCYTB57NY4BPHTB3FN
'SP161H25JERHHN8PJZBGZBEDTT8P0CBV83RNG9RJF
'SP3BY6P06V7V0ZD41V7NXY6M6AZ4KA4CEV60458TB
'SP2VNDWBNPE5B4C4XZBRKVQM0GK45ASZDZKWFQES6
'SP1MSYSDENTAA1G33XB03DE6RA3HG7NKF38R3G5Y9
'SP36SSW49FE2ZS9ME57W8AZD9BBWBWD8736NTN6WY
'SP3C9J3MXC4GKSZ7C275T3QTT20DDS9PG64CREWRK
'SPJT77EJH44M9FR660QHZTKTA5HP5RQN5GSYN579
'SPRH2VASD4YR3JE7Q3V2C9RA13W6MVBQF833FBXR
'SP35QKNPC4YXKBS2MQ2MNTWVV3MV8JPBGZWKZKT2M
'SP9E24RV6D89A7SB52D0P8SFGHDKZCYQBKR0STWX
'SP2ATVBXDAK09J47HM7NDVG22APQFMQFJJM2EJY8G
'SP3Y5NTY323BYPWQM7X4HQ8NCYFKQKHVHR35HQB17
'SP20WWSMY3WB8S4Q77QAW7Q63HQAV4WG7BP7FRAWG
'SP2SDMV488HDY5B29J6XVGG7SH9MQPRSV66WTM3M1
'SP355676T5QBZ4HPWRW7B3G9P989DZ6DA1YY8VMD
'SPZQCSSKEA3CPPBHHEKC5YBNXQPCJ0RN36EPH40T
'SP2HDYS07Q5P297DH9P0BAN7HNRFHK2G5RXWNGW9W
'SP26719B4034HGEH5BYKNVXXXDV9AT6J068JDFM2G
'SPAP45V7W2HEY59D9QP6WZJ91RZRA4X64SK34R0G
'SP23HPNEMH64THDRY5PNKCTA481CBB8R25CFCRZ6N
'SP2ZMTJ9GKXYK3N0R1ZWREJ29RY2PS15HGKBNS035
'SP37QRBKPGF45NAAEP00CZANC69WK6VXZD4PC4WFB
'SP3BF9Q1Q0BKFMJKJ4R85TNDCWJEE21X9N4XPVXQ7
'SP3HSEGZNN2CV6GZ7ZRFJP93BVN9CJTXST62SSPDT
'SP3KWTY6K9S2257A2FF3QM10WAPNVHX3EYWR0GHW5
'SP3QGW69T7Q2BBB6RCCXGN6MCJCH10N0958W3GZ9Z
'SPHR6AQM483RCN6RQZA82B21FWA2SDXXHBA9K99S
'SP3726YNNK7CGEQZZ83H0V43JMFXCR3T05KKKE0DJ
'SP23HKT4KG9HT0XF8B2F7DPASSGRCB1638NNBKFB4
'SP2R29BCJZQYRNP11DDWB71V2G712927EM31ZBGR9
'SP325NA981ADK84J0CENK5YFVNS8YDHFYMBC87NYB
'SPEZZHE2H0ZV31A82NDNETNRJ5RD10GDXJ4BME4Z
'SP2G25PAH31RXFPWNBZ89RANB6EFPEEXE87G65WG4
'SP2EX6YKM52T7GMCTJ8E2CTGMPVB4YBTJE5R0QZY5
'SP2QSS0AXTX9557SZP5XZY5CQGD85FJP0DVWHHCGX
'SPQ4MQSTA0T385VK461QPFTMAH5TWP9SVR7TBY6Q
'SP15PZ5488PK09Z1AEMCJZKGC9SFEDFBVMH5WK3VF
'SP3X1GS53ACYFGAR6WWR6RW6R5NVR168GVBAWJWFQ
'SPK9F46KNSY1P8DXH8XQ8J63RBTGZMTXHKVQYQH
'SP319BKQSXHAYK20CHBM0S52FRMVNJC3FARRRWA8X
'SPVAG9S48RWADXDBY2FTRDA88K1XEMER4BYN3976
'SP3B6H5M2WC9K0A8B3KVSBMD5Z36P35JXG0EFWXMJ
'SP354C6ZDHAXNN663E92A1P8AFYBYM424E26G6VMV
'SP2ADDKGS4K2883WT6Y5YVBV6G3RZMX8EZ4F4FG0D
'SPH7P7209RYS3JTH0WA6JAYKME4HEJFNF0C9EEP6
'SP3JDJMDBAXK1PMP4TJXZJ8HVYK09393QG2WKN8QV
'SP23FXJ9G1D5GYWBARAW269N5WGF75EBECFXFHZ7D
'SPE9PMY85TREWR33YYN44DX8BJ2CX5ZKF7NDHMM5
'SP3CSYSRFYMRHB4VWTVMM3XSPN8FFY477TP9KNWYG
'SP190VXRZCP3KBTVE5E84GPBY7P9WKY9D5Z4QTA79
'SP1TENJ49VSJF37Y7P5AB2F2K59P9ZT7K2413TRDX
'SP3MQ329CEJN7RRE6YQPKD6C2EPWQP2WAZN82BWVQ
'SP1DM96RB6KH3NE313J855D2CNYZP5JX7721NZGYM
'SP227BY55EFJZY8GYPMCDGE52XY7GHF3QKXW8BHW6
'SPXMY0TM47QG370ZV9JX3YZE2E7QY6YG64FBN5E6
'SPWY0ETYESNCH73RMVRGS2PQWT6SRGCA5CTEB4FG
'SP2XTM4GKJY6ZJ9THKTYQ7S4TSBJW94G7K5VF7EZY
'SPBT9ZDYNFKT2CXE5F1RH2HQ2G8W4WDKV2TVS9QT
'SP1HNZG65014BHEN9THBXSKF50S7BAS8FKQ2DSRR1
'SP399KPJ9E716QTZDV0KZZ54QH4T4K8YS0XYKHX0X
'SP13GAAZ2Y7ZNED8Q2QXX2P7SC5SBP9TSVD54D0XS
'SPWWH41560KM7K0EYHTGR2E0NQS8W5HZKY742AW4
'SP2VX5GYQ7ANE8MVG3BH0FHFC8TMQ10FZ9ZXHG08D
'SP3Z0HS8EQYY9PX712Z0P8B72HBZQN4BZPMW5PQMA
'SP1D49J1N5ZRR1HHKY0TZ7GPAYWTHTMS9HKDBESQ7
'SP3AXX7BR1ANJS20CYG4WEAM7H92EGG1WDMVSBAE3
'SP39RZJH285SP7F08C731RGHCQHA34HK7XA9GZ1P9
'SP1RMY7PZHXEMCZA6TTWTH51SZYSK615EMBKJ3WYP
'SP268DB38W9Y8HZ9912FPEVWHH3AGFRRQJ283F795
'SP1GEA5S8PTXJMX6TTG7FK68V72QSE4GYSRXQ6JYK
'SP1QP44B4X7TPPZF1ZYPYC48K3Z177P61VDP16G25
'SP1JVBPR8RDTK0CBEG66WQW3416897B495DTKM2X5
'SP278CES9RW41SD99HKF2XN206ZGFZWGQSQ9W4QNB
'SP2S01A56RX3Y4PDCKH4PVHHV74E7AANXK9WN054
'SP3H20GSDCV0WQZRNREEFC41MM9TF3AFWW85YFNY
'SP22FF8JN9GF76X4CHE7933YC5VZSYG618G51J6KD
'SPERRR7NT5KA3QQPGDR5RZZMJKPZRMRBGS445H4A
'SPA57SYJPAKJ6SW7VZC9A26PVPNF8DXTXT3W876K
'SP3QEVB486VZFMEB89QBYA8B3S1AR188GFMAAF11E
'SP2MJW0HZ55K3GK52BX0BBXTE1WX2C6M8WTADR1Q7
'SPQCN41Y3PGEX3NY3TKDJN45E41FANQA6CZ6QKSF
'SP1CYHZBKYVTGPE1981TPVN6CFA3YHXVMG85WSPQ8
'SPQXRCF4VYV75BNBXN4HGWM8PPE85H8P5V0SMHTB
'SPGS9PXS0TY2XN182EAK8MWM3GF8C8VMFCFCX5JX
'SP255R4NT3VXHGHHQP4A6YZK0RKA20ZXRRHDFYG1X
'SPDAV1G8FQ0TMEWKVE0A9WS8RNDJ7K808X2MY22E
'SP16BTK99YZZJYPCE1HM2ETPXDCZJB208JR5W5JB0
'SPPG4GPZPGPYD47EV579NY2GY8714YQMMVFYXY3Q
'SP1A6AZP4GAT496C08Y38C4BXTYZ8ZNCWJFN40F5C
'SP1S5J0QTP6PHFEVFM670TSG5TPV8A870QP8SEMW2
'SP2N9WNFV10156T3QH9G3VY10NF2W4YNZH1MJQ81B
'SP374R5R2C97XNGZ2JDJV5S86THA7MBWNZ0140KCV
'SP2X8B3QS2BX44V9FJHE993QT8F9VKDM31FG5E149
'SP3A6F00TYWMQK2KMGMDKACEG36DH0B65HE1ZJTBR
'SP260EX0HX1BYP8HSXCH5X4Y3M8BAR7G80NHG3PAS
'SP2TH0ZEF2AKBVH93A4ST0GNWKFTXDQ34YSR1CA42
'SP1YG6NJ1E57WKRB2Q79PPBJ3RZ4AJ2RNDEAZZDPQ
'SP2094VCDH8K1RVXHAGTWFD0ZWBB74XMNWTEMGRSX
'SP2HMV4GW0PD7VC4H3VG6KZ3QRZ6R2H4GHVYRQZEB
'SP2T0S36V1D9XREPC2GSA7HGK4FAW947JAFGPABF8
'SPA856JBKXRPKC7TQPAPVF670JGKQJ1HEGA75QXE
'SP30H99MRNTYMRCG4JS33BT4Q6RGWY0XTMPK2667T
'SP2A2WVTGGPV5TW12MRSGVWAEC1A4SYJ5F99PY894
'SP38V6B52W8WZK8NC5MX8Y98Y0RKAJ9G7ZEQGZTP4
'SP285MNS6SQSD7BD48CN0PEYEAVE3KF557BXRMTEV
'SP3MGBBS7W5M5SHG7HF9GTM3ADAD9CT9N9B76HXX
'SP2F0AHP4Y35AF74YK0VZN5AEZCXQK4REKBC0D8M6
'SP3M4G007FQC3HMC4QZ4C7J85QDBQJWFQ5HWZSG6
'SP1SWFS8AR0DYJXZ4P3XW3RMNGVM3E0HNBSHBGPY2
'SP3JQXNYN38RD9K2TAXAH8Q7ZX496KBX8HHQ7DE7Y
'SP14R2WK5AGZNB0SDBXAZ3Z5RWXVEWA6JK0XWENDV
'SP19TDPRPAF1TRB7FKE9KTQ2TVDCF1TGEP46QS1FA
'SP17CN6DPQZ5QFNTK6HJ086XH1G7SG5C4RZJR7E2Z
'SP2AEWBVNFSNWE0DF3KED4RECT2F597E793MZNGWN
'SP2ACJ96JM06E5M7TW325KQYA6VA7E0M4YDGTKNFF
'SP1042T29TNRAGFR22PX0G5CKEQC2N48S8QW7CV8H
'SP1MR6KPMJKVNEPQ3YCFYY2XC12A14JQ5A7TRDY7F
'SP218JGTTVTX1JFJKSDVQSKKQ8C9YG44WG31V9FPR
'SP2BGVJNK82Q3YA15N5XPY4QJ6X1X9DE0R2W3XHAT
'SP39NEC9RD8XXKQFFKRJ5K9JYXS4SCWKF4DD3TJTF
'SP2MGZ8M0XK3E8WZV2CZ3SY2DZEG8BAZXAX07M7MS
'SP3HK5H5FJ7H1E35Q2GQFXYGF6F4FEBTZMTZ9QT25
'SP17E0MR87HGBEXG11EXVVVSKBENW60YRKJ7XCJ5W
'SP68RJR7B16V4S9C69PFYBSQG2G98SVD0R754484
'SPQZT5XPD3922JQANNSD3MESSA8RX7JZQD7NY7SE
'SPF6MTM05TAE19T1AK9ZW6B42RNB0F8MZ2SD7NBX
'SP3H5XZ0042QKX5K5GQ7D481JN9348AFQ45FWCMSE
'SPBP940S5A8TF7HRGQWCN2W51WCAZNG0DHKS44RJ
'SP17WCRVRXZ2WKQ4FVKJVFTSDYT9VRWC5GPSWZ7KE
'SPTGWBWH733WFPR5JTJZXQZWHGTGVFR1BCVEAY0T
'SP3KEG8TZPBTVREA01VHNPX9D041H1J7H84S2363W
'SP28DPJ06NQ0HDS000D9482FP0DHKHY3FRTAYD2QV
'SPQMJEWMB5ZZKNFNWDCN3P73KANTPDQAH9VDQFSQ
'SP3K0EE25S57TK269WJDYX9ZBEY763RFBX47TA69W
'SP1KVXS1YZGQJFZXGX8WYQ39RBJ6PJVDVCYCK2E4Q
'SPR8XYYQG9AH0H12NYPVFT39R3TSW8XB3YZWXM22
'SP6218MV0PTMQ6QNYP2XRNC28Y9TWW3MZNN0H3PB
'SP3S2YEYR5NCJ046731ZWV47Y6NRVQW8K2C880HEH
'SP2Q8R1X37CMM6Q0VQEWRZD5JAK4BXGWWMH8NVJXA
'SP1H936G1HRRB0MG0YSKCCH0JPZ82WX6YQJJRF0GD
'SP1QAX7PNQYFDJVZZNJRE7T3G97PGHNDZSYYMRSVY
'SP14V3DTYAQ5JGW8RKECRW89D2NWTTVAXW71GXMT5
'SP2NJS89HWM7E1W4P3MWEMJQEA0WHBA2WNM01H7X
'SP3Q3C828KKHNKS91N8MQBSDC01GSBAWA4NP11ETZ
'SP120TSSBSXH9BFJ5MT2XMY5SC4Z5TAGYP4DBZ0V9
'SP1YKBW6TNNRYS1AV1YZCB62Y6PA6559S6CJNY6BV
'SP30PM4PN471MJ82ATWP4J2SMMVJWS7MB2PBFBGZZ
'SPA9YXC0MV0C8ESVZ76R8RSAE9SDM7XB1MFPE06P
'SP1TE64M6BC45YKJHAVEX63VRT6DCNMA3DVEEP1WS
'SP2VHDJG4HPW0B9T2RGZNRYPXK2K2BE5AECWNYWV3
'SP3CPVVMJ3VSECMWY2N7E28QE9YKS2TZ1516WQBBW
'SP1HZMDZZXHWWSDWS4K3PB6CA7NPFGT9JGSFVKS3R
'SPGKQHCR71YGFW0VN46EKNGREY3QSHYAV9XYKBFX
'SP3QB90S58982H2ZQX5EXTEKKBJSPCTSVXKHDN644
'SP3NB427CQAMSSZ1GK9ZEJZBN6DNR6RR90QBPBX9D
'SPD0DN2RPMB6NG0SS6G56D0F9QKAVJ9M425TMZA6
'SP21KNG841RDWZR2YVK4VFETKPF9MN125MEJEMSWX
'SP1AC22YKE1GEMPXBW4DWXTN5SDT32Q772J55E64G
'SP16ZCSYG2YG4V2YT3MR1MQ0YZ09PFWJCH5HZC8PR
'SP8YQQPW6JP951HS8MWRKPZCH8Q0EEG502MFXQT5
'SP14APGCR3TM943S1MSDNAYMKKY5VPDWFBY2PPR7G
'SP1K5EHS2D1AGNR43236HR5KY7AT2WS8SNC5375YJ
'SP2JFVKD15SBMWG6D3B9BBG1TVZZ9D1YXC447275B
'SPHRRMX33PVK5VQC9MP1JMKYQ8F6816PH1S5YYYK
'SP106NTZX1XW5KS81SJX15CMS8F51HP86SPQA44C7
'SP3DX0AG3HJNFNTKZ4A64W1A579ETY1N2JN7WHTC1
'SP1RN4NRGR4X3TJV37MPTNF63X5C7Q55PJHZYCV3S
'SP3DNEH7A3RGVGNHQQAWWW9ZP6F0V4Y8S9GTV1Y3D
'SP1Q4DD1WVPTDHXQAHR88GRZRKVEZMKT8J75Y6XH9
'SP7A5ZPF1ARQDYF85DD4GFMVFSY3XB62CNES5FP8
'SP3YJ89Z3BXXE2PA8VZKBVQ5J72186T88F12Z1FV7
'SP3CXJ7KKBY5Y53VM6STTSSVFT1PGGDQ4HN3RN42H
'SP1PGS9396MJEMT6QXZ6WSX2DXXG9K8KCY05W1DZB
'SP25F4BNBXPD3AZQJT1QDCBEATDFXA466HYTBXEG4
'SP3EZ0SGNA9GZNHVKZ0H9AHEBPZDRWBXPT6P1RP8N
'SPBG9PRNWV0YS1XWJNQH2ZVE9HDA5VC748B082VR
'SP11V2Y543KRWF5Z48HVC0EQVJQD5JDVEE70EWRKZ
'SP33R2S2WPFCHHGZRHPZRFC79R6KS9ZGFH11BWXFE
'SP1TZ67QXPWK8QA45C3XT0TCZ15106H9RF20A01AE
'SP31XE07MFJ0R8XQAGBQFSX8YNGXQECPW4YETYN56
'SP189VA89FT4FV88GH67M0AND58CG9Y2VN10BCMTZ
'SP27X55JBTK4W98EZSBX0WARXCERCMBR58KCP1V6B
'SP3CB0E7PF42D64V8WDJJ4GEGH6P4JG0VYNMS3V3J
'SP1QA1QPK93XB83ZYXKR729ZX2Y9R4S80J8HV1WD6
'SP35Q7WVS46YD7GNX0JZPQ0MCV870R5VWR49ANVKT
'SP3S1E5JH286HFJK10GQF87PAMFBVXW55HV0MYWN0
'SP1SN64CTRFMF5EGDCRJVTYD2875GPVR8E91AE54Q
'SP2GP2Z1D87HKZ17K8F96NMQMYR62DHYK6H5Z398K
'SPJ5TEK69AASTB4323EZP2NWS3THK835W9RETM27
'SP21PTW33GW7K884735R4SH96RPPWRE7VXHRFVQVE
'SP3VYTX8W5RB0W833QG9FKH7CWXM1136B2NZHTC7J
'SPKZVBR23PK6HTTJGFD8EYC3VMCD47T7GYCJ9Z9T
))
(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))
)
)