;; 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
'SP2ERX8AEW68TQBFZY3A85JBZJ681W58F229H8DDG
'SP3B8R7WKNGB3E3WH1V8K9ZGZAM7E195FDKSN3GTR
'SP3C99WQ8CGMJAMHT56Y6NR9K77SJVSBCJ07EYJP5
'SP3JDNM71VR2QWBKGJY81C65ZPGFSR40G2P19GCP6
'SP3R3XXPWWCEPJR0KTADNPR2RT4RP9N5WW37VGF5Z
'SP267M0D84XPBWM0XWZ6NAB92TMKH89W6GBE7ZZP8
'SP1GX7ZQB9Z980A0SC76NJNFVD7QC87RSQP4KCSGK
'SP2X6YF2Z685RS7VQP1V2P5GD549MJQ52QY2YDWCW
'SP3BM9JN893JP9FEK19M9GFNGT4S0Q97Q03SSQKKB
'SP3TV62B8Q6GJ7T7BT64XRDSVCMJAJ8YJSPYSVVW3
'SP2XPJTN6GCH0ZXSA63XW8ZJEZAMMZ9SE1XT1TGHX
'SP1FRRFASQC42KKJXVTWCC3KJVGYP4G5ETG5B2K8Q
'SP24KC3VKQGX7DSA9HPZAVR96CR035Z8QB9ARVVHJ
'SP16HM9RSETEZ7R0V5DAEJ065S60W77D9282BTEPN
'SP1XVXK56YKY1ASG1XMD5Q7HA40R8M55JQQRE7MF
'SP3EV9347PKTN1RDQFXCBFT48YEGTWSK9AXC3Y8PJ
'SP2E63P1N4GTM253E644PD84CC5N0R3X93SN3DTET
'SP2MSQQBRP11DBHR4FPW3E2PMKS3ZDAFM6SQM3Z7P
'SP31XX9BP58NAFFZFC1N30NDP60TMPNGYREYT6X15
'SP1GVQDQTS9GR1PPC5W8ZX226RYT58R2RAR5XTV7R
'SP1JS8P50YV2DH791BNBDXG6NYG8XB4DZXJ733D9E
'SP1Y1PYHACZ07K795SQNMHJJWHV08QZ7FFT4YD4RV
'SP2XHPX8SDZWX36J9B89Q8985B0SEWN0Z7MS1Y4KK
'SPXTQ1N7APTEF82TXNNNKDS3RTC8KNR3BZ3BBKAH
'SPYJB7QHTRNBEMWAKZ8YTYM593RMWRFJHFH72DC3
'SP1AWFA1CJ71Y306NZJ3JVFC3PHGH5QW8D8JVXW8W
'SP2M9WZP8MG00HXJAGXCDD6E3HYJRXH687908GY8A
'SP1NBXTZ2KFT9ABW4Y2845R0SADMVR3HBY7AV0E2A
'SP32MT866S490QSCPXM4ZZQ8YF38TTTXST5G7Q6P0
'SP1ZXDES3VJYSKQ9MNYPK53MZTMJM41NYG1CX3DHB
'SP1V8F167CCT3YE2KPNZ6XJPAB57N88S0JT622CV2
'SP29JA5V41DAFDN3D5DV4HBDSQ30J3HCYTREY4FFF
'SP3FMN2XPTPPC23S44RBY914HZPG8G01D5SD96A6W
'SP8689TG7CTSST92523N04D3H41CBYWJWXSCD1EP
'SPNC9T7FK2XMMZ0VJ0ZNQPTD7HA6PZ92CWFVBM56
'SP1XWB45KS2HPJ1C25C2NX7FSZQZ7AFFS3HCGZF1K
'SPCWFX40VYF9AH4WKVRJ6NGYP2TPGZC2F5PGKFGP
'SP2QFBR77PZZ76R151K20WGBAK7VWBMFMN5P3ZKX0
'SP8760CPF2N83QC6F247TTW81N0DD74WXSSPP3GH
'SP16Y8ZJFS51P98E7B487ZX93KZ94W5CG79HXAN5G
'SP38H9WG2YWR0GX7K57FECQJC6AA27C76DV73J0N3
'SP128NF1JG9Y75PZAECSE6HC9Q6PF0922W5DGE7HW
'SP146KKP9GACXSERRSZX9NZXG48T3MWAARHQYMC5H
'SP19RCXWA9YGSTPNFZ99173B4KKXQ09S1BCDNBCCA
'SP1VK5QYYM9H382CE5EHV3XKFFBFCN1XX8RTVMY9P
'SP2DT4N19C0X14PF840MV1WSF8WZJ6EY01YHVPNV6
'SP2DTTJ4WVB5VSQ0VTW36RZD7KCK30YGFZCQ0F4WC
'SP2YKSK3B0PFRDCG3XBVJN0QNKBN1M6DJQHPVG2KE
'SP32CP1523D7300E7DJX6M53PD2XH1B7KMWTR2RDG
'SP3404N547SXGRJ4QMHC7TKT4DSBAKF8K5JZ1Z36K
'SP3KR9SGTMN0DRN5WPNN3MEDS4Y6XR795GCGH466K
'SP3VFB4NTFX3Y5S53FQ0P7CGKB7XWBZKSJZA3VZ89
'SPVKX91QSHE73VVA89V99M9M81Z04426V4B8KRPN
'SP2SJXBSCFD48QYPB5RFXXFF9RN752337RQHR8MJW
'SP231BJ42272TA7NDHCHPMSNAW0H76W7T767B4HDR
'SP22TS112NMSK54WGFR7HVB5320KJHAPH2A6EFHF7
'SP2JWP8ZA4F1ZN5ARMHP9AVD1DHCYWWC28RECJVYY
'SP3E907KKKDR4QR9RMWZXKMK6AGXJJ68TK8A0VQ08
'SP1D6WJMETM08X6FAEXMQFPJ5R96GGTDE4REQYF39
'SP15NXA780H0JW0CCBTNVPDP9MN51FAJJ114XWCP
'SP1D3HGT89HWFX56YYF02HFH1VZR4EMVDRH86JRF9
'SP36KK1WYNES6725ERKNCFHYFXBF81E8S73AAPKGP
'SP1DB1Q1864YTB0PXQV0T2MPM0NRARAE7S841MHNV
'SP18C4V3YAFH75VHMJN9QFVMC6FG2TYECKYADNSSE
'SPW9N7TM8DA6X4CVFZTDGVCY278Q10F2V10F64S1
'SP3DV2JBA01RT9GHCPVY8A072EWWJAMFRYGPW5PRB
'SP2Q58EA1NMT3FV2SHCAQ6C05BKX60ATGACTHRVA3
'SP24BQ8VJMBYBJ72Z5YB3S17KET1DMK11BEAXM6C9
'SP15WNY6V2HBKPWCAZWPCDQMH6RKFYMZN1C0VR8H6
'SP16EZN5PACJ3VYRBRP07HS9X42KMXSEV9XQRF8VA
'SP18KGF240KTZ8WBXCHZJMAD0747XZ8NPG4963409
'SP1HFX0DTPDA19RDSNDA46JDNNPH79E6ABCAAAV90
'SP2K2A2HHAMXNG4QFWN25NFBDSZHFD44PPNBQGE37
'SP2PCP50DGEXZSM4PQ8G7GNBK5V8EB07NSX2WJD9R
'SP3BQFP633AFTW8AWDWZJ055PWB4XFW6M8HNJCY3B
'SP3GE33M9QNY3JJH8RWTK6AYD0NXHDDR77Q80HDV6
'SP3R31HKRGVHRG40DSH93AJ5VQN1GB8APJRAZKEN1
'SP3WF1EP5E4EQS18HFX5X912F8HAC1EQ672SFEVC0
'SP975BJ1RAY04DTEDH5MJ5C3G7ME9S0GAAJ9F0J0
'SP10CY0FBQCHW1FYBW0KDN8JV0Y924EPX3WBE9NY2
'SP15ASP2D38SY65RGYQJEYF382VAH5Y4E9KX5MQ5B
'SP1C31SGCE3KYEHK05Z6ZA619XWEQPNZV4BNS0YT3
'SP1FSRR30V73X1J5EVZZPRVDQWWG9405HZ4A7ESR6
'SP1HFHENGR50MD480HPRFMYA045GXN5GHTWWZ95TM
'SP1KF3XJHPE2JP1ARJJWYAXYKS149VJY6YRMB7NT1
'SP1MR35C1WXZ0H428KAY4055RNG1V9472ARCXS1JZ
'SP1NEJGY34M6B4GT2J7KQ7SKM46R4RV9F0H3V6RNQ
'SP1SCWYG15CXNRHF53CXQ3PVPJTB3BQ7VY3YTD6B7
'SP1WQRZ61CQ68BMQP0KM185Q3N7ZCPTMEP5QDQ5DN
'SP209GK9ES3X6EZSASTJW1S8PD5DKZJCWA9FR0ECZ
'SP20RG335BRPYA5Z3RH7RTF8WRDQATZ1B0GQ9J1GJ
'SP21Z5RQXN59D5Q561G11CKXB1TRV5YMHGZ8ME5GK
'SP27TAG4J57T4Q31X83SMV8RQTYZQ00CK5ZBW92P3
'SP2BH6CRGF1XCJCNEJQB82HBBW9707PMPH49EP8W4
'SP2ETR3YJMM6Z946WBZW5PFDD86MAGGMYYQT6Y4GG
'SP2GRNZ3YYSD1FSAGJZZ1JEHEWTBRH3MTHWDR5QC9
'SP2P115WMAC3D1X2W2F753TZ57SBSGF4V0XJ9HYV5
'SP2S080D10M3FHKDX7G0QC1RA7Z81WK4C4EVP0MQK
'SP2S7ATRMS27DHBXN0XT00ASCG3C6J8BYKB3Q58BZ
'SP2WMAGYFEKBV73FC33BP8ER73E7BH8MYDGGJF7YP
'SP2X5M0B1KYY92WB8PADRAR46ZYFM9REFBTEXV76T
'SP2Z0QPR48DQG32PMV32V3WD1ZWWGGK35PG7ZAPQ7
'SP306EA7GR5QGYKAEN1B4XQJZY8GVM476G9DSBSTD
'SP31GNA4RG5JJ3QVKF7XPFSZH2GFTR7S3VAX2JX6Z
'SP345TR2YX5GD58V2J2NC6WN6AG1JX0TFN7XYTQEN
'SP37D16KW554QE8JSNBNXAHH5WN7FCDB7J8A85K27
'SP37VF03T69TXFQV0BMSDP4XST7W4E7CT96TYCVSY
'SP3PMXK1NF33RKGE9YNSQXFEPD53HZVVZ8S7D0ANC
'SP3RE03KTR3TARDQN6DMT26FRPDJVC0E1Z746VM2Z
'SP3W4FFBMSS6X246P09MGVBYCN92CJ1KY9ERXP2EJ
'SP3XWQT2FQJCSBXB1M592DYXQ71K01RG26VWQ351E
'SP58Z9EJE9AXPKCBCA4946XXJGR1X5H9T1AGEE1Z
'SP8Z8Q0X41WJXP3DN18SBSKBTX7E30Y6MXCH0AEX
'SPJXMR0R9DKS203W7HXCX70X0X719SQ7TAM9D3HM
'SP1C9VT961AMMZZPV14BGD7EFEBVCHAYYHMRJ4FG9
'SPR25HZPC7FYHVQZKW7TH4NWSW6HAB550668F6XS
'SPAPR4MK2D0NM28AS389PT46CGK09P90MBPEAGQA
'SP1K1QP9G0PS8HPCK101WPBV2VDH008QH6YT71546
'SPC88MGX3ZEZ6EJFH08V9WXXH364VN09545NM83T
'SP3KS2GWPYCHY5WMNM3Z2F3TRHQNXDBDKAQFAHHWV
'SP3BHS9XTNMX4FN0WECF40H2QD1WNV638290RWBZ4
'SP19WTQAFY877PTSEY3DQC03ET9QEY1NC1MC8HYEJ
'SPEDWBCHDYWS2M2B1F59442JY9E5J7NZ31V8BR6B
'SP2FRPDXJVE7EEHCW65H6C2NEEPA9S1KSYGA1JE28
'SP13S4J3BKJESHFVBHHHFNAC5DKKHW6Q4A67N2W2C
'SP1RPQ2VTCBJBTM7VHSWFYGF1FDW8C2AN520M1YGY
'SP3PRGR3RXNANH1CAFP5W3CDNE3DHWHWPRKNVMK5M
'SP3SMGGY6KE51A6JCTZ5DTVEJ6H154MKHDE9H8H8T
'SP1HZ8Y23WGZ8FS6DXXYAZSJH5B9J32PXFYZWYFHV
'SP12V32V7QGVHVNE13V9T9K2K8BH47ZEHB0JFKTDE
'SP3AMF8Q1X1THMT6YJ8D7B65NRT7ZN7YD92QG27MY
'SP1AEMWTZCMZRD9455ZYFBK87SEQWJR0G7JDR547Y
'SP3ACHTAH4BRCDBM7YZKQDY2K2GNPH6NFYMMTXSHQ
'SPSQWEXFNRQB3FVR3N4QC44ZKGSQH1ABNAEF0ATJ
'SP3H2MFMZMK754K3YM3CBMVQ8QYFZEHBF90TSXQ6B
'SP2D9GCE37TPS5H0DNZBSFVG6G60GEAHDEA940QCS
'SPC5QD325M6RRBSG0EE3H4HZVVJPZZT8XAENDSDR
'SP37HZV5QK5D1WVSCNDQSRHTSGGMFQBNT7R3YDS2R
'SPVFN2Q79BNQ28TKAA7VC2G3SK9KF9VB84YPTWM1
'SP186KF70NXH0PY46WA4D6PDXN56WCR5725851VKK
'SP3PVW6YBSQGTR5TQJR3X842QV34VYBGJT1SZPE9R
'SP102M0WS2KWFBQ7F02H8QKXYPBQB350B7F1K11XH
'SP295A1GYZ62W2XSZA3NJRW3BHESKZ20EZ7996AB0
'SPXNHTA84Y0ZYAM0ERTFR5TK7WXX6ZS27T5AVVWX
'SP3SW6P1YBZKNXAW08R7N2QKVQFKMVKQ1FCT0BKS5
'SP26PDKEFTMDZD2RXRVAAQZZD57A5G49N3T3VCSC2
'SP2J300276SEP5SVGQTYBTZF6A1B7V2EARQAC570F
'SPFBY28TTS0WVRKM77DZF7HM8N703W4C1SJGB0JD
'SP26VR9EXEQN5HEEJAH42N1CC3Q0XTNJ6G8SVDD2Q
'SP3FP8R4GQ80AMG5X036547YZRNXQ1GN1Z8ATAHX5
'SP2JHGTN58ENPKBMG55R5HSWYWAZEF0BM1J7YD5X
'SP33ASPQ20JY725FFB366GM2ZFCPF19P9T49XVAM0
'SP3EWGMMDN7A4KYH7EG05F7DBTB1GRRD6P68Z88H5
'SP4Q3Y4T1YFQZGWXSD0H8903Y77XEJYJ9WBB7W6G
'SP5SGTFZP1R0KYR1FNMF4DX3ZHM19A6CFFXC06MR
'SP8D67ADHQJN30ED8T279F92V8X2YCAZSBSTQ7ND
'SP8RQ85Q7W9KZ5T3ETFCPNA010KMASEJ8B4AS64B
'SPBS5KB3CQA97BWT0XGVHCE74TSCZ8W15B52YK1B
'SPFPDHX6DFTWEKFTF1M557FV0K911VERESPPECPB
'SPPQVHF7JAZBMGHAEHQ0VDQ6VHT486AZ4MJ05HVQ
'SP52BFYKM7JCJJ6WZVJWGTQSTKJZJ1HYZP9FA1GG
'SPXEN9QBYZW27R1BJ81Q95XMHVEY5V7HN163SAEG
'SP13PR22X38FW7VXRBPDXFH1ZF5JTZWMKXB7D4RF6
'SPS2CAE9DS91XHXGH9TAWZAA0SNQRWFYCNC8JG2H
'SP1GQF5D5CMZZF6D0NHYWZMQ8550GPHCBRERZG2D2
'SP3RDG2S392N86YNDRN0PWAZ6E3VEXA749PRV996B
'SPSBA7FQ72096J3Z1A3KRF7DKJ0JJNPMQYE7T951
'SP18C1FVX4ES2JJZ90TMKY34ZZ0SPNG0Z04NAD8V
'SP1JFJ02WRFV0WC2M3H6H42JVF5Z8GZWDMWKMD8JB
'SPVXEMND7VS0Y3DBW97R11052GFZ1VP0MRB3AN6M
'SP10KS1XQ8KKE0DPBQ9K3QHX0M8FXD7YGAKCREMQ4
'SP14YWVK4CYXWT2BHBPTEE5EQJRBQ5E4QCYC84J1
'SP670475VCJH1F6K3VGXNMC9FMBN168D18MZPANB
'SP1TPNAH6B1KCFA9ZTW1Q204F8Y7J3RXHDGKT2D97
'SP2MCG93GA0JBZZJPV556FJ0J4E4659SXBG1M0FS8
'SPTTC20ER66W6VZFPHBMMPRYAYG8RKTDFRCF05ZE
'SP1KTBCZY3AHSD6RPQQ759RQZ1WXS0RK9YAAT864P
'SP2BJER9Q6GB7NMV7D9EC3X3V2FMA2HFKKBBCQJ00
'SP2S130Y5EGJYS39N48K9BXX387VVT1Z8NF8S66C2
'SP2YGQWRHMREX936NE7E9EEDPY2D7H1CZESDMQKXW
'SP3574A56W2CHT7729C8K5FSHB38JD3G4AZ5PZSVJ
'SP30FY0581QKP97ZCDQYVT8Q0GM5N564532RVQHZV
'SP1S9ZYJH0PPZP882K04Y4PH7K30E5967HAE33N31
'SPTC1NJ5TGZWZ0HAW0B31A6X4N6B8F4QVPNTEMYM
'SPDZD1JQNQQS5SFWQCYEGJ00TY8EJG74M9A5BYB0
'SP21VEKH4V21KDXDR5K8D5VX0JKJZS7P2X1G8NAVT
'SPX8RGH5EMHZMBC8J96XZ9V97XRBRMS8DW8SN98F
'SP1G0YN4FKSQBSND5H2RW2JWWCVW5F137KNQ9KW65
'SPMN5DEN88XXHNEDJJZ4M1XZ42J3YBKZVFSD0WYZ
'SP2M64HRBNK59JJ2V23D92MMAS7V85GDQ8VCRGDG9
'SP13K5GDFFGG8ZC6EA7XWNYHKDV4TR2AQ3AJTCH2F
'SP163FWZMXZW7FW8ZD8KHBJQPNTDJMHFVE2Y7EBED
'SP3HXF74HZMXXZNJTCC4W2A9N8EYJ9VW6P4Y1Q0HE
'SP2TK3WW67WS1DRZG3DSFDGE4MQW94Q4JXE1PD4CN
'SP2XE0W323XF3EZETK5VHXJYKE84VWPK50ZMB31S1
'SP3Y0G70EH2B3ENBFSS0VJEAQ5C1CNRMPGEWD0D5D
'SP22PB1H5DXW3655HF832Q3XCDED7981SD1BM8V7Z
'SP3MQVXN5ANM9XJMX9VTYSM78P3J8WE8GR52JJ5CH
'SP29PGFY8SQBVB85HZZB2H9DYAEE3VXCF4Y78YXCR
'SP316DNXEMNK8J5VCBTV64N1SJRH0ABHGPK6THJZ
))
(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))
)
)