;; 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
'SPNY4R8VFSKQ32GMJ43AF37CZJS8HPDWZ1TG2HBQ
'SP37FQ0FG7XRZK7MD8YHPZ21QCB4NPXH1X5GYSC69
'SP1BKCYPZR74V7WGREYGTN6HX40W66NZ51SJ39XWG
'SP2NAQ3MDASD9EANBHAZQ83XEFBF2GH8XAQZCANJV
'SP2PXD7AH66QHXBA1TTAHH0BG5VZWKJDK27EVJYRF
'SP39QDMXZPH5FBQN39X1ZGK9Y720HNX76SB8MMSJJ
'SP3V9FWMASAC7552X2RTHG9DQYEPHMM4WSBJM2Y6B
'SPBJHGA0JY21HRV1WQCP3ZFNA15PK8ZGEMG67XP3
'SPF236HH35ZAMTS7CV08V75G3DT9B2V8S4H4AQVA
'SP2WTTMSZPAZQT0WPF4754Y2SXE5W9VDA4QHZ11WT
'SPGNRR2GG22EKH62N8DCW58YB4D1PVK8TP0KQTHD
'SP1G9SDMDGDAYJA3QGX90B1XMRZ8HGRFJNMAMT075
'SPK3P8E11MGWEN3HNY2T5W7MKNMDDF21WWHZ6FRB
'SP25MCX61AWW163QBTW2NC7TS6WE3JKM4967MDZ2F
'SP1MQN174AA7YNKFNAE7J26TPE100F99KF1VGMG6P
'SPG0NKRKQGSMRBMS7FZHMCBWJGDFZF5QNYDT0JS1
'SP2TRDF0MSFET67D45JZS101FFN1PCR9RS823HS69
'SPTGCTP78C8155MKSF0X7P4C6P9YFWY1W2S5B393
'SPD5R8ZB3B0VCRDW21STNPG035P99DZDFY17DAJ8
'SP2E2DB7ZRW9TQ1AEMC94NY23PW0T99X7ANB0KY2Y
'SPSF51MNG91H47S50V5PHG5G22YJ7A2ZTNR5GYJQ
'SP33ZFWT4H3BX56RYAHSFZTKK0YHZF7M8EZV20XCA
'SPV2AGGEQTKE8385J3736QQ73K775HJZHFR4S1CP
'SP31NTDV1482AW4FCYPRMEKFRVF1GTDAVWF4ZA3DN
'SP1B0B8BW0BRHEZ28G27XE2JHK540HCG44TR2MQMM
'SP34DFP7RRDN0BQKXFD2HG28JCE4G62S0G9JBT9XY
'SP1NRTACPNRPJSDRC85YC6MD4NVSKB4Y2TG1FXA2D
'SPK9W3NWP2WD6X2MZMB7EZNTSHTYEW4EV72P91W8
'SP27W8CCZTPM8MPHGDJGSPHVFKQMJWPBVYF7QFGB7
'SP10D4ZCFY7K94W0AHBQPD1MV662FAY7CRWM40VM3
'SP1588N5JYA1C8RVT7Y5WDH9R6NAKRNG16YBF7S8Y
'SP1ACH08CD1FGTR0P7X1E7JNK5HYMYJPZF48X1NAE
'SP1G2ZMNH1ZCW7BWTE61BFVKXSFVE6DXPQX31HNAA
'SP1P36H5CQV121SM6RRP839NDPSG5QA5JA098KJ4M
'SP1QEYVYS1XGQS2PNZBQ4K57KHNR44NW5519DJT9C
'SP1GENSBAR9F4VP51ZHJH44NN8EFJPCKQKAZJ0Z3P
'SP1YVPFJZ2GP901VQWY0WQQ8F6C2NDD878KH1EDCP
'SP21X1GTS9PWQM812AXPK4779CNRPDDS9XF1N3VBS
'SP24RW51MKAV6XRZ1JSMRYZTKDRE1FJZ5DNWCMXJ5
'SP2KST3SKBKWHA6T8JW71HVEXA313S40Q0WCJ2SQB
'SP2QKE471WK6AVZTGFD5291SN7JWP53MMJZHE79F3
'SP2YS9JYN20GWX975X328PNVX3BBYR8HE02X6D0X5
'SP2ZNESKVAN6P9WYNXY0TCNMPFSKCMP0XP82ZE3BW
'SP357ZQ9GX6TK8BNE2HNBSDD5WSHY2WYT82DNMGX8
'SP3FPPW034K562X59PGTF06FBFVW7FSP2WYVQ85A3
'SP3JB7V457QQEH3MQWPCQ5F9ZYDKEPP9A1H4XNJBD
'SP3MDTX09RWBX3BW5ME8V7HZ1PNPQTJ9DYQD8EH1V
'SP3MWH3AN1TH7JE1512W5QHJDNVK431W4PRZYXSF9
'SP3QM8M4ZMW2XDGFBP006B1ABPD8Y6YPZJ68P6S5K
'SPARK7R24Y65X53R9T9FHB8H412N2DFCYTMH688S
'SPEQB0BDR5Y2G58VGP1PMQG411KM92J176ZPT3QA
'SPM2HJVJK3Q65K06TWVQX8B9NKK58K9NNVZ1J74Z
'SPSNA5R5GG45RAWX343QF9NAS0MPZRG0WTY05NHT
'SPSYX3YF9EBMQ84PQERQ27E5EGNZTHHQCHKC6PYE
'SP31NBMQPWYJ4D57YF4P7C8WG6TH1EXYT3N462EER
'SP29JMJ8383HMCQC8A9GQG0W7K2GX4EZKZNGD0R27
'SP2DK4BZ3EP6DDKZKJCXHPBPG3D6CN8W9WP0WP0P8
'SP20Y1JTG6N997B16XYS4XMYJ2Z22QDFTVERNAB41
'SP1E5YWTPMBA0QYX8DX4ZZW36VTD6Z383VWBTY9C9
'SPG59C62EGA8YWJ1ZQ3YERQ2GJ69XR1BP64W6AHT
'SP2TYA3ZS71RZNGXGCXY9RRFAE0C8KXXGR142CN8V
'SP35GN8KN63CB87DGPF7T1C6P07RHNTFCC1T4TWCV
'SP1X9VRERK3A1MVGQ7SK0DDMX21SJC69AJHW0PGS1
'SP35HVQJBPC0EFDK5MK2GVQAQX0199DPQBP90Z0C9
'SP2AHDERSP49DBWWHV35688F8XAKG4SS5081RWB29
'SP2QTAN88V285ZK0GWQP34F8QJ98N4JP6X01S0N6E
'SP35DWTME0E08BB4674MZWT6ZNTPDJ5XZNT0JQAZ8
'SP110KRFNA32A8R36ADMQT7978CQD4DVEXV0MF0C0
'SP28J8T0Z8HXG2WBAYNKQ02C3FTX5RK7P79XWRGPV
'SP614AFNXAKK8355XEJZ8A7J7XM165YY68EG3PZF
'SP3T051GY4M4Y8D8KFA3V72T67D9T11HNW8DAQ0H1
'SP1H3KKQWYV9V7528EPSHF6ZE6VY8JZ6KH1BVZDCT
'SP3DZ99WPJTJH495FQ1GVA83MDB0T06WAVFVNEJ8Y
'SP2E3MKFV0ARX4SXDEEJ1RM4CG5X40E2RFFYB6554
'SP7QQ9DV0DMV7YW4HR713MKBWADVA0BFC2J65PJT
'SP36A56G05V2SZ9PJ81PNZRY4TXT50ZTFNA19DTE2
'SP2CG27QRVE6VJHD8G2W1V8DFHZGW324CZ5NZPXPS
'SP1HE4YY8R2KFGYB3AFMDCWHEMB64MK6E97ZPKAZW
'SP12M4TMW45871YCHN4DQNRK8BR5ZH930VSECVRBE
'SP3DWXK2SK6YFRDQYW2YRENR98PY0FEHH2RM7VNCW
'SPH2Y9QKHYRE36CXQ2F7AFETN02RX0BKVZMVEXJD
'SP3VGM3TJZTQC0BFAST022TY1AW47GNHWX5QX8QYF
'SP25GKTAKZE5WK3N81C2J3H8EZ4V7YGYMPR8SG9XQ
'SP29KQWM9WN6E4FA8165QNQ33GVNST4JP5T82MXJJ
'SP234B77ASFG4XZ7ZXH76Q9GQ15VVBZHXRWCNDTCW
'SP1TWSV9ASY41V2C9AYJFMVZP17PQYS363HYG3Q2
'SP5GXWVSQQ0489A82NZF0MGHZ90PRHAAAP1QEA4B
'SP16C1ZCPMHE63NHTJJ3Q9WSZ7Y0K8253P4VEVAHK
'SP3ESM7WKBDMBZ15PSNX1KWV414DH67G6PGMEBK8H
'SP8QQTJ94X45Z7WKS3F5T5A9CZ9DN0SNGPJ566G8
'SP2ZJ345FFK9G014SR6B0M35TDF0S0NCCRV2S6RV2
'SP34D1D5P3TAYDGMD1W78849ATDQHGHKARR5YCHE6
'SPAPJ8MX052QRES5P4WRFZRYZA9Z2QGVNT7KV4K5
'SP7TEJHEJW3A27F2BM6R23YJ9Y9R2RFGCZTR66DH
'SP16ADAKN3XK9AVJ1VZX5QMR5E3FSZ88S77V9J0CC
'SP1S7SQ9GCBZK232RMEJCMEKRXWRY480VM0Y55WMF
'SP34XEQQSFASGPGE3FBFVPXFWEVFYW9CQCV893GCZ
'SP27T4FF5ATTCN3HDY1QTD2PKNJSP1ACCCEGTW8S1
'SP2FND3FF6W7J2115GXVS4M71H5JR8469E4DJYRHK
'SP12D8N1E31J14YQHH5W00S40M91BYVQW0M52CDG9
'SPMCE93TRE1EJDMW5KZYNE50856J2R1SD7HAKM9X
'SP1J5MNMP1R8BMYMWFE0Q6RQCBDS38Z6T8MPQ4J00
'SPPDNWX6XTYF2VB2V622C9GABJZGSCDXZKBV8W2W
'SPP5DXFY1F6TE6A5BFPQ2BES1CNMMSV1QNT42ZNK
'SP2TMDFV859RBAWNB4K972D1G3R75J87JG1M967SR
'SP1NBN8AM3DKPZRYAAHJE6JCTGT9HB0GDCQ6RPC5H
'SP3YSS1RJJF8CA39NBGAZMWBEYRMRAFJ72RBSN1TM
'SP3FZQ57KJVJQ9RCMAWY1SA0T9HWXA9KSFC0DCKXP
'SPB65YMYCSYQW1H2EKMDNPD63Z732XGB059AQ4Y2
'SP2H4MAB0YMD2YT1FXMV4HNXDXD58Q7WHPBPSAMCH
'SP1GFK7WJCSGP3NGTW28J7N0897X83NA5VM2S78KT
'SP2ERXF9ZN6C6KGG4G8DFA25THG0GZRGV01YT1XPM
'SP36X458Q9W3MBDZD60VH9G7S5BBCTVKHET02CC1S
'SP3TATWNNNE9JY7NFVP0JEB809VJSJC6E9QTQETK4
'SP32GYNHH6XHQ7DNVV1CBQNF6KV8HZAWS6F2P74VP
'SPTBAXKRKT7EXTZ6QRZFG1145M0BZ0TTX3HJZTFW
'SP3071HRK8BDPEFMMZ2KPPH5X8D75QCMGHR33HY1J
'SP2NHT6DXQ1CEB74WZQ86A424DR8ZZNGESTX3WK6
'SP2M5M7YSZ80RDY498CHQY102NZN67N2YMKYMZBTA
'SP1JHH6K15HQB2ZEWH9V57DTY4WT46W454DYKMHFG
'SP34SYKT08GSP4ECNRWR7B3QWWS6WX7PN5YZHQ95F
'SP3H9RD0XA89J7QPR2YQKQQ6SY2V1BKQZPBK2293A
'SP11WB7FSYTQ9V04H54F4JR36616R4SNK8PH8RQ76
'SP38N9FSM7NZZHCWZ6JCAY0K5N8GWFZ1QEAENHRBH
'SP1XH2SXHCYX8QBMZX2K27B953XTAJYXVFFD1QD4X
'SP2QA4QVVY078K4C14FDZS9Q51BZV9HAVGETAAT05
'SP1QNR4PDXNPMRXHWADCTA4M1DY3K2NRHKBACBXA9
'SP234V8DYB5SVCYYHJDXJBS1JG9D3GQC996RZ9NZV
'SP1AQE6H9S85V6S9AXEQ2FAZ6EMC2M83YJM3DKJ47
'SP2A93WT3MRJC8DHKRYJE7AAKJES6QZF91VAQ1NZ7
'SP3W3PCWC1WT2CHHHQV03YJ0XCTRKBEZQJ2NHTYT3
'SP2JK90T1NTHS216EMK5Z9QETBNJT52TC4YEDXS5B
'SPX9YY03VPDQEGA9HSNA6NXJS70Y79KN2JSNXQVQ
'SP7EFV7NZYD22S027E32NZE7N0FYRJW8K2PX1Z40
'SP3DW2YR31HWKR70630ZPFM88F1Y5M490AX13QC19
'SP3NJ34KE66TG9RK6BRHF2VK4HHGEM09F2XBAVXPC
'SPYWF1HPFQG22498PHKJ0TN6QZTRSXS6D80BAMZ5
'SP2SM5F36RRS709CQ4D9CJY70F43V4TR9JPN7V6D6
'SPK42JR8Q2VNVBC8SAM1M2BQ5SEZC0JPZ295Z62Z
'SPXV59XA5ZK53BCYVZFF8CZA5VCGV19JCZDPTQV7
'SP3GGNDQASTXH0SVTSWVSNS7BP3RZ4MDXX25YW80J
'SP24AGJFKRWK7EMYBFA7J4R2HXR7Z7883FT8KCHSK
'SP2Z4MW9Z71B3SQ1NFP3RB7FR2SMBTQWHVNFTXRF6
'SP3795C9QYT13ZC1AGMPP9FQCYES5MP8XHRS6AK8N
'SP11VMRK069EPB45ZS20MSW3DGD7QZNBPS2191D49
'SP2BKHJSW3XSQ3FEZN5X2GBSZ4C9VPB4SNMRSFCCD
'SP1JCTFR38HC16KRZGYR3Y2M35AJNNKFXR3DZ3YPE
'SP2VKV3A239D5117VEWG39FNYC2FKK6915WM5RDZF
'SP2Q1X7A5RHEN6XXC5BH4MKGE4S7Y6QZHY3ZZTVYV
'SP2S2AYBASR4PQ0DB0SS45KHJ89G8Z4P2GFRETEP4
'SP3FCX6X5N8FBBKJ32EDB9XZQ1VAR2175466QB8T8
'SP4DECYJ7TF1RKBEZHBXNH2HHWYZD05AV0EF10XR
'SPXJN8CC4FRDEGC841XA04RF8QAQMDR36DX89Q5J
'SP6Q01JSXN4HGPBXE6Y7F4GHTZF98PKZKJ57K91M
'SP15YGJ5KMPR5PN4QDTCZRJVBGYP9EQ2Y091GC4TW
'SP1H7D726T6G13MDJ6SZZZ8SDKZKNNFYEKX4PWN8H
'SPBA9Y7A6866J6JZA7NENF79X95R8S35EHDF2M9M
'SP3FW0KM9HVPBG6K1253WQTDZEX9PM0YA60Q9C8G3
'SP2YZTJNXHBWXNFF644EH4GZ4S7CQ01CVSD2PEA49
'SPDECY4R68D0QKMJB5JAV5E79D7Z964YCDTYYP50
'SP2Z4N1YCW45176FA0XF5TXHT0KKDQ8EXWWZVBZNB
'SP26XGJMF4NVPRYMPB5G3NJVYGF1W4F4GJ5CC1RT8
'SPJT3WWPT4Q925GDE9BBZRC5MNZ3SMP8G7VMJSNS
'SP32GA720YCP6JTS6PBSQSTC5N4DNB6A5JDRJXZHK
'SP3Z6M5RSHSHJ781CD2DS41TMS1TV20JCFT6XXKQJ
'SP3GXPJAJY660N38FKQBBBDFRAEE9Y4TWC3V3PS0A
'SP1C4ZN118N6TV5B375WJJWW0Y7PE919FSN9S2PGQ
'SP266DAFYWQ16NGN0X7N0RDBS355F7G7BYFWMSQ9Y
'SP15DP7F52XA0HR3XRKFSYZ2H9CVQ3JG4Z9BYG9JV
'SPQ156AQEAGYSCE7YNW53JW0AT2R4C5A2RAFAMZG
'SP25V5VHY8EXNJ3PEVH6D9P9MDE9BYM5P17A528KV
'SPZBXP3450SR8BMF8K1H6RKMS16CPP16QSTV9S32
'SP1B3VEMWMC1BMSCWKZKPPVHQD8TJ8QQD93ZFP0VN
'SPBPRAVHBMNYJBPDQ3G7DXRP3DTTYWDE8HN93DQJ
'SP1N7EGJF5QRETBA0XPSKQVW8BFY0CRR7121E5KT0
'SP2VR35TSYTE36FD0QX856MC5621NNTK4BWERZGY
'SP2PF4G68C44HC6Y562ZYETT5FXWFBC9S246J9KB2
'SP26YCQDF1YFC4DP0WMTHCN0C5197C8VVM62BK604
'SP363NCTT1W21JC3JT3417XV8K1XJQNQZY1MX4FH
'SP1EKDMMG508FY96RSEQ1EFGGZ6J8T8DCDPAM12HS
'SP1PSTA73FRSRK0KZAWBCM9KRXHVE3RY255E3VZ3N
'SP1Y2T8VZ3KSH3ASQN42ZT291JPEGEX292HKN525D
'SP26T18A9A751CM9V9BZJJ80WPRGERF4BSBJZN76W
'SP202M362AFPKY48WKB1SAR2X2VW659VBH4TVNHC
'SP2YE97WPR9C184MQ4RVM6AP1J629750Z1N48N82S
'SP1PE1R37416BVCZ8MFS777VKEB728S2DW094Q9YF
'SPGKXNY6J7X936RZ7Q42RMZQHSZWQECHH7RRBRXY
'SP31DKT9GNEGPA1CQ5NE8DVG897SVEY6EZV6PF6VM
'SP3YM926G158RV76VT9M2NCVE0V5RT76Y1ZMTNZQ8
'SPK7TF943A82SZ689W5B1G8Y7DBN0CFM9W63TXAT
'SP2XVKPNAKAQAWTV8396JV58NTT1YAY3K4M1PGCD9
'SP1Z0JAG083DEE8VQ5H1D5RJDCT5DVEGS212N4XX8
'SP3QC4R6M7M0DAZBXSZCW4FWGDCNDD05FV8Y0AY8C
'SP23T2MHR9HW9XZW4TWZKRYZZ6FK33GH4K4869R66
'SP2XJAWTQH9MJ1FV1QGP12KP3Q1SZAYT3RTBJBDPK
'SPQQV2QN22NAT45PREHH73T5RHF9HZJS7MC3EWCE
'SP3BT3ZND2FKPPB6F7PK8S9JKK5YJ4WG8C7ZVSNNC
'SP2FK7PV2821FR7KD2MB0Q33TNGTTE2H6DM9VQ7WZ
'SPMDA32YNE0CRPE4ZX3N812S095TGY9V2SJDRPB1
'SP39RQFWJZ0VC7P8RW2066D5E5GZ8S4YA4CK4R11W
))
(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))
)
)