;; 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
'SP3G9YA8J5WRE4H402C9DWS970V2H8801P7SGSXGJ
'SP1NP8CYY1XE9ZB132WFY33HS0EA692Y0V2XBNWPF
'SP3RNM0MHCE5HG54CKBBWT8RSK778PB315GZJV9CF
'SPGDKC1NJ9E4G80JJ2GF3T72J3SJZKTGCP3SBT2H
'SPKWHMS0V6A4YAYXJZZMZ767R83943AVNTJY4MN4
'SP2Y7BAT6DE5JTQZZ7KTR3XHHBQJ7AQMNQFGKVRMW
'SP2BGPBWZFS5TJ4NJTRMGZVG1V2JAJ1ZQ7D6AKZYP
'SP12DEFSBH5YR81N10NK3AGGK3V89QTM6ESMVRP0T
'SP18SK7DM7TRHHWT2N4PG0JRQ1D0G122VDR73Y9EB
'SP18TZ6QD1P9QM4ZXYGG1K5HPGB9R0Q6MBPEV5ZDM
'SP18ZYDZW6D8T130QG1NAG9Q03M5B3P78MZ9VVVGP
'SP1AJJNKA70PXD14RGPWG5NHNM1WAEZVQD7HNK8D3
'SP1CJG6GC40GS4QGQ2E6QK5CFPTZN8XHXDBNH11JD
'SP1E00SD7W8FZ9YAWC6PTKTKVFENF7X8ASJD0JEW5
'SP1JPE1ZX7G4E0FTYQ81BVE8YB7YBVTT0XR288NQ6
'SP1N864DHHTZ3WG5BHM488XC6MTVB7YJRTFHKMPJP
'SP2ZB5YN81ADDT24XBRR7XEJYC1PXQVSJGCNSP2JX
'SP289J0CKK3W48RTS0HVWX4EXDJYK4NPKZ96VEEYN
'SP2D95CNTM9EKQ2MASPXW5YRFV2CSYEJYH4FWN31Q
'SP2NASZZG35X4MN3BHB7XETABMV4BYYATJQ3T6VF3
'SP34DFT6WMT3N3FXDBJHSXX5DSW554SNDBNF9GVMX
'SP3F6C3JFT33QJEPTV79E9N6CYTZZ7YYZGNFH8DEJ
'SP3NRE072ZTT3G79VBD5JM8SZ3SEVC22S0XERN9D5
'SP3S0BQFA7V03BMPQET1YM8BBQ020F8AWWS9Q7ZQP
'SP3WASQ1KQTGBPT0RYJA6HY6H4DB5B4BNANBN0Y8S
'SP3WSZQSHV99NJ7GX1G908ZFME42V86J6FAY5WXVE
'SPTYFJMPMMNFVCX1BBXQ33103Q3ZBBSPA1DW1PTE
'SPZ13A25082ETCFEY0DECFE7VMKDQT014Y94R3NY
'SP39CW2CR0VMM931KC1VJEV76YZ1RX4ATAZQ3MV6A
'SPS2FG28Q8C87WHDBF25E1MKNA81KGGRCAJ4AEXK
'SP1MDNST2SFPEN3E6JK0FV4A10ADFXPJ3RHBX5GNR
'SP1X8G8T7W93F9J3QN6PPZK1RMEV44TN62WGKYY67
'SP01MP50C1M4F11REFE4N1THD3DY405D2DJKM919
'SP2G8NFHDGR5CMQKNXB220JH9Q31Y70DY44WNMPW5
'SP26XCQ6P0MMJ6DWR7HWSVR4HT9CHR9WXTRT2547K
'SP1RNAG724AHWY95MT9SVR9E5XKKK76QH9DFBWD1H
'SP341JDD7WDTPDHP13ATH2PDCSE8X0CQAHBCDFQH3
'SPHF48D96F96WQ086DK1QWHWWNJ05QM0CARS2YJ2
'SP3WVEW3DJCYBN04RMZDBVR9Y778HJJRHCG6Y8S6
'SP1KPDH86AWT9TQQ31G5JHEJ3WRV16S08ST71TVKA
'SP3VZ6CJH3F9H6NY8AAC7HG8W90Q455Y7A7WSTGEQ
'SP2RHN66Y4XECA81ZMX0NYDSFAH0Z0WS3SF1RZJNS
'SP32W17519Q38SG2JB67EV8M5G9TGJR669GNQSG27
'SP1YMCJTJA48FT8NK21QYMAT3E9QW1BQECXRJ9H4E
'SP1SJN99AWNBFNGK9GXDSBZA33WNEPP858ZHPSFME
'SP28AC8VQ45F8V3NQK2RWT9ACQ7Q8Q4FFNYQDQB4B
'SP35KYNM1P6KR4M6967SPPQ5PHCE042CNMF090M32
'SPHJW97CHKMEN44EXNJD9XZ9B30GNK2D4Z47JACE
'SP3N4KFBTZKKYRG5224SYR2AB49EV2Y1PQD8QNP1V
'SP2XW4AFGC67GJRYHKVKX3PPNSKWEH37HQ2KP441Q
'SPAB7YSZYR9YHPAMW09NTFQXA877WQTERER3MNTY
'SPSC9M2NJXXS4SKJ4ZFFW05VS6VR1VG3WMNX0CTD
'SP3ZBFE2H8D4MD1409C45NWKYQ3CFNFX4CAENX8W5
'SP37HR3CMD6N6X5MQG7R176300B2Z5CGH59D1PBJW
'SP3VSZZ9E0N1AMY2T220PTC00NWN1HB6BQRSM9M6Y
'SP3ZE8BZ6V7WVQRMBCDJ7HXKW9NW1ESMA5CQSXQ16
'SP2EWMWC2FZCT7M2PX9840FE811VCFT5R72DANVCK
'SP2N7VSJ2DT9NY438G3VDWYFP3WWBKYN46GQPHH6T
'SP2S7GTAT2EZ2MM5EFV4WTMZ88C5DNG13924B7NMN
'SP1C9CYXRVFVYQRG1MF4ZZCHBYR5AEEW3JX2DJV0N
'SP2AB6AYC6GBR5X94B4WNYDSFVXTSWRZQ9CG31TBB
'SP1Q38B4YDYXQVP3Z37Z3PXK93QGGA167WGRW4M7J
'SP316FWDRBND1C3DN9VDFDJZNP9WGY9TGE4A3Q51M
'SP1WTE11RKG53FK9BPW9CBE3JZTNXQ439GRMGT99F
'SP306RFY3SSJED578H2BV2TJ6T1Q285NBC4T54JZC
'SP3XSWHT6NPWJEJSVEQ6A155AZXKMHTKT6GTD22PE
'SP3KJ5P259V7AAQKJ3JVY6ZTWDXM6APZ79XPR4TXP
'SP1QCQX8N19AQ3EP1W08YMMPMNNMA5Z1Y60ESHQ25
'SP140VV2D2BB767NPMVM4H3W134T0Q7GWDZZXY0M8
'SP1GG9W2BEY6CS2Z8QTDWB8JYEZNW9TN704W0TZ40
'SP1WVK1A3S0R4D008G1T78MENBXXPPCJ5FV5F2CN7
'SP38B9AVPFYFTFRBM3E3QRNVT0AE19X0P0Z3MVTV1
'SPQRVXMG41C7K6ZG0PY06BBTS3JPET2Y8H31JE9Z
'SP2JRAW0AZHN2109R7EK5HG2MFVP70M3719H0SNWE
'SPX7K53TBWWSQAM7YRRQGNPGQ3G226RB69ZWG3T3
'SP1YRVC90NV02VFGCS15EZ37TAYYTB57T9NRT30Q2
'SP2EX9NJAG5695QREX1DZ63VTTK89RCDNG97MDR8P
'SP29BZ1Y80NAY4J18VMMW5AHBVQH5P38QM934JR9P
'SP1NRDQB7HS1SJGWDF1QDQM0HP6V4G37FGASWPHSA
'SP3N0FHDQSHB9NQ37SJJ882BR4WSDQAXBASA3EDYB
'SPP2PPZPHPV3ABCC9G7EY69Z9R2RKM4QKPY8JX34
'SP1DF8DV34V83K2X07H40M141927R4A3Q4SC3TDGZ
'SPM1PWC9FJWR49QHH6YAB412BSFD7Q7NG65V4HTB
'SP3DW4N9MFSD4JF90XZEGXEHZ2E0J7ZCK2CQZ99AZ
'SP2HXTYPDWS59MBTXC4DDYXFYM0V83F2ZW2WFNWK7
'SPRD3HQPNBJ34QPDHKNX88H3A33FYFZ450A7TKB5
'SP35PQYATBV3JPF9NE3CDS9JJK9PCSWA72W4HKT1K
'SP37NRKHXC6PHPB57F91XG93NAEV8PWDACWHVA2MV
'SP25150H9TA9AYF4S9MRR75A0YC5K5RFBHREA7FJE
'SP2EMAMN58X7NPR06AP39ADYR9GDAVWWAPYSV3596
'SPB30RVWM7W4DWW4PVTGRTEVM01SF04NK29CYJ3F
'SPGGDFGWHSFT4GA9ZG1S9F66GD2HYTNW8VVK2VFF
'SPVSBCW9GAGH8REZJYN0Z57831TSCK9AGPANKSAT
'SP382MRGXT7F9JMCKW0YZQC807ZZR9BMZJY1Z5MCG
'SP1300CHHDQ54ZKXWZCBWYF353T049MEW702Z6ACN
'SPYWNEE5DN4P85P4CW5VHRCQNNNCXP85RWZDSE3F
'SP1HQ50VYDPATJXE3F6P9BQD8FFWAGB0265ST0STC
'SP1YYT8BTV9K5RVWR5Q37WBN9RPDRHRFFNX3C19PG
'SP6DY71RQE3104DJKRYRD4MPKX62AQ6KG6K5XCCN
'SPZ2RH6822H4ZR2TT0PC60PBJFC64T38WDNFSR1
'SPXJMQ34NYCY0RQ5CB6X6BZQYV0FQ1TDMPR3CYT6
'SP3AM851W6NEESEF9ZH6NNW69KQG7J8R9C27T6QZ
'SPJS1QSCZH9X1M3GF6P6YE8382F49947VM15MHCZ
'SP1PRYT4RDAFG7TYW8D7RTJCNBWFJMEYWHWDDG68
'SP36RBBMH2KTHE9KW799S7FAVSXW3CHP7HRY4H59E
'SP87PHFBSH9B51W2GBEN7BG4RHF81PP6Q4WKJ96V
'SPYGKT5PSP21KN4TCK4TBP8H0TJ84KGY5J4J7QMA
'SPYRRASSSJ9E7C1ZGTBQMGD909JE1DRMY9VGGPRK
'SPYSDJZ8G2H04GN2S982HJ2BA3159NAMFPGW919C
'SP3JW0V0QDEZAH19SNV71YAB5QSYH9T2AW289RKKC
'SP5Y532QZX7XE5X7C7TC6WCFPNPJW3VKSQY8VSGV
'SP16VJE0XWKRZ8XPQM9RXNR2KC03YYX8910YWWSR
'SPHHY8689AV4HWMWT99M3EEHDM1D3ZCGN7G89671
'SP1ZA0NPPJCSF57BZ7NB9K0SJ8G6PQX0F28N310V9
'SP1FPPMRP77MQMS3N9HW5Y93YREMG4SY4PF5S3S46
'SP2GJP2053ZZWBP5Y134X64ESXT9H59KNHWDB9B3G
'SP3TAA13BB5ZX7VSW331G46C9T6NG5R85X2NWW65E
'SP17F1B19FWE8JFP24S6YVZPBGQ2E2M802VKYNBFK
'SPN0YWACEQCHFKE050BFXNHYZ4AMR2K8MR2J387D
'SP22ZJRC926622B5PZCP0PCJ3Z913VRH27AAEFCJF
'SP3FDVWA309V06JTBT6V349ZCJKG14NBKPMQH4A0J
'SP8YCWS0AN20E5JDRXKTS4FPDGK9A4PE2T89RNVX
'SP2S74ZQE7MBBZPXXHYRBKMZV5CB56AGSHQ98BTJM
'SP1SM4F13P8RDRABXAPFAFZJ0NZYJT5HFE70AY9ZG
'SP16BRCDRH6MJ1JR1J2A6YJ4G8QH41TBSTWGH6NAJ
'SP18YQ5G8EDABQ3PR499M3HTPBMC3369CVAXW5QSK
'SP1XDT2KEBGMKX6GE5KT2BM2W70ANW9SCCM438VPB
'SP1R20VE5FECBGY79NR1KF6NR0J8A2EMDNEK70X08
'SP176VT2DM8Z0Y07W0HKXPEY2H3J91B0X8X2Q24KC
'SP1HRWQ1NB3QP80AWCSNFP7HV7MC9T0D85MTFXJRW
'SP3284VKS9EM88J4YRQFC3HHF4ZJ4ZTYFRQHH8ZM4
'SP3P1C4GZGN5C1DCB5ZX5A8Z952J8Q2KTXZR4RMKB
'SP3KFMTFS3W0A5VE3H3JTCK6GT9SKFKB59W2DQ6Q0
'SPPM55G5E20X0PFGQMQNYXZKG3ZBKETMXWKRC5YQ
'SP3MFP8XTMW85B0X0BPFT81RPMC6QWDR34HTWH334
'SP1BGEZ7BC5Y4Q8GR9S8D04A2BHYEHKR5MYFMJTV8
'SP1EVCT5JFDYGMRZFFWYA7GHZTYAPA2B9XX8CKHD
'SP39G4E3SWH0H0HZMS1DKQZ1Y5BSC1EQ4HFPR1W1E
'SP23C1JFNNT1KSQXD22GS55QNERH9VVH22RCZHNP6
'SP2W2AYB09YZHDJBQ4XXSACPAY5D7RBQ48PPMTJHE
'SP18YM2E2Z4TSKBCW74FYQ68WFP6B6XEBFVMF69AZ
'SP2DCK5KJS64P9ZJYGBZQVWM6VPD8MPD50SYDTXAZ
'SP37JBHFY0G094PPZKZHBTRG31JDGY3TZK041CACK
'SP12Z97VJ9N46Z8DYA7844VFF898YF81KC3JS7C3Q
'SP1V60JNK9RD612ZZDGSNFM0ANZYAC19Z6CJJZ4A5
'SPWFVN4TSQET8Z5CWZ86X2282S9B4H4N7KHVR6N3
'SP3PPWWG5J5SVTR9KGCBWGPGB0Y2F4MYR9Y5C2TPR
'SPT3VZNSQXM9X4AD24AY0VCNVK7TNMRCQZX3EKTK
'SPK3WDK0ZF5TTDFEA9B20NPB90S8MTPXPN5EGMQ5
'SP123KP0KWC6V4WJ2GNHHWH0C00WA9XNGS11R7NDB
'SP30JMW8MQNHTB10N2R1GWDPNZYTC9Z7KGSW71RC8
'SP10J4KTSXSFEC8RQXKR57C4CS9MD331PW3C9FVGZ
'SP2BQPZJ6FZWRMNN428NFJNAQRDK753WYMBQVCWN6
'SP1DC9B9FTVED6N1984X89V3XMCJFRVAHHG62Q6WH
'SP1PVXM2YAXFVXY71RCDT23G0QMGCVKRJY54BE224
'SP3DNVSQBYVJDSZXMCFTWZP3DHAC01PGG8RWNRQ3E
'SP1N5SK0NS5KQBYRAQXZVTJP01MGTRFB00DAFVC3J
'SP12HGWB6QXJGB31QTBBR41TRC11T14V93FSQPYAR
'SP1WPWGZSRQVRT8MY718VG0BG1DFXMECGF9WSZ53S
'SP2WNBV1P0S4CS87HF777QMRASXM44TK8RD25MVZP
'SP1DHMY7QJ6N6YBGQN3M36B1K9XPJ9JM1RTSPV1B1
'SP184S7J6TWNM75WJX98X9P7R0FMSQ312TF5B7X67
'SP23Q0Z9DPCDMVJ72H75PM79MG4MWPR6MD83N69C0
'SP13PBPRYHVS6GPQNTE5MX1YZEMNEVHM26FG3KS3Q
'SP2Z4W3X43BRDSDXHTYB783B2JH5B9FA2RG5RKSAX
'SP0AY7B7GKT6RWYEBVYVJTY5BS3FTJ434T6VPX5X
'SP13503D1G0JNB87HZQTQVNGXKM8672C0MFX67M6M
'SP1AEFS4DFN77S096X55273MZX8CHW8Q2VGJKQWVA
'SP1F8WKA7NDGB7YBW358BK3Y0S2N1CXYG4WR54SSK
'SP1C6590HY8RBSGR0ZG0CRTN6AWEXNBG8CTWA17Y2
'SP2HMMW7X0XRFS6Q072QS80EEPXX3EGKX7DAG3RFS
'SP8SWEY2AAP77JWEGJB8WBBXYV7CD6P9HNVD05AB
'SPK8NW2C2CFHC9DVRY8KBV6YF60Q5881N5VNHF10
'SPBPJTGJ922TG23ENRTKH9KHYCD5FGZPRDAGG7AC
'SP2WG2GZM8ZKGYGB1EZVENW9SSCBJ5NE0YTZKW29R
'SP2WXBK1SK6MH339YBWBTXM2VGXRQFKPXDM9CJM5P
'SP1KWV3PAN1RFJNNH34DB2670T67BEHFA65754NGE
'SP2RKXEZ7DV9N9V4FW4X0REXKRH0N6AZV2E7ARSGH
'SP3YJGKR2WRDJH4EADDM65977CECHN3HST0HGE78F
'SP1N9DW485083XEMBWJ8KY99GCJJVNMZDZJ5R18CT
'SPZJBMVJRE952PAS1S3W9ZPPA5J7SKXJ5BA7BX8W
'SP3486ZKTPK7SGSBPF8YXQ9B00W5KARM6T8FCDZPM
'SP2QFBC3D9YJDFM28DXE8WK63TSKXFPYXM36SCMQN
'SP29CNZ51A099103CM7HBX11JFNE31AFHR55BSM0B
'SP2VDM89W60BBQQ5100JGBH5GZ5P0578AD6B8MB47
'SP1PT8S14W0D5VY47K71MEPMK38SPRSVXPNDGAJVQ
'SP3JWRZFKCTWW2RRA4884FJ6MF51XWG39FZMJ6PZC
'SP1CKJBTHFR84AY2Q744RPQHNE40455VE46ZGFYCD
'SPDM95T0RBF3M4E0KFWK7YBPAGQR9NBWQKSJ4EB6
'SP3G8G17DHB8PDP611B1AQPXN0FHSB57F73HM6CDP
'SPCDHBJZEBW5ACK06501J8ET1F8439B6VS3D02K6
'SP15GC85VAJTPESYCE253YG6ZN74ZBYCQHDAFCJJR
'SP1G25ZYJF0JZKBYQGANA4GJGR5DBDZFGA5WEED38
'SPVB3T6WCR9S4M88QZE3BNJQJ42FR3HXQJFW7Y9H
'SP4GEYBTW5KK08WQRZD4QZA7DDX68VS2XKY4Y0VX
'SP3HHSDSGB47RCA82BMWKMKFZSJT36SBNTRFYZD8
'SP1FSX9QG8K0ZBFM104737ZN8KMB5S6PCM8J7TGMP
'SP3X277YP0TBAER6EA63E6MF5AEMM25DHT303P6F7
'SP3G7MEN3SYQPN55HSK3F36GTA5NP7BT561W2PW9J
'SP3TWW4KNPSYJPV9HGFG9J2KWDNT7WNS60YGFHTY0
))
(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))
)
)