;; 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
'SP3FBFNFFFGK1VKN17SFNHX8WKJXJZK175PJ2T5H7
'SP2RBQNS29P5YE0RB1HC9GVW3JCQCFEX8HFJXGC4A
'SP2HNKV8VMV51GC9KP2DY02CKH30JYC8RA9G2K9X7
'SPH9Y6FJJY527NKJA8VGEG2840KERZZHVXWVS8CP
'SP1PE6Y0S4W9TWB1CVP1414CJ043QXQK754522GSW
'SP30ASXAASXS5PWB48SBV1J4KYBN4BCZW2QRGRYGV
'SP1XMET9WA004YFG6MCVVZX059KCH50DXA2JENF2J
'SPQSZC1X38TTDT6VQ0K3Q0YZ419KWNYM2A76R2PC
'SP22C16CX93RRH5PVAXFBGZE8DTMS30W8KV6EEGHK
'SP1RZA6V3SYJJDM1CFV7J59WT27ZTWK03H62P8KZJ
'SP18WPXYPPKEFG4EEQA5A00QD7EK4HV28Q5RF8EE8
'SP3NX1CCN7QVX5ASWPRXK3RN3Q2W10KDXEDE61XF7
'SP3TY4K8XQAVVKA0KMRKBZ6K2KF14YNFT6KDBGBPP
'SPMD17ZZ7CEPSN9FVQ1J24HGX9N7K0V4FQVAXT64
'SPE5HDPQGE360QSRTA7TQAVVX3DTV44530J1WH1X
'SP19B5HAYC5DNXDCV0FSMWEYFJCA0Y1GWENR0QCKA
'SP3F6YAQNMA0YW64EDNDJ74QYKJY4KCMESK9M0ZFZ
'SPDGWZ4XQQ500QHF9B4W3247MTZEWE3WX80XCKH2
'SPHJEFHB0MJWZK0Q7SJ8N9VPKA13ANAVSKGQMH9J
'SP1ADYXE6F1AYTH0JGPZ81H65ZBQVJJPVKSK98NEH
'SP1EW1NDQG9G73R7TZGJXMRK6E7VERVHRG7HPN5VX
'SP1317GKQJHCQETSFQZ9MS4YXKVBRR29MMXVFSQJY
'SP2135K0Z51WN5WWXGYZSN35YWQCE6WDHYDXZGQKT
'SP199HKXMP1NTTY0RM836QKQKQRRFV401Z1Y4XF2V
'SP397AH45WJS7X0QFA99GSVP9QPE5X4GDW482BJDH
'SP3PZ0AY8BMQYW5VFMAM0NT07Y5P0E3Y4GW8QMXJZ
'SP1HDC7VN41SYNQGSVXNVYNDZNXMMEZ0MH0R527B3
'SP12540N06D74HG5R5722KDGV2ZKKBDKB1FAXZKWQ
'SP2BYWV2X23QZJN7QMC5HY7N1XHYXB5H33P21BMPR
'SP1V9KKM0KRE2V86Y506GF9ACWS7MJ81T9192FRPW
'SPCZ01KFKY62M9V2F34K6J1T1M0ZAAS0Y1CH9SZ2
'SPPGC6PFSZ155PX5F31E6BZ9HHJHWS80XGZVJ3QH
'SP3FTT16QXR715NDRW8FG7B82QD7QEVF6741Q43SV
'SP34ZB2YBBDPYVHHRC3EHMPNB8RVTZJS7WD1455CC
'SP1EMRJXH2R73KND503KPFNAMH7FE4EDT4BF6TQR7
'SP1T6AJF7VTGKMJ8V683C0N7D21N6YG1N94XKQDNC
'SP5MX9KTJW1MARJHAQGZM7TM7RD5W8NA6ZBE7E5J
'SP1ECDZZSZ62SAXGJ4M0070PW67DQKKRY5TY6F3PJ
'SP1P9NVFD9FARHN7SH9NB417YC9FG3SQNNZBZ8R26
'SP1W2ZYVWM974TFQBQ0QKM8CG6YHACJKVSA47K0GC
'SPJW1PWPPH3GVPAVVC23EY86ZVB9AQ9GR9PY2PC2
'SP3B1D6X20A4C2RKS9TSFCZAXABJJR5P8TZMKHVQK
'SP13WWEMSC9A684VFSHHRGD23G1MNGMKCCX16EBBA
'SPF0V8KWBS70F0WDKTMY65B3G591NN52PTHHN51D
'SP1MZ3CF4W2NXNKHZDGCXVTGRCRVW9CT8ZX52CT33
'SP3ZSH234GTM16C7S3YQBCEGMKAHMDNMX0NW9Z1WA
'SPK40QN3YCT0CHT2DFC17W7NG54FPYCHGN41ACQV
'SP1K6R1MPEAC6NRKR5TGAPBBBWXWHSKCBJNX1K494
'SP3R0A0M7E0GJYA5VASZRR7AQNX7F7HZQV05P1SW1
'SP2QPSV1ZNWEC655RAAGG8HMAB8B98KD84B2MT2B3
'SP3FR4YBYR6ZK009K5VWQT5DPR9XGVMGPJC3TYJYD
'SP202ZWA253RJHG4YQ4M0MRKAJSM0FQZZMYFA3C6W
'SP3DBZKWBTJ20B8YYC4Q3A221MN7B8R0BTR4BKEYZ
'SP11Z1W6A7HERV06SH414ZE4FK8STF9N244GK3NSZ
'SP2BJYR26JWGF7DZPS3Q31A7Z8E533YRAGC1R3S0
'SP2K9ARZ8Y2WNN607J4854C358D9CGTCYT1R4KXF5
'SP151WSSSXWWHRD39S433P6A5XGHGYHVWPFVW8HX7
'SP3G9PTDQ03M7DM10HJXAAJWKFY0GED64690PH2RS
'SPQWPX2T7MTR4WRSSFRJAD0TGSXSMTHSQEK035Y6
'SPFN9VRY82EW7WDRGGP4YDSFPZ0T6E94QJB1PZSQ
'SP3QPHTM7M8PRNDTHNQHWNTWHF1RM5BR5E47EZEGA
'SPDXRNJ3DHVXMM1DHVCNDY7ZG8BENGEA0DHXPATT
'SPK0FVT38MHJ99B94WRNS8QHTAFDR5RZAVTS3YTY
'SPKHM4YW2CFPS0JH1XDE2X0Y45A63EN3S7RZMDXW
'SPCKZ2HKT2CFY4BM7FP6VGKCDMQPJ9V8N8BFZ95C
'SP105567SH66PJK0PA596WZ4YEG7QTHRYS2SS8JW7
'SP3VRPTRSDB10TXGY3XTJ0KGNGS15H7BTKZPQTCEP
'SP15CWGASCXJ1CH61ZDPPM9TF5KHJQ6KRQTFWK9J0
'SP6TS87748SMDSQ0PZXVQPP07DJHRESQADWMQD4Z
'SP0SZ49NPX3AYJ1Y8CEW41RZMJKYNC8E5PGXYWN
'SP1P7JTW60A05TX17891MCPHE5WNP5E3E426HM7RM
'SP2806D59HGZASHHASRM3GNZ6MRPVSGX14NXPY9R7
'SP155X3K5QKEETNJH6A46MVVWQ0QY1SQN9TWRGDTZ
'SP1EGP0F6AX5T7XPH5163QWX35SQ48TEX8P302T39
'SP2P9EF7N6WDHSX9N2E9MSC384WEK4VE2N7Z8F324
'SP3Z5JWDAA12XKN3TPX169CC2D742AZ461RV4PKAX
'SP0FK8JY7QM65PNYT5XCSMGM4JVSR9FKEVG5WC8N
'SPNYW95FVHJF8WK1WDSSWQFMKAMZJAHF9N10NC2G
'SP3ND01ABQR93GNMZ6PTTWN86A8833Z8163EY64TT
'SP217Y4XEM2H24Y90S0ET77XJW76EYRK78XA4D81S
'SP2SJZMDHHG2F2FFBB0FQ9YYCD6XMX409HRXVNREQ
'SPHRRG2QHDCD4ZTVRJSJ8417DPP017YHXKBX03D2
'SP29RMRYGB59REY1HCDYWVDAN8YK4FD5ZES5S98H0
'SP3XKTKAD4QSQJS3BWAZJD9JRGPJCMHFD1ZW6TE05
'SP1VYRJ54N7B55K6N4HPRBZH2KGZGN8SXNE5VFGX8
'SP2N5YDPDXCCS7KG9C1QZXF4XWVDN14P9A594CRKX
'SP2HMHC2JNXJ9363MDE1G2S4CTJSMDCXG4AG50VQX
'SP3NDPTB3KR6QGMNH7XG5TDDGS13KKTG8HT61RZNF
'SP10WE57XA7RXEVSCN2ZFCF5FS6W12MC5AJBG50PV
'SPD035CRTEXCYF6WMFZVNPPG0965TZM74NPSWXB6
'SP24WRPGJW97SJGDBJP4R5EGHVQJ6B2ECTKKKWJQR
'SP2X38FTTW2MSC6KQR15MYXXPETT4JXQ6MBWN09PR
'SP3GMX3AXTTWZWW29FZDFG65MA7DJSK06A1HV1KBD
'SPFJQ1HKXPHNPK9RWWT6V30B9HRA6HJC0QZYM9ND
'SP2V45PKDV5Z6YRAN9B8GR4RNW1D5PH94YK1X768P
'SP9XKFETDDVXCACG4501SDWGV3R8AEDRMKZNHP4Y
'SP11FM5VJZAE4QV4XZJ2J74T73PE1YSDRHXJ424T5
'SPC6G4B6AWB3Q72EDWNAKGAR2QGZP46RSCWQPPBK
'SP1AG6H6QH0KVS7TS8GAQ8C6TY06WPHJNXWYG5YD8
'SP1TM9JJFE51X8VEWYSWRJRP7QVBFS1KVQCMZHN9E
'SP1RWED16ENYSGG5H5CJBGXNWN7QWPS73YA8QJBKY
'SP3GQFK8MRFMVCSZ5SJT23FW3G1YVS66XDJQSYSD
'SP1CYET6C1EV1JC44VTGX88WGY0CKJWCE7JFB7NEP
'SP2APBCHA5YWSB4MBRHN4KAVPM6EM84B4YFS88CHB
'SP2Q4XFMT9XZW4SEKR56BZ70Z6EF37AJ51QSH3SYK
'SP398Q24ED39YEGPMQZQYNMAGK9ZWV5VM50BMB72K
'SP1VVWMVY7YCM5Y5DJKJNDYX4PVKJD6FQ2K1VJ6JB
'SP10T31NBQFESG38RJX975APAE4QQMJ2E4FD3WV6J
'SPRGBDZFB6BKAPQJ2CKPXJV85DJ5X1BFKRKJRBT3
'SP8A85JKWM678B987NMST7XDK33Z1K2WDEWB5SP2
'SP37BY9E7D9FBZBTB0FM2HJRVGRAGCD0WPY2BVW13
'SP23S5KDYZJVGNQ5MH9E1Y0AP1XHXCJDQTXPX5TJS
'SP12D3DNSKEZXK346B8ZFPES57ACE3CCPN40FRXE6
'SPP1K5TQ3MSMQ7TA0KMGH8S9P3DMCGM6GR345440
'SP1XPCCJE4NR82X6D8PX32NF1KAYYM36B5T83J6GP
'SP1SW91WBX0QN6TY3TVFNR9CGQP93F6JSB0AJ3H46
'SP3MQXSR0HXPBVAM36JWVQGEG0WBNSF9AA3K4K8C8
'SP2QE3SKKZAY68Z3KN4TTJN41BVE3B5QVJMNKJAZB
'SP20D07E55RZDTH55R0DR57XD4HRTA2ZR4TH5X3KJ
'SP284MQ5HZJ22NQRWVMT2MB9YXCF7S1DDZRDPXB7Z
'SP1TPBV9A05YH0N4PJ2E9Q245TSW1VBFY8ZDSK81C
'SP1P2RG9AC0XWFTRHG52VDB88ZNXQVYMXCE4M82Y6
'SP3FCVX6DHZ4G31797Z04SQC8YRPK4M223XEEM62W
'SP3RY185H0R8TNX4PGRYFZ07AV001N23N1FJX9MEE
'SP36YBVZ03EA8Z5RY3FWBJPVYREVPREN17MMF2EVG
'SP2QTMXY124DEBDV27G30QB5MC3SJV7FRJWV15D1X
'SPGTK5GDQH0BCGZ5A39K34P7WZ5GY4TGNGH1RPPZ
'SP1YHQ4SQXG0WWQPH5G4B18DGQ4WACJHN0Y0W5K0K
'SP16TM5YW14TS2539TJFN2D3CKQKJJZNTYQCFTYSB
'SP35VAVT0KJJ2AYNQZD691430Y28ZC0FWXNBNQ40X
'SP19V9VRVC00TXJQYNQ3FGP4V1PKNFH5HPS3F32JN
'SPTK7NQTEN2VZ4DQCZNHPCSECR0PN3NP5WES155M
'SP064CCCVVYMSJCSTQ975HZPGD1M465PRD6DZX8E
'SP34GGE4MGJKGZC4W5XTH2DCD1SJMS3W62FJY7Z29
'SP3TCGJWBJ308AYBA5N2Z2GVF5H9NRS20YSYB0SG2
'SPY472EQXTPGGTKQJA30B930NR8XBMJJ6HZSS4PV
'SP3Q8PGYBB06JW09Y9RCJ52VT9W0GFM7H8B5Q9A4S
'SP183BGD3PTZ1SRY0YNW0ETYQF9D79NGM5YY07KEX
'SP35N08GFQWBNNRRN81R6T384QEC2YN0A2ZD0H6SP
'SP240KP3W1ZP75TE2BQ2EET285JACKK6SZ3DA3G6J
'SP2J0YX7RWKGQZVNC2BBZR3KMTH6K7A9Q864M8FM6
'SPDPWCCSQ9G418V9BR2SVAC2V4709AS4A80WK28N
'SP3VGGV866MC5EKKHWG7G8WZSER20VV1ETNHF8CWG
'SP1FKNNAKV8FJ93YW9W3XWPV0RT385V3ZEX8VJE0E
'SP1M4X4PJ0216VM1JG8FJDXYTJ4V8S37419DB5XHQ
'SP1TNQCNF1J776HWFC7W0AN90V11674PA6YE2H1PP
'SPV8ZDJA89TANS0AYMMKR3TAS7DCP23NYARVVVSM
'SPPJ46KNX2FBMBC956TJN3DY0GDKKHX95G568SRY
'SP3DYM7A95X5THAVE3BVSYEHA6CNHZ7B9H1TH89J9
'SPRESMRPJD3BZT09SWNK6SWGH2JF76M1N582FN8R
'SP3QEM58QG73R25K068H7AJ6CRSRQF52V0B6SG5WT
'SP2XDQWPYYRPB7V0RY16C9S0Z1DXW5TEEJ4F8KVZ1
'SP2X6RSHSEKB46ANMXRR7TAH03T7762QHY26DYMNS
'SP2A6CHEXZG2YNG2V7BKSBFDWGS89WCX8AZ869S9C
'SP27RG7J4KZSKBS0K11B1RMRPGX8W7SJ45E83G8CR
'SP3EV1F10KCJY84GRWSZVEB5MG3C78EAMPDDRSV92
'SP2M52RZ429VAJDZ5GATQA7RVTHDYNAA68HEGHSKB
'SP1PY1MDQ6CEPSADB9B5T46ZDV3S3R2832RMRQSEP
'SPEHHQBZPA4HY8NTA3WP54WGGP0X4C30HCFMKZ20
'SP2NMTN4SJX03G7WA49E58TPBDP3XPGD19E987ER2
'SP79QJDK1XBRECMGBMYXBHH5ANEQ0GCNYDGP39M0
'SP1Z80QY12ZHKVV59KR72SJ6ZPJA2833VKW53JHD5
'SP31ATSC5AHXRJ7SRB3GHA6324D26V3XJ97QE3TSJ
'SPKN5ABDQP5W78763T0CNXMNHP1EH73409E59YS8
'SPYHJYBXH9FJCXT6B8JSPAC48FBWDNZNP8TTP2VJ
'SP27GTERN6CCBBB81K54KJFHR2JEEG13HRS6NPHBD
'SP3YTT9WYHG7KRWCHYXQJWRZY1VJDXD0H40EA32B2
'SP251NZVG5W264ZAJ36KK2GZ9F980T51V2KCVWPJ1
'SP1FGB9YER7MQJSSZ27R75Z1M52XCTCCH9FS20HB0
'SPR91V62C18N6XZ6AWHHRM3P91RPB73TA6TVED8Q
'SP1KXATSJPC4YZAGA2FZAEKASV6VZX8WQRZX8H7TF
'SP23JYMC39PB31HP94A4ZJ102AN1N5ASXAKPAWW23
'SP23T6FXN9T47HJQPAKXKA7MJQVPKB8ZCX3V2VE39
'SP3ZDTRZ4QWN9NRHG1SB3N3EGAA1FQ557X584X14E
'SP2NYD6CP2JVPTABQGMC1ZA5TAVXH4DE4769X1N0K
'SP2SKNBT57ECBV5Q06QD0XEPWRXP6RXC3FEQABFH3
'SP4ENGJ23EYK0R0K5TFVB96JR7AQ3QHS3Z9ZHDB5
'SP3TT3RNCJY4GKJK8AYNJJD0EX32G0A1TCAM4NTSW
'SP2XYX56KRGHCM6KSKTDMF2J2DP69H6HH5X7DCRF1
'SP1F3REX5ZMD0CY6AR96VCC6M5FPJ841JXSP3RZGR
'SP39GTB1RRRQ7DX5P5456JKK4G9TERD8B8YFFTDBW
'SP1R25FY154F6G6J1S2V8WDVMKK3816CTYCV390KP
'SP349TXSSB54EXQ2MXKTSR967TF68V513BHCRR8V5
'SPZJKB3942RCCRM6MHXNSY514AKZ8WZPVB0JDV98
'SP1QC6MZXCPG253X0FVVSRZA9HWCYBW913Y38N1A3
'SP3SJSJPN28AAZMW27YKY4CMT9J6PVXHTXCMBZ1FZ
'SP2KKBZR5WXTMZ31GZDT18KQAVTSHA9Z5KQXB37EK
'SP1WGMJ158TG8XBKHB05Z3K4TB83SMMHHEGHXBECF
'SPF4W4N3S1S6H8ME04WQFVH4MP6E73JK52TMK5D6
'SP1EE2YDK868BX2ZH0KSX896YACV7GXEFB07B3MH1
'SP2HZM4V4PK6T0YTMTQCZ47DN33ZQBBZ4ZAGANAY6
'SP2Z0FJD75VCER4FGSEJP2TK6FX44A9RK43X4GF4N
'SP3FF20H4TXP584NH2Z371ZYC4WKBYE3JCT0DHF6N
'SPYTTRVNNF2WYVMYRW7NV215VDG5S0ACWGK6126Y
'SPEPY1AZMRXNZB7NBXZYM55K3QD5DPRQRJ21W15J
'SP2GWJXZQQ9CP9R6MGXNH01T3RY896JNCCNSJBN0Z
'SP3KCMMP9FQBYWQN9QQ9V5K2WHZ78JGP0VYBPTQ77
'SP1GCTSJ6PA4BJ6PEQ39SE71PCFX0RD6BN63N47GD
'SP320J503KBVP6J4QSSC4Y83VTWX1K7KKY04QBHVB
'SP3VJR6HPGKH5VBMNHRXHPQXYH3P4BWV696WHF594
))
(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))
)
)