;; 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
'SPPX3TQ8QRNWHK8GSW5FYJK9A8YBG097G7EXSGFS
'SP3XFKCX3W6QWMZT6428KJWPCCFQFWFYH615T7EFP
'SP26A5NSQ4Y2GQVN8T96GG3W6CB6NBKD5TXRDC5EM
'SP28F44VQJGBZ4A1W9HD1Z63HPWB57N28997F3WMG
'SP2439J572HJ906RYQCNZE6HVMQ1Z3DR2VFC2AAWQ
'SPND5PH1WZ7SWEVT3MG59P66R04ZWK6H2QV89NMX
'SP8ANKJ57KH74WX7WJ50EDSGEM73P1AMB8ERB8E0
'SPEA7MNNAGXMF8RQ93M7MXAZ6AZ8ED0BQH24G72H
'SP2PYJR6158MWRZ1XDQ5BY9RFXXFQJ88KMXKYKGWQ
'SP3V4DXFZ1H4ZFQHAQ2AZNKR22A63YZFAPWJ653M8
'SP1K6A60AR93W3849E22H0QWGV7F67K4TWN46WTN4
'SP3ATFW5VSD0W4N0E3K1E4CGFE8MJXQ9XFFMQ0HBY
'SPRNME4G34XRCDV5HY90A109R14NQWD8DN7BVFB
'SP1XF9N5R800VDYZQHXRBQVVSAS32FH6S0A9224RA
'SP3CT56VR4N8GNKJYK19VG39AMKHN1XSMS9JCPX8V
'SPCDH67C68F906BGSFNTE732VK9AFE3JQZJGZKRP
'SPYN02DPCWJVVR9K91710N222C295WSMPZ5VX3FS
'SP1EZJ79KQABHHYYWJ78B7GEXV3XB14T8YTXCHNKT
'SP2GZBH43N47JBPF0RHH83R6EPWYB1FH9C84F536T
'SP3GMMKHKN9PBSF6BJAZPFFRVMCMA139Q0A7SYHVD
'SP3V9BARGK0PSJMRDCZQKA7TQ62J62PKVR66C1B9P
'SP206X0HYT3V8J93ASSFJSFYB70J3ATZM2S0HNQ79
'SP3V7QRMWVXDZJNGCTMZRTJ041B5VJYHV4FC857FE
'SP3GS6ZW0013Z957PXECGA1BQP0YMY5RPD1GYPH18
'SPVGHVMWEE5PE0PJPQ0XVKAGCM5VRVEMSYKB3VY3
'SP158378PVRA077MC9851WTVSF7G3MES99HPJ26DW
'SP1QRB7YTTF1JRK7E936DQMR42K1RCJDJNCX49SNS
'SP1DR9H6DSQB1SPVTPMYGBFCYXV2DQDAATEWC3W3P
'SPP101EYVAH6XCNDBBVSVT5P22QZ8ZH80K3432J9
'SP2VCJMT1GVC3414G4W9QGZ5GKVJ9YT0DT6ACHTFS
'SPF8BVSF0C786B5EGZP94NF6Z3DC22X446FWTHGS
'SP3502BW2YK4AJ8RQAJXS386VREVQR9ZM69X80PJV
'SP2PQW5C6SNAT0XXB3JHN9BTVA49NPR077GN9V92D
'SP27PXWEEPDNWQMDMMZAET3MBP1N7ZE1M7XZHJF1M
'SP2DRR2KC0NYS16BCSKQ41YD9P02ZVDKPHCN3RY0E
'SPVA7N3ZZ2NC57QY9QTKXRBG44H6FFJ6XRXNHBPN
'SPAMYKG405158QHF1STBG1SKFPEPY5267WB3MRP7
'SP3SSTB4J0FTBJ4VP9QV47NKDRVYBYT0TZT4G16ZH
'SP3GJG93GXXS7ACMANB4N0QDVE5FB5PCW6J8ZZGZS
'SP3WJQK5J161R89ZQ3XVC3FRGTNFADGXTDZEPTPSH
'SPC8X3A3GXHAP9GBYSVW61XQXYHKH3XYC16T6XXN
'SP16A3KQ132FRSBJVT2VEFRE45E8T8M2Y4129XBD7
'SP2T395ZMA7X6N3JQ5VRKCME0D4DZQVM84M8AAKT1
'SPYJAJ602A5ZBT533XZN2TJ9GSJTSS2PD3JR6JFJ
'SP1SG0K7Y9RM7Y0R72DRS65237RPRP3ZE3AN4HZJM
'SP11HW0TCRHMVW75C89FKBHJ19GZWYSNPBN6GM0MQ
'SP3QFAX1BNWHS3ETCEFJHGYRCZ4BT9VW4NBFGAQQA
'SP328YDZCWYGN7865XXCTR4MHRAT7AK6CJ9EYENAK
'SP2HXFQVSP5JQH6MSWKYWCZM3FPRCDFCD014PJN7C
'SPT7TRDGJZDX5HH93VZPHKAZTN95BE6H1V3AZQC7
'SPGW9BJR01CAWR50XP563KS4FCTD0AR8YBEQB81V
'SP3XYC033WYMJF4AMF1ZD89VPXQ224HRM73W59WY0
'SP1ZDK3WFMRGCZSGF23567TV7SHWJDAVJH2PS1QQQ
'SP2BQWDGD9H8Z8QTB9NDBBBH3CC23881DG015RVCC
'SP1Y00VHFYP7EXB6RW6P65Q8NXY1XGY9VCMKTF821
'SP10C5EN0SDN5VPBN42EYNW8KRB8TY03TY2RNWB3P
'SP1CMP1PH2802VDYD76EE0ERD0KSNQW2XRAPX3XTQ
'SP1C9P4ZMGZ7R1QE5SBFKQ8D9A8PPHEE3974ASQTX
'SP27N8T5FZ1CYJ0H28398SAZ2NGWNVG6TKXHGV6RK
'SP3PC7G7R7DVBNTH5T8P7AS835WSTZBHNNQR8TPP0
'SP944Y4M70Z2GSZND3DEZH40CF4ZFCWYTMTYCTV7
'SPZPRYTN32GSNWC017BKN0CRK7E1H1BG0K68HSPT
'SP2R471TPYXG0FR9X4FZTNXWXZ48P4WSC9FE3112D
'SP28TCQTN1XQ73HKXKVTZTTXFVQ754XXF7W8C04AG
'SP3SMT10XH6H5ECT6D1TMHBM1AEMJMQ0VVRK0E00A
'SP20W5G3VF4SY9S095TVYPHFX04YWGX25XZYT68K4
'SP2FCZX4RM3SEP0YD6B56Y3SPCFMJJJZVY493GQWZ
'SPB4V3PBT4MB2GMT74HMNW5B7EFPWJZ9905VJN7X
'SP2XNTFWYKGE4SBGC82C6RXKZ3P917BC5VZ8TN9TS
'SP3KS2S9T50YG14R79978DGNHVFGR9Z1AX052B60V
'SPMYEAPK6F9CFSFCZXZ8PQC620YQSTTQC03Q74WY
'SP3RYPHFRN21XDW2AVDY9J3PD4ZJDJR6ZRMZ1YECF
'SP2Y44EFBXHPJJHCPN6NQSV2WGF5ZSDA5D3WPN6MK
'SP3P0GERCWKGANGBFW7X6VSWFSQG8R0P3EBCFH46A
'SP35MER4PHM6XGB99YDRQAK0M0JQ8F9CVF04VZ1VX
'SP1PQE3RBQ2DVQ8MJM5PSRGT5S88BQJ0BBM4J62H9
'SP3SXZ2T5FNXY9XBNANCRMNDDAESHCNX5G75BP60A
'SP2E1P00V7NWR1BXWAY6CKCFVYNCGYB5DGRQS7MMG
'SP1EQFEYMXFMCCCMQJ6FCNQY65F0KQCJ4DTVPQRDF
'SPN0WAZSK52T563A2YN0MGFKQNEBQ7AAFXEC793
'SP3YC6XXTB8XCAWX7H6FN6M6QZ3405W6YJHFSA7Q4
'SP17DTQJJ3DBVV4YBN49W2ND3XAAX55M763FQ4T1M
'SP8EDWHD09ZYJ8XKHY3FE783QRCAQWP42MQW8WA4
'SP1ZCWYJ11SRFV0PFEAE5N31GWXNQFB2P7ACJ8E2E
'SP330YX6J2HXFYG06KKY5YR1SQAY6HRAH349J6VFE
'SPBC09R45PT2SSCY2DNKZABS2M0G61AY403BZB44
'SP3S70X790S24J361PET5Z5HRBDZ63GQHP8N3MJRQ
'SPM09ZECSBTR8MGQH532FA4KP66H7NG29J0BQ5YA
'SP1ZZ49DR88MA4SM608JWPQ0FGTE2J33PHVN55BQF
'SPXHMHXR4BZ44S37Q9F7CMC7G03RBF7EJGXXBVKG
'SP13BY024J6JHW526XNGNXJVSGXM40VCBM5PJ4HRR
'SP3X2X9E6VNXMNDT9T8XK5DB2WGBYG40EJFW4K8BF
'SP2KAXAS4X693W3VHKAMMS3JWP2WAX06ADPDAGF35
'SP3CTH7ZH5ESAA3VRZJZS78ERSMB457X0PNNRPF2R
'SP2B16QNBEMQG479F98Q294K0VG6X6MA861J5EGVQ
'SPZFJ8KVF9N4G2PY2DBHH9CC8JW3VRTJM0ARZQB7
'SP1TC36T8JDJNEN8S55BT00G7J2HMR1RZ83970XXY
'SPV9TZ0MPMHQM4QYY484E1ACF88N8FG3D5M8PC64
'SP1GR9YMZB77EC6F2K5HP821A06V57XCYH9PQK9KH
'SP2CRWR7N4KZF1E9XNEAB2F5XF070MX5DTF3MWMFT
'SP566VT540CKMW6RSRKFN5TZYHMPB0T9PMP7YYZ2
'SP16WRER12NZMAV63M62FEXHMVWS8V2Q74MHSG04Q
'SP11877TX1W8QQQH5BXJRD47Q5ZF4WMVP7NF0Y9K9
'SP3B451R9RQQM50M052Z84H5XFFZ4A4W2CW8V9ZMZ
'SP127YJ0RW7WJDV01W6K04WZC4NEG6070VG93NEVE
'SP1TH7BA3RYRRGEDC4P4V1S4MR0ZZRW5BZ9KCY8GA
'SP3V79WZ7DX0Q1PHX89MB7TNVDPPW4ZGD5RV37KKS
'SP1BMCKPH8QWFD7N0N51ZM2XGJRY3F409E8K1SQ15
'SPNTHKXPG979RN4D5R4WDFF1EVG5X3NCHGZCR3J3
'SP14EWQHWR0E0KMF5DEZXHX1HQBSGMNB4JVPWFTAP
'SP3ZB50NRF6AC8E4XSF3FV9DGTEGYNMW40A7PQBE9
'SP11N0WEE52FHNTN3QR90QYKY5G5HV9J5TS80Q59Z
'SP313BVMGEV6PB417V8S42KVZ8A83YN2M48VNE4JC
'SP2TW08GXV75P186K6GXFS0JTVH19RR15WC0GDNF
'SP1MJNGPQSC6476ZYG69RRPQBXSN59ZJXPKVQ9W6A
'SPB0B8E5SACWHPBK88Y751R2J2PF9YPY6EZDATSC
'SPQSKHFDTVBGSZ6VW95SG0ES6SM7QR1RMVGPQ9XQ
'SP6ST7S6ESQAKF3HVHP3EVYB5Q92Q2XNB1M2G2KW
'SP16ZCNPS9VH8TQM1PMN800TT375YZGPWKP48RQ11
'SPAHESPF4SB480AV5D5Y5DGH5P4Y9HTWJCPWNGM2
'SP12E5REG9ZPB91V61A8V4P8XJ63EK3VT058YWZAS
'SP3SFYG6JZERQGWKKF0X1PBT59SVKW3TVBEHJC2JE
'SP334RNE1M86TC3A460NB848NET14EACXQ2260CXM
'SP2QV18K6HB5NBE2RWHKH1HY2A3HKJ4NVW7KYN2SY
'SPSGQW1N546EY96EDTCBZC7SWV2FFH1J58MCYBR3
'SP1AEK4JXEC1DRFPB7DF8X6PDXP2GSV77PXG93ENZ
'SPAM1EBK881V1GP2X5D0W0NCTFQ81SK18RBRTF6J
'SP2MZ12QCB07K8C2KCVN561SCR61RR7VJYCDN7WWF
'SP31SXJHBV3YN94HQX7NR7TV9RBM8NSNYAGXG9R6X
'SP20NFWMTV1WKRQT780YK7TCTQ2F9B2N7J2JYHFGJ
'SP1XSM7TXGZ5JGY1DF4R6NPWSH1XKQCVZ1XARH0KA
'SP226P36Y2SKGZXE1WQ1MD7PHTXZYA59J3CKDYENR
'SP3778VBP6SW1XAQR7TJY0J2HYV0NX5MBMX8KKNPK
'SP1W0BFT2FEJFVDH9D6AG6RN7N52BXEF6DFTASZ7V
'SP3F02X9KYM160GSYB581T4K2KF1AYF59JN5T3VMR
'SP262PDQ7VA401X7FSP8PHH3F0W6YTWA7YW9A6R4K
'SP1PPH2BHZYY0TRBTCRW9Q1ZRQB296WXA6YF0BXVS
'SP2EANMNNMDX6D7X02WTWXAM3HCDQN1RB1P7NAY08
'SP22V6JAJR0VZRPAT220B5BS475Y2BQQ6E21FNVGP
'SP1N6QNB5B05T7ZZZSKMS7TDQ5R5176WFSXVTV4ZS
'SPTF0XTAPH7Z0SYFW68MPQXSVDGE372774K41N7T
'SP8A0QAC14VJTB708TCQCK7PHW1NGYXMAVFYRXBE
'SP2XV97TQ925WMTQTBJWJVP5ZEK7ATR0G5F6982AX
'SP1MAAMAZ7XM1N830MJCNM7FT4P4T93A0SP07BSDS
'SPMYAJ5346DV29VMQPH8JWQWGK3VT0KNXZSAGEX9
'SP27PBZW78H5W0BF65877CMRQKM0ZZ7PE1K1CGYVN
'SP207WVNXEJWJMA52N9099RDW8K2GZG9Z84CQHP1
'SP13B423JDW8N8WB95HHC0735ND4VE5TKCWM83592
'SP2ZTY5Y18BHEPMTHDKFVJ1F8FT7CK1TSKFTM350S
'SP245X5PJDAJ4C8HS710AWK39Z5ZTMSJBGHV4WCN7
'SP292YAVHTQVFJBESHTN7M5T62Y9RG6K4MM1J95ST
'SP2M85GQGSHFKJ3H5PQ3Y5V1QQ7FEF8MWYSP51V03
'SPBEW8HHB5154XKHF36P6Z4ETKY8K18KHYPH2DT8
'SP1ZMZ2ZEG811WM7T9XECFM0V14D0WCRYA6RRBR4W
'SPDCTQA5FRSBAM2EFJK6HBAP5E8RN56DQ0QJVCJG
'SP2BGSPME3AVHK4DHTTXXS0QMF37KPHAG56MS7FG1
'SP2KNXRKVH1GQ5KPV3TNJZWZ7T0SFS824JBSVF3DG
'SP3A98YYBQ39F7AN9K762WQM35Y56P7XRMNSEYRMH
'SPWNEGCK01KWAQK2YAASQVJTF4YEQBMBNJ5NNHJX
'SPKM6CMHRDPR5N88MPW7TXTSZG2PC4RY8B8BCDFH
'SP3T9RYGX5058FNWAXS31ZN5Z5WX09Y5X7X4ZMWJR
'SP1X54RCNJS8GYHQ7ENN11JTQV74BVX15C5QMN1A
'SPQSQ7HPZYFFTXMTZ9Y1Z3QP9G6KW8AH35DXG2YF
'SPEPW9HMQ2065XY4QV9GFAJVM4PSMKFKZT17WAH1
'SP22YZ90FF9KC1JFJE3G664KRBNXX2JQKQBD0D9JG
'SP1DYKB0ZB37FTXQDS4RMK1MGGBBY0VXQS1FDF91B
'SP3FNB62VK5AWGVH8HKMM8JW8FCGWMB0D2W59X604
'SP1QPPQ07DDV12C87PZ1P8W1KS7YKN3J1SP58MR2D
'SPS8JBPFTTENB54HR0N57PVHYH8WTHN1ZC27PYZS
'SP3P7763P4PDGYVGXHT117RXE1XF4CRWK2RSN3A2X
'SP2N0C0ZPG1W1MJQYWBB2A687EDX5R5FQCSF2SA01
'SP3J0N2964S5X78JV21EGQHJWSMSZKZ9EABGM8TN6
'SP218KYQTG9B01PTFJHRFFNS7STX0H9VWG4MAVSAW
'SP1NSRPHDS7T5BEAKMWJEW00CZ12VDHEJ6N0WA8VG
'SP2ARDM210HJFACJXV4T05V46N6SBZ6W7FXZDQCWT
'SPNDTYKC2C2C0STS7ST0FVEYZB5R8BVHPYR5HRH9
'SP1BCG1NS7VTHSD12EFKMCTQTG4X2CXVR40J4PZS2
'SP1VCW4ZJWQS58DWR0SCM08ZNENQHD4XD0Z0MPGX5
'SP1BAVKEGZPF9F9VM7DGH9A3Q2D9E8PNQZ89XP7QP
'SP3NSX9E4KGWQTCF04X1FKE1YW80952MQXTKSWHN
'SPHVR2GVVJ4DZBMAZMJ40VCYYWYY3N0NM7Y7ATK6
'SP1NRKNAR3XE1X8H7N343GFWFVMZ5G6P04ZZ3K7AY
'SP2VASHGSVVXKADP0ZP4DY8QBYCGJ01277PA7H0T
'SP3KMFCG18AGYH7A9V3JR1PSG74NFDQ6NTB2G1R54
'SP3BYHB8JV8J50PTG46JNGD5FZSVEREEV6B1VX8M9
'SP2C3SP85JGJE83CR7E5JHZCW6B0Y1RKZZQE0SA5Q
'SPK7XHX88HK7TMJKXP4N73JP1AHTWGTBEXGP60KB
'SP3HQAMGTNJTTDWC45BW75Q45H9Q02A3P8DDEX80S
'SP1RDQQ6ECP8RDXFBRKYW8G16W758T4Q34EVCKZY6
'SP3G29YRCHN8B474T8MXJWEYZE16XRPMQW1DW5GXY
'SPP62F1ZF9EEFQS7PR9EPVEKSDJR91E6MF9V43ND
'SPY0S5PG8WJTDCP2F74848KD5N1SCR0MDHK55JZR
'SPMFVTRWM5PKMMQ7B7SM9RH7MWXRAJP8R4SASBH3
'SP1QG90SCMMNZ7KGPKPQNY7SD0SPSZQ0AEVP9M10F
'SP1VNCNJHTEFRN1D2NN4XZ78T7TKZJTRT2MNRBW2Z
'SP14DX1EE29FXBXZA0R1XRH9JSC0G8565GMK2WT9R
'SP9K1JQAF7STSXBK0J5T53FRTP04TT5MFFGPQ1WS
'SP3E8ZPRGR2QYM5PZMNKVVSSKHDZZ6NMBKS6GKD2Q
'SP3E1VW14B241PAE86TJE53GCGFS8WZ2K6X0Y8KNP
'SP1GMQ2TK2Q889S4V9VEBNZJ8DJNCR8VW9QY2T9E8
))
(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))
)
)