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

Functions (6)

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