;; 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
'SP2C25B1DQ60ZJDCBAY1FVT1KAEGJXR5RBN9HRFY8
'SP2JACZ2382Y6FQXY2YWZJB8X7PJCEZEHJQDXCMW
'SP13QC2G49PXXA84H083Y1PMFS2PGXM583HQ8TQ9F
'SP3GK0DJYBGTAFXV6B92YQ96FV8GT5AT5RWBBE3XY
'SP3A09H1JEB4F85FZ6XEXRSZA210SC6RB7Q7V7DAF
'SP1R2DHP2TGMY0KR1EBQX6TYWT0Q1ABZ2HB4C049G
'SPF0V8KWBS70F0WDKTMY65B3G591NN52PTHHN51D
'SPQC38PW542EQJ5M11CR25P7BS1CA6QT4TBXGB3M
'SP206SBW46XK2PBDAXSFDDB841ZA5KXAW2A2KC9X
'SP3VCX5NFQ8VCHFS9M6N40ZJNVTRT4HZ62WFH5C4Q
'SPXHTE0ESYYXCYT2PRQ5XZ8BNDQYKH67759CX5C5
'SP1FYJ31NEE8BC1XA822HNN6YZ41AWCC6RVNZNAYC
'SP2VJMH4GK1KTKX9CSTP5HKJ83A6X3K4C6N519943
'SP24Z7C1VBBEQ8Y988E6CCR42MW8F7D37BVKK01TA
'SP2W8FZ2WRT6G86Z001CA8TP717H4ZHTCVBF7FXF6
'SP1EP6854YZ8QKV5AVY613BDFQMMEXBN1FRHT2DFZ
'SP1W8ZGAFPWSCV30XJT5R88BS35MSBC98QFNB1T2
'SPM923TSGVG4VZ8BJJSC6VS4PTWBT2KPG5FRNKHW
'SPH0VEEAVXJQ9G6X5M7K6S3S1VTFE9W24P904EE6
'SP1A02Z9HE18BXC2800RWXDQW4N7Y128CQHYKG8T5
'SP1N7EGJF5QRETBA0XPSKQVW8BFY0CRR7121E5KT0
'SP38QXTKKN29YTHJA2WVJ37X7FF7YNDGP3S63YZR0
'SP2XSZSQ8XGTF4R1JT3HEHRZB2TD8WWQY939ZSNGQ
'SP2AH81APQ7DWCKKPHVZK1G2NSSECQ3E9BCJZEZDR
'SP2WCGD4T8V432VF1866PKN7B313FMRKX795BCME9
'SP159A7QXQV1TXC7S9WT9MB7F23WKP8C5MN6VNR98
'SP1RS5ZXK8D8VRNBGVA36PRCS2EJC4C0SPSKW7JN
'SP1CHZFQGJRJY1996KXJCQHJ1ZP1NGQNW79FSWHCV
'SP2M5M7YSZ80RDY498CHQY102NZN67N2YMKYMZBTA
'SP3GCQ32DAZK2RMKKEJNX1ZKHV6930NEWEQPYE55P
'SP2PJQRYKT9RD49852K6KYZJ5NKN4Z73W2Z0R3G0K
'SPKMGTEJ2BKH5GB13MH2VYQR96F3A262A09V18HS
'SP23P0R5P0JWA3HM72M0C4H5T0MR0MKQP6NFAZ3FX
'SPR9P7SWQ410559B9S7RSNYYV90ZRZWJS9JTS11A
'SP2SEJFX7WFGAEGND27NQKZK90C0HWDA81DC0XDKA
'SP1AX2ND6NE41YNN9C0SDJV2N11X7684RBKQWB9XD
'SPBN2RYDXB4231HJ2GHFFRGQ54X0SBMHFVRAVCW3
'SP228WEAEMYX21RW0TT5T38THPNDYPPGGVW2RP570
'SPQ7KBBP7MPVBGBDFBW17X4C07JPEZGPSX4XZMKK
'SP31YB1E2VCAGW2DKGGNH82ZEYCF7V3P7CZ61N89P
'SPKADNRAH1R5YX16SFAR0M1NV9ZT7TNR2YE9TJDQ
'SP1BS7EF2KY09BPN7P4WME9EBFB7PEQCE44V6WDXG
'SP23DZ9XYT3YNF70MHAV9Y3622H8B3DX10WMWT2T9
'SP1Y55BKDEWH87C6V2EYW3P74NFVKDD78M2CHW2D2
'SP1GDA6DQ953AFSX06SZBZ5CRT1Y1YKD7RQ3MY9TM
'SP1JGPW1B6QYT8R5QJSZAY6SYGN0Z94D1P4PEA5R6
'SP2WS5H3ZSDBAYZM2WFDC71CNKQ8P91HD6JN41R8R
'SPJVBHM3HAV9EN0CBR8711ZZ3H5J5HS6J7TP6SS2
'SP1Y7GQJ3ZSC8MGGBWXGT23V6R1QYR98WW6ARCXJ1
'SPXY3V5EJPFFTD9GVA69MZHYBS37EAHZ84382E6E
'SP38XSJ91XTY6ARN2W58AKKPBJAJ0AM02W1QJ497F
'SP2EX6YKM52T7GMCTJ8E2CTGMPVB4YBTJE5R0QZY5
'SP3B6H5M2WC9K0A8B3KVSBMD5Z36P35JXG0EFWXMJ
'SP2M7K3YM8813404G1R7AXV106CPWH0Z5ZA80JVAV
'SP2TBW5EM2JEH10756JC1FSG784P0SVYZ9F2ZBJ7K
'SP2YADQRAJ4468KEX4CYD4MQPF0S6QYFT5BRA22J0
'SP3TY4K8XQAVVKA0KMRKBZ6K2KF14YNFT6KDBGBPP
'SP2QTMXY124DEBDV27G30QB5MC3SJV7FRJWV15D1X
'SP1T6AJF7VTGKMJ8V683C0N7D21N6YG1N94XKQDNC
'SP2H2EZ40ENSJXG7E8F9M8JPQ7TEQYBF1XVGFZ96X
'SPMQAMQP7SD25HRENNHHRK38PY5M2AE6SWVZVY56
'SP86QENQB6S45M2BMPE7Y1XJ76FQA4J5Z5WA5D9M
'SP28M9DGNGEBAFX1G41DHDNYX0E6JSKR0CFDZ12SS
'SPPRXJMKX3XGYTZJJEZ6K2DD9ZXZ7820B2JRE3N9
'SP28SX5ZZ42EA3MMFEA9DESQ7S2SABAG64H9CE32S
'SP7W8H80QZHK2B180XJE9YT5F6138CCBEEMXN7R9
'SP3NFK4DRQX7X3TA9WXPAPEAT0C075GD8HHQ475GV
'SP1WDCBRZCVJK60VE5CQSDZMMGGSD67X93QM7M4WT
'SP2N0CKP37N6AXYE9G01N6TGA3CJ4SQKSP7QXCAV5
'SP15GNDBDXNBKF9TMWPT50BQSKRDHSWMKHBG5ZK3W
'SP2Y55WKSPB1ACM5RZDAKPDKHECZJD4GZ4V311NP7
'SP1D0DYDKRSF5CSJ7QNMJZEWKVEJWSJ9A8T0V891X
'SPD3GN4XX5YFMNVJ8G2R36942Q5A22XZEWB3RXA9
'SP1JW6F2SEY63JTPFWQQA84NC27STMEQJF7KMHQSJ
'SP18SNBNW992548CV84078T7TPG7Y319C4Y1BS8AR
'SP131184464RXY9458XZ14317TDC0JFZ7EZ5G7PCV
'SP2T186R4C6RA0CJ45VMFQVZPJF5ACTM8PD9WX0D0
'SP1GZEMZ72TBKDHV48S6K7AECMNCZZQ421235X8E5
'SP82VQ93XW6D8SK190ZPP0J7Z38ERR2TYDGCT432
'SP3HZ3DK488ZG743MPFSG86GKWDH27WQA3262BPK8
'SP2NFFXS9D8AJTNGP17YXH2P321J0H2KMCMVPBYYE
'SP3G5RZETXZ4WB7BWCMF57CF7DSR56M0BHE32VB9E
'SP354C6ZDHAXNN663E92A1P8AFYBYM424E26G6VMV
'SPQQH1D34ZT5HV0ZP1NS3MQ5RAZZMTV98426MGK6
'SP39CW2CR0VMM931KC1VJEV76YZ1RX4ATAZQ3MV6A
'SP8YSRK1GXZTPNGRYW06M744FVTQSKY0MWJ2KE2W
'SP3BE9NG66BR10RKR2JK14KPHMHFEWP2FK0SEEYD8
'SP2CFKD8EA5GJ4C531W7APW6D7PVKY4TDHXAZS09P
'SP2C9SCC86GJNM2WQ0QSXYRZ27Q04DV6B6PGQ1SG
'SPV0MKAK39GMGP1AD4GAN5X7J3F3ZPYJPJQZH5MJ
'SP6BE9VJRG7YDAH46FC26FC3YYHNE8FA4E4EADTV
'SP1EF1PKR40XW37GDC0BP7SN4V4JCVSHSDVG71YTH
'SP29DGQE7W4P7XGJWPSXRFR3ZK33BRPJJCRYBNW1B
'SP3S10AXEP10QYE641J6GSRG2MRZH7PN55XQM98GK
'SP7EPGMZ6MZ37EYGGHEG4A23XCFYPWJ19WG70BHG
'SP1CEPXCY1JW4N3A9PGD2Z9XZMG717KFWJZJ8ZE5S
'SP1E46T6ZRNC40AQKMVFKWQS1FJQVES8MGSBTT0FT
'SP1F8M2SZKB7QQ4E6WM7JQNBKQXJSHHN172AMZ5QP
'SP1H52WFWMM0BX6CDQPE6TGVQW5TZGVHK2VVHQFRJ
'SP1KKCA6P7P9RPG1PMBFTXVKQ6YSSBJ96YV9JRECN
'SP2VMBB68A9ASM7GNR60451YJDZJ1FX0SFKS5MH4M
'SP2YSZG1806CP8MHJWTQWQTWRP570R5VWJ8D1GGJ4
'SP2ZV6KJNJSW3MS46FP2A8S3ARJ1MSXZPFG8F0P0V
'SP36A4N5HPWJEQDF4TAHJCEM9AYDCP9GCG9NP9HJA
'SP3ZXQQ79KN6Q98D0EE6Y1HD20HX2WD3SSCMSEGWP
'SP3VJR6HPGKH5VBMNHRXHPQXYH3P4BWV696WHF594
'SP110JK1XCZD00DJX9KD69BH20WJQBG36A4FHFAS
'SP2AM3VH574N1E3CZFKVTRMT26VC309H24FM07CQ1
'SP20MEDNQ9ZBF6ADVZFEWRH474J6WHJDD8N06NGSJ
'SP1VFXDFQWDQW6TSHA98NKDTYXKBF9QKGTA5FQJE
'SP2G8PQH2QV3ZGNE4SYJH81JQ87PVWHCTKQ7J424C
'SP11Z1W6A7HERV06SH414ZE4FK8STF9N244GK3NSZ
'SP38MBQFTBD9NMXXSVGZ1TMQKV4ARACMA8FXPAT9P
'SP2FH8F3BZ1ATMDPH8BWQ5G1T1P15GSFNZ32Y4405
'SP1MAVN1K5D9JJDVFK6RMJABE6NAV4K67G2SG34ZN
'SPAP45V7W2HEY59D9QP6WZJ91RZRA4X64SK34R0G
'SP1AEMWTZCMZRD9455ZYFBK87SEQWJR0G7JDR547Y
'SP2B4M6D4NBEJDDAX22SS34MEPJPPJ3T920V7RHYE
'SPZHCRB6K4FR6Z2NB6QEAWB7WCADB8V32VMRMYQH
'SP2AJ6R5EN5ETQRZAJA7751WEN28TCHNAW2N617MQ
'SP3N6EZPTSX8ZV2RGPY9NR9A8CA0QET39CY978H5E
'SP2YNGAF9V538Q2KBTGTY0B8YZA9R75MYGJV8EY1P
'SP1M2KMGZH26GBB5PMMYQ5WB06Z4BTXJAJYJ77DE9
'SP32W17519Q38SG2JB67EV8M5G9TGJR669GNQSG27
'SPD85KB6T7JPSQ4PAVRZF1H8123K4AXCE4T9Z3TS
'SP1S538TKS1HVKKA111X54FCR9DV7YGD069EDTF1F
'SP12540N06D74HG5R5722KDGV2ZKKBDKB1FAXZKWQ
'SP2MYQF316JWNY0M6MBGRFPZS17GJKRA26ZPB35HM
'SPYD3HVFASAPF4N9WF45PRF5FPN0C67F2F4BK7Z1
'SP1HRWQ1NB3QP80AWCSNFP7HV7MC9T0D85MTFXJRW
'SP3X6G145Z6DV5H49MN0P0RK9SXY83ZN4ACM3RPMA
'SP1SM4F13P8RDRABXAPFAFZJ0NZYJT5HFE70AY9ZG
'SP14FA5F6ZQH4Q379Q7Q3B3SN7QK753AWA2YBNXNS
'SP1N29JZHE36RR6C0XD4HC9VGRJDC79Q2JY6WCKW9
'SP1KP9E4V26VP4DZEBEH9JMSYDWRJEY98KHFFP2A5
'SP2NMTN4SJX03G7WA49E58TPBDP3XPGD19E987ER2
'SP1RCE2EE78BQESRX08D999ES1J4AGEJ22NEV5XQ
'SP39141Z31Q9B9C1M8NH5G97GYQXAB62WD4T62F8Q
'SP3EC5S8AZJ5FS2KB4909DDQTXXHN8QBKP8XKK8S
'SP23SAQK5JYCEGN5NG836EAWZVZ803YHSMXF6APMH
'SP3VSH6NQX0N9Y1JFNFN4E3AG6HTP161CRW3XXD1B
'SP2BMH1SK80DRA9XZZEPKW057RVHGA0C2B9VZXHBC
'SPBHKDKRVEY62N7FHPK572NDWCVVWPHPX6XZ52WQ
'SP3WC3EAF45PKFJDJBV04S6C2Y36GJVM06PT0FD1
'SP2ADCJ6606CFHERS3HKABWB6PF5XBANXBQ4GSE86
'SP3DTYWT3W2522G8RA19BEMZXXBWFTA6W8J2QEG56
'SP1P3HD8Z6F8EBFP4CGN2MFP0V3JGN5A31NT3GDHQ
'SP2ZEVFP649XK83X7HMDJN5Q12JEM0GWJQASV40BB
'SP28EB6MSN2EPFNKT2H5W3MCMPP753P608F5X0JS0
'SP2ZYYVCVVDZDB9SCDVQD8S1CZVN9PJWE3V8HC8K8
'SP28MM2EHD0GSA2N37SHV12W9F7XJC8JM3BE9CWA4
'SP15Q0Q4MVKCV47EYCK6R703CGMY2Z2K94VCYAABX
'SP208F0K8EEY9YX3WDJTRDGATFHTVWCGKGKGKXBFQ
'SPY2D5MCXCHPK11M0FN4PE716QFX0FH80JSRZBH2
'SP7YB2BARVERTV4RAQVF06SMZ1QJVTXEE1Y1M87F
'SP38B5H07H1XJ756EEPMS8VBJE9HPGH03C50VPNAJ
'SP13F7JHQA5QF4VW6CWE6RNFK8FWEHG4DV07V0JN2
'SP22FW05NMCK5E5V8BH2HX9NPKGM4MBPN03Y91JJ5
'SPAWR1F5VTJWEZAZGRD911QT2HW670BZW46DQ0A7
'SP1R4B8KKZXEZCZ21MWMJ5XJBTAN4PMBVACWHZ3AN
'SP19XYE0FV6N4YYNAANN5DPWR17M5MGWVEXGV9S6Q
'SP269W8K7BD4EFKVCSGVD9ZAZZQB3G196SYE55TQM
'SP2HXFYD2BHNEVPX01SKK26N45GBKJ5E3X72G1XEG
'SP5TN2MP8EW41ECDDS9R10AZJAACV5RFBVP6PR6X
'SPGW9BJR01CAWR50XP563KS4FCTD0AR8YBEQB81V
'SP1VYT41TQ3CC5C6PBYAW6EY6XXWMZBZJT0733H0B
'SP037KN1SQHQ5RSP7QD9GBWEWC5G25D71K0W0RQX
'SP3VGGV866MC5EKKHWG7G8WZSER20VV1ETNHF8CWG
'SP1ZESSGE3GG3CCQN5N0W33CVKQ5907QFZ6ZQ7GJ3
'SP2ZKTYREFH6A2TCCY66SFX6V2608VJQA3NB3MY4H
'SPABPAK6Z79B0C7JG6Y3PG97538NBVK3EMB88V1A
'SP0F8DZFPG871XDWD25ZN41SPEEJ54K3GC3KZA4W
'SP21YD23CBPTSPW3W9W5RK6SKSWZJM1SSWD8ZWK25
'SP19Q3GK6BE9M4C7ZM0JSNN3FP9FTDPD466KR5Z3
'SP9F8JKS4ES8Z49GVSGDJCHCXBBG0J8C45N6V5YC
'SP379PRY2M9JSM4FXGBC6KVAKBZ03G4TAARCR34BA
'SP2H8XK2E1VA187WN9GA0QSMB7YRSKXEKRMQ3C3XF
'SP2KQX6R4X9SGD08BFZPSPYNQX0K5Z4CYDRT728P3
'SPWV6FV4GXSWA49MZG1PTXH8BKH6XSSGWX9AYBHP
'SPW64MKEAYHMRNF8445R7ZKG67XVG6TQKZFQ3QAB
'SP380ANQR0PHRGXQWHN7CYMKC8KSJS2MDBZA4EE7S
'SP597C6RCE746H27XB775SJN10VDY49WE9CVR43M
'SPZ6V1QPH0CSA3NWPK9BMTC6KF8RQQP931SZCNZK
'SP1K51F1YS0XEF5J1M2DH6AGF8WKC5DA76ZYYKQPB
'SP8X8PW6ED6DXQYBNY23BQDGCBTENF6M5PDH9VN4
'SP3PGEQEHVKYSEVJFCX4RTPRCWJHE0DZTASWVNJB8
'SP31QHB4WHRHK223EEVXZ6X9JDQWWD34F28BC4XSW
'SP1MF4W0G1DYXCF0WJATM55K2WFKCWXSM09DEQ253
'SPEFHAR40FKKDP6TQZMK47F4XX20H1QED4NDQHA7
'SPKJ67P9BDZSES48MM3S4AWQCRR2N6R5F5284K66
'SP2S07HPKBFNYDWYPC45V8QJ68B8M8SBP8E2666Q2
'SP2EFWAM278MYN4HGJJH60G0A18M3JE8JSWAA3YD2
'SP2HGXQFRC4DBXF32AW5RXCTGN2YKSES3ZPRMX87Y
'SP3ATFW5VSD0W4N0E3K1E4CGFE8MJXQ9XFFMQ0HBY
'SP2XCT5BAMVJG6M9NPRYEPS33S04SWD4E9DTC4EY9
'SP1P7Y6XGQ1VQDJNQEM969ST5MMFFE3ZSCFWRGEZ5
'SP2S8WQ4M8X2PQHN5WX16SY9H4ZQJTF0X2BA9492T
'SP108VZPY61B4A0BH4NC1J83VVNKTFBQM3YP53RT
'SP191XBB3YSB93R9HXRSMM6YP47CCHRFT4GTRZQEH
'SP2F0AHP4Y35AF74YK0VZN5AEZCXQK4REKBC0D8M6
))
(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 zststx access
(try! (contract-call? .zaeusdc set-approved-contract (as-contract tx-sender) true))
(try! (contract-call? .zaeusdc-v1-0 set-approved-contract (as-contract tx-sender) true))
(try! (contract-call? .zaeusdc-v1-2 set-approved-contract (as-contract tx-sender) true))
(try! (contract-call? .zaeusdc-v2-0 set-approved-contract (as-contract tx-sender) true))
;; burn/mint v2 to v3
(try! (fold check-err (map consolidate-aeusdc-lambda holders) (ok true)))
;; disable access
(try! (contract-call? .zaeusdc set-approved-contract (as-contract tx-sender) false))
(try! (contract-call? .zaeusdc-v1-0 set-approved-contract (as-contract tx-sender) false))
(try! (contract-call? .zaeusdc-v1-2 set-approved-contract (as-contract tx-sender) false))
(try! (contract-call? .zaeusdc-v2-0 set-approved-contract (as-contract tx-sender) false))
(var-set executed-burn-mint true)
(ok true)
)
)
(define-private (consolidate-aeusdc-lambda (account principal))
(consolidate-aeusdc-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-aeusdc-balance-to-v3 (account principal))
(let (
;; burns old balances and mints to the latest version
(v0-balance (unwrap-panic (contract-call? .zaeusdc get-principal-balance account)))
(v1-balance (unwrap-panic (contract-call? .zaeusdc-v1-0 get-principal-balance account)))
(v2-balance (unwrap-panic (contract-call? .zaeusdc-v1-2 get-principal-balance account)))
)
(if (> v0-balance u0)
(begin
(try! (contract-call? .zaeusdc burn v0-balance account))
(try! (contract-call? .zaeusdc-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? .zaeusdc-v1-0 burn v1-balance account))
(try! (contract-call? .zaeusdc-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? .zaeusdc-v1-2 burn v2-balance account))
(try! (contract-call? .zaeusdc-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))
)
)