;; 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 holders (list
'SP3WV7W60ATCSRAY8941JT789A0DYVFQWNT1N6NYH
'SP1CW0XDACDGQQWTT751T6JFJ01JNMZJQEPRN92Y2
'SP2WMYDF3S39FWDSJ72CAJ9PZRYTW1PKTC0WN5QAP
'SP17BR51JTVDXM97TTWA8AESRSASBWSASN7T47NA
'SP19BVGYWCHZCMAPYY5B0SBPMMCHJ46DZSJJBFZY8
'SP1YHQ4SQXG0WWQPH5G4B18DGQ4WACJHN0Y0W5K0K
'SP3FSZGHVJB008PS8K21A9FPW3FDAH7QJBJQC5AMP
'SP1ZS9BX25WFYGHKHGY399057HT4MBH6TQMS8ZKTE
'SP38WCGSSQJBFAKH77R93AMTHBBEF83DQ6EJ358F2
'SP2HXFYD2BHNEVPX01SKK26N45GBKJ5E3X72G1XEG
'SP2FV4TAS6AVSRFBNPJV9Y97FBJ38GY0PF5ECBSBC
'SP2RAKDJJKDFZHVQMRJR114XHKA34E8R0N0SPRRHZ
'SP30TZGG24XKX9VC60S93TYW8FE3T94CRX4X2DM9R
'SP1XSNRB14HFNAV89NE3VWPVZD48NKPD1TFBT8AS9
'SP49PX512DWJ0JG3D3WJ016Y4R6WJA17QANBQ4BW
'SP3N0TGQW4GDYHCFZ6K7CS6W3JV0E5P7ZFJ99CRNV
'SP3W83KG17KJZZXPDZQDTRQKQRGHNFZN410R9P02E
'SP2JWM4MB1SBY2FT3PG5PM0V12NW8Y4FK1XXWBHSF
'SP3CQKXX51J05XRS0FK8Y98C91FYMJSM97WFHDME
'SP39AHHCMG916GWSN5Y76HVCVGNJ17TPN8EQQC0C
'SP2CYKHA22MWQKV17ZG4NS77RBFP66RG5GETSF2WD
'SP2CN1YSJAF0E42Q9KWYE9HZF6BQGJM88ERKCXR8X
'SPAFRYT831WS7ZRHGZBPMNCBJRBC0ZT884HFXERA
'SP37T1YT9XYAAP6ZEF1RJD1DAPJKYNG9PRCXNGE65
'SP2TS4Z56DRP0Z9N243TZWE6Q423VDBWVEXKNYFWS
'SP20EKRYG9NB8V7RVSAAQP81QFBEEKX23WG5WZ2TX
'SP3QGW69T7Q2BBB6RCCXGN6MCJCH10N0958W3GZ9Z
'SP226ZXBXHJF5502FEJBHFT4Z1QWHYQS786XD1QVP
'SP7ASKVAVB3W0ZZP7WSDCZG2J7WC0WNMQ5XMEGNB
'SP2Y7BAT6DE5JTQZZ7KTR3XHHBQJ7AQMNQFGKVRMW
'SP21VW0V1Z1PWCW4GDFB6WWXFSZ3XJNFHTCYHHEZB
'SP2F0AHP4Y35AF74YK0VZN5AEZCXQK4REKBC0D8M6
'SP2GGHY9C697PSVBNX1TSFDJCH003DZBTCFTCF9ZY
'SP33DNHJ2P3XCB5R5JF0TCA6R8ATG7NJCV3D4R5T2
'SP27A5RMDF3CBPAW2FT361D5MDGFKBQNV63691K3B
'SP2S8WQ4M8X2PQHN5WX16SY9H4ZQJTF0X2BA9492T
'SP9Y9NXC0Y96DKBMPAEY1JT18Y8650NC8HG9P856
'SP2YCEPM1FENY23ZP7V07RRYNBB3J0FB6ZR9CC9V6
'SP3W42AA4NS8MJZDM4AWFEC1VR7KDVC1ACHNNG4AF
'SP17W459944DRA4FSRE1DYTHTVZ6620WS8F24NXR9
'SP1QPD6Z8SWZ0BVCD8NFZD2T3GESR47DWG7K0W7B1
'SP39QXTK86F94AKZQ9KEWNJPV5EG7MSHPEKN1KWAQ
'SP1HVCE9Y1DFGF8VHRPESVGJMXP9VTW0JQRCKMNV
'SP37JGDJSKPGPAB61YX7R2T1S1VSGRKWRE7YSZNKD
'SP19ZKA3X5K5EPPA810SQ9SRJCPKT7CRQJ9E8T222
'SP2N7VSJ2DT9NY438G3VDWYFP3WWBKYN46GQPHH6T
'SP30Z0C24JH6H73MCAKH4EET0JHZNFTPBDMXHEMYE
'SP12A5VQW04XJXDJF8MEDRPV7SMSTJMPZ8PH3FF85
'SP2E146Y1AS3AFJTH1YSCNXXKA4Q9N1B010MDCEAP
'SP1ZMSV53HQXZJ5DM2J3MRE7Y9W7P3129NH6WF6YD
'SP39G80GM8GBVVYCG7QCAP7WM877Z22V93CQ1ZE9C
'SPA4FGXPAS18RC3M669QCC21W0GP5X79JAD7343Z
'SP3R8WMMJWSM8F67SV5PJB13QPT434RR22293H96W
'SP217EMVNRRPWZKG4W1H9ANW8YQ0VQE1HDD2N620
'SP176ATW1PSGH3RC3SEAHGCPPEHDZWD5H45BJ32B5
'SP2AEXNM8EFQ40F7BH7394SCGJBQGSK8ZJ7TKS72H
'SP2Y16V7Q56G9YKSJCMA3ZGF3JHDCTM5Q1PAA1W0D
'SP31H75FDBDERKFWMG73MMBPB7K24P73PQSS7MZGV
'SP2D2MYH0DA633Z7Q9DH9NB2C43P4DQ49A7Z8BSWH
'SP2N9XEFP0W5KSZJA6CBSCR9NH0C3JZQEWAGKARMD
'SP3GJNPHMYA3VC6RE8XD96T456XWKP63PJHP0M9ED
'SP24GY54NBKSQMYT4M95JC599AW6E03JVTEHXWX0S
'SP3XF7DW9K4R0E23BKF9244TEJJM3DN5WWV5CW2Z2
'SP1TGAVF9T8NERQ4CC0G7GKVPG6C223HHTSCPV5WS
'SP25MQ81FEZDVRGK0DBCKR3A45CTTSB9XE8T8AZVJ
'SP109C5RQARERYSKKAXXRH1GFYQT4YGV02EEXN4YG
'SP3X6G145Z6DV5H49MN0P0RK9SXY83ZN4ACM3RPMA
'SP3DE56TYEG29XRB4ARDC4BE42R17WM4GRDXMSA32
'SP2K05MD2G3THY4Y3KDAWJ3YJ64E0BH3ZW4VT6W04
'SP2J6NHXJ9HMPH12J57B9QZVMD9GWR90RMN01MH5H
'SPS9CN96JCX1D5BPKH7ZZJRDW4RFM743RFGSJBPR
'SP2YE97WPR9C184MQ4RVM6AP1J629750Z1N48N82S
'SP1F65AVHS95ZJFH7NR2HV8NT1WP4ECBY90HKHPC0
'SPDJ718REZ9JKKNY49MX6YPDKD33GJN0DFGCAKSW
'SPK5RTKETQQTQSKVXN68DB0DRE47EW0H5ZE8KK99
'SPCPXYYZEXDBKMQHYG6EG9PX59T19KP0H0RJSDT3
'SP1RQ9NB34M47CVE70T04GMY1H88FHJH34WM8MZCB
'SP1D28NFWDGCB957V37DE88E953F5MPT9EHCQX1C7
'SP1EQGZT0WN75N5AMJH2C40N5GBJTEVY9E6ZY8EH3
'SP1D9RSJ6M14EBQTD2HJSCG363DSE3VQVJ73V6K0H
'SP1D67XVMN84D6QWXXQ5NY1DS9DCWN71W3MP00S2X
'SP167KT5D8TF9SP62Z2TP4TN6A86Q3ZRPMKKCGFXY
'SP12D5PGMJ3JA091XF3J64E4Q4RJWFS9VGC0Y9ME2
'SP1RFKY1R30NXZMMEKPB88ASTPXHZ5WRMQZJK9NCZ
'SPGQTT7D2ME0GG4PHE3SYTC1C0A5ES9FDE0J97R0
'SP3SBVR3J1CWPE5ENA2S8EFPY3MQFCTMN5R48E0PA
'SP2H9Z97J0B3159H45ZFX6TVKS9RT3KVKDPGAHJC5
'SP5ANF86ANERXB8HF1H3P4WRXXGMSDZZN78XN6R9
'SPVB01TAGMJSTJGJ86K31W6XJH2FE6ZP181FNC0Q
'SP1RXT9HDGS2Y8WDRA274XG45ACRWEHQ4RGE0GXC4
'SP1230GVR99MY17TBGSQRA85NZHJAEP5BHSNXHHNP
'SP1J3TNSCYB6K75C52N1811F9X7FK2QR76CCCQ5Z2
'SP19QE5HPFEG8BX0RF4MWF6HG645SGZFCT04X6ETV
'SP26WAPM58V7NQF35YCZJMRVJZZTGJKCSSHRG3EM5
'SP3GFPT0WDASXZTHSBBRY3BMWAYEFQE8JG45TGP2Q
'SP2N735R0A1Q0ZFWAMKPKRV38Z5HSF2RB2JB3EZ08
'SP6DH2MSQX2RY27N93PDT3DD15497Q4SPWD410QY
'SP9FCMFW7YZV1HXG7B8109HVV9RKKGT6K5A1F4QD
'SP21GT4YTZX7M8R9JZCS4PYJAB9TP78G54M84YJYM
'SP1W69ZTWVBVKRGQGBAE9KQGNGVKVJ6HVPT370P18
'SP1V6GA8Q33C9GDHN64NVFP6Z29ETRT7N30YE93XS
'SPT8WTCBJGHCYSD6WMPDFJW7RY53Q3CNK32AXM8P
'SP3Q08W1NQHDDMCYRVDDX5B7246TAX768RRQHQC5R
'SPVN49X4V22BQ03NZKGZ0SXD0A7DBZVS0B5R6MBB
'SPKV7HQS3P1DAVGCE7DSZ1TTKBB8P7281NNH3SPZ
'SP24R47HGRQEYEQGV6PEMMYMDS7M3HAG20N92PG6E
'SP26C84S1B9SNP89H5V5XKFX2VQT57VY9D5MKT17D
'SPZ848EZYNA2JNB3HWFFRCX50ZZCNNGKH43WWYF6
'SP2NWP96MFRRMK9QWB7R5WCFDM9AA1Q9C6Q802G63
'SP326V2XN2A52Z1RHDW5M6DEEFDEYZSP09ECKWYFV
'SPH4YVVXWW4VTKBMVMH46443Q0RWHVVSFQ1RP4VW
'SP35CJ4EEJ2N63EB1X4YBHTWQYH2G0AQ4T3QG7QGT
'SP31YF3EWJFPWFJS6GCDZXB5JSM1KMVE5F3RCRS66
'SP1DWF2P1PT2KJ6Q30KQNW6SXSCE8B67FQ7EKJAZ2
'SP3YTE7S599WJAEP6HVZSBZYGJY3J9DZTAD6M8VFK
'SPASYZGVAVRD5J43V0Q0TTEWS6QJJ3YZ8EDD3SGM
'SPXZ83TM8T2J4NY571G7AJ6S94C0E92Z4PV4FG7P
'SP3H46QGCMT9NG994QVZFW8NA0Y0H8KXGT36M7M1P
'SP3M9Z63V65AYGAM6JMWCGT83SBTGW1RZ4VH6WRK1
'SP3QJTXYN27SWD4SY82WYX9KSYA6RFTRBJ9CREJ0V
'SPCTF6F6C6DXGQDBJQ5PWY8NP2FFJV0N3EHKR9P0
'SP2FCVSF4JVZ3RJ44PPDXYMMZDR2RWYXQKTKF6FB0
'SP18K93BC5JC488ZJC2FR6Z5XPFGK776YX35M7HW8
'SP3808D5BDSB74FZ584PFFGAX6A7YV6T3BSAPFTAM
'SPJKAHD7R0EN9MPWRSCW87N08H6F8YZV2XPY6F5H
'SP3RR9ASD2WVHR1BZ949CTQRMS76KEEAX50KW7R5Y
'SP3AVCC5Y94A31EQZ9QZ8XTST498SBNVN7SDHGQEW
'SP40570TNY95JY0FJ0KV0T2TVT26QF4A8J9T1XVC
'SP33QYYBXHP0SMBZ93X7C3YS0B44TQ6SNWGVGKH73
'SP159T3ND4W7AA0AZFJPYY78SWD0GKQG5YS7P07GS
'SP1HPMC5MGG9SMP0373BSE9RRX6CZQX8RWP32Q2Y6
'SP2FY7QQ9F094051MD5J25388KAH8QWSDFJMBV737
'SP2EY2V851XP17H9T5JA1HCMDY529ENR142SBJ3RB
'SP2P9V4Y08SBCCNNBPJFQGRS2AQQB2V2WQ8N3QTC0
'SP1JEPWGZ186FBB2NFWFHWZKR7WVCGT702AAD34C4
'SP3HR3C5RNWXPYA8FHY9CX3Z63KHZ3B4C8KSGX9M
'SP1SB8RKRB6WH7SHWT22MDV81EB4WR4EBBTR3XQGV
'SP3ZHKTQVEZZS8BSGQ6WW5R0A2FF9JP86JDYAFS8E
'SP1C5NRW6QEWZS6XRB48NTAF1NV6P0RFZ103WHT9T
'SP1X1W8A2JBKDZ7Z3K187Z4PMSAAYY6K55RYQ3PF9
'SP2V1GXMFQ5DTG0CTZV8A5NP82YB49KR6NANZRKAS
'SP2W6E9GMMW3SPJYFQKE0HTDZP3N8A0F2TFR0XM6N
'SP168T5K75MJC81DKYBZD446PA9J7DK1BE2BB4J7D
'SP1D0EGN0P902H6AJC7PZANRHBEPQK2J77NF1E0FG
'SP38FH5GMT3VBNHHTE7TPAEVMYWC4JYJC8DYDGNV5
'SP2R9Z0GVJM8E7PZ1BJHZB4EEMN8NH3GXJ1Z009DQ
'SPDJK40NQ5ZMWAQHRFSHD343W11N5X11RSW9S3JV
'SP2C03ECP3ZQ8Y3KTJK76ZB9VK13XS3QTG34HTFN5
'SP1K9XSS237TSPCAZMQWCY7QPHZZ28BBJ34AM4GTH
'SP8V8HMPFPCG065K6SAAKA9ERP59FS3MYDHF4GQ2
'SP1DCK2XZ3CV0CC9VR3SNWXPSN8GBSJF3MKZTTMEZ
'SPFGV7109AW8XG2JYH61HDV1Q6WXNRWXAW2VEZB8
'SP2FM8PQYC9ZQV7P96C9QBVKAKDX0GD3AP1X5M67V
'SP2W6T9TK6XBF7EAW7J8DKEWXXQBY12ERJXPCEC95
'SP2JAQBPJB4R2ZN2M2Z5ZASR9FZBCPRHSM3EP043E
'SPTPNXZ0X0M3P48711G90572ACW1VPGEMYQPSDME
'SP1N1ABXQ9KWSN6YK7X4GQ41PR0CCR5ZQSJPNMWD
'SP11H0PT0BTJPKBBPB3VG0DS4G5RJYJZ77PT3S0BE
'SP2XEAVGJDQ67GX3Y5Z2WD5Q82NQWC3W4BCXC5WBG
'SP2MAD7QGFPRZ56CETM2120V3QKXGF2VZC4JGJB6M
'SP29B81BFRD0Z5YB8GCQSWG1ZF7547X97BMKKW4YN
'SP2HD7NX7984TQ2TFGR44NNT6F8JKE13VDWAD6XV3
'SPKA0AGTBCPMJZSD5J8RR579ZBQ8VY0WT7MJWF61
'SP3YGVZVW98KRXQ13ZPJRE5V1EF09KQ9VAP6V68QM
'SP38PEHSJC0QNFNY78E4XJEMFZY4DHHGZ2SCASXFN
'SP3J4GVC66ABAQ3NWPJXM4J0ET1V84RCGQCNJ5HXX
'SP1QK6TBK0QRD7CSQNP9HRKVV4YYWXZPQVJYGT4B2
'SPX64PRYQNW7PJYP6WT7WQ1KQ7NB413Q7N5T51HJ
'SPRWXQ6TXXXP3KW9S1ZR1Y1T4Q5GQFYZS87QWJEF
'SPGEA24Y897P1RXCJ58MX88G5TYM8CHSQ0K4R6TF
'SP2X16ZVRZWYSRQ6BXFZ9BY3NGW9V1YRTW1SCZ42F
'SPRSY1WDEF83JTQ3562FZDQFEWME1MS473BVNDW
'SP2FXS5GJ42RFM8481BWW9JP8KC8R7ANQ9F83S7WK
'SPPQJE4PHAYCAATDGB00ACW27PFB90J77CY8D7BW
'SP1T3YBGR02J6RB7MKY000VPCN4REJB7FNR4N3M50
'SP168YA7P8MCFFH389RA9BM8ZPZ6PBFJZ4A0PA96C
'SP2F76VX3Z933ECBWHFMF1W175TN900N6Z1Z40XR8
'SP1FENXDDVEJVQT9WFPH2HRJ8WR1VFNDKAEB93GVD
'SPTJ12GPSGG6QDJ6MTJFPYADEQJ4MMKCYY5JZFBB
'SP36DD0N317R3AJJZA1ZT1M3GCAN0C2QVG93EC87V
'SP6XX758TP0K80KZ3FBX9W8JKNCRXVQNWTNDFWC1
'SP3F7G0TDX68Q391FC8H9DWY2C6TFB2XDXCMV4Q41
'SP18QG8A8943KY9S15M08AMAWWF58W9X1M90BRCSJ
))
(define-public (burn-mint)
(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 zusdh access
(try! (contract-call? .zusdh-v1-2 set-approved-contract (as-contract tx-sender) true))
(try! (contract-call? .zusdh-v2-0 set-approved-contract (as-contract tx-sender) true))
;; burn/mint v2 to v3
(try! (fold check-err (map consolidate-usdh-lambda holders) (ok true)))
;; disable access
(try! (contract-call? .zusdh-v1-2 set-approved-contract (as-contract tx-sender) false))
(try! (contract-call? .zusdh-v2-0 set-approved-contract (as-contract tx-sender) false))
(var-set executed-burn-mint true)
(ok true)
)
)
(define-private (consolidate-usdh-lambda (account principal))
(consolidate-usdh-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-usdh-balance-to-v3 (account principal))
(let (
;; burns old balances and mints to the latest version
(v2-balance (unwrap-panic (contract-call? .zusdh-v1-2 get-principal-balance account)))
)
;; if doesn't have v1 balance, then check if has v2 balance
(if (> v2-balance u0)
(begin
(try! (contract-call? .zusdh-v1-2 burn v2-balance account))
(try! (contract-call? .zusdh-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))
)
)