;; 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
'SP2X2KYAVCAQJ20XZ0HB2P4MT3BWE0YRPTFPD19R6
'SP2XPR9FR1HBWT5WCGBYREEW9EFH9NDCGT6RNH4B9
'SP2Y5XTASE7H017BD6919BV532R8QMAHFSH4MT7JX
'SP2Z9YAW0F9KNCQ0ANRMDRP9824TJJMPFPF8RSJPB
'SP3002980DQF5GCJ7N5ZRKAGRHHFP0TKW2TMPJJCM
'SP30H9NW71TNJS2429B5EHB1K59NC4Y11SEYN8GRR
'SP316NZ298XH7AJBVEQW48JMD24NRKVF4F12T15XN
'SP32X6GDS8CV29A248VM5F37V8A7WHDXXCCQFY0T8
'SP33V8QFCFF18VFYAKHN8NPS998683P1N510RAD7W
'SP3484AWRFJ4Y2E3WHZS5A4145W9SRNVGWJT9182A
'SP34GE35HK58Z1KV4FSEGJ8TP2MB34SYR3DDTHWQZ
'SP34NF9NKHK0ZZEK9B8CBF7H4AM0XZVY6D7MV5HXB
'SP34Z0MXKW34JBX9Y6QBHQGVRTD29PVQM53DFYCWT
'SP35HQXJ9EVNPBAMMAQJXFW0BCMT1X3PWANQ3X409
'SP35HV71VJFQZ03D7SAYEQH1VYAVN5JBXNCQCNDDN
'SP35ZV5BYP3X7GD410V3GCGX7XESVVASA3JEDBQ85
'SP36TYXFSKY4ZVEK9VSQQ1GQJX4KQAZ9H9JSA0W90
'SP377EE04KN6Q7Q6K5XP8Q37V6MZHMEPQ6YNCRQ1G
'SP37ADKFS5ETNY1MM1880B0BF57C4FVKY60VTNP05
'SP3849T0D5NSWRGV4W5RG3JWS4B0857198HWD7Q59
'SP38SW4H5ARMTRG0RKGJRZEXD684EZMNGFX84AC2Y
'SP39DE3TJ8E959NT4QMQ5PC41MJR85WAW59S43S8J
'SP39DQW78PE6XRTF8CDREGAWZMV2RZ1SQ7HHNY416
'SP39STCM38D74NGP4J3YEE4NKCRG7PAQX7FN4MWGY
'SP39TH9W6QVJX6Y4PEZRJ0VAN14EVZM625N4WN743
'SP3ADPJCXWTH246MJEZ75NA6J4DE427JJCSGG81SR
'SP3AYNZBF5V94X05NHMNBSJWCWD8C8MG0WFV7QVBN
'SP3C9DG0957MHXM2XC1MG96J0JZNBBAPNTKY7PZ15
'SP3CZQRNMJNWCS79DQA7BZ25ZARP4XF5G9Q7AYNA7
'SP3E5V4QX23EKJW2T20M07GMVJFN5QABS5QEJPW8Q
'SP3FMX3QK21QZMJBC6XHCDP90RKQ18KJW0J1J1G2A
'SP3GNMSAKWK5P93B47EMQK4Y0ZKGHY89SGYN95BQM
'SP3J820S10X9GDKZ8DG1MDXJ5HRRV365GQTGXXRRB
'SP3J865M2YQZ2C52T9VFFJYS7KV4E3JY495NTN4DC
'SP3JS2ZERQSW98A5293J6DQZEHVB0A4NPYFWNV7Q1
'SP3KZ91TCHPG0D4CWPP6RMEE6DZ732NQNT6VXMZ6A
'SP3MC0DS5RBZ6AH20BEZJMAK79GKW9FD4YA4FDD6V
'SP3P21WZND68RZY2KCWVCNF8H62MY51VWK0WXMMC
'SP3Q3YJXWJ42JB7JCSF48CQJY7WFWYHCTQAHTKTVX
'SP3QHTAHRZ3F4D131Q3C99KBXVFGJWBES5QBSS89G
'SP3QNAFRCZ9SPEHSE7WM4GAZGC0V7G2E9M7RSRSN2
'SP3RS3WJBBZN9XPW5RM8ZHD6CJ5VND1C7HT6JSXFR
'SP3T4QGT6M2DYC6Q0QXCZZFRESCPNDF9X0KJM50NV
'SP3TGCFST2DMDSGNF2SGRSKCHHQ38ZW7CHY0XBP6
'SP3TKSEPPFA84HTKDZKBK5MY5DMCYRN2Q1F8BKGPR
'SP3VJMFER2YKKN75YQWBQP386WA1KKNG3RW59CC3M
'SP3WDESZQPSJTRBJ3ZH8182HXTX5GRQPZJWW2P7KM
'SP3X7RNANYCF8GA6FB0TBC1V5VGNYVCWJ377XTMM0
'SP3XYXX4N50GPPAZ8YE1C9XX5YF3B8BJBQAA9FVTT
'SP3Y4FG00XKBEDZVMKK3DGVMDMNFJH8XHN27X4XDS
'SP3YDQGJKTHKCQM2Z7EZ5GTJ12YES8BQ5WB4SMCD8
'SP4441YYAJE4G5CTD5P655TMJWMAQN3YX8X7H84P
'SP4FR6D0QT7G7CXYTH0N7R2CVDWT8XX6116M2YG4
'SP541JTDCCEHCC5ZNPA7SJNEEC05ETK619DH68XR
'SP568WF33DSR8BZ04DDDWJQYXCSW9TZGAZH6V4WM
'SP5SK6RQDD1ZFPHHVYZQJ2Q4FJ211M49QZD1SWJK
'SP658ZHTC1KQRYN54ZV2JWK9CZWN1KBV56BT8VJH
'SP7QK8AKW0T071Y6DKAEENS9NFHC9RHAAYN57TPY
'SP8170ZRP66BQEQVYBNVK4F5R8QQ0B4S24XC27YR
'SP8DK2CWDAMRBDJ1HNNV7VMBPFZH1BA8FQRMX8YD
'SPAQ4P9914V10JPJDRBNNWFQEGYCV3NRH20Q5XAF
'SPB12NP4F70CSFNRW39FB1KJYRWTC5BAMKE16D4R
'SPC8YWEGQMY630CSTP84VQFECTTC4Q2F6QR7TMH6
'SPCMZ088BBV9K3K9AM91QF8FFS0R8DKQ3K9W2R3Z
'SPCW2A01T2D8NYP138RNNBCM7QDT9M7JG58NFGHC
'SPDPM75TSNVN0VRX7PBG49NQFNFR02PA3NXS9F9E
'SPDPVGVF99K5B2FXBB0AMRFTZHYNAPRTP7BFNK1T
'SPDSGJM5WBMV49JVCBR4T1KF2RGW0CSG3SC68VM4
'SPEB7EB915YS2NF7J230MQNEGKT36JEA03HPCW8R
'SPF0Y419TGBGAYSRCQ7EN2GXCZK3A1RGKZGTECM1
'SPFF9ERV70EN047HBKK722APQQ1RGHZEWW3DTWH9
'SPFKY1DQPBV7CYGA59C9N28XK4G8X1BKAFQHVXGD
'SPFM9VPZ0SCZEKH7CX3P5YTW1YMK898CKRW82HKC
'SPFVB9F01DV30NZ3DTTX63AN2PYS42W0RCNR7112
'SPGRF5FZ6PC6YNPB026ZAAEYYFKSW987KSC1E4GZ
'SPGTRGNCCHH3PJH37JV8ZHY2EPEESJ1JE3PRDY6Y
'SPH596KN1DNN5BA06GN6SBJSWCDBRV3W414ZF8VT
'SPHG5YX2W4SP4QQFEY17WERNVXXM7RAMJD4A7YR2
'SPHV4A78N98DSANQA6PDQC99SBR111ZYTVHAP4GN
'SPK2BNXRC53CM8APGDQWWX444FCX4WBS6T2748D4
'SPKD5XY8MMZVKM59MHY1BEX54ZY13VE8MQFS6KCR
'SPKM9529S783M5SBXJA5P943S3YDF3FQFRS02D0T
'SPKZ25TZCMSPMB4F1XAS06BZ21MSYFWEGBA489V7
'SPM27V8XQWNSAVJY2HM4DPPMH3YR3J0R85DWZKV9
'SPMYEEAGY46YBKDPEQRTS71JDGZ9TS9YADKED3YW
'SPNHZKAVG764JJ2WD71X1GH6JTZQVDD1EH8324HA
'SPP7ZR1CXQRXNSBSNGNZ420NRYTXGGXNTFVNH93X
'SPPF9QTCW0PVWQ8MDR80F1BF6A4AE9JAVFNETJDV
'SPPHGB9J6E546FN5Z1711806AV6AT41C7W1M76GR
'SPPMWQ77X73KS7X9AEZNVW0DQ4K7CPPNVCBW0VR7
'SPQM35SE1XHVHV0RSZZHAN3QM6EMD09T7CG9DXKY
'SPR5VG1Y2V758Z2KJAEVX8NZFB57VX3T7W2K8XRR
'SPRW9XNCTE0RDS04D0Y5HHA5PDKR2A41CBAR3PB6
'SPSDJ25JG3SKZGS4TDBWCQV4ZNQ6BNY7R9RHH5BB
'SPSGWCKWVQBYKN8R889V7S1H4MMNKWGR81GJC16B
'SPTGHQYJNRCSSQWYVRM6DT0PVBDR7R7DYFRPPV5M
'SPV8TCFZ1RTJ93DQF966VBRHNCX3M91H9KNZ0GE1
'SPVN3X358AGMQ4PVAZBG3MJHJZR9JAT8H6RY2J6A
'SPWYJ0F96XXD8PM69A5G5ZQMGRG1VY85QRDK0W5Q
'SPXFN4BY43JYJHYKJ2GK4EY8NHZHTJ920A8DBEQE
'SPYFK1MHV2A92R6GG2AJYYV7G1VKBKS3PW72S2T2
'SPYV60SBKRM31HTEX57HC9EFTWSYN6QFT45ESKA9
'SPZZPAMFRV16R6S5V5Z8VB41JDTHARGZYEPH84R4
'SPB1N37KGFADR5EXSAF35B2X8BCT1FNPJV1BW4GV
'SP1F9P5K3W0827THYPB951S9XGMTJW0C8P7GFYZTD
'SPPM372R6AX8NA1FVSGAK7NFSERNY1CVVVGTHR07
'SP3NWJRGJVPBXXC2KQBFRXC97RH5M506BJYK8KVG9
'SP39074203RSGEARK4G7YC6QABHRJYVEGG4K67Z6J
'SP3M7HSDCJ9FQZJC06DF39B7WSBYR18W4WHF7S850
'SP13XFG1CB6TYN36SS1VTXJA5KCJVAD3GWXM8ZF09
'SP3E6K5X6H53PEXPKDHWZH5WCB2P523FN81W8SA6Q
'SP3ABBTDM02HSKXGWNM862G2B5QYC5QP5S3FS9GY6
'SP98RXZ1YVGTW9BCVXQD8A8KSS8N6XSY73HF6967
'SP2EDRRZFG5GY0YAEVQKMDNR88VVER3QDTBT47WHH
'SP24MVXE7NYWVX4CCDF1B1NYXW04R618QY33Q150H
'SP2N30HFP9GQ1E2PZX5HBS35EQTKY2VKYSST0GG3Z
'SP33RTYA6797R50H1ET4PDYR3B2YPHHP5G4J1ATWC
'SP1BRR4NAJWDKQ1WTDTM7X21YVTRWAW3P4QYWRCYR
'SP1JH1GE1F5HHVBAASN7W04E77N6VZS2EBTE2N0FM
'SP1NTBB012P7V1YWWQ0RF4WY3CKQV2AEGSB71TSTQ
'SP1ST96XRNYAWVBGE5FM2MGT4RJVDS17EZK2CDM7J
'SPCEPK4CHYGMJSDF222WDCTZ34RTXC5S9PSWD1XC
'SP3RFKA0ZKB9KAM6TDBKNDVG5DMNCPEY7WT90D9G5
'SP1MWA3JJZ51EY9R5G29J5PPFSA0WKQ36J95682G1
'SP1TP3QTJAH7QXGTR8G1VGT9ER5VJDNP03CB44YR9
'SP3WKA4KDCHHKMQTFFP1PVR1H8RS9ARZMB8V21D9X
'SP2V3XS7E4WWQEZ954Q1QN4DT66MGE7H9YR8T27CJ
'SP3X56D96AA7QD6Y112WN9D91692SKRY8AY7PJYA5
'SP3KJ2V825N3SMEDZD14NN4HS6GVQWD25WEKZETYK
'SPNV3KJ2JSN6ZE8S812K778TQ9X2MGRAW7AX15G7
'SP17THWM994WVFG4BZNSAZMHVPV9RCC5WAN21EQ9T
'SP3JC0HPY4J3ST9BGGC2WN64VGPB20S1DPQA5B7N5
'SP3HN3EG0XTHYZJ1G85QVHM07YC7D0T4HW61105KM
'SP17NPWBP4EWPFSF7BVEXFJ0H9JDN0VPXAZSA3PYW
'SP1MRMZJ3KHFVG0J52E0VKHP1KAVZAZBBTJ33ZJW5
'SP1PE67GKAKYCZXHDP4FXANRM7KG25Z5KAM5J1QQX
'SP2M4KYA90FHFM18PTMYTNEXHGT1FCEAD4R89F7E1
'SP3E2RJD8HDWCXZ6BJNZ2Q3CAWHKSC05EBYYAM1EV
'SP2P3Y398PGKKE58YJ14D0FV8RBHZBNN810ZKSC8Z
'SP314828E9KANT9QFG66H8YSY8RDAMKXADW1VK505
'SP3WHCRX3GMFVYV7SM6RXR98GKHAPTB3M8KBQRW10
'SP999269J74844TPQD6H2WM2SE7FWY8P08HKPP1N
'SPYKBQHBP5ZYV7SA1953Q45M94T59HMK6CG918YQ
'SP33322NXQY3BPZXS4BWTESECPSTA5SVN2X3WP09G
'SP1B20TMEDT6HWC9NRZF9DCK0P3JVGEKBRPD8ZRMR
'SP4SSTPYTTQX778MD1RXZJHFDZRKD7WG771SDCXH
'SP1ZCGABS83EZGVNRNBANM585EKFH018GNB1X06DT
'SP32PDS0704612QE7JMZ0TEERA5CFFZMPXQB2YTC1
'SP28C0W81RFH72ZT2NVJARAA2PZN21DN4P45P8WDY
'SP3MEB5JP182HX76EQHEGF8JW0R7DBH2JCVSYT9GT
'SPGSMCA5ZZKKWNP3F8K2YJX322TH8NC5G4BSSWTS
'SP1RQEHGEW2S44ESCBG0BA5GZ5QK05E75GSM7PZQW
'SP1NG6X0XB4RXVT41DPWWHEMFVAX3W8B9C88G0QJ8
'SP2CHN3CQJ2QYNFCC6PE4KD2N4HMNECEM0EW5M4YF
'SP3FMDDMP5Y6PR4T6YWHR5GV04P08FZKBNC346KTV
'SP2N296CFDY2X7QV3BSHPWCGJXXNB09HZKTC20F6P
'SP2PEP8VG3FQKZMVPJJAVXKKJ536E1Y6B0JVE60A
'SP3QWHXGAVJ4XS0AHHSFXHY176NQ17KT84C99XY7G
'SPQ0P01NTF4YCPHD7D96C9XHV7G49QKR4JNJXWCK
'SP137J4QRRB8NPYDBWVDM3F4XSDYJEWJD5AF7THEV
'SP3QAHJYQQ2S3SW59W35RE0805AZCWBWTW7NE9BFC
'SPS84HP28N55YJPR4A1KTKD9XQ7KSRMQQZNT27M5
'SP2YWMET0YQ6BTSQNQG5SMKD18PAXDAXH63F50GC3
'SP18APAH9C1EPBD7QVGMNEF298CB9C95CMVW3M21P
'SP1VETYCVMJCCBNYXB0YYAWKGFA4MKMW2C21SR72A
'SPX8VXX68RQVCDY4R7NY6P8RMRQK14FCFF4W9WBA
'SPZKZXC9Q0FFZ874WCMEW3S5949WFH4CF3QFBRHM
'SP1DPDP9PF6RSVKX113ARTWCF41SAAFD2W1KQFKKC
'SP5PHF8AR7E1VXPA5KY236QVVGXYBP7NNSZ77PTB
'SP3YFD945W8WTPP0D2SBH031F2500AQDGH2SSESJD
'SP23JFNQRHWNXK40R9ZSS4NK8T2GCHSEGCKEJX3NM
'SP1J55SAHG2DWK86D2H546ZMNHCPGY52PD6EWZ3T5
'SP2CYJMR4FVDDCA807FSV99H4YJQ0E76F5YD31FC
'SP2BPN4XSHQR50E3SRV8JD03JJAGB3QAEV7CSEBQX
'SP3QQN9NFXZYENW2CWD95ZNC1RX3KNT73YF1AH2SZ
'SP2X1TG5A539PEYJ7128BDWA7CHS30KJT16SEQRBG
'SP24HT8K6HQBAG1RFGEE0MMB6QKVXW920FJ3YQ69J
'SP2C4VK53A1ARV731R79R5ME66M2788AE9CPEE7WT
'SP2WSGH6J1NTKQ29ZH53HJTK7MGQHEE550S870FX4
'SP3AMT45M38A84WVKJF4ER5C54TSMYZ0HZQP6GSCG
'SP7S12DXERJX79KY8MAY8QMB2ASCPZN8PGGV1Z72
'SPT2SFRSZM910M0G5V0NR766226MHQFYQXGTTP57
'SPVCCAYJE3412YXKG4SFCW5G6TBRT5N18N7906G
'SPZ3CGN0FKWF7CA3HV0K475T6V05DWQNJ9RVZBND
'SP129Y1NW6K6FE5WXDDVYNX9FW847KYWJ8PHVN4YD
'SPN1N4PDEMCJRB975S0M3DZAK4QH44HY3MGSVAJB
'SP2FZA6CRF2RPYT3YJS1M1NBWZJZQGCD4G5KR3CJG
'SP2562F9VF8XR1DEKSJYKTJ5GMES4X749681SAM26
'SPBDRXX9H5MAAQ8BB674CWHK4Y49KRYC2XK3D3AC
'SP12V92X9H9C6F04AFX4C7NDRRMF4WD0S2EX33865
'SP3ZAMM4ZKA8XE7XEEDCEHCQ6PH5ZW1MMYZZFEES4
'SP2PSPRRS8096F0YT2MZST7TGPTJDAD9SJD0FK3J3
'SP3ESSFQ8Y0ZXBZB5XA60BFVV9NMTFR8Y1NCNMBGP
'SP39XRWXAPY9WD0RSWJ4Q9J1QA7JW1M4MF9VKQD4R
'SP3P7YCP1FN5C4QGCPJQ4ASXVVM9JG4MWK65DY970
'SP2FK74VYFG1PPB8E6Z9JY79RDSZ87CSZKNPNYG3H
'SP3FXBJJ4S201GE42022KXC1HCYCS5JDMSVSMZKWZ
'SP3HYBS0KPKHX2GTDSA9SRFZDRQRFR9CS6MG8R44Z
'SP1TM8BDRJZJ55A7JTS8W914G1JRRZE5WWSDJX2JS
'SPJZKQ3M31Y5WV7FXBDWYN47CCEJE1STMS1BNE2V
))
(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))
)
)