Source Code

;; 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
 'SP1RGW2YQ6W5J8KCTY0MC30AHVX1XE7GS9A6YM73
 'SP38F139KNGWV4GNPJYGRFHM0MG4NKEJ97T7ZTT41
 'SP2XSZSQ8XGTF4R1JT3HEHRZB2TD8WWQY939ZSNGQ
 'SP3PA9N3B8QWGT59NDW1NBBFWSBC6E75TMPNVTR5K
 'SPDEGTZQG6W1ZEMBYV1Q0S1KDXJXX7251A30R1KX
 'SPJJZHS9GS25CXJ6KKG2J1AJHQDX85PCC25NZ65E
 'SPDBCT835MPD9HTDTN56WZX9J2STSQXY5M3JJ5G2
 'SP1KWR3XZFQCMGXYDHNSTPPXFHRK6N0QPTQMEXEM8
 'SP19P1KK851T760FKS8RNDDAGJ77HRZ60B6BSRQYA
 'SPH40Y15AE69ESTBVV36VX3SKS7DZT111ST4SAAS
 'SP2TBW5EM2JEH10756JC1FSG784P0SVYZ9F2ZBJ7K
 'SPR9P7SWQ410559B9S7RSNYYV90ZRZWJS9JTS11A
 'SP15P56F24FAY09RVRM98J0NDCW2P3JTDWWK8RQ1J
 'SP3QJ7C5GJ8WWPE5QXP2D6ZKVDXDPX401S7P4Z27S
 'SPPC8T7J662VJYJM72JS6HV88ETMKMFV1HP9TX2F
 'SP10ECZKBTMVGV9Z41A9QQP80TQFZK2QRSV5BWNMX
 'SP1BS7EF2KY09BPN7P4WME9EBFB7PEQCE44V6WDXG
 'SP30Z4TB1Z40VQV6XCN20KXCM4SQNNBHGHDC8QYTK
 'SP2NZCDG12CPVMN2KJ96CVT3DH32GTW247NC72SMD
 'SP1SWWDSEKPVS8TA7E4QYZ2ZG9HD6T4K09MX96XFS
 'SP94YN79D00S42WDQT6WG0DH4JVYCSR060ERAQZ2
 'SP2K8KMB5KFZHHPEGDH0X7Y8KVQSG3CYHJVSX3FHQ
 'SP7QR1PX0JZFJWTYB588K9TY2ZZNST3AJHGT5DJ1
 'SP326H2T31PKEBR5VDPDG0FCHCGCBKFCN61Y5V8Z0
 'SP3B46JEFJARTR99JMJDZWJ5AK6FXTEFKX468718V
 'SP3TZEC9PYDZ3Y2F5RMNGFS24D1CDPW6EW8QK6616
 'SP3DPXHEAQ34YVNC7NADP1BSYXWSDTW9KW6PGTAM0
 'SP2M7K3YM8813404G1R7AXV106CPWH0Z5ZA80JVAV
 'SP9469CHQ3SZB16XX7YNM0QFEQCD3WA3D85CP6C0
 'SPY9Q896GJ209XKATBPBZWXB90BF369DD2CM7R41
 'SP28M9DGNGEBAFX1G41DHDNYX0E6JSKR0CFDZ12SS
 'SP2EAW0J3EW0G80KQW9MFKJMD5E20EFG2YMKTEGJG
 'SP2EX6YKM52T7GMCTJ8E2CTGMPVB4YBTJE5R0QZY5
 'SP21GTVTEEDQBBQSK6FPEG4G4XGQRJGJDQV41CAD
 'SP1CYVH4G1MBZVQ3KGQNG1AH76FM6Q0P3EATDXD3N
 'SPYA40P5WD8HX0TRD7VNVGDH9XC6XPWPCEP1K2JK
 'SP1R305P4D80CJE2S51N76Q5BH6REM8SA9BMVWS31
 'SP14FT7FNFKY9WX5NW9Y13AF6DPFVQX42Q9BKW72N
 'SP2C70M13CVA7ETHWFZC0HCESS5YNF60H8A9EZ21C
 'SP3JQXNYN38RD9K2TAXAH8Q7ZX496KBX8HHQ7DE7Y
 'SP67BWNC1T3MS7QZDJBYER3BV8ZWYZ78Q1PGCJJN
 'SP1NGXZMZCARCG4FSHXKR4TJ0FHMZ3QPH5JA1YKAG
 'SP2Q1KREVFE0F2PGJHJ5BD5JF5BZQB7JDYD4X135
 'SP3MP1X4QTENV1YEVJPMVY0999CY1QY5DZFBM40KX
 'SP7A9RHPKB5X86TC953SH78ZNR5CZ10670KWXGZ1
 'SP10QCM2TWE8Y9XRXEZ4BQAHG7ZZ1PGC1917DQKVS
 'SP2KCSSTRDX65Y2RQ9MG6GH0KE7KN34Q50F1N112D
 'SPC92KKHGWRXAJD30ZHQA041X1R5Z3EHMWYMFD3G
 'SP1ETKME4D2XK2FJT9QXYA4RHGMD7RCNFJ3K7FJC0
 'SP3NFK4DRQX7X3TA9WXPAPEAT0C075GD8HHQ475GV
 'SP25516PM040SYQ8AYS9TXYPDKWMC2BKGD110N14B
 'SPSN6K776CXQBFSVM74W4SAR8W7HCQD6844FA4XC
 'SP2YGK04Y8K4KP8N2F9BJWS98B5VAP3CBECMZRPT6
 'SP13SS7D4ZYZCHCZPHW3FQ947HK42S3NJ2D23N7RJ
 'SP1HKB727V3376XCZ1QFB72R87HYMQ8WA35EEJ5HX
 'SP1AZY7BQ6KZT0TSYR09ETJ1T0T0ZW1QEEJSGCP9T
 'SP2D21TSA9RB2TXT67E2A0K76JVG1NBEWC93FZE8Q
 'SP1GFK7WJCSGP3NGTW28J7N0897X83NA5VM2S78KT
 'SP2B1PS860593Z4716AK7NZ09M7JQE8WB3WFN30PD
 'SPKSDMN0XZKR308P16DWBZVJBXSN7VAWBW2GQ24X
 'SP3KF7Y9P26SHJRE8ANF8PPNDTYHKTRYD21AZJKKF
 'SPPV60Q4TRZTZTDWEDJ88YM43GNTTFBFG6SNRB15
 'SP1ZFYA52KJP45K8PEW75RC47D26ZRFNSZQRV7A4W
 'SP12HD6GCMDS9ABED22T6K8SDQN8SZFWMSJ97XXBP
 'SP1MWEGQN4BXJ0DVM9NA4F4PSVHQ5DPYFWD3HCXWG
 'SP1W5JFC35RG7PNDGAZ45S7CJXNBYG55BMB18VY6X
 'SP17M7R73PMX0FWPHFMYT2CN0Z94P95D9MS9Q4AA
 'SP372B3QPFAC65VY7R68GK4Z8WNRZ74NRWGWM9W4F
 'SP1RP1T219NCCH0MPHMXX24JCCEMHARA4HVTH30Q9
 'SPVCTW1FT0WTPRE73PHZRX0DXBB9YQ0W992Q6QZY
 'SP3P6JN3G14EJCEAVDC56B2J6JE2NNZMT2Y2GDMF8
 'SP8Q4FZW27NZ7B4777179YC5GFGKG003JFDBM6SW
 'SP1M2KTKG2HK0ZAKVYTEN9DF7Q00KC5YMDWK263CK
 'SP19ECAYACEGGD56T9CFNGRQJC32F8P1H50EATCHX
 'SP2CSEN06SXV51PCVESBZRYX86D1D7RDC61PY1MJ9
 'SP2GB8MCSPVQRX2M7ACDTKS75DHA0JQ8GSD5JJ8ED
 'SP3WAAYXPC6WZNEC7SHGR36D32RJPZVXRR1BG0QSY
 'SP3DGSR08ZWWPKKXXFJ91SC2JQ0HZZ1JC927DM58Q
 'SP2KP0K1AYV2T39Q2FKJFVQG9ZMG90DPQ7JRMH3BG
 'SP2V2B7EMRA7VYF6NJHGZFK406B6R3WDC9FRAWBXV
 'SP25FAA28RK4TAPQTVMDQAMEHC85T0XCE193RZW5Z
 'SP3YYZ4ZEJCDCQPM0PZQN0ANG77NXG8PSGP4P1XDY
 'SPND5PH1WZ7SWEVT3MG59P66R04ZWK6H2QV89NMX
 'SP2QPSV1ZNWEC655RAAGG8HMAB8B98KD84B2MT2B3
 'SP3MZ2ZRQPZCMDAJS419VF8TPYBESD18N0SEG7GWC
 'SP2WS5H3ZSDBAYZM2WFDC71CNKQ8P91HD6JN41R8R
 'SP2MVFGS9Z6Y7WA374JQ2KVR4081C4Y8MWNCKMH4F
 'SP3BE9NG66BR10RKR2JK14KPHMHFEWP2FK0SEEYD8
 'SP1N4AD8N1HXNT2KFEFH3302JK504ZPGVERS6AC4J
 'SP3GPV7YEVS2VNFYYXEJA4HWXA0HFX4SMFK9F12P7
 'SP2JPCDDB900AEH4MY3X0KNAJRHSPDN78TN91HZFM
 'SPJVBHM3HAV9EN0CBR8711ZZ3H5J5HS6J7TP6SS2
 'SP14EBQ926P4APDDMT6VP1F0X867F7Z2TDW5CV69A
 'SP3VJR6HPGKH5VBMNHRXHPQXYH3P4BWV696WHF594
 'SPBN2RYDXB4231HJ2GHFFRGQ54X0SBMHFVRAVCW3
 'SPXYZ93BG3ACW8MMF85JXJY9WNRWHKY9ZAJ3EY2K
 'SP3XRPJ492YBM3EWA1ASCC6R7BR37Q7VVJG8CTZCY
 'SPM3GE47QTMMVBT6DH0XFBXYS1AJHSSAQMYSB4J8
 'SP1VVWMVY7YCM5Y5DJKJNDYX4PVKJD6FQ2K1VJ6JB
 'SP18HCFMDAMZRV8321E30BESXY478Y2PAT5NGT6KP
 'SP1CPCHYC3587VW9KXFMM6CYFGQSHYVFVM4YJ64KV
 'SP3R13PE2AKD5YQYSZDDVZR483KQFW6SWWX4J95EV
 'SPYK333RF00HJN5X7AS18Z0WZ0AQAF5Y53QGN5K5
 'SP320J503KBVP6J4QSSC4Y83VTWX1K7KKY04QBHVB
 'SP3RNM0MHCE5HG54CKBBWT8RSK778PB315GZJV9CF
 'SP3G9YA8J5WRE4H402C9DWS970V2H8801P7SGSXGJ
 'SP2Z0FJD75VCER4FGSEJP2TK6FX44A9RK43X4GF4N
 'SP1YMCJTJA48FT8NK21QYMAT3E9QW1BQECXRJ9H4E
 'SPQQH1D34ZT5HV0ZP1NS3MQ5RAZZMTV98426MGK6
 'SP284MQ5HZJ22NQRWVMT2MB9YXCF7S1DDZRDPXB7Z
 'SP3WWBGPYWTAY35ECC6N37JMRMSWF50V0HNTV7R7Y
 'SP2CENTECQ7E56WPVAAAS1BC8NYMBYMA60PTGH8N6
 'SP3T8XVBX10T72WB2E41ZTS5NCY85WC6YMWR2QA6K
 'SP1KP9E4V26VP4DZEBEH9JMSYDWRJEY98KHFFP2A5
 'SPDVSGNH3DPYFWCKEB9E2RYGC3ZSNY3YYV0MNBSP
 'SP2SNQHT55ZM0TBF7DD0TA39XM652QZ97E3CXN2SJ
 'SPDAV1G8FQ0TMEWKVE0A9WS8RNDJ7K808X2MY22E
 'SP3JVN3R6V06S4P1P3ZR8NYXQ9B2ZW50MQX5HZ2C8
 'SP7BH6A5B0KJRDBXSQTA7VZGS2WSY43R0RE3FNGT
 'SP0DB9ZSN4WMPMEXH8JAF6W52FVW6YFR8EYVG36D
 'SP3BVFQ2V6Y6GBZH5CBDRC3RKMDS558Y8K6VNNVXH
 'SPW6QQH9TG9RYHXHVP0HMA93W73P0RX9X09DAT43
 'SP1BR64WAF7CPA94MMZQNHBNR0VKNP75V3J7VJ8J4
 'SP1MDNST2SFPEN3E6JK0FV4A10ADFXPJ3RHBX5GNR
 'SP3RW6BW9F5STYG2K8XS5EP5PM33E0DNQT4XEG864
 'SP18Z4YJN28E0H6P84ZPYM7VCX0CFV7WDFVW5PVGH
 'SP32MH1B14Z94H427XE3WKMGFABFAPKR2Z04ARKM8
 'SP8FKA0NTGX81YZ74VV11G4EEX8DS57X7JTECD39
 'SP1VGCVHAK3ES373NRGTHGCHHDGZRM5CHPPR7155Y
 'SPD2ZW7DKNM0MC3ZNMJ8PJ3E3HDW36EBCMSMZ9J9
 'SP19Y0Y8H6CKJ1ER8A1HBPVRWZRKERHFAB0QM4006
 'SP2AJ6R5EN5ETQRZAJA7751WEN28TCHNAW2N617MQ
 'SP3ZS1SDEZ6WMPD5ZTJH4T39ZS98JXNWQBEZT7V63
 'SP2977CQ74EE2PJNR49JREZRGDF0KEAPCV46V4RZZ
 'SP2H4E8EV3VZ68CBYX54TRYM36XQKMP06R5GAS820
 'SP2217GNKAZE87P0PWSF48NBDA2RXAWJX4X2T2ZC3
 'SP16JSAMZ0Y7WCM4530QC5G4RJWDEVCMZT6BBBXEZ
 'SP3AFRZB88977DBXDGT0C2KJ83DYBTZ55V0TMPSK1
 'SP1A1K7NB516W63DCVNZB2X7SDSKBKA384R5JZ6B8
 'SPW8JW1GERWDCY8XXEKW1TC939547DCMW1M2XENK
 'SPZ6A8A1SBWDG9FGR9VHDS7YV56DJ0NGTZJVD0HK
 'SPE2JK3H4SYSBCVNSS59TQEWKRH4WCPXE763Z5HN
 'SP37RDE98RJXSTJWTZWXBP6TKGHGZG4Y2T6W267XK
 'SP3502BW2YK4AJ8RQAJXS386VREVQR9ZM69X80PJV
 'SPF8BVSF0C786B5EGZP94NF6Z3DC22X446FWTHGS
 'SP3GJG93GXXS7ACMANB4N0QDVE5FB5PCW6J8ZZGZS
 'SP3SSTB4J0FTBJ4VP9QV47NKDRVYBYT0TZT4G16ZH
 'SP2DRR2KC0NYS16BCSKQ41YD9P02ZVDKPHCN3RY0E
 'SP3WJQK5J161R89ZQ3XVC3FRGTNFADGXTDZEPTPSH
 'SPVA7N3ZZ2NC57QY9QTKXRBG44H6FFJ6XRXNHBPN
 'SP14WVKM26S42WHJZ96TVW9CWGCJZWNTRXHXBXXMV
 'SP1CCHTKXSQ78J9NKDEBBV4G3JYMAZD4H9VV9V6YF
 'SP2GN6P8VMVNB6QEFPK2GTYDTMPYRPHV2ESQXHMWB
 'SP3XERP8C2B55TDWPJKX107PBPKF5Q6A2786E66X2
 'SP2DMYHGKSPVH1RKGE2WVC1ZEKNN2N6NCZNWBCKPD
 'SPQ5CASXDQ1T8AP00485GRDVQQJAJJBCM1MBRQWR
 'SPBV448FAXFK4ZF6SN790RB5TXB0H0N6F2WQKGNY
 'SP27T6FVTK34PK158XTG31WR7WTAYBDY7Z3Z86EZY
 'SP3TP7WJHR9HFFBJ0KCPXF31SQJBENWVH8Y0G7R1Y
 'SPSDYWE4WWWV64QCK7JAFVG2HKYR2H4GR2BF6SBV
 'SP3R62DE17J9P0PB5Q1BJ5P3Q3HKFTBPPPQXGCHRR
 'SP3J0Z8YSJD20TGEBE6M992CWFDG18VB0PR599VY9
 'SPJ3SVV94JAAFGZZ648A8T17Z41E8V3812QJMKYZ
 'SP1NKQSVJHCC2331A58MS4HXTKWMAV5ET2EH8HRJG
 'SP1W3AVSNAHMYTT4QM8YN4QJ5DZ7P59H8JZ283FM7
 'SP32W5PFR8KCSF76NVD6HV51W79V7PSZTMAB4Y8S7
 'SPJXK1Q7669BA757VPAWTA3WXN0P5ZQ88GB3KEK3
 'SP3KBZPFPHEH797432AG3XAYGX314N06PK150SMYE
 'SP3WHN0YN399T081XW56D88BHTBW0SXTMC0VX6B07
 'SP3A9XXMGTHQ74E84MTBDH9H0SZ9BWQMX1N1NRFBD
 'SP198VE56J8EWSMJGAW9GNZDSD4CRJAQ73TC5E9AT
 'SPQCSBJDWDQX9YV7GG8EGSSDZFYNGA572ABT59DG
 'SP28QNEDM91ZXJ28VMW5HC96HMRJSKW4Y4T3T5M78
 'SP5WSX55XFS8G250K88DNRNE9QHCMT4F53226CVM
 'SP3DZVP5FAT5B4QBCZ3CF0K1Q2YBH32CSE4PW2A3H
 'SPRYBAJ604EXNGQ7QR8FC9PKEENVYSBSJX4NWRYR
 'SP3PPNFNXE90TG9QWJ50B3J625FV7YQRTHXJWH2TE
 'SP3J03QGVFFM85VHCFPBQN1A8VH65NY9BBX15JEQC
 'SP3XZRV3SPRESMTSA6F35EZ2KEWPZ1HXYR0MQMPGV
 'SP3HP7GHSK8HMJBQ9FHA1TNC8KGH8DP10NMV5YCVZ
 'SPFGMF8AHM222V5K6GDDDST4NV0H37NHDE9XH8WJ
 'SPQTH450ZXXNFJJJP1THYSJB4PQMC5SSQ2VCRJW4
 'SP2YRWK8QKMDX5RHK7K79M890MSFK3GTDVVE3XX5M
 'SPSYWGC3CZ6EFV0V0RNWD5X8TW1CQ4Z6D0H86ZXJ
 'SP18PX8N87CXSGCMXM3Z2AR9ME45X9VDTKXR6FMY4
 'SP64VBVG7BM0HCSKP7SFAYHC97RNB4M0KH5R55X5
 'SP28YG0T8Q1S4YW9XW1QASP6Z6BAEFQ45J5S73G1Z
 'SP3M5W90V9704BSHK054H8ED718VN5PEV69JH68ZE
 'SP3B6H5M2WC9K0A8B3KVSBMD5Z36P35JXG0EFWXMJ
 'SP1MAVN1K5D9JJDVFK6RMJABE6NAV4K67G2SG34ZN
 'SP3PKRBPR9JVA3C4DB1X6AB8BPWWMZFK158GC7RA1
 'SP1N29JZHE36RR6C0XD4HC9VGRJDC79Q2JY6WCKW9
 'SP1N6QYMS4771B58J5WDQMX917F2ZQJVD48RJH047
 'SP1AF7TH2DDN2XCFFEVXKF15VVYW2X68CDQW3G4MK
 'SPT6A1ZY975ZD0TW5SP128WQWTQNVM4ZC856KZQ2
 'SP3KKC6R0B75CVF7F5PMRJTRRVQ8J3BFTZAJZGHAE
 'SP9XKFETDDVXCACG4501SDWGV3R8AEDRMKZNHP4Y
 'SP2YW04A60AY7YSGCHDDXDGFYFYSWC8CFVHQ2NEGG
 'SP3Q8PWSVZWEP5B2VX3734P2XH3583X8HJ6PJQ37B
 'SP2CW7DNCNH6Q6V8C7S1X87M0NZ72E2MCMX6DPMY5
))

(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))
  )
)

Functions (6)

FunctionAccessArgs
burn-mintpublic
consolidate-usdh-lambdaprivateaccount: principal
check-errprivateresult: (response bool uint
consolidate-usdh-balance-to-v3privateaccount: principal
can-executeread-only
disablepublic